From dadf503b15f3423980ad2bc17d23ea1a444aca10 Mon Sep 17 00:00:00 2001 From: huangjiayang <5265313@qq.com> Date: 星期三, 14 五月 2025 17:48:00 +0800 Subject: [PATCH] 【UPDATE】修改mapper适配mybatis-plus --- aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateStandardRequireServiceImpl.java | 372 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 371 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..2ab9146 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.*; + +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 lombok.extern.slf4j.Slf4j; 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; @@ -15,11 +28,54 @@ * @author zhl * @date 2025-05-06 */ +@Slf4j @Service public class ApsPlateStandardRequireServiceImpl implements IApsPlateStandardRequireService { @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; + @Resource + private IApsMaterialStorageManagementService storageManagementService; /** * 鏌ヨ閽i噾宸ュ崟鏍囧噯闇�姹� @@ -104,4 +160,318 @@ public List<ApsPlateStandardRequire> selectPlateSupplyGapList(ApsPlateStandardRequire apsPlateStandardRequire) { return apsPlateStandardRequireMapper.selectPlateSupplyGapList(apsPlateStandardRequire); } + + @Transactional + @Override + public void generatorPlan(){ + + /*鍒濆鍖栨暟鎹�*/ + requireBatchService.initRequireBatch(); + /*瀹氫箟宸ュ巶涓哄崡閫� */ + String plantCode="FORTUNA"; + /*瀹氫箟涓诲崟绫诲瀷涓洪挘閲戜富鍗�*/ + String mainOrderType = "main"; + /*鐢熸垚鏂版壒娆″彿*/ + String batchNum= requireBatchService.getNewBatchNumber(); + /*鑾峰彇閽i噾涓诲崟淇℃伅*/ + List<ApsPlatePlan> mainPlans = platePlanMapper.selectPlatePlanByPlantMajor(plantCode,mainOrderType); + Hashtable<String, BigDecimal> usedStorage = new Hashtable<>(); + log.info("寮�濮嬬敓鎴愰渶姹傦細"); + for (ApsPlatePlan mainPlan : mainPlans) { + String itemNumber = mainPlan.getItemNumber(); + /*鏍规嵁鏂欏彿 鑾峰彇BOM Header */ + /*褰撳墠Bom鑺傜偣澶勭悊瀹屾垚鍚庯紝澶勭悊涓嬬骇BOM*/ + + List<ApsPlateStandardRequire> requiresList=new ArrayList<>(); + List<ApsPlateStandardRequireBomStockDetail> stockDetailsList=new ArrayList<>(); + List<ApsPlateStandardRequireBomOrderDetail> orderDetailsList=new ArrayList<>(); + + log.info("寮�濮嬬敓鎴愰渶姹傦細宸ュ崟鍙凤細"+mainPlan.getDocumentNumber()); + getBomRequires(plantCode, "0","0",itemNumber,BigDecimal.ONE, batchNum, null + , mainPlan, requiresList, 0L,stockDetailsList,orderDetailsList,usedStorage + ); + + // 鎵归噺鎻掑叆浠ユ彁楂樻�ц兘 + 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); + } + } + log.info("鐢熸垚瀹屾垚"); +// if(!stockDetailsList.isEmpty()){ +// int batchSize = 1000; +// stockDetailsList.forEach(x->x.setId(IdUtil.getSnowflakeNextId())); +// for (int i = 0; i < stockDetailsList.size(); i += batchSize) { +// int end = Math.min(i + batchSize, stockDetailsList.size()); +// List<ApsPlateStandardRequireBomStockDetail> batch = stockDetailsList.subList(i, end); +// plateBomStockDetailMapper.batchInsert(batch); +// } +// } +// +// if(!orderDetailsList.isEmpty()){ +// int batchSize = 1000; +// orderDetailsList.forEach(x->x.setId(IdUtil.getSnowflakeNextId())); +// for (int i = 0; i < orderDetailsList.size(); i += batchSize) { +// int end = Math.min(i + batchSize, orderDetailsList.size()); +// List<ApsPlateStandardRequireBomOrderDetail> batch = orderDetailsList.subList(i, end); +// plateBomOrderDetailMapper.batchInsert(batch); +// } +// } + /*闆嗕腑淇濆瓨搴撳瓨淇℃伅*/ + /* if(!usedStorage.isEmpty()){ + usedStorage.forEach((key, sm) -> { + storageManagementService.updateRemainderStock(sm.getId(),sm.getRemainderStock(),sm.getVersion()); + }); + }*/ + + } + usedStorage.forEach((key,value)->{ + log.info("鏂欏彿锛�"+key+"锛屽簱瀛橈細"+value); + }); + + } + + /** + * 鏋勫缓闇�姹備俊鎭� + * + * @param plant 宸ュ巶浠g爜 + * @param bomHeaderCode BOM涓婄骇鐗╂枡缂栫爜 + * @param bomLineId BOM琛孖D + * @param itemCode 鐗╂枡浠g爜 + * @param itemNum 鐗╂枡鏁伴噺 + * @param batchNum 鎵规鍙� + * @param upLevelStartDate 涓婄骇宸ュ簭鐨勫紑濮嬫棩鏈� + * @param plan 璁″垝瀵硅薄 + * @param allRequires 鎵�鏈夐渶姹傜殑鍒楄〃 + * @param level 灞傜骇 + * @param stockDetailsList 搴撳瓨鍖归厤璁板綍 + * @param orderDetailsList 瀛愪欢宸ュ崟鍖归厤璁板綍 + */ + private void getBomRequires(String plant, String bomHeaderCode, String bomLineId,String itemCode,BigDecimal itemNum, + String batchNum, Date upLevelStartDate, ApsPlatePlan plan, + List<ApsPlateStandardRequire> allRequires, + Long level,List<ApsPlateStandardRequireBomStockDetail> stockDetailsList, + List<ApsPlateStandardRequireBomOrderDetail> orderDetailsList, + Hashtable<String, BigDecimal> usedStorage + ) { + /*鏋勫缓闇�姹備俊鎭�*/ + ApsPlateStandardRequire require = new ApsPlateStandardRequire(); + require.setId(IdUtil.getSnowflakeNextId()); + require.setRequireTrackId(plan.getId() + ""); + require.setBatchNumber(batchNum); + require.setDocNum(plan.getDocumentNumber()); + require.setOrgCode(plant); + require.setBomHeaderCode(bomHeaderCode); + require.setBomLineId(bomLineId); + require.setBomLineCode(itemCode); + require.setBomLineLevel(level); + require.setOrderCreateTime(plan.getOrderCreateTime()); + require.setCreateTime(DateUtils.getNowDate()); + require.setCreateBy(SecurityUtils.getUsername()); + require.setDelFlag("0"); + require.setProductionBase(plan.getProductionBase()); + /*BOM鐢ㄩ噺 level0=1 */ + if (level == 0) { + require.setBomUseAmount(BigDecimal.ONE); + } else { + require.setBomUseAmount(itemNum); + } + /*璁$畻闇�姹傛暟閲�*/ + require.setRequireAmount(itemNum.multiply(plan.getProductionQuantity())); + /*鏌ユ壘搴撳瓨锛岃绠楀噣闇�姹傦紝淇濆瓨鍓╀綑搴撳瓨锛屼繚瀛樺簱瀛樻墸鍑忔槑缁�*/ + /*榛樿鍑�闇�姹備负BOM鐢ㄩ噺*/ + require.setNetRequirement(require.getRequireAmount()); + + /*璇诲彇搴撳瓨淇℃伅鐨勪紭鍏堢骇-> 鍐呭瓨銆乺edis銆乨b*/ + /* ApsMaterialStorageManagement storage = usedStorage.get(itemCode); + if(storage==null){ + storage = storageManagementService.getRdsStorage(plant, itemCode); + if(storage!=null){ + *//*鍓╀綑搴撳瓨*//* + remainderStock = storage.getRemainderStock(); + } + }*/ + Optional<ApsMaterialStorageManagement> itemStorageOpt = storageManagementService.getItemStorage(plant, itemCode); + if (itemStorageOpt.isPresent()) { + ApsMaterialStorageManagement itemStorage=itemStorageOpt.get(); + BigDecimal remainderStock =itemStorage.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(itemStorage, plan, bomLineId, itemCode, batchNum, deductionAmount + , afterStockAmount, require.getId(), stockDetailsList + ); + /*鏇存柊鍐呭瓨涓殑搴撳瓨浣跨敤淇℃伅*/ + usedStorage.put(itemCode, afterStockAmount); + } + } + /*鏈尮閰嶆暟閲忥紝榛樿涓哄噣闇�姹�*/ + require.setUnmatchedDemandAmount(require.getNetRequirement()); + /*宸ヨ壓璺嚎鎬婚渶姹�*/ + ApsStandardProcessRouteLine routeHeader = routeLineService.getRouteHeaderRouteTime(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)); + + + /*棰勭暀澶╂暟*/ + Long reservedDay = getReservedDays(); + /*璁剧疆瀹屾垚鏃ユ湡*/ + if(level==0){ + /*瀹屾垚鏃堕棿锛宭evel=0 鏃堕粯璁や负宸ュ崟鐨勮鍒掑畬鎴愭棩鏈�*/ + require.setCompleteDate(plan.getPlanEndDay()); + require.setDemandDate(plan.getPlanEndDay()); + } else { + /* 褰撳墠闇�姹傚畬鎴愭棩鏈熶负涓婇樁灞傞渶姹傜殑寮�濮嬫椂闂� - 棰勭暀澶╂暟(杞崲涓烘绉�)*/ + long reservedMillisecond = reservedDay * 24 * millisecond; + Date completeDate = new Date(); + completeDate.setTime(upLevelStartDate.getTime() - reservedMillisecond); + require.setCompleteDate(completeDate); + require.setDemandDate(completeDate); + } + + + /*璁剧疆寮�濮嬫椂闂�*/ + Date startDay = new Date(); + /*寮�濮嬫椂闂� 榛樿涓� 瀹屾垚鏃堕棿 濡傛灉鍑�闇�姹�>0 寮�濮嬫椂闂�=缁撴潫鏃堕棿-宸ュ簭鎬诲伐鏃�*/ + startDay.setTime(require.getCompleteDate().getTime()); + if(require.getNetRequirement().compareTo(BigDecimal.ZERO)>0){ + startDay.setTime(require.getCompleteDate().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.setMatchMode("宸ュ崟鍖归厤"); + /*浣跨敤瀛愪欢宸ュ崟杩涜闇�姹傚尮閰�*/ + matchRequireAndSubPlan(require,orderDetailsList); + } + allRequires.add(require); + log.info("宸茬敓鎴愰渶姹傦細"+plan.getDocumentNumber()+"bomHeaderCode:"+bomHeaderCode+"bomLineCode:"+itemCode+"bomLevel:"+level); + if (require.getNetRequirement().compareTo(BigDecimal.ZERO) > 0) { + /*褰撳墠Bom鑺傜偣澶勭悊瀹屾垚鍚庯紝澶勭悊涓嬬骇BOM*/ + long nextLevel=level+1; + List<ApsBom> bomLineList = bomLineService.selectRdsBomLineList(plant, itemCode); + if (!bomLineList.isEmpty()) { + bomLineList.forEach(line -> { + getBomRequires(plant, itemCode, line.getBomLineId(),line.getItemCode() ,line.getNum() , batchNum + , require.getStartDate(), plan, allRequires, nextLevel,stockDetailsList + ,orderDetailsList,usedStorage + ); + }); + } + } + } + + + /** + * 鑾峰彇閽i噾璁″垝 棰勭暀澶╂暟 + * */ + private Long getReservedDays(){ + long days=0L; + List<SysDictData> dictDataList = DictUtils.getDictCache("plate_plan_param"); + if (dictDataList != null && !dictDataList.isEmpty()) { + days = Long.parseLong(dictDataList.get(0).getDictValue()); + } + return days; + } + + /** + * 浣跨敤瀛愪欢宸ュ崟鍖归厤闇�姹備腑鐨勫噣闇�姹� + * */ + + private void matchRequireAndSubPlan(ApsPlateStandardRequire require, List<ApsPlateStandardRequireBomOrderDetail> orderDetailsList) { + BigDecimal netRequirement = require.getNetRequirement(); + require.setMatchMode("宸ュ崟鍖归厤"); + require.setMatchState("宸插尮閰�"); + if (netRequirement.compareTo(BigDecimal.ZERO) > 0) { + ApsPlatePlan platePlan = apsPlatePlanMapper.selectUnMatchPlateSubPlan(require.getOrgCode(), require.getBomLineCode()); + /*瀛愪欢宸ュ崟鐨勬湭鍖归厤鏁伴噺 浣滀负褰撳墠鐨勫簱瀛�*/ + while (platePlan != null && netRequirement.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal stock = platePlan.getUnmatchedQuantity(); + if (netRequirement.compareTo(stock) < 0) { + /* 搴撳瓨鏁伴噺 澶т簬 鍑�闇�姹傛暟閲�*/ + /* 鍑�闇�姹傛暟閲�=0 锛屽瓙浠跺伐鍗曟湭鍖归厤鏁伴噺= 搴撳瓨-鍑�闇�姹�*/ + BigDecimal subtract = stock.subtract(netRequirement); + bomOrderDetailService.savePlastPlanAndBomOrderDetail(require, platePlan, subtract, stock, netRequirement,orderDetailsList); + netRequirement = BigDecimal.ZERO; + + require.setUnmatchedDemandAmount(BigDecimal.ZERO); + /*鍑�闇�姹傚凡缁忚婊¤冻锛屼笉闇�瑕佺户缁尮閰�*/ + + } else if (netRequirement.compareTo(stock) == 0) { + /*鍑�闇�姹傛暟閲� == 搴撳瓨鏁伴噺*/ + + BigDecimal subtract = BigDecimal.ZERO; + bomOrderDetailService.savePlastPlanAndBomOrderDetail(require, platePlan, subtract, stock, netRequirement,orderDetailsList); + netRequirement = BigDecimal.ZERO; + + require.setUnmatchedDemandAmount(BigDecimal.ZERO); + /*鍑�闇�姹傚凡缁忚婊¤冻锛屼笉闇�瑕佺户缁尮閰�*/ + } + if (netRequirement.compareTo(stock) > 0) { + /*闇�姹傚ぇ浜庡簱瀛�*/ + /*鍑�闇�姹� 琚儴鍒嗘弧瓒� */ + BigDecimal rest = netRequirement.subtract(stock); + + /*宸ュ崟 鏈尮閰嶆暟閲忎负0 鍏ㄩ儴鐢ㄤ簬鍖归厤闇�姹�*/ + bomOrderDetailService.savePlastPlanAndBomOrderDetail(require, platePlan, BigDecimal.ZERO, stock, netRequirement,orderDetailsList); + /*鍑�闇�姹傛湭琚弧瓒筹紝闇�瑕佺户缁尮閰�*/ + platePlan = apsPlatePlanMapper.selectUnMatchPlateSubPlan(require.getOrgCode(), require.getBomLineCode()); + /*鍓╀綑鍑�闇�姹�*/ + netRequirement = rest; + require.setUnmatchedDemandAmount(rest); + } + } + + } + } + + + /** + * 鑾峰彇鏃ユ湡闆剁偣 + * */ + 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