|
|
|
|
@ -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
|
|
|
|
|
@ -64,32 +65,53 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService {
|
|
|
|
|
public List<ItemRequisitionAndStock> getItemAnalysis(TaskDO taskDO) {
|
|
|
|
|
|
|
|
|
|
List<TaskDetailDO> detailDOList = taskService.getTaskDetailListByTaskId(taskDO.getId());
|
|
|
|
|
Map<Long, ItemRequisitionAndStock> itemMap = new HashMap<>();
|
|
|
|
|
//算物料需求
|
|
|
|
|
for (TaskDetailDO detail : detailDOList) {
|
|
|
|
|
//这里要求销售的单位和物料单位一致等于内置单位
|
|
|
|
|
// BomDO bomDO = bomService.selectByProductId(detail.getProductId());
|
|
|
|
|
// if (!bomDO.getUnitId().equals(ProductUnitEnum.Each.getUnitId())
|
|
|
|
|
// || !detail.getUnitId().equals(ProductUnitEnum.Each.getUnitId())) {
|
|
|
|
|
// log.error(UNIT_ERROR);
|
|
|
|
|
// throw exception(new ErrorCode(500, UNIT_ERROR));
|
|
|
|
|
// }
|
|
|
|
|
List<ItemRequisitionAndStock> itemList = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
//每个taskDetail计算一次物料需求,汇总到map里面
|
|
|
|
|
// 算物料需求:逐条追加,不合并
|
|
|
|
|
for (TaskDetailDO detail : detailDOList) {
|
|
|
|
|
List<BomDetailDO> bomDetailDOList =
|
|
|
|
|
bomService.getBomDetailListByProductId(detail.getProductId(), detail.getNumber());
|
|
|
|
|
buildItemMap(itemMap, bomDetailDOList);
|
|
|
|
|
buildItemList(itemList, bomDetailDOList, detail.getProductId());
|
|
|
|
|
}
|
|
|
|
|
//算库存
|
|
|
|
|
for (Long key : itemMap.keySet()) {
|
|
|
|
|
BigDecimal stockCount = erpStockService.getStockCount(key);
|
|
|
|
|
itemMap.get(key).setStockNumber(stockCount);
|
|
|
|
|
BigDecimal stockWorkshopCount = stockWorkshopService.getStockCount(key);
|
|
|
|
|
itemMap.get(key).setStockWorkshopNumber(stockWorkshopCount);
|
|
|
|
|
|
|
|
|
|
// 算库存:每条都查并赋值(不合并情况下可能重复物料)
|
|
|
|
|
for (ItemRequisitionAndStock item : itemList) {
|
|
|
|
|
BigDecimal stockCount = erpStockService.getStockCount(item.getItemId());
|
|
|
|
|
item.setStockNumber(stockCount);
|
|
|
|
|
BigDecimal stockWorkshopCount = stockWorkshopService.getStockCount(item.getItemId());
|
|
|
|
|
item.setStockWorkshopNumber(stockWorkshopCount);
|
|
|
|
|
}
|
|
|
|
|
List<ItemRequisitionAndStock> list = new ArrayList<>(itemMap.values());
|
|
|
|
|
list = buildDetailVOList(list);
|
|
|
|
|
return list;
|
|
|
|
|
|
|
|
|
|
return buildDetailVOList(itemList);
|
|
|
|
|
|
|
|
|
|
// ============ 合并子物料版本 ===========
|
|
|
|
|
// List<TaskDetailDO> detailDOList = taskService.getTaskDetailListByTaskId(taskDO.getId());
|
|
|
|
|
// Map<Long, ItemRequisitionAndStock> itemMap = new HashMap<>();
|
|
|
|
|
// //算物料需求
|
|
|
|
|
// for (TaskDetailDO detail : detailDOList) {
|
|
|
|
|
// //这里要求销售的单位和物料单位一致等于内置单位
|
|
|
|
|
//// BomDO bomDO = bomService.selectByProductId(detail.getProductId());
|
|
|
|
|
//// if (!bomDO.getUnitId().equals(ProductUnitEnum.Each.getUnitId())
|
|
|
|
|
//// || !detail.getUnitId().equals(ProductUnitEnum.Each.getUnitId())) {
|
|
|
|
|
//// log.error(UNIT_ERROR);
|
|
|
|
|
//// throw exception(new ErrorCode(500, UNIT_ERROR));
|
|
|
|
|
//// }
|
|
|
|
|
//
|
|
|
|
|
// //每个taskDetail计算一次物料需求,汇总到map里面
|
|
|
|
|
// List<BomDetailDO> bomDetailDOList =
|
|
|
|
|
// bomService.getBomDetailListByProductId(detail.getProductId(), detail.getNumber());
|
|
|
|
|
// buildItemMap(itemMap, bomDetailDOList,detail.getProductId());
|
|
|
|
|
// }
|
|
|
|
|
// //算库存
|
|
|
|
|
// for (Long key : itemMap.keySet()) {
|
|
|
|
|
// BigDecimal stockCount = erpStockService.getStockCount(key);
|
|
|
|
|
// itemMap.get(key).setStockNumber(stockCount);
|
|
|
|
|
// BigDecimal stockWorkshopCount = stockWorkshopService.getStockCount(key);
|
|
|
|
|
// itemMap.get(key).setStockWorkshopNumber(stockWorkshopCount);
|
|
|
|
|
// }
|
|
|
|
|
// List<ItemRequisitionAndStock> list = new ArrayList<>(itemMap.values());
|
|
|
|
|
// list = buildDetailVOList(list);
|
|
|
|
|
// return list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//分析计划的物料需求
|
|
|
|
|
@ -135,13 +157,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 +195,118 @@ public class ItemAnalysisServiceImpl implements ItemAnalysisService {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void buildItemMap(Map<Long, ItemRequisitionAndStock> itemMap, List<BomDetailDO> bomDetailDOList) {
|
|
|
|
|
private void buildItemList(List<ItemRequisitionAndStock> itemList,
|
|
|
|
|
List<BomDetailDO> bomDetailDOList,
|
|
|
|
|
Long currentProductId) {
|
|
|
|
|
for (BomDetailDO bomDetail : bomDetailDOList) {
|
|
|
|
|
if (itemMap.containsKey(bomDetail.getProductId())) {
|
|
|
|
|
ItemRequisitionAndStock temp = itemMap.get(bomDetail.getProductId());
|
|
|
|
|
//比较单位是否一致
|
|
|
|
|
Long itemId = bomDetail.getProductId();
|
|
|
|
|
|
|
|
|
|
// 可选:仅做单位冲突校验(跨产品同子物料)
|
|
|
|
|
// for (ItemRequisitionAndStock existed : itemList) {
|
|
|
|
|
// if (!Objects.equals(existed.getItemId(), itemId)) {
|
|
|
|
|
// continue;
|
|
|
|
|
// }
|
|
|
|
|
// if (!Objects.equals(existed.getUnitId(), bomDetail.getUnitId())) {
|
|
|
|
|
// BomDO currBom = bomService.getBom(bomDetail.getBomId());
|
|
|
|
|
// BomDO prevBom = existed.getSourceBomId() == null ? null : bomService.getBom(existed.getSourceBomId());
|
|
|
|
|
//
|
|
|
|
|
// ErpProductDO subItem = productService.getProduct(itemId);
|
|
|
|
|
// ErpProductDO currProduct = currentProductId == null ? null : productService.getProduct(currentProductId);
|
|
|
|
|
// ErpProductDO prevProduct = existed.getSourceProductId() == null ? null : productService.getProduct(existed.getSourceProductId());
|
|
|
|
|
//
|
|
|
|
|
// ErpProductUnitDO currUnit = productUnitService.getProductUnit(bomDetail.getUnitId());
|
|
|
|
|
// ErpProductUnitDO prevUnit = productUnitService.getProductUnit(existed.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));
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 不合并:每条 BOM 明细生成一条记录
|
|
|
|
|
ItemRequisitionAndStock temp = new ItemRequisitionAndStock()
|
|
|
|
|
.setItemId(itemId)
|
|
|
|
|
.setNumber(bomDetail.getUsageNumber())
|
|
|
|
|
.setUnitId(bomDetail.getUnitId())
|
|
|
|
|
.setSourceBomId(bomDetail.getBomId())
|
|
|
|
|
.setSourceProductId(currentProductId);
|
|
|
|
|
|
|
|
|
|
itemList.add(temp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void buildItemMap(Map<Long, ItemRequisitionAndStock> itemMap,
|
|
|
|
|
List<BomDetailDO> bomDetailDOList,
|
|
|
|
|
Long currentProductId) {
|
|
|
|
|
for (BomDetailDO bomDetail : bomDetailDOList) {
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|