From dec8951aae400e54f6ee83a8f95867dba9da8af1 Mon Sep 17 00:00:00 2001 From: zhanghl <253316343@qq.com> Date: 星期五, 23 五月 2025 17:17:33 +0800 Subject: [PATCH] [钣金计划大表] 优化:焊缝统计导出Excel样式 --- aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPartRouteStatServiceImpl.java | 144 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 137 insertions(+), 7 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 db51a02..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 @@ -3,20 +3,38 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +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.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.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; @@ -26,13 +44,20 @@ * @author zhl * @date 2025-04-11 */ +@Slf4j @Service public class ApsPartRouteStatServiceImpl implements IApsPartRouteStatService { + @Autowired private ApsPartRouteStatMapper apsPartRouteStatMapper; @Autowired private ApsResourceGroupMapper resourceGroupMapper; + @Autowired + private ApsResourceGroupMapper apsResourceGroupMapper; + + @Resource + private IApsAbnormalProcessAnalysisService analysisService; /** * 鏌ヨ闆朵欢缁熻琛� @@ -112,6 +137,7 @@ /** * 鏌ヨ闆朵欢宸ュ簭骞舵洿鏂拌鍒掑紑宸ユ棩鏈� * */ + @Transactional @Override public void updatePartRoutPlanDate() { List<ApsPartRouteStat> tempList = apsPartRouteStatMapper.selectPartRoutStat(); @@ -131,24 +157,32 @@ /*鍒ゆ柇褰撳墠宸ュ簭 褰撳墠宸ュ簭鍙湁涓�鏉�*/ 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 (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(); } /** 鏌ヨ璧勬簮鏃ュ巻琛� */ @@ -157,6 +191,7 @@ /*鏌ュ嚭鎵�鏈夌粺璁$殑鏁版嵁*/ 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); @@ -173,10 +208,11 @@ startDay = startDay.plus(1, ChronoUnit.DAYS); } /*缁勭粐鍑哄垪澶存暟鎹�*/ - List<String> resourceNames =list.stream().map(ApsResourceDateStat::getResourceName).distinct().toList(); + /*鍑嗗璧勬簮缁勪俊鎭�*/ List<Map<String, List<ApsResourceDateStat>>> targetList = new ArrayList<>(); - resourceNames.forEach(resourceName -> { + resourceGroupList.forEach(resourceGroup -> { + String resourceName=resourceGroup.getResourceGroupName(); /*鏍规嵁鏃ユ湡琛ㄥご鐨勯『搴忥紝缁勭粐鍑烘瘡涓棩鏈熶笅鐨勭粺璁¢」鐩�*/ Map<String, List<ApsResourceDateStat>> maps = new HashMap<>(Map.of()); List<ApsResourceDateStat> currentDaysResouces=new ArrayList<>(); @@ -193,8 +229,9 @@ else { ApsResourceDateStat empty = new ApsResourceDateStat(); empty.setPlanDay(LocalDate.parse(planDay, formatter)); - empty.setDesignTimes(0); - empty.setRequireTimes(0); + // 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); @@ -210,4 +247,97 @@ 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