| | |
| | | package com.aps.core.service.impl; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | import com.aps.common.core.utils.DateUtils; |
| | | import com.aps.common.core.utils.bean.BeanUtils; |
| | | import com.aps.common.core.web.domain.AjaxResult; |
| | | 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.system.api.domain.SysDictData; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.poi.ss.usermodel.*; |
| | | import org.apache.poi.util.IOUtils; |
| | | 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.service.IApsPlateProcessShopStatService; |
| | |
| | | |
| | | // 定义该功能使用数据源为南通的工厂 |
| | | final String plant = "FORTUNA"; |
| | | |
| | | final String major="钣金"; |
| | | // 查询相关数据 |
| | | ApsPlatePlan platePlan = new ApsPlatePlan(); |
| | | platePlan.setPlant(plant); |
| | |
| | | |
| | | ApsStandardProcess process = new ApsStandardProcess(); |
| | | process.setPlant(plant); |
| | | process.setMajor(major); |
| | | List<ApsStandardProcess> shopProcesses = standardProcessMapper.selectApsStandardProcessList(process); |
| | | if (planList.isEmpty() || shopList.isEmpty() || shopProcesses.isEmpty()) { |
| | | log.warn("计划列表、车间列表或工序列表为空,无法生成统计信息"); |
| | |
| | | stat.setDelFlag("0"); |
| | | stat.setCreateBy(SecurityUtils.getUsername()); |
| | | stat.setCreateTime(DateUtils.getNowDate()); |
| | | |
| | | stat.setWorkCenter(plan.getWorkCenter()); |
| | | stat.setProcessNumber(plan.getProcessNumber()); |
| | | try { |
| | | |
| | | |
| | |
| | | if (!processNames.isEmpty()) { |
| | | // 根据工序名称,查询该工单下所有的工序信息 |
| | | List<ApsPlateProcessStat> processStats = statList.stream() |
| | | .filter(x -> processNames.contains(x.getProcessName()) && x.getWorkOrderNo().equals(plan.getDocumentNumber())) |
| | | .toList(); |
| | | .filter(x -> processNames.contains(x.getProcessName()) && x.getWorkOrderNo().equals(plan.getDocumentNumber()) |
| | | &&x.getProcessPlanStartDay()!=null&&x.getProcessPlanEndDay()!=null |
| | | ).toList(); |
| | | if (!processStats.isEmpty()) { |
| | | // 取出工单下工序的最小开始时间和最大结束时间 |
| | | List<Date> startDayList = processStats.stream().map(ApsPlateProcessStat::getProcessPlanStartDay).filter(Objects::nonNull).toList(); |
| | |
| | | Map<String, List<ApsPlateProcessShopStat>> shopStatesByDocNo = shopStates.stream() |
| | | .collect(Collectors.groupingBy(ApsPlateProcessShopStat::getDocNo)); |
| | | |
| | | |
| | | List<SysDictData> businessTypeDic = DictUtils.getDictCache("aps_business_type"); |
| | | List<SysDictData> documentStatusDic = DictUtils.getDictCache("aps_document_status"); |
| | | |
| | | // 构建结果列表 |
| | | List<ApsPlateProcessShopPlanStat> shopPlanStats = planList.stream() |
| | | .map(plan -> { |
| | |
| | | // 根据 docNo 获取对应的 shopStatList |
| | | List<ApsPlateProcessShopStat> shopStatList = shopStatesByDocNo.getOrDefault(plan.getDocumentNumber(), Collections.emptyList()); |
| | | shopPlanStat.setDeptPlans(shopStatList); |
| | | |
| | | if (businessTypeDic != null) { |
| | | businessTypeDic.stream().filter(x -> x.getDictValue().equals(plan.getBusinessType())).findFirst() |
| | | .ifPresent(sysDictData -> shopPlanStat.setBusinessType(sysDictData.getDictLabel())); |
| | | } |
| | | if (documentStatusDic != null) { |
| | | documentStatusDic.stream().filter(x->x.getDictValue().equals(plan.getDocumentStatus())) |
| | | .findFirst().ifPresent(sysDictData -> shopPlanStat.setDocumentStatus(sysDictData.getDictLabel())); |
| | | } |
| | | return shopPlanStat; |
| | | }) |
| | | .toList(); |
| | | |
| | | }).toList(); |
| | | // 构建返回结果 |
| | | AjaxResult success = AjaxResult.success(shopPlanStats); |
| | | success.put("shopNames", shopList); |
| | | return success; |
| | | } |
| | | |
| | | @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 = getShopPlanStat(); |
| | | List<String> shopNames = (List<String>) stat.get("shopNames"); |
| | | List<ApsPlateProcessShopPlanStat> table= (List<ApsPlateProcessShopPlanStat>)stat.get("data"); |
| | | SXSSFSheet sheet = wb.getSheetAt(0); |
| | | /*填写日期列 和 工时列*/ |
| | | SXSSFRow rowTitle = sheet.createRow(0); |
| | | SXSSFCell mainPartNumberTitle = rowTitle.createCell(0); |
| | | mainPartNumberTitle.setCellValue("主件料号"); |
| | | mainPartNumberTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell businessTypeTitle = rowTitle.createCell(1); |
| | | businessTypeTitle.setCellValue("业务类型"); |
| | | businessTypeTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell documentNumberTitle = rowTitle.createCell(2); |
| | | documentNumberTitle.setCellValue("单据号"); |
| | | documentNumberTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell requirementTypeTitle = rowTitle.createCell(3); |
| | | requirementTypeTitle.setCellValue("需求分类"); |
| | | requirementTypeTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell documentStatusTitle = rowTitle.createCell(4); |
| | | documentStatusTitle.setCellValue("单据状态"); |
| | | documentStatusTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell approveDateTitle = rowTitle.createCell(5); |
| | | approveDateTitle.setCellValue("审核时间"); |
| | | approveDateTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell workCenterTitle = rowTitle.createCell(6); |
| | | workCenterTitle.setCellValue("当前工序"); |
| | | workCenterTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell departmentTitle = rowTitle.createCell(7); |
| | | departmentTitle.setCellValue("当前工序负责人"); |
| | | departmentTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell nextProcessTitle = rowTitle.createCell(8); |
| | | nextProcessTitle.setCellValue("下一工序"); |
| | | nextProcessTitle.setCellStyle(title); |
| | | |
| | | |
| | | SXSSFCell nextProcessDeparmentTitle = rowTitle.createCell(9); |
| | | nextProcessDeparmentTitle.setCellValue("下一工序负责人"); |
| | | nextProcessDeparmentTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell itemNumberTitle = rowTitle.createCell(10); |
| | | itemNumberTitle.setCellValue("料号"); |
| | | itemNumberTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell drawingNoTitle = rowTitle.createCell(11); |
| | | drawingNoTitle.setCellValue("图号"); |
| | | drawingNoTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell versionNumberTitle = rowTitle.createCell(12); |
| | | versionNumberTitle.setCellValue("版本号"); |
| | | versionNumberTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell lowNumTitle = rowTitle.createCell(13); |
| | | lowNumTitle.setCellValue("低阶码"); |
| | | lowNumTitle.setCellStyle(title); |
| | | |
| | | |
| | | SXSSFCell productionQuantityTitle = rowTitle.createCell(14); |
| | | productionQuantityTitle.setCellValue("生产数量"); |
| | | productionQuantityTitle.setCellStyle(title); |
| | | |
| | | SXSSFCell planSendDateTitle = rowTitle.createCell(15); |
| | | planSendDateTitle.setCellValue("工单计划下发时间"); |
| | | planSendDateTitle.setCellStyle(title); |
| | | |
| | | |
| | | |
| | | SXSSFCell planEndDayTitle = rowTitle.createCell(16); |
| | | planEndDayTitle.setCellValue("系统完工时间"); |
| | | planEndDayTitle.setCellStyle(title); |
| | | |
| | | |
| | | |
| | | int i1 = 17; |
| | | for (int i = 0; i < shopNames.size(); i++) { |
| | | String shopName = shopNames.get(i); |
| | | SXSSFCell beginDateCell = rowTitle.createCell(i * 2 + i1); |
| | | SXSSFCell endDateCell = rowTitle.createCell(i * 2 + i1+1); |
| | | beginDateCell.setCellValue(shopName+"开工时间"); |
| | | endDateCell.setCellValue(shopName+"完工时间"); |
| | | beginDateCell.setCellStyle(title); |
| | | endDateCell.setCellStyle(title); |
| | | } |
| | | SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | for (int i = 0; i < table.size(); i++) { |
| | | ApsPlateProcessShopPlanStat plan = table.get(i); |
| | | |
| | | SXSSFRow dataRow = sheet.createRow(i+1); |
| | | //主件料号 |
| | | SXSSFCell mainPartNumberCell = dataRow.createCell(0); |
| | | mainPartNumberCell.setCellValue(plan.getMainPartNumber()); |
| | | |
| | | //业务类型; |
| | | SXSSFCell businessTypeCell= dataRow.createCell(1); |
| | | businessTypeCell.setCellValue(plan.getBusinessType()); |
| | | |
| | | //单据号; |
| | | SXSSFCell documentNumberCell = dataRow.createCell(2); |
| | | documentNumberCell.setCellValue(plan.getDocumentNumber()); |
| | | |
| | | //需求分类; |
| | | SXSSFCell requirementTypeCell = dataRow.createCell(3); |
| | | requirementTypeCell.setCellValue(plan.getRequirementType()); |
| | | |
| | | // 单据状态 |
| | | SXSSFCell documentStatusCell = dataRow.createCell(4); |
| | | documentStatusCell.setCellValue(plan.getDocumentStatus()); |
| | | |
| | | |
| | | // 审核时间 |
| | | SXSSFCell approveDateCell = dataRow.createCell(5); |
| | | approveDateCell.setCellValue(""); |
| | | |
| | | //当前工序 |
| | | SXSSFCell workCenterCell = dataRow.createCell(6); |
| | | workCenterCell.setCellValue(plan.getWorkCenter()); |
| | | |
| | | //当前工序负责人; |
| | | SXSSFCell departmentCell = dataRow.createCell(7); |
| | | departmentCell.setCellValue(plan.getDepartment()); |
| | | |
| | | //下一工序 |
| | | SXSSFCell nextProcessCell = dataRow.createCell(8); |
| | | nextProcessCell.setCellValue(""); |
| | | |
| | | //下一工序工序负责人 |
| | | SXSSFCell nextProcessDeparmentCell = dataRow.createCell(9); |
| | | nextProcessDeparmentCell.setCellValue(plan.getNextProcessDeparment()); |
| | | |
| | | //料号 |
| | | SXSSFCell itemNumberCell = dataRow.createCell(10); |
| | | itemNumberCell.setCellValue(plan.getItemNumber()); |
| | | |
| | | // 图号 |
| | | SXSSFCell drawingNoCell = dataRow.createCell(11); |
| | | drawingNoCell.setCellValue(plan.getDrawingNo()); |
| | | |
| | | //版本号 |
| | | SXSSFCell versionNumberCell = dataRow.createCell(12); |
| | | versionNumberCell.setCellValue(plan.getVersionNumber()); |
| | | |
| | | //低阶码 |
| | | SXSSFCell lowNumCell = dataRow.createCell(13); |
| | | lowNumCell.setCellValue(""); |
| | | |
| | | //生产数量 |
| | | SXSSFCell productionQuantityCell = dataRow.createCell(14); |
| | | productionQuantityCell.setCellValue(plan.getProductionQuantity().toString()); |
| | | |
| | | //工单计划下发时间 |
| | | SXSSFCell planSendDateCell = dataRow.createCell(15); |
| | | planSendDateCell.setCellValue(""); |
| | | |
| | | //系统完工时间 |
| | | SXSSFCell planEndDayCell = dataRow.createCell(16); |
| | | planEndDayCell.setCellValue(dateFormat.format(plan.getPlanEndDay())); |
| | | |
| | | for (int j = 0; j< shopNames.size(); j++) { |
| | | String shopName = shopNames.get(j); |
| | | SXSSFCell beginDateCell = dataRow.createCell(j * 2 + i1); |
| | | SXSSFCell endDateCell = dataRow.createCell(j * 2 + i1+1); |
| | | plan.getDeptPlans().stream().filter(x->x.getShopName().equals(shopName)).findFirst().ifPresent(x->{ |
| | | beginDateCell.setCellValue(x.getPlanStartDate()); |
| | | endDateCell.setCellValue(x.getPlanEndDate()); |
| | | }); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | for (int i = 0; i < rowTitle.getLastCellNum(); i++) { |
| | | |
| | | sheet.setColumnWidth(i, 20 * 256); |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | |
| | | |
| | | } |