修正领料库存逻辑
This commit is contained in:
parent
21bee91a10
commit
dc39193624
|
|
@ -1839,8 +1839,8 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 预计算库存数据,替代复杂的类型树计算
|
* 预计算库存数据,重现原始的类型树计算逻辑
|
||||||
* 这个方法将原来每个detail都要执行的复杂计算优化为一次性预计算
|
* 业务逻辑:总领料数量 - 已在用数量 = 剩余可用库存
|
||||||
*/
|
*/
|
||||||
private Map<Long, BigDecimal> preCalculateStorageNums(MaterialLeaseApplyInfo info,
|
private Map<Long, BigDecimal> preCalculateStorageNums(MaterialLeaseApplyInfo info,
|
||||||
List<AgreementVo> agreementList,
|
List<AgreementVo> agreementList,
|
||||||
|
|
@ -1848,27 +1848,67 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService {
|
||||||
Map<Long, BigDecimal> storageNumMap = new HashMap<>();
|
Map<Long, BigDecimal> storageNumMap = new HashMap<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 简化的库存计算:直接查询ma_type表的storage_num字段
|
log.info("开始预计算库存,原始类型树逻辑,处理{}个类型", typeIds.size());
|
||||||
for (Long typeId : typeIds) {
|
|
||||||
try {
|
// 第1步:从协议中获取总领料数量(原listL5逻辑)
|
||||||
// 查询单个类型的信息,获取storage_num
|
Map<Long, BigDecimal> totalLeaseNums = new HashMap<>();
|
||||||
Type typeInfo = typeMapper.selectTypeByTypeId(typeId);
|
if (!CollectionUtils.isEmpty(agreementList)) {
|
||||||
if (typeInfo != null && typeInfo.getStorageNum() != null) {
|
for (AgreementVo agreementVo : agreementList) {
|
||||||
storageNumMap.put(typeId, typeInfo.getStorageNum());
|
BackApplyInfo backApplyInfo = new BackApplyInfo();
|
||||||
} else {
|
backApplyInfo.setAgreementId(Long.valueOf(agreementVo.getAgreementId()));
|
||||||
storageNumMap.put(typeId, BigDecimal.ZERO);
|
List<TypeTreeNode> listL4 = mapper.getUseTypeTreeL4(backApplyInfo);
|
||||||
|
|
||||||
|
if (!CollectionUtils.isEmpty(listL4)) {
|
||||||
|
for (TypeTreeNode node : listL4) {
|
||||||
|
if (node.getTypeId() != 0L && node.getNum() != null) {
|
||||||
|
totalLeaseNums.merge(node.getTypeId(), node.getNum(), BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("查询typeId {}的库存失败: {}", typeId, e.getMessage());
|
|
||||||
storageNumMap.put(typeId, BigDecimal.ZERO);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info("预计算库存完成,为{}个类型查询了库存值", typeIds.size());
|
// 第2步:通过工程获取已在用数量(原list7逻辑)
|
||||||
|
Map<Long, BigDecimal> usedNums = new HashMap<>();
|
||||||
|
MaterialLeaseApplyInfo bean = new MaterialLeaseApplyInfo();
|
||||||
|
bean.setProId(info.getProId());
|
||||||
|
List<BmAgreementInfo> listAgreement = materialLeaseInfoMapper.getAgreementIdByProId(bean);
|
||||||
|
|
||||||
|
if (!CollectionUtils.isEmpty(listAgreement)) {
|
||||||
|
for (BmAgreementInfo agreementInfo : listAgreement) {
|
||||||
|
bean.setAgreementId(agreementInfo.getAgreementId());
|
||||||
|
List<TypeTreeNode> list6 = materialLeaseInfoMapper.getUseTypeTree(bean);
|
||||||
|
|
||||||
|
if (!CollectionUtils.isEmpty(list6)) {
|
||||||
|
for (TypeTreeNode node : list6) {
|
||||||
|
if (node.getTypeId() != 0L && node.getNum() != null) {
|
||||||
|
usedNums.merge(node.getTypeId(), node.getNum(), BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第3步:计算剩余库存 = 总领料数量 - 已在用数量
|
||||||
|
for (Long typeId : typeIds) {
|
||||||
|
BigDecimal totalNum = totalLeaseNums.getOrDefault(typeId, BigDecimal.ZERO);
|
||||||
|
BigDecimal usedNum = usedNums.getOrDefault(typeId, BigDecimal.ZERO);
|
||||||
|
BigDecimal storageNum = totalNum.subtract(usedNum);
|
||||||
|
|
||||||
|
// 确保不为负数
|
||||||
|
if (storageNum.compareTo(BigDecimal.ZERO) < 0) {
|
||||||
|
storageNum = BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
storageNumMap.put(typeId, storageNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("库存计算完成 - 总领料:{}项,已在用:{}项,计算库存:{}项",
|
||||||
|
totalLeaseNums.size(), usedNums.size(), storageNumMap.size());
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("预计算库存数据失败: {}", e.getMessage());
|
log.error("预计算库存失败: {}", e.getMessage(), e);
|
||||||
// 发生错误时返回默认值
|
// 失败时为所有类型设置默认值
|
||||||
for (Long typeId : typeIds) {
|
for (Long typeId : typeIds) {
|
||||||
storageNumMap.put(typeId, BigDecimal.ZERO);
|
storageNumMap.put(typeId, BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue