- 新增 SmbUtil 类,实现 SMB 协议的文件下载功能 - 优化 ExcelUtil 类,增加多个 Sheet 的导出方法 - 更新 BomDetailsController,改进 BOM 校验逻辑 - 调整 WxRobotUtil 类的代码格式
888 lines
40 KiB
Java
888 lines
40 KiB
Java
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);
|
||
// 用于存储父子关系的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("/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的第七个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<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);
|
||
}
|
||
}
|
||
}
|