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