Explorar o código

pms 调拨后修改执行中的保养工单 部门 责任人 创建人 备注

zhangcl hai 1 día
pai
achega
0bdb641f8b

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

@@ -114,5 +114,8 @@ public interface IotMainWorkOrderBomMapper extends BaseMapperX<IotMainWorkOrderB
     @DataPermission(enable = false)
     List<IotMainWorkOrderBomDO> historyWorkOrderBomS(@Param("deptIds") List<Long> deptIds, @Param("deviceIds") List<Long> deviceIds);
 
+    @DataPermission(enable = false)
+    List<IotMainWorkOrderBomDO> runningWorkOrderBomS(@Param("deptIds") List<Long> deptIds, @Param("deviceIds") List<Long> deviceIds);
+
     List<IotMainWorkOrderBomDO> latestWorkOrderBomS(@Param("req") IotMainWorkOrderBomPageReqVO reqVO);
 }

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

@@ -26,6 +26,7 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
@@ -129,6 +130,13 @@ public class IotDeviceAllotLogServiceImpl implements IotDeviceAllotLogService {
         AtomicReference<Long> deptId = new AtomicReference<>(0L);
         // 设备对应 责任人姓名(逗号分隔)
         AtomicReference<String> devicePersonNames = new AtomicReference<>(StrUtil.EMPTY);
+        // key设备id  value设备调拨前所属部门id
+        Map<Long, Long> oldDeptPair = new HashMap<>();
+        if (CollUtil.isNotEmpty(deviceMap)) {
+            deviceMap.forEach((deviceId, device) -> {
+                oldDeptPair.put(deviceId, device.getDeptId());
+            });
+        }
         // 如果选择了设备责任人 查询出所有责任人姓名
         reqVOS.forEach(req -> {
             deptId.set(req.getDeptId());
@@ -182,14 +190,17 @@ public class IotDeviceAllotLogServiceImpl implements IotDeviceAllotLogService {
             iotMaintainService.syncWordOrderData(changedDeviceIds, deptId.get());
             // 修改巡检历史工单
             iotInspectOrderService.syncWordOrderData(changedDeviceIds, deptId.get());
-            // 修改保养历史工单
             if (CollUtil.isNotEmpty(reqVOS.get(0).getPersonIds())) {
-                iotMainWorkOrderService.syncWorkOrderData(changedDeviceIds, deptId.get(), reqVOS.get(0).getPersonIds());
+                // 修改保养历史工单
+                iotMainWorkOrderService.syncWorkOrderData(changedDeviceIds, deptId.get(), reqVOS.get(0).getPersonIds(), oldDeptPair);
+                // 修改 执行中 的保养工单
+                iotMainWorkOrderService.syncRunningWorkOrder(changedDeviceIds, deptId.get(), reqVOS.get(0).getPersonIds(), oldDeptPair);
             }
+            // 修改正在执行的保养工单的部门 如果修改了 责任人 同时修改正在执行的保养工单的 责任人 创建人
+            // 工单备注标注 设备调拨 从A->B
+
             // 修改历史设备资料库
             iotTreeService.deviceAllotTree(changedDeviceIds, deptId.get());
-            // 如果选择了设备责任人 用 责任人名称 更新设备表的字段 chargeName
-
         });
         return 1l;
     }

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

@@ -173,9 +173,21 @@ public interface IotMainWorkOrderService {
      * @param deviceIds 发生调拨的设备id 列表
      * @param deptId 调拨后部门id
      * @param personIds 调拨时设置的责任人列表
+     * @param oldDeptPair key设备id  value设备调拨前所属部门id
      * @return
      */
-    void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds);
+    void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds, Map<Long, Long> oldDeptPair);
+
+    /**
+     * 设备调拨后同步 保养 执行中 的工单
+     * 修改工单的 deptId 创建人 责任人
+     * @param deviceIds 发生调拨的设备id 列表
+     * @param deptId 调拨后部门id
+     * @param personIds 调拨时设置的责任人列表
+     * @param oldDeptPair key设备id  value设备调拨前所属部门id
+     * @return
+     */
+    void syncRunningWorkOrder(List<Long> deviceIds, Long deptId, List<Long> personIds, Map<Long, Long> oldDeptPair);
 
     /**
      * 查询设备BOM保养项 最新的 保养记录 (上次保养时间)

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

@@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
@@ -53,6 +54,7 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -2478,7 +2480,7 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds) {
+    public void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds, Map<Long, Long> oldDeptPair) {
         if (CollUtil.isEmpty(deviceIds) || CollUtil.isEmpty(personIds)) {
             return;
         }
@@ -2495,8 +2497,8 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         // 查询当前设备集合的所有历史保养工单 如果历史工单明细中包含2个设备A,B,但是只调拨了1个设备A,此时 只复制设备A明细生成一个 执行完成的保养工单
         IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
         reqVO.setDeviceIds(deviceIds);
-        reqVO.setStatus(1);     // 查询已经保养完成的工单
-        // List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.selectList(reqVO);
+        reqVO.setStatus(1);
+        // 查询已经保养完成的工单
         List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.historyWorkOrderBomS(new ArrayList<>(deviceDeptIds), deviceIds);
         // 以 工单id+设备id+设备负责人 为维度组成 工单BOM集合
         Map<Long, List<IotMainWorkOrderBomDO>> workOrderBomPair = new HashMap<>();
@@ -2612,6 +2614,87 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         }
     }
 
+    @Override
+    public void syncRunningWorkOrder(List<Long> deviceIds, Long deptId, List<Long> personIds, Map<Long, Long> oldDeptPair) {
+        if (CollUtil.isEmpty(deviceIds) || CollUtil.isEmpty(personIds)) {
+            return;
+        }
+        // 查询设备集合修改前的部门
+        Set<Long> deviceDeptIds = oldDeptPair != null ? new HashSet<>(oldDeptPair.values()) : new HashSet<>();
+
+        // 查询当前设备对应的 责任人 前端页面已经统一设置了相同的责任人(有可能多个 多个责任人时随机取1个)
+        Long personId = personIds.get(0);
+        // 现在保养工单都是 单设备
+        // 查询 执行中 的保养工单
+        List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.runningWorkOrderBomS(new ArrayList<>(deviceDeptIds), deviceIds);
+        // 查询所有部门的名称信息
+        deviceDeptIds.add(deptId);
+        Map<Long, DeptDO> deptPair = deptService.getDeptMap(deviceDeptIds);
+
+        // 以 工单id+设备id+设备负责人 为维度组成 工单BOM集合
+        Map<Long, List<IotMainWorkOrderBomDO>> workOrderBomPair = new HashMap<>();
+        Map<Long, IotMainWorkOrderDO> workOrderPair = new HashMap<>();
+        Set<Long> workOrderIds = new HashSet<>();
+        Set<Long> bomNodeIds = new HashSet<>();
+        // 需要新增的保养工单集合 (历史工单)
+        List<IotMainWorkOrderDO> tobeAddedOrders = new ArrayList<>();
+        // 需要 更新 的保养工单集合 (部门 责任人 创建人 备注)
+        List<IotMainWorkOrderDO> tobeUpdatedOrders = 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());
+                bomNodeIds.add(bom.getBomNodeId());
+            });
+            // 查询所有保养工单明细对应的保养工单主表集合
+            IotMainWorkOrderPageReqVO orderReqVO = new IotMainWorkOrderPageReqVO();
+            orderReqVO.setWorkOrderIds(new ArrayList<>(workOrderIds));
+            orderReqVO.setResult(1);
+            // 查询 执行中 的保养工单
+            List<IotMainWorkOrderDO> workOrders = iotMainWorkOrderMapper.selectList(orderReqVO);
+            if (CollUtil.isNotEmpty(workOrders)) {
+                workOrders.forEach(order -> {
+                    workOrderPair.put(order.getId(), order);
+                });
+            }
+            // 修改执行中保养工单的 部门 责任人 创建人 并添加备注信息
+            workOrderBomPair.forEach((k, v) -> {
+                // k保养工单id  v工单明细集合 单设备
+                if (workOrderPair.containsKey(k)) {
+                    // 获得当前设备对应的 历史部门id
+                    Long bomDeviceId = v.get(0).getDeviceId();
+                    Long oldDeptId = oldDeptPair.get(bomDeviceId);
+                    // 获取当前时间的 yyyy-MM-dd HH:mm:ss 格式
+                    String currentDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+                    IotMainWorkOrderDO tempWorkOrder = workOrderPair.get(k);
+                    tempWorkOrder.setDeptId(deptId);
+                    tempWorkOrder.setResponsiblePerson(String.valueOf(personId));
+                    tempWorkOrder.setCreator(String.valueOf(personId));
+                    String historyRemark = StrUtil.isNotBlank(tempWorkOrder.getRemark()) ? tempWorkOrder.getRemark() : StrUtil.EMPTY;
+                    tempWorkOrder.setRemark(historyRemark + "\n" + currentDate +" 设备从 " + deptPair.get(oldDeptId).getName()
+                            + " 调拨到部门 " + deptPair.get(deptId).getName());
+                    tobeUpdatedOrders.add(tempWorkOrder);
+                }
+            });
+            // 更新 执行中的 保养工单
+            if (CollUtil.isNotEmpty(tobeUpdatedOrders)) {
+                iotMainWorkOrderMapper.updateBatch(tobeUpdatedOrders);
+            }
+        }
+    }
+
     @Override
     public List<IotMainWorkOrderBomDO> historyWorkOrderBoms(Set<Long> deviceIds, Set<Long> bomNodeIds) {
         IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();

+ 20 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMainWorkOrderBomMapper.xml

@@ -41,6 +41,26 @@
         </if>
     </select>
 
+    <select id="runningWorkOrderBomS" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO">
+        SELECT *
+        FROM rq_iot_main_work_order_bom mwob
+        LEFT JOIN rq_iot_main_work_order mwo ON mwo.id = mwob.work_order_id
+        WHERE mwob.`status` = 0
+        AND mwo.result = 1
+        <if test="deptIds != null and deptIds.size &gt; 0">
+            AND mwo.dept_id IN
+            <foreach collection="deptIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="deviceIds != null and deviceIds.size &gt; 0">
+            AND mwob.device_id IN
+            <foreach collection="deviceIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+    </select>
+
     <select id="latestWorkOrderBomS" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO">
         SELECT t1.*
         FROM rq_iot_main_work_order_bom t1