|
@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
|
|
@@ -16,9 +17,11 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMa
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper;
|
|
@@ -31,9 +34,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.validation.annotation.Validated;
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.*;
|
|
import java.util.stream.Stream;
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
@@ -59,6 +61,8 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
private IotMainWorkOrderBomMaterialMapper iotMainWorkOrderBomMaterialMapper;
|
|
private IotMainWorkOrderBomMaterialMapper iotMainWorkOrderBomMaterialMapper;
|
|
@Resource
|
|
@Resource
|
|
private IotDeviceService iotDeviceService;
|
|
private IotDeviceService iotDeviceService;
|
|
|
|
+ @Resource
|
|
|
|
+ private IotLockStockMapper iotLockStockMapper;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Long createIotMainWorkOrder(IotMainWorkOrderSaveReqVO createReqVO) {
|
|
public Long createIotMainWorkOrder(IotMainWorkOrderSaveReqVO createReqVO) {
|
|
@@ -99,6 +103,9 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public PageResult<IotMainWorkOrderDO> getIotMainWorkOrderPage(IotMainWorkOrderPageReqVO pageReqVO) {
|
|
public PageResult<IotMainWorkOrderDO> getIotMainWorkOrderPage(IotMainWorkOrderPageReqVO pageReqVO) {
|
|
|
|
+ if (ObjUtil.isNotEmpty(pageReqVO.getResult()) && 0 == pageReqVO.getResult()) {
|
|
|
|
+ pageReqVO.setResult(null);
|
|
|
|
+ }
|
|
return iotMainWorkOrderMapper.selectPage(pageReqVO);
|
|
return iotMainWorkOrderMapper.selectPage(pageReqVO);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -136,7 +143,7 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
if (ObjectUtil.isEmpty(workOrderMaterials)) {
|
|
if (ObjectUtil.isEmpty(workOrderMaterials)) {
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
}
|
|
}
|
|
- // todo 保养工单 主表 还有 保养费用 、人工费用 、其他费用
|
|
|
|
|
|
+ // 保养工单 主表 还有 保养费用 、人工费用 、其他费用
|
|
IotMainWorkOrderDO updateObj = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
|
|
IotMainWorkOrderDO updateObj = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
|
|
updateObj.setResult(2);
|
|
updateObj.setResult(2);
|
|
iotMainWorkOrderMapper.updateById(updateObj);
|
|
iotMainWorkOrderMapper.updateById(updateObj);
|
|
@@ -149,13 +156,73 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
|
|
iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
|
|
// 保养工单 bom 明细关联的物料消耗
|
|
// 保养工单 bom 明细关联的物料消耗
|
|
List<IotMainWorkOrderBomMaterialDO> workOrderBomMaterialDOS = new ArrayList<>();
|
|
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<>();
|
|
workOrderMaterials.forEach(material -> {
|
|
workOrderMaterials.forEach(material -> {
|
|
IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
|
|
IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
|
|
tempMaterial.setWorkOrderId(mainWorkOrder.getId());
|
|
tempMaterial.setWorkOrderId(mainWorkOrder.getId());
|
|
workOrderBomMaterialDOS.add(tempMaterial);
|
|
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());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
});
|
|
});
|
|
|
|
+ // 添加 工单消耗的物料记录
|
|
iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
|
|
iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
|
|
- // todo 处理库存减少
|
|
|
|
|
|
+ // 只扣减本地库存 不处理SAP库存
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量处理 库存扣减
|
|
|
|
+ * @param reqVO
|
|
|
|
+ * @param lockStockPair
|
|
|
|
+ */
|
|
|
|
+ private void processLockStock(IotLockStockPageReqVO reqVO, Map<String, BigDecimal> lockStockPair){
|
|
|
|
+ List<IotLockStockDO> lockStocks = iotLockStockMapper.selectList(reqVO);
|
|
|
|
+ List<IotLockStockDO> tobeUpdatedLockStocks = new ArrayList<>();
|
|
|
|
+ if (CollUtil.isNotEmpty(lockStocks)) {
|
|
|
|
+ lockStocks.forEach(lockStock -> {
|
|
|
|
+ String tempKey = lockStock.getFactoryId() + String.valueOf(lockStock.getCostCenterId())
|
|
|
|
+ + lockStock.getMaterialCode();
|
|
|
|
+ if (lockStockPair.containsKey(tempKey)) {
|
|
|
|
+ lockStock.setQuantity(lockStock.getQuantity().subtract(lockStockPair.get(tempKey)));
|
|
|
|
+ tobeUpdatedLockStocks.add(lockStock);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ if (CollUtil.isNotEmpty(tobeUpdatedLockStocks)) {
|
|
|
|
+ // 扣减本地库存
|
|
|
|
+ iotLockStockMapper.updateBatch(tobeUpdatedLockStocks);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -175,7 +242,7 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
if (ObjectUtil.isEmpty(workOrderMaterials)) {
|
|
if (ObjectUtil.isEmpty(workOrderMaterials)) {
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
}
|
|
}
|
|
- // todo 保养工单 主表 还有 保养费用 、人工费用 、其他费用
|
|
|
|
|
|
+ // 保养工单 主表 还有 保养费用 、人工费用 、其他费用
|
|
IotMainWorkOrderDO order = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
|
|
IotMainWorkOrderDO order = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
|
|
// 生成保养工单号
|
|
// 生成保养工单号
|
|
order.setOrderNumber(createWorkOrderNumber());
|
|
order.setOrderNumber(createWorkOrderNumber());
|
|
@@ -198,13 +265,48 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
iotMainWorkOrderBomMapper.insertBatch(workOrderBomDOS);
|
|
iotMainWorkOrderBomMapper.insertBatch(workOrderBomDOS);
|
|
// 保养工单 bom 明细关联的物料消耗
|
|
// 保养工单 bom 明细关联的物料消耗
|
|
List<IotMainWorkOrderBomMaterialDO> workOrderBomMaterialDOS = new ArrayList<>();
|
|
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<>();
|
|
workOrderMaterials.forEach(material -> {
|
|
workOrderMaterials.forEach(material -> {
|
|
IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
|
|
IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
|
|
tempMaterial.setWorkOrderId(order.getId());
|
|
tempMaterial.setWorkOrderId(order.getId());
|
|
workOrderBomMaterialDOS.add(tempMaterial);
|
|
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());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
});
|
|
});
|
|
iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
|
|
iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
|
|
- // todo 处理库存减少
|
|
|
|
|
|
+ // 只扣减本地库存 不处理SAP库存
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|