Browse Source

巡检工单忽略,运行监控

lipenghui 1 week ago
parent
commit
58c5b60e7a
16 changed files with 156 additions and 33 deletions
  1. 10 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java
  2. 31 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/inspect/order/IotInspectOrderController.java
  3. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/inspect/order/vo/IotInspectOrderRespVO.java
  4. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/inspect/order/vo/IotInspectOrderSaveReqVO.java
  5. 12 10
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java
  6. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDeviceRespVO.java
  7. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/inspect/IotInspectOrderDO.java
  8. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/inspect/IotInspectOrderDetailDO.java
  9. 3 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/inspect/IotInspectOrderDetailMapper.java
  10. 23 17
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/TdCronJob.java
  11. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java
  12. 13 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java
  13. 3 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java
  14. 4 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/inspect/IotInspectOrderDetailServiceImpl.java
  15. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/inspect/IotInspectOrderServiceImpl.java
  16. 45 2
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotInspectOrderDetailMapper.xml

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java

@@ -213,6 +213,10 @@ public class IotDeviceController {
             if (devicesWithBomsPair.containsKey(e.getId())) {
                 e.setHasSetMaintenanceBom(true);
             }
+            Map<Long, String> iotDevicePerson = iotDevicePersonService.getIotDevicePerson(ImmutableList.of(e.getId()));
+            if (Objects.nonNull(iotDevicePerson)) {
+                e.setChargeName(iotDevicePerson.get(e.getId()));
+            }
         });
         return success(new PageResult<>(iotDeviceRespVOS,
                 pageResult.getTotal()));
@@ -502,4 +506,10 @@ public class IotDeviceController {
     public void initBrandName() {
         iotDeviceService.updateBrandName();
     }
+
+    @PermitAll
+    @GetMapping("/init/charge")
+    public void initCharge() {
+        iotDeviceService.updateCharge();
+    }
 }

+ 31 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/inspect/order/IotInspectOrderController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -32,6 +33,7 @@ import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -247,6 +249,35 @@ public class IotInspectOrderController {
         return success(BeanUtils.toBean(pageResult, IotInspectOrderRespVO.class));
     }
 
+    @Data
+    public static class IgnoreOrder{
+        private Long id;
+        private String reason;
+    }
+
+    @PostMapping("/ignore")
+    @Operation(summary = "忽略")
+    @PreAuthorize("@ss.hasPermission('rq:iot-inspect-order:query')")
+    @Transactional(rollbackFor = Exception.class)
+    public CommonResult<String> ignoreOrder(@Valid IgnoreOrder ignoreOrder) {
+        List<IotInspectOrderDetailDO> details = iotInspectOrderDetailMapper.selectList("order_id", ignoreOrder.getId());
+        long count = details.stream().filter(e -> Objects.nonNull(e.getIfNormal())).count();
+        if (count > 0) {
+            throw new ServiceException(new ErrorCode(133, "该工单已填写巡检项,无法忽略"));
+        }
+        details.forEach(e ->{
+            e.setIgnoreReason(true);
+            iotInspectOrderDetailMapper.updateById(e);
+        });
+        IotInspectOrderDO iotInspectOrder = iotInspectOrderService.getIotInspectOrder(ignoreOrder.getId());
+        IotInspectOrderSaveReqVO iotInspectOrderSaveReqVO = new IotInspectOrderSaveReqVO();
+        BeanUtils.copyProperties(iotInspectOrder, iotInspectOrderSaveReqVO);
+        iotInspectOrderSaveReqVO.setReason(ignoreOrder.getReason());
+        iotInspectOrderSaveReqVO.setStatus("ignore");
+        iotInspectOrderService.updateIotInspectOrder(iotInspectOrderSaveReqVO);
+        return success("完成");
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出巡检工单 Excel")
     @PreAuthorize("@ss.hasPermission('rq:iot-inspect-order:export')")

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/inspect/order/vo/IotInspectOrderRespVO.java

@@ -56,4 +56,6 @@ public class IotInspectOrderRespVO {
     private LocalDateTime executeDate;
 
     private List<IotInspectOrderController.OrderDetail> details;
+
+    private String reason;
 }

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/inspect/order/vo/IotInspectOrderSaveReqVO.java

@@ -33,4 +33,6 @@ public class IotInspectOrderSaveReqVO {
     @Schema(description = "设备id")
     private String deviceIds;
 
+    @Schema(description = "理由")
+    private String reason;
 }

+ 12 - 10
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java

@@ -586,26 +586,28 @@ public class IotStaticController {
             ids = deptService.getChildDeptIdListFromCache(vo.getDeptId());
             ids.add(vo.getDeptId());
         }
-//        IotInspectOrderPageReqVO iotInspectOrderPageReqVO = new IotInspectOrderPageReqVO();
-//        iotInspectOrderPageReqVO.setStatus(vo.getStatus());
-//        iotInspectOrderPageReqVO.setCreateTime(vo.getCreateTime());
-//        Set<Long> collect2 = iotInspectOrderMapper.selectListByTimeAndStatus(iotInspectOrderPageReqVO).stream().map(IotInspectOrderDO::getId).collect(Collectors.toSet());
         List<IotInspectOrderDetailDO> detailDOList = iotInspectOrderDetailMapper.selectListStat(vo, ids);
         Map<Long, List<IotInspectOrderDetailDO>> collect = detailDOList.stream().collect(Collectors.groupingBy(IotInspectOrderDetailDO::getOrderId));
         AtomicInteger todo = new AtomicInteger();
         AtomicInteger finished = new AtomicInteger();
+        AtomicInteger ignore = new AtomicInteger();
         collect.forEach( (k,v)->{
             Map<Long, List<IotInspectOrderDetailDO>> collect1 = v.stream().collect(Collectors.groupingBy(IotInspectOrderDetailDO::getDeviceId));
             collect1.forEach( (k1,v2)->{
-                boolean b = v2.stream().anyMatch(f -> Objects.isNull(f.getIfNormal()));
-                if (b) {
-                    todo.getAndIncrement();
-                }else {
-                    finished.getAndIncrement();
+                boolean b1 = v2.stream().allMatch(IotInspectOrderDetailDO::getIgnoreReason);
+                if (b1) {
+                    ignore.getAndIncrement();
+                } else {
+                    boolean b = v2.stream().anyMatch(f -> Objects.isNull(f.getIfNormal()));
+                    if (b) {
+                        todo.getAndIncrement();
+                    }else {
+                        finished.getAndIncrement();
+                    }
                 }
             });
         });
-        return success(ImmutableMap.of("todo", todo.get(),"finished", finished.get()));
+        return success(ImmutableMap.of("todo", todo.get(),"finished", finished.get(), "ignore", ignore.get()));
     }
 
     @GetMapping("/rh/ywcb/{dept}")

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDeviceRespVO.java

@@ -148,6 +148,9 @@ public class IotDeviceRespVO {
     @Schema(description = "规格名称")
     private String modelName;
 
+    @Schema(description = "责任人")
+    private String chargeName;
+
     /**
      * 设备关联bom相关信息
      */

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/inspect/IotInspectOrderDO.java

@@ -59,4 +59,6 @@ public class IotInspectOrderDO extends BaseDO {
     private String chargeName;
 
     private LocalDateTime executeDate;
+
+    private String reason;
 }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/inspect/IotInspectOrderDetailDO.java

@@ -68,4 +68,5 @@ public class IotInspectOrderDetailDO extends BaseDO {
     private String item;
 
     private Long routeIndex;
+    private Boolean ignoreReason;
 }

+ 3 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/inspect/IotInspectOrderDetailMapper.java

@@ -42,7 +42,8 @@ public interface IotInspectOrderDetailMapper extends BaseMapperX<IotInspectOrder
         return selectList(new LambdaQueryWrapperX<IotInspectOrderDetailDO>()
                 .betweenIfPresent(IotInspectOrderDetailDO::getCreateTime, vo.getCreateTime())
 //                .inIfPresent(IotInspectOrderDetailDO::getOrderId, orderIds)
-                .inIfPresent(IotInspectOrderDetailDO::getDeptId, ids)
+                        .inIfPresent(IotInspectOrderDetailDO::getDeptId, ids)
+                .orderByDesc(IotInspectOrderDetailDO::getId)
         );
     }
 
@@ -67,5 +68,6 @@ public interface IotInspectOrderDetailMapper extends BaseMapperX<IotInspectOrder
     }
     IPage<IotInspectDeviceVo> getDeviceStatusWei(IPage<IotInspectOrderDetailPageReqVO> page, @Param("reqVO")  IotInspectOrderDetailPageReqVO reqVO, @Param("deptIds") Collection<Long> deptIds);
     IPage<IotInspectDeviceVo> getDeviceStatusYi(IPage<IotInspectOrderDetailPageReqVO> page, @Param("reqVO")  IotInspectOrderDetailPageReqVO reqVO, @Param("deptIds") Collection<Long> deptIds);
+    IPage<IotInspectDeviceVo> getDeviceStatusIgnore(IPage<IotInspectOrderDetailPageReqVO> page, @Param("reqVO")  IotInspectOrderDetailPageReqVO reqVO, @Param("deptIds") Collection<Long> deptIds);
 
 }

+ 23 - 17
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/TdCronJob.java

@@ -61,19 +61,19 @@ public class TdCronJob implements JobHandler {
                     }
                 }
                 if (e.getStatus()==1) {
-                        if (StringUtils.isNotBlank(device.getLastInlineTime())) {
-                            try {
-                                if (DateUtils.checkIfFullDayDifference(device.getLastInlineTime())) {
-                                    device.setIfInline(4);
-                                } else {
-                                    device.setIfInline(3);
-                                }
-                            } catch (Exception ex) {
-                                throw new RuntimeException(ex.getMessage());
-                            }
-                        } else {
-                            device.setIfInline(4);
-                        }
+//                        if (StringUtils.isNotBlank(device.getLastInlineTime())) {
+//                            try {
+//                                if (DateUtils.checkIfFullDayDifference(device.getLastInlineTime())) {
+//                                    device.setIfInline(4);
+//                                } else {
+//                                    device.setIfInline(3);
+//                                }
+//                            } catch (Exception ex) {
+//                                throw new RuntimeException(ex.getMessage());
+//                            }
+//                        } else {
+//                            device.setIfInline(4);
+//                        }
                     Object lat = redisTemplate.opsForHash().get("TSLV:" + device.getDeviceCode(), "lat");
                     if (Objects.nonNull(lat)) {
                         JSONObject jsonObject = JSON.parseObject(lat.toString());
@@ -84,13 +84,19 @@ public class TdCronJob implements JobHandler {
                         JSONObject jsonObject = JSON.parseObject(lng.toString());
                         device.setLng(Double.valueOf((String) jsonObject.get("value")));
                     }
+                    Object online = redisTemplate.opsForHash().get("TSLV:" + device.getDeviceCode(), "online");
+                    if (Objects.nonNull(online)) {
+                        JSONObject jsonObject = JSON.parseObject(online.toString());
+                        String value = String.valueOf(jsonObject.get("value"));
+                        device.setIfInline("true".equals(value)?3:4);
+                    }
                 } else {
                         if (StringUtils.isNotBlank(device.getLastInlineTime())) {
-                            if (DateUtils.checkIfFullDayDifference(device.getLastInlineTime())) {
-                                device.setIfInline(4);
-                            } else {
+//                            if (DateUtils.checkIfFullDayDifference(device.getLastInlineTime())) {
+//                                device.setIfInline(4);
+//                            } else {
                                 device.setIfInline(e.getStatus());
-                            }
+//                            }
                         } else {
                             device.setIfInline(4);
                         }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java

@@ -63,6 +63,7 @@ public interface IotDeviceService {
     PageResult<IotDeviceDO> getIotDevicePageApp(IotDevicePageReqVO pageReqVO, SortablePageParam sortablePageParam);
     void updateSort();
     void updateBrandName();
+    void updateCharge();
     /**
      * 获得设备精简列表
      *

+ 13 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java

@@ -48,6 +48,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -321,6 +322,18 @@ public class IotDeviceServiceImpl implements IotDeviceService {
         });
     }
 
+    @Override
+    public void updateCharge() {
+        List<IotDeviceDO> deviceDOS = iotDeviceMapper.selectList();
+        deviceDOS.forEach(deviceDO -> {
+            Map<Long, String> iotDevicePerson = iotDevicePersonService.getIotDevicePerson(ImmutableList.of(deviceDO.getId()));
+            if (Objects.nonNull(iotDevicePerson)) {
+                deviceDO.setChargeName(iotDevicePerson.get(deviceDO.getId()));
+            }
+            iotDeviceMapper.updateById(deviceDO);
+        });
+    }
+
     @Override
     public List<IotDeviceDO> getSimpleDeviceList(IotDevicePageReqVO reqVO) {
         Set<Long> ids = new HashSet<>();

+ 3 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java

@@ -126,6 +126,7 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
 
     }
 
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String submitForApproval(Long id) {
@@ -145,12 +146,12 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
     public Long createIotFailureReport(IotFailureReportSaveReqVO createReqVO) {
         // 插入
         IotFailureReportDO iotFailureReport = BeanUtils.toBean(createReqVO, IotFailureReportDO.class);
-        iotFailureReport.setFailureCode("GZ"+ DateUtil.format(new Date(), "yyyyMMddHHmmss"));
+        iotFailureReport.setFailureCode("GZ"+ DateUtil.format(new Date(), "yyMMdd"));
         IotDeviceDO iotDeviceDO = iotDeviceMapper.selectById(createReqVO.getDeviceId());
         if (Objects.isNull(iotDeviceDO)) {
             throw new ServiceException();
         }
-        iotFailureReport.setFailureName(iotDeviceDO.getDeviceCode()+iotDeviceDO.getDeviceName()+DateUtil.format(new Date(), "yyyyMMddHHmmss"));
+        iotFailureReport.setFailureName(iotDeviceDO.getDeviceCode()+iotDeviceDO.getDeviceName()+DateUtil.format(new Date(), "yyMMdd"));
         iotFailureReport.setDeviceName(iotDeviceDO.getDeviceName());
         iotFailureReport.setDeleted(false);
         if (iotFailureReport.getIfDeal()) {

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/inspect/IotInspectOrderDetailServiceImpl.java

@@ -108,9 +108,12 @@ public class IotInspectOrderDetailServiceImpl implements IotInspectOrderDetailSe
         if ("todo".equals(pageReqVO.getStatus())) {
             page = iotInspectOrderDetailMapper.getDeviceStatusWei(
                     new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO, ids);
-        } else {
+        } else if ("finished".equals(pageReqVO.getStatus())) {
             page = iotInspectOrderDetailMapper.getDeviceStatusYi(
                     new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO, ids);
+        } else {
+            page = iotInspectOrderDetailMapper.getDeviceStatusIgnore(
+                    new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO, ids);
         }
 
         return new PageResult<>(page.getRecords(), page.getTotal());

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/inspect/IotInspectOrderServiceImpl.java

@@ -230,6 +230,7 @@ public class IotInspectOrderServiceImpl implements IotInspectOrderService {
                             detailDO.setItemId(Objects.isNull(item.get("itemId"))?null:Long.valueOf(String.valueOf(item.get("itemId"))));
                             detailDO.setIndexId(Long.valueOf(String.valueOf(item.get("index"))));
                             detailDO.setDeleted(false);
+                            detailDO.setIgnoreReason(false);
                             detailDO.setRouteIndex(routeDO.getIndex());
                             items.stream().filter(e -> e.getId().equals(detailDO.getItemId())).findFirst().ifPresent(iotItem->{
                                 detailDO.setStandard(iotItem.getStandard());

+ 45 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotInspectOrderDetailMapper.xml

@@ -21,7 +21,7 @@
         max(dept_id) dept_id,
             '未填写' AS if_normal
         FROM
-        rq_iot_inspect_order_detail de where de.deleted=0
+        rq_iot_inspect_order_detail de where de.deleted=0 and de.ignore_reason = false
         GROUP BY
         order_id, device_id
         HAVING
@@ -65,7 +65,7 @@
         max(dept_id) dept_id,
         '已填写' AS if_normal
         FROM
-        rq_iot_inspect_order_detail de where de.deleted=0
+        rq_iot_inspect_order_detail de where de.deleted=0 and de.ignore_reason = false
         GROUP BY
         order_id, device_id
         HAVING
@@ -96,4 +96,47 @@
         </where>
         order by create_time desc
     </select>
+    <select id="getDeviceStatusIgnore"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.inspect.order.vo.IotInspectDeviceVo">
+        select * from(select order_id, device_id,create_time, if_normal,dept_id,
+        (select inspect_order_title from rq_iot_inspect_order aa where aa.id = fin.order_id) order_name,
+        (select device_name from rq_iot_device aa where aa.id = fin.device_id) device_name,
+        (select device_code from rq_iot_device aa where aa.id = fin.device_id) device_code
+        from (SELECT
+        order_id,
+        device_id,
+        max(create_time) create_time,
+        max(dept_id) dept_id,
+        '忽略' AS if_normal
+        FROM
+        rq_iot_inspect_order_detail de where de.deleted=0 and de.ignore_reason = true
+        GROUP BY
+        order_id, device_id
+        ) fin)finall
+        <where>
+            <if test="reqVO.deviceName!=null and reqVO.deviceName!=''">
+                and finall.device_name LIKE CONCAT('%',#{reqVO.deviceName},'%')
+            </if>
+            <if test="reqVO.deviceCode!=null and reqVO.deviceCode!=''">
+                and finall.device_code LIKE CONCAT('%',#{reqVO.deviceCode},'%')
+            </if>
+            <if test="reqVO.createTime != null and reqVO.createTime.length > 0">
+                <choose>
+                    <when test="reqVO.createTime.length == 1">
+                        AND finall.create_time = #{reqVO.createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+                    </when>
+                    <otherwise>
+                        AND finall.create_time BETWEEN #{reqVO.createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler} AND #{reqVO.createTime[1],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
+                    </otherwise>
+                </choose>
+            </if>
+            <if test="deptIds != null and deptIds.size &gt; 0">
+                AND finall.dept_id IN
+                <foreach collection="deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>
+        order by create_time desc
+    </select>
 </mapper>