|
|
|
|
@ -32,6 +32,7 @@ import java.util.*;
|
|
|
|
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
|
|
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.UNIT_ERROR;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生产领料 Service 实现类
|
|
|
|
|
@ -42,7 +43,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
|
|
|
|
|
@Validated
|
|
|
|
|
public class ItemAnalysisServiceImpl implements ItemAnalysisService {
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(ItemAnalysisServiceImpl.class);
|
|
|
|
|
private static final String UNIT_ERROR = "物料bom单位不一致!";
|
|
|
|
|
// private static final String UNIT_ERROR = "物料bom单位不一致!";
|
|
|
|
|
@Resource
|
|
|
|
|
private ErpStockService erpStockService;
|
|
|
|
|
@Resource
|
|
|
|
|
@ -78,7 +79,7 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService {
|
|
|
|
|
//每个taskDetail计算一次物料需求,汇总到map里面
|
|
|
|
|
List<BomDetailDO> bomDetailDOList =
|
|
|
|
|
bomService.getBomDetailListByProductId(detail.getProductId(), detail.getNumber());
|
|
|
|
|
buildItemMap(itemMap, bomDetailDOList);
|
|
|
|
|
buildItemMap(itemMap, bomDetailDOList,detail.getProductId());
|
|
|
|
|
}
|
|
|
|
|
//算库存
|
|
|
|
|
for (Long key : itemMap.keySet()) {
|
|
|
|
|
@ -135,13 +136,13 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService {
|
|
|
|
|
BomDO bomDO = bomService.selectByProductId(detail.getProductId());
|
|
|
|
|
if (!bomDO.getUnitId().equals(ProductUnitEnum.Each.getUnitId())
|
|
|
|
|
|| !detail.getProductUnitId().equals(ProductUnitEnum.Each.getUnitId())) {
|
|
|
|
|
log.error(UNIT_ERROR);
|
|
|
|
|
throw exception(new ErrorCode(500, UNIT_ERROR));
|
|
|
|
|
log.error(String.valueOf(UNIT_ERROR));
|
|
|
|
|
throw exception(UNIT_ERROR);
|
|
|
|
|
}
|
|
|
|
|
//每个detail计算一次物料需求,汇总到map里面
|
|
|
|
|
List<BomDetailDO> bomDetailDOList =
|
|
|
|
|
bomService.getBomDetailListByProductId(detail.getProductId(), detail.getCount().longValue());
|
|
|
|
|
buildItemMap(itemMap, bomDetailDOList);
|
|
|
|
|
buildItemMap(itemMap, bomDetailDOList,detail.getProductId());
|
|
|
|
|
}
|
|
|
|
|
//算库存
|
|
|
|
|
for (Long key : itemMap.keySet()) {
|
|
|
|
|
@ -173,22 +174,58 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void buildItemMap(Map<Long, ItemRequisitionAndStock> itemMap, List<BomDetailDO> bomDetailDOList) {
|
|
|
|
|
private void buildItemMap(Map<Long, ItemRequisitionAndStock> itemMap,
|
|
|
|
|
List<BomDetailDO> bomDetailDOList,
|
|
|
|
|
Long currentProductId) {
|
|
|
|
|
for (BomDetailDO bomDetail : bomDetailDOList) {
|
|
|
|
|
if (itemMap.containsKey(bomDetail.getProductId())) {
|
|
|
|
|
ItemRequisitionAndStock temp = itemMap.get(bomDetail.getProductId());
|
|
|
|
|
//比较单位是否一致
|
|
|
|
|
Long itemId = bomDetail.getProductId();
|
|
|
|
|
if (itemMap.containsKey(itemId)) {
|
|
|
|
|
ItemRequisitionAndStock temp = itemMap.get(itemId);
|
|
|
|
|
|
|
|
|
|
if (!temp.getUnitId().equals(bomDetail.getUnitId())) {
|
|
|
|
|
log.error(UNIT_ERROR);
|
|
|
|
|
throw exception(new ErrorCode(500, UNIT_ERROR));
|
|
|
|
|
BomDO currBom = bomService.getBom(bomDetail.getBomId());
|
|
|
|
|
BomDO prevBom = temp.getSourceBomId() == null ? null : bomService.getBom(temp.getSourceBomId());
|
|
|
|
|
|
|
|
|
|
ErpProductDO subItem = productService.getProduct(itemId);
|
|
|
|
|
ErpProductDO currProduct = currentProductId == null ? null : productService.getProduct(currentProductId);
|
|
|
|
|
ErpProductDO prevProduct = temp.getSourceProductId() == null ? null : productService.getProduct(temp.getSourceProductId());
|
|
|
|
|
|
|
|
|
|
ErpProductUnitDO currUnit = productUnitService.getProductUnit(bomDetail.getUnitId());
|
|
|
|
|
ErpProductUnitDO prevUnit = productUnitService.getProductUnit(temp.getUnitId());
|
|
|
|
|
|
|
|
|
|
String currProductCode = currProduct == null ? "-" : Objects.toString(currProduct.getBarCode(), "-");
|
|
|
|
|
String currProductName = currProduct == null ? "-" : Objects.toString(currProduct.getName(), "-");
|
|
|
|
|
String prevProductCode = prevProduct == null ? "-" : Objects.toString(prevProduct.getBarCode(), "-");
|
|
|
|
|
String prevProductName = prevProduct == null ? "-" : Objects.toString(prevProduct.getName(), "-");
|
|
|
|
|
|
|
|
|
|
String currBomCode = currBom == null ? "-" : Objects.toString(currBom.getCode(), "-");
|
|
|
|
|
String prevBomCode = prevBom == null ? "-" : Objects.toString(prevBom.getCode(), "-");
|
|
|
|
|
|
|
|
|
|
String subItemCode = subItem == null ? "-" : Objects.toString(subItem.getBarCode(), "-");
|
|
|
|
|
String subItemName = subItem == null ? "-" : Objects.toString(subItem.getName(), "-");
|
|
|
|
|
|
|
|
|
|
String currUnitName = currUnit == null ? "-" : Objects.toString(currUnit.getName(), "-");
|
|
|
|
|
String prevUnitName = prevUnit == null ? "-" : Objects.toString(prevUnit.getName(), "-");
|
|
|
|
|
|
|
|
|
|
String msg = String.format(
|
|
|
|
|
"产品[%s-%s] 的 BOM[%s] 中,子物料[%s-%s] 单位[%s] 与 产品[%s-%s] 的 BOM[%s] 中子物料单位[%s] 冲突!应改成一致的单位",
|
|
|
|
|
currProductCode, currProductName, currBomCode,
|
|
|
|
|
subItemCode, subItemName, currUnitName,
|
|
|
|
|
prevProductCode, prevProductName, prevBomCode, prevUnitName
|
|
|
|
|
);
|
|
|
|
|
log.error(msg);
|
|
|
|
|
throw exception(new ErrorCode(5_002, msg));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
temp.setNumber(temp.getNumber().add(bomDetail.getUsageNumber()));
|
|
|
|
|
} else {
|
|
|
|
|
ItemRequisitionAndStock temp = new ItemRequisitionAndStock()
|
|
|
|
|
.setItemId(bomDetail.getProductId())
|
|
|
|
|
.setItemId(itemId)
|
|
|
|
|
.setNumber(bomDetail.getUsageNumber())
|
|
|
|
|
.setUnitId(bomDetail.getUnitId());
|
|
|
|
|
itemMap.put(bomDetail.getProductId(), temp);
|
|
|
|
|
.setUnitId(bomDetail.getUnitId())
|
|
|
|
|
.setSourceBomId(bomDetail.getBomId())
|
|
|
|
|
.setSourceProductId(currentProductId);
|
|
|
|
|
itemMap.put(itemId, temp);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|