evoToK3Cloud/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java
tzy b297a172fe feat(common): 添加 SMB 文件传输工具类
- 新增 SmbUtil 类,实现 SMB 协议的文件下载功能
- 优化 ExcelUtil 类,增加多个 Sheet 的导出方法
- 更新 BomDetailsController,改进 BOM 校验逻辑
- 调整 WxRobotUtil 类的代码格式
2025-05-20 08:48:06 +08:00

888 lines
40 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<ProcessRouteVo> list2(ProcessRouteBo bo, PageQuery pageQuery) {
try {
// 查询工艺路线数据
TableDataInfo<ProcessRouteVo> processRouteVoTableDataInfo = iProcessRouteService.queryPageList2(bo,
pageQuery);
// 用于存储父子关系的Mapkey为"物料编码_物料名称"值为父级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);
// 用于存储父子关系的Mapkey为"物料编码_物料名称"值为父级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("/export2")
public void export2(ProcessRouteBo bo, HttpServletResponse response) {
log.info("获取项目生产数据表:{}", bo);
List<ProcessRoute> list = iProcessRouteService.queryList(bo);
List<MaterialUsageDTO2> 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<ProcessRoute> listener = new DefaultExcelListener<>(true);
EasyExcel.read(ExcelName, ProcessRoute.class,listener)
.sheet(6)
.headRowNumber(3)
.doRead();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
// 查询要写入的数据是否
List<ProcessRoute> 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的第七个sheetindex=6
try (com.alibaba.excel.ExcelWriter excelWriter = EasyExcel.write(os)
.withTemplate(file) // 指定模板文件
.autoCloseStream(true)
.build()) {
// 写入到第七个 sheetindex=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<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) throws Exception {
return iProcessRouteService.updateProcessPlan(rooteProdet);
}
/**
* 更新生产订单的时间
*/
@Log(title = "更新生产订单时间")
@SaCheckPermission("system:route:updateProcesTime")
@PostMapping("/updateProcesTime")
public List<Model> updateProcesTime(@RequestParam String rooteProdet) throws Exception {
return iProcessRouteService.updateProcesTime(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 = "导入时间", businessType = BusinessType.IMPORT)
@SaCheckPermission("system:route:importDataTime")
@PostMapping(value = "/importDataTime123", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importDataTime123(@RequestParam("file") MultipartFile file) throws Exception {
DefaultExcelListener<PcRigidChainVO> listener = new DefaultExcelListener<>(true);
EasyExcel.read(file.getInputStream(), PcRigidChainVO.class,listener) .excelType(ExcelTypeEnum.XLS).sheet(1).headRowNumber(4).doRead();
List<PcRigidChainVO> 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<ProcessRouteSelectDTO> getSelectProcessRoute1(@RequestParam String materilCode) {
return iProcessRouteService.getSelectProcessRoute(materilCode);
}
private void processCombinedDTO(CombinedDTO combinedDTO, List<BomDetails> bomDetailsList, List<ProcessRoute> routeList, List<MaterialBom> 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<BomDetails> bomDetailsList, List<ProcessRoute> routeList, List<MaterialBom> 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<MaterialUseDTO> 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<String> getKindeeExcel(String rooteProdet) throws IOException {
List<CombinedDTO> planRouteList = iProcessRouteService.getSelecPlanRouteList(rooteProdet);
List<BomDetails> bomDetailsList = new ArrayList<>();
List<ProcessRoute> routeList = new ArrayList<>();
List<MaterialBom> 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<ProcessRoute> 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<MaterialUsageDTO> 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<ProcessRoute> processRoutes = new ArrayList<>();
//读取file的所有的物料编码
try {
if (file.exists()) {
// 读取Excel的sheet6 从第三行开始 读取到第4列 无数据的跳过
DefaultExcelListener<ProcessRouteVo> listener = new DefaultExcelListener<>(true);
EasyExcel.read(ExcelName, ProcessRouteVo.class, listener)
.sheet(6)
.headRowNumber(3)
.doRead();
List<ProcessRouteVo> list = listener.getExcelResult().getList();
List<JDMaterialAndRoute> list1 = iProcessRouteService.getProcessRouteGD(list);
List<BomDetails> bomDetailsList = new ArrayList<>();
List<ProcessRoute> routeList = new ArrayList<>();
List<MaterialBom> 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);
}
}
}