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