package com.ruoyi.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; 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.poi.ExcelUtil; import com.ruoyi.system.domain.MaterialBom; import com.ruoyi.system.domain.ProcessRoute; import com.ruoyi.system.domain.bo.ProcessRouteBo; import com.ruoyi.system.domain.dto.CombinedDTO; import com.ruoyi.system.jdmain.rouplan.Model; import com.ruoyi.system.domain.dto.ProcessRouteXuDTO; 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.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.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.*; /** * 工艺路线 * * @author ruoyi * @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("/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.setRawMaterialCode(processRouteVo.getRawMaterialCode()); parent.setRawMaterialName(processRouteVo.getRawMaterialName()); parent.setDiscUsage(processRouteVo.getDiscUsage()); parent.setBomUnit(processRouteVo.getBomUnit()); parent.setBomMaterial(processRouteVo.getBomMaterial()); parent.setProcessNo(processRouteVo.getProcessNo()); parent.setWorkCenter(processRouteVo.getWorkCenter()); parent.setProcessName(processRouteVo.getProcessName()); parent.setProcessDescription(processRouteVo.getProcessDescription()); parent.setProcessControl(processRouteVo.getProcessControl()); parent.setActivityDuration(processRouteVo.getActivityDuration()); parent.setActivityUnit(processRouteVo.getActivityUnit()); parent.setUnitQuantity(processRouteVo.getUnitQuantity()); parent.setBatchQuantity(processRouteVo.getBatchQuantity()); parent.setFirstBatchQuantity(processRouteVo.getFirstBatchQuantity()); parent.setPlanStartTime(processRouteVo.getPlanStartTime()); parent.setPlanEndTime(processRouteVo.getPlanEndTime()); parent.setXuStartTime(processRouteVo.getXuStartTime()); parent.setXuEndTime(processRouteVo.getXuEndTime());*/ // 初始化子节点列表 parent.setChildren(new ArrayList<>()); // 将父节点放入Map中 routeMap.put(parentCodeAndName, parent); // 将父节点加入顶级列表 topLevelList.add(parent); } // 创建子节点,并将其添加到父节点的子集 ProcessRouteVo child = createChildVo(processRouteVo, parent.getId()); 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) { ProcessRouteVo child = new ProcessRouteVo(); child.setId(processRouteVo.getId()); child.setParentId(parentId); /* child.setMaterialCode(processRouteVo.getMaterialCode()); child.setMaterialName(processRouteVo.getMaterialName()); child.setMaterial(processRouteVo.getMaterial()); child.setDiscWeight(processRouteVo.getDiscWeight()); child.setRawMaterialCode(processRouteVo.getRawMaterialCode()); child.setRawMaterialName(processRouteVo.getRawMaterialName()); child.setDiscUsage(processRouteVo.getDiscUsage()); child.setBomUnit(processRouteVo.getBomUnit()); child.setBomMaterial(processRouteVo.getBomMaterial());*/ 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.setBatchQuantity(processRouteVo.getBatchQuantity()); child.setFirstBatchQuantity(processRouteVo.getFirstBatchQuantity()); 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); ExcelResult result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class, true); 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:getProcessRoute") @PostMapping("/pushRouteBom") public List 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") @PostMapping("/generatePDFs") public List generatePDFs(@RequestParam String rooteProdet) { return iProcessRouteService.generatePDFs(rooteProdet); } @Log(title = "更新计划时间") @SaCheckPermission("system:route:updateProcessPlan") @PostMapping("/updateProcessPlan") public List updateProcessPlan(@RequestParam String rooteProdet) { return iProcessRouteService.updateProcessPlan(rooteProdet); } /** * 保存工艺路线 */ @SaCheckPermission("system:route:add") @Log(title = "保存工艺路线", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/addRoute") public R addRoute( @RequestBody List list) { return toAjax(iProcessRouteService.addRoute(list)); } @SaCheckPermission("system:route:add") @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("/getProcessMaterialList") public ResponseEntity> getProcessMaterialList(@RequestBody ProcessRoute processRoute) { return ResponseEntity.ok(iProcessRouteService.getProcessMaterialList(processRoute)); } }