451 lines
20 KiB
Java
451 lines
20 KiB
Java
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<ProcessRouteVo> list2(ProcessRouteBo bo, PageQuery pageQuery) {
|
||
try {
|
||
// 查询工艺路线数据
|
||
TableDataInfo<ProcessRouteVo> processRouteVoTableDataInfo = iProcessRouteService.queryPageList2(bo,
|
||
pageQuery);
|
||
// 用于存储父子关系的Map,key为"物料编码_物料名称",值为父级ProcessRouteVo
|
||
Map<String, ProcessRouteVo> routeMap = new HashMap<>();
|
||
// 存储顶级列表
|
||
List<ProcessRouteVo> topLevelList = new ArrayList<>();
|
||
// 获取查询返回的行数据
|
||
List<ProcessRouteVo> 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<ProcessRouteVo> list(ProcessRouteBo bo, PageQuery pageQuery) {
|
||
try {
|
||
// 查询工艺路线数据
|
||
TableDataInfo<ProcessRouteVo> processRouteVoTableDataInfo = iProcessRouteService.queryPageList(bo,
|
||
pageQuery);
|
||
// 用于存储父子关系的Map,key为"物料编码_物料名称",值为父级ProcessRouteVo
|
||
Map<String, ProcessRouteVo> routeMap = new HashMap<>();
|
||
// 存储顶级列表
|
||
List<ProcessRouteVo> topLevelList = new ArrayList<>();
|
||
// 获取查询返回的行数据
|
||
List<ProcessRouteVo> 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<ProcessRouteVo> list = iProcessRouteService.queryList(bo);
|
||
ExcelUtil.exportExcel(list, "工艺路线", ProcessRouteVo.class, response);
|
||
}
|
||
|
||
/**
|
||
* 获取工艺路线详细信息
|
||
*
|
||
* @param id 主键
|
||
*/
|
||
@SaCheckPermission("system:route:query")
|
||
@GetMapping("/{id}")
|
||
public R<ProcessRouteVo> 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<Void> 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<Void> 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<Void> 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<Void> importData(@RequestParam("file") MultipartFile file) throws Exception {
|
||
String originalFilename = file.getOriginalFilename();
|
||
log.info("读取文件名: " + originalFilename);
|
||
//读取工艺部分sheet
|
||
ExcelResult<ProcessRouteVo> result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class,
|
||
true);
|
||
//读取总装部分sheet
|
||
ExcelResult<ProductionOrderVo> result1 = ExcelUtil.importExcelSheet1(file.getInputStream(),
|
||
ProductionOrderVo.class, true);
|
||
List<ProductionOrderVo> 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<ProcessRoute> pushGroupWeldments(@RequestBody ProcessRoute processRoute) {
|
||
return iProcessRouteService.pushGroupWeldments(processRoute);
|
||
}
|
||
|
||
/**
|
||
* 查询需要单独生成BOm 的原材料集合
|
||
*/
|
||
@Log(title = "查询需要单独生成BOM的原材料集合")
|
||
@SaCheckPermission("system:route:getRawBom")
|
||
@PostMapping("/getRawBom")
|
||
public List<ProcessRoute> getRawBom(@RequestParam String rooteProdet) {
|
||
return iProcessRouteService.getRawBom(rooteProdet);
|
||
}
|
||
|
||
/**
|
||
* 查询工艺表中所有的需要做工艺的物料
|
||
*
|
||
* @return
|
||
* RequestBody List<ProcessRouteVo> routeVoList
|
||
*/
|
||
public List<ProcessRoute> getProcessRouteList(@RequestParam String rooteProdet) {
|
||
List<ProcessRoute> list = iProcessRouteService.pushRawMater(rooteProdet);
|
||
return list;
|
||
}
|
||
|
||
@Log(title = "查询工艺工序集合")
|
||
@SaCheckPermission("system:route:getProcessRoute")
|
||
@PostMapping("/getProcessRoute")
|
||
public List<ProcessRouteXuDTO> 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<List<String>> getDistinctProjectCodes(String query) {
|
||
return ResponseEntity.ok(iProcessRouteService.getDistinctProjectCodes(query));
|
||
}
|
||
|
||
@Log(title = "获取工序列表")
|
||
@SaCheckPermission("system:route:getRawBom")
|
||
@GetMapping("/getProcessInfoList")
|
||
public ResponseEntity<List<String>> getProcessInfoList(String query) {
|
||
return ResponseEntity.ok(iProcessRouteService.getProcessInfoList(query));
|
||
}
|
||
|
||
@Log(title = "根据生产令号获取生产编号==》获取计划编号")
|
||
@SaCheckPermission("system:route:getRawBom")
|
||
@PostMapping("/getSelecPlanRouteList")
|
||
public List<CombinedDTO> 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<Model> updateProcessPlan(@RequestParam String rooteProdet) {
|
||
return iProcessRouteService.updateProcessPlan(rooteProdet);
|
||
}
|
||
|
||
/**
|
||
* 保存工艺路线
|
||
*/
|
||
@SaCheckPermission("system:route:addRoute")
|
||
@Log(title = "保存工艺路线", businessType = BusinessType.INSERT)
|
||
@RepeatSubmit()
|
||
@PostMapping("/addRoute")
|
||
public R<Void> addRoute(@RequestBody List<ProcessRouteVo> list) {
|
||
|
||
return iProcessRouteService.addRoute(list);
|
||
}
|
||
|
||
@SaCheckPermission("system:route:deleteRoute")
|
||
@Log(title = "删除工艺路线", businessType = BusinessType.INSERT)
|
||
@RepeatSubmit()
|
||
@PostMapping("/deleteRoute")
|
||
public List<ProcessRoute> deleteRoute(@RequestBody ProcessRoute processRoute) {
|
||
return iProcessRouteService.deleteRoute(processRoute);
|
||
}
|
||
|
||
@Log(title = "获取材料bom列表")
|
||
@SaCheckPermission("system:route:getRawBom")
|
||
@PostMapping("/getBomInfo")
|
||
public ResponseEntity<List<MaterialBom>> 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<List<ProcessRouteJdDTO> >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<Void> importDataTime(@RequestParam("file") MultipartFile file) throws Exception {
|
||
String originalFilename = file.getOriginalFilename();
|
||
log.info("读取文件名: " + originalFilename);
|
||
ExcelResult<ProcessRouteVo> result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class,
|
||
true);
|
||
List<ProcessRouteVo> list = result.getList();
|
||
List<ProcessRoute> list1 = iProcessRouteService.importDataTime(list);
|
||
return R.ok("更新成功");
|
||
}
|
||
|
||
@Log(title = "获取金蝶工艺路线")
|
||
@SaCheckPermission("system:route:getSelectProcessRoute")
|
||
@PostMapping("/getSelectProcessRoute")
|
||
public List<ProcessRouteSelectDTO> getSelectProcessRoute(@RequestParam String materilCode) {
|
||
return iProcessRouteService.getSelectProcessRoute(materilCode);
|
||
}
|
||
|
||
}
|