From fd58eac9c45b19300135d84b1d22013466807a96 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期日, 20 九月 2026 13:52:51 +0800
Subject: [PATCH] feat(inspect): 完善检验报告功能与数据处理 - 添加重新生成报告的功能接口 - 优化管理员权限判断逻辑,允许管理员查看全部待复核任务 - 改进Excel数据解析逻辑,支持合并单元格的坐标计算 - 完善直绑模板订单的检验结果处理机制 - 优化报告下载接口,支持按报告类型选择 - 提升附件上传大小限制至200MB

---
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java       |   19 ++
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java             |    6 
 inspect-server/src/main/resources/mapper/InsReportMapper.xml                             |    5 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java    |   87 +++++++---
 inspect-server/src/main/resources/static/inspection-report-template-v2.docx              |    0 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java               |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java                       |    6 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java          |    5 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java          |    2 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java   |    5 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java |  320 +++++++++++++++++++++++++++++++++------
 11 files changed, 370 insertions(+), 88 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
index dc38f4b..f14bb35 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
@@ -244,8 +244,8 @@
     @Override
     public StandardMethodAttachment uploadAttachment(Integer standardMethodId, MultipartFile file) {
         if (standardMethodMapper.selectById(standardMethodId) == null) throw new BaseException("鏍囧噯涓嶅瓨鍦�");
-        if (file == null || file.isEmpty() || file.getSize() > 10 * 1024 * 1024)
-            throw new BaseException("闄勪欢涓嶈兘涓虹┖涓斾笉鑳借秴杩�10MB");
+        if (file == null || file.isEmpty() || file.getSize() > 200L * 1024 * 1024)
+            throw new BaseException("闄勪欢涓嶈兘涓虹┖涓斾笉鑳借秴杩�200MB");
         String originalName = file.getOriginalFilename();
         if (originalName == null || !originalName.matches("(?i).+\\.(jpg|jpeg|png|gif|doc|docx|xls|xlsx|ppt|pptx|pdf|zip|rar)$"))
             throw new BaseException("涓嶆敮鎸佺殑闄勪欢鏍煎紡");
@@ -391,7 +391,6 @@
     }
 
 }
-
 
 
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java
index 1fef16d..06a045e 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsReportController.java
@@ -10,6 +10,7 @@
 import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.dto.ReportPageDto;
+import com.ruoyi.inspect.service.InsOrderPlanService;
 import com.ruoyi.inspect.service.InsReportService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,6 +38,9 @@
 
     @Resource
     private InsReportService insReportService;
+
+    @Resource
+    private InsOrderPlanService insOrderPlanService;
 
     @Value("${wordUrl}")
     private String wordUrl;
@@ -150,12 +154,21 @@
         return Result.success(insReportService.downAll(ids));
     }
 
-    @ApiOperation(value = "鎶ュ憡涓嬭浇")
+    @ApiOperation(value = "鎶ュ憡涓嬭浇锛坮eportType锛�0妫�娴嬫姤鍛婏紝1妫�楠屾姤鍛婏級")
     @GetMapping("/download")
     @PreAuthorize("@ss.hasPermi('business:reportPreparation')")
     @PersonalScope(permsName = "business:reportPreparation", objectName = ReportPageDto.class, paramName = "createOrderUser")
-    public void download(Integer id, ReportPageDto reportPageDto, HttpServletResponse response) {
-        insReportService.download(id, reportPageDto.getCreateOrderUser(), response);
+    public void download(Integer id, Integer reportType, ReportPageDto reportPageDto, HttpServletResponse response) {
+        insReportService.download(id, reportType, reportPageDto.getCreateOrderUser(), response);
+    }
+
+    @ApiOperation(value = "閲嶆柊鐢熸垚鎶ュ憡")
+    @PostMapping("/regenerate")
+//    @PreAuthorize("@ss.hasPermi('business:reportPreparation')")
+    @PersonalScope(permsName = "business:reportPreparation", objectName = ReportPageDto.class, paramName = "createOrderUser")
+    public Result regenerate(@RequestBody ReportPageDto reportPageDto) {
+        insOrderPlanService.regenerateReport(reportPageDto.getId(), reportPageDto.getCreateOrderUser());
+        return Result.success();
     }
 
     @ApiOperation(value = "鎶ュ憡鎵归噺涓婁紶")
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
index 7528755..85f7c8f 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
@@ -41,6 +41,12 @@
     private String url;
 
     /**
+     * 绯荤粺鐢熸垚鐨勬楠屾姤鍛婂湴鍧�锛涗笌 url 瀵瑰簲鐨勬娴嬫姤鍛婂叡鐢ㄥ悓涓�鏉″鎵硅褰曘��
+     */
+    @ApiModelProperty("妫�楠屾姤鍛婂湴鍧�")
+    private String inspectionUrl;
+
+    /**
      * 鎵嬪姩涓婁紶鎶ュ憡鍦板潃
      */
     @ApiModelProperty("鍒涘缓鏃堕棿")
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
index 47e7609..5c438a0 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
@@ -59,6 +59,11 @@
     int rawMaterialVerifyPlan(VerifyPlanDto verifyPlanDto);
 
     /**
+     * 鎸夊綋鍓嶆楠屾暟鎹噸鏂扮敓鎴愬皻鏈壒鍑嗙殑绯荤粺鎶ュ憡銆�
+     */
+    void regenerateReport(Integer reportId, Integer createOrderUser);
+
+    /**
      * 鐢电紗閰嶇疆. 鏌ョ湅鏍囪瘑
      * @param id
      * @param laboratory
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
index 33de910..5b504f4 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsReportService.java
@@ -41,8 +41,10 @@
 
     String downAll(String ids);
 
-    /** 鍗曚唤鎶ュ憡 Word 涓嬭浇锛宑reateOrderUser 鐢ㄤ簬澶嶇敤鎶ュ憡缂栧埗鐨勬暟鎹寖鍥淬�� */
-    void download(Integer id, Integer createOrderUser, HttpServletResponse response);
+    /**
+     * 鍗曚唤鎶ュ憡 Word 涓嬭浇锛宺eportType锛�0妫�娴嬫姤鍛婏紝1妫�楠屾姤鍛婏紱createOrderUser 鐢ㄤ簬澶嶇敤鎶ュ憡缂栧埗鐨勬暟鎹寖鍥淬��
+     */
+    void download(Integer id, Integer reportType, Integer createOrderUser, HttpServletResponse response);
 
     int upAll(MultipartFile file) throws IOException;
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
index f09b388..1b0aee8 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -178,8 +178,12 @@
         String userName = null;
         Integer userId = null;
         if (ObjectUtil.isNotEmpty(insOrderPlanDTO.getUserId())) {
-            userId = SecurityUtils.getUserId().intValue();
-            userName = userMapper.selectById(userId).getName();
+            Integer currentUserId = SecurityUtils.getUserId().intValue();
+            // 绠$悊鍛樺彲浠ユ煡鐪嬪苟澶嶆牳鍏ㄩ儴寰呭鏍镐换鍔★紝鏅�氱敤鎴蜂粛鍙煡鐪嬪垎閰嶇粰鑷繁鐨勪换鍔°��
+            if (!SecurityUtils.isAdmin(currentUserId.longValue())) {
+                userId = currentUserId;
+                userName = userMapper.selectById(userId).getName();
+            }
             insOrderPlanDTO.setUserId(null);
         }
         Integer isCheck = insOrderPlanDTO.getIsCheck();
@@ -745,18 +749,9 @@
         } catch (Exception ignored) {
             thing = compressedThing;
         }
-        JSONArray cellData = JSON.parseObject(thing).getJSONArray("data").getJSONObject(0).getJSONArray("celldata");
+        JSONObject sheet = JSON.parseObject(thing).getJSONArray("data").getJSONObject(0);
+        JSONArray cellData = sheet.getJSONArray("celldata");
         NavigableMap<Integer, List<String>> result = new TreeMap<>();
-        Integer inspectionResultColumn = null;
-        for (Object item : cellData) {
-            JSONObject cell = JSON.parseObject(JSON.toJSONString(item));
-            Integer column = cell.getInteger("c");
-            JSONObject value = cell.getJSONObject("v");
-            String displayValue = value == null ? null : value.getString("v");
-            if (inspectionResultColumn == null && "妫�楠岀粨鏋�".equals(StringUtils.trim(displayValue))) {
-                inspectionResultColumn = column;
-            }
-        }
         for (Object item : cellData) {
             JSONObject cell = JSON.parseObject(JSON.toJSONString(item));
             JSONObject value = cell.getJSONObject("v");
@@ -767,16 +762,119 @@
             Integer row = cell.getInteger("r");
             Integer column = cell.getInteger("c");
             if (row != null && column != null) {
-                // 鈥滃鍑哄�尖�濇爣鍦ㄦ娴嬮」鐩爣棰樺崟鍏冩牸鏃讹紝鐪熸瀵煎嚭鐨勫�兼槸鍚屼竴琛屸�滄楠岀粨鏋溾�濆垪鐨勫崟鍏冩牸銆�
-                String coordinate = row + "-" + column;
-                String resultCoordinate = row + "-" + inspectionResultColumn;
-                if (inspectionResultColumn != null && !Objects.equals(column, inspectionResultColumn)) {
-                    coordinate = resultCoordinate;
-                }
+                // 鎵规敞鍗曞厓鏍煎彲鑳芥í鍚戝悎骞讹紝鍙充晶缁撴灉鍗曞厓鏍间篃鍙兘绾靛悜鍚堝苟锛涙渶缁堣鍙栫粨鏋滃尯鍩熺殑宸︿笂瑙掑瓨鍌ㄥ潗鏍囥��
+                String coordinate = getRightAdjacentCoordinate(sheet, row, column);
                 result.computeIfAbsent(row, ignored -> new ArrayList<>()).add(coordinate);
             }
         }
         return result;
+    }
+
+    /**
+     * 杩斿洖鎸囧畾鍗曞厓鏍硷紙鎴栧叾鎵�鍦ㄥ悎骞跺尯鍩燂級鍙充晶绱ч偦鍒楃殑涓嬫爣銆�
+     * Luckysheet 鐨勫悎骞朵俊鎭�氬父淇濆瓨鍦� config.merge锛涢儴鍒嗗巻鍙叉ā鏉垮彧鍦ㄥ崟鍏冩牸 v.mc 涓繚鐣欙紝
+     * 鍥犳涓ょ缁撴瀯閮借鍏煎銆�
+     */
+    private int getRightAdjacentColumn(JSONObject sheet, int row, int column) {
+        int rightEdge = column;
+        JSONObject config = sheet == null ? null : sheet.getJSONObject("config");
+        JSONObject merges = config == null ? null : config.getJSONObject("merge");
+        if (merges != null) {
+            for (Object rawMerge : merges.values()) {
+                rightEdge = extendMergedRightEdge(rightEdge, row, column, rawMerge);
+            }
+        }
+
+        JSONArray cellData = sheet == null ? null : sheet.getJSONArray("celldata");
+        if (cellData != null) {
+            for (Object rawCell : cellData) {
+                JSONObject cell = JSON.parseObject(JSON.toJSONString(rawCell));
+                JSONObject value = cell == null ? null : cell.getJSONObject("v");
+                JSONObject merge = value == null ? null : value.getJSONObject("mc");
+                rightEdge = extendMergedRightEdge(rightEdge, row, column, merge);
+            }
+        }
+        return rightEdge + 1;
+    }
+
+    private String getRightAdjacentCoordinate(JSONObject sheet, int row, int column) {
+        int adjacentColumn = getRightAdjacentColumn(sheet, row, column);
+        int[] anchor = findMergedAnchor(sheet, row, adjacentColumn);
+        return anchor[0] + "-" + anchor[1];
+    }
+
+    /**
+     * Luckysheet 鍙湪鍚堝苟鍖哄煙宸︿笂瑙掍繚瀛樺疄闄呭�笺�傝嫢鐩爣鍗曞厓鏍间綅浜庡悎骞跺尯鍩熷唴閮紝
+     * 灏嗗叾杞崲涓鸿鍖哄煙鐨勫乏涓婅鍧愭爣锛涙湭鍚堝苟鍒欒繑鍥炲師鍧愭爣銆�
+     */
+    private int[] findMergedAnchor(JSONObject sheet, int row, int column) {
+        JSONObject config = sheet == null ? null : sheet.getJSONObject("config");
+        JSONObject merges = config == null ? null : config.getJSONObject("merge");
+        if (merges != null) {
+            for (Object rawMerge : merges.values()) {
+                int[] anchor = findMergedAnchor(row, column, rawMerge);
+                if (anchor != null) {
+                    return anchor;
+                }
+            }
+        }
+
+        JSONArray cellData = sheet == null ? null : sheet.getJSONArray("celldata");
+        if (cellData != null) {
+            for (Object rawCell : cellData) {
+                JSONObject cell = JSON.parseObject(JSON.toJSONString(rawCell));
+                JSONObject value = cell == null ? null : cell.getJSONObject("v");
+                int[] anchor = findMergedAnchor(row, column,
+                        value == null ? null : value.getJSONObject("mc"));
+                if (anchor != null) {
+                    return anchor;
+                }
+            }
+        }
+        return new int[]{row, column};
+    }
+
+    private int[] findMergedAnchor(int row, int column, Object rawMerge) {
+        if (rawMerge == null) {
+            return null;
+        }
+        JSONObject merge = rawMerge instanceof JSONObject
+                ? (JSONObject) rawMerge : JSON.parseObject(JSON.toJSONString(rawMerge));
+        Integer startRow = merge.getInteger("r");
+        Integer startColumn = merge.getInteger("c");
+        Integer rowSpan = merge.getInteger("rs");
+        Integer columnSpan = merge.getInteger("cs");
+        if (startRow == null || startColumn == null || rowSpan == null || columnSpan == null
+                || rowSpan < 1 || columnSpan < 1) {
+            return null;
+        }
+        if (row >= startRow && row < startRow + rowSpan
+                && column >= startColumn && column < startColumn + columnSpan) {
+            return new int[]{startRow, startColumn};
+        }
+        return null;
+    }
+
+    private int extendMergedRightEdge(int currentRightEdge, int row, int column, Object rawMerge) {
+        if (rawMerge == null) {
+            return currentRightEdge;
+        }
+        JSONObject merge = rawMerge instanceof JSONObject
+                ? (JSONObject) rawMerge : JSON.parseObject(JSON.toJSONString(rawMerge));
+        Integer startRow = merge.getInteger("r");
+        Integer startColumn = merge.getInteger("c");
+        Integer rowSpan = merge.getInteger("rs");
+        Integer columnSpan = merge.getInteger("cs");
+        if (startRow == null || startColumn == null || rowSpan == null || columnSpan == null
+                || rowSpan < 1 || columnSpan < 1) {
+            return currentRightEdge;
+        }
+        int endRow = startRow + rowSpan - 1;
+        int endColumn = startColumn + columnSpan - 1;
+        if (row >= startRow && row <= endRow && column >= startColumn && column <= endColumn) {
+            return Math.max(currentRightEdge, endColumn);
+        }
+        return currentRightEdge;
     }
 
     /**
@@ -794,7 +892,7 @@
     }
 
     /**
-     * 鐩寸粦妯℃澘璁㈠崟鍙牎楠屾ā鏉夸腑鏍囪涓衡�滃鍑哄�尖�濈殑鍗曞厓鏍硷紝涓嶄娇鐢ㄦ楠岄」鐘舵�佹垨 last_value 鍒ゅ畾銆�
+     * 鐩寸粦妯℃澘璁㈠崟鍙牎楠屾瘡涓�滃鍑哄�尖�濇壒娉ㄦ墍鍦ㄥ尯鍩熷彸渚х揣閭诲崟鍏冩牸锛屼笉浣跨敤妫�楠岄」鐘舵�佹垨 last_value 鍒ゅ畾銆�
      */
     private List<String> getMissingTemplateExportValues(Integer orderId) {
         List<InsOrderStandardTemplate> snapshots = insOrderStandardTemplateService.list(
@@ -1532,6 +1630,10 @@
             refreshed.setRecordValues(templateRecordValuesMap.get(templateId));
             refreshed.setTemperature(templateTemperatureMap.get(templateId));
             refreshed.setHumidity(templateHumidityMap.get(templateId));
+            // 鍒锋柊妯℃澘缁撴瀯鏃跺繀椤讳繚鐣欐楠岄樁娈靛~鍐欑殑涓氬姟鏁版嵁锛岄伩鍏嶈繘鍏ュ鏍稿悗鍥炴樉涓虹┖銆�
+            refreshed.setDetectionTime(oldSnapshot == null ? null : oldSnapshot.getDetectionTime());
+            refreshed.setDetectionPlace(oldSnapshot == null ? null : oldSnapshot.getDetectionPlace());
+            refreshed.setInsResult(oldSnapshot == null ? null : oldSnapshot.getInsResult());
             Integer templateSort = templateSortMap.get(templateId);
             refreshed.setSort(templateSort == null ? nextTemplateSort++ : templateSort);
             refreshedSnapshots.add(refreshed);
@@ -1586,12 +1688,13 @@
         InsReport existingReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
                 .eq(InsReport::getInsOrderId, orderId)
                 .last("limit 1"));
+        boolean directTemplateOrder = isDirectTemplateOrder(orderId);
         if (currentState != null && Objects.equals(currentState.getInsState(), 5)
-                && existingReport != null && StringUtils.isNotBlank(existingReport.getUrl())) {
+                && existingReport != null && StringUtils.isNotBlank(existingReport.getUrl())
+                && (!directTemplateOrder || StringUtils.isNotBlank(existingReport.getInspectionUrl()))) {
             // 闃叉澶嶆牳椤甸潰閲嶅鐐瑰嚮鎴栫綉缁滈噸璇曢噸澶嶇敓鎴愭姤鍛娿�侀噸澶嶅彂璧锋姤鍛婂鎵广��
             return 1;
         }
-        boolean directTemplateOrder = isDirectTemplateOrder(orderId);
         if (directTemplateOrder && Objects.equals(type, 1)
                 && !Objects.equals(dto.getInsResult(), 0) && !Objects.equals(dto.getInsResult(), 1)) {
             throw new ErrorException("璇烽�夋嫨妫�楠屽崟缁撹");
@@ -1640,15 +1743,22 @@
                     .eq(InsOrder::getId, orderId)
                     .set(InsOrder::getInsState, 5));
 
-            // 妫�楠屼汉鍛樻彁浜ゅ鏍告椂涓嶅啀鐢熸垚鎶ュ憡锛涗粎鍦ㄥ叏閮ㄨ瘯楠屽澶嶆牳閫氳繃鍚庣敓鎴愭娴嬫姤鍛娿��
+            // 妫�楠屼汉鍛樻彁浜ゅ鏍告椂涓嶇敓鎴愭姤鍛婏紱鍏ㄩ儴璇曢獙瀹ゅ鏍搁�氳繃鍚庣敓鎴愭姤鍛娿��
             if (report == null || StringUtils.isBlank(report.getUrl())) {
                 this.generateReport(orderId, DETECTION_REPORT, writeUserId);
-                report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
-                        .eq(InsReport::getInsOrderId, orderId)
-                        .last("limit 1"));
             }
+            // 鐩寸粦妯℃澘璁㈠崟鍚屾椂鐢熸垚妫�楠屾姤鍛婏紝涓や唤鏂囦欢鍏辩敤鍚屼竴鏉″鎵硅褰曘��
+            if (directTemplateOrder && (report == null || StringUtils.isBlank(report.getInspectionUrl()))) {
+                this.generateReport(orderId, INSPECTION_REPORT, writeUserId);
+            }
+            report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
+                    .eq(InsReport::getInsOrderId, orderId)
+                    .last("limit 1"));
             if (report == null || StringUtils.isBlank(report.getUrl())) {
                 throw new ErrorException("妫�娴嬫姤鍛婄敓鎴愬け璐�");
+            }
+            if (directTemplateOrder && StringUtils.isBlank(report.getInspectionUrl())) {
+                throw new ErrorException("妫�楠屾姤鍛婄敓鎴愬け璐�");
             }
             if (report.getTempUrlPdf() == null) {
                 String tempUrlPdf = this.wordToPdfTemp(report.getUrl().replace("/word", wordUrl));
@@ -1798,6 +1908,101 @@
             throw new ErrorException("鎵句笉鍒板綋鍓嶆楠屼换鍔$殑妫�楠屼汉锛屾棤娉曠敓鎴愭娴嬫姤鍛�");
         }
         return inspector.getUserId();
+    }
+
+    /**
+     * 閲嶆柊鐢熸垚灏氭湭鎵瑰噯鐨勭郴缁熸姤鍛婏紝骞舵仮澶嶅凡瀛樺湪鐨勭紪鍒躲�佸鏍哥鍚嶃��
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void regenerateReport(Integer reportId, Integer createOrderUser) {
+        if (reportId == null) {
+            throw new ErrorException("鎶ュ憡涓嶈兘涓虹┖");
+        }
+        InsReport accessibleReport = insReportMapper.selectDownloadableReport(reportId, createOrderUser);
+        if (accessibleReport == null) {
+            throw new ErrorException("鎶ュ憡涓嶅瓨鍦ㄣ�佸皻鏈敓鎴愭垨鏃犳潈鎿嶄綔");
+        }
+        // 鏁版嵁搴撹閿侀伩鍏嶅悓涓�鎶ュ憡琚浜哄悓鏃堕噸鏂扮敓鎴愬苟瑕嗙洊銆�
+        InsReport report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getId, reportId)
+                .last("FOR UPDATE"));
+        if (report == null) {
+            throw new ErrorException("鎶ュ憡涓嶅瓨鍦�");
+        }
+        if (Objects.equals(report.getIsRatify(), 1)) {
+            throw new ErrorException("宸叉壒鍑嗘姤鍛婁笉鑳介噸鏂扮敓鎴�");
+        }
+        if (StringUtils.isNotBlank(report.getUrlS())) {
+            throw new ErrorException("褰撳墠鎶ュ憡宸叉墜鍔ㄤ笂浼狅紝璇峰厛杩樺師涓虹郴缁熸姤鍛婂悗鍐嶉噸鏂扮敓鎴�");
+        }
+        if (report.getInsOrderId() == null) {
+            throw new ErrorException("鎶ュ憡鏈叧鑱旀楠屽崟锛屾棤娉曢噸鏂扮敓鎴�");
+        }
+
+        Integer reportType = report.getReportType() == null ? DETECTION_REPORT : report.getReportType();
+        Integer writeUserId = report.getWriteUserId() == null
+                ? SecurityUtils.getUserId().intValue() : report.getWriteUserId();
+        boolean directTemplateOrder = isDirectTemplateOrder(report.getInsOrderId());
+        if (directTemplateOrder) {
+            generateReport(report.getInsOrderId(), DETECTION_REPORT, writeUserId);
+            generateReport(report.getInsOrderId(), INSPECTION_REPORT, writeUserId);
+        } else {
+            generateReport(report.getInsOrderId(), reportType, writeUserId);
+        }
+
+        InsReport regenerated = insReportMapper.selectById(reportId);
+        if (regenerated == null || StringUtils.isBlank(regenerated.getUrl())) {
+            throw new ErrorException("鎶ュ憡閲嶆柊鐢熸垚澶辫触");
+        }
+        if (directTemplateOrder && StringUtils.isBlank(regenerated.getInspectionUrl())) {
+            throw new ErrorException("妫�楠屾姤鍛婇噸鏂扮敓鎴愬け璐�");
+        }
+        String reportPath = regenerated.getUrl().replace("/word", wordUrl);
+        Map<String, Object> marks = buildExistingReportMarks(report);
+        if (!marks.isEmpty()) {
+            insReportService.wordInsertUrl(marks, reportPath);
+            if (StringUtils.isNotBlank(regenerated.getInspectionUrl())) {
+                insReportService.wordInsertUrl(marks,
+                        regenerated.getInspectionUrl().replace("/word", wordUrl));
+            }
+        }
+        String tempPdfName = wordToPdfTemp(reportPath);
+        if (StringUtils.isBlank(tempPdfName)) {
+            throw new ErrorException("鎶ュ憡棰勮鏂囦欢鐢熸垚澶辫触");
+        }
+        // generateReport 浼氬啓鍏ュ綋鍓嶆椂闂达紱閲嶆柊鐢熸垚涓嶅簲鏀瑰彉鍘熷鎵硅褰曟椂闂淬��
+        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                .eq(InsReport::getId, reportId)
+                .set(InsReport::getWriteTime, report.getWriteTime())
+                .set(InsReport::getTempUrlPdf, "/word/" + tempPdfName));
+    }
+
+    private Map<String, Object> buildExistingReportMarks(InsReport report) {
+        Map<String, Object> marks = new HashMap<>();
+        boolean submitted = Objects.equals(report.getState(), 1)
+                || report.getIsExamine() != null
+                || report.getExamineTime() != null;
+        if (submitted) {
+            User writer = getReportSigner(report.getWriteUserId(), "缂栧埗浜�");
+            marks.put("writeUrl", Pictures.ofLocal(imgUrl + "/" + writer.getSignatureUrl()).create());
+            marks.put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(report.getWriteTime())).create());
+            marks.put("insUrl", Pictures.ofLocal(imgUrl + "/" + writer.getSignatureUrl()).create());
+        }
+        if (Objects.equals(report.getIsExamine(), 1)) {
+            User examiner = getReportSigner(report.getExamineUserId(), "瀹℃牳浜�");
+            marks.put("examineUrl", Pictures.ofLocal(imgUrl + "/" + examiner.getSignatureUrl()).create());
+            marks.put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(report.getExamineTime())).create());
+        }
+        return marks;
+    }
+
+    private User getReportSigner(Integer userId, String roleName) {
+        User user = userId == null ? null : userMapper.selectById(userId);
+        if (user == null || StringUtils.isBlank(user.getSignatureUrl())) {
+            throw new ErrorException("鎵句笉鍒�" + roleName + "鐨勭鍚�");
+        }
+        return user;
     }
 
     /**
@@ -3038,9 +3243,9 @@
                     }
                 }
             }
-            // 鏂扮増妫�娴嬫姤鍛婄洿鎺ヤ娇鐢ㄥ浐瀹氬洓鍒楃粨鏋滆锛屼笉鍐嶆瀯閫犳棫鐗堝彲鍙樺垪 TableRenderData銆�
-            // 妫�楠屾姤鍛婁粛娌跨敤涓嬫柟鍘熸湁鐨勫ぇ琛ㄦ牸閫昏緫銆�
-            if (!showResult) {
+            // 鐩寸粦妯℃澘鐨勬娴嬫姤鍛娿�佹楠屾姤鍛婇兘浣跨敤鏂扮増鍥哄畾缁撴灉琛岋紝涓嶅啀杩涘叆鏃х増妫�楠岄」琛ㄦ牸閫昏緫銆�
+            // 鐩寸粦妯℃澘涓殑鎵胯浇璁板綍娌℃湁鏃ф楠岄」瀛楁锛岃繘鍏ユ棫閫昏緫浼氬湪鏍煎紡鍖栨椂浜х敓绌烘寚閽堛��
+            if (!showResult || directTemplateOrder) {
                 return;
             }
             // 鏀舵牱鏃ユ湡
@@ -3445,8 +3650,9 @@
                 ? "寰簱浠戞硶锛屾湁鏈烘隘鍚噺灏忎簬0.005%鏃讹紝浠ユ湭妫�鍑烘姤鍑恒��"
                 : defaultReportText(insOrder.getRemark(), "/");
 
-        // 妫�娴嬫姤鍛婂拰妫�楠屾姤鍛婄粺涓�浣跨敤鏂扮増鎶ュ憡妯℃澘
-        String templateName = "/static/detection-report-template-v2.docx";
+        String templateName = showResult
+                ? "/static/inspection-report-template-v2.docx"
+                : "/static/detection-report-template-v2.docx";
         InputStream inputStream = this.getClass().getResourceAsStream(templateName);
         if (inputStream == null) {
             throw new RuntimeException("鎵句笉鍒版姤鍛婃ā鏉�: " + templateName);
@@ -3533,7 +3739,7 @@
                     put("resultNote", finalResultRemark);
                 }});
         try {
-            String name = insReport.getCode().replace("/", "") + (showResult ? ".docx" : "-C.docx");
+            String name = insReport.getCode().replace("/", "") + (showResult ? "-J.docx" : "-C.docx");
             Files.createDirectories(Paths.get(wordUrl));
             template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl, name)));
             insReport.setUrl("/word/" + name);
@@ -3550,6 +3756,22 @@
         InsReport existing = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
                 .eq(InsReport::getInsOrderId, report.getInsOrderId())
                 .last("limit 1"));
+        if (Objects.equals(report.getReportType(), INSPECTION_REPORT)) {
+            String inspectionUrl = report.getUrl();
+            if (existing == null) {
+                report.setReportType(DETECTION_REPORT);
+                report.setUrl(null);
+                report.setInspectionUrl(inspectionUrl);
+                insReportMapper.insert(report);
+            } else {
+                insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                        .eq(InsReport::getId, existing.getId())
+                        .set(InsReport::getInspectionUrl, inspectionUrl)
+                        .set(InsReport::getWriteUserId, report.getWriteUserId())
+                        .set(InsReport::getWriteTime, report.getWriteTime()));
+            }
+            return;
+        }
         if (existing == null) {
             insReportMapper.insert(report);
             return;
@@ -3591,6 +3813,7 @@
                 row.put("itemName", itemName);
                 row.put("unit", defaultReportText(product.getUnit(), "/"));
                 row.put("result", defaultReportText(product.getLastValue(), "/"));
+                row.put("inspectionConclusion", formatInspectionConclusion(product.getInsResult()));
                 rows.add(row);
             }
         }
@@ -3629,6 +3852,7 @@
                 row.put("itemName", formatExportItemName(reportItemName));
                 row.put("unit", defaultReportText(unit, "/"));
                 row.put("result", result);
+                row.put("inspectionConclusion", formatInspectionConclusion(snapshot.getInsResult()));
                 rows.add(row);
             }
         }
@@ -3636,6 +3860,16 @@
             throw new ErrorException("褰撳墠璁㈠崟鏈壘鍒板彲鐢熸垚鎶ュ憡鐨勫師濮嬭褰曟ā鏉�");
         }
         return rows;
+    }
+
+    private static String formatInspectionConclusion(Integer insResult) {
+        if (Objects.equals(insResult, 1)) {
+            return "鍚堟牸";
+        }
+        if (Objects.equals(insResult, 0)) {
+            return "涓嶅悎鏍�";
+        }
+        return "/";
     }
 
     private List<TemplateExportCell> getTemplateExportCells(String compressedThing) {
@@ -3648,9 +3882,8 @@
         } catch (Exception ignored) {
             thing = compressedThing;
         }
-        JSONArray cellData = JSON.parseObject(thing).getJSONArray("data").getJSONObject(0).getJSONArray("celldata");
-        Integer resultColumn = null;
-        Integer itemColumn = null;
+        JSONObject sheet = JSON.parseObject(thing).getJSONArray("data").getJSONObject(0);
+        JSONArray cellData = sheet.getJSONArray("celldata");
         Integer unitColumn = null;
         List<int[]> exportCells = new ArrayList<>();
         Map<String, String> templateValues = new HashMap<>();
@@ -3664,13 +3897,6 @@
             }
             String displayValue = value.get("v") == null ? null : String.valueOf(value.get("v"));
             templateValues.put(row + "-" + column, displayValue);
-            if (resultColumn == null && "妫�楠岀粨鏋�".equals(StringUtils.trim(displayValue))) {
-                resultColumn = column;
-            }
-            if (itemColumn == null && ("妫�娴嬮」鐩�".equals(StringUtils.trim(displayValue))
-                    || "妫�楠岄」鐩�".equals(StringUtils.trim(displayValue)))) {
-                itemColumn = column;
-            }
             if (unitColumn == null && "鍗曚綅".equals(StringUtils.trim(displayValue))) {
                 unitColumn = column;
             }
@@ -3685,13 +3911,9 @@
         exportCells.sort(Comparator.comparingInt((int[] cell) -> cell[0]).thenComparingInt(cell -> cell[1]));
         List<TemplateExportCell> results = new ArrayList<>();
         for (int[] exportCell : exportCells) {
-            int resultColumnForRow = resultColumn == null ? exportCell[1] : resultColumn;
-            // 閫氬父鈥滃鍑哄�尖�濇壒娉ㄩ厤缃湪椤圭洰鍚嶇О鍗曞厓鏍硷紱鑻ラ厤缃湪缁撴灉鍗曞厓鏍硷紝鍒欏洖鍒扳�滄娴嬮」鐩�濆垪鍙栧悕绉般��
-            Integer itemColumnForRow = !Objects.equals(exportCell[1], resultColumnForRow)
-                    ? exportCell[1] : itemColumn;
             TemplateExportCell result = new TemplateExportCell();
-            result.resultCoordinate = exportCell[0] + "-" + resultColumnForRow;
-            result.itemCoordinate = itemColumnForRow == null ? null : exportCell[0] + "-" + itemColumnForRow;
+            result.resultCoordinate = getRightAdjacentCoordinate(sheet, exportCell[0], exportCell[1]);
+            result.itemCoordinate = exportCell[0] + "-" + exportCell[1];
             result.unitCoordinate = unitColumn == null ? null : exportCell[0] + "-" + unitColumn;
             result.templateValues = templateValues;
             results.add(result);
@@ -5139,7 +5361,7 @@
                 }
             }
             // 鍒ゆ柇鏄惁鏄暟瀛楃被鍨�
-            if (sampleProductDto2.getInspectionValueType().equals("1")) {
+            if ("1".equals(sampleProductDto2.getInspectionValueType())) {
                 // 鎶婃楠屽唴瀹瑰鏋滄纭寲鐐瑰拰鐒︾儳鏃堕棿鎶�  .  鍒囧壊鎴�  :
                 String lastValue = sampleProductDto2.getLastValue();
                 if (sampleProductDto2.getInspectionItem().contains("姝g~鍖栫偣") || sampleProductDto2.getInspectionItem().contains("鐒︾儳鏃堕棿")) {
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
index 614153a..48d4063 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -86,6 +86,9 @@
 @Slf4j
 public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport>
         implements InsReportService {
+    private static final int DETECTION_REPORT = 0;
+    private static final int INSPECTION_REPORT = 1;
+
     @Resource
     private UserMapper userMapper;
     @Resource
@@ -209,30 +212,30 @@
         info.setViewStatus(false);
         info.setJumpPath(MenuJumpPathConstants.REPORT_PREPARATION);
         informationNotificationService.addInformationNotification(info);
-        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
-        String url = insReport.getUrl();
-        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
-        String urlS = insReport.getUrlS();
+        String primaryReportUrl = getPrimaryReportUrl(insReport);
 
         // 鍒ゆ柇鏄惁鏄師鏉愭枡  闇�瑕佹浛鎹�****鎴愪緵搴斿晢
         IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
                 .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
         if (one != null) {
             if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-                changeText(new HashMap<String, String>() {{
-                    put("**********", one.getSupplierName());
-                }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+                for (String reportUrl : getApprovalReportUrls(insReport)) {
+                    changeText(new HashMap<String, String>() {{
+                        put("**********", one.getSupplierName());
+                    }}, reportUrl.replace("/word", wordUrl));
+                }
             }
         }
 
-        wordInsertUrl(new HashMap<String, Object>() {{
+        Map<String, Object> writeMarks = new HashMap<String, Object>() {{
             put("writeUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
             put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
             put("insUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
-        }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        }};
+        writeMarksToReportFiles(insReport, writeMarks);
 
         // 淇敼涓存椂pdf
-        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        String tempUrlPdf = wordToPdfTemp(primaryReportUrl.replace("/word", wordUrl));
         insReport.setTempUrlPdf("/word/" + tempUrlPdf);
 
         insReportMapper.updateById(insReport);
@@ -330,17 +333,15 @@
         info.setViewStatus(false);
         info.setJumpPath(MenuJumpPathConstants.REPORT_PREPARATION);
         informationNotificationService.addInformationNotification(info);
-        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
-        String url = insReport.getUrl();
-        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
-        String urlS = insReport.getUrlS();
-        wordInsertUrl(new HashMap<String, Object>() {{
+        String primaryReportUrl = getPrimaryReportUrl(insReport);
+        Map<String, Object> examineMarks = new HashMap<String, Object>() {{
             put("examineUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
             put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
-        }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        }};
+        writeMarksToReportFiles(insReport, examineMarks);
 
         // 淇敼涓存椂pdf
-        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        String tempUrlPdf = wordToPdfTemp(primaryReportUrl.replace("/word", wordUrl));
         insReport.setTempUrlPdf("/word/" + tempUrlPdf);
 
         // 鍙戦�佷紒涓氬井淇¢�氱煡(閫氱煡鎵瑰噯浜哄鎵�)
@@ -473,28 +474,29 @@
         if (StringUtils.isBlank(sealUrl)) {
             throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
         }
-        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
-        String url = insReport.getUrl();
-        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
-        String urlS = insReport.getUrlS();
-        String finalUrl = (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl);
+        String primaryReportUrl = getPrimaryReportUrl(insReport);
+        String finalUrl = primaryReportUrl.replace("/word", wordUrl);
 
-        wordInsertUrl(new HashMap<String, Object>() {{
+        Map<String, Object> ratifyMarks = new HashMap<String, Object>() {{
             put("ratifyUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
             put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
             put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
             put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
-        }}, finalUrl);
+        }};
+        writeMarksToReportFiles(insReport, ratifyMarks);
 
         // 淇敼涓存椂pdf
-        insReport.setTempUrlPdf((StrUtil.isBlank(urlS) ? url : urlS).replace(".docx", ".pdf"));
+        insReport.setTempUrlPdf(primaryReportUrl.replace(".docx", ".pdf"));
 
         InsOrder insOrder = new InsOrder();
         insOrder.setId(insOrderId);
         insOrder.setState(4);
         insOrderMapper.updateById(insOrder);
 
-        wordToPdf(finalUrl, sealUrl, isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY));
+        for (String reportUrl : getApprovalReportUrls(insReport)) {
+            wordToPdf(reportUrl.replace("/word", wordUrl), sealUrl,
+                    isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY));
+        }
 
         // 鍒ゆ柇鏄惁涓哄師鏉愭枡
         if (isRawMater) {
@@ -537,6 +539,27 @@
         return 1;
     }
 
+    private String getPrimaryReportUrl(InsReport report) {
+        String reportUrl = StringUtils.isNotBlank(report.getUrlS()) ? report.getUrlS() : report.getUrl();
+        if (StringUtils.isBlank(reportUrl)) {
+            throw new ErrorException("妫�娴嬫姤鍛婃枃浠朵笉瀛樺湪");
+        }
+        return reportUrl;
+    }
+
+    private List<String> getApprovalReportUrls(InsReport report) {
+        return Arrays.asList(getPrimaryReportUrl(report), report.getInspectionUrl()).stream()
+                .filter(StringUtils::isNotBlank)
+                .distinct()
+                .collect(Collectors.toList());
+    }
+
+    private void writeMarksToReportFiles(InsReport report, Map<String, Object> marks) {
+        for (String reportUrl : getApprovalReportUrls(report)) {
+            wordInsertUrl(marks, reportUrl.replace("/word", wordUrl));
+        }
+    }
+
 
     //鎶ュ憡鎵归噺涓嬭浇
     @Override
@@ -577,17 +600,23 @@
     }
 
     @Override
-    public void download(Integer id, Integer createOrderUser, HttpServletResponse response) {
+    public void download(Integer id, Integer reportType, Integer createOrderUser, HttpServletResponse response) {
         if (id == null) {
             throw new ErrorException("鎶ュ憡涓嶈兘涓虹┖");
+        }
+        reportType = reportType == null ? DETECTION_REPORT : reportType;
+        if (!Objects.equals(reportType, DETECTION_REPORT) && !Objects.equals(reportType, INSPECTION_REPORT)) {
+            throw new ErrorException("鎶ュ憡绫诲瀷涓嶆纭�");
         }
         InsReport report = insReportMapper.selectDownloadableReport(id, createOrderUser);
         if (report == null) {
             throw new ErrorException("鎶ュ憡涓嶅瓨鍦ㄣ�佸皻鏈敓鎴愭垨鏃犳潈涓嬭浇");
         }
-        String reportUrl = StringUtils.isNotBlank(report.getUrlS()) ? report.getUrlS() : report.getUrl();
+        String reportUrl = Objects.equals(reportType, INSPECTION_REPORT)
+                ? report.getInspectionUrl() : getPrimaryReportUrl(report);
         if (StringUtils.isBlank(reportUrl) || !reportUrl.replace('\\', '/').startsWith("/word/")) {
-            throw new ErrorException("鎶ュ憡鏂囦欢涓嶅瓨鍦紝璇疯仈绯荤鐞嗗憳");
+            throw new ErrorException((Objects.equals(reportType, INSPECTION_REPORT) ? "妫�楠屾姤鍛�" : "妫�娴嬫姤鍛�")
+                    + "鏂囦欢涓嶅瓨鍦紝璇疯仈绯荤鐞嗗憳");
         }
         Path root = Paths.get(wordUrl).toAbsolutePath().normalize();
         Path file = root.resolve(reportUrl.replace('\\', '/').substring("/word/".length())).normalize();
diff --git a/inspect-server/src/main/resources/mapper/InsReportMapper.xml b/inspect-server/src/main/resources/mapper/InsReportMapper.xml
index bd95b66..07d0518 100644
--- a/inspect-server/src/main/resources/mapper/InsReportMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsReportMapper.xml
@@ -82,7 +82,10 @@
     <!-- 鎶ュ憡鎶ヨ〃瀵煎嚭 -->
     <select id="reportAllExport" resultType="com.ruoyi.inspect.dto.InsReportExport">
         select code,
-        case when report_type = 0 then '妫�娴嬫姤鍛�' else '妫�楠屾姤鍛�' end                         report_type_name,
+        case
+        when inspection_url is not null and inspection_url != '' then '妫�娴嬫姤鍛娿�佹楠屾姤鍛�'
+        when report_type = 0 then '妫�娴嬫姤鍛�'
+        else '妫�楠屾姤鍛�' end                                                               report_type_name,
         case when type_source = 0 then '鎴愬搧涓嬪崟' else '鍘熸潗鏂欎笅鍗�' end                    type_source,
         case
         when order_type = '鎶芥' then '鎶芥'
diff --git a/inspect-server/src/main/resources/static/inspection-report-template-v2.docx b/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
new file mode 100644
index 0000000..b769824
--- /dev/null
+++ b/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
Binary files differ
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java
index 4ce8563..4f24bce 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java
@@ -35,7 +35,7 @@
     }
     @ApiOperation(value = "鍒犻櫎瀹㈡埛淇℃伅")
     @DeleteMapping("/delCustomById")
-    public Result delCustomById(Long id) {
+    public Result delCustomById(@RequestParam("id") Long id) {
         return Result.success(customService.delCustomById(id));
     }
 
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java
index 97d05ba..3e7e408 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java
@@ -28,6 +28,9 @@
     @ApiModelProperty(value = "鍗曚綅鍦板潃")
     private String address;
 
+    @ApiModelProperty(value = "鑱旂郴浜�")
+    private String contact;
+
     @ApiModelProperty(value = "宸ュ巶鍩�")
     private String code;
 

--
Gitblit v1.9.3