From a080d67b9964cd632f52c481c0f20ef2e3e7073a Mon Sep 17 00:00:00 2001 From: sfd <sun.sunshine@163.com> Date: 星期五, 09 五月 2025 10:19:07 +0800 Subject: [PATCH] 放开权限 --- aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 285 insertions(+), 1 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 120b272..4722333 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,23 @@ package com.aps.core.service.impl; +import java.math.BigDecimal; +import java.util.*; + +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.*; +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; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -20,6 +32,46 @@ { @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; + + @Resource + IApsStandardProcessRouteLineService routeLineService; + + @Resource + IApsPlateStandardRequireBatchService requireBatchService; /** * 鏌ヨ閽i噾宸ュ崟鏍囧噯闇�姹� @@ -104,4 +156,236 @@ public List<ApsPlateStandardRequire> selectPlateSupplyGapList(ApsPlateStandardRequire apsPlateStandardRequire) { return apsPlateStandardRequireMapper.selectPlateSupplyGapList(apsPlateStandardRequire); } + + @Transactional + @Override + public void generatorPlan(){ + + /*鍒濆鍖栨暟鎹�*/ + requireBatchService.initRequireBatch(); + /*瀹氫箟宸ュ巶涓哄崡閫� */ + String plantCode="FORTUNA"; + /*瀹氫箟涓诲崟绫诲瀷涓洪挘閲戜富鍗�*/ + String mainOrderType = "0"; + /*鐢熸垚鏂版壒娆″彿*/ + String batchNum= requireBatchService.getNewBatchNumber(); + /*鑾峰彇閽i噾涓诲崟淇℃伅*/ + List<ApsPlatePlan> mainPlans = platePlanMapper.selectPlatePlanByPlantMajor(plantCode,mainOrderType); + 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) { + + String itemNumber = bomLine.getItemCode(); + /*鏋勫缓闇�姹備俊鎭�*/ + ApsPlateStandardRequire require = new ApsPlateStandardRequire(); + require.setId(IdUtil.getSnowflakeNextId()); + require.setRequireTrackId(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 { + require.setBomUseAmount(bomLine.getNum().multiply(plan.getProductionQuantity())); + } + /*鏌ユ壘搴撳瓨锛岃绠楀噣闇�姹傦紝淇濆瓨鍓╀綑搴撳瓨锛屼繚瀛樺簱瀛樻墸鍑忔槑缁�*/ + BigDecimal remainderStock = BigDecimal.ZERO; + /*榛樿鍑�闇�姹備负BOM鐢ㄩ噺*/ + require.setNetRequirement(require.getBomUseAmount()); + 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,require.getId()); + } + } + + /*宸ヨ壓璺嚎鎬婚渶姹�*/ + 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("0"); + Date dateZero = getDateZero(DateUtils.getNowDate()); + if (startDay.before(dateZero)) { + require.setHasDelayRisk("1"); + } + + /*鐢熶骇鍩哄湴*/ + require.setProductionBase(plan.getProductionBase()); + + require.setMatchState("宸插尮閰�"); + require.setMatchMode("搴撳瓨鍖归厤"); + if (require.getNetRequirement().compareTo(BigDecimal.ZERO) > 0) { + require.setMatchState("寰呭尮閰�"); + require.setMatchMode("宸ュ崟鍖归厤"); + /*浣跨敤瀛愪欢宸ュ崟杩涜闇�姹傚尮閰�*/ + matchRequireAndSubPlan(require); + } + allRequires.add(require); + if (require.getNetRequirement().compareTo(BigDecimal.ZERO) > 0) { + /*褰撳墠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); + }); + } + } + } + /** + * 鑾峰彇鐗╂枡搴撳瓨淇℃伅 + * */ + private Optional<ApsMaterialStorageManagement> getItemStorage(String plant, String itemNumber) { + ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement(); + storageParam.setItemNumber(itemNumber); + storageParam.setApplicableFactories(plant); + return itemStorageMapper.selectApsMaterialStorageManagementList(storageParam).stream() + .findFirst(); + } + + /** + * 鑾峰彇閽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()); + /*瀛愪欢宸ュ崟鐨勬湭鍖归厤鏁伴噺 浣滀负褰撳墠鐨勫簱瀛�*/ + 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) { + /*闇�姹傚ぇ浜庡簱瀛�*/ + /*鍑�闇�姹� 琚儴鍒嗘弧瓒� */ + 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; + } + } + } + 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