Ver Fonte

pms 保养工单 退回 保存提交

zhangcl há 1 dia atrás
pai
commit
e5b7ebcc93

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

@@ -85,6 +85,14 @@ public class IotMainWorkOrderController {
         return success(true);
     }
 
+    @PutMapping("/modifyWorkOrder")
+    @Operation(summary = "修改退回的保养工单")
+    @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order:update')")
+    public CommonResult<Boolean> modifyWorkOrder(@Valid @RequestBody IotMainWorkOrderSaveVO saveVO) {
+        iotMainWorkOrderService.modifyWorkOrder(saveVO);
+        return success(true);
+    }
+
     @PutMapping("/historyWorkOrderOutbound")
     @Operation(summary = "历史保养工单物料记录出库 初始化保养的出库记录")
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order:update')")

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoutbound/IotOutboundDO.java

@@ -29,6 +29,10 @@ public class IotOutboundDO extends BaseDO {
      */
     @TableId
     private Long id;
+    /**
+     * 业务主键id (维修工单 保养工单...)
+     */
+    private Long bizId;
     /**
      * 入库id
      */

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoutbound/IotOutboundMapper.java

@@ -6,7 +6,10 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.iotoutbound.vo.IotOutboundPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotoutbound.IotOutboundDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -72,4 +75,6 @@ public interface IotOutboundMapper extends BaseMapperX<IotOutboundDO> {
                 .inIfPresent(IotOutboundDO::getDeptId, reqVO.getDeptIds()));
     }
 
+    @Update("UPDATE rq_iot_outbound SET deleted = 1, update_time = #{deletedTime} WHERE biz_id = #{workOrderId} AND reason = #{reason}")
+    void updateToDelete(@Param("workOrderId") Long workOrderId, @Param("deletedTime") LocalDateTime deletedTime, @Param("reason") String reason);
 }

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

@@ -190,4 +190,11 @@ public interface IotMainWorkOrderService {
      * @return
      */
     void historyWorkOrderOutbound();
+
+    /**
+     * 修改退回的 保养 工单
+     *
+     * @return
+     */
+    void modifyWorkOrder(IotMainWorkOrderSaveVO saveVO);
 }

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

@@ -2231,6 +2231,7 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
                 // k工厂id-成本中心id-物料编码-bomId
                 // 每个物料都对应一条出库记录
                 IotOutboundDO outbound = new IotOutboundDO();
+                outbound.setBizId(workOrder.getId());
                 outbound.setDeptId(workOrder.getDeptId());
                 outbound.setFactoryId(v.getFactoryId());
                 outbound.setCostCenterId(v.getCostCenterId());
@@ -2252,6 +2253,8 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
             // 扣减本地库存
             iotLockStockMapper.updateBatch(tobeUpdatedLockStocks);
         }
+        // 先删除当前 保养工单 下的物料出库记录
+        iotOutboundMapper.updateToDelete(workOrder.getId(), LocalDateTime.now(), "保养");
         // 添加出库记录
         if (CollUtil.isNotEmpty(outbounds)) {
             iotOutboundMapper.insertBatch(outbounds);
@@ -2675,6 +2678,116 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         }
     }
 
+    @Override
+    public void modifyWorkOrder(IotMainWorkOrderSaveVO saveVO) {
+        if (ObjectUtil.isEmpty(saveVO)) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        IotMainWorkOrderSaveReqVO mainWorkOrder = saveVO.getMainWorkOrder();
+        if (ObjectUtil.isEmpty(saveVO.getMainWorkOrder())) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        List<IotMainWorkOrderBomSaveReqVO> workOrderBOMs = saveVO.getMainWorkOrderBom();
+        if (ObjectUtil.isEmpty(workOrderBOMs)) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        // 保养项物料列表
+        List<IotMainWorkOrderBomMaterialSaveReqVO> workOrderMaterials = saveVO.getMainWorkOrderMaterials();
+
+        // 保养工单 主表 保养费用 备注
+        IotMainWorkOrderDO updateObj = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
+
+        // 保养工单 保养项列表
+        List<IotMainWorkOrderBomDO> workOrderBomDOS = new ArrayList<>();
+
+        // 保养工单 保养项bom 关联的物料列表
+        List<IotMainWorkOrderBomMaterialDO> workOrderBomMaterialDOS = new ArrayList<>();
+        Set<Long> factoryIds = new HashSet<>();
+        Set<Long> costCenterIds = new HashSet<>();
+        Set<Long> storageLocationIds = new HashSet<>();
+        Set<String> materialCodes = new HashSet<>();
+        Map<String, BigDecimal> lockStockPair = new HashMap<>();
+        // key工厂id-成本中心id-物料编码-bomId        value保养项物料对象
+        Map<String, IotMainWorkOrderBomMaterialSaveReqVO> bomMaterialPair = new HashMap<>();
+
+        // 需要消耗物料的保养项id集合
+        Set<Long> materialBomNodeIds = new HashSet<>();
+        // 统计保养项信息 是否需要消耗物料
+        workOrderBOMs.forEach(bom -> {
+            if ("0".equals(bom.getRule())) {
+                // 需要消耗物料
+                materialBomNodeIds.add(bom.getBomNodeId());
+            }
+            // 每个保养项都已经保养完成
+        });
+        // 保养完成的保养项关联的物料 统计出库(物料来源是 本地库存)
+        workOrderMaterials.forEach(material -> {
+            // 兼容保养工单中部分保养项保养完成 部分保养项延期保养的情况 这里只新增延期保养 或 正常保养的物料
+            if (materialBomNodeIds.contains(material.getBomNodeId())) {
+                IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtil.copyProperties(material, IotMainWorkOrderBomMaterialDO.class, "id");
+                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 uniqueKey = StrUtil.join("-", material.getFactoryId(),
+                        material.getCostCenterId(), material.getMaterialCode(), material.getBomNodeId());
+                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());
+                }
+                // 记录出库使用 记录保养项id
+                bomMaterialPair.put(uniqueKey, material);
+            }
+        });
+        // 删除当前工单保养项已有的物料 再新增
+        if (ObjUtil.isNotEmpty(updateObj.getId())) {
+            iotMainWorkOrderBomMaterialMapper.updateToDelete(updateObj.getId(), LocalDateTime.now());
+        }
+        // 添加 工单消耗的物料记录
+        if (CollUtil.isNotEmpty(workOrderBomMaterialDOS)) {
+            iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
+        }
+
+        workOrderBOMs.forEach(bom -> {
+            IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
+            // 有可能修改 保养项 字段 是否消耗物料
+            workOrderBomDOS.add(tempBom);
+        });
+        if (CollUtil.isNotEmpty(workOrderBomDOS)) {
+            iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
+        }
+        // 保养工单 已经是 已执行的状态
+        iotMainWorkOrderMapper.updateById(updateObj);
+
+        // 只扣减本地库存 不处理SAP库存
+        // 保养基于单设备 出库时记录 单设备所属的部门id(即保养工单的部门id)
+        if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {
+            IotLockStockPageReqVO reqVO = new IotLockStockPageReqVO();
+            reqVO.setFactoryIds(factoryIds);
+            reqVO.setCostCenterIds(costCenterIds);
+            reqVO.setMaterialCodes(materialCodes);
+            processLockStock(reqVO, lockStockPair, updateObj, bomMaterialPair);
+        }
+    }
+
     private static class Triple<A, B, C> {
         private final A first;
         private final B second;