|
|
@@ -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;
|