package com.ruoyi.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; 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.ExcelResult; import com.ruoyi.common.utils.HttpRequestUtil; import com.ruoyi.common.utils.WxRobotUtil; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.MaterialBom; import com.ruoyi.system.domain.ProcessRoute; import com.ruoyi.system.domain.ProductionRouteTwo; import com.ruoyi.system.domain.bo.ProcessRouteBo; import com.ruoyi.system.domain.dto.*; import com.ruoyi.system.jdmain.rouplan.Model; import com.ruoyi.system.domain.vo.ProcessRouteVo; import com.ruoyi.system.domain.vo.ProductionOrderVo; import com.ruoyi.system.service.IProcessRouteService; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpHeaders; 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.nio.file.Files; import java.util.*; /** * 工艺路线 * * @date 2024-10-09 */ @Validated @RequiredArgsConstructor @RestController @RequestMapping("/system/route") public class ProcessRouteController extends BaseController { private final IProcessRouteService iProcessRouteService; private static final Logger log = LoggerFactory.getLogger(ProcessRouteController.class); 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("/export") public void export(ProcessRouteBo bo, HttpServletResponse response) { List list = iProcessRouteService.queryList(bo); ExcelUtil.exportExcel(list, "工艺路线", ProcessRouteVo.class, response); } /** * 获取工艺路线详细信息 * * @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) { return iProcessRouteService.updateProcessPlan(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 = "获取金蝶工艺路线") @SaCheckPermission("system:route:getSelectProcessRoute") @PostMapping("/getSelectProcessRoute") public List getSelectProcessRoute(@RequestParam String materilCode) { return iProcessRouteService.getSelectProcessRoute(materilCode); } }