package com.ruoyi.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.metadata.WriteSheet; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.excel.DefaultExcelListener; import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.file.SmbUtil; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.bo.ProcessRouteBo; import com.ruoyi.system.domain.dto.*; import com.ruoyi.system.domain.vo.*; import com.ruoyi.system.jdmain.rouplan.Model; import com.ruoyi.system.mapper.BomDetailsMapper; import com.ruoyi.system.mapper.ImMaterialMapper; import com.ruoyi.system.mapper.MaterialBomMapper; import com.ruoyi.system.mapper.ProcessRouteMapper; import com.ruoyi.system.runner.JdUtil; import com.ruoyi.system.service.IProcessRouteService; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; /** * 工艺路线 * * @date 2024-10-09 */ @Validated @RequiredArgsConstructor @RestController @RequestMapping("/system/route") public class ProcessRouteController extends BaseController { private final ProcessRouteMapper baseMapper; @Autowired BomDetailsMapper bomDetailsMapper; private final IProcessRouteService iProcessRouteService; private static final Logger log = LoggerFactory.getLogger(ProcessRouteController.class); @Autowired MaterialBomMapper materialBomMapper; @Resource private final ImMaterialMapper imMaterialMapper; private Long generateUniqueParentId(Long originalId) { return originalId + 1000; } /** * 主动更新可用库存 */ @SaCheckPermission("system:route:list") @GetMapping("/list2") public TableDataInfo list2(ProcessRouteBo bo, PageQuery pageQuery) { try { // 查询工艺路线数据 TableDataInfo processRouteVoTableDataInfo = iProcessRouteService.queryPageList2(bo, pageQuery); // 用于存储父子关系的Map,key为"物料编码_物料名称",值为父级ProcessRouteVo Map routeMap = new HashMap<>(); // 存储顶级列表 List topLevelList = new ArrayList<>(); // 获取查询返回的行数据 List rows = processRouteVoTableDataInfo.getRows(); // 遍历所有工艺路线记录 for (ProcessRouteVo processRouteVo : rows) { // 组合父级键值,物料编码 + 物料名称 String parentCodeAndName = String.format("%s_%s", processRouteVo.getMaterialCode(), processRouteVo.getMaterialName()); // 查找是否已存在父节点 ProcessRouteVo parent = routeMap.get(parentCodeAndName); if (parent == null) { // 如果父节点不存在,创建并初始化 parent = new ProcessRouteVo(); parent.setId(generateUniqueParentId(processRouteVo.getId())); parent.setRouteDescription(processRouteVo.getRouteDescription()); // parent.setParentId((Long.valueOf(generateUniqueParentId(processRouteVo.getId())))); parent.setMaterialCode(processRouteVo.getMaterialCode()); parent.setMaterialName(processRouteVo.getMaterialName()); parent.setMaterial(processRouteVo.getMaterial()); parent.setDiscWeight(processRouteVo.getDiscWeight()); parent.setFirstBatchQuantity(processRouteVo.getFirstBatchQuantity()); // 初始化子节点列表 parent.setChildren(new ArrayList<>()); // 将父节点放入Map中 routeMap.put(parentCodeAndName, parent); // 将父节点加入顶级列表 topLevelList.add(parent); } // 创建子节点,并将其添加到父节点的子集 ProcessRouteVo child = createChildVo(processRouteVo, parent.getId(), parent.getMaterialCode(), parent.getMaterialName()); parent.getChildren().add(child); } // 设置返回的rows为顶级节点列表 processRouteVoTableDataInfo.setRows(topLevelList); // 返回构建后的数据 return processRouteVoTableDataInfo; } catch (Exception e) { e.printStackTrace(); return new TableDataInfo<>(); } } /** * 查询工艺路线列表 */ @SaCheckPermission("system:route:list") @GetMapping("/list") public TableDataInfo list(ProcessRouteBo bo, PageQuery pageQuery) { try { // 查询工艺路线数据 TableDataInfo processRouteVoTableDataInfo = iProcessRouteService.queryPageList(bo, pageQuery); // 用于存储父子关系的Map,key为"物料编码_物料名称",值为父级ProcessRouteVo Map routeMap = new HashMap<>(); // 存储顶级列表 List topLevelList = new ArrayList<>(); // 获取查询返回的行数据 List rows = processRouteVoTableDataInfo.getRows(); // 遍历所有工艺路线记录 for (ProcessRouteVo processRouteVo : rows) { // 组合父级键值,物料编码 + 物料名称 String parentCodeAndName = String.format("%s_%s", processRouteVo.getMaterialCode(), processRouteVo.getMaterialName()); // 查找是否已存在父节点 ProcessRouteVo parent = routeMap.get(parentCodeAndName); if (parent == null) { // 如果父节点不存在,创建并初始化 parent = new ProcessRouteVo(); parent.setId(generateUniqueParentId(processRouteVo.getId())); parent.setRouteDescription(processRouteVo.getRouteDescription()); // parent.setParentId((Long.valueOf(generateUniqueParentId(processRouteVo.getId())))); parent.setMaterialCode(processRouteVo.getMaterialCode()); parent.setMaterialName(processRouteVo.getMaterialName()); parent.setMaterial(processRouteVo.getMaterial()); parent.setDiscWeight(processRouteVo.getDiscWeight()); parent.setBatchQuantity(processRouteVo.getBatchQuantity()); parent.setFirstBatchQuantity(processRouteVo.getFirstBatchQuantity()); // 初始化子节点列表 parent.setChildren(new ArrayList<>()); // 将父节点放入Map中 routeMap.put(parentCodeAndName, parent); // 将父节点加入顶级列表 topLevelList.add(parent); } // 创建子节点,并将其添加到父节点的子集 ProcessRouteVo child = createChildVo(processRouteVo, parent.getId(), parent.getMaterialCode(), parent.getMaterialName()); parent.getChildren().add(child); } // 设置返回的rows为顶级节点列表 processRouteVoTableDataInfo.setRows(topLevelList); // 返回构建后的数据 return processRouteVoTableDataInfo; } catch (Exception e) { e.printStackTrace(); return new TableDataInfo<>(); } } /** * 创建子节点的辅助方法 * * @param processRouteVo 原始数据 * @return ProcessRouteVo 子节点 */ private ProcessRouteVo createChildVo(ProcessRouteVo processRouteVo, Long parentId, String materialCode, String materialName) { ProcessRouteVo child = new ProcessRouteVo(); child.setId(processRouteVo.getId()); child.setParentId(parentId); child.setProcessNo(processRouteVo.getProcessNo()); child.setWorkCenter(processRouteVo.getWorkCenter()); child.setProcessName(processRouteVo.getProcessName()); child.setProcessDescription(processRouteVo.getProcessDescription()); child.setProcessControl(processRouteVo.getProcessControl()); child.setActivityDuration(processRouteVo.getActivityDuration()); child.setActivityUnit(processRouteVo.getActivityUnit()); child.setUnitQuantity(processRouteVo.getUnitQuantity()); child.setPlanStartTime(processRouteVo.getPlanStartTime()); child.setPlanEndTime(processRouteVo.getPlanEndTime()); child.setXuStartTime(processRouteVo.getXuStartTime()); child.setXuEndTime(processRouteVo.getXuEndTime()); return child; } /** * 导出工艺路线列表 */ @SaCheckPermission("system:route:export") @Log(title = "工艺路线", businessType = BusinessType.EXPORT) @PostMapping("/export2") public void export2(ProcessRouteBo bo, HttpServletResponse response) { log.info("获取项目生产数据表:{}", bo); List list = iProcessRouteService.queryList(bo); List bomlist = JdUtil.getPRD_PPBOM(bo.getRouteDescription()); //过滤bomlist 只要009开头的标准件 bomlist = bomlist.stream() .filter(bom -> bom.getMaterialCode().startsWith("009")) .collect(Collectors.toList()); if (list.isEmpty() && bomlist.isEmpty()) { throw new ServiceException("没有数据"); } try { // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("工艺路线", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); ServletOutputStream os = response.getOutputStream(); // 创建ExcelWriter try (com.alibaba.excel.ExcelWriter excelWriter = EasyExcel.write(os) .autoCloseStream(false) // 防止自动关闭流 .build()) { // 写入工艺路线sheet if (!list.isEmpty()) { WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "工艺路线") .head(ProcessRoute.class) .build(); excelWriter.write(list, writeSheet1); } // 写入标准件清单sheet if (!bomlist.isEmpty()) { WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "标准件清单") .head(MaterialUsageDTO2.class) .build(); excelWriter.write(bomlist, writeSheet2); } } } catch (Exception e) { throw new RuntimeException("导出Excel异常: " + e.getMessage(), e); } } @SaCheckPermission("system:route:export") @Log(title = "工艺路线", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(ProcessRouteBo bo, HttpServletResponse response) { log.info("获取项目生产数据表:{}", bo); // 下载Excel模板 SmbUtil.downloadExcelFiles(bo.getRouteDescription()); // 构建Excel文件路径 String ExcelName = "D:\\file\\" + bo.getRouteDescription() + "汇总表.xlsx"; File file = new File(ExcelName); if (!file.exists()) { throw new ServiceException("文件不存在,请确认路径是否正确"); } //读取file的所有的物料编码 try { if (file.exists()) { // 读取Excel的sheet6 从第三行开始 读取到第4列 无数据的跳过 DefaultExcelListener listener = new DefaultExcelListener<>(true); EasyExcel.read(ExcelName, ProcessRoute.class,listener) .sheet(6) .headRowNumber(3) .doRead(); } } catch (Exception e) { throw new RuntimeException(e); } // 查询要写入的数据是否 List list = iProcessRouteService.queryList(bo); try { // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("工艺路线", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); ServletOutputStream os = response.getOutputStream(); // 使用 EasyExcel 写入已有Excel的第七个sheet(index=6) try (com.alibaba.excel.ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(file) // 指定模板文件 .autoCloseStream(true) .build()) { // 写入到第七个 sheet(index=6),并命名为“工艺路线” WriteSheet writeSheet = EasyExcel.writerSheet( "已有工艺路线") .head(ProcessRoute.class) .needHead(true) .build(); excelWriter.write(list, writeSheet); } os.flush(); } catch (Exception e) { log.error("导出Excel异常", e); throw new RuntimeException("导出Excel异常: " + e.getMessage(), e); } } /** * 获取工艺路线详细信息 * * @param id 主键 */ @SaCheckPermission("system:route:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { return R.ok(iProcessRouteService.queryById(id)); } /** * 新增工艺路线 */ @SaCheckPermission("system:route:add") @Log(title = "工艺路线", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody ProcessRouteBo bo) { return toAjax(iProcessRouteService.insertByBo(bo)); } /**导出 * 修改工艺路线 */ @SaCheckPermission("system:route:edit") @Log(title = "工艺路线", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() public R edit(@Validated(EditGroup.class) @RequestBody ProcessRouteBo bo) { return toAjax(iProcessRouteService.updateByBo(bo)); } /** * 删除工艺路线 * * @param ids 主键串 */ @SaCheckPermission("system:route:remove") @Log(title = "工艺路线", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { return toAjax(iProcessRouteService.deleteWithValidByIds(Arrays.asList(ids), true)); } @Log(title = "明细导入", businessType = BusinessType.IMPORT) @SaCheckPermission("system:route:import") @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R importData(@RequestParam("file") MultipartFile file) throws Exception { String originalFilename = file.getOriginalFilename(); log.info("读取文件名: " + originalFilename); // 读取工艺部分sheet ExcelResult result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class, true); // 读取总装部分sheet ExcelResult result1 = ExcelUtil.importExcelSheet1(file.getInputStream(), ProductionOrderVo.class, true); List list = result1.getList(); if (iProcessRouteService.saveData(result.getList(), list)) { return R.ok("上传物料成功"); } else { return R.fail("导入失败"); } } /** * 查询组焊件集合 */ @Log(title = "查询组焊件集合") @SaCheckPermission("system:route:pushGroupWeldments") @PostMapping("/pushGroupWeldments") public List pushGroupWeldments(@RequestBody ProcessRoute processRoute) { return iProcessRouteService.pushGroupWeldments(processRoute); } /** * 查询需要单独生成BOm 的原材料集合 */ @Log(title = "查询需要单独生成BOM的原材料集合") @SaCheckPermission("system:route:getRawBom") @PostMapping("/getRawBom") public List getRawBom(@RequestParam String rooteProdet) { return iProcessRouteService.getRawBom(rooteProdet); } /** * 查询工艺表中所有的需要做工艺的物料 * * @return * RequestBody List routeVoList */ public List getProcessRouteList(@RequestParam String rooteProdet) { List list = iProcessRouteService.pushRawMater(rooteProdet); return list; } @Log(title = "查询工艺工序集合") @SaCheckPermission("system:route:getProcessRoute") @PostMapping("/getProcessRoute") public List getProcessRoute(@RequestParam String rooteProdet) { return iProcessRouteService.getProcessRoute(rooteProdet); } @Log(title = "推送工艺工序") @SaCheckPermission("system:route:pushRouteBom") @PostMapping("/pushRouteBom") public ProcessRoutePushResultDTO pushRouteBom(@RequestParam String rooteProdet) { return iProcessRouteService.pushRouteBom(rooteProdet); } /** * 查询项目列表 */ @Log(title = "获取所有的项目令号") @SaCheckPermission("system:route:getRawBom") @GetMapping("/getDistinctProjectCodes") public ResponseEntity> getDistinctProjectCodes(String query) { return ResponseEntity.ok(iProcessRouteService.getDistinctProjectCodes(query)); } @Log(title = "获取工序列表") @SaCheckPermission("system:route:getRawBom") @GetMapping("/getProcessInfoList") public ResponseEntity> getProcessInfoList(String query) { return ResponseEntity.ok(iProcessRouteService.getProcessInfoList(query)); } @Log(title = "根据生产令号获取生产编号==》获取计划编号") @SaCheckPermission("system:route:getRawBom") @PostMapping("/getSelecPlanRouteList") public List getSelecPlanRouteList(@RequestParam String rooteProdet) { return iProcessRouteService.getSelecPlanRouteList(rooteProdet); } @Log(title = "生成这个项目的pdf") @SaCheckPermission("system:route:getRawBom") @GetMapping("/generatePDFs") public void generatePDFs(String rooteProdet, HttpServletResponse response) throws IOException { // 调用服务层方法生成 ZIP 文件并获取其路径 String zipFilePath = iProcessRouteService.generatePDFs(rooteProdet); System.out.println("ZIP 文件路径: " + zipFilePath); // 读取文件为字节数组 File zipFile = new File(zipFilePath); if (!zipFile.exists()) { throw new FileNotFoundException("ZIP 文件未找到: " + zipFilePath); } FileInputStream fis = new FileInputStream(zipFile); OutputStream outputStreams = response.getOutputStream(); response.setContentType("application/zip"); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { outputStreams.write(buffer, 0, len); } outputStreams.flush(); fis.close(); outputStreams.close(); } @Log(title = "更新计划时间") @SaCheckPermission("system:route:updateProcessPlan") @PostMapping("/updateProcessPlan") public List updateProcessPlan(@RequestParam String rooteProdet) throws Exception { return iProcessRouteService.updateProcessPlan(rooteProdet); } /** * 更新生产订单的时间 */ @Log(title = "更新生产订单时间") @SaCheckPermission("system:route:updateProcesTime") @PostMapping("/updateProcesTime") public List updateProcesTime(@RequestParam String rooteProdet) throws Exception { return iProcessRouteService.updateProcesTime(rooteProdet); } /** * 保存工艺路线 */ @SaCheckPermission("system:route:addRoute") @Log(title = "保存工艺路线", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/addRoute") public R addRoute(@RequestBody List list) { return iProcessRouteService.addRoute(list); } @SaCheckPermission("system:route:deleteRoute") @Log(title = "删除工艺路线", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/deleteRoute") public List deleteRoute(@RequestBody ProcessRoute processRoute) { return iProcessRouteService.deleteRoute(processRoute); } @Log(title = "获取材料bom列表") @SaCheckPermission("system:route:getRawBom") @PostMapping("/getBomInfo") public ResponseEntity> getProcessMaterialList( @RequestParam(value = "materialCode") String materialCode, @RequestParam(value = "materialName") String materialName, @RequestParam(value = "productionOrderNo") String productionOrderNo) { return ResponseEntity .ok(iProcessRouteService.getProcessMaterialList(materialCode, materialName, productionOrderNo)); } @Log(title = "获取金蝶列表") @SaCheckPermission("system:route:getProcessRouteList") @GetMapping("/getProcessRouteList") public ResponseEntity> getProcessRouteList( @RequestParam(value = "materialCode") String materialCode, @RequestParam(value = "materialName") String materialName, @RequestParam(value = "productionOrderNo") String productionOrderNo) { return ResponseEntity.ok(iProcessRouteService.getProcessRouteList(materialCode, materialName, productionOrderNo)); } @Log(title = "导入时间", businessType = BusinessType.IMPORT) @SaCheckPermission("system:route:importDataTime") @PostMapping(value = "/importDataTime", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R importDataTime(@RequestParam("file") MultipartFile file) throws Exception { String originalFilename = file.getOriginalFilename(); log.info("读取文件名: " + originalFilename); ExcelResult result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class, true); List list = result.getList(); List list1 = iProcessRouteService.importDataTime(list); return R.ok("更新成功"); } @Log(title = "导入时间", businessType = BusinessType.IMPORT) @SaCheckPermission("system:route:importDataTime") @PostMapping(value = "/importDataTime123", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R importDataTime123(@RequestParam("file") MultipartFile file) throws Exception { DefaultExcelListener listener = new DefaultExcelListener<>(true); EasyExcel.read(file.getInputStream(), PcRigidChainVO.class,listener) .excelType(ExcelTypeEnum.XLS).sheet(1).headRowNumber(4).doRead(); List list1 = listener.getExcelResult().getList(); for (PcRigidChainVO pcRigidChainVO : list1) { log.info("数据 ===============>: " + JSONUtil.toJsonStr(pcRigidChainVO)); } return R.ok("更新成功"); } @Log(title = "获取金蝶工艺路线") @SaCheckPermission("system:route:getSelectProcessRoute") @PostMapping("/getSelectProcessRout1e") public List getSelectProcessRoute1(@RequestParam String materilCode) { return iProcessRouteService.getSelectProcessRoute(materilCode); } private void processCombinedDTO(CombinedDTO combinedDTO, List bomDetailsList, List routeList, List materialBoms, String productionOrderNo) { // 处理工序列表 combinedDTO.getProcesses().forEach(process -> { ProcessRoute processRoute = createProcessRoute(process, combinedDTO, productionOrderNo); routeList.add(processRoute); }); // 处理物料清单 combinedDTO.getMaterialUsageDTOList().forEach(materialUsageDTO -> { BomDetails bomDetails = createBomDetails(materialUsageDTO, combinedDTO, productionOrderNo); bomDetailsList.add(bomDetails); }); // 处理材料BOM combinedDTO.getMaterialUsageDTOList().forEach(materialUsageDTO -> { MaterialBom materialBom = creatBomMaterial(materialUsageDTO, combinedDTO, productionOrderNo); materialBoms.add(materialBom); }); } private void processMaterAndRoute(JDMaterialAndRoute materialAndRoute, List bomDetailsList, List routeList, List materialBoms, String productionOrderNo) { // 处理工序列表 materialAndRoute.getPlannedProcessVos().forEach(processRouteDTO -> { ProcessRoute processRoute = createProcessRoute1(processRouteDTO, materialAndRoute, productionOrderNo); routeList.add(processRoute); }); // 处理物料清单 materialAndRoute.getMaterialUseDTOS().forEach(materialUsageDTO -> { BomDetails bomDetails = createBomDetails1(materialUsageDTO, materialAndRoute, productionOrderNo); bomDetailsList.add(bomDetails); }); // 处理材料BOM materialAndRoute.getMaterialUseDTOS().forEach(materialUsageDTO -> { MaterialBom materialBom = creatBomMaterial1(materialUsageDTO, materialAndRoute, productionOrderNo); materialBoms.add(materialBom); }); } private MaterialBom creatBomMaterial1(MaterialUseDTO materialUsageDTO, JDMaterialAndRoute materialAndRoute, String productionOrderNo) { MaterialBom materialBom = new MaterialBom(); materialBom.setProjectNumber(productionOrderNo); materialBom.setParentMaterialCode(materialAndRoute.getMaterialCode()); materialBom.setParentMaterialName(materialAndRoute.getMaterialName()); materialBom.setMaterialCode(materialUsageDTO.getMaterialCode()); materialBom.setMaterialName(materialUsageDTO.getMaterialName()); materialBom.setUnit(materialUsageDTO.getChildUnit()); materialBom.setMaterialType(materialUsageDTO.getCaizhi()); //保留四位小数 materialBom.setQuantity( new BigDecimal(materialUsageDTO.getFenzi()).divide(new BigDecimal(materialUsageDTO.getFenmu()),2, RoundingMode.HALF_UP)); return materialBom; } private BomDetails createBomDetails1(MaterialUseDTO materialUsageDTO, JDMaterialAndRoute materialAndRoute, String productionOrderNo) { BomDetails bomDetails = new BomDetails(); bomDetails.setTotalWeight(productionOrderNo); bomDetails.setFNumber(materialAndRoute.getMaterialCode()); bomDetails.setFName(materialAndRoute.getMaterialName()); bomDetails.setPartNumber(materialUsageDTO.getMaterialCode()); bomDetails.setUnitWeight("是"); //子项分子 bomDetails.setQuantity(Double.valueOf(materialUsageDTO.getFenzi())); //子项分母 bomDetails.setDenominator(Double.valueOf(materialUsageDTO.getFenmu())); bomDetails.setName(materialUsageDTO.getMaterialName()); /* if (materialUsageDTO.getItemType().equals("1")){ bomDetails.setStats("外购"); }else{ bomDetails.setStats("自制"); }*/ bomDetails.setMaterial(materialUsageDTO.getCaizhi()); return bomDetails; } private ProcessRoute createProcessRoute1(ProcessRouteDTO processRouteDTO, JDMaterialAndRoute materialAndRoute, String productionOrderNo) { ProcessRoute processRoute = new ProcessRoute(); // 设置路线描述为生产订单号 processRoute.setRouteDescription(productionOrderNo); // 设置工序号 processRoute.setProcessNo(processRouteDTO.getProcessNo()); // 设置工序名称 processRoute.setProcessName(processRouteDTO.getProcessName()); processRoute.setDiscWeight(Double.valueOf(materialAndRoute.getDanzhong())); processRoute.setMaterial(materialAndRoute.getCaizhi()); // 设置物料代码 processRoute.setMaterialCode(materialAndRoute.getMaterialCode()); processRoute.setMaterialName(materialAndRoute.getMaterialName()); processRoute.setWorkCenter(processRouteDTO.getWorkCenter()); // 基本时长 processRoute.setActivityDuration(processRouteDTO.getActivityDuration()); processRoute.setProcessDescription(processRouteDTO.getProcessDescription()); processRoute.setProcessControl(processRouteDTO.getProcessControl()); processRoute.setXuStartTime(null); processRoute.setXuEndTime(null); processRoute.setActivityUnit("分"); // 本批数量对应 processRoute.setBatchQuantity(materialAndRoute.getBenpi()); processRoute.setFirstBatchQuantity(Double.valueOf(materialAndRoute.getDantai())); List materialUsageDTOList = materialAndRoute.getMaterialUseDTOS(); for (MaterialUseDTO materialUsageDTO : materialUsageDTOList) { processRoute.setUnitQuantity(Double.valueOf(materialUsageDTO.getFenzi())); processRoute.setRawMaterialCode(materialUsageDTO.getMaterialCode()); processRoute.setRawMaterialName(materialUsageDTO.getMaterialName()); processRoute.setBomUnit(materialUsageDTO.getChildUnit()); if (materialUsageDTO.getChildUnit().equals("根")) { processRoute.setDiscUsage(Double.valueOf(materialUsageDTO.getFenmu())); } else { processRoute.setDiscUsage((double) (materialUsageDTO.getFenzi() / materialUsageDTO.getFenmu())); } processRoute.setMaterial(materialUsageDTO.getCaizhi()); } return processRoute; } @Log(title = "生成金蝶标准工艺") @SaCheckPermission("system:route:getKindeeExcel") @GetMapping("/getKindeeExcel") public ResponseEntity getKindeeExcel(String rooteProdet) throws IOException { List planRouteList = iProcessRouteService.getSelecPlanRouteList(rooteProdet); List bomDetailsList = new ArrayList<>(); List routeList = new ArrayList<>(); List materialBoms = new ArrayList<>(); // 将数据写入excel 中 for (CombinedDTO combinedDTO : planRouteList) { processCombinedDTO(combinedDTO, bomDetailsList, routeList, materialBoms, rooteProdet); } // 批量插入数据库 try { bomDetailsMapper.insertBatch(bomDetailsList); baseMapper.insertBatch(routeList); materialBomMapper.insertBatch(materialBoms); return ResponseEntity.ok("保存成功"); } catch (Exception e) { // 处理异常并返回失败信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("保存失败: " + e.getMessage()); } } private ProcessRoute createProcessRoute(PlannedProcessVo process, CombinedDTO combinedDTO, String productionOrderNo) { ProcessRoute processRoute = new ProcessRoute(); // 设置路线描述为生产订单号 processRoute.setRouteDescription(productionOrderNo); // 设置工序号 processRoute.setProcessNo(process.getFOperNumber()); // 设置工序名称 processRoute.setProcessName(process.getFProcessName()); String materialCode = combinedDTO.getMaterialCode(); try { List singleWeightList = iProcessRouteService.getSingleWeght(materialCode); if (singleWeightList != null && !singleWeightList.isEmpty()) { processRoute.setDiscWeight(singleWeightList.get(0).getDiscWeight()); } } catch (Exception e) { // 记录日志或采取其他措施 log.error("Error fetching single weight for material code: " + materialCode, e); } // 设置物料代码 processRoute.setMaterialCode(combinedDTO.getMaterialCode()); processRoute.setMaterialName(combinedDTO.getMaterialName()); Double fOperQty = process.getFOperQty(); long l = fOperQty.longValue(); processRoute.setWorkCenter(process.getFWorkCenterName()); // 基本时长 processRoute.setActivityDuration(process.getFActivity1BaseQty()); processRoute.setProcessDescription(process.getFOperDescription()); processRoute.setProcessControl(process.getFOptCtrlCodeIFName()); processRoute.setXuStartTime(process.getFSeqPlanStartTime()); processRoute.setXuEndTime(process.getFSeqPlanFinishTime()); processRoute.setActivityUnit("分"); // 本批数量对应 processRoute.setBatchQuantity(process.getFMOQty()); List materialUsageDTOList = combinedDTO.getMaterialUsageDTOList(); for (MaterialUsageDTO materialUsageDTO : materialUsageDTOList) { processRoute.setUnitQuantity(materialUsageDTO.getFNumerator()); processRoute.setRawMaterialCode(materialUsageDTO.getMaterialCode()); processRoute.setRawMaterialName(materialUsageDTO.getMaterialName()); processRoute.setBomUnit(materialUsageDTO.getUnit()); if (materialUsageDTO.getUnit().equals("根")) { processRoute.setDiscUsage(materialUsageDTO.getFDenominator()); } else { processRoute.setDiscUsage(materialUsageDTO.getFNumerator() / materialUsageDTO.getFDenominator()); } processRoute.setMaterial(materialUsageDTO.getChildMaterial()); } return processRoute; } private BomDetails createBomDetails(MaterialUsageDTO materialUsageDTO, CombinedDTO combinedDTO, String productionOrderNo) { BomDetails bomDetails = new BomDetails(); bomDetails.setTotalWeight(productionOrderNo); bomDetails.setFNumber(combinedDTO.getMaterialCode()); bomDetails.setFName(combinedDTO.getMaterialName()); bomDetails.setPartNumber(materialUsageDTO.getMaterialCode()); bomDetails.setUnitWeight("是"); //子项分子 bomDetails.setQuantity(materialUsageDTO.getFNumerator()); //子项分母 bomDetails.setDenominator(materialUsageDTO.getFDenominator()); bomDetails.setName(materialUsageDTO.getMaterialName()); if (materialUsageDTO.getItemType().equals("1")){ bomDetails.setStats("外购"); }else{ bomDetails.setStats("自制"); } bomDetails.setMaterial(materialUsageDTO.getChildMaterial()); return bomDetails; } private MaterialBom creatBomMaterial(MaterialUsageDTO materialUsageDTO, CombinedDTO combinedDTO, String productionOrderNo) { MaterialBom materialBom = new MaterialBom(); materialBom.setProjectNumber(productionOrderNo); materialBom.setParentMaterialCode(combinedDTO.getMaterialCode()); materialBom.setParentMaterialName(combinedDTO.getMaterialName()); materialBom.setMaterialCode(materialUsageDTO.getMaterialCode()); materialBom.setMaterialName(materialUsageDTO.getMaterialName()); materialBom.setUnit(materialUsageDTO.getUnit()); materialBom.setMaterialType(materialUsageDTO.getItemType()); materialBom.setQuantity(BigDecimal.valueOf(materialUsageDTO.getFNumerator())); return materialBom; } /** * 导出工艺路线列表 */ @SaCheckPermission("system:route:getAllRouteAndUse") @Log(title = "获取全部工艺路线和物料清单", businessType = BusinessType.OTHER) @PostMapping("/getAllRouteAndUse") public void getAllRouteAndUse(@RequestParam("rooteProdet") String rooteProdet) { log.info("获取项目生产数据表:{}", rooteProdet); // 下载Excel模板 SmbUtil.downloadExcelFiles(rooteProdet); // 构建Excel文件路径 String ExcelName = "D:\\file\\" + rooteProdet + "汇总表.xlsx"; File file = new File(ExcelName); if (!file.exists()) { throw new ServiceException("文件不存在,请确认路径是否正确"); } List processRoutes = new ArrayList<>(); //读取file的所有的物料编码 try { if (file.exists()) { // 读取Excel的sheet6 从第三行开始 读取到第4列 无数据的跳过 DefaultExcelListener listener = new DefaultExcelListener<>(true); EasyExcel.read(ExcelName, ProcessRouteVo.class, listener) .sheet(6) .headRowNumber(3) .doRead(); List list = listener.getExcelResult().getList(); List list1 = iProcessRouteService.getProcessRouteGD(list); List bomDetailsList = new ArrayList<>(); List routeList = new ArrayList<>(); List materialBoms = new ArrayList<>(); for (JDMaterialAndRoute materialAndRoute : list1) { processMaterAndRoute(materialAndRoute, bomDetailsList, routeList, materialBoms, rooteProdet); } bomDetailsMapper.insertBatch(bomDetailsList); baseMapper.insertBatch(routeList); materialBomMapper.insertBatch(materialBoms); } } catch (Exception e) { throw new RuntimeException(e); } } }