From 2a64b537e8e3bce9ce030585a3da17d48379c0ad Mon Sep 17 00:00:00 2001
From: sfd <sun.sunshine@163.com>
Date: 星期一, 26 五月 2025 15:04:45 +0800
Subject: [PATCH] 修改json类型转换错误

---
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java |  220 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 209 insertions(+), 11 deletions(-)

diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java
index c9c4baa..c7bf07f 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java
@@ -1,17 +1,40 @@
 package com.aps.core.service.impl;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.stream.Collectors;
 
+import com.aps.common.core.utils.poi.ExcelUtil;
 import com.aps.common.core.utils.uuid.IdUtils;
-import com.aps.common.core.utils.uuid.UUID;
+import com.aps.common.core.web.domain.AjaxResult;
+import com.aps.core.domain.ApsPartPlan;
+import com.aps.core.domain.ApsResourceDateStat;
+import com.aps.core.domain.ApsResourceGroup;
+import com.aps.core.mapper.ApsAbnormalProcessAnalysisMapper;
+import com.aps.core.mapper.ApsResourceGroupMapper;
+import com.aps.core.service.IApsAbnormalProcessAnalysisService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.Removal;
+import org.apache.poi.xssf.streaming.SXSSFCell;
+import org.apache.poi.xssf.streaming.SXSSFRow;
+import org.apache.poi.xssf.streaming.SXSSFSheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.commons.config.DefaultsBindHandlerAdvisor;
 import org.springframework.stereotype.Service;
 import com.aps.core.mapper.ApsPartRouteStatMapper;
 import com.aps.core.domain.ApsPartRouteStat;
 import com.aps.core.service.IApsPartRouteStatService;
+import org.springframework.transaction.annotation.Transactional;
 
 import static java.util.stream.Collectors.groupingBy;
 
@@ -21,12 +44,20 @@
  * @author zhl
  * @date 2025-04-11
  */
+@Slf4j
 @Service
 public class ApsPartRouteStatServiceImpl implements IApsPartRouteStatService 
 {
+
     @Autowired
     private ApsPartRouteStatMapper apsPartRouteStatMapper;
-    private DefaultsBindHandlerAdvisor.MappingsProvider mappingsProvider;
+    @Autowired
+    private ApsResourceGroupMapper resourceGroupMapper;
+    @Autowired
+    private ApsResourceGroupMapper apsResourceGroupMapper;
+
+    @Resource
+    private IApsAbnormalProcessAnalysisService analysisService;
 
     /**
      * 鏌ヨ闆朵欢缁熻琛�
@@ -103,13 +134,17 @@
 
 
 
+    /**
+     * 鏌ヨ闆朵欢宸ュ簭骞舵洿鏂拌鍒掑紑宸ユ棩鏈�
+     * */
+    @Transactional
+    @Override
     public void updatePartRoutPlanDate() {
         List<ApsPartRouteStat> tempList = apsPartRouteStatMapper.selectPartRoutStat();
         /*瀵箃empList 鎸夌収 workOrderNo 杩涜鍒嗙粍*/
         Map<String, List<ApsPartRouteStat>> groupByWorkOrderNo = tempList.stream().collect(groupingBy(ApsPartRouteStat::getWorkOrderNo));
         /*鏈璁$畻鎵规鍙�*/
         String batchNum = IdUtils.fastSimpleUUID();
-        apsPartRouteStatMapper.deleteLastBatch(batchNum);
         for (Map.Entry<String, List<ApsPartRouteStat>> entry : groupByWorkOrderNo.entrySet()) {
             /*鍙栧嚭姣忎釜闆朵欢宸ュ崟鐨勫伐鑹鸿矾绾夸俊鎭�*/
             List<ApsPartRouteStat> apsPartRouteStatList = entry.getValue();
@@ -118,28 +153,191 @@
             /*涓存椂淇濆瓨 涓婁竴閬撳伐搴忕殑宸ュ簭鎬诲伐鏃�*/
             ApsPartRouteStat last=null;
             for (int i = 0; i <apsPartRouteStatList.size(); i++) {
-                ApsPartRouteStat stat = apsPartRouteStatList.get(0);
+                ApsPartRouteStat stat = apsPartRouteStatList.get(i);
                 /*鍒ゆ柇褰撳墠宸ュ簭 褰撳墠宸ュ簭鍙湁涓�鏉�*/
                 if (stat.getCurrentProcessNumber().equals(stat.getRoadProcessNumber())) {
                     /* 瀵� stat.getProcessPlanStartDay() 鍜屽綋鍓嶆棩鏈� 杩涜瀵规瘮锛屽彧瀵规瘮鍒版棩锛屼笉鐢ㄧ鍗佸垎绉�*/
-                    if (stat.getProcessPlanStartDay().toLocalDate().isBefore(LocalDateTime.now().toLocalDate())) {
-                        stat.setProcessPlanStartDay(LocalDateTime.now());
+                    LocalDate startLocalDate = LocalDate.ofInstant(stat.getProcessPlanStartDay().toInstant(), ZoneId.systemDefault());
+                    LocalDate nowLocalDate = LocalDate.now();
+                    if (startLocalDate.isBefore(nowLocalDate)) {
+                        stat.setProcessPlanStartDay(new Date());
                     }
                 }
                 /*鏈紑宸ュ伐搴忕殑璁″垝寮�宸ユ棩=涓婁竴閬撳伐搴忕殑璁″垝寮�宸ユ棩+涓婁竴閬撳伐搴忕殑宸ュ簭鎬诲伐鏃躲��*/
-                if (stat.getCurrentProcessNumber().compareTo(stat.getRoadProcessNumber()) > 0) {
+                if (stat.getCurrentProcessNumber().compareTo(stat.getRoadProcessNumber()) < 0) {
                     if (last != null) {
-                        stat.setProcessPlanStartDay(last.getProcessPlanStartDay().plusHours(last.getProcessTotalTime()));
+                        LocalDateTime lastStartDate = LocalDateTime.ofInstant(last.getProcessPlanStartDay().toInstant(), ZoneId.systemDefault());
+                        long seconds = last.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
+                        LocalDateTime currentStartDate = lastStartDate.plusSeconds(seconds);
+                        stat.setProcessPlanStartDay(Date.from(currentStartDate.atZone(ZoneId.systemDefault()).toInstant()));
                     }
                 }
                 /*淇濆瓨涓婁竴姝ヨ绠楃殑 寮�宸ユ棩*/
                 last = stat;
                 stat.setId(IdUtils.fastUUID().toString());
                 stat.setBatchNumber(batchNum);
+                stat.setDelFlag("0");
                 apsPartRouteStatMapper.insertApsPartRouteStat(stat);
             }
         }
         apsPartRouteStatMapper.deleteLastBatch(batchNum);
+        /*璁$畻骞朵繚瀛� 宸ュ簭寮傚父淇℃伅*/
+        analysisService.batchSaveAbnormalInfo();
+    }
+    /** 鏌ヨ璧勬簮鏃ュ巻琛�
+     */
+    @Override
+    public AjaxResult selectResourceDateStat() {
+        /*鏌ュ嚭鎵�鏈夌粺璁$殑鏁版嵁*/
+        AjaxResult result = new AjaxResult(200, "鐢熸垚鎴愬姛");
+        List<ApsResourceDateStat> list = apsPartRouteStatMapper.selectResourceDateStat();
+        List<ApsResourceGroup> resourceGroupList = apsResourceGroupMapper.selectApsResourceGroupList(new ApsResourceGroup());
+        if (!list.isEmpty()) {
+            /*姹傚嚭璁″垝鐨勬渶澶ф椂闂达紝娌℃湁 璁剧疆涓哄綋鍓嶆椂闂�+15澶�*/
+            ApsResourceDateStat apsResourceDateStat = list.stream().max(Comparator.comparing(ApsResourceDateStat::getPlanDay)).orElse(null);
+            LocalDate maxPlanDay = LocalDate.now().plus(15, ChronoUnit.DAYS);
+            if (apsResourceDateStat != null) {
+                maxPlanDay = apsResourceDateStat.getPlanDay();
+            }
+            /*缁勭粐鍑烘棩鏈熻〃澶�*/
+            List<String> planDays = new ArrayList<>();
+            LocalDate startDay = LocalDate.now();
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            while (!startDay.isAfter(maxPlanDay)) {
+                planDays.add(startDay.format(formatter));
+                startDay = startDay.plus(1, ChronoUnit.DAYS);
+            }
+            /*缁勭粐鍑哄垪澶存暟鎹�*/
+
+            /*鍑嗗璧勬簮缁勪俊鎭�*/
+            List<Map<String, List<ApsResourceDateStat>>> targetList = new ArrayList<>();
+            resourceGroupList.forEach(resourceGroup -> {
+                String resourceName=resourceGroup.getResourceGroupName();
+                        /*鏍规嵁鏃ユ湡琛ㄥご鐨勯『搴忥紝缁勭粐鍑烘瘡涓棩鏈熶笅鐨勭粺璁¢」鐩�*/
+                Map<String, List<ApsResourceDateStat>> maps = new HashMap<>(Map.of());
+                List<ApsResourceDateStat> currentDaysResouces=new ArrayList<>();
+                for (String planDay : planDays) {
+                    /*鏌ユ壘褰撳墠璁″垝鏃ユ湡涓嬬殑鎵�鏈夎祫婧愮粍鐨勬暟鎹�*/
+                    Optional<ApsResourceDateStat> first = list.stream()
+                            .filter(item ->
+                                    item.getPlanDay().equals(LocalDate.parse(planDay, formatter))
+                                 && item.getResourceGroupName().equals(resourceName)
+                            ).collect(Collectors.toList()).stream().findFirst();
+                    if(first.isPresent()){
+                        currentDaysResouces.add(first.get());
+                    }
+                    else {
+                        ApsResourceDateStat empty = new ApsResourceDateStat();
+                        empty.setPlanDay(LocalDate.parse(planDay, formatter));
+                      //  empty.setDesignTimes(resourceGroup.getDevicesQuantity().intValue()*resourceGroup.getTheoryHours().intValue());
+                        empty.setDesignTimes(resourceGroup.getTheoryHours().multiply(BigDecimal.valueOf( resourceGroup.getDevicesQuantity())));
+                        empty.setRequireTimes(BigDecimal.ZERO);
+                        empty.setResourceName(resourceName);
+                        empty.setResourceGroupName(resourceName);
+                        empty.setCapacityLoad(BigDecimal.ZERO);
+                        currentDaysResouces.add(empty);
+                    }
+                };
+                maps.put(resourceName, currentDaysResouces);
+                targetList.add(maps);
+            });
+            result.put("planTitle", planDays);
+            result.put("planTable", targetList);
+        }
+        return result;
+    }
+
+    @Override
+    public void exportExcel(HttpServletResponse response) {
+        SXSSFWorkbook wb = new SXSSFWorkbook(500);
+        wb.createSheet();
+        wb.setSheetName(0, "闆朵欢缁熻琛�");
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+
+        Map<String, CellStyle> styles = createStyles(wb);
+        CellStyle title = styles.get("title");
+        try
+        {
+
+            AjaxResult stat = selectResourceDateStat();
+            List<String> days = (List<String>) stat.get("planTitle");
+            List<Map<String, List<ApsResourceDateStat>>> table= (List<Map<String, List<ApsResourceDateStat>>>) stat.get("planTable");
+            SXSSFSheet sheet = wb.getSheetAt(0);
+            /*濉啓鏃ユ湡鍒� 鍜� 宸ユ椂鍒�*/
+            SXSSFRow rowDay = sheet.createRow(0);
+            SXSSFRow rowTitle = sheet.createRow(1);
+
+            SXSSFCell daytitle = rowDay.createCell(0);
+            daytitle.setCellValue("鏃ユ湡");
+            daytitle.setCellStyle(title);
+            SXSSFCell titleCell = rowTitle.createCell(0);
+            titleCell.setCellValue("璧勬簮缁�");
+            titleCell.setCellStyle(title);
+
+            for (int i = 0; i < days.size(); i++) {
+                SXSSFCell dateCell = rowDay.createCell(i * 3 + 1);
+                SXSSFCell designHoursCell = rowTitle.createCell(i * 3 + 1);
+                SXSSFCell requireHoursCell = rowTitle.createCell(i * 3 + 2);
+                SXSSFCell loadCell = rowTitle.createCell(i * 3 + 3);
+                dateCell.setCellValue(days.get(i));
+                designHoursCell.setCellValue("璁捐宸ユ椂");
+                requireHoursCell.setCellValue("闇�姹傚伐鏃�");
+                loadCell.setCellValue("浜ц兘璐熻嵎");
+                /*set cell style*/
+                dateCell.setCellStyle(title);
+                designHoursCell.setCellStyle(title);
+                requireHoursCell.setCellStyle(title);
+                loadCell.setCellStyle(title);
+
+                /*鍚堝苟鏃ユ湡鍗曞厓鏍�*/
+                sheet.addMergedRegion( new CellRangeAddress(0, 0, i*3+1, i*3+3));
+            }
+            for (int i = 0; i < table.size(); i++) {
+                Map<String, List<ApsResourceDateStat>> resourceList = table.get(i);
+                /*鍒涘缓鏁版嵁琛�*/
+                SXSSFRow dataRow  = sheet.createRow(i+2);
+                for( Map.Entry<String, List<ApsResourceDateStat>> entry : resourceList.entrySet()){
+                    String resourceName = entry.getKey();
+                    List<ApsResourceDateStat> resourceDateStats = entry.getValue();
+                    dataRow.createCell(0).setCellValue(resourceName);
+                    for (int j = 0; j < resourceDateStats.size(); j++) {
+                        ApsResourceDateStat apsResourceDateStat = resourceDateStats.get(j);
+                        dataRow.createCell(j*3+1).setCellValue(apsResourceDateStat.getDesignTimes().doubleValue());
+                        dataRow.createCell(j*3+2).setCellValue(apsResourceDateStat.getRequireTimes().doubleValue());
+                        dataRow.createCell(j*3+3).setCellValue(apsResourceDateStat.getCapacityLoad().doubleValue()+"%");
+                    }
+                }
+
+            }
+            wb.write(response.getOutputStream());
+        }
+        catch (Exception e)
+        {
+            log.error("瀵煎嚭Excel寮傚父{}", e.getMessage());
+        }
+        finally
+        {
+            IOUtils.closeQuietly(wb);
+        }
 
     }
+    private Map<String,CellStyle> createStyles(SXSSFWorkbook wb)
+    {
+        Map<String,CellStyle> styles=new HashMap<>();
+        CellStyle style = wb.createCellStyle();
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        Font titleFont = wb.createFont();
+        titleFont.setFontName("Arial");
+        titleFont.setFontHeightInPoints((short) 12);
+        titleFont.setBold(true);
+        style.setFont(titleFont);
+        DataFormat dataFormat = wb.createDataFormat();
+        style.setDataFormat(dataFormat.getFormat("@"));
+        styles.put("title", style);
+        return styles;
+    }
+
+
 }

--
Gitblit v1.9.3