package com.example.erp.service.pp; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.erp.dto.pp.*; import com.example.erp.entity.pp.DamageDetails; import com.example.erp.entity.pp.Report; import com.example.erp.entity.sd.BasicData; import com.example.erp.entity.sd.OrderDetail; import com.example.erp.entity.sd.OrderGlassDetail; import com.example.erp.entity.sd.ProductDetail; import com.example.erp.mapper.pp.FlowCardMapper; import com.example.erp.mapper.pp.ProductionSchedulingMapper; import com.example.erp.mapper.pp.ReportMapper; import com.example.erp.mapper.sd.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.sql.Date; import java.time.LocalDate; import java.util.*; import java.util.concurrent.Executor; import java.util.function.Function; import java.util.stream.Collectors; @Service @DS("pp") public class ReportService { private final ReportMapper reportMapper; private final OrderProcessDetailMapper orderProcessDetailMapper; private final ProductionSchedulingMapper productionSchedulingMapper; private final OrderGlassDetailMapper orderGlassDetailMapper; private final BasicDataMapper basicDataMapper; private final ProductDetailMapper productDetailMapper; private final OrderDetailMapper orderDetailMapper; FlowCardMapper flowCardMapper; //上工序报工班组 private void mergeTeamsGroupsName( List dataList1,List dataList2) { for (WorkInProgressDTO dto1 : dataList1) { //根据当前工序获取 是否为单片、夹胶、或者全部 BasicData basicData = basicDataMapper. selectOne(new QueryWrapper() .eq("basic_name", dto1.getThisProcess()) .last("limit 1") ); OrderDetail orderDetail = orderDetailMapper .selectOne( new QueryWrapper() .eq("order_id", dto1.getOrderId()) .eq("order_number", dto1.getOrderNumber()) ); //如果为单片,则根据产品名称和工艺编号获取玻璃名称 if(basicData.getNickname()==null || basicData.getNickname().isEmpty()){ ProductDetail productDetail = productDetailMapper. selectOne(new QueryWrapper() .eq("prod_id", orderDetail.getProductId()) .eq("glass_sort",dto1.getTechnologyNumber()) ); dto1.setGlassName(productDetail.getDetail()); }else if(basicData.getNickname().equals("stepC")){ OrderGlassDetail orderGlassDetailGroup = orderGlassDetailMapper .selectOne(new QueryWrapper() .eq("order_id", dto1.getOrderId()) .eq("order_number", dto1.getOrderNumber()) .eq("technology_number",dto1.getTechnologyNumber()) ); String glassName = productDetailMapper.getGlassNameByGroup( orderDetail.getProductId(), orderGlassDetailMapper.getMinTechnologyNumberByGroup(dto1.getOrderId(),dto1.getOrderNumber(), String.valueOf(orderGlassDetailGroup.getGroup())), orderGlassDetailMapper.getMaxTechnologyNumberByGroup(dto1.getOrderId(),dto1.getOrderNumber(), String.valueOf(orderGlassDetailGroup.getGroup())) ); dto1.setGlassName(glassName); }else{ dto1.setGlassName(dto1.getProductName()); } } Function keyFn = dto -> dto.getProcessId() + "|" + dto.getOrderNumber() + "|" + dto.getTechnologyNumber(); Map map2 = dataList2.stream() .collect(Collectors.toMap( keyFn, Function.identity(), (existing, replacement) -> existing )); for (WorkInProgressDTO dto1 : dataList1) { WorkInProgressDTO dto2 = map2.get(keyFn.apply(dto1)); if (dto2 != null) { String tgn = dto2.getTeamsGroupsName(); if (StringUtils.hasText(tgn)) { dto1.setTeamsGroupsName(tgn); } } } } public ReportService(ReportMapper reportMapper, OrderProcessDetailMapper orderProcessDetailMapper, ProductionSchedulingMapper productionSchedulingMapper, FlowCardMapper flowCardMapper, OrderGlassDetailMapper orderGlassDetailMapper, BasicDataMapper basicDataMapper, ProductDetailMapper productDetailMapper, OrderDetailMapper orderDetailMapper) { this.reportMapper = reportMapper; this.orderProcessDetailMapper = orderProcessDetailMapper; this.productionSchedulingMapper = productionSchedulingMapper; this.flowCardMapper = flowCardMapper; this.orderGlassDetailMapper = orderGlassDetailMapper; this.basicDataMapper = basicDataMapper; this.productDetailMapper = productDetailMapper; this.orderDetailMapper = orderDetailMapper; } //流程卡进度方法 public Map processCardProgressSv(String orderId, List columns) { Map map = new HashMap<>(); //获取表格内容数据 map.put("data", reportMapper.processCardProgressMp(orderId)); //获取表头工序筛选数据 List> processFilterList = orderProcessDetailMapper.filterOrderProcess(orderId); List> processList = processFilterList; List filterList = new ArrayList<>(); //循环遍历数组,判断此序号当前的工序 for (int i = 1; i < processFilterList.size(); i++) { filterList.add(processFilterList.get(i).get("process")); List> lastProcessList = orderProcessDetailMapper.filterLastProcess( orderId, String.valueOf(processFilterList.get(i).get("order_number")), String.valueOf(processFilterList.get(i).get("technology_number")), String.valueOf(processFilterList.get(i).get("id")) ); if (!lastProcessList.isEmpty()) { int finalI = i; lastProcessList.forEach(lastProcess -> { if (filterList.contains(lastProcess.get("process"))) { processList.add(lastProcess); } }); } } // 使用HashSet来记录已经遇到的value值 Set seenValues = new HashSet<>(); // 创建一个新的List来存储结果 List> uniqueList = new ArrayList<>(); // 反向遍历原始List for (int i = processList.size() - 1; i >= 0; i--) { Map maps = processList.get(i); String value = maps.values().iterator().next(); // 假设每个Map只有一个value // 如果value还没有被看到过,就添加到结果List和HashSet中 if (!seenValues.contains(value)) { uniqueList.add(0, maps); // 添加到结果List的开头,以保持原顺序 seenValues.add(value); } } map.put("title", uniqueList); List> getRowCount = orderProcessDetailMapper.getGlassLRow(orderId); List> rowCount = new ArrayList<>(); columns.forEach(col -> { getRowCount.forEach(row -> { Map getRow = new HashMap<>(); // { row: 0, col: 1, rowspan: 3, colspan: 0}, Object rowNumObj = row.get("RowNum"); if (rowNumObj instanceof Double) { getRow.put("row", ((Double) rowNumObj).intValue()); } else if (rowNumObj instanceof Integer) { getRow.put("row", (Integer) rowNumObj); } getRow.put("col", col); getRow.put("rowspan", row.get("rowCount")); getRow.put("colspan", 0); rowCount.add(getRow); }); }); map.put("mergeCells", rowCount); return map; } public Map crossProcessBreakingSv(Integer pageNum, Integer pageSize, List selectDate, CrossProcessBreakingDTO crossProcessBreakingDTO) { Integer offset = (pageNum - 1) * pageSize; String endDate = LocalDate.now().toString(); String startDate = LocalDate.now().minusDays(15).toString(); if (selectDate != null && selectDate.size() == 2) { if (!selectDate.get(0).isEmpty()) { startDate = selectDate.get(0); } if (!selectDate.get(1).isEmpty()) { endDate = selectDate.get(1); } } Map map = new HashMap<>(); map.put("data", reportMapper.getProcessBreaking(offset, pageSize, startDate, endDate, crossProcessBreakingDTO)); map.put("total", reportMapper.getProcessBreakingTotal(offset, pageSize, startDate, endDate, crossProcessBreakingDTO)); List list = new ArrayList<>(); list.add(startDate); list.add(endDate); map.put("selectDate", list); return map; } public Map workInProgressSv(Integer pageNum, Integer pageSize, String orderId, String inputProject, String selectProcesses, String optionVal, WorkInProgressDTO workInProgressDTO) { Integer offset = (pageNum - 1) * pageSize; if ("null".equals(orderId)) { orderId = ""; } if ("null".equals(inputProject)) { inputProject = ""; } if ("null".equals(optionVal)) { optionVal = (""); } if (selectProcesses.equals("全部")){ selectProcesses=""; } Map map = new HashMap<>(); List dataList2 =reportMapper.workInProgressMpdataList2(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO); if (optionVal.equals("1")){ System.out.println(1); /* 根据销售单号汇总*/ //map.put("data", reportMapper.workInProgressOrderMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); List dataList1 =reportMapper.workInProgressOrderMpList1(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO); mergeTeamsGroupsName(dataList1, dataList2); map.put("data",dataList1); // map.put("total", reportMapper.workInProgressOrderTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); map.put("total" ,reportMapper.workInProgressOrderFootSum(offset, pageSize,orderId, inputProject, selectProcesses, workInProgressDTO)); }else if(optionVal.equals("2")){ System.out.println(2); /* 根据流程卡号汇总*/ //map.put("data", reportMapper.workInProgressProcessMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); List dataList1 =reportMapper.workInProgressProcessMpList1(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO); mergeTeamsGroupsName(dataList1, dataList2); map.put("data",dataList1); // map.put("total", reportMapper.workInProgressProcessTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); map.put("total" ,reportMapper.workInProgressOrderFootSum(offset, pageSize,orderId, inputProject, selectProcesses, workInProgressDTO)); } else if (optionVal.equals("3")) { } else { //没有选择分组 //map.put("data", reportMapper.workInProgressMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); List dataList1 =reportMapper.workInProgressMpdataList1(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO); mergeTeamsGroupsName(dataList1, dataList2); map.put("data",dataList1); //map.put("total", reportMapper.workInProgressTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); map.put("total" ,reportMapper.workInProgressOrderFootSum(offset, pageSize,orderId, inputProject, selectProcesses, workInProgressDTO)); } map.put("process", productionSchedulingMapper.selectProcess()); return map; } public Map selectProcessToBeCompletedSv(Date selectTime1, Date selectTime2, String orderId, String inputProject, String selectProcesses, Report report) { if ("null".equals(orderId)) { orderId = ""; } if ("null".equals(inputProject)) { inputProject = ""; } Map map = new HashMap<>(); map.put("data", reportMapper.processToBeCompletedMp(selectTime1, selectTime2, orderId, inputProject, selectProcesses, report)); map.put("process", productionSchedulingMapper.selectProcess()); map.put("footSum" ,reportMapper.processToBeCompletedFootSum(selectTime1, selectTime2, orderId, inputProject, selectProcesses, report)); return map; } public Map selectDamageReportSv(Integer pageNum, Integer pageSize, Date selectTime1, Date selectTime2, DamageReportDTO damageReportDTO) { Integer offset = (pageNum - 1) * pageSize; Map map = new HashMap<>(); map.put("data", reportMapper.selectDamageReportMp(offset, pageSize, selectTime1, selectTime2, damageReportDTO)); map.put("total", reportMapper.getDamageReportPageTotal(offset, pageSize, selectTime1, selectTime2, damageReportDTO)); map.put("footSum" ,reportMapper.damageReportFootSum(selectTime1, selectTime2, damageReportDTO)); return map; } public Map splittingDetailsOutsideSv(String orderId, Report report) { Map map = new HashMap<>(); map.put("data", reportMapper.splittingDetailsOutsideMp(orderId, report)); map.put("orderOtherMoney", flowCardMapper.selectorderOtherMoney()); return map; } public Map qualityReportSv(Date selectTime1, Date selectTime2, Report report) { Map map = new HashMap<>(); map.put("data", reportMapper.qualityReportMp(selectTime1, selectTime2, report)); return map; } public Map yieldSv(Date selectTime1, Date selectTime2, String selectProcesses, Report report) { Map map = new HashMap<>(); map.put("data", reportMapper.yieldMp(selectTime1, selectTime2, selectProcesses, report)); map.put("process", productionSchedulingMapper.selectProcess()); return map; } public Map productionScheduleSv(String orderId, List columns) { Map map = new HashMap<>(); //获取表格内容数据 map.put("data", reportMapper.productionScheduleMp(orderId)); //获取表头工序筛选数据 List> processFilterList = orderProcessDetailMapper.filterOrderProcess(orderId); List> processList = processFilterList; List filterList = new ArrayList<>(); //循环遍历数组,判断此序号当前的工序 for (int i = 1; i < processFilterList.size(); i++) { filterList.add(processFilterList.get(i).get("process")); List> lastProcessList = orderProcessDetailMapper.filterLastProcess( orderId, String.valueOf(processFilterList.get(i).get("order_number")), String.valueOf(processFilterList.get(i).get("technology_number")), String.valueOf(processFilterList.get(i).get("id")) ); if (!lastProcessList.isEmpty()) { int finalI = i; lastProcessList.forEach(lastProcess -> { if (filterList.contains(lastProcess.get("process"))) { processList.add(lastProcess); } }); } } // 使用HashSet来记录已经遇到的value值 Set seenValues = new HashSet<>(); // 创建一个新的List来存储结果 List> uniqueList = new ArrayList<>(); // 反向遍历原始List for (int i = processList.size() - 1; i >= 0; i--) { Map maps = processList.get(i); String value = maps.values().iterator().next(); // 假设每个Map只有一个value // 如果value还没有被看到过,就添加到结果List和HashSet中 if (!seenValues.contains(value)) { uniqueList.add(0, maps); // 添加到结果List的开头,以保持原顺序 seenValues.add(value); } } map.put("title", uniqueList); List> getRowCount = orderProcessDetailMapper.getGlassLRow(orderId); List> rowCount = new ArrayList<>(); columns.forEach(col -> { getRowCount.forEach(row -> { Map getRow = new HashMap<>(); // { row: 0, col: 1, rowspan: 3, colspan: 0}, getRow.put("row", row.get("RowNum")); getRow.put("col", col); getRow.put("rowspan", row.get("rowCount")); getRow.put("colspan", 0); rowCount.add(getRow); }); }); map.put("mergeCells", rowCount); return map; } public Map taskCompletionStatusSv(Date selectTime1, Date selectTime2, List columns) { Map map = new HashMap<>(); //获取表格内容数据 map.put("data", reportMapper.taskCompletionStatusMp(selectTime1, selectTime2)); //获取表头工序筛选数据 List> processFilterList = orderProcessDetailMapper.filterOrderProcessCollect(selectTime1, selectTime2); List> processList = processFilterList; List filterList = new ArrayList<>(); //循环遍历数组,判断此序号当前的工序 for (int i = 1; i < processFilterList.size(); i++) { filterList.add(processFilterList.get(i).get("process")); List> lastProcessList = orderProcessDetailMapper.filterLastProcess( String.valueOf(processFilterList.get(i).get("order_id")), String.valueOf(processFilterList.get(i).get("order_number")), String.valueOf(processFilterList.get(i).get("technology_number")), String.valueOf(processFilterList.get(i).get("id")) ); if (!lastProcessList.isEmpty()) { int finalI = i; lastProcessList.forEach(lastProcess -> { if (filterList.contains(lastProcess.get("process"))) { processList.add(lastProcess); } }); } } // 使用HashSet来记录已经遇到的value值 Set seenValues = new HashSet<>(); // 创建一个新的List来存储结果 List> uniqueList = new ArrayList<>(); // 反向遍历原始List for (int i = processList.size() - 1; i >= 0; i--) { Map maps = processList.get(i); String value = maps.values().iterator().next(); // 假设每个Map只有一个value // 如果value还没有被看到过,就添加到结果List和HashSet中 if (!seenValues.contains(value)) { uniqueList.add(0, maps); // 添加到结果List的开头,以保持原顺序 seenValues.add(value); } } map.put("title", uniqueList); List> getRowCount = orderProcessDetailMapper.getGlassLRowCollect(selectTime1, selectTime2); List> rowCount = new ArrayList<>(); columns.forEach(col -> { getRowCount.forEach(row -> { Map getRow = new HashMap<>(); // { row: 0, col: 1, rowspan: 3, colspan: 0}, getRow.put("row", row.get("RowNum")); getRow.put("col", col); getRow.put("rowspan", row.get("rowCount")); getRow.put("colspan", 0); rowCount.add(getRow); }); }); map.put("mergeCells", rowCount); return map; } public Map orderPlanDecompositionSv(Date selectTime1, Date selectTime2, Report report) { Map map = new HashMap<>(); map.put("data", reportMapper.orderPlanDecompositionMp(selectTime1, selectTime2, report)); return map; } public Map orderReportingWorks(Date selectTime1, Date selectTime2, Report report) { Map map = new HashMap<>(); map.put("data", reportMapper.orderReportingWorks(selectTime1, selectTime2, report)); return map; } public Map rawMaterialRequisitionSv(Date selectTime1, Date selectTime2, Report report) { Map map = new HashMap<>(); map.put("data", reportMapper.rawMaterialRequisitionMp(selectTime1, selectTime2, report)); return map; } public List exportCrossProcessBreakingSv(List dates) { return reportMapper.exportCrossProcessBreakingMp(dates); } public List exportDamageReportSv(List dates) { if (dates != null && dates.size() > 1) { dates.set(1, dates.get(1).plusDays(1)); // 将第二个日期加一天 } return reportMapper.exportDamageReportMp(dates); } public List exportOrderPlanDecompositionSv(List dates) { return reportMapper.exportOrderPlanDecompositionMp(dates); } public List exportProcessToBeCompletedSv(Map dates) { List date= (List) dates.get("date"); String process= (String) dates.get("processes"); String inputVal= (String) dates.get("inputVal"); String project= (String) dates.get("project"); if ("null".equals(inputVal)) { inputVal = ""; } if ("null".equals(project)) { project = ""; } return reportMapper.exportProcessToBeCompletedMp(date,process,inputVal,project); } public List exportWorkInProgressSv(Map dates) { String process= (String) dates.get("processes"); if (process.equals("全部")){ process=""; } String inputVal= (String) dates.get("inputVal"); String project= (String) dates.get("project"); if ("null".equals(inputVal)) { inputVal = ""; } if ("null".equals(project)) { project = ""; } List dataList1 =reportMapper.exportWorkInProgressMp(process,inputVal,project); List dataList2 =reportMapper.exportWorkInProgressMpdataList2(process); mergeTeamsGroupsName(dataList1, dataList2); return dataList1; } public List exportTaskCompletionStatusSv(Map dates) { return reportMapper.exportTaskCompletionStatusMp(dates); } public List exportRawMaterialRequisitionSv(List dates) { return reportMapper.exportRawMaterialRequisitionMp(dates); } public List exportQualityReportSv(List dates) { return reportMapper.exportQualityReportSv(dates); } public List exportYieldSv(Map dates) { List date= (List) dates.get("date"); String process= (String) dates.get("processes"); return reportMapper.exportYieldMp(date,process); } public Map teamOutputSv(Integer pageNum, Integer pageSize, String selectTime1, String selectTime2, String selectProcesses, TeamOutputDTO teamOutputDTO) { if (selectProcesses.equals("全部")){ selectProcesses=""; } Integer offset = (pageNum - 1) * pageSize; Map map = new HashMap<>(); String laminating = reportMapper.getLaminating(selectProcesses); map.put("data", reportMapper.teamOutputMp(offset, pageSize, selectTime1, selectTime2,selectProcesses,laminating, teamOutputDTO)); map.put("process", productionSchedulingMapper.selectProcess()); map.put("total", reportMapper.teamOutputPageTotal(offset, pageSize, selectTime1, selectTime2,selectProcesses,laminating, teamOutputDTO)); map.put("footSum" ,reportMapper.teamOutputFootSum(selectTime1, selectTime2,selectProcesses,laminating, teamOutputDTO)); return map; } public Map scheduleProductionScheduleSv(Integer pageNum, Integer pageSize, Date selectTime1, Date selectTime2, String processes, ScheduleProductionScheduleDTO scheduleProductionScheduleDTO) { Integer offset = (pageNum - 1) * pageSize; Map map = new HashMap<>(); map.put("data", reportMapper.scheduleProductionScheduleMp(offset, pageSize, selectTime1, selectTime2,processes, scheduleProductionScheduleDTO)); map.put("total", reportMapper.getScheduleProductionScheduleTotal(offset, pageSize, selectTime1, selectTime2,processes, scheduleProductionScheduleDTO)); map.put("process", productionSchedulingMapper.selectProcess()); return map; } public List exportScheduleReportSv(Map dates) { List date= (List) dates.get("date1"); String process= (String) dates.get("processes"); return reportMapper.exportScheduleReportMp(date,process); } public List exportTeamOutputSv(Map dates) { List date= (List) dates.get("date"); String process= (String) dates.get("processes"); if (process.equals("全部")){ process=""; } String laminating = reportMapper.getLaminating(process); return reportMapper.exportTeamOutputMp(date,process,laminating); } public Map workInProgressCombinationSv(Integer pageNum, Integer pageSize, String selectProcesses, String optionVal, WorkInProgressDTO workInProgressDTO) { Integer offset = (pageNum - 1) * pageSize; if ("null".equals(optionVal)) { optionVal = (""); } if (selectProcesses.equals("全部")){ selectProcesses=""; } Map map = new HashMap<>(); List dataList2 =reportMapper.workInProgressCombinationMpdataList2(offset, pageSize, selectProcesses, workInProgressDTO); //没有选择分组 //map.put("data", reportMapper.workInProgressMp(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); List dataList1 =reportMapper.workInProgressCombinationMpdataList1(offset, pageSize, selectProcesses, workInProgressDTO); mergeTeamsGroupsName(dataList1, dataList2); map.put("data",dataList1); //map.put("total", reportMapper.workInProgressTotal(offset, pageSize, orderId, inputProject, selectProcesses, workInProgressDTO)); map.put("total" ,reportMapper.workInProgressCombinationOrderFootSum(offset, pageSize, selectProcesses, workInProgressDTO)); map.put("process", productionSchedulingMapper.selectProcess()); return map; } }