From d320f67a7edbe887baac890a639c16e78432f2a3 Mon Sep 17 00:00:00 2001 From: huangjiayang <5265313@qq.com> Date: 星期二, 29 四月 2025 13:40:46 +0800 Subject: [PATCH] 【UPDATE】修改实体日期属性 --- aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java | 387 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 336 insertions(+), 51 deletions(-) diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java index bfc7309..4defd34 100644 --- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java +++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsGasPipingRouteStatServiceImpl.java @@ -1,6 +1,6 @@ package com.aps.core.service.impl; -import com.alibaba.fastjson2.JSONArray; +import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson2.JSONObject; import com.aps.common.core.utils.DateUtils; import com.aps.common.core.utils.uuid.IdUtils; @@ -11,6 +11,7 @@ import com.aps.core.mapper.ApsGasPipingRouteStatMapper; import com.aps.core.service.IApsGasMaterialUsageService; import com.aps.core.service.IApsGasPipingRouteStatService; +import com.aps.core.service.IApsStandardProcessService; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.*; @@ -22,17 +23,16 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; -import java.sql.Timestamp; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.YearMonth; -import java.time.ZoneId; +import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; + +import static java.util.stream.Collectors.groupingBy; /** * 姘斾綋绠¤矾浜ц兘璐熻浇缁熻Service涓氬姟灞傚鐞� @@ -55,6 +55,9 @@ @Autowired private IApsGasMaterialUsageService apsGasMaterialUsageService; + + @Autowired + private IApsStandardProcessService apsStandardProcessService; /** * 鏌ヨ姘斾綋绠¤矾浜ц兘璐熻浇缁熻 @@ -143,9 +146,11 @@ apsGasPipingPlans.forEach(apsGasPipingPlan -> { List<ApsProcessRoute> apsProcessRoutes = apsGasPipingPlan.getApsProcessRoutes(); //鎸夌収宸ュ簭搴忓彿鍗囧簭鎺掑簭 - apsProcessRoutes.sort((a, b)->a.getProcessNumber().compareTo(b.getProcessNumber())); + apsProcessRoutes.sort((a, b)->b.getProcessNumber().compareTo(a.getProcessNumber())); //鏄惁鎵惧埌褰撳墠宸ュ簭 - boolean isFind = false; + boolean isCurrentProcess = false; + boolean lastProcessStartTimeIsBeforeNow = false; + ApsGasPipingRouteStat preApsProcessRoute = null; for (int i=0;i<apsProcessRoutes.size();i++){ ApsProcessRoute apsProcessRoute = apsProcessRoutes.get(i); ApsGasPipingRouteStat apsGasPipingRouteStat = new ApsGasPipingRouteStat(); @@ -154,40 +159,52 @@ //鏂欏彿 apsGasPipingRouteStat.setItemNumber(apsGasPipingPlan.getItemNumber()); //褰撳墠宸ュ簭鍙� - apsGasPipingRouteStat.setCurrentProcessNumber(apsGasPipingPlan.getProcessNumber()); + apsGasPipingRouteStat.setCurrentProcessNumber(new BigDecimal(apsGasPipingPlan.getProcessNumber())); //鐢熶骇鏁伴噺 apsGasPipingRouteStat.setProductionQuantity(apsGasPipingPlan.getProductionQuantity()); //宸ュ簭鍚嶇О apsGasPipingRouteStat.setProcessName(apsProcessRoute.getProcessName()); //宸ュ簭鍙� - apsGasPipingRouteStat.setRoadProcessNumber(apsProcessRoute.getProcessNumber()); + apsGasPipingRouteStat.setRoadProcessNumber( new BigDecimal(apsProcessRoute.getProcessNumber()) ); //鏍囧噯宸ユ椂 apsGasPipingRouteStat.setStandardTime(apsProcessRoute.getStandardTime()); //涓撲笟 apsGasPipingRouteStat.setMajor(apsGasPipingPlan.getPlanType()); //宸ュ簭鎬诲伐鏃� 绛変簬 鏍囧噯宸ユ椂*鐢熶骇鏁伴噺 apsGasPipingRouteStat.setProcessTotalTime(apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity())); - //璁″垝寮�宸ユ棩 - if(apsGasPipingRouteStat.getCurrentProcessNumber().equals(apsGasPipingRouteStat.getRoadProcessNumber())) { - /* 瀵� stat.getProcessPlanStartDay() 鍜屽綋鍓嶆棩鏈� 杩涜瀵规瘮锛屽彧瀵规瘮鍒版棩锛屼笉鐢ㄧ鍗佸垎绉�*/ - LocalDate startLocalDate = LocalDate.ofInstant(apsProcessRoute.getProcessPlanStartDay().toInstant(), ZoneId.systemDefault()); - LocalDate nowLocalDate = LocalDate.now(); - if (startLocalDate.isBefore(nowLocalDate)) { - apsGasPipingRouteStat.setProcessPlanStartDay(new Date()); - }else{ - apsGasPipingRouteStat.setProcessPlanStartDay(apsProcessRoute.getProcessPlanStartDay()); - } - isFind = true; - } - if(!isFind){ - continue; + //璁″垝寮�宸ユ棩 濡傛灉鏄綋鍓嶅簭 + if(apsGasPipingPlan.getProcessNumber().equals(apsProcessRoute.getProcessNumber())) { + isCurrentProcess = true; } // 涓婁竴閬撳伐搴忕殑缁撴潫鏃堕棿 = 涓婁竴閬撳伐搴忕殑寮�濮嬫椂闂� + 涓婁竴閬撳伐搴忕殑鎬诲伐鏃� - if(apsGasPipingRouteStat.getProcessPlanStartDay()==null){ - LocalDateTime previousProcessPlanStartDay = apsProcessRoutes.get(i - 1).getProcessPlanStartDay().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); - long seconds = apsGasPipingRouteStatList.get(i - 1).getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); - LocalDateTime currentProcessPlanStartDay = previousProcessPlanStartDay.plusSeconds(seconds); - apsGasPipingRouteStat.setProcessPlanStartDay(Date.from(Timestamp.valueOf(currentProcessPlanStartDay.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).toInstant())); + if(i==0){ + LocalDate endLocalDate = LocalDate.ofInstant(apsGasPipingPlan.getPlanEndDay().toInstant(), ZoneId.systemDefault()); + LocalDate nowLocalDate = LocalDate.now(); + LocalDateTime planEndDay; + if(endLocalDate.isBefore(nowLocalDate)){ + planEndDay = LocalDateTime.now(); + }else{ + planEndDay = apsGasPipingPlan.getPlanEndDay().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + } + apsGasPipingRouteStat.setProcessPlanEndDay(Date.from(planEndDay.atZone(ZoneId.systemDefault()).toInstant())); + long seconds = apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity()).multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); + LocalDateTime planStartDay = planEndDay.plusSeconds(-seconds); + apsGasPipingRouteStat.setProcessPlanStartDay(Date.from(planStartDay.atZone(ZoneId.systemDefault()).toInstant())); + if(planStartDay.isBefore(LocalDateTime.now())){ + lastProcessStartTimeIsBeforeNow = true; + } + }else{ + if(lastProcessStartTimeIsBeforeNow){ + Date now = new Date(); + apsGasPipingRouteStat.setProcessPlanStartDay(now); + apsGasPipingRouteStat.setProcessPlanEndDay(now); + }else{ + apsGasPipingRouteStat.setProcessPlanEndDay(preApsProcessRoute.getProcessPlanStartDay()); + LocalDateTime planEndDay = preApsProcessRoute.getProcessPlanStartDay().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + long seconds = apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity()).multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); + LocalDateTime planStartDay = planEndDay.plusSeconds(-seconds); + apsGasPipingRouteStat.setProcessPlanStartDay(Date.from(planStartDay.atZone(ZoneId.systemDefault()).toInstant())); + } } //鎻掑叆 骞� 鏈� 鏃� SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @@ -201,14 +218,18 @@ // apsGasMaterialUsage.setItemNumber(apsGasPipingPlan.getItemNumber()); // apsGasMaterialUsage.setProcessName(apsProcessRoute.getProcessName()); // List<ApsGasMaterialUsage> apsGasMaterialUsageList = apsGasMaterialUsageService.selectApsGasMaterialUsageList(apsGasMaterialUsage); - apsGasPipingRouteStat.setStandardDosage(apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity())); +// apsGasPipingRouteStat.setStandardDosage(apsProcessRoute.getStandardTime().multiply(apsGasPipingPlan.getProductionQuantity())); //宸ュ簭鎬荤敤閲� = 鏍囧噯鐢ㄩ噺*鐢熶骇鏁伴噺 - apsGasPipingRouteStat.setProcessTotalDosage(apsGasPipingRouteStat.getStandardDosage().multiply(apsGasPipingPlan.getProductionQuantity())); +// apsGasPipingRouteStat.setProcessTotalDosage(apsGasPipingRouteStat.getStandardDosage().multiply(apsGasPipingPlan.getProductionQuantity())); apsGasPipingRouteStat.setCreateTime(DateUtils.getNowDate()); apsGasPipingRouteStat.setCreateBy("auto"); apsGasPipingRouteStat.setBatchNumber(batchNum); apsGasPipingRouteStat.setId(IdUtils.fastSimpleUUID()); apsGasPipingRouteStatList.add(apsGasPipingRouteStat); + preApsProcessRoute = apsGasPipingRouteStat; + if(isCurrentProcess){ + break; + } } }); List<ApsGasPipingRouteStat> tempInsertList = new ArrayList<>(); @@ -232,21 +253,46 @@ @Override public JSONObject getCapacityPlanData(ApsGasPipingRouteStat apsGasPipingRouteStat) { JSONObject result = new JSONObject(); - HashSet<String> startPlanTimeSet = new HashSet<>(); - JSONArray processData = new JSONArray(); + YearMonth yearMonth = YearMonth.parse(apsGasPipingRouteStat.getSearchEndDate()); + int daysInMonth = yearMonth.lengthOfMonth(); + LinkedHashSet<String> startPlanTimeSet = new LinkedHashSet<>(); + //宸ュ簭鍒嗙粍缁熻 + LinkedHashMap<String, List<ApsResourceDateStat>> processMap = new LinkedHashMap<>(); + List<HashMap<String, List<ApsResourceDateStat>>> processList = new ArrayList<>(); try { + //鑾峰彇鏍囧噯宸ュ簭鍚嶇О + ApsStandardProcess apsStandardProcess = new ApsStandardProcess(); + apsStandardProcess.setMajor(apsGasPipingRouteStat.getMajor().equals("gas")?"姘旀煖":"绠¤矾"); + List<ApsStandardProcess> apsStandardProcessList = apsStandardProcessService.selectApsStandardProcessList(apsStandardProcess); + apsStandardProcessList.sort((a, b)->a.getProcessName().compareTo(b.getProcessName())); + for(ApsStandardProcess temp:apsStandardProcessList){ + processMap.put(temp.getProcessName(), new ArrayList<ApsResourceDateStat>()); + } //鑾峰彇宸ュ簭璁″垝浜ц兘鏁版嵁 HashMap<String, ApsGasPipelineCapacityPlan> apsGasPipingPlanMap = new HashMap<>(); - List<ApsGasPipelineCapacityPlan> apsGasPipelineCapacityPlanList = apsGasPipelineCapacityPlanMapper.selectApsGasPipelineCapacityPlanList(new ApsGasPipelineCapacityPlan()); + ApsGasPipelineCapacityPlan searchCapacityPlan = new ApsGasPipelineCapacityPlan(); + searchCapacityPlan.setMajor(apsGasPipingRouteStat.getMajor().equals("gas")?"姘旀煖":"绠¤矾"); + if("day".equals(apsGasPipingRouteStat.getSearchType())){ + searchCapacityPlan.setYear(yearMonth.getYear()+""); + searchCapacityPlan.setMonth(yearMonth.getMonthValue()+""); + for(int i=1;i<=daysInMonth;i++){ + startPlanTimeSet.add(yearMonth +"-"+ (i<10?"0"+i:i)); + } + }else if("month".equals(apsGasPipingRouteStat.getSearchType())){ + searchCapacityPlan.setYear(yearMonth.getYear()+""); + YearMonth start = YearMonth.of(Integer.parseInt(apsGasPipingRouteStat.getSearchStartDate().split("-")[0]), Integer.parseInt(apsGasPipingRouteStat.getSearchStartDate().split("-")[1])); + YearMonth end = YearMonth.of(Integer.parseInt(apsGasPipingRouteStat.getSearchEndDate().split("-")[0]), Integer.parseInt(apsGasPipingRouteStat.getSearchEndDate().split("-")[1])); + List<String> yearMonths = getYearMonthsInRange(start, end); + startPlanTimeSet.addAll(yearMonths); + } + List<ApsGasPipelineCapacityPlan> apsGasPipelineCapacityPlanList = apsGasPipelineCapacityPlanMapper.selectApsGasPipelineCapacityPlanList(searchCapacityPlan); apsGasPipelineCapacityPlanList.forEach(apsGasPipelineCapacityPlan -> { - apsGasPipingPlanMap.put(apsGasPipelineCapacityPlan.getProcessName(),apsGasPipelineCapacityPlan); + apsGasPipingPlanMap.put(apsGasPipelineCapacityPlan.getProcessName()+"-"+apsGasPipelineCapacityPlan.getYear()+"-"+(Integer.parseInt(apsGasPipelineCapacityPlan.getMonth())<10?"0"+apsGasPipelineCapacityPlan.getMonth():apsGasPipelineCapacityPlan.getMonth()),apsGasPipelineCapacityPlan); }); //璁$畻鏃ヤ骇鑳芥暟鎹� DateTimeFormatter formatter = null; List<ApsGasPipingRouteStat> apsGasPipingRouteStats; SimpleDateFormat simpleDateFormat = null; - YearMonth yearMonth = YearMonth.parse(apsGasPipingRouteStat.getSearchEndDate()); - int daysInMonth = yearMonth.lengthOfMonth(); apsGasPipingRouteStat.setSearchStartDate(apsGasPipingRouteStat.getSearchStartDate()+"-01 00:00:00"); apsGasPipingRouteStat.setSearchEndDate(apsGasPipingRouteStat.getSearchEndDate()+"-"+ daysInMonth +" 23:59:59"); if("day".equals(apsGasPipingRouteStat.getSearchType())){ @@ -259,9 +305,6 @@ apsGasPipingRouteStats = apsGasPipingRouteStatMapper.selectApsGasPipingRouteStatList(apsGasPipingRouteStat); //鏍规嵁寮�宸ユ棩杩涜鍗囧簭鎺掑簭 apsGasPipingRouteStats.sort((a, b)->a.getProcessPlanStartDay().compareTo(b.getProcessPlanStartDay())); - //宸ュ簭鍒嗙粍缁熻 - HashMap<String, List<ApsResourceDateStat>> processMap = new HashMap<>(); - List<HashMap<String, List<ApsResourceDateStat>>> processList = new ArrayList<>(); //宸ュ簭寮�宸ユ棩鏈� String planStartDate = ""; //缁熻鎵�鏈夊伐搴忓搴旂殑寮�宸ユ椂闂� @@ -274,7 +317,7 @@ apsResourceDateStat.setPlanDay(LocalDate.parse(planStartDate, formatter)); apsResourceDateStat.setResourceName(apsGasPipingRouteStatTemp.getProcessName()); //鏌ヨ姘旀煖绠¤矾浜ц兘瑙勫垝琛� - apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(apsGasPipingRouteStatTemp.getProcessName())!=null?apsGasPipingPlanMap.get(apsGasPipingRouteStatTemp.getProcessName()).getDayProduceAllNum():new BigDecimal(0)); + apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(apsGasPipingRouteStatTemp.getProcessName()+"-"+planStartDate.substring(0, 7))!=null?apsGasPipingPlanMap.get(apsGasPipingRouteStatTemp.getProcessName()+"-"+planStartDate.substring(0, 7)).getDayProduceAllNum():new BigDecimal(0)); //鏌ヨ鏂欏彿宸ュ簭浜ц兘琛� apsResourceDateStat.setRequireTimes(apsGasPipingRouteStatTemp.getProcessTotalTime()); if(apsResourceDateStat.getDesignTimes().compareTo(BigDecimal.ZERO)>0){ @@ -295,14 +338,18 @@ processMap.forEach((processName, apsResourceDateStatList) -> { LinkedHashMap<String, ApsResourceDateStat> dayMap = new LinkedHashMap<>(); apsResourceDateStatList.forEach(apsResourceDateStat -> { - startPlanTimeSet.add(apsResourceDateStat.getPlanDay().toString()); +// startPlanTimeSet.add(apsResourceDateStat.getPlanDay().toString()); if(dayMap.containsKey(apsResourceDateStat.getPlanDay().toString())){ ApsResourceDateStat apsResourceDateStatTemp = dayMap.get(apsResourceDateStat.getPlanDay().toString()); - apsResourceDateStatTemp.setDesignTimes(apsGasPipingPlanMap.get(processName)!=null?apsGasPipingPlanMap.get(processName).getMonthProduceAllNum():new BigDecimal(0)); + if("month".equals(apsGasPipingRouteStat.getSearchType())){ + apsResourceDateStatTemp.setDesignTimes(apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7))!=null?apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7)).getMonthProduceAllNum():new BigDecimal(0)); + }else{ + apsResourceDateStatTemp.setDesignTimes(apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7))!=null?apsGasPipingPlanMap.get(processName+"-"+apsResourceDateStat.getPlanDay().toString().substring(0,7)).getDayProduceAllNum():new BigDecimal(0)); + } apsResourceDateStatTemp.setRequireTimes(apsResourceDateStatTemp.getRequireTimes().add(apsResourceDateStat.getRequireTimes())); if(apsResourceDateStatTemp.getDesignTimes().compareTo(BigDecimal.ZERO) > 0){ - apsResourceDateStat.setCapacityLoad(apsResourceDateStat.getRequireTimes() - .divide(apsResourceDateStat.getDesignTimes(), 2, RoundingMode.HALF_UP) + apsResourceDateStatTemp.setCapacityLoad(apsResourceDateStatTemp.getRequireTimes() + .divide(apsResourceDateStatTemp.getDesignTimes(), 2, RoundingMode.HALF_UP) .multiply(new BigDecimal(100))); }else{ apsResourceDateStatTemp.setCapacityLoad(new BigDecimal(0)); @@ -318,19 +365,48 @@ dayMap.forEach((key, value) -> { tempList.add(value); }); -// processMap.put(processName, tempList); HashMap<String, List<ApsResourceDateStat>> temp = new HashMap<>(); temp.put(processName, tempList); processList.add(temp); }); -// for (String key : processMap.keySet()) { -// HashMap<String, List<ApsResourceDateStat>> temp = new HashMap<>(); -// temp.put(key, processMap.get(key)); -// processList.add(temp); -// } //鎺掑簭鏃堕棿鏍囬 List<String> sortedStartPlanTimeList = new ArrayList<>(startPlanTimeSet); Collections.sort(sortedStartPlanTimeList); + for (int i=0;i<processList.size();i++){ + HashMap<String, List<ApsResourceDateStat>> temp = processList.get(i); + for (Map.Entry<String, List<ApsResourceDateStat>> entry : temp.entrySet()){ + List<ApsResourceDateStat> apsResourceDateStatList = entry.getValue(); + String key = entry.getKey(); + List<ApsResourceDateStat> crtList = new ArrayList<>(); + for(String tempTime:sortedStartPlanTimeList) { + if("month".equals(apsGasPipingRouteStat.getSearchType())){ + tempTime += "-01"; + } + LocalDate crtDate = LocalDate.parse(tempTime, formatter); + Optional<ApsResourceDateStat> first = apsResourceDateStatList.stream().filter(x -> x.getPlanDay().equals(crtDate)).findFirst(); + if (first.isPresent()) { + ApsResourceDateStat apsResourceDateStat = first.get(); + crtList.add(apsResourceDateStat); + } else { + ApsResourceDateStat apsResourceDateStat = new ApsResourceDateStat(); + apsResourceDateStat.setPlanDay(LocalDate.parse(tempTime, formatter)); + if ("month".equals(apsGasPipingRouteStat.getSearchType())) { + apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)) != null ? apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)).getMonthProduceAllNum() : new BigDecimal(0)); + } else { + apsResourceDateStat.setDesignTimes(apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)) != null ? apsGasPipingPlanMap.get(entry.getKey()+"-"+tempTime.substring(0,7)).getDayProduceAllNum() : new BigDecimal(0)); + } + apsResourceDateStat.setRequireTimes(new BigDecimal(0)); + apsResourceDateStat.setCapacityLoad(new BigDecimal(0)); + apsResourceDateStat.setResourceName(entry.getKey()); + apsResourceDateStat.setResourceGroupName(entry.getKey()); + apsResourceDateStatList.add(apsResourceDateStat); + crtList.add(apsResourceDateStat); + } + temp.put(entry.getKey(), crtList); + processList.set(i, temp); + } + } + } result.put("planTable", processList); result.put("planTitle", sortedStartPlanTimeList); } catch (Exception e) { @@ -432,4 +508,213 @@ styles.put("title", style); return styles; } + + public static List<String> getYearMonthsInRange(YearMonth start, YearMonth end) { + List<String> yearMonths = new ArrayList<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + + while (!start.isAfter(end)) { + yearMonths.add(start.format(formatter)); + start = start.plusMonths(1); + } + + return yearMonths; + } + + @Override + public void saveGasPipingProcessStat(){ + try { + String batchNum = IdUtils.fastSimpleUUID(); + List<ApsGasPipingRouteStat> tempList = apsGasPipingRouteStatMapper.queryTempStat(); + Map<String, List<ApsGasPipingRouteStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsGasPipingRouteStat::getWorkOrderNo)); + Boolean hasBefore = false; + LocalDateTime now = LocalDateTime.now(); + for (Map.Entry<String, List<ApsGasPipingRouteStat>> entry : groupByOrderNo.entrySet()) { + List<ApsGasPipingRouteStat> statPerOrder = entry.getValue(); + /*num 涓烘牴鎹畬宸ユ椂闂存帓搴忓嚭鐨勫簭鍙凤紝鎸夋鎺掑簭锛屽彲淇濊瘉鏄寜瀹屽伐鏃堕棿鍊掑彊鎺掑垪*/ + statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum())); + ApsGasPipingRouteStat last=null; + for (int i = 0; i <statPerOrder.size(); i++) { + ApsGasPipingRouteStat stat = statPerOrder.get(i); + stat.setId(IdUtils.fastSimpleUUID()); + stat.setBatchNumber(batchNum); + stat.setCreateBy(SecurityUtils.getUsername()); + stat.setWarning(false); + if(i==0){ + Date orderPlanEndDay = stat.getOrderPlanEndDay(); + LocalDateTime transLocalDateTime = transLocalDateTime(orderPlanEndDay); + LocalTime endOfDay = LocalTime.of(23, 59, 59); + LocalDateTime orderPlanEndDayLocalDateTime = LocalDateTime.of( transLocalDateTime.toLocalDate(), endOfDay); + if(orderPlanEndDayLocalDateTime.isBefore(now)){ + hasBefore = true; + stat.setWarning(true); + stat.setProcessPlanEndDay(transDate(now)); + stat.setProcessPlanStartDay(transDate(now)); + }else { + /*璁″垝瀹屽伐鏃�=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿*/ + stat.setProcessPlanEndDay(transDate(orderPlanEndDayLocalDateTime)); + /*璁″垝寮�宸ユ棩=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿 - 宸ュ簭鎬诲伐鏃�*/ + long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); + LocalDateTime lastPlanStartDt = orderPlanEndDayLocalDateTime.minusSeconds(seconds); + if(lastPlanStartDt.isBefore(now)){ + hasBefore = true; + stat.setProcessPlanStartDay(transDate(now)); + }else { + stat.setProcessPlanStartDay(transDate(lastPlanStartDt)); + } + } + } + /*褰撳伐鑹哄伐搴忓彿 >= 宸ュ崟褰撳墠宸ュ簭 浠h〃鏄湭鏉ュ伐搴忥紝鎵嶈繘琛岃鍒掑紑宸ユ棩 鍜岃鍒掑畬宸ユ棩鐨勮绠� + * 褰撳伐鑹哄伐搴忓彿 < 宸ュ崟褰撳墠宸ュ簭 杩囧幓宸ュ簭锛屼笉杩涜璁$畻 + * */ + if( stat.getRouteProcessNumber().compareTo(stat.getCurrentProcessNumber())>=0){ + /*鍊掓帓鏃� 涓嬩竴閬撳伐搴忓瓨鍦� 姣斿綋鍓嶆椂闂村皬鐨勮鍒掓椂闂达紝鍒欏綋鍓嶈鍒掑紑濮嬪拰缁撴潫鏃堕棿閮芥槸褰撳墠鏃堕棿*/ + if(hasBefore){ + stat.setWarning(true); + stat.setProcessPlanEndDay(transDate(now)); + stat.setProcessPlanStartDay(transDate(now)); + }else{ + /*涓嬩竴閬撳伐搴忚鍒掓椂闂撮兘姝e父鏃讹紝*/ + if (last != null) { + /*褰撳墠宸ュ簭缁撴潫鏃堕棿=涓嬩竴閬撳伐搴忕殑寮�濮嬫椂闂�*/ + stat.setProcessPlanEndDay(last.getProcessPlanStartDay()); + /*寮�濮嬫椂闂�=缁撴潫鏃堕棿-鎬诲伐鏃�*/ + long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); + LocalDateTime crtStartDt = transLocalDateTime(last.getProcessPlanStartDay()).minusSeconds(seconds); + /*濡傛灉寮�濮嬫椂闂村皬浜庡綋鍓嶆椂闂�*/ + if(crtStartDt.isBefore(now)){ + hasBefore=true; + stat.setWarning(true); + stat.setProcessPlanStartDay(transDate(now)); + }else { + stat.setProcessPlanStartDay(transDate(crtStartDt)); + } + } + } + } + last = stat; + apsGasPipingRouteStatMapper.insertApsGasPipingRouteStat(stat); + } + hasBefore=false; + + } + apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatByBatchNum(batchNum); + } catch (Exception e) { + e.printStackTrace(); + } + }; + + private Date transDate(LocalDateTime localDateTime){ + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + private LocalDateTime transLocalDateTime(Date date){ + return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); + } + + /** + * 淇濆瓨閽i噾缁熻鏁版嵁 + */ + @Transactional + @Override + public void saveGasPipingRoutStateList() { + String batchNum = IdUtils.fastSimpleUUID(); + List<ApsGasPipingRouteStat> tempList = apsGasPipingRouteStatMapper.queryTempStat(); + Map<String, List<ApsGasPipingRouteStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsGasPipingRouteStat::getWorkOrderNo)); + + LocalDateTime now = LocalDateTime.now(); + /*寰呬繚瀛樼殑鏁版嵁*/ + List<ApsGasPipingRouteStat> cptStateList = new ArrayList<>(); + for (Map.Entry<String, List<ApsGasPipingRouteStat>> entry : groupByOrderNo.entrySet()) { + List<ApsGasPipingRouteStat> statPerOrder = entry.getValue(); + /*num 涓烘牴鎹畬宸ユ椂闂存帓搴忓嚭鐨勫簭鍙凤紝鎸夋鎺掑簭锛屽彲淇濊瘉鏄寜瀹屽伐鏃堕棿鍊掑彊鎺掑垪*/ + statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum())); + ApsGasPipingRouteStat last=null; + /*褰撳墠宸ュ簭鏄惁瀛樺湪 璁″垝寮�宸ユ椂闂� 灏忎簬 褰撳墠鐨勬椂闂达紝濡傛灉瀛樺湪鍚庣画璁剧疆涓哄綋鍓嶆椂闂�*/ + boolean hasBefore = false; + for (int i = 0; i <statPerOrder.size(); i++) { + ApsGasPipingRouteStat stat = statPerOrder.get(i); + stat.setId(String.valueOf(IdUtil.getSnowflakeNextId())); + stat.setBatchNumber(batchNum); + stat.setCreateTime(DateUtils.getNowDate()); + stat.setCreateBy(SecurityUtils.getUsername()); + stat.setWarning(false); + stat.setDelFlag("0"); + if(i==0){ + Date orderPlanEndDay = stat.getOrderPlanEndDay(); + LocalDateTime transLocalDateTime = transLocalDateTime(orderPlanEndDay); + LocalTime endOfDay = LocalTime.of(23, 59, 59); + LocalDateTime orderPlanEndDayLocalDateTime = LocalDateTime.of( transLocalDateTime.toLocalDate(), endOfDay); + if(orderPlanEndDayLocalDateTime.isBefore(now)){ + hasBefore = true; + stat.setWarning(true); + stat.setProcessPlanEndDay(transDate(now)); + stat.setProcessPlanStartDay(transDate(now)); + }else { + /*璁″垝瀹屽伐鏃�=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿*/ + stat.setProcessPlanEndDay(transDate(orderPlanEndDayLocalDateTime)); + /*璁″垝寮�宸ユ棩=閽i噾璁″垝宸ュ崟瀹屾垚鏃堕棿 - 宸ュ簭鎬诲伐鏃�*/ + long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); + LocalDateTime lastPlanStartDt = orderPlanEndDayLocalDateTime.minusSeconds(seconds); + if(lastPlanStartDt.isBefore(now)){ + hasBefore = true; + stat.setProcessPlanStartDay(transDate(now)); + }else { + stat.setProcessPlanStartDay(transDate(lastPlanStartDt)); + } + } + } + /*褰撳伐鑹哄伐搴忓彿 >= 宸ュ崟褰撳墠宸ュ簭 浠h〃鏄湭鏉ュ伐搴忥紝鎵嶈繘琛岃鍒掑紑宸ユ棩 鍜岃鍒掑畬宸ユ棩鐨勮绠� + * 褰撳伐鑹哄伐搴忓彿 < 宸ュ崟褰撳墠宸ュ簭 杩囧幓宸ュ簭锛屼笉杩涜璁$畻 + * */ + if( stat.getRoadProcessNumber().compareTo(stat.getCurrentProcessNumber())>=0){ + /*鍊掓帓鏃� 涓嬩竴閬撳伐搴忓瓨鍦� 姣斿綋鍓嶆椂闂村皬鐨勮鍒掓椂闂达紝鍒欏綋鍓嶈鍒掑紑濮嬪拰缁撴潫鏃堕棿閮芥槸褰撳墠鏃堕棿*/ + if(hasBefore){ + stat.setWarning(true); + stat.setProcessPlanEndDay(transDate(now)); + stat.setProcessPlanStartDay(transDate(now)); + }else{ + /*涓嬩竴閬撳伐搴忚鍒掓椂闂撮兘姝e父鏃讹紝*/ + if (last != null) { + /*褰撳墠宸ュ簭缁撴潫鏃堕棿=涓嬩竴閬撳伐搴忕殑寮�濮嬫椂闂�*/ + stat.setProcessPlanEndDay(last.getProcessPlanStartDay()); + /*寮�濮嬫椂闂�=缁撴潫鏃堕棿-鎬诲伐鏃�*/ + long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); + LocalDateTime crtStartDt = transLocalDateTime(last.getProcessPlanStartDay()).minusSeconds(seconds); + /*濡傛灉寮�濮嬫椂闂村皬浜庡綋鍓嶆椂闂�*/ + if(crtStartDt.isBefore(now)){ + hasBefore=true; + stat.setWarning(true); + stat.setProcessPlanStartDay(transDate(now)); + }else { + stat.setProcessPlanStartDay(transDate(crtStartDt)); + } + } + } + } + if(stat.getProcessPlanStartDay()!=null){ + Date processPlanStartDay = stat.getProcessPlanStartDay(); + stat.setPlanStartYear(processPlanStartDay.getYear()+""); + stat.setPlanStartMonth(processPlanStartDay.getMonth()+""); + stat.setPlanStartDay(processPlanStartDay.getDay()+""); + } + last = stat; + cptStateList.add(stat); + } + } + // 鎵归噺鎻掑叆浠ユ彁楂樻�ц兘 + if (!cptStateList.isEmpty()) { + int batchSize = 500; + int size = cptStateList.size(); + for (int i = 0; i < size; i += batchSize) { + int end = Math.min(i + batchSize, size); + List<ApsGasPipingRouteStat> batch = cptStateList.subList(i, end); + apsGasPipingRouteStatMapper.insertApsGasPipingRouteStatBatch(batch); + log.info("鎵归噺鎻掑叆鏁版嵁锛屽紑濮嬩綅缃細{}锛岀粨鏉熶綅缃細{}", i, end); + } + } + apsGasPipingRouteStatMapper.deleteApsGasPipingRouteStatByBatchNum(batchNum); + log.info("鎵归噺鎻掑叆鏁版嵁瀹屾垚,batchNum:"+batchNum); + } + } -- Gitblit v1.9.3