From 3edf8c4fc07f9784e2d04ee7a98692bb457749eb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 26 十月 2026 16:28:10 +0800
Subject: [PATCH] feat(mes): 新增工艺路线完整导入功能并优化相关验证
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteController.java | 89 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 89 insertions(+), 0 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteController.java
index 02191d3..648556e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteController.java
@@ -7,11 +7,18 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteImportExcelVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteImportRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteCompleteImportWorkbook;
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRoutePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteCompleteImportService;
+import cn.idev.excel.ExcelWriter;
+import cn.idev.excel.FastExcelFactory;
+import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
@@ -22,8 +29,11 @@
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -38,6 +48,8 @@
@Resource
private MesProRouteService routeService;
+ @Resource
+ private MesProRouteCompleteImportService completeImportService;
@PostMapping("/create")
@Operation(summary = "鍒涘缓宸ヨ壓璺嚎")
@@ -113,4 +125,81 @@
ExcelUtils.write(response, "宸ヨ壓璺嚎.xls", "鏁版嵁", MesProRouteRespVO.class, data);
}
+ @GetMapping("/get-import-template")
+ @Operation(summary = "鑾峰緱宸ヨ壓璺嚎瀵煎叆妯℃澘")
+ @PreAuthorize("@ss.hasPermission('mes:pro-route:import')")
+ public void importTemplate(HttpServletResponse response) throws IOException {
+ // 鎵嬪姩鍒涘缓瀵煎嚭 demo
+ List<MesProRouteImportExcelVO> list = Collections.singletonList(
+ MesProRouteImportExcelVO.builder()
+ .code("ROUTE001").name("绀轰緥宸ヨ壓璺嚎").description("").remark("").build()
+ );
+ // 杈撳嚭
+ ExcelUtils.write(response, "宸ヨ壓璺嚎瀵煎叆妯℃澘.xls", "宸ヨ壓璺嚎鍒楄〃", MesProRouteImportExcelVO.class, list);
+ }
+
+ @PostMapping("/import")
+ @Operation(summary = "瀵煎叆宸ヨ壓璺嚎")
+ @Parameters({
+ @Parameter(name = "file", description = "Excel 鏂囦欢", required = true),
+ @Parameter(name = "updateSupport", description = "鏄惁鏀寔鏇存柊锛岄粯璁や负 false", example = "true")
+ })
+ @PreAuthorize("@ss.hasPermission('mes:pro-route:import')")
+ public CommonResult<MesProRouteImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
+ @RequestParam(value = "updateSupport", required = false,
+ defaultValue = "false") Boolean updateSupport) throws Exception {
+ List<MesProRouteImportExcelVO> list = ExcelUtils.read(file, MesProRouteImportExcelVO.class);
+ return success(routeService.importRouteList(list, updateSupport));
+ }
+
+ @GetMapping("/get-complete-import-template")
+ @Operation(summary = "鑾峰緱瀹屾暣宸ヨ壓璺嚎鎵归噺瀵煎叆妯℃澘")
+ @PreAuthorize("@ss.hasPermission('mes:pro-route:import')")
+ public void completeImportTemplate(HttpServletResponse response) throws IOException {
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.addHeader("Content-Disposition", "attachment;filename=" + HttpUtils.encodeUtf8("瀹屾暣宸ヨ壓璺嚎瀵煎叆妯℃澘.xlsx"));
+ ExcelWriter writer = FastExcelFactory.write(response.getOutputStream()).autoCloseStream(false).build();
+ try {
+ writer.write(Collections.emptyList(), FastExcelFactory.writerSheet(0, "璺嚎")
+ .head(MesProRouteCompleteImportWorkbook.RouteRow.class).build());
+ writer.write(Collections.emptyList(), FastExcelFactory.writerSheet(1, "浜у搧")
+ .head(MesProRouteCompleteImportWorkbook.ProductRow.class).build());
+ writer.write(Collections.emptyList(), FastExcelFactory.writerSheet(2, "宸ュ簭")
+ .head(MesProRouteCompleteImportWorkbook.ProcessRow.class).build());
+ writer.write(Collections.emptyList(), FastExcelFactory.writerSheet(3, "宸ュ簭浜у嚭")
+ .head(MesProRouteCompleteImportWorkbook.OutputRow.class).build());
+ writer.write(Collections.emptyList(), FastExcelFactory.writerSheet(4, "宸ュ簭鎶曟枡")
+ .head(MesProRouteCompleteImportWorkbook.InputRow.class).build());
+ writer.write(List.of(
+ new MesProRouteCompleteImportWorkbook.GuideRow("璺嚎", "姣忚涓�鏉¤矾绾匡紱璺嚎缂栫爜鍞竴銆傚畬鏁村鍏ヤ粎鏂板锛屽凡鏈夌紪鐮佷細鎶ラ敊锛屽鍏ュ悗榛樿鍋滅敤銆�"),
+ new MesProRouteCompleteImportWorkbook.GuideRow("浜у搧", "璺嚎缂栫爜涓庤矾绾胯〃涓�鑷达紱姣忔潯璺嚎鑷冲皯涓�涓骇鍝併�傜墿鏂欍�佷粨搴撱�佸簱鍖恒�佸簱浣嶅~鍐欏凡鏈変笟鍔$紪鐮侊紱鏃堕棿鍗曚綅濉� MINUTE/HOUR/DAY銆�"),
+ new MesProRouteCompleteImportWorkbook.GuideRow("宸ュ簭", "姣忔潯璺嚎鑷冲皯涓�閬撳伐搴忥紱宸ュ簭缂栫爜椤诲凡瀛樺湪锛屾帓搴忓敮涓�銆傚竷灏斿瓧娈靛~鏄垨鍚︼紱鍏崇郴濉� 0=寮�濮�-寮�濮嬨��1=缁撴潫-缁撴潫銆�2=寮�濮�-缁撴潫銆�3=缁撴潫-寮�濮嬨��"),
+ new MesProRouteCompleteImportWorkbook.GuideRow("宸ュ簭浜у嚭", "鎸夎矾绾跨紪鐮佸拰宸ュ簭缂栫爜鍏宠仈锛涘綊灞炰骇鍝佺紪鐮佺暀绌鸿〃绀哄浜у搧閫氱敤銆傛湯閬撳伐搴忓簲閰嶇疆鍏ㄩ儴鎴愬搧銆�"),
+ new MesProRouteCompleteImportWorkbook.GuideRow("宸ュ簭鎶曟枡", "鎸夎矾绾裤�佸伐搴忓拰褰掑睘浜у搧缂栫爜鍏宠仈锛涙姇鏂欑墿鏂欓』宸插湪璇ヤ骇鍝� BOM 涓��")
+ ), FastExcelFactory.writerSheet(5, "濉啓璇存槑")
+ .head(MesProRouteCompleteImportWorkbook.GuideRow.class).build());
+ } finally {
+ writer.finish();
+ }
+ }
+
+ @PostMapping("/import-complete")
+ @Operation(summary = "鎵归噺瀵煎叆瀹屾暣宸ヨ壓璺嚎锛堝宸ヤ綔琛級")
+ @PreAuthorize("@ss.hasPermission('mes:pro-route:import')")
+ public CommonResult<MesProRouteImportRespVO> importComplete(@RequestParam("file") MultipartFile file) throws IOException {
+ MesProRouteCompleteImportWorkbook workbook = new MesProRouteCompleteImportWorkbook();
+ workbook.setRoutes(readSheet(file, 0, MesProRouteCompleteImportWorkbook.RouteRow.class));
+ workbook.setProducts(readSheet(file, 1, MesProRouteCompleteImportWorkbook.ProductRow.class));
+ workbook.setProcesses(readSheet(file, 2, MesProRouteCompleteImportWorkbook.ProcessRow.class));
+ workbook.setOutputs(readSheet(file, 3, MesProRouteCompleteImportWorkbook.OutputRow.class));
+ workbook.setInputs(readSheet(file, 4, MesProRouteCompleteImportWorkbook.InputRow.class));
+ return success(completeImportService.importRoutes(workbook));
+ }
+
+ private <T> List<T> readSheet(MultipartFile file, int index, Class<T> type) throws IOException {
+ try (InputStream input = file.getInputStream()) {
+ return FastExcelFactory.read(input, type, null).autoCloseStream(false).sheet(index).doReadSync();
+ }
+ }
+
}
--
Gitblit v1.9.3