From 2a21bf56c3296510fa56024b6062aae8e99d2293 Mon Sep 17 00:00:00 2001 From: zhanghl <253316343@qq.com> Date: 星期四, 08 五月 2025 10:37:13 +0800 Subject: [PATCH] 生成钣金工单计划 基础代码 --- aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 273 insertions(+), 2 deletions(-) diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java index b6da4b1..3f889a0 100644 --- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java +++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java @@ -1,11 +1,24 @@ package com.aps.core.service.impl; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; import java.util.List; +import java.util.Optional; + +import cn.hutool.core.util.IdUtil; import com.aps.common.core.utils.DateUtils; +import com.aps.common.security.utils.DictUtils; +import com.aps.common.security.utils.SecurityUtils; +import com.aps.core.domain.*; +import com.aps.core.mapper.*; +import com.aps.core.service.IApsBomService; +import com.aps.core.service.IApsPlateStandardRequireBomOrderDetailService; +import com.aps.core.service.IApsPlateStandardRequireBomStockDetailService; +import com.aps.system.api.domain.SysDictData; +import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.aps.core.mapper.ApsPlateStandardRequireMapper; -import com.aps.core.domain.ApsPlateStandardRequire; import com.aps.core.service.IApsPlateStandardRequireService; /** @@ -19,6 +32,41 @@ { @Autowired private ApsPlateStandardRequireMapper apsPlateStandardRequireMapper; + + @Resource + private ApsPlateStandardRequireBatchMapper requireBatchMapper; + + @Resource + ApsPlatePlanMapper platePlanMapper; + + @Resource + ApsBomHeaderMapper bomHeaderMapper; + @Resource + IApsBomService bomLineService; + + @Resource + ApsMaterialStorageManagementMapper itemStorageMapper; + + @Resource + ApsPlateStandardRequireBomStockDetailMapper plateBomStockDetailMapper; + + @Resource + IApsPlateStandardRequireBomStockDetailService bomStockDetailService; + @Resource + ApsStandardProcessRouteHeaderMapper standardProcessRouteHeaderMapper; + + @Resource + ApsStandardProcessRouteLineMapper ApsStandardProcessRouteLineMapper; + + @Resource + ApsPlateStandardRequireBomOrderDetailMapper plateBomOrderDetailMapper; + + @Autowired + private ApsPlatePlanMapper apsPlatePlanMapper; + + @Resource + IApsPlateStandardRequireBomOrderDetailService bomOrderDetailService; + /** * 鏌ヨ閽i噾宸ュ崟鏍囧噯闇�姹� @@ -93,4 +141,227 @@ { return apsPlateStandardRequireMapper.deleteApsPlateStandardRequireById(id); } + + private void generatorPlan(){ + + /*瀹氫箟宸ュ巶涓哄崡閫� */ + String plantCode="FORTUNA"; + /*瀹氫箟涓诲崟绫诲瀷涓洪挘閲戜富鍗�*/ + String mainOrderType = "閽i噾涓讳欢"; + /*瀹氫箟瀛愬崟绫诲瀷涓洪挘閲戝瓙鍗�*/ + String subOrderType = "閽i噾瀛愪欢"; + /*鐢熸垚鏂版壒娆″彿*/ + String batchNum=getBatch(); + /*鑾峰彇閽i噾涓诲崟淇℃伅*/ + List<ApsPlatePlan> mainPlans = platePlanMapper.selectPlatePlanByPlantMajor(plantCode,mainOrderType); + List<ApsPlateStandardRequire> requiresList=new ArrayList<>(); + for (ApsPlatePlan mainPlan : mainPlans) { + String itemNumber = mainPlan.getItemNumber(); + /*鏍规嵁鏂欏彿 鑾峰彇BOM Header */ + } + + + + } + private void getBomRequires(String plant, ApsBom bomLine, String batchNum, Date upLevelStartDate, ApsPlatePlan plan, List<ApsPlateStandardRequire> allRequires, Long level){ + + String itemNumber = bomLine.getItemCode(); + String productivityModel_combined_batch="鍚堟壒"; + String productivityModel_monopolize="鐙崰"; + Optional<ApsStandardProcessRouteHeader> firstProcessRoute = standardProcessRouteHeaderMapper.queryStandardProcessRouteHeaderByPlantAndItemCode(plant, itemNumber).stream().findFirst(); + if (firstProcessRoute.isPresent()) { + /*鑾峰彇宸ヨ壓璺嚎Header淇℃伅*/ + ApsStandardProcessRouteHeader routeHeader = firstProcessRoute.get(); + /*鏋勫缓闇�姹備俊鎭�*/ + ApsPlateStandardRequire require = new ApsPlateStandardRequire(); + require.setId(IdUtil.getSnowflakeNextId()); + require.setRequireId(plan.getId()); + require.setBatchNumber(batchNum); + require.setOrgCode(plant); + require.setBomLineCode(itemNumber); + require.setBomLineLevel(level); + require.setBomUseAmount(bomLine.getNum()); + require.setCreateTime(DateUtils.getNowDate()); + require.setCreateBy(SecurityUtils.getUsername()); + /*璁$畻闇�姹傛暟閲�*/ + if (level == 0) { + require.setBomUseAmount(BigDecimal.ONE); + require.setCompleteDate(plan.getPlanEndDay()); + require.setDemandDate(plan.getPlanEndDay()); + } else { + require.setBomUseAmount(bomLine.getNum().multiply(plan.getProductionQuantity())); + } + /*鏌ユ壘搴撳瓨锛岃绠楀噣闇�姹傦紝淇濆瓨鍓╀綑搴撳瓨锛屼繚瀛樺簱瀛樻墸鍑忔槑缁�*/ + BigDecimal remainderStock = BigDecimal.ZERO; + Optional<ApsMaterialStorageManagement> itemStorage = getItemStorage(plant, itemNumber); + if (itemStorage.isPresent()) { + ApsMaterialStorageManagement storage = itemStorage.get(); + /*鍓╀綑搴撳瓨*/ + remainderStock = storage.getRemainderStock(); + /*璁$畻鍑�闇�姹� 榛樿=闇�姹傛暟閲�*/ + if (remainderStock.compareTo(BigDecimal.ZERO) == 0) { + require.setNetRequirement(require.getBomUseAmount()); + } + if (remainderStock.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal subtract = require.getBomUseAmount().subtract(remainderStock); + BigDecimal deductionAmount = BigDecimal.ZERO; + BigDecimal afterStockAmount = BigDecimal.ZERO; + if (subtract.compareTo(BigDecimal.ZERO) >= 0) { + deductionAmount = remainderStock; + afterStockAmount = BigDecimal.ZERO; + require.setNetRequirement(subtract); + } else { + deductionAmount = require.getBomUseAmount(); + afterStockAmount = remainderStock.subtract(deductionAmount); + require.setNetRequirement(BigDecimal.ZERO); + } + bomStockDetailService.saveStorageAndDetail(storage, plan, bomLine, batchNum, deductionAmount, afterStockAmount); + } + } + /*鍑�闇�姹�*/ + BigDecimal netRequirement = require.getNetRequirement(); + /*宸ヨ壓璺嚎鎬婚渶姹�*/ + BigDecimal totalRouteTime = getRouteLineTotalTime(routeHeader, productivityModel_monopolize, netRequirement); + long millisecond = 60*60*1000L; + long totalRouteMillisecond = totalRouteTime.multiply(BigDecimal.valueOf(millisecond)).longValue(); + /*瀹屾垚鏃堕棿锛宭evel=0 鏃堕粯璁や负宸ュ崟鐨勮鍒掑畬鎴愭棩鏈�*/ + Date completeDate= plan.getPlanEndDay(); + /*棰勭暀澶╂暟*/ + Long reservedDay = getReservedDays(); + if(level>0){ + /* 褰撳墠闇�姹傚畬鎴愭棩鏈熶负涓婇樁灞傞渶姹傜殑寮�濮嬫椂闂� - 棰勭暀澶╂暟(杞崲涓烘绉�)*/ + long reservedMillisecond = reservedDay *24* millisecond; + completeDate.setTime(upLevelStartDate.getTime()-reservedMillisecond); + } + /*璁剧疆瀹屾垚鏃ユ湡*/ + require.setCompleteDate(completeDate); + require.setDemandDate(require.getCompleteDate()); + /*璁剧疆寮�濮嬫椂闂�*/ + Date startDay = new Date(); + startDay.setTime(completeDate.getTime() - totalRouteMillisecond); + require.setStartDate(startDay); + require.setMatchState("宸插尮閰�"); + require.setMatchMode("搴撳瓨鍖归厤"); + if(require.getNetRequirement().compareTo(BigDecimal.ZERO)>0){ + require.setMatchState("寰呭尮閰�"); + require.setMatchMode("宸ュ崟鍖归厤"); + } + require.setHasDelayRisk("鏃犻闄�"); + + allRequires.add(require); + /*褰撳墠Bom鑺傜偣澶勭悊瀹屾垚鍚庯紝澶勭悊涓嬬骇BOM*/ + List<ApsBom> bomLineList = bomLineService.selectApsBomLineList(plant, itemNumber); + if(!bomLineList.isEmpty()){ + bomLineList.forEach(line -> { + getBomRequires(plant, line, batchNum, require.getStartDate(), plan, allRequires, level+1); + }); + } + + } else { + throw new RuntimeException("鏈壘鍒版爣鍑嗗伐鑹鸿矾绾�"); + } + } + + private BigDecimal getRouteLineTotalTime(ApsStandardProcessRouteHeader routeHeader, String productivityModel_monopolize, BigDecimal netRequirement) { + ApsStandardProcessRouteLine routeLineParam = ApsStandardProcessRouteLine.builder() + .routeId(routeHeader.getRouteId()) + .build(); + List<ApsStandardProcessRouteLine> apsStandardProcessRouteLines = ApsStandardProcessRouteLineMapper.selectApsStandardProcessRouteLineList(routeLineParam); + /*宸ヨ壓璺嚎Line 鎬诲伐鏃�*/ + BigDecimal totalRouteTime = BigDecimal.ZERO; + apsStandardProcessRouteLines.forEach(line -> { + line.setRouteTime(line.getDesignCapacity()); + if (line.getProductivityModel().equals(productivityModel_monopolize)) { + line.setRouteTime(line.getDesignCapacity().multiply(netRequirement)); + } + totalRouteTime.add(line.getRouteTime()); + }); + return totalRouteTime; + } + + /** + * 鐢熸垚鏂版壒娆″彿 + * */ + private String getBatch() { + String batchNum = System.currentTimeMillis() + ""; + ApsPlateStandardRequireBatch batchBuilder = ApsPlateStandardRequireBatch.builder() + .id(IdUtil.getSnowflakeNextId()) + .batchNumber(batchNum) + .delFlag("0").build(); + batchBuilder.setCreateBy(SecurityUtils.getUsername()); + batchBuilder.setCreateTime(DateUtils.getNowDate()); + requireBatchMapper.insertApsPlateStandardRequireBatch(batchBuilder); + return batchNum; + } + /** + * 鑾峰彇鐗╂枡搴撳瓨淇℃伅 + * */ + private Optional<ApsMaterialStorageManagement> getItemStorage(String plant, String itemNumber) { + ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement(); + storageParam.setItemNumber(itemNumber); + storageParam.setApplicableFactories(plant); + Optional<ApsMaterialStorageManagement> firstStorage = itemStorageMapper.selectApsMaterialStorageManagementList(storageParam).stream() + .findFirst(); + + return firstStorage; + } + + /** + * 鑾峰彇閽i噾璁″垝 棰勭暀澶╂暟 + * */ + private Long getReservedDays(){ + Long days=0L; + List<SysDictData> dictDataList = DictUtils.getDictCache("aps_is_suspended"); + if (dictDataList != null) { + Long.getLong(dictDataList.get(0).getDictValue()); + } + return days; + } + + /** + * 浣跨敤瀛愪欢宸ュ崟鍖归厤闇�姹備腑鐨勫噣闇�姹� + * */ + private void matchRequireAndSubPlan(ApsPlateStandardRequire require) { + BigDecimal netRequirement = require.getNetRequirement(); + if (netRequirement.compareTo(BigDecimal.ZERO) > 0) { + ApsPlatePlan platePlan = apsPlatePlanMapper.selectUnMatchPlateSubPlan(require.getOrgCode()); + /*瀛愪欢宸ュ崟鐨勬湭鍖归厤鏁伴噺 浣滀负褰撳墠鐨勫簱瀛�*/ + BigDecimal stock = platePlan.getUnmatchedQuantity(); + if (netRequirement.compareTo(stock) < 0) { + /* 搴撳瓨鏁伴噺 澶т簬 鍑�闇�姹傛暟閲�*/ + /* 鍑�闇�姹傛暟閲�=0 锛屽瓙浠跺伐鍗曟湭鍖归厤鏁伴噺= 搴撳瓨-鍑�闇�姹�*/ + netRequirement = BigDecimal.ZERO; + require.setNetRequirement(netRequirement); + BigDecimal subtract = stock.subtract(netRequirement); + bomOrderDetailService.savePlastPlanAndBomOrderDetail(require, platePlan, subtract, stock, netRequirement); + /*鍑�闇�姹傚凡缁忚婊¤冻锛屼笉闇�瑕佺户缁尮閰�*/ + + } else if (netRequirement.compareTo(stock) == 0) { + /*鍑�闇�姹傛暟閲� == 搴撳瓨鏁伴噺*/ + netRequirement = BigDecimal.ZERO; + require.setNetRequirement(netRequirement); + BigDecimal subtract = BigDecimal.ZERO; + bomOrderDetailService.savePlastPlanAndBomOrderDetail(require, platePlan, subtract, stock, netRequirement); + /*鍑�闇�姹傚凡缁忚婊¤冻锛屼笉闇�瑕佺户缁尮閰�*/ + } + if (netRequirement.compareTo(stock) > 0) { + while (platePlan != null && netRequirement.compareTo(BigDecimal.ZERO) > 0) { + /*闇�姹傚ぇ浜庡簱瀛�*/ + /*鍑�闇�姹� 琚儴鍒嗘弧瓒� */ + BigDecimal rest = netRequirement.subtract(stock); + require.setNetRequirement(rest); + require.setMatchState("鍖归厤涓�"); + /*宸ュ崟 鏈尮閰嶆暟閲忎负0 鍏ㄩ儴鐢ㄤ簬鍖归厤闇�姹�*/ + bomOrderDetailService.savePlastPlanAndBomOrderDetail(require, platePlan, BigDecimal.ZERO, stock, netRequirement); + /*鍑�闇�姹傛湭琚弧瓒筹紝闇�瑕佺户缁尮閰�*/ + platePlan = apsPlatePlanMapper.selectUnMatchPlateSubPlan(require.getOrgCode()); + netRequirement = rest; + } + } + + } + } + + + } -- Gitblit v1.9.3