Browse Source

pms 保养工单填报功能优化

zhangcl 1 month ago
parent
commit
1af01dfbc6

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialController.java

@@ -84,6 +84,14 @@ public class IotMainWorkOrderBomMaterialController {
         return success(BeanUtils.toBean(pageResult, IotMainWorkOrderBomMaterialRespVO.class));
     }
 
+    @GetMapping("/list")
+    @Operation(summary = "获得PMS 保养工单明细BOM挂载物料关联列表")
+    @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order-bom-material:query')")
+    public CommonResult<List<IotMainWorkOrderBomMaterialRespVO>> getIotMainWorkOrderBomMaterialList(@Valid IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
+        List<IotMainWorkOrderBomMaterialDO> list = iotMainWorkOrderBomMaterialService.getIotMainWorkOrderBomMaterialList(pageReqVO);
+        return success(BeanUtils.toBean(list, IotMainWorkOrderBomMaterialRespVO.class));
+    }
+
     @GetMapping("/workOrderMaterials")
     @Operation(summary = "获得保养工单物料")
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order-bom-material:query')")

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

@@ -587,53 +587,59 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         // 已经完成保养的保养项关联的 设备id 集合
         Set<Long> deviceIds = new HashSet<>();
         workOrderMaterials.forEach(material -> {
-            IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
-            tempMaterial.setWorkOrderId(mainWorkOrder.getId());
-            workOrderBomMaterialDOS.add(tempMaterial);
+            if (ObjUtil.isEmpty(material.getId())) {
+                // 兼容保养工单中部分保养项保养完成 部分保养项 延期保养的情况 这里只新增延期保养 或正常 保养的物料
+                IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
+                tempMaterial.setWorkOrderId(mainWorkOrder.getId());
+                workOrderBomMaterialDOS.add(tempMaterial);
 
-            if ("本地库存".equals(material.getMaterialSource())) {
-                if (ObjUtil.isNotEmpty(material.getFactoryId())) {
-                    factoryIds.add(material.getFactoryId());
-                }
-                if (ObjUtil.isNotEmpty(material.getCostCenterId())) {
-                    costCenterIds.add(material.getCostCenterId());
-                }
-                if (ObjUtil.isNotEmpty(material.getStorageLocationId())) {
-                    storageLocationIds.add(material.getStorageLocationId());
-                }
-                if (ObjUtil.isNotEmpty(material.getMaterialCode())) {
-                    materialCodes.add(material.getMaterialCode());
-                }
-                String tempKey = material.getFactoryId() + String.valueOf(material.getCostCenterId())
-                        + material.getMaterialCode();
-                if (lockStockPair.containsKey(tempKey)) {
-                    BigDecimal tempQuantity = lockStockPair.get(tempKey);
-                    BigDecimal totalQuantity = tempQuantity.add(material.getQuantity());
-                    lockStockPair.put(tempKey, totalQuantity);
-                } else {
-                    lockStockPair.put(tempKey, material.getQuantity());
+                if ("本地库存".equals(material.getMaterialSource())) {
+                    if (ObjUtil.isNotEmpty(material.getFactoryId())) {
+                        factoryIds.add(material.getFactoryId());
+                    }
+                    if (ObjUtil.isNotEmpty(material.getCostCenterId())) {
+                        costCenterIds.add(material.getCostCenterId());
+                    }
+                    if (ObjUtil.isNotEmpty(material.getStorageLocationId())) {
+                        storageLocationIds.add(material.getStorageLocationId());
+                    }
+                    if (ObjUtil.isNotEmpty(material.getMaterialCode())) {
+                        materialCodes.add(material.getMaterialCode());
+                    }
+                    String tempKey = material.getFactoryId() + String.valueOf(material.getCostCenterId())
+                            + material.getMaterialCode();
+                    if (lockStockPair.containsKey(tempKey)) {
+                        BigDecimal tempQuantity = lockStockPair.get(tempKey);
+                        BigDecimal totalQuantity = tempQuantity.add(material.getQuantity());
+                        lockStockPair.put(tempKey, totalQuantity);
+                    } else {
+                        lockStockPair.put(tempKey, material.getQuantity());
+                    }
                 }
             }
         });
         // 添加 工单消耗的物料记录
         iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
         workOrderBOMs.forEach(bom -> {
-            IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
-            // 如果工单明细中任何一个保养项设置了 任何一种推迟保养规则 工单结果 不能设置为 已执行
-            if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)>0
-                    || bom.getDelayDuration().compareTo(BigDecimal.ZERO)>0 || bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)>0) {
-                tempBom.setStatus(0);
-                mainCompleted.set(false);
-            }
-            if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)==0
-                    && bom.getDelayDuration().compareTo(BigDecimal.ZERO)==0 && bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)==0) {
-                // 如果保养项没有设置延时保养 则查询当前设备的 累计运行公里数 累计运行时间 当前时间日期 赋值到 关联保养计划 明细 的 对应保养规则数据上
-                deviceIds.add(bom.getDeviceId());
-                // 保养项下如果已经添加了物料 说明该保养项已经保养完成
-                bomNodeIds.add(bom.getBomNodeId());
-                tempBom.setStatus(1);
+            if (0 == bom.getStatus()) {
+                // 兼容保养工单中部分保养项保养完成 部分保养项 延期保养的情况 这里只更新延期保养 或正常 保养的物料
+                IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
+                // 如果工单明细中任何一个保养项设置了 任何一种推迟保养规则 工单结果 不能设置为 已执行
+                if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)>0
+                        || bom.getDelayDuration().compareTo(BigDecimal.ZERO)>0 || bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)>0) {
+                    tempBom.setStatus(0);
+                    mainCompleted.set(false);
+                }
+                if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)==0
+                        && bom.getDelayDuration().compareTo(BigDecimal.ZERO)==0 && bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)==0) {
+                    // 如果保养项没有设置延时保养 则查询当前设备的 累计运行公里数 累计运行时间 当前时间日期 赋值到 关联保养计划 明细 的 对应保养规则数据上
+                    deviceIds.add(bom.getDeviceId());
+                    // 保养项下如果已经添加了物料 说明该保养项已经保养完成
+                    bomNodeIds.add(bom.getBomNodeId());
+                    tempBom.setStatus(1);
+                }
+                workOrderBomDOS.add(tempBom);
             }
-            workOrderBomDOS.add(tempBom);
         });
         iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
         // 只有工单明细中所有保养项的物料都选择完成,才会将工单结果设置为 ‘已执行’
@@ -686,14 +692,16 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
                 }
             }
         }
+        // 查询关联的保养工单
+        IotMainWorkOrderPageReqVO orderReqVO = new IotMainWorkOrderPageReqVO();
+        orderReqVO.setOrderGroupId(updateObj.getOrderGroupId());
+        List<IotMainWorkOrderDO> associateOrders = iotMainWorkOrderMapper.selectList(orderReqVO);
+        List<IotMainWorkOrderDO> filteredOrders = associateOrders.stream()
+                .filter(order -> !order.getId().equals(updateObj.getId()))
+                .collect(Collectors.toList());
+
         // 如果当前工单已经关闭,需要同时将当前工单的关联工单 一并关闭 是否需要将当前工单选择的物料及费用也复制到 关联工单?
         if (2 == updateObj.getResult()) {
-            IotMainWorkOrderPageReqVO orderReqVO = new IotMainWorkOrderPageReqVO();
-            orderReqVO.setOrderGroupId(updateObj.getOrderGroupId());
-            List<IotMainWorkOrderDO> associateOrders = iotMainWorkOrderMapper.selectList(orderReqVO);
-            List<IotMainWorkOrderDO> filteredOrders = associateOrders.stream()
-                    .filter(order -> !order.getId().equals(updateObj.getId()))
-                    .collect(Collectors.toList());
             if (CollUtil.isNotEmpty(filteredOrders)) {
                 // 将关联工单设置为 已执行 直接删除
                 filteredOrders.forEach(order -> {order.setResult(2);  order.setDeleted(true);});
@@ -709,6 +717,20 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
                 iotMainWorkOrderBomMapper.updateBatch(associateOrderBomS);
             }
         }
+        // todo 如果关联工单中的一个工单进行了保养(有2个保养项) 其中一个保养项已经保养完成 另外一个保养项 延期保养
+        // todo 此时应该将当前保养工单的保养数据(保养起止时间 保养费用  其他费用 备注...保养项信息...)同步到 所有关联的 保养工单
+        if (1 == updateObj.getResult()) {
+            if (CollUtil.isNotEmpty(filteredOrders)) {
+                filteredOrders.forEach(order -> {
+                    order.setActualStartTime(updateObj.getActualStartTime());
+                    order.setActualEndTime(updateObj.getActualEndTime());
+                    order.setCost(updateObj.getCost());
+                    order.setOtherCost(updateObj.getOtherCost());
+                    order.setLaborCost(updateObj.getLaborCost());
+                    order.setRemark(updateObj.getRemark());
+                });
+            }
+        }
         // 只扣减本地库存 不处理SAP库存
         if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {
             IotLockStockPageReqVO reqVO = new IotLockStockPageReqVO();

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialService.java

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * PMS 保养工单明细设备BOM挂载物料关联 Service 接口
@@ -61,4 +62,11 @@ public interface IotMainWorkOrderBomMaterialService {
      */
     PageResult<IotMainWorkOrderBomMaterialRespVO> selectMaterialsByDept(IotMainWorkOrderBomMaterialPageReqVO pageReqVO);
 
+    /**
+     * 获得PMS 保养工单明细设备BOM挂载物料关联列表
+     *
+     * @param pageReqVO 列表查询
+     * @return PMS 保养工单明细BOM挂载物料关联列表
+     */
+    List<IotMainWorkOrderBomMaterialDO> getIotMainWorkOrderBomMaterialList(IotMainWorkOrderBomMaterialPageReqVO pageReqVO);
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialServiceImpl.java

@@ -169,4 +169,10 @@ public class IotMainWorkOrderBomMaterialServiceImpl implements IotMainWorkOrderB
         }
         return new PageResult<>(iotMaintainMaterialDOIPage.getRecords(), iotMaintainMaterialDOIPage.getTotal());
     }
+
+    @Override
+    public List<IotMainWorkOrderBomMaterialDO> getIotMainWorkOrderBomMaterialList(IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
+        List<IotMainWorkOrderBomMaterialDO> workOrderMaterials = iotMainWorkOrderBomMaterialMapper.selectList(pageReqVO);
+        return workOrderMaterials;
+    }
 }