|
|
|
@ -1,13 +1,12 @@
|
|
|
|
|
package jnpf.controller;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
import cn.hutool.core.lang.UUID;
|
|
|
|
|
import cn.hutool.core.lang.generator.UUIDGenerator;
|
|
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
|
|
import io.swagger.v3.oas.annotations.Operation;
|
|
|
|
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
|
|
|
import jnpf.base.ActionResult;
|
|
|
|
|
import jnpf.base.UserInfo;
|
|
|
|
|
import jnpf.exception.DataException;
|
|
|
|
|
import jnpf.permission.entity.UserEntity;
|
|
|
|
|
import jnpf.service.*;
|
|
|
|
|
import jnpf.entity.*;
|
|
|
|
|
import jnpf.util.*;
|
|
|
|
@ -16,24 +15,21 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import javax.validation.Valid;
|
|
|
|
|
import java.text.DateFormat;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
import jnpf.annotation.JnpfField;
|
|
|
|
|
import jnpf.base.vo.PageListVO;
|
|
|
|
|
import jnpf.base.vo.PaginationVO;
|
|
|
|
|
import jnpf.base.vo.DownloadVO;
|
|
|
|
|
import jnpf.config.ConfigValueUtil;
|
|
|
|
|
import jnpf.base.entity.ProvinceEntity;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
import jnpf.engine.entity.FlowTaskEntity;
|
|
|
|
|
import jnpf.exception.WorkFlowException;
|
|
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
|
|
|
|
import cn.afterturn.easypoi.excel.ExcelImportUtil;
|
|
|
|
@ -82,7 +78,21 @@ public class YysMonthlyProductionController {
|
|
|
|
|
private YysMonthlyProductionService yysMonthlyProductionService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private YysBillMaterialService bomService;
|
|
|
|
|
private YysBillMaterialService billMaterialService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysSubsetMaterialService subsetMaterialService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysMaterialInformationService materialInformationService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysDayWorkService dayWorkService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysInventoryQueryService inventoryQueryService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysMaterialProcurementOrderService materialProcurementOrderService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysMaterialRequirementPlanService materialRequirementPlanService;
|
|
|
|
|
@Resource
|
|
|
|
|
private YysMaterialRequirementItemService materialRequirementItemService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
@ -556,52 +566,285 @@ public class YysMonthlyProductionController {
|
|
|
|
|
} else {
|
|
|
|
|
return ActionResult.fail("月份不能为空");
|
|
|
|
|
}
|
|
|
|
|
UserInfo userInfo = userProvider.get();
|
|
|
|
|
// 获取没有生成MRP的月度生产计划
|
|
|
|
|
List<YysMonthlyProductionEntity> unMPRList = yysMonthlyProductionService.getUnMPRList(month);
|
|
|
|
|
if (unMPRList.size() == 0) return ActionResult.fail("没有需要生成MRP的月度生产计划");
|
|
|
|
|
// 获取没有生成MRP的月度生产计划
|
|
|
|
|
// 合并相同物料
|
|
|
|
|
unMPRList = mergeProduction(unMPRList);
|
|
|
|
|
|
|
|
|
|
Set<String> productIds = unMPRList.stream().map(YysMonthlyProductionEntity::getProductId).collect(Collectors.toSet());
|
|
|
|
|
|
|
|
|
|
if(productIds.size()==0){
|
|
|
|
|
return ActionResult.fail("没有需要生成MRP的月度生产计划");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据计划生成的物料 获取BOM清单
|
|
|
|
|
List<YysBillMaterialEntity> bomList = bomService.getListByProductIds(new ArrayList<>(productIds));
|
|
|
|
|
List<YysBillMaterialEntity> bomList = billMaterialService.getListByProductIds(new ArrayList<>(productIds));
|
|
|
|
|
|
|
|
|
|
Map<String, List<YysSubsetMaterialEntity>> expand = new LinkedHashMap<>();
|
|
|
|
|
// 获取bom 清单详情
|
|
|
|
|
for (YysBillMaterialEntity billMaterial : bomList) {
|
|
|
|
|
List<YysSubsetMaterialEntity> details = subsetMaterialService.getListByPieceId(billMaterial.getPieceId());
|
|
|
|
|
if (details.isEmpty()) return ActionResult.fail("BOM清单中存在没有子项的物料");
|
|
|
|
|
// 展开BOM清单
|
|
|
|
|
expandBomList(expand, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取 物料信息
|
|
|
|
|
Set<String> subsetIds = new HashSet<>();
|
|
|
|
|
// 获取物料信息
|
|
|
|
|
expand.forEach((bomId, details) -> {
|
|
|
|
|
Set<String> collect = details.stream().map(YysSubsetMaterialEntity::getSubsetId).collect(Collectors.toSet());
|
|
|
|
|
subsetIds.addAll(collect);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 获取单位信息
|
|
|
|
|
// 物料信息
|
|
|
|
|
List<YysMaterialInformationEntity> materialList = materialInformationService.getListByMatIds(new ArrayList<>(subsetIds));
|
|
|
|
|
HashMap<String, YysMaterialInformationEntity> matInfo = new HashMap<>();
|
|
|
|
|
materialList.forEach(mat -> matInfo.put(mat.getMaterialId(), mat));
|
|
|
|
|
|
|
|
|
|
// 计算一个计划的物料需求量
|
|
|
|
|
// 获取单位信息
|
|
|
|
|
Set<String> unit = materialList.stream().map(YysMaterialInformationEntity::getUnitMeasurement).collect(Collectors.toSet());
|
|
|
|
|
|
|
|
|
|
// 循环计划
|
|
|
|
|
YysMaterialRequirementPlanEntity plan = new YysMaterialRequirementPlanEntity();//物料需求计划
|
|
|
|
|
String planNumber = generaterSwapUtil.getBillNumber("plannumber", false);
|
|
|
|
|
|
|
|
|
|
// 所需物料 合并同类项
|
|
|
|
|
// todo 生成物料需求计划
|
|
|
|
|
List<YysMaterialRequirementItemEntity> planItems = new ArrayList<>();//物料需求详情
|
|
|
|
|
|
|
|
|
|
// 获取已排产未生产的物料
|
|
|
|
|
// 计算一个计划的物料需求量
|
|
|
|
|
for (YysMonthlyProductionEntity production : unMPRList) {
|
|
|
|
|
String productId = production.getProductId();
|
|
|
|
|
BigDecimal num = BigDecimal.valueOf(Long.valueOf(production.getPlanNumber()));//计划数量
|
|
|
|
|
List<YysSubsetMaterialEntity> subsetMats = expand.get(productId);// bom清单详情
|
|
|
|
|
for (YysSubsetMaterialEntity subset : subsetMats) {
|
|
|
|
|
YysMaterialRequirementItemEntity item = new YysMaterialRequirementItemEntity();
|
|
|
|
|
String planNo = plan.getPlanNumber();//物料需求计划编号
|
|
|
|
|
String matType = matInfo.get(subset.getSubsetId()).getMaterialClassification();//物料分类
|
|
|
|
|
String baseUse = subset.getBaseUse();//用量
|
|
|
|
|
String baseNum = subset.getBaseNum();//倍数
|
|
|
|
|
String subsetId = subset.getSubsetId();//子项ID
|
|
|
|
|
String subsetName = subset.getSubsetName();//子项名称
|
|
|
|
|
String model = subset.getSubsetModel();//子项型号
|
|
|
|
|
String unit1 = subset.getUnit();//子项单位
|
|
|
|
|
// 计算需求量
|
|
|
|
|
BigDecimal _baseUse = BigDecimal.valueOf(Long.valueOf(baseUse));
|
|
|
|
|
if (StringUtil.isNotEmpty(baseNum) && NumberUtil.isNumber(baseNum)) {
|
|
|
|
|
_baseUse = num.divide(BigDecimal.valueOf(Long.valueOf(baseNum))).setScale(3, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
}
|
|
|
|
|
BigDecimal needNum = _baseUse.multiply(BigDecimal.valueOf(Long.valueOf(baseUse)));
|
|
|
|
|
item.setMaterialRequirementPlanId(planNo);//物料需求计划No
|
|
|
|
|
item.setMaterialCode(subsetId);//物料编码
|
|
|
|
|
item.setMaterialName(subsetName);//物料名称
|
|
|
|
|
item.setMaterialType(matType);//物料类型
|
|
|
|
|
item.setSpecification(model);//物料型号
|
|
|
|
|
item.setUnit(unit1);//物料单位
|
|
|
|
|
item.setRequirementNumber(needNum);//需求量
|
|
|
|
|
planItems.add(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 所需物料 合并同类项
|
|
|
|
|
planItems = mergeMaterial(planItems);
|
|
|
|
|
|
|
|
|
|
/*** 未生产占用 ***/
|
|
|
|
|
|
|
|
|
|
// 获取已排产未生产的工单
|
|
|
|
|
List<YysDayWorkEntity> workList = dayWorkService.getUnProducedWorkOrderList();
|
|
|
|
|
// 合并相同产品的工单
|
|
|
|
|
workList = mergeWork(workList);
|
|
|
|
|
// 获取产品BOM
|
|
|
|
|
Set<String> prodCodes = workList.stream().map(YysDayWorkEntity::getProductCode).collect(Collectors.toSet());
|
|
|
|
|
List<YysBillMaterialEntity> bomList2 = billMaterialService.getListByProductIds(prodCodes);
|
|
|
|
|
// bom展开
|
|
|
|
|
Map<String, List<YysSubsetMaterialEntity>> workBomExpand = new HashMap<>();
|
|
|
|
|
for (YysBillMaterialEntity bom : bomList2) {
|
|
|
|
|
List<YysSubsetMaterialEntity> list = subsetMaterialService.getListByPieceId(bom.getPieceId());
|
|
|
|
|
expandBomList(workBomExpand, list);
|
|
|
|
|
}
|
|
|
|
|
// 计算未生产的物料需求量
|
|
|
|
|
HashMap<String, BigDecimal> unWorkOccupation = new HashMap<>();
|
|
|
|
|
for (YysDayWorkEntity work : workList) {
|
|
|
|
|
String planNum = work.getPlanNumber();
|
|
|
|
|
BigDecimal num = BigDecimal.valueOf(Long.valueOf(planNum));
|
|
|
|
|
String productCode = work.getProductCode();
|
|
|
|
|
workBomExpand.get(productCode).forEach(item -> {
|
|
|
|
|
String pieceId = item.getPieceId();//物料编码
|
|
|
|
|
BigDecimal baseUse = BigDecimal.valueOf(Long.valueOf(item.getBaseUse()));//用量
|
|
|
|
|
BigDecimal baseNum = BigDecimal.valueOf(Long.valueOf(item.getBaseNum()));//倍数
|
|
|
|
|
BigDecimal occupation = num.divide(baseNum).multiply(baseUse).setScale(3, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
unWorkOccupation.put(pieceId, occupation);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 与所需物料编码 交集 求同类需求量
|
|
|
|
|
for (YysMaterialRequirementItemEntity item : planItems) {
|
|
|
|
|
String materialCode = item.getMaterialCode();
|
|
|
|
|
BigDecimal occupy = unWorkOccupation.get(materialCode);
|
|
|
|
|
if (null != occupy) {
|
|
|
|
|
item.setUnProductOccupy(occupy);//未生产占用
|
|
|
|
|
} else item.setUnProductOccupy(BigDecimal.ZERO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据同类需求量 获取库存量
|
|
|
|
|
/*** 未生产占用 ***/
|
|
|
|
|
|
|
|
|
|
// 计算同类需求量 采购未入库的物料量
|
|
|
|
|
// 根据同类需求量 获取库存量
|
|
|
|
|
Set<String> matCodes = planItems.stream().map(YysMaterialRequirementItemEntity::getMaterialCode).collect(Collectors.toSet());
|
|
|
|
|
List<YysInventoryQueryEntity> inventoryList = inventoryQueryService.getListByMaterialCodes(matCodes);
|
|
|
|
|
|
|
|
|
|
// 查询采购
|
|
|
|
|
List<YysMaterialProcurementOrderEntity> orderList = materialProcurementOrderService.getNotStockedList(matCodes);
|
|
|
|
|
List<YysMaterialProcurementOrderEntity> origOrder = new ArrayList<>();
|
|
|
|
|
List<YysMaterialProcurementOrderEntity> deliveryOrder = new ArrayList<>();
|
|
|
|
|
if (orderList.size() > 0) {
|
|
|
|
|
origOrder = orderList.stream().filter(item -> {
|
|
|
|
|
if (item.getOrderNumber().contains("-")) return false;
|
|
|
|
|
return true;
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
deliveryOrder = orderList.stream().filter(item -> {
|
|
|
|
|
if (item.getOrderNumber().contains("-")) return true;
|
|
|
|
|
return false;
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
// 采购在途的物料量
|
|
|
|
|
Map<String, BigDecimal> inTransit = calculateInTransit(origOrder, deliveryOrder);
|
|
|
|
|
|
|
|
|
|
// 计算 同类需求量 - 库存量 - 采购未入库的物料量 = 需要采购的物料量
|
|
|
|
|
|
|
|
|
|
for (YysMaterialRequirementItemEntity item : planItems) {
|
|
|
|
|
String code = item.getMaterialCode();
|
|
|
|
|
BigDecimal requireNumber = item.getRequirementNumber();//毛需求量
|
|
|
|
|
BigDecimal occupy = item.getUnProductOccupy();//未生产占用
|
|
|
|
|
BigDecimal stock = BigDecimal.ZERO;//库存量
|
|
|
|
|
BigDecimal safeStock = BigDecimal.ZERO;//安全库存量
|
|
|
|
|
if (null == occupy) occupy = BigDecimal.ZERO;
|
|
|
|
|
YysInventoryQueryEntity inventory =
|
|
|
|
|
inventoryList.stream().filter(in -> in.getMaterialCode().equals(code)).findFirst().get();//库存
|
|
|
|
|
|
|
|
|
|
if (null != inventory && null != inventory.getInventoryNumber() && NumberUtil.isNumber(inventory.getInventoryNumber())) {
|
|
|
|
|
stock = BigDecimal.valueOf(Double.parseDouble(inventory.getInventoryNumber()));
|
|
|
|
|
}
|
|
|
|
|
YysMaterialInformationEntity materialInfo = materialList.stream().filter(m -> m.getMaterialId().equals(code)).findFirst().get();
|
|
|
|
|
if (null != materialInfo && null != materialInfo.getSafetyStock() && NumberUtil.isNumber(materialInfo.getSafetyStock())) {
|
|
|
|
|
safeStock = BigDecimal.valueOf(Double.parseDouble(materialInfo.getSafetyStock()));
|
|
|
|
|
}
|
|
|
|
|
BigDecimal inTransitNumber = inTransit.getOrDefault(item.getMaterialCode(), BigDecimal.ZERO);//采购在途的物料量
|
|
|
|
|
// 净需求量 =(总库存量 + 在途) - (安全库存 + 未生产占用 + 毛需求量) //核心算法
|
|
|
|
|
BigDecimal netDemand = stock.add(inTransitNumber).subtract(safeStock.add(occupy).add(requireNumber));
|
|
|
|
|
if (netDemand.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
netDemand = BigDecimal.ZERO;
|
|
|
|
|
} else {
|
|
|
|
|
netDemand = netDemand.abs();
|
|
|
|
|
}
|
|
|
|
|
item.setId(UUID.randomUUID().toString());
|
|
|
|
|
item.setInventoryNumber(stock);//库存量
|
|
|
|
|
item.setInventorySafetyNumber(safeStock);//安全库存量
|
|
|
|
|
item.setNotIntoNumber(inTransitNumber);//采购在途的物料量
|
|
|
|
|
item.setUnProductOccupy(occupy);//未生产占用
|
|
|
|
|
item.setLackNumber(netDemand);//净需求量
|
|
|
|
|
item.setCreatorTime(new Date());
|
|
|
|
|
item.setCreatorUserId(userInfo.getUserId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
plan.setPlanNumber(planNumber);//物料需求计划编号
|
|
|
|
|
plan.setId(UUID.randomUUID().toString());//
|
|
|
|
|
plan.setPlanYearMonth(cn.hutool.core.date.DateUtil.format(new Date(), "yyyy-MM"));
|
|
|
|
|
plan.setOrderDate(cn.hutool.core.date.DateUtil.format(new Date(), "yyyy-MM"));
|
|
|
|
|
plan.setCreatorTime(new Date());
|
|
|
|
|
plan.setCreatorUserId(userInfo.getUserId());
|
|
|
|
|
|
|
|
|
|
boolean b = materialRequirementPlanService.saveOrUpdate(plan);
|
|
|
|
|
// 插入物料需求计划表中
|
|
|
|
|
boolean b2 = materialRequirementItemService.saveBatch(planItems);
|
|
|
|
|
|
|
|
|
|
// 更新计划表中物料需求计划ID
|
|
|
|
|
|
|
|
|
|
// 完结
|
|
|
|
|
return ActionResult.success( "计算完成!",planNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<YysDayWorkEntity> mergeWork(List<YysDayWorkEntity> workList) {
|
|
|
|
|
workList = workList.stream().collect(Collectors.toMap(YysDayWorkEntity::getProductCode, a -> a, (o1, o2) -> {
|
|
|
|
|
o1.setPlanNumber(String.valueOf(Long.valueOf(o1.getPlanNumber()) + Long.valueOf(o2.getPlanNumber())));
|
|
|
|
|
return o1;
|
|
|
|
|
})).values().stream().collect(Collectors.toList());
|
|
|
|
|
return workList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 合并生产计划
|
|
|
|
|
private List<YysMonthlyProductionEntity> mergeProduction(List<YysMonthlyProductionEntity> unMPRList) {
|
|
|
|
|
List<YysMonthlyProductionEntity> merged = unMPRList.stream().collect(Collectors.toMap(YysMonthlyProductionEntity::getProductId, a -> a, (o1, o2) -> {
|
|
|
|
|
o1.setMeasurementNumber(String.valueOf(Integer.valueOf(o1.getMeasurementNumber()) + Integer.valueOf(o2.getMeasurementNumber())));
|
|
|
|
|
return o1;
|
|
|
|
|
})).values().stream().collect(Collectors.toList());
|
|
|
|
|
return merged;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 展开BOM清单
|
|
|
|
|
private Map<String, List<YysSubsetMaterialEntity>> expandBomList(Map<String, List<YysSubsetMaterialEntity>> expand, List<YysSubsetMaterialEntity> details) {
|
|
|
|
|
details.forEach(subsetMaterial -> {
|
|
|
|
|
String pieceId = subsetMaterial.getPieceId();
|
|
|
|
|
if (pieceId.startsWith("4")) {// 4 开头的物料是半成品需要再次展开
|
|
|
|
|
String baseUse = subsetMaterial.getBaseUse();//用量
|
|
|
|
|
String baseNum = subsetMaterial.getBaseNum();//倍数
|
|
|
|
|
if (StringUtil.isNotEmpty(baseNum) && NumberUtil.isNumber(baseNum)) {
|
|
|
|
|
baseUse = String.valueOf(Integer.valueOf(baseUse) * Integer.valueOf(baseNum));//用量*倍数
|
|
|
|
|
}
|
|
|
|
|
List<YysSubsetMaterialEntity> subsetMaterials = subsetMaterialService.getListByPieceId(pieceId);
|
|
|
|
|
details.remove(subsetMaterial);//移除当前物料
|
|
|
|
|
String finalBaseUse = baseUse;
|
|
|
|
|
subsetMaterials.forEach(mat -> {
|
|
|
|
|
mat.setBaseNum(String.valueOf(Integer.valueOf(mat.getBaseUse()) * Integer.valueOf(finalBaseUse)));//用量*用量
|
|
|
|
|
});
|
|
|
|
|
details.addAll(subsetMaterials);//添加展开后的物料
|
|
|
|
|
expandBomList(expand, subsetMaterials);//递归展开
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
expand.put(details.get(0).getPieceId(), details);
|
|
|
|
|
return expand;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 合并物料需求
|
|
|
|
|
private List<YysMaterialRequirementItemEntity> mergeMaterial(List<YysMaterialRequirementItemEntity> planItems) {
|
|
|
|
|
List<YysMaterialRequirementItemEntity> merge = planItems.stream().collect(Collectors.toMap(YysMaterialRequirementItemEntity::getMaterialCode, a -> a, (o1, o2) -> {
|
|
|
|
|
o1.setRequirementNumber(o1.getRequirementNumber().add(o2.getRequirementNumber()));
|
|
|
|
|
return o1;
|
|
|
|
|
})).values().stream().collect(Collectors.toList());
|
|
|
|
|
return merge;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 计算在途量
|
|
|
|
|
private Map<String, BigDecimal> calculateInTransit(List<YysMaterialProcurementOrderEntity> origOrder,
|
|
|
|
|
List<YysMaterialProcurementOrderEntity> deliveryOrder) {
|
|
|
|
|
HashMap<String, BigDecimal> inTransit = new HashMap<>();
|
|
|
|
|
if (origOrder.isEmpty()) return inTransit;
|
|
|
|
|
for (YysMaterialProcurementOrderEntity order : origOrder) {
|
|
|
|
|
String code = order.getMaterialCode();
|
|
|
|
|
BigDecimal quantity = order.getOrderQuantity();
|
|
|
|
|
BigDecimal num = inTransit.getOrDefault(code, BigDecimal.ZERO);
|
|
|
|
|
String orderNumber = order.getOrderNumber();
|
|
|
|
|
if (deliveryOrder.isEmpty()) {
|
|
|
|
|
inTransit.put(code, quantity.add(num));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
List<YysMaterialProcurementOrderEntity> list = filterDeliveryOrder(orderNumber, deliveryOrder);
|
|
|
|
|
if (list.size() == 0) {
|
|
|
|
|
inTransit.put(code, quantity.add(num));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
for (YysMaterialProcurementOrderEntity delivery : list) {
|
|
|
|
|
BigDecimal confirmQuantityReceived = delivery.getConfirmQuantityReceived();
|
|
|
|
|
if (confirmQuantityReceived == null) {
|
|
|
|
|
confirmQuantityReceived = BigDecimal.ZERO;
|
|
|
|
|
}
|
|
|
|
|
BigDecimal onRoad = quantity.subtract(confirmQuantityReceived);
|
|
|
|
|
num = num.add(onRoad);
|
|
|
|
|
}
|
|
|
|
|
inTransit.put(code, num);
|
|
|
|
|
}
|
|
|
|
|
return inTransit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ActionResult.success("成功");
|
|
|
|
|
// 筛选发货单
|
|
|
|
|
private List<YysMaterialProcurementOrderEntity> filterDeliveryOrder(String orderNum, List<YysMaterialProcurementOrderEntity> deliveryOrder) {
|
|
|
|
|
return deliveryOrder.stream().filter(order -> order.getOrderNumber().contains(orderNum)).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@PostMapping("/scheduling")
|
|
|
|
|
@Operation(summary = "生产排产")
|
|
|
|
|
public ActionResult ProductionScheduling(@RequestBody YysMonthlyProductionStrategyVO strategyVO) {
|
|
|
|
@ -617,4 +860,5 @@ public class YysMonthlyProductionController {
|
|
|
|
|
return ActionResult.success("成功");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|