Răsfoiți Sursa

pms 设备调拨后处理历史工单

zhangcl 2 luni în urmă
părinte
comite
c4f4d31faf

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

@@ -9,6 +9,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -93,4 +94,6 @@ public class IotMainWorkOrderPageReqVO extends PageParam {
     private Long deviceName;
     @Schema(description = "设备编码", example = "8684")
     private Long deviceCode;
+    @Schema(description = "工单id集合", example = "8684")
+    private List<Long> workOrderIds;
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotmainworkorderbom/IotMainWorkOrderBomDO.java

@@ -10,7 +10,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
- * PMS 保养计划明细BOM DO
+ * PMS 保养工单明细BOM DO
  *
  * @author ruiqi
  */

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorder/IotMainWorkOrderMapper.java

@@ -49,6 +49,7 @@ public interface IotMainWorkOrderMapper extends BaseMapperX<IotMainWorkOrderDO>
 
     default List<IotMainWorkOrderDO> selectList(IotMainWorkOrderPageReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<IotMainWorkOrderDO>()
+                .inIfPresent(IotMainWorkOrderDO::getId, reqVO.getWorkOrderIds())
                 .eqIfPresent(IotMainWorkOrderDO::getPlanId, reqVO.getPlanId())
                 .eqIfPresent(IotMainWorkOrderDO::getPlanSerialNumber, reqVO.getPlanSerialNumber())
                 .eqIfPresent(IotMainWorkOrderDO::getDeptId, reqVO.getDeptId())

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorderbom/IotMainWorkOrderBomMapper.java

@@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
 import java.util.List;
 
 /**
- * PMS 保养计划明细BOM Mapper
+ * PMS 保养工单明细BOM Mapper
  *
  * @author ruiqi
  */

+ 20 - 10
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceallotlog/IotDeviceAllotLogServiceImpl.java

@@ -14,8 +14,10 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotdeviceallotlog.IotDeviceAllotLog
 import cn.iocoder.yudao.module.pms.service.failure.IotFailureReportService;
 import cn.iocoder.yudao.module.pms.service.inspect.IotInspectOrderService;
 import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
+import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotopeationfill.IotOpeationFillService;
 import cn.iocoder.yudao.module.pms.service.maintain.IotMaintainService;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -29,6 +31,7 @@ import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_ALLOT_LOG_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
 
 /**
  * 设备调拨日志 Service 实现类
@@ -53,6 +56,10 @@ public class IotDeviceAllotLogServiceImpl implements IotDeviceAllotLogService {
     private IotMaintainService iotMaintainService;
     @Resource
     private IotInspectOrderService iotInspectOrderService;
+    @Resource
+    private IotMainWorkOrderService iotMainWorkOrderService;
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
 
     @Override
     public Long createIotDeviceAllotLog(IotDeviceAllotLogSaveReqVO createReqVO) {
@@ -148,16 +155,19 @@ public class IotDeviceAllotLogServiceImpl implements IotDeviceAllotLogService {
         if (CollUtil.isNotEmpty(personRelations)) {
             iotDevicePersonService.saveDevicePersons(personRelations);
         }
-
-        // 同步修改 设备相关的 历史工单
-        // 同步修改运行记录的历史工单
-        iotOpeationFillService.syncWordOrderData(deviceIds, null, deptId.get());
-        // 同步修改维修历史工单
-        iotFailureReportService.syncWordOrderData(deviceIds, deptId.get());
-        // 同步修改巡检历史工单
-        iotMaintainService.syncWordOrderData(deviceIds, deptId.get());
-        iotInspectOrderService.syncWordOrderData(deviceIds, deptId.get());
-        // 同步修改保养历史工单
+        pmsThreadPoolTaskExecutor.execute(() -> {
+            // 异步修改 设备相关的 历史工单
+            // 运行记录的历史工单
+            iotOpeationFillService.syncWordOrderData(deviceIds, null, deptId.get());
+            // 故障上报历史工单部门
+            iotFailureReportService.syncWordOrderData(deviceIds, deptId.get());
+            // 修改维修历史工单
+            iotMaintainService.syncWordOrderData(deviceIds, deptId.get());
+            // 修改巡检历史工单
+            iotInspectOrderService.syncWordOrderData(deviceIds, deptId.get());
+            // 修改保养历史工单
+            iotMainWorkOrderService.syncWorkOrderData(deviceIds, deptId.get(), reqVOS.get(0).getPersonIds());
+        });
         return 1l;
     }
 

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderService.java

@@ -120,4 +120,14 @@ public interface IotMainWorkOrderService {
      * @return
      */
     IotMainWorkOrderRespVO getDeviceMainWorkOrder(Long workOrderId, Long deviceId);
+
+    /**
+     * 设备调拨后同步 保养历史工单
+     * 将 修改历史工单的 deptId 创建人 责任人
+     * @param deviceIds 发生调拨的设备id 列表
+     * @param deptId 调拨后部门id
+     * @param personIds 调拨时设置的责任人列表
+     * @return
+     */
+    void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds);
 }

+ 92 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderServiceImpl.java

@@ -48,6 +48,7 @@ import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -895,6 +896,97 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         return workOrderResp;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds) {
+        if (CollUtil.isEmpty(deviceIds) || CollUtil.isEmpty(personIds)) {
+            return;
+        }
+        // 查询当前设备对应的 责任人 前端页面已经统一设置了相同的责任人(有可能多个 多个责任人时随机取1个)
+        Long personId = personIds.get(0);
+        // 查询当前设备集合的所有历史保养工单 如果历史工单明细中包含2个设备A,B,但是只调拨了1个设备A,此时 只复制设备A明细生成一个 执行完成的保养工单
+        IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
+        reqVO.setDeviceIds(deviceIds);
+        reqVO.setStatus(1);     // 查询已经保养完成的工单
+        List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.selectList(reqVO);
+        // 以 工单id+设备id+设备负责人 为维度组成 工单BOM集合
+        Map<Long, List<IotMainWorkOrderBomDO>> workOrderBomPair = new HashMap<>();
+        Map<Long, IotMainWorkOrderDO> workOrderPair = new HashMap<>();
+        Set<Long> workOrderIds = new HashSet<>();
+        // 需要新增的保养工单集合 (历史工单)
+        List<IotMainWorkOrderDO> tobeAddedOrders = new ArrayList<>();
+        // 需要新增的保养工单明细集合 (历史工单)
+        List<IotMainWorkOrderBomDO> tobeAddedOrderBomS = new ArrayList<>();
+        // 需要新增的保养工单物料明细集合 (历史工单)
+        List<IotMainWorkOrderBomMaterialDO> tobeAddedOrderBomMaterialS = new ArrayList<>();
+        if (CollUtil.isNotEmpty(workOrderBomS)) {
+            workOrderBomS.forEach(bom -> {
+                if (workOrderBomPair.containsKey(bom.getWorkOrderId())) {
+                    List<IotMainWorkOrderBomDO> tempBomS = workOrderBomPair.get(bom.getWorkOrderId());
+                    tempBomS.add(bom);
+                    workOrderBomPair.put(bom.getWorkOrderId(), tempBomS);
+                } else {
+                    List<IotMainWorkOrderBomDO> tempBomS = new ArrayList<>();
+                    tempBomS.add(bom);
+                    workOrderBomPair.put(bom.getWorkOrderId(), tempBomS);
+                }
+                workOrderIds.add(bom.getWorkOrderId());
+            });
+            // 查询所有保养工单明细对应的保养工单主表集合
+            IotMainWorkOrderPageReqVO orderReqVO = new IotMainWorkOrderPageReqVO();
+            orderReqVO.setWorkOrderIds(new ArrayList<>(workOrderIds));
+            orderReqVO.setResult(2);     // 查询已经执行完成的工单
+            List<IotMainWorkOrderDO> workOrders = iotMainWorkOrderMapper.selectList(orderReqVO);
+            if (CollUtil.isNotEmpty(workOrders)) {
+                workOrders.forEach(order -> {
+                    workOrderPair.put(order.getId(), order);
+                });
+            }
+            // 根据历史工单 拷贝生成 新的历史工单
+            // 查询最新的保养工单id
+            AtomicReference<Long> theMaxId = new AtomicReference<>(theMaxId());
+            workOrderBomPair.forEach((k, v) -> {
+                // k保养工单id  v工单明细集合
+                IotMainWorkOrderDO workOrder = new IotMainWorkOrderDO();
+                theMaxId.getAndSet(theMaxId.get() + 1);
+                workOrder.setId(theMaxId.get());
+                workOrder.setDeptId(deptId);
+                if (workOrderPair.containsKey(k)) {
+                    workOrder.setName(workOrderPair.get(k).getName());
+                    workOrder.setPlanId(workOrderPair.get(k).getPlanId());
+                    workOrder.setType(workOrderPair.get(k).getType());
+                    workOrder.setCost(workOrderPair.get(k).getCost());
+                    workOrder.setOtherCost(workOrderPair.get(k).getOtherCost());
+                    workOrder.setLaborCost(workOrderPair.get(k).getLaborCost());
+                    workOrder.setActualStartTime(workOrderPair.get(k).getActualStartTime());
+                    workOrder.setActualEndTime(workOrderPair.get(k).getActualEndTime());
+                    workOrder.setRemark(workOrderPair.get(k).getRemark());
+                }
+                workOrder.setOrderNumber(createWorkOrderNumber());
+                workOrder.setResult(2);
+                workOrder.setResponsiblePerson(String.valueOf(personId));
+                workOrder.setCreator(String.valueOf(personId));
+                tobeAddedOrders.add(workOrder);
+                // 2. 处理关联的BOM明细
+                final long workOrderId = workOrder.getId(); // 获取当前工单ID
+                v.forEach(bom -> {
+                    IotMainWorkOrderBomDO tempBom = new IotMainWorkOrderBomDO();
+                    BeanUtils.copyProperties(bom,tempBom);
+                    tempBom.setId(null);
+                    tempBom.setWorkOrderId(workOrderId);
+                    tobeAddedOrderBomS.add(tempBom);
+                    System.out.println("当前保养明细名称:" + bom.getName());
+                });
+            });
+            // todo 还要处理保养项已经关联的物料
+            if (CollUtil.isNotEmpty(tobeAddedOrders) && CollUtil.isNotEmpty(tobeAddedOrderBomS)) {
+                iotMainWorkOrderMapper.insertBatch(tobeAddedOrders);
+                iotMainWorkOrderBomMapper.insertBatch(tobeAddedOrderBomS);
+                System.out.println("保养工单明细集合数量:" + tobeAddedOrderBomS.size());
+            }
+        }
+    }
+
     private static class Triple<A, B, C> {
         private final A first;
         private final B second;