From a38a1ac77bb6ac9ea8bf0cf5f5f6b68d0e6e6974 Mon Sep 17 00:00:00 2001
From: jinlin <jinlin>
Date: 星期二, 02 一月 2024 08:44:10 +0800
Subject: [PATCH] 修改

---
 modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml                               |    1 
 modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/model/ConfigAuditReport.java                   |    9 
 zt/core/src/main/java/com/zt/modules/sys/service/SysUserService.java                                                |   11 
 web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue                                                 |    2 
 modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/service/TestReviewCommentService.java          |   26 
 zt/core/src/main/resources/mapper/sys/SysUserDao.xml                                                                |    2 
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportService.java                  |  182 +++++++
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dto/QaAuditReportDto.java                          |   34 +
 web/src/views/modules/configAuditReport/ConfigAuditReport.vue                                                       |   14 
 modules/mainPart/src/main/java/com/zt/life/modules/project/controller/ProjectController.java                        |   19 
 zt/core/src/main/java/com/zt/modules/sys/dao/SysUserDao.java                                                        |    2 
 modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/model/TestReviewComment.java                   |    5 
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportIncongruentDao.java               |   24 +
 modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/controller/TestReviewCommentController.java    |   11 
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportController.java            |  123 +++++
 web/src/views/modules/testReviewComment/TestReviewComment-AddOrUpdate.vue                                           |   31 +
 web/src/views/modules/configAuditReport/ConfigAuditReport-AddOrUpdate.vue                                           |  116 ++---
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReport.java                           |   63 ++
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReportIncongruent.java                |   54 ++
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportDao.java                          |   23 +
 web/src/views/modules/testReviewComment/TestReviewComment.vue                                                       |   11 
 web/src/views/modules/qaAuditReport/QaAuditReport.vue                                                               |   80 +++
 modules/mainPart/src/main/resources/mapper/configAuditReport/ConfigAuditReportDao.xml                               |    5 
 web/src/views/modules/qaAuditReport/QaAuditReport-AddOrUpdate.vue                                                   |  243 ++++++++++
 core/src/main/java/com/zt/life/export/service/WordFileService.java                                                  |    2 
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportIncongruentService.java       |   51 ++
 modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/dto/ReviewCommentDto.java                      |    3 
 modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/dto/ConfigAuditDto.java                        |    4 
 modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/controller/ConfigAuditReportController.java    |   23 
 modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportIncongruentController.java |   96 ++++
 modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportDao.xml                                       |   20 
 modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportIncongruentDao.xml                            |   33 +
 modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/service/ConfigAuditReportService.java          |   41 +
 33 files changed, 1,258 insertions(+), 106 deletions(-)

diff --git a/core/src/main/java/com/zt/life/export/service/WordFileService.java b/core/src/main/java/com/zt/life/export/service/WordFileService.java
index 331331f..1abcfb8 100644
--- a/core/src/main/java/com/zt/life/export/service/WordFileService.java
+++ b/core/src/main/java/com/zt/life/export/service/WordFileService.java
@@ -67,7 +67,7 @@
                     builder.bind(fieldName, new HackLoopTableRenderPolicy());
                 } else if (staticFieldValue != null) {
                     if (typeName.contains("java.util.Date") && fieldName.contains("Date")) {
-                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy骞碝M鏈坉d鏃�");
                         staticFieldValue = sdf.format(staticFieldValue);
                     }
                     String valStr = staticFieldValue.toString();
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/controller/ConfigAuditReportController.java b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/controller/ConfigAuditReportController.java
index d0a15c5..12096b6 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/controller/ConfigAuditReportController.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/controller/ConfigAuditReportController.java
@@ -15,6 +15,7 @@
 import com.zt.life.modules.configAuditReport.dto.ConfigAuditDto;
 import com.zt.life.modules.configAuditReport.model.ConfigAuditReport;
 import com.zt.life.modules.configAuditReport.service.ConfigAuditReportService;
+import com.zt.life.sys.dto.OssDto;
 import com.zt.life.sys.service.SysOssConfigService;
 import com.zt.modules.coderule.service.SysCodeRuleService;
 import io.swagger.annotations.Api;
@@ -25,6 +26,8 @@
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -56,9 +59,10 @@
         @ApiImplicitParam(name = Constant.Q.LIMIT, value = Constant.QV.LIMIT, required = true, dataType = Constant.QT.INT),
         @ApiImplicitParam(name = Constant.Q.ORDER_FIELD, value = Constant.QV.ORDER_FIELD, dataType = Constant.QT.STRING),
         @ApiImplicitParam(name = Constant.Q.ORDER, value = Constant.QV.ORDER, dataType = Constant.QT.STRING),
-        @ApiImplicitParam(name = "code", value = "缂栧彿", dataType = Constant.QT.STRING, format = "code^LK"),
-        @ApiImplicitParam(name = "libraryType", value = "搴撶被鍨�", dataType = Constant.QT.STRING, format = "a.library_type^EQ")
-})
+        @ApiImplicitParam(name = "code", value = "缂栧彿", dataType = Constant.QT.STRING, format = "a.code^LK"),
+        @ApiImplicitParam(name = "softwareIdentity", value = "椤圭洰鏍囪瘑", dataType = Constant.QT.STRING, format = "p.software_identity^LK"),
+        @ApiImplicitParam(name = "softwareName", value = "椤圭洰鍚嶇О", dataType = Constant.QT.STRING, format = "p.software_name^LK"),
+    })
     public PageResult<ConfigAuditReport> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
 
         return PageResult.ok(configAuditReportService.page(queryFilter));
@@ -68,6 +72,12 @@
     @ApiOperation("淇℃伅")
     public Result<ConfigAuditDto> getDto(Long projectId, Long reportId) {
         ConfigAuditDto data =configAuditReportService.getDto(projectId, reportId);
+        if (reportId!=null) {
+            OssDto ossDto = sysOssConfigService.getOssByBusiType(reportId, "config_audit_report");
+            if (ossDto != null) {
+                data.setFiles(ossDto);
+            }
+        }
         return Result.ok(data);
     }
 
@@ -106,4 +116,11 @@
         return Result.ok();
     }
 
+    @GetMapping("exportConfigAudit")
+    @ApiOperation("鎵撳嵃瀹℃牳鎶ュ憡")
+    @LogOperation("鎵撳嵃瀹℃牳鎶ュ憡")
+    public void exportConfigAudit(Long id, HttpServletRequest request, HttpServletResponse response) {
+        configAuditReportService.exportConfigAudit(id, request, response);
+    }
+
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/dto/ConfigAuditDto.java b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/dto/ConfigAuditDto.java
index 9ad62d9..82cf4af 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/dto/ConfigAuditDto.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/dto/ConfigAuditDto.java
@@ -8,6 +8,7 @@
 import com.zt.life.modules.configItemWarehouse.model.WarehouseConfigItem;
 import com.zt.life.modules.configItemWarehouse.model.WarehouseQaAudit;
 import com.zt.life.modules.project.model.Project;
+import com.zt.life.sys.dto.OssDto;
 import com.zt.modules.workflow.dto.FlowInfoDto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -27,7 +28,8 @@
     private Project project;
 
 
-    private FlowInfoDto flowInfoDto;
+    @ApiModelProperty(value = "闄勪欢")
+    private OssDto files;
 
     @ApiModelProperty(value = "瀹℃牳鍐呭")
     private List<ConfigAuditReportContent> contentList = new ArrayList<>();
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/model/ConfigAuditReport.java b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/model/ConfigAuditReport.java
index 21bcc73..eaf16d6 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/model/ConfigAuditReport.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/model/ConfigAuditReport.java
@@ -1,5 +1,6 @@
 package com.zt.life.modules.configAuditReport.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.zt.common.entity.BusiEntity;
@@ -41,4 +42,12 @@
 	@ApiModelProperty(value = "骞翠唤")
 	private String year;
 
+	@TableField(exist = false)
+	@ApiModelProperty(value = "椤圭洰鏍囪瘑")
+	private String softwareIdentity;
+
+	@TableField(exist = false)
+	@ApiModelProperty(value = "椤圭洰鍚嶇О")
+	private String softwareName;
+
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/service/ConfigAuditReportService.java b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/service/ConfigAuditReportService.java
index f8243ba..9a0efef 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/service/ConfigAuditReportService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/service/ConfigAuditReportService.java
@@ -1,7 +1,9 @@
 package com.zt.life.modules.configAuditReport.service;
 
+import cn.hutool.core.convert.Convert;
 import com.zt.common.service.BaseService;
 import com.zt.common.utils.CommonUtils;
+import com.zt.life.export.dto.WordFile;
 import com.zt.life.export.service.WordFileService;
 import com.zt.life.modules.baselineRelease.dto.BaselineDto;
 import com.zt.life.modules.baselineRelease.model.BaselineRelease;
@@ -20,6 +22,7 @@
 import com.zt.life.modules.mainPart.utils.GetFilesPath;
 import com.zt.life.modules.mainPart.utils.GetShowDictList;
 import com.zt.life.modules.project.model.Project;
+import com.zt.life.modules.project.model.SoftwareTestOrder;
 import com.zt.life.modules.project.model.SoftwareTestOrderDeliverable;
 import com.zt.life.modules.project.model.SoftwareTestOrderMeasured;
 import com.zt.life.modules.project.service.ProjectService;
@@ -37,6 +40,10 @@
 import org.springframework.stereotype.Service;
 import com.zt.common.db.query.QueryFilter;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileNotFoundException;
+import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -75,8 +82,6 @@
     @Autowired
     private WordFileService wordFileService;
 
-    @Autowired
-    private GetFilesPath getFilesPath;
     /**
      * 鍒嗛〉鏌ヨ
      *
@@ -84,7 +89,11 @@
      * @return
      */
     public List<ConfigAuditReport> page(QueryFilter queryFilter) {
-        return baseDao.getList(queryFilter.getQueryParams());
+        List<ConfigAuditReport> list = baseDao.getList(queryFilter.getQueryParams());
+        if (list != null && list.size() > 0) {
+            sysOssService.setListOsses(list, "config_audit_report");
+        }
+        return list;
     }
 
     /**
@@ -156,6 +165,32 @@
                 problemService.insert(problem);
             }
         }
+        sysOssConfigService.updateOss(configAuditDto.getId(), configAuditDto.getFiles());// 淇濆瓨闄勪欢
         return true;
     }
+
+    public void exportConfigAudit(Long id, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            ConfigAuditDto dataObj = this.getDto(null, id);
+            //閫氱敤瀛楀吀鍒楄〃瀛楃涓茬敓鎴�
+            for (ConfigAuditReportContent content : dataObj.getContentList()) {
+                String value = content.getAuditResult();
+                String auditResult = getShowDictList.getShowDictList(value, "status_tag", false);
+                content.setAuditResult(auditResult);
+            }
+            for (ConfigAuditReportProblem problem : dataObj.getProblemList()) {
+                String value = problem.getIsNotTrue();
+                String IsNotTrue = getShowDictList.getShowDictList(value, "is_or_not", false);
+                problem.setIsNotTrue(IsNotTrue);
+            }
+            WordFile wordFile = new WordFile();
+            wordFile.setModulePath("閰嶇疆瀹℃牳鎶ュ憡.docx");
+            wordFile.setWordName(dataObj.getProject().getSoftwareName() + "_閰嶇疆瀹℃牳鎶ュ憡.docx");
+            wordFileService.exportWordFile(request, dataObj, wordFile, response);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/project/controller/ProjectController.java b/modules/mainPart/src/main/java/com/zt/life/modules/project/controller/ProjectController.java
index a136934..ae3fd5c 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/project/controller/ProjectController.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/project/controller/ProjectController.java
@@ -67,7 +67,7 @@
             @ApiImplicitParam(name = "pageCode", value = "椤甸潰鏍囪瘑", dataType = Constant.QT.STRING),
     })
     public PageResult<Project> page(@ApiIgnore @QueryParam QueryFilter queryFilter) {
-        if (queryFilter.getParams().containsValue("baseline_release")||queryFilter.getParams().containsValue("config_item_warehouse")){
+        if (queryFilter.getParams().containsValue("baseline_release")||queryFilter.getParams().containsValue("config_item_warehouse")||queryFilter.getParams().containsValue("test_review_comment")){
             queryFilter.getParams().replace("tableName","");
         }
         List<Project> Project =projectService.page(queryFilter);
@@ -94,7 +94,7 @@
         map.put("year", year);
         project.setYear(year);
         project.setCode(sysCodeRuleService.getNewCode(map));
-        String leaderName = sysUserService.getUsersName(Convert.toLong(project.getProjectLeader()));
+        String leaderName = sysUserService.getUsersName(project.getProjectLeader());
         project.setProjectLeader(leaderName);
         projectService.insert(project);
         return Result.ok();
@@ -106,8 +106,21 @@
     public Result update(@RequestBody Project project) {
         //鏁堥獙鏁版嵁
         ValidatorUtils.validateEntity(project, UpdateGroup.class, DefaultGroup.class);
-        String leaderName = sysUserService.getUsersName(Convert.toLong(project.getProjectLeader()));
+        String leaderName = project.getProjectLeader();
+        String projectTesters =project.getProjectTesters();
+        String projectReviewer =project.getProjectReviewer();
+        if (leaderName.length()>10){
+            leaderName=sysUserService.getNames(leaderName);
+        }
+        if (projectTesters.length()>10){
+            projectTesters=sysUserService.getNames(projectTesters);
+        }
+        if (projectReviewer.length()>10){
+            projectReviewer=sysUserService.getNames(projectReviewer);
+        }
         project.setProjectLeader(leaderName);
+        project.setProjectTesters(projectTesters);
+        project.setProjectReviewer(projectReviewer);
         projectService.update(project);
         return Result.ok();
     }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportController.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportController.java
new file mode 100644
index 0000000..f03abe5
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportController.java
@@ -0,0 +1,123 @@
+package com.zt.life.modules.qaAuditReport.controller;
+
+
+import com.zt.common.annotation.LogOperation;
+import com.zt.common.constant.Constant;
+import com.zt.common.annotation.QueryParam;
+import com.zt.common.db.query.QueryFilter;
+import com.zt.common.servlet.Result;
+import com.zt.common.servlet.PageResult;
+import com.zt.common.validator.AssertUtils;
+import com.zt.common.validator.ValidatorUtils;
+import com.zt.common.validator.group.AddGroup;
+import com.zt.common.validator.group.DefaultGroup;
+import com.zt.common.validator.group.UpdateGroup;
+import com.zt.life.modules.configAuditReport.dto.ConfigAuditDto;
+import com.zt.life.modules.qaAuditReport.dto.QaAuditReportDto;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReport;
+import com.zt.life.modules.qaAuditReport.service.QaAuditReportService;
+import com.zt.life.sys.dto.OssDto;
+import com.zt.life.sys.service.SysOssConfigService;
+import com.zt.modules.coderule.service.SysCodeRuleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * qa_audit_report
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@RestController
+@RequestMapping("/qaAuditReport/QaAuditReport/")
+@Api(tags="qa_audit_report")
+public class QaAuditReportController {
+    @Autowired
+    private QaAuditReportService qaAuditReportService;
+
+    @Autowired
+    private SysCodeRuleService sysCodeRuleService;
+
+    @Autowired
+    private SysOssConfigService sysOssConfigService;
+
+    @GetMapping("page")
+    @ApiOperation("鍒嗛〉")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = Constant.Q.PAGE, value = Constant.QV.PAGE, required = true, dataType = Constant.QT.INT),
+        @ApiImplicitParam(name = Constant.Q.LIMIT, value = Constant.QV.LIMIT, required = true, dataType = Constant.QT.INT),
+        @ApiImplicitParam(name = Constant.Q.ORDER_FIELD, value = Constant.QV.ORDER_FIELD, dataType = Constant.QT.STRING),
+        @ApiImplicitParam(name = Constant.Q.ORDER, value = Constant.QV.ORDER, dataType = Constant.QT.STRING),
+        @ApiImplicitParam(name = "code", value = "缂栧彿", dataType = Constant.QT.STRING, format = "code^LK")    })
+    public PageResult<QaAuditReport> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
+        return PageResult.ok(qaAuditReportService.page(queryFilter));
+    }
+
+    @GetMapping("getDto")
+    @ApiOperation("淇℃伅")
+    public Result<QaAuditReportDto> getDto(Long projectId, Long reportId) {
+        QaAuditReportDto data =qaAuditReportService.getDto(projectId, reportId);
+        if (reportId!=null) {
+            OssDto ossDto = sysOssConfigService.getOssByBusiType(reportId, "qa_audit_report");
+            if (ossDto != null) {
+                data.setFiles(ossDto);
+            }
+        }
+        return Result.ok(data);
+    }
+
+    @PostMapping
+    @ApiOperation("鏂板")
+    @LogOperation("鏂板")
+    public Result insert(@RequestBody QaAuditReportDto qaAuditReportDto){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(qaAuditReportDto, AddGroup.class, DefaultGroup.class);
+        Map<String, String> map = new HashMap<>();
+        map.put("funCode", "qa_audit_report");
+        map.put("projectId",qaAuditReportDto.getProjectId().toString());
+        qaAuditReportDto.getAuditReport().setCode(sysCodeRuleService.getNewCode(map));
+        Boolean result = qaAuditReportService.save(qaAuditReportDto);
+        return Result.ok();
+    }
+
+    @PutMapping
+    @ApiOperation("淇敼")
+    @LogOperation("淇敼")
+    public Result update(@RequestBody QaAuditReportDto qaAuditReportDto){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(qaAuditReportDto, UpdateGroup.class, DefaultGroup.class);
+        Boolean result = qaAuditReportService.save(qaAuditReportDto);
+        return Result.ok();
+    }
+
+
+    @DeleteMapping("deleteQaReport")
+    @ApiOperation("鍒犻櫎")
+    @LogOperation("鍒犻櫎")
+    public Result delete(@RequestBody Long[] ids){
+        //鏁堥獙鏁版嵁
+        AssertUtils.isArrayEmpty(ids, "id");
+        qaAuditReportService.delete(ids);
+
+        return Result.ok();
+    }
+    @GetMapping("exportQaReport")
+    @ApiOperation("鎵撳嵃QA瀹℃牳鎶ュ憡")
+    @LogOperation("鎵撳嵃QA瀹℃牳鎶ュ憡")
+    public void exportQaReport(Long id, HttpServletRequest request, HttpServletResponse response) {
+        qaAuditReportService.exportQaReport(id, request, response);
+    }
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportIncongruentController.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportIncongruentController.java
new file mode 100644
index 0000000..fd3baba
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportIncongruentController.java
@@ -0,0 +1,96 @@
+package com.zt.life.modules.qaAuditReport.controller;
+
+
+import com.zt.common.annotation.LogOperation;
+import com.zt.common.constant.Constant;
+import com.zt.common.annotation.QueryParam;
+import com.zt.common.db.query.QueryFilter;
+import com.zt.common.servlet.Result;
+import com.zt.common.servlet.PageResult;
+import com.zt.common.validator.AssertUtils;
+import com.zt.common.validator.ValidatorUtils;
+import com.zt.common.validator.group.AddGroup;
+import com.zt.common.validator.group.DefaultGroup;
+import com.zt.common.validator.group.UpdateGroup;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent;
+import com.zt.life.modules.qaAuditReport.service.QaAuditReportIncongruentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+
+/**
+ * qa_audit_report_incongruent
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@RestController
+@RequestMapping("/qaAuditReport/QaAuditReportIncongruent/")
+@Api(tags="qa_audit_report_incongruent")
+public class QaAuditReportIncongruentController {
+    @Autowired
+    private QaAuditReportIncongruentService qaAuditReportIncongruentService;
+
+    @GetMapping("page")
+    @ApiOperation("鍒嗛〉")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = Constant.Q.PAGE, value = Constant.QV.PAGE, required = true, dataType = Constant.QT.INT),
+        @ApiImplicitParam(name = Constant.Q.LIMIT, value = Constant.QV.LIMIT, required = true, dataType = Constant.QT.INT),
+        @ApiImplicitParam(name = Constant.Q.ORDER_FIELD, value = Constant.QV.ORDER_FIELD, dataType = Constant.QT.STRING),
+        @ApiImplicitParam(name = Constant.Q.ORDER, value = Constant.QV.ORDER, dataType = Constant.QT.STRING),
+    })
+    public PageResult<QaAuditReportIncongruent> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
+
+        return PageResult.ok(qaAuditReportIncongruentService.page(queryFilter));
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation("淇℃伅")
+    public Result<QaAuditReportIncongruent> get(@PathVariable("id") Long id){
+        QaAuditReportIncongruent data = qaAuditReportIncongruentService.get(id);
+
+        return Result.ok(data);
+    }
+
+    @PostMapping
+    @ApiOperation("鏂板")
+    @LogOperation("鏂板")
+    public Result insert(@RequestBody QaAuditReportIncongruent qaAuditReportIncongruent){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(qaAuditReportIncongruent, AddGroup.class, DefaultGroup.class);
+        qaAuditReportIncongruentService.insert(qaAuditReportIncongruent);
+
+        return Result.ok();
+    }
+
+    @PutMapping
+    @ApiOperation("淇敼")
+    @LogOperation("淇敼")
+    public Result update(@RequestBody QaAuditReportIncongruent qaAuditReportIncongruent){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(qaAuditReportIncongruent, UpdateGroup.class, DefaultGroup.class);
+        qaAuditReportIncongruentService.update(qaAuditReportIncongruent);
+
+        return Result.ok();
+    }
+
+    @DeleteMapping
+    @ApiOperation("鍒犻櫎")
+    @LogOperation("鍒犻櫎")
+    public Result delete(@RequestBody Long[] ids){
+        //鏁堥獙鏁版嵁
+        AssertUtils.isArrayEmpty(ids, "id");
+        qaAuditReportIncongruentService.delete(ids);
+
+        return Result.ok();
+    }
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportDao.java
new file mode 100644
index 0000000..b955732
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportDao.java
@@ -0,0 +1,23 @@
+package com.zt.life.modules.qaAuditReport.dao;
+
+import com.zt.common.dao.BaseDao;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReport;
+import org.apache.ibatis.annotations.Mapper;
+
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * qa_audit_report
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@Mapper
+public interface QaAuditReportDao extends BaseDao<QaAuditReport> {
+
+    List<QaAuditReport> getList(Map<String, Object> params);
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportIncongruentDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportIncongruentDao.java
new file mode 100644
index 0000000..c34e1d7
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportIncongruentDao.java
@@ -0,0 +1,24 @@
+package com.zt.life.modules.qaAuditReport.dao;
+
+import com.zt.common.dao.BaseDao;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent;
+import org.apache.ibatis.annotations.Mapper;
+
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * qa_audit_report_incongruent
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@Mapper
+public interface QaAuditReportIncongruentDao extends BaseDao<QaAuditReportIncongruent> {
+
+    List<QaAuditReportIncongruent> getList(Map<String, Object> params);
+
+    List<QaAuditReportIncongruent> createList(Long projectId);
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dto/QaAuditReportDto.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dto/QaAuditReportDto.java
new file mode 100644
index 0000000..0447597
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dto/QaAuditReportDto.java
@@ -0,0 +1,34 @@
+package com.zt.life.modules.qaAuditReport.dto;
+
+import com.zt.life.modules.configAuditReport.model.ConfigAuditReport;
+import com.zt.life.modules.configAuditReport.model.ConfigAuditReportContent;
+import com.zt.life.modules.configAuditReport.model.ConfigAuditReportProblem;
+import com.zt.life.modules.project.model.Project;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReport;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent;
+import com.zt.life.sys.dto.OssDto;
+import com.zt.modules.workflow.dto.FlowInfoDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class QaAuditReportDto {
+    private Long id;
+    private Long projectId;
+    private Long reportId;
+
+    @ApiModelProperty(value = "閰嶇疆瀹℃牳鎶ュ憡")
+    private QaAuditReport auditReport;
+    @ApiModelProperty(value = "娴嬭瘯椤圭洰鍩烘湰淇℃伅")
+    private Project project;
+
+    private FlowInfoDto flowInfoDto;
+    @ApiModelProperty(value = "闄勪欢")
+    private OssDto files;
+
+    @ApiModelProperty(value = "涓嶇鍚堥」鍒楄〃")
+    private List<QaAuditReportIncongruent> incongruentList = new ArrayList<>();
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReport.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReport.java
new file mode 100644
index 0000000..7c02232
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReport.java
@@ -0,0 +1,63 @@
+package com.zt.life.modules.qaAuditReport.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zt.common.entity.BusiEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * qa_audit_report
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("qa_audit_report")
+public class QaAuditReport extends BusiEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "椤圭洰ID")
+	private Long projectId;
+
+	@ApiModelProperty(value = "缂栧彿")
+	private String code;
+
+	@ApiModelProperty(value = "宸插畬鎴愮殑妫�鏌�")
+	private String completedCheck;
+
+	@ApiModelProperty(value = "qa鎬荤粨")
+	private String qaSummary;
+
+	@ApiModelProperty(value = "妫�鏌ヤ汉")
+	private String checker;
+
+	@ApiModelProperty(value = "妫�鏌ヤ汉ID")
+	private Long checkerId;
+
+	@ApiModelProperty(value = "妫�鏌ユ棩鏈�")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date checkDate;
+
+	@ApiModelProperty(value = "鐩戠潱浜烘剰瑙�")
+	private String supervisorOpinion;
+
+	@ApiModelProperty(value = "鐩戠潱浜虹鍚�")
+	private String supervisorSign;
+
+	@ApiModelProperty(value = "鐩戠潱浜篒D")
+	private Long supervisorId;
+
+	@ApiModelProperty(value = "鐩戠潱鏃ユ湡")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date superviseDate;
+
+	@ApiModelProperty(value = "骞翠唤")
+	private String year;
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReportIncongruent.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReportIncongruent.java
new file mode 100644
index 0000000..3a0fe9b
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReportIncongruent.java
@@ -0,0 +1,54 @@
+package com.zt.life.modules.qaAuditReport.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zt.common.entity.BusiEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * qa_audit_report_incongruent
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("qa_audit_report_incongruent")
+public class QaAuditReportIncongruent extends BusiEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "鎶ュ憡ID")
+	private Long reportId;
+
+	@ApiModelProperty(value = "椤圭洰宸ョ▼ID")
+	private Long projectId;
+
+	@ApiModelProperty(value = "搴忓彿")
+	private Integer no;
+
+	@ApiModelProperty(value = "涓嶇鍚堥」鍗曞彿")
+	private String oddNum;
+
+	@ApiModelProperty(value = "涓嶇鍚堥」鎻忚堪")
+	private String describe;
+
+	@ApiModelProperty(value = "鎵�灞炲伐浣滀骇鍝�/杩囩▼")
+	private String workProcess;
+
+	@ApiModelProperty(value = "鍙戠幇闃舵")
+	private String discoveryPhase;
+
+	@ApiModelProperty(value = "璐d换浜�")
+	private String chargePerson;
+
+	@ApiModelProperty(value = "鐘舵��")
+	private String status;
+
+	@ApiModelProperty(value = "澶囨敞")
+	private String remark;
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportIncongruentService.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportIncongruentService.java
new file mode 100644
index 0000000..24a02a3
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportIncongruentService.java
@@ -0,0 +1,51 @@
+package com.zt.life.modules.qaAuditReport.service;
+
+import com.zt.common.service.BaseService;
+import com.zt.life.modules.qaAuditReport.dao.QaAuditReportIncongruentDao;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent;
+import org.springframework.stereotype.Service;
+import com.zt.common.db.query.QueryFilter;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * qa_audit_report_incongruent
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@Service
+public class QaAuditReportIncongruentService  extends BaseService<QaAuditReportIncongruentDao, QaAuditReportIncongruent> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param queryFilter
+     * @return
+     */
+    public List<QaAuditReportIncongruent> page(QueryFilter queryFilter) {
+        return baseDao.getList(queryFilter.getQueryParams());
+    }
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ids
+     */
+    public void delete(Long[] ids) {
+        super.deleteLogic(ids);
+    }
+
+    public List<QaAuditReportIncongruent> getList(Long reportId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("reportId",reportId);
+        return baseDao.getList(params);
+    }
+
+    public List<QaAuditReportIncongruent> createList(Long projectId) {
+        return baseDao.createList(projectId);
+    }
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportService.java b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportService.java
new file mode 100644
index 0000000..b617d53
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportService.java
@@ -0,0 +1,182 @@
+package com.zt.life.modules.qaAuditReport.service;
+
+import cn.hutool.core.convert.Convert;
+import com.zt.common.service.BaseService;
+import com.zt.common.utils.CommonUtils;
+import com.zt.life.export.dto.WordFile;
+import com.zt.life.export.service.WordFileService;
+import com.zt.life.modules.baselineRelease.dto.BaselineDto;
+import com.zt.life.modules.configAuditReport.dto.ConfigAuditDto;
+import com.zt.life.modules.configAuditReport.model.ConfigAuditReport;
+import com.zt.life.modules.configAuditReport.model.ConfigAuditReportContent;
+import com.zt.life.modules.configAuditReport.model.ConfigAuditReportProblem;
+import com.zt.life.modules.configAuditReport.service.ConfigAuditReportContentService;
+import com.zt.life.modules.configAuditReport.service.ConfigAuditReportProblemService;
+import com.zt.life.modules.mainPart.utils.GetFilesPath;
+import com.zt.life.modules.mainPart.utils.GetShowDictList;
+import com.zt.life.modules.project.service.ProjectService;
+import com.zt.life.modules.qaAuditReport.dao.QaAuditReportDao;
+import com.zt.life.modules.qaAuditReport.dto.QaAuditReportDto;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReport;
+import com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent;
+import com.zt.life.sys.service.SysOssConfigService;
+import com.zt.modules.coderule.service.SysCodeRuleService;
+import com.zt.modules.oss.service.SysOssService;
+import com.zt.modules.workflow.dto.FlowInfoDto;
+import com.zt.modules.workflow.service.WorkflowService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.zt.common.db.query.QueryFilter;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileNotFoundException;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * qa_audit_report
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-29
+ */
+@Service
+public class QaAuditReportService  extends BaseService<QaAuditReportDao, QaAuditReport> {
+    @Autowired
+    private SysOssConfigService sysOssConfigService;
+
+    @Autowired
+    private SysOssService sysOssService;
+
+    @Autowired
+    private SysCodeRuleService sysCodeRuleService;
+
+    @Autowired
+    private ProjectService projectService;
+
+    @Autowired
+    private GetShowDictList getShowDictList;
+
+    @Autowired
+    private WordFileService wordFileService;
+
+    @Autowired
+    private GetFilesPath getFilesPath;
+
+    @Autowired
+    private  QaAuditReportIncongruentService incongruentService;
+
+
+    @Autowired
+    private WorkflowService workflowService;
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param queryFilter
+     * @return
+     */
+    public List<QaAuditReport> page(QueryFilter queryFilter) {
+        List<QaAuditReport> list = baseDao.getList(queryFilter.getQueryParams());
+        if (list != null && list.size() > 0) {
+            workflowService.getRunFlow(list, "pzbgsh");
+            sysOssService.setListOsses(list, "qa_audit_report");
+        }
+        return list;
+    }
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ids
+     */
+    public void delete(Long[] ids) {
+        super.deleteLogic(ids);
+    }
+
+    public QaAuditReportDto getDto(Long projectId, Long reportId) {
+        QaAuditReportDto data = new QaAuditReportDto();
+        if (reportId != null) {
+            data.setId(reportId);
+            QaAuditReport auditReport = this.get(reportId);
+            data.setAuditReport(auditReport);
+            if (auditReport != null && projectId == null) {
+                projectId = auditReport.getProjectId();
+            }
+            List<QaAuditReportIncongruent> incongruentList = incongruentService.getList(reportId);
+            data.setIncongruentList(incongruentList);
+        } else {
+            QaAuditReport auditReport = new QaAuditReport();
+            data.setAuditReport(auditReport);
+            List<QaAuditReportIncongruent> incongruentList = incongruentService.createList(projectId);
+            data.setIncongruentList(incongruentList);
+        }
+        if (projectId != null) {
+            data.setProjectId(projectId);
+            data.setProject(projectService.get(projectId));
+        }
+        return data;
+    }
+
+    public Boolean save(QaAuditReportDto qaAuditReportDto) {
+        Long reportId = qaAuditReportDto.getAuditReport().getId();
+        if (reportId != null)
+            baseDao.updateById(qaAuditReportDto.getAuditReport());
+        else {
+            Map<String, String> map = new HashMap<>();
+            map.put("funCode", "qa_audit_report");
+            map.put("projectId", qaAuditReportDto.getProjectId().toString());
+            qaAuditReportDto.getAuditReport().setProjectId(qaAuditReportDto.getProjectId());
+            qaAuditReportDto.getAuditReport().setCode(sysCodeRuleService.getNewCode(map));
+            baseDao.insert(qaAuditReportDto.getAuditReport());
+            reportId = qaAuditReportDto.getAuditReport().getId();
+        }
+
+        for (QaAuditReportIncongruent incongruent : qaAuditReportDto.getIncongruentList()) {
+            incongruent.setReportId(reportId);
+            if (incongruent.getId() != null) {
+                QaAuditReportIncongruent incongruent2 = incongruentService.get(incongruent.getId());
+                if (CommonUtils.isActureChangeData(incongruent,incongruent2)) {
+                    incongruentService.update(incongruent);
+                }
+            } else {
+                incongruent.setProjectId(qaAuditReportDto.getAuditReport().getProjectId());
+                incongruentService.insert(incongruent);
+            }
+        }
+
+        sysOssConfigService.updateOss(qaAuditReportDto.getId(), qaAuditReportDto.getFiles());// 淇濆瓨闄勪欢
+        Long bizId = qaAuditReportDto.getAuditReport().getId();
+        FlowInfoDto flowInfoDto = qaAuditReportDto.getFlowInfoDto();
+
+        if (flowInfoDto != null && flowInfoDto.getSubmitType() != null && "tj,bl".contains(flowInfoDto.getSubmitType())) {
+            if ("tj".equals(flowInfoDto.getSubmitType())) {
+                workflowService.startFlow(flowInfoDto.getFlowCode(), bizId);
+            }
+            workflowService.approvePass(flowInfoDto.getFlowCode(), bizId, flowInfoDto.getStepIdMark());
+        }
+        return true;
+    }
+
+    public void exportQaReport(Long id, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            QaAuditReportDto dataObj = this.getDto(null, id);
+
+            String CheckerPath = "鏂囦欢鍥剧墖:" + getFilesPath.getSignPath(Convert.toLong(dataObj.getAuditReport().getCheckerId()));
+            dataObj.getAuditReport().setChecker(CheckerPath);
+            String SupervisorPath = "鏂囦欢鍥剧墖:" + getFilesPath.getSignPath(Convert.toLong(dataObj.getAuditReport().getSupervisorId()));
+            dataObj.getAuditReport().setSupervisorSign(SupervisorPath);
+
+            WordFile wordFile = new WordFile();
+            wordFile.setModulePath("QA瀹℃牳鎶ュ憡.docx");
+            wordFile.setWordName(dataObj.getProject().getSoftwareName() + "_QA瀹℃牳鎶ュ憡.docx");
+            wordFileService.exportWordFile(request, dataObj, wordFile, response);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/controller/TestReviewCommentController.java b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/controller/TestReviewCommentController.java
index afd33b0..4c288f2 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/controller/TestReviewCommentController.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/controller/TestReviewCommentController.java
@@ -16,6 +16,8 @@
 import com.zt.life.modules.testReviewComment.dto.ReviewCommentDto;
 import com.zt.life.modules.testReviewComment.model.TestReviewComment;
 import com.zt.life.modules.testReviewComment.service.TestReviewCommentService;
+import com.zt.life.sys.dto.OssDto;
+import com.zt.life.sys.service.SysOssConfigService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -41,6 +43,8 @@
 public class TestReviewCommentController {
     @Autowired
     private TestReviewCommentService testReviewCommentService;
+    @Autowired
+    private SysOssConfigService sysOssConfigService;
 
     @GetMapping("page")
     @ApiOperation("鍒嗛〉")
@@ -51,6 +55,7 @@
         @ApiImplicitParam(name = Constant.Q.ORDER, value = Constant.QV.ORDER, dataType = Constant.QT.STRING),
         @ApiImplicitParam(name = "code", value = "娴嬭瘯璇勫缂栧彿", dataType = Constant.QT.STRING, format = "a.code^LK"),
         @ApiImplicitParam(name = "softwareName", value = "椤圭洰鍚嶇О", dataType = Constant.QT.STRING, format = "p.software_name^LK"),
+        @ApiImplicitParam(name = "softwareIdentity", value = "椤圭洰鏍囪瘑", dataType = Constant.QT.STRING, format = "p.software_identity^LK"),
         @ApiImplicitParam(name = "pageCode", value = "閰嶇疆椤规爣璇�", dataType = Constant.QT.STRING, format = "a.page_code^LK")
 })
     public PageResult<TestReviewComment> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
@@ -61,6 +66,12 @@
     @ApiOperation("淇℃伅")
     public Result<ReviewCommentDto> getDto(Long commentId, Long projectId, String pageCode) {
         ReviewCommentDto data = testReviewCommentService.getDto(commentId, projectId, pageCode);
+        if (commentId!=null) {
+            OssDto ossDto = sysOssConfigService.getOssByBusiType(commentId, "test_review_comment_"+ pageCode);
+            if (ossDto != null) {
+                data.setFiles(ossDto);
+            }
+        }
         return Result.ok(data);
     }
 
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/dto/ReviewCommentDto.java b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/dto/ReviewCommentDto.java
index 356b6e8..cadad1d 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/dto/ReviewCommentDto.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/dto/ReviewCommentDto.java
@@ -5,6 +5,7 @@
 import com.zt.life.modules.project.model.Project;
 import com.zt.life.modules.sysBaseInfo.model.TestAgencyInfo;
 import com.zt.life.modules.testReviewComment.model.TestReviewComment;
+import com.zt.life.sys.dto.OssDto;
 import com.zt.modules.workflow.dto.FlowInfoDto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -18,6 +19,8 @@
     private Long projectId;//椤圭洰ID
     private String pageCode;//閰嶇疆椤圭被鍨�
 
+    @ApiModelProperty(value = "闄勪欢")
+    private OssDto files;
     
     @ApiModelProperty(value = "娴嬭瘯璇勫鎰忚")
     private TestReviewComment reviewComment;
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/model/TestReviewComment.java b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/model/TestReviewComment.java
index cba340a..5068aa8 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/model/TestReviewComment.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/model/TestReviewComment.java
@@ -1,5 +1,6 @@
 package com.zt.life.modules.testReviewComment.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.zt.common.entity.BusiEntity;
@@ -35,4 +36,8 @@
 	@ApiModelProperty(value = "璇勫浜烘暟")
 	private Integer reviewerNum;
 
+	@TableField(exist = false)
+	@ApiModelProperty(value = "椤圭洰鍚嶇О")
+	private String softwareName;
+
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/service/TestReviewCommentService.java b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/service/TestReviewCommentService.java
index 7a93a5b..a5e6639 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/service/TestReviewCommentService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/service/TestReviewCommentService.java
@@ -14,12 +14,14 @@
 import com.zt.life.modules.testReviewComment.dto.ReviewCommentDto;
 import com.zt.life.modules.testReviewComment.model.TestReviewComment;
 import com.zt.life.sys.dto.OssDto;
+import com.zt.life.sys.service.SysOssConfigService;
 import com.zt.modules.coderule.service.SysCodeRuleService;
 import com.zt.modules.oss.service.SysOssService;
 import com.zt.modules.workflow.dto.FlowInfoDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.zt.common.db.query.QueryFilter;
+
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -28,16 +30,18 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 /**
  * test_review_comment
  *
- * @author zt generator 
+ * @author zt generator
  * @since 1.0.0 2023-12-28
  */
 @Service
-public class TestReviewCommentService  extends BaseService<TestReviewCommentDao, TestReviewComment> {
+public class TestReviewCommentService extends BaseService<TestReviewCommentDao, TestReviewComment> {
 
     @Autowired
     private SysOssService sysOssService;
@@ -46,7 +50,7 @@
     private ProjectService projectService;
 
     @Autowired
-    private SysCodeRuleService sysCodeRuleService;
+    private SysOssConfigService sysOssConfigService;
 
     @Autowired
     private WordFileService wordFileService;
@@ -61,9 +65,11 @@
      * @return
      */
     public List<TestReviewComment> page(QueryFilter queryFilter) {
+        String pageCode = String.valueOf(queryFilter.getParams().get("pageCode"));
+        pageCode=pageCode.replace("%","");
         List<TestReviewComment> list = baseDao.getList(queryFilter.getQueryParams());
         if (list.size() > 0) {
-            sysOssService.setListOsses(list, "test_review_comment");
+            sysOssService.setListOsses(list, "test_review_comment_" + pageCode);
         }
         return list;
     }
@@ -89,6 +95,7 @@
             }
         } else {
             TestReviewComment reviewComment = new TestReviewComment();
+            reviewComment.setPageCode(pageCode);
             data.setReviewComment(reviewComment);
         }
         if (projectId != null) {
@@ -107,15 +114,22 @@
             baseDao.insert(reviewCommentDto.getReviewComment());
             commentId = reviewCommentDto.getReviewComment().getId();
         }
+        sysOssConfigService.updateOss(reviewCommentDto.getId(), reviewCommentDto.getFiles());// 淇濆瓨闄勪欢
         return commentId;
     }
 
     public void exportReviewComment(Long id, String pageCode, HttpServletRequest request, HttpServletResponse response) {
         try {
             ReviewCommentDto dataObj = this.getDto(id, null, pageCode);
+            Map<String, String> map = new HashMap<>();
+            map.put("plan", "璁″垝");
+            map.put("ready", "灏辩华");
+            map.put("summary", "娴嬭瘯鎬荤粨");
+            String type = map.get(pageCode);
+            dataObj.setPageCode(type);
             WordFile wordFile = new WordFile();
-            wordFile.setModulePath("鍩虹嚎鍙戝竷涔�.docx");
-            wordFile.setWordName(dataObj.getProject().getSoftwareName() + "_鍩虹嚎鍙戝竷涔�.docx");
+            wordFile.setModulePath("娴嬭瘯" + type + "璇勫鎰忚.docx");
+            wordFile.setWordName(dataObj.getProject().getSoftwareName() + "_娴嬭瘯" + type + "璇勫鎰忚.docx");
             wordFileService.exportWordFile(request, dataObj, wordFile, response);
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
diff --git a/modules/mainPart/src/main/resources/mapper/configAuditReport/ConfigAuditReportDao.xml b/modules/mainPart/src/main/resources/mapper/configAuditReport/ConfigAuditReportDao.xml
index da5da9d..e6b9fc2 100644
--- a/modules/mainPart/src/main/resources/mapper/configAuditReport/ConfigAuditReportDao.xml
+++ b/modules/mainPart/src/main/resources/mapper/configAuditReport/ConfigAuditReportDao.xml
@@ -4,10 +4,11 @@
 <mapper namespace="com.zt.life.modules.configAuditReport.dao.ConfigAuditReportDao">
 
     <select id="getList" resultType="com.zt.life.modules.configAuditReport.model.ConfigAuditReport">
-        select a.*
+        select a.*,p.software_identity,p.software_name
         from config_audit_report a
+        INNER JOIN project p ON p.id = a.project_id
         <where>
-            a.is_delete = 0
+            a.is_delete = 0 and p.is_delete = 0
             <if test="whereSql!=null">
                 and ${whereSql}
             </if>
diff --git a/modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportDao.xml b/modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportDao.xml
new file mode 100644
index 0000000..85dc710
--- /dev/null
+++ b/modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportDao.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.zt.life.modules.qaAuditReport.dao.QaAuditReportDao">
+
+    <select id="getList" resultType="com.zt.life.modules.qaAuditReport.model.QaAuditReport">
+        select a.*
+        from qa_audit_report a
+        <where>
+            a.is_delete = 0
+            <if test="whereSql!=null">
+                and ${whereSql}
+            </if>
+        </where>
+        <if test="orderBySql!=null">
+            ORDER BY ${orderBySql}
+        </if>
+    </select>
+
+</mapper>
diff --git a/modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportIncongruentDao.xml b/modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportIncongruentDao.xml
new file mode 100644
index 0000000..c8c70c6
--- /dev/null
+++ b/modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportIncongruentDao.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.zt.life.modules.qaAuditReport.dao.QaAuditReportIncongruentDao">
+
+    <select id="getList" resultType="com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent">
+        select a.*
+        from qa_audit_report_incongruent a
+        <where>
+            a.is_delete = 0
+            <if test="reportId!=null">
+                and a.report_id = ${reportId}
+            </if>
+        </where>
+        <if test="orderBySql!=null">
+            ORDER BY ${orderBySql}
+        </if>
+    </select>
+    <select id="createList" resultType="com.zt.life.modules.qaAuditReport.model.QaAuditReportIncongruent">
+        select b.code as oddNum,a.check_content as 'describe',b.page_code as discoveryPhase,b.processor as chargePerson,
+               case when b.processor is null then '鏈鐞�'
+                    else '宸查棴鐜�' end as status,
+               a.id as src_id
+        from test_check_order_list a,
+             test_check_order b
+        where b.project_id = ${projectId} and b.id =a.check_order_id
+          and a.is_delete = 0 and b.is_delete = 0
+          and a.check_result = 2
+          and b.page_code in ('','','','')
+        order by code,no
+    </select>
+
+</mapper>
diff --git a/modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml b/modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml
index 4ac09fd..a63ea34 100644
--- a/modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml
+++ b/modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml
@@ -17,5 +17,4 @@
             ORDER BY ${orderBySql}
         </if>
     </select>
-
 </mapper>
diff --git a/web/src/views/modules/configAuditReport/ConfigAuditReport-AddOrUpdate.vue b/web/src/views/modules/configAuditReport/ConfigAuditReport-AddOrUpdate.vue
index d8a2415..3c0d894 100644
--- a/web/src/views/modules/configAuditReport/ConfigAuditReport-AddOrUpdate.vue
+++ b/web/src/views/modules/configAuditReport/ConfigAuditReport-AddOrUpdate.vue
@@ -4,13 +4,13 @@
              label-width="120px" class="configAuditFormAuto">
       <div>
         <el-form-item label-width="60px" label="缂栧彿:" style="width:100%;margin-bottom: -5px">
-          <span>{{dataForm.circulatOrder.code || '缂栧彿鑷姩鐢熸垚'}}</span>
+          <span>{{dataForm.auditReport.code || '缂栧彿鑷姩鐢熸垚'}}</span>
         </el-form-item>
       </div>
       <div style="border: 1px solid rgba(0,0,0,.2);width: 99%">
         <div style="border-bottom: 1px solid rgba(0,0,0,.2);" class="configAuditContentWidth">
           <el-form-item class="marginTopAndMarginBottom" label="椤圭洰鍚嶇О" style="width: 48%">
-            <el-input v-model="dataForm.testAgencyInfo.agencyName" placeholder="椤圭洰鍚嶇О"></el-input>
+            <el-input v-model="dataForm.project.softwareName" placeholder="椤圭洰鍚嶇О"></el-input>
           </el-form-item>
           <el-form-item class="marginTopAndMarginBottom" label="椤圭洰鏍囪瘑" style="width: 48%">
             <el-input v-model="dataForm.project.softwareIdentity" placeholder="椤圭洰鏍囪瘑"></el-input>
@@ -20,37 +20,31 @@
           <div>
             <div style="text-align: center;font-weight: 600;border-bottom:1px solid rgba(0,0,0,.2);height: 40px;line-height: 40px;font-size: 18px">瀹℃牳鍐呭</div>
             <el-form-item label="鐘舵�佹爣璁�" label-width="150px" style="width:100%;padding-left:20px;margin-bottom:0">
-              <zt-dict v-model="dataForm.circulatOrder.itemRequire" :radio="true"
-                       dict="is_or_not"></zt-dict>
+              鈭氬悎鏍�         脳涓嶅悎鏍�       NA涓嶉�傜敤
             </el-form-item>
             <div class="table-container">
               <el-table ref="tableConfigAuditList" class="el-software el-margin-top-bot" border
-                        :data="dataForm.technicalList"
+                        :data="dataForm.contentList"
                         stripe>
                 <el-table-column prop="no" align="center" width="60" label="搴忓彿">
                   <template slot-scope="scope">
                     <span v-html="indexFormat(scope.$index)"></span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="infoName" min-width="180" label="鎶�鏈祫鏂欏悕绉�">
+                <el-table-column prop="auditContent" min-width="180" label="瀹℃牳鍐呭">
                   <template v-slot="{ row }">
-                    <el-input v-model="row.name" placeholder="鎶�鏈祫鏂欏悕绉�"></el-input>
+                    <el-input v-model="row.auditContent" placeholder="瀹℃牳鍐呭"></el-input>
                   </template>
                 </el-table-column>
-                <el-table-column prop="identify" align="center" width="150" label="鏍囪瘑">
+                <el-table-column prop="auditResult" align="center" width="150" label="瀹℃牳缁撴灉">
                   <template v-slot="{ row }">
-                    <el-input v-model="row.version" placeholder="鏍囪瘑"></el-input>
+                    <zt-dict v-model="row.auditResult" placeholder="瀹℃牳缁撴灉" dict="status_tag"
+                             clearable></zt-dict>
                   </template>
                 </el-table-column>
                 <el-table-column prop="remark" label="澶囨敞" width="100" align="center">
                   <template v-slot="{ row }">
                     <el-input v-model="row.remark" placeholder="澶囨敞"></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column fixed="right" prop="files" label="涓婁紶闄勪欢" width="300" align="center">
-                  <template v-slot="{ row }">
-                    <table-uploader busi-type="circulat_order" model-name="row" :dataForm="row"
-                                    v-model="row.files"/>
                   </template>
                 </el-table-column>
               </el-table>
@@ -60,32 +54,32 @@
             <div style="text-align: center;font-weight: 600;height: 40px;line-height: 40px;font-size: 18px">鍙戠幇鐨勯棶棰�</div>
             <div class="table-container">
               <el-table ref="tableConfigAuditList" class="el-software el-margin-top-bot" border
-                        :data="dataForm.technicalList"
+                        :data="dataForm.problemList"
                         stripe>
                 <el-table-column prop="no" align="center" width="60" label="搴忓彿">
                   <template slot-scope="scope">
                     <span v-html="indexFormat(scope.$index)"></span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="infoName" min-width="180" label="鎶�鏈祫鏂欏悕绉�">
+                <el-table-column prop="problemDescription" min-width="180" label="闂鎻忚堪">
                   <template v-slot="{ row }">
-                    <el-input v-model="row.name" placeholder="鎶�鏈祫鏂欏悕绉�"></el-input>
+                    <el-input v-model="row.problemDescription" placeholder="闂鎻忚堪"></el-input>
                   </template>
                 </el-table-column>
-                <el-table-column prop="identify" align="center" width="150" label="鏍囪瘑">
+                <el-table-column prop="isNotTrue" align="center" width="150" label="鏄惁涓轰笉绗﹀悎椤�">
                   <template v-slot="{ row }">
-                    <el-input v-model="row.version" placeholder="鏍囪瘑"></el-input>
+                    <zt-dict v-model="row.isNotTrue" placeholder="鏄惁涓轰笉绗﹀悎椤�" dict="is_or_not" :radio="true"
+                             clearable></zt-dict>
                   </template>
                 </el-table-column>
-                <el-table-column prop="remark" label="澶囨敞" width="100" align="center">
+                <el-table-column prop="problemRectification" label="闂鏁存敼鎯呭喌" width="100" align="center">
                   <template v-slot="{ row }">
-                    <el-input v-model="row.remark" placeholder="澶囨敞"></el-input>
+                    <el-input v-model="row.problemRectification" placeholder="闂鏁存敼鎯呭喌"></el-input>
                   </template>
                 </el-table-column>
-                <el-table-column fixed="right" prop="files" label="涓婁紶闄勪欢" width="300" align="center">
+                <el-table-column prop="discoveryPhase" label="鍙戠幇闃舵" width="100" align="center">
                   <template v-slot="{ row }">
-                    <table-uploader busi-type="circulat_order" model-name="row" :dataForm="row"
-                                    v-model="row.files"/>
+                    <el-input v-model="row.discoveryPhase" placeholder="鍙戠幇闃舵"></el-input>
                   </template>
                 </el-table-column>
               </el-table>
@@ -102,7 +96,9 @@
           </div>
           <div class="el-border-left-right" style="width: 20%;height: 40px;">
             <el-form-item style="width: 100%;padding-left:20px;margin:0;">
-              {{dataForm.circulatOrder.calibratDetector}}
+              <el-input type="textarea" :rows="1" placeholder="璇疯緭鍏ュ鏍镐汉鍛�"
+                        v-model="dataForm.auditReport.auditor"></el-input>
+              <!--{{dataForm.configAuditReport.auditor}}-->
             </el-form-item>
           </div>
           <div style="width: 52px;text-align: center;font-weight: 600">
@@ -110,11 +106,21 @@
           </div>
           <div class="el-border-left" style="width: 20%;height: 40px;">
             <el-form-item style="width: 100%;padding-left:20px;margin:0;">
-              <!--              {{dataForm.circulatOrder.detectDate}}-->
-              {{ dataForm.circulatOrder.detectDate | filterTime('YYYY骞碝M鏈圖D鏃�') }}
+              <el-date-picker
+                v-model="dataForm.auditReport.auditorDate"
+                type="date"
+                placeholder="璇烽�夋嫨鏃ユ湡">
+              </el-date-picker>
+              <!--{{ dataForm.configAuditReport.auditorDate | filterTime('YYYY骞碝M鏈圖D鏃�') }}-->
             </el-form-item>
           </div>
         </div>
+      </div>
+      <div class="el-flex report-sc" style="height: 60px">
+        <el-form-item class="marginTopAndMarginBottom" style="width: 100%">
+          <config-uploader :lineHeight="true" busi-type="config_audit_report" model-name="dataForm" :dataForm="dataForm"
+                           v-model="dataForm.files"/>
+        </el-form-item>
       </div>
     </el-form>
     <template v-slot:footer>
@@ -130,51 +136,19 @@
   export default {
     data() {
       return {
-        // dataForm: {
-        //   id: '',
-        //   configAuditReport:{
-        //     code: '',
-        //     auditor: '',
-        //     auditorDate: '',
-        //   },
-        //   project: {
-        //     softwareIdentity: '',
-        //     softwareName: ''
-        //   },
-        //   problemList:[],
-        //   contentList:[]
-        // },
         dataForm: {
           id: '',
-          circulatOrder: {
-            code: '1',
-            itemAccept: '',
-            itemRequire: '',
-            itemOther: '',
-            acceptSituation: '',
-            acceptDate: '',
-            calibratDetector: '',
-            detectDate: '',
-            detectSituation: '',
-            warehouse: '',
-            warehouseDate: '',
-            warehouseSituation: '',
-            itemIssuer: '',
-            issueDate: '',
-            issueSituation: '',
-            remark: '',
-            virusLibraryVersion:'',
-            itemAcceptor:''
+          auditReport:{
+            code: '',
+            auditor: '',
+            auditorDate: '',
           },
           project: {
             softwareIdentity: '',
-            softwareName: '',
+            softwareName: ''
           },
-          testAgencyInfo: {
-            agencyName: '',
-          },
-          technicalList: [],
-          flowInfoDto: {}
+          problemList:[],
+          contentList:[]
         }
       }
     },
@@ -211,7 +185,7 @@
         console.log(this.dataForm, "getInfo this.dataForm")
       },
       addConfigAuditRow() {
-        this.dataForm.technicalList.push({})
+        this.dataForm.problemList.push({})
         this.$nextTick(() => {
           const tableBody = this.$refs.tableConfigAuditList.$el.querySelector('.el-table__body-wrapper')
           tableBody.scrollTop = tableBody.scrollHeight;
@@ -222,11 +196,12 @@
           token: Cookies.get('token'),
           id:this.dataForm.id
         })
-        let apiURL = `/configAuditReport/ConfigAuditReport/exportReport`
+        let apiURL = `/configAuditReport/ConfigAuditReport/exportConfigAudit`
         window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${params}`
       },
       // 琛ㄥ崟鎻愪氦
       async formSubmit() {
+        console.log(this.dataForm,"formSubmit")
         let res = await this.$http[!this.dataForm.id ? 'post' : 'put']('/configAuditReport/ConfigAuditReport/', this.dataForm)
         if (res.success) {
           await this.$tip.success()
@@ -267,4 +242,7 @@
 .configAuditFormAuto .el-radio {
   margin-right: 10px;
 }
+.report-sc > .el-form-item > .el-form-item__content {
+  width:100%;
+}
 </style>
diff --git a/web/src/views/modules/configAuditReport/ConfigAuditReport.vue b/web/src/views/modules/configAuditReport/ConfigAuditReport.vue
index a316a59..00cdf63 100644
--- a/web/src/views/modules/configAuditReport/ConfigAuditReport.vue
+++ b/web/src/views/modules/configAuditReport/ConfigAuditReport.vue
@@ -1,7 +1,7 @@
 <template>
   <el-card shadow="never" class="aui-card--fill">
     <div class="mod-configAuditReport-configAuditReport}">
-      <zt-table-wraper query-url="/configAuditReport/ConfigAuditReport/page" delete-url="/configAuditReport/ConfigAuditReport" v-slot="{ table }">
+      <zt-table-wraper query-url="/configAuditReport/ConfigAuditReport/page" delete-url="/configAuditReport/ConfigAuditReport/deleteConfigAudit" v-slot="{ table }">
         <el-form :inline="true" :model="dataForm" @keyup.enter.native="table.query()">
           <el-form-item>
             <el-input v-model="dataForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable></el-input>
@@ -21,9 +21,15 @@
         <el-table v-loading="table.dataLoading" :data="table.dataList" height="100px" v-adaptive="{bottomOffset:70}" border @selection-change="table.selectionChangeHandle">
           <el-table-column type="selection" width="40"/>
             <el-table-column prop="code" label="缂栧彿"/>
-            <el-table-column prop="softwareIdentity" label="缂栧彿"/>
-            <el-table-column prop="softwareName" label="缂栧彿"/>
-              <zt-table-column-handle :table="table" edit-perm="configAuditReport:update" delete-perm="configAuditReport::delete"/>
+            <el-table-column prop="softwareName" label="椤圭洰鍚嶇О"/>
+            <el-table-column prop="softwareIdentity" label="椤圭洰鏍囪瘑"/>
+              <zt-table-column-handle :table="table" edit-perm="configAuditReport:update" delete-perm="configAuditReport::delete">
+                <template v-slot="{ row }">
+                  <zt-table-button size="small" v-show = "row.accessoryMap" type="primary"
+                                   @click="preview(row)">棰勮
+                  </zt-table-button>
+                </template>
+              </zt-table-column-handle>
         </el-table>
         <!-- 寮圭獥, 鏂板 / 淇敼 -->
         <add-or-update ref="addOrUpdate" @refreshDataList="table.query"/>
diff --git a/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue b/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue
index 2dba46d..0c49fec 100644
--- a/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue
+++ b/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue
@@ -129,7 +129,6 @@
       <el-button v-if="dataForm.disabled" type="primary" @click="print()">鎵撳嵃</el-button>
     </template>
   </zt-dialog>
-
 </template>
 
 <script>
@@ -183,6 +182,7 @@
       let params = {
         reviewId: this.dataForm.id,
         projectId: this.dataForm.projectId
+
       }
       let res = await this.$http.get(`/contractReview/ContractReview/getDto`, {params: params})
       this.dataForm = {
diff --git a/web/src/views/modules/qaAuditReport/QaAuditReport-AddOrUpdate.vue b/web/src/views/modules/qaAuditReport/QaAuditReport-AddOrUpdate.vue
new file mode 100644
index 0000000..b9dc1b4
--- /dev/null
+++ b/web/src/views/modules/qaAuditReport/QaAuditReport-AddOrUpdate.vue
@@ -0,0 +1,243 @@
+<template>
+  <zt-dialog ref="dialog" column="3" :title="title" :stepMarker="stepMarker" @confirm="formSubmit">
+    <el-form ref="dataForm" style="padding-top: 0" :inline="true" :disabled="dataForm.disabled" :model="dataForm"
+             label-width="120px" class="contractFormAuto">
+      <div>
+        <el-form-item label-width="60px" label="缂栧彿:" style="width:100%;margin-bottom: -5px">
+          <span>{{ dataForm.auditReport.code || '缂栧彿鑷姩鐢熸垚' }}</span>
+        </el-form-item>
+      </div>
+      <div style="border: 1px solid rgba(0,0,0,.2);width: 99%">
+        <div style="border-bottom: 1px solid rgba(0,0,0,.2);" class="contractContentWidth">
+          <el-form-item class="marginTopAndMarginBottom" label="瀹㈡埛鍚嶇О" style="width: 49%">
+            <el-input v-model="dataForm.testAgencyInfo.agencyName" placeholder="璇疯緭鍏ュ鎴峰悕绉�"></el-input>
+          </el-form-item>
+          <el-form-item class="marginTopAndMarginBottom" label="鑱旂郴鐢佃瘽" style="width: 49%">
+            <el-input v-model="dataForm.testAgencyInfo.labContactNum" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"></el-input>
+          </el-form-item>
+          <el-form-item class="marginTopAndMarginBottom reviewLeft" style="width: 49%">
+            <zt-dict v-model="dataForm.contractReview.reviewType" :radio="true" dict="review_type"></zt-dict>
+          </el-form-item>
+          <el-form-item label-width="160px" class="lastChild" label="鍘熷鎵樺崟缂栧彿:" style="width: 49%">
+            <span>{{ dataForm.contractReview.orderCode }}</span>
+          </el-form-item>
+        </div>
+        <div class="el-flexContractDialog el-border-bottom">
+          <div class="DFormWidth DAlign DHold">
+            璇勫椤圭洰
+          </div>
+          <div class="el-border-left" style="width: calc(100% - 120px)">
+            <div class="table-container">
+              <el-table ref="tableConfigItemList" class="el-software el-margin-top-bot"
+                        style="width: 99%;margin-left: 5px" border :data="dataForm.reviewItemList"
+                        stripe>
+                <el-table-column prop="no" align="center" width="60" label="搴忓彿">
+                  <template slot-scope="scope">
+                    <span v-html="indexFormat(scope.$index)"></span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="item" min-width="400" label="璇勫椤�">
+                  <template v-slot="{ row }">
+                    <el-input v-model="row.item" placeholder="璇勫椤�"></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="result" width="220" align="center" label="璇勫缁撴灉">
+                  <template v-slot="{ row }">
+                    <zt-dict v-model="row.result" placeholder="璇勫缁撴灉" dict="tristate1" :radio="true"
+                             clearable></zt-dict>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+        <div class="el-flexContractDialog el-border-bottom">
+          <div class="DFormWidth DAlign DHold">
+            璇勫璁板綍
+          </div>
+          <div style="width: calc(100% - 120px)" class="el-border-left">
+            <el-form-item class="el-CMTextarea" label-width="20px" style="width: 100%;padding: 5px">
+              <el-input type="textarea" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�"
+                        v-model="dataForm.contractReview.reviewRecord"></el-input>
+            </el-form-item>
+          </div>
+        </div>
+        <div class="el-flexContractDialog el-border-bottom">
+          <div class="DFormWidth DAlign DHold">
+            瀹㈡埛鐨勭壒娈婅姹�
+          </div>
+          <div style="width: calc(100% - 120px)" class="el-border-left">
+            <el-form-item class="el-CMTextarea" style="width: 100%;padding: 5px">
+              <el-input type="textarea" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�"
+                        v-model="dataForm.contractReview.specialRequire"></el-input>
+            </el-form-item>
+          </div>
+        </div>
+        <div class="el-flexContractDialog el-border-bottom">
+          <div class="DFormWidth DAlign DHold">
+            鍒嗗寘
+          </div>
+          <div style="width: calc(100% - 120px)" class="el-border-left">
+            <el-form-item class="el-CMTextarea" style="width: 100%;padding: 5px">
+              <el-input type="textarea" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�"
+                        v-model="dataForm.contractReview.subcontract"></el-input>
+            </el-form-item>
+          </div>
+        </div>
+        <div class="el-flexContractDialog el-border-bottom">
+          <div class="DFormWidth DAlign DHold">
+            璇勫缁撹
+          </div>
+          <div style="width: calc(100% - 120px)" class="el-border-left">
+            <el-form-item class="el-CMTextarea" style="width: 100%;padding: 5px">
+              <el-input type="textarea" :rows="2" placeholder="璇疯緭鍏ヨ瘎瀹$粨璁�"
+                        v-model="dataForm.contractReview.reviewConclusion"></el-input>
+            </el-form-item>
+            <el-form-item label="鎶�鏈礋璐d汉锛�" style="width: 48%">
+              <el-input type="textarea" :rows="1" placeholder="璇疯緭鍏ユ妧鏈礋璐d汉"
+                        v-model="dataForm.contractReview.technicalDirector"></el-input>
+            </el-form-item>
+            <el-form-item label="鏃ユ湡锛�" style="width: 48%">
+              <el-date-picker
+                v-model="dataForm.contractReview.reviewDate"
+                type="date"
+                placeholder="璇烽�夋嫨鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </div>
+        </div>
+        <div class="el-flexContractDialog">
+          <div class="DFormWidth DAlign DHold">
+            璇勫缁勬垚鍛�
+          </div>
+          <div style="width: calc(100% - 120px)" class="el-border-left">
+            <el-form-item class="el-CMTextarea" style="width: 100%;padding: 5px">
+              <el-input type="textarea" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�"
+                        v-model="dataForm.contractReview.reviewPanelMember"></el-input>
+            </el-form-item>
+          </div>
+        </div>
+      </div>
+      <div class="el-flex review-sc" style="height: 60px">
+        <el-form-item class="marginTopAndMarginBottom" style="width: 100%">
+          <config-uploader :lineHeight="true" busi-type="qa_audit_report" model-name="dataForm" :dataForm="dataForm"
+                           v-model="dataForm.files"/>
+        </el-form-item>
+      </div>
+    </el-form>
+    <template v-slot:footer>
+      <el-button v-if="dataForm.disabled" type="primary" @click="print()">鎵撳嵃</el-button>
+    </template>
+  </zt-dialog>
+</template>
+
+<script>
+  import qs from "qs";
+  import Cookies from "js-cookie";
+
+  export default {
+    data() {
+      return {
+        stepMarker: '',
+        dataForm: {
+          auditReport: {
+            code: '',
+            completedCheck: '',
+            qaSummary: '',
+            checker: '',
+            checkDate: '',
+            supervisorOpinion: '',
+            supervisorSign: '',
+            superviseDate: '',
+          },
+          id: '',
+          project:{
+            softwareIdentity: '',
+            softwarName: '',
+          },
+          incongruentList:[]
+        }
+      }
+    },
+    methods: {
+      indexFormat(index) {
+        return index += 1
+      },
+      init(id, row) {
+        if (id) {
+          this.dataForm.id = id
+        } else {
+          this.dataForm.id = row.id
+        }
+        if (row.projectId) {
+          this.dataForm.projectId = row.projectId
+        }
+
+        // this.dataForm.disabled
+        this.getInfo()
+        if (!this.dataForm.disabled) {
+          if (!row.stepMarker) {
+            this.stepMarker = 'qashbg_first'
+            this.title = 'QA瀹℃牳鎶ュ憡'
+          } else {
+            this.title = row.stepName
+            this.stepMarker = row.stepMarker
+          }
+        }
+        console.log(this.dataForm.id, this.dataForm.projectId, this.stepMarker, 'this.dataForm.id, this.dataForm.projectId,this.stepMarker')
+      },
+      addCirculatRow() {
+        this.dataForm.technicalList.push({})
+        this.$nextTick(() => {
+          const tableBody = this.$refs.tableCirculatOrderList.$el.querySelector('.el-table__body-wrapper')
+          tableBody.scrollTop = tableBody.scrollHeight;
+        })
+      },
+      // 鑾峰彇淇℃伅
+      async getInfo() {
+        let params = {
+          reportId: this.dataForm.id,
+          projectId: this.dataForm.projectId
+        }
+        let res = await this.$http.get(`/qaAuditReport/QaAuditReport/getDto`, {params: params})
+        this.dataForm = {
+          ...this.dataForm,
+          ...res.data
+        }
+        if (this.dataForm.project === null) {
+          this.dataForm.project = {}
+        }
+        if (this.dataForm.flowInfoDto === null) {
+          this.dataForm.flowInfoDto = {}
+        }
+        console.log(this.dataForm, "getInfo this.dataForm")
+      },
+      async print() {
+        var params = qs.stringify({
+          token: Cookies.get('token'),
+          id: this.dataForm.id
+        })
+        let apiURL = `/qaAuditReport/QaAuditReport/exportQaReport`
+        window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${params}`
+      },
+      // 琛ㄥ崟鎻愪氦
+      async formSubmit(submitType) {
+        console.log(this.dataForm, "this.dataForm11111")
+        if (submitType == 'tj' || submitType == 'bl') {
+          let flowInfo = {
+            flowCode: 'qashbg',
+            stepIdMark: this.stepMarker,
+            submitType: submitType
+          }
+          this.dataForm.flowInfoDto = flowInfo;
+        }
+        let res = await this.$http[!this.dataForm.id ? 'post' : 'put']('/qaAuditReport/QaAuditReport/', this.dataForm)
+        if (res.success) {
+          await this.$tip.success()
+          this.$refs.dialog.close()
+          this.$emit('refreshDataList')
+        }
+      }
+    }
+  }
+</script>
diff --git a/web/src/views/modules/qaAuditReport/QaAuditReport.vue b/web/src/views/modules/qaAuditReport/QaAuditReport.vue
new file mode 100644
index 0000000..73aeb47
--- /dev/null
+++ b/web/src/views/modules/qaAuditReport/QaAuditReport.vue
@@ -0,0 +1,80 @@
+<template>
+  <el-card shadow="never" class="aui-card--fill">
+    <div class="mod-qaAuditReport-qaAuditReport}">
+      <zt-table-wraper query-url="/qaAuditReport/QaAuditReport/page" delete-url="/qaAuditReport/QaAuditReport/deleteQaReport" v-slot="{ table }">
+        <el-form :inline="true" :model="dataForm" @keyup.enter.native="table.query()">
+          <el-form-item>
+            <el-input v-model="dataForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-input v-model="dataForm.softwareName" placeholder="璇疯緭鍏ラ」鐩悕绉�" clearable></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-input v-model="dataForm.softwareIdentity" placeholder="璇疯緭鍏ラ」鐩爣璇�" clearable></el-input>
+          </el-form-item>
+          <el-form-item>
+            <zt-button type="query" @click="table.query()"/>
+            <zt-button type="primary" class="el-icon-edit" perm="itemCirculatOrder:add" @click="add()">鏂板</zt-button>
+            <zt-button type="delete" perm="qaAuditReport:delete" @click="table.deleteHandle()"/>
+          </el-form-item>
+        </el-form>
+        <el-table v-loading="table.dataLoading" :data="table.dataList" height="100px" v-adaptive="{bottomOffset:70}" border @selection-change="table.selectionChangeHandle">
+          <el-table-column type="selection" width="40"/>
+            <el-table-column prop="code" label="缂栧彿"/>
+          <el-table-column prop="softwareName" label="椤圭洰鍚嶇О"/>
+          <el-table-column prop="softwareIdentity" label="椤圭洰鏍囪瘑"/>
+              <zt-table-column-handle :table="table" edit-perm="qaAuditReport:update" delete-perm="qaAuditReport::delete">
+                <template v-slot="{ row }">
+                  <zt-table-button size="small" v-show = "row.accessoryMap" type="primary"
+                                   @click="preview(row)">棰勮
+                  </zt-table-button>
+                </template>
+              </zt-table-column-handle>
+        </el-table>
+        <!-- 寮圭獥, 鏂板 / 淇敼 -->
+        <add-or-update @refreshDataList="table.query"/>
+        <ProjectSelect ref="projectSelect"
+                       @refreshDataList="table.query"
+                       @setProjectInfo="openAddWin">
+        </ProjectSelect>
+        <Preview ref="view" :pageMarkerfun="QaAuditReport"></Preview>
+      </zt-table-wraper>
+    </div>
+  </el-card>
+</template>
+
+<script>
+  import AddOrUpdate from './QaAuditReport-AddOrUpdate'
+  import Preview from '@/views/pages/view'
+  import ProjectSelect from "../project/Project-select";
+  export default {
+    data() {
+      return {
+        QaAuditReport:'QaAuditReport',
+        dataForm: {
+          code: '',
+          softwareName:'',
+          softwareIdentity:''
+        }
+      }
+    },
+    components: {
+      AddOrUpdate,
+      ProjectSelect,
+      Preview
+    },
+    methods:{
+      add() {
+        this.$refs.projectSelect.$refs.dialog.init("qa_audit_report")
+      },
+      openAddWin(row) {
+        console.log(row.id, 'row.id')
+        // this.$refs.addOrUpdate.$refs.dialog.init(null, {id: null, projectId: row.id})
+        this.$refs.addOrUpdate.$refs.dialog.init(null, {id: null, projectId: row.id})
+      },
+      preview(row){
+        this.$refs.view.openAccessoryFormatSingle(row)
+      }
+    }
+  }
+</script>
diff --git a/web/src/views/modules/testReviewComment/TestReviewComment-AddOrUpdate.vue b/web/src/views/modules/testReviewComment/TestReviewComment-AddOrUpdate.vue
index 89b896a..6c6da59 100644
--- a/web/src/views/modules/testReviewComment/TestReviewComment-AddOrUpdate.vue
+++ b/web/src/views/modules/testReviewComment/TestReviewComment-AddOrUpdate.vue
@@ -1,19 +1,31 @@
 <template>
   <zt-dialog ref="dialog"  @confirm="formSubmit">
     <el-form :model="dataForm" ref="dataForm" :disabled="dataForm.disabled" label-width="120px">
-      <zt-form-item label="杞欢鍚嶇О" prop="reviewDate" rules="required">
+      <zt-form-item label="杞欢鍚嶇О" prop="reviewDate" >
         <el-input v-model="dataForm.project.softwareName"></el-input>
       </zt-form-item>
-      <zt-form-item label="璇勫鏃ユ湡" prop="reviewDate" rules="required">
+      <zt-form-item label="杞欢缂栧彿" prop="reviewDate" >
+        <el-input v-model="dataForm.project.code"></el-input>
+      </zt-form-item>
+      <zt-form-item label="杞欢鏍囪瘑" prop="reviewDate" >
+        <el-input v-model="dataForm.project.softwareIdentity"></el-input>
+      </zt-form-item>
+      <zt-form-item label="璇勫鏃ユ湡" prop="reviewDate" >
         <el-date-picker
           v-model="dataForm.reviewComment.reviewDate"
           type="date"
           placeholder="璇烽�夋嫨璇勫鏃ユ湡">
         </el-date-picker>
       </zt-form-item>
-      <zt-form-item label="璇勫浜烘暟" prop="reviewerNum" rules="required">
+      <zt-form-item label="璇勫浜烘暟" prop="reviewerNum" >
         <el-input v-model="dataForm.reviewComment.reviewerNum"></el-input>
       </zt-form-item>
+      <div style="height: 60px">
+        <el-form-item >
+          <config-uploader :lineHeight="true" :busi-type="type" model-name="dataForm" :dataForm="dataForm"
+                           v-model="dataForm.files"/>
+        </el-form-item>
+      </div>
     </el-form>
     <template v-slot:footer>
       <el-button v-if="dataForm.disabled" type="primary" @click="print()">鎵撳嵃</el-button>
@@ -28,11 +40,14 @@
   export default {
     data() {
       return {
+        type:'test_review_comment_',
         pageCode: '',
         dataForm: {
           id: '',
           project: {
             softwareName: '',
+            softwareIdentity:'',
+            code:''
           },
           reviewComment: {
             reviewDate: '',
@@ -69,6 +84,7 @@
           ...this.dataForm,
           ...res.data
         }
+        this.type=this.type+this.pageCode
         console.log(this.dataForm, 'this.dataForm this.dataForm')
       },
       async print() {
@@ -77,7 +93,7 @@
           id: this.dataForm.id,
           pageCode: this.pageCode
         })
-        let apiURL = `/testReviewComment/TestReviewComment/exportComment`
+        let apiURL = `/testReviewComment/TestReviewComment/exportReviewComment`
         window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${params}`
       },
       // 琛ㄥ崟鎻愪氦
@@ -92,3 +108,10 @@
     }
   }
 </script>
+<style>
+  .marginTopAndMarginBottom {
+    margin-top: 0 !important;
+    margin-bottom: 0 !important;
+  }
+</style>
+
diff --git a/web/src/views/modules/testReviewComment/TestReviewComment.vue b/web/src/views/modules/testReviewComment/TestReviewComment.vue
index c97e935..dbe7e9f 100644
--- a/web/src/views/modules/testReviewComment/TestReviewComment.vue
+++ b/web/src/views/modules/testReviewComment/TestReviewComment.vue
@@ -1,7 +1,7 @@
 <template>
   <el-card shadow="never" class="aui-card--fill">
     <div class="mod-testReviewComment-testReviewComment}">
-      <zt-table-wraper query-url="/testReviewComment/TestReviewComment/page" delete-url="/testReviewComment/TestReviewComment" v-slot="{ table }">
+      <zt-table-wraper query-url="/testReviewComment/TestReviewComment/page" delete-url="/testReviewComment/TestReviewComment/deleteReviewComment" v-slot="{ table }">
         <el-form :inline="true" :model="dataForm" @keyup.enter.native="table.query()">
           <el-form-item>
             <el-input v-model="dataForm.code" placeholder="璇疯緭鍏ユ祴璇曡瘎瀹$紪鍙�" clearable></el-input>
@@ -17,19 +17,21 @@
         </el-form>
         <el-table v-loading="table.dataLoading" :data="table.dataList" height="100px" v-adaptive="{bottomOffset:70}" border @selection-change="table.selectionChangeHandle">
           <el-table-column type="selection" width="40"/>
-            <el-table-column prop="code" label="娴嬭瘯璇勫缂栧彿"/>
             <el-table-column prop="reviewDate" label="璇勫鏃ユ湡"/>
           <el-table-column prop="softwareName" label="椤圭洰鍚嶇О"/>
+          <el-table-column prop="softwareIdentity" label="椤圭洰鏍囪瘑"/>
           <zt-table-column-handle :table="table"  :hasEdit='false' edit-perm="testReviewComment:update"
                                   delete-perm="testCheckOrder::delete">
             <template v-slot="{row}">
+              <zt-table-button size="small" v-show = "row.accessoryMap" type="primary"
+                               @click="preview(row)">棰勮
+              </zt-table-button>
               <zt-table-button type="primary"  @click="openEditWin(row)">淇敼</zt-table-button>
             </template>
-
           </zt-table-column-handle>
         </el-table>
         <!-- 寮圭獥, 鏂板 / 淇敼 -->
-        <add-or-update ref="addOrUpdate" @recall="table.query"/>
+        <add-or-update ref="addOrUpdate" @refreshDataList="table.query"/>
         <ProjectSelect :pageCode="pageCode" ref="projectSelect"
                        @refreshDataList="table.query"
                        @setProjectInfo="openAddWin">
@@ -50,7 +52,6 @@
         TestReviewComment:'TestReviewComment',
         pageCode: '',
         dataForm: {
-          code: '',
           softwareName: '',
           pageCode:this.$route.query.pageCode
         }
diff --git a/zt/core/src/main/java/com/zt/modules/sys/dao/SysUserDao.java b/zt/core/src/main/java/com/zt/modules/sys/dao/SysUserDao.java
index e0bfd82..57d0482 100644
--- a/zt/core/src/main/java/com/zt/modules/sys/dao/SysUserDao.java
+++ b/zt/core/src/main/java/com/zt/modules/sys/dao/SysUserDao.java
@@ -56,5 +56,5 @@
     Integer checkTestHome(String systemId, Long userId);
     List<SysUser> getUsersList();
 
-    String getUsersName(Long id);
+    String getUsersName(String id);
 }
diff --git a/zt/core/src/main/java/com/zt/modules/sys/service/SysUserService.java b/zt/core/src/main/java/com/zt/modules/sys/service/SysUserService.java
index 9149cc0..ae65be8 100644
--- a/zt/core/src/main/java/com/zt/modules/sys/service/SysUserService.java
+++ b/zt/core/src/main/java/com/zt/modules/sys/service/SysUserService.java
@@ -335,10 +335,19 @@
         return baseDao.getUsersList();
     }
 
-    public String getUsersName(Long id) {
+    public String getUsersName(String id) {
         return baseDao.getUsersName(id);
     }
 
+    public String getNames(String ids) {
+        String[] NamesData = ids.split(",");
+        List<String> nameList =new ArrayList<>();
+        for (String item : NamesData) {
+            nameList.add(this.getUsersName(item));
+        }
+        String names = String.join(", ", nameList);
+        return names;
+    }
     public SysUser getUserInfo(Long id) {
         SysUser data = super.get(id);
         if (data != null) {
diff --git a/zt/core/src/main/resources/mapper/sys/SysUserDao.xml b/zt/core/src/main/resources/mapper/sys/SysUserDao.xml
index 3fd5d17..c26633b 100644
--- a/zt/core/src/main/resources/mapper/sys/SysUserDao.xml
+++ b/zt/core/src/main/resources/mapper/sys/SysUserDao.xml
@@ -241,7 +241,7 @@
         select real_name as name,id as id from sys_user
     </select>
     <select id="getUsersName" resultType="java.lang.String">
-        select real_name from sys_user WHERE id=#{id}
+        select real_name from sys_user WHERE id=${id}
     </select>
     <update id="updatePassword">
         update

--
Gitblit v1.9.1