jinlin
2024-01-02 a38a1ac77bb6ac9ea8bf0cf5f5f6b68d0e6e6974
修改
20个文件已修改
13个文件已添加
1358 ■■■■■ 已修改文件
core/src/main/java/com/zt/life/export/service/WordFileService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/controller/ConfigAuditReportController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/dto/ConfigAuditDto.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/model/ConfigAuditReport.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/configAuditReport/service/ConfigAuditReportService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/project/controller/ProjectController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportIncongruentController.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportDao.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportIncongruentDao.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dto/QaAuditReportDto.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReport.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReportIncongruent.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportIncongruentService.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportService.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/controller/TestReviewCommentController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/dto/ReviewCommentDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/model/TestReviewComment.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/testReviewComment/service/TestReviewCommentService.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/configAuditReport/ConfigAuditReportDao.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportDao.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportIncongruentDao.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/configAuditReport/ConfigAuditReport-AddOrUpdate.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/configAuditReport/ConfigAuditReport.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/qaAuditReport/QaAuditReport-AddOrUpdate.vue 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/qaAuditReport/QaAuditReport.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/testReviewComment/TestReviewComment-AddOrUpdate.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/testReviewComment/TestReviewComment.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/sys/dao/SysUserDao.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/sys/service/SysUserService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/resources/mapper/sys/SysUserDao.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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年MM月dd日");
                        staticFieldValue = sdf.format(staticFieldValue);
                    }
                    String valStr = staticFieldValue.toString();
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,8 +59,9 @@
        @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){
@@ -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);
    }
}
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<>();
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;
}
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();
        }
    }
}
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();
    }
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportController.java
New file
@@ -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);
    }
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/controller/QaAuditReportIncongruentController.java
New file
@@ -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();
    }
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportDao.java
New file
@@ -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);
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dao/QaAuditReportIncongruentDao.java
New file
@@ -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);
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/dto/QaAuditReportDto.java
New file
@@ -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<>();
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReport.java
New file
@@ -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 = "监督人ID")
    private Long supervisorId;
    @ApiModelProperty(value = "监督日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date superviseDate;
    @ApiModelProperty(value = "年份")
    private String year;
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/model/QaAuditReportIncongruent.java
New file
@@ -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 = "责任人")
    private String chargePerson;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "备注")
    private String remark;
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportIncongruentService.java
New file
@@ -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);
    }
}
modules/mainPart/src/main/java/com/zt/life/modules/qaAuditReport/service/QaAuditReportService.java
New file
@@ -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();
        }
    }
}
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);
    }
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;
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;
}
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,6 +30,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
@@ -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();
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>
modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportDao.xml
New file
@@ -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>
modules/mainPart/src/main/resources/mapper/qaAuditReport/QaAuditReportIncongruentDao.xml
New file
@@ -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>
modules/mainPart/src/main/resources/mapper/testReviewComment/TestReviewCommentDao.xml
@@ -17,5 +17,4 @@
            ORDER BY ${orderBySql}
        </if>
    </select>
</mapper>
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年MM月DD日') }}
              <el-date-picker
                v-model="dataForm.auditReport.auditorDate"
                type="date"
                placeholder="请选择日期">
              </el-date-picker>
              <!--{{ dataForm.configAuditReport.auditorDate | filterTime('YYYY年MM月DD日') }}-->
            </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>
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"/>
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 = {
web/src/views/modules/qaAuditReport/QaAuditReport-AddOrUpdate.vue
New file
@@ -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="技术负责人:" style="width: 48%">
              <el-input type="textarea" :rows="1" placeholder="请输入技术负责人"
                        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>
web/src/views/modules/qaAuditReport/QaAuditReport.vue
New file
@@ -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>
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>
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
        }
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);
}
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) {
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