From 13c1adb5494af143cf7b3d7ee60c6f4025a90040 Mon Sep 17 00:00:00 2001 From: zhanghl <253316343@qq.com> Date: 星期四, 08 五月 2025 13:45:57 +0800 Subject: [PATCH] 钣金计划:完善工序总工时 计算方法 --- aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java | 287 ++++++++++++++++++++++++++++++++------------------------- 1 files changed, 162 insertions(+), 125 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 78193ca..7029b83 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,25 +1,20 @@ 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 java.util.*; +import cn.hutool.core.date.DateUtil; 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.core.service.*; import com.aps.system.api.domain.SysDictData; import jakarta.annotation.Resource; import com.aps.core.domain.ApsPlateStandardRequire; import com.aps.core.mapper.ApsPlateStandardRequireMapper; -import com.aps.core.service.IApsPlateStandardRequireService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.aps.core.service.IApsPlateStandardRequireService; @@ -72,6 +67,8 @@ @Resource IApsPlateStandardRequireBomOrderDetailService bomOrderDetailService; + @Resource + IApsStandardProcessRouteLineService routeLineService; /** * 鏌ヨ閽i噾宸ュ崟鏍囧噯闇�姹� @@ -169,111 +166,139 @@ 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 */ + /*褰撳墠Bom鑺傜偣澶勭悊瀹屾垚鍚庯紝澶勭悊涓嬬骇BOM*/ + List<ApsBom> bomLineList = bomLineService.selectApsBomLineList(plantCode, itemNumber); + List<ApsPlateStandardRequire> requiresList=new ArrayList<>(); + if(!bomLineList.isEmpty()){ + bomLineList.forEach(line -> { + getBomRequires(plantCode, line, batchNum, null, mainPlan, requiresList, 0L); + }); + } + // 鎵归噺鎻掑叆浠ユ彁楂樻�ц兘 + if (!requiresList.isEmpty()) { + int batchSize = 1000; + for (int i = 0; i < requiresList.size(); i += batchSize) { + int end = Math.min(i + batchSize, requiresList.size()); + List<ApsPlateStandardRequire> batch = requiresList.subList(i, end); + apsPlateStandardRequireMapper.batchInsert(batch); + } + } } + } - private void getBomRequires(String plant, ApsBom bomLine, String batchNum, Date upLevelStartDate, ApsPlatePlan plan, List<ApsPlateStandardRequire> allRequires, Long level){ + + 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); - }); - } - + String productivityModel_combined_batch = "鍚堟壒"; + String productivityModel_monopolize = "鐙崰"; + /*鏋勫缓闇�姹備俊鎭�*/ + ApsPlateStandardRequire require = new ApsPlateStandardRequire(); + require.setId(IdUtil.getSnowflakeNextId()); + require.setRequireId(plan.getId()); + require.setBatchNumber(batchNum); + require.setDocNum(plan.getDocumentNumber()); + 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 { - throw new RuntimeException("鏈壘鍒版爣鍑嗗伐鑹鸿矾绾�"); + 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); + } + } + + /*宸ヨ壓璺嚎鎬婚渶姹�*/ + ApsStandardProcessRouteLine routeHeader = routeLineService.getRouteLineTotalTime(require); + String routeId = routeHeader.getRouteId(); + BigDecimal totalRouteTime = routeHeader.getRouteTime(); + long millisecond = 60 * 60 * 1000L; + long totalRouteMillisecond = totalRouteTime.multiply(BigDecimal.valueOf(millisecond)).longValue(); + require.setProcessRouteId(routeId); + require.setProcessRouteHours(String.valueOf(totalRouteTime)); + + /*瀹屾垚鏃堕棿锛宭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(completeDate); + /*璁剧疆寮�濮嬫椂闂�*/ + Date startDay = new Date(); + startDay.setTime(completeDate.getTime() - totalRouteMillisecond); + require.setStartDate(startDay); + + /*璁$畻鏄惁鏈夐闄�*/ + require.setHasDelayRisk("鏃犻闄�"); + Date dateZero = getDateZero(DateUtils.getNowDate()); + if (startDay.before(dateZero)) { + require.setHasDelayRisk("鏈夐闄�"); + } + + /*鐢熶骇鍩哄湴*/ + require.setProductionBase(plan.getProductionBase()); + + require.setMatchState("宸插尮閰�"); + require.setMatchMode("搴撳瓨鍖归厤"); + if (require.getNetRequirement().compareTo(BigDecimal.ZERO) > 0) { + require.setMatchState("寰呭尮閰�"); + require.setMatchMode("宸ュ崟鍖归厤"); + } + require.setHasDelayRisk("鏃犻闄�"); + /*浣跨敤瀛愪欢宸ュ崟杩涜闇�姹傚尮閰�*/ + matchRequireAndSubPlan(require); + + 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); + }); } } @@ -315,10 +340,8 @@ ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement(); storageParam.setItemNumber(itemNumber); storageParam.setApplicableFactories(plant); - Optional<ApsMaterialStorageManagement> firstStorage = itemStorageMapper.selectApsMaterialStorageManagementList(storageParam).stream() + return itemStorageMapper.selectApsMaterialStorageManagementList(storageParam).stream() .findFirst(); - - return firstStorage; } /** @@ -336,31 +359,32 @@ /** * 浣跨敤瀛愪欢宸ュ崟鍖归厤闇�姹備腑鐨勫噣闇�姹� * */ + 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); - /*鍑�闇�姹傚凡缁忚婊¤冻锛屼笉闇�瑕佺户缁尮閰�*/ + while (platePlan != null && netRequirement.compareTo(BigDecimal.ZERO) > 0) { + 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) { + } 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) { /*闇�姹傚ぇ浜庡簱瀛�*/ /*鍑�闇�姹� 琚儴鍒嗘弧瓒� */ BigDecimal rest = netRequirement.subtract(stock); @@ -373,10 +397,23 @@ netRequirement = rest; } } - } + require.setUnmatchedDemandAmount(require.getNetRequirement()); + } + /** + * 鑾峰彇鏃ユ湡闆剁偣 + * */ + private Date getDateZero(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } } -- Gitblit v1.9.3