From 0a2013ac0a8356c4bdbc44ba05e622b54d9bebed Mon Sep 17 00:00:00 2001
From: jinlin <jinlin>
Date: 星期五, 15 十二月 2023 17:22:38 +0800
Subject: [PATCH] 修改

---
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReviewItem.java                |   36 ++
 modules/mainPart/src/main/java/com/zt/life/modules/project/dao/SoftwareTestOrderDao.java                       |    1 
 modules/mainPart/src/main/resources/mapper/project/ProjectDao.xml                                              |    3 
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewService.java           |  205 ++++++++++++
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReview.java                    |   62 +++
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dto/ContractReviewDto.java                   |   33 +
 modules/mainPart/src/main/java/com/zt/life/modules/project/service/SoftwareTestOrderService.java               |    3 
 web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue                                            |  204 ++++++++++++
 modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderService.java     |   26 
 web/src/views/modules/contractReview/ContractReview.vue                                                        |   65 +++
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewController.java     |  118 ++++++
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewItemController.java |   93 +++++
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewItemDao.java               |   25 +
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewDao.java                   |   23 +
 modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewDao.xml                                |   21 +
 modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewItemService.java       |   54 +++
 modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewItemDao.xml                            |   34 ++
 modules/mainPart/src/main/resources/mapper/project/SoftwareTestOrderDao.xml                                    |   13 
 18 files changed, 1,005 insertions(+), 14 deletions(-)

diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewController.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewController.java
new file mode 100644
index 0000000..9e7d246
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewController.java
@@ -0,0 +1,118 @@
+package com.zt.life.modules.contractReview.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.contractReview.dto.ContractReviewDto;
+import com.zt.life.modules.contractReview.model.ContractReview;
+import com.zt.life.modules.contractReview.service.ContractReviewService;
+import com.zt.life.modules.itemCirculatOrder.dto.ItemCirculatOrderDto;
+import com.zt.life.modules.itemCirculatOrder.service.ItemCirculatOrderService;
+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;
+
+
+/**
+ * contract_review
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@RestController
+@RequestMapping("/contractReview/ContractReview/")
+@Api(tags="contract_review")
+public class ContractReviewController {
+    @Autowired
+    private ContractReviewService contractReviewService;
+
+    @Autowired
+    private SysCodeRuleService sysCodeRuleService;
+
+    @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 = "reviewPhase", value = "璇勫闃舵", dataType = Constant.QT.STRING, format = "a.review_phase^EQ"),
+        @ApiImplicitParam(name = "softwareName", value = "鐗╁搧鍚嶇О", dataType = Constant.QT.STRING, format = "p.software_name^EQ"),
+        @ApiImplicitParam(name = "softwareIdentity", value = "鐗╁搧缂栧彿", dataType = Constant.QT.STRING, format = "p.software_identity^EQ")
+    })
+    public PageResult<ContractReview> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
+        return PageResult.ok(contractReviewService.page(queryFilter));
+    }
+
+    @GetMapping("getDto")
+    @ApiOperation("淇℃伅")
+    public Result<ContractReviewDto> getDto(Long projectId, Long reviewId) {
+        ContractReviewDto data = contractReviewService.getDto(projectId, reviewId);
+        return Result.ok(data);
+    }
+
+    @PostMapping
+    @ApiOperation("鏂板")
+    @LogOperation("鏂板")
+    public Result<Long> insert(@RequestBody ContractReviewDto reviewDto){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(reviewDto.getContractReview(), AddGroup.class, DefaultGroup.class);
+        Map<String, String> map = new HashMap<>();
+        map.put("funCode", "contract_review");
+        map.put("projectId",reviewDto.getProjectId().toString());
+        reviewDto.getContractReview().setCode(sysCodeRuleService.getNewCode(map));
+        Boolean result = contractReviewService.save(reviewDto);
+        return Result.ok(reviewDto.getContractReview().getId());
+    }
+
+    @PutMapping
+    @ApiOperation("淇敼")
+    @LogOperation("淇敼")
+    public Result<Long> update(@RequestBody  ContractReviewDto reviewDto){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(reviewDto.getContractReview(), UpdateGroup.class, DefaultGroup.class);
+        Boolean result = contractReviewService.save(reviewDto);
+
+        return Result.ok(reviewDto.getContractReview().getId());
+    }
+
+
+    @DeleteMapping("deleteReview")
+    @ApiOperation("鍒犻櫎")
+    @LogOperation("鍒犻櫎")
+    public Result delete(@RequestBody Long[] ids){
+        //鏁堥獙鏁版嵁
+        AssertUtils.isArrayEmpty(ids, "id");
+        contractReviewService.delete(ids);
+
+        return Result.ok();
+    }
+
+/*    @GetMapping("exportReview")
+    @ApiOperation("鎵撳嵃鍚堝悓璇勫鍗�")
+    @LogOperation("鎵撳嵃鍚堝悓璇勫鍗�")
+    public void exportReview(Long id, HttpServletRequest request, HttpServletResponse response) {
+        contractReviewService.exportReview(id, request, response);
+    }*/
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewItemController.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewItemController.java
new file mode 100644
index 0000000..88792a3
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/controller/ContractReviewItemController.java
@@ -0,0 +1,93 @@
+package com.zt.life.modules.contractReview.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.contractReview.model.ContractReviewItem;
+import com.zt.life.modules.contractReview.service.ContractReviewItemService;
+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;
+
+
+/**
+ * contract_review_item
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@RestController
+@RequestMapping("/contractReviewItem/ContractReviewItem/")
+@Api(tags="contract_review_item")
+public class ContractReviewItemController {
+    @Autowired
+    private ContractReviewItemService contractReviewItemService;
+
+    @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<ContractReviewItem> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
+
+        return PageResult.ok(contractReviewItemService.page(queryFilter));
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation("淇℃伅")
+    public Result<ContractReviewItem> get(@PathVariable("id") Long id){
+        ContractReviewItem data = contractReviewItemService.get(id);
+
+        return Result.ok(data);
+    }
+
+    @PostMapping
+    @ApiOperation("鏂板")
+    @LogOperation("鏂板")
+    public Result insert(@RequestBody ContractReviewItem contractReviewItem){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(contractReviewItem, AddGroup.class, DefaultGroup.class);
+        contractReviewItemService.insert(contractReviewItem);
+
+        return Result.ok();
+    }
+
+    @PutMapping
+    @ApiOperation("淇敼")
+    @LogOperation("淇敼")
+    public Result update(@RequestBody ContractReviewItem contractReviewItem){
+        //鏁堥獙鏁版嵁
+        ValidatorUtils.validateEntity(contractReviewItem, UpdateGroup.class, DefaultGroup.class);
+        contractReviewItemService.update(contractReviewItem);
+
+        return Result.ok();
+    }
+
+    @DeleteMapping
+    @ApiOperation("鍒犻櫎")
+    @LogOperation("鍒犻櫎")
+    public Result delete(@RequestBody Long[] ids){
+        //鏁堥獙鏁版嵁
+        AssertUtils.isArrayEmpty(ids, "id");
+        contractReviewItemService.delete(ids);
+
+        return Result.ok();
+    }
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewDao.java
new file mode 100644
index 0000000..11948b1
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewDao.java
@@ -0,0 +1,23 @@
+package com.zt.life.modules.contractReview.dao;
+
+import com.zt.common.dao.BaseDao;
+import com.zt.life.modules.contractReview.model.ContractReview;
+import org.apache.ibatis.annotations.Mapper;
+
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * contract_review
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@Mapper
+public interface ContractReviewDao extends BaseDao<ContractReview> {
+
+    List<ContractReview> getList(Map<String, Object> params);
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewItemDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewItemDao.java
new file mode 100644
index 0000000..dbf3ff1
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dao/ContractReviewItemDao.java
@@ -0,0 +1,25 @@
+package com.zt.life.modules.contractReview.dao;
+
+import com.zt.common.dao.BaseDao;
+import com.zt.life.modules.configItemWarehouse.model.WarehouseConfigItem;
+import com.zt.life.modules.contractReview.model.ContractReviewItem;
+import org.apache.ibatis.annotations.Mapper;
+
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * contract_review_item
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@Mapper
+public interface ContractReviewItemDao extends BaseDao<ContractReviewItem> {
+
+    List<ContractReviewItem> getList(Map<String, Object> params);
+    List<ContractReviewItem> itemList(String dictType);
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dto/ContractReviewDto.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dto/ContractReviewDto.java
new file mode 100644
index 0000000..cb8fb4a
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/dto/ContractReviewDto.java
@@ -0,0 +1,33 @@
+package com.zt.life.modules.contractReview.dto;
+
+import com.zt.life.modules.contractReview.model.ContractReview;
+import com.zt.life.modules.contractReview.model.ContractReviewItem;
+import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrder;
+import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrderTechnical;
+import com.zt.life.modules.project.model.Project;
+import com.zt.life.modules.sysBaseInfo.model.TestAgencyInfo;
+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 ContractReviewDto {
+    private Long id;
+    private Long projectId;
+    private Long reviewId;
+
+    @ApiModelProperty(value = "娴嬭瘯椤圭洰鍩烘湰淇℃伅")
+    private Project project;
+    @ApiModelProperty(value = "鍚堝悓璇勫琛�")
+    private ContractReview contractReview;
+    @ApiModelProperty(value = "娴嬭瘯鏈烘瀯淇℃伅")
+    private TestAgencyInfo TestAgencyInfo;
+
+
+    @ApiModelProperty(value = "璇勫椤瑰垪琛�")
+    private List<ContractReviewItem> reviewItemList = new ArrayList<>();
+}
+
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReview.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReview.java
new file mode 100644
index 0000000..4e7c297
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReview.java
@@ -0,0 +1,62 @@
+package com.zt.life.modules.contractReview.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;
+
+/**
+ * contract_review
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("contract_review")
+public class ContractReview extends BusiEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "缂栧彿")
+	private String code;
+
+	@ApiModelProperty(value = "椤圭洰ID")
+	private Long projectId;
+
+	@ApiModelProperty(value = "濮旀墭鍗曠紪鍙�")
+	private String orderCode;
+
+	@ApiModelProperty(value = "璇勫绫诲瀷")
+	private String reviewType;
+
+	@ApiModelProperty(value = "璇勫璁板綍")
+	private String reviewRecord;
+
+	@ApiModelProperty(value = "瀹㈡埛鐨勭壒娈婅姹�")
+	private String specialRequire;
+
+	@ApiModelProperty(value = "鍒嗗寘")
+	private String subcontract;
+
+	@ApiModelProperty(value = "璇勫缁撹")
+	private String reviewConclusion;
+
+	@ApiModelProperty(value = "鎶�鏈礋璐d汉")
+	private String technicalDirector;
+
+	@ApiModelProperty(value = "璇勫鏃ユ湡")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date reviewDate;
+
+	@ApiModelProperty(value = "璇勫缁勬垚鍛�")
+	private String reviewPanelMember;
+
+	@ApiModelProperty(value = "骞翠唤")
+	private String year;
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReviewItem.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReviewItem.java
new file mode 100644
index 0000000..574a70e
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/model/ContractReviewItem.java
@@ -0,0 +1,36 @@
+package com.zt.life.modules.contractReview.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;
+
+/**
+ * contract_review_item
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("contract_review_item")
+public class ContractReviewItem extends BusiEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "璇勫鍗旾D")
+	private Long reviewId;
+
+	@ApiModelProperty(value = "搴忓彿")
+	private Integer no;
+
+	@ApiModelProperty(value = "璇勫椤�")
+	private String item;
+
+	@ApiModelProperty(value = "璇勫缁撴灉")
+	private String result;
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewItemService.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewItemService.java
new file mode 100644
index 0000000..cf0a8d0
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewItemService.java
@@ -0,0 +1,54 @@
+package com.zt.life.modules.contractReview.service;
+
+import com.zt.common.service.BaseService;
+import com.zt.core.sys.dto.DictIstance;
+import com.zt.life.modules.contractReview.dao.ContractReviewItemDao;
+import com.zt.life.modules.contractReview.model.ContractReviewItem;
+import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrderTechnical;
+import org.springframework.stereotype.Service;
+import com.zt.common.db.query.QueryFilter;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * contract_review_item
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@Service
+public class ContractReviewItemService  extends BaseService<ContractReviewItemDao, ContractReviewItem> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param queryFilter
+     * @return
+     */
+    public List<ContractReviewItem> page(QueryFilter queryFilter) {
+        return baseDao.getList(queryFilter.getQueryParams());
+    }
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ids
+     */
+    public void delete(Long[] ids) {
+        super.deleteLogic(ids);
+    }
+
+    public List<ContractReviewItem> getList(Long reviewId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("reviewId",reviewId);
+        return baseDao.getList(params);
+    }
+    public List<ContractReviewItem> itemList(String dictType) {
+        return baseDao.itemList(dictType);
+    }
+
+
+}
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewService.java b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewService.java
new file mode 100644
index 0000000..e928147
--- /dev/null
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/contractReview/service/ContractReviewService.java
@@ -0,0 +1,205 @@
+package com.zt.life.modules.contractReview.service;
+
+import cn.hutool.core.convert.Convert;
+import com.zt.common.service.BaseService;
+import com.zt.life.export.dto.WordFile;
+import com.zt.life.export.service.WordFileService;
+import com.zt.life.modules.contractReview.dao.ContractReviewDao;
+import com.zt.life.modules.contractReview.dto.ContractReviewDto;
+import com.zt.life.modules.contractReview.model.ContractReview;
+import com.zt.life.modules.contractReview.model.ContractReviewItem;
+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.service.ProjectService;
+import com.zt.life.modules.project.service.SoftwareTestOrderDeliverableService;
+import com.zt.life.modules.project.service.SoftwareTestOrderService;
+import com.zt.life.modules.sysBaseInfo.service.TestAgencyInfoService;
+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 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;
+
+
+/**
+ * contract_review
+ *
+ * @author zt generator 
+ * @since 1.0.0 2023-12-15
+ */
+@Service
+public class ContractReviewService  extends BaseService<ContractReviewDao, ContractReview> {
+
+    @Autowired
+    private SysOssConfigService sysOssConfigService;
+    @Autowired
+    private SoftwareTestOrderService softwareTestOrderService;
+
+    @Autowired
+    private SysOssService sysOssService;
+
+    @Autowired
+    private TestAgencyInfoService testAgencyInfoService;
+
+    @Autowired
+    private SysCodeRuleService sysCodeRuleService;
+
+    @Autowired
+    private ProjectService projectService;
+
+    @Autowired
+    private ContractReviewItemService itemService;
+
+    @Autowired
+    private WorkflowService workflowService;
+
+    @Autowired
+    private GetShowDictList getShowDictList;
+
+    @Autowired
+    private WordFileService wordFileService;
+
+    @Autowired
+    private GetFilesPath getFilesPath;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param queryFilter
+     * @return
+     */
+    public List<ContractReview> page(QueryFilter queryFilter) {
+        return baseDao.getList(queryFilter.getQueryParams());
+    }
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ids
+     */
+    public void delete(Long[] ids) {
+        super.deleteLogic(ids);
+    }
+
+    public Boolean save(ContractReviewDto reviewDto) {
+        Long reviewId = reviewDto.getContractReview().getId();
+        if (reviewId != null)
+            baseDao.updateById(reviewDto.getContractReview());
+        else {
+            Map<String, String> map = new HashMap<>();
+            map.put("funCode", "contract_review");
+            map.put("projectId", reviewDto.getProjectId().toString());
+            reviewDto.getContractReview().setProjectId(reviewDto.getProjectId());
+            reviewDto.getContractReview().setCode(sysCodeRuleService.getNewCode(map));
+            baseDao.insert(reviewDto.getContractReview());
+            reviewId = reviewDto.getContractReview().getId();
+        }
+
+        for (ContractReviewItem reviewItem : reviewDto.getReviewItemList()) {
+            reviewItem.setReviewId(reviewId);
+            if (reviewItem.getId() != null) {
+                itemService.update(reviewItem);
+            } else {
+                reviewItem.setReviewId(reviewId);
+                itemService.insert(reviewItem);
+            }
+        }
+
+        if (reviewDto.getTestAgencyInfo().getId() == 10000) {
+            reviewDto.getTestAgencyInfo().setId(reviewId);
+            testAgencyInfoService.insert(reviewDto.getTestAgencyInfo());
+        } else {
+            testAgencyInfoService.update(reviewDto.getTestAgencyInfo());
+        }
+        return true;
+    }
+
+    public ContractReviewDto getDto(Long projectId, Long reviewId) {
+        ContractReviewDto data = new ContractReviewDto();
+        if (reviewId != null) {
+            data.setId(reviewId);
+            ContractReview contractReview = this.get(reviewId);
+            data.setContractReview(contractReview);
+            if (projectId == null) {
+                projectId = contractReview.getProjectId();
+            }
+
+            data.setTestAgencyInfo(testAgencyInfoService.get(reviewId));
+
+            List<ContractReviewItem> reviewItemList = itemService.getList(reviewId);
+            data.setReviewItemList(reviewItemList);
+
+        } else {
+            ContractReview contractReview = new ContractReview();
+            data.setContractReview(contractReview);
+            String dictType ="contract_review_item";
+            List<?> resultList = itemService.itemList(dictType);
+            List<?> reviewItemList = resultList;
+            data.setReviewItemList((List<ContractReviewItem>) reviewItemList);
+        }
+
+        if (projectId != null) {
+            data.setProjectId(projectId);
+            Project project = projectService.get(projectId);
+            data.setProject(project);
+        }
+        data.getContractReview().setOrderCode(softwareTestOrderService.selectOrderId(projectId));
+        if (data.getTestAgencyInfo() == null)
+            data.setTestAgencyInfo(testAgencyInfoService.get(10000L));
+        return data;
+    }
+/*
+    public void exportCirculatOrder(Long id, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            ContractReviewDto dataObj = this.getDto(null, id);
+
+            String acceptorPath = "鏂囦欢鍥剧墖:"+ getFilesPath.getSignPath(Convert.toLong(dataObj.getContractReview().getItemAcceptorId()));
+            dataObj.getContractReview().setItemAcceptor(acceptorPath);
+            String detectorPath = "鏂囦欢鍥剧墖:"+getFilesPath.getSignPath(Convert.toLong(dataObj.getContractReview().getCalibratDetectorId()));
+            dataObj.getContractReview().setCalibratDetector(detectorPath);
+            String issuerPath = "鏂囦欢鍥剧墖:"+getFilesPath.getSignPath(Convert.toLong(dataObj.getContractReview().getItemIssuerId()));
+            dataObj.getContractReview().setItemIssuer(issuerPath);
+            //閫氱敤瀛楀吀鍒楄〃瀛楃涓茬敓鎴�
+            String itemRequireStr = getShowDictList.getShowDictList(dataObj.getContractReview().getItemRequire(), "is_or_not", false);
+            dataObj.getContractReview().setItemRequireStr(itemRequireStr);
+
+            String acceptSituationStr = getShowDictList.getShowDictList(dataObj.getContractReview().getAcceptSituation(), "is_or_not", false);
+            dataObj.getContractReview().setAcceptSituationStr(acceptSituationStr);
+
+            String detectSituationStr = getShowDictList.getShowDictList(dataObj.getContractReview().getDetectSituation(), "is_or_not", false);
+            dataObj.getContractReview().setDetectSituationStr(detectSituationStr);
+
+            String issueSituationStr = getShowDictList.getShowDictList(dataObj.getContractReview().getIssueSituation(), "is_or_not", false);
+            dataObj.getContractReview().setIssueSituationStr(issueSituationStr);
+
+            for (ContractReviewItem reviewItem : dataObj.getReviewItemList()) {
+                String value = reviewItem.getSecretClass();
+                String secretClassStr = getShowDictList.getShowDictList(value, "secret_class", false);
+                reviewItem.setSecretClass(secretClassStr);
+            }
+
+
+            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/itemCirculatOrder/service/ItemCirculatOrderService.java b/modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderService.java
index 74bd644..5d44f0f 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderService.java
@@ -96,8 +96,8 @@
     }
 
     public Boolean save(ItemCirculatOrderDto itemCirculatOrderDto) {
-        Long circulatOrderid = itemCirculatOrderDto.getCirculatOrder().getId();
-        if (circulatOrderid != null)
+        Long circulatOrderId = itemCirculatOrderDto.getCirculatOrder().getId();
+        if (circulatOrderId != null)
             baseDao.updateById(itemCirculatOrderDto.getCirculatOrder());
         else {
             Map<String, String> map = new HashMap<>();
@@ -106,22 +106,22 @@
             itemCirculatOrderDto.getCirculatOrder().setProjectId(itemCirculatOrderDto.getProjectId());
             itemCirculatOrderDto.getCirculatOrder().setCode(sysCodeRuleService.getNewCode(map));
             baseDao.insert(itemCirculatOrderDto.getCirculatOrder());
-            circulatOrderid = itemCirculatOrderDto.getCirculatOrder().getId();
+            circulatOrderId = itemCirculatOrderDto.getCirculatOrder().getId();
         }
 
         for (ItemCirculatOrderTechnical circulatOrderTechnical : itemCirculatOrderDto.getTechnicalList()) {
-            circulatOrderTechnical.setCirculatOrderId(circulatOrderid);
+            circulatOrderTechnical.setCirculatOrderId(circulatOrderId);
             if (circulatOrderTechnical.getId() != null) {
                 technicalService.update(circulatOrderTechnical);
             } else {
-                circulatOrderTechnical.setCirculatOrderId(circulatOrderid);
+                circulatOrderTechnical.setCirculatOrderId(circulatOrderId);
                 technicalService.insert(circulatOrderTechnical);
             }
             sysOssConfigService.updateOss(circulatOrderTechnical.getId(), circulatOrderTechnical.getFiles());// 淇濆瓨闄勪欢
         }
 
         if (itemCirculatOrderDto.getTestAgencyInfo().getId() == 10000) {
-            itemCirculatOrderDto.getTestAgencyInfo().setId(circulatOrderid);
+            itemCirculatOrderDto.getTestAgencyInfo().setId(circulatOrderId);
             testAgencyInfoService.insert(itemCirculatOrderDto.getTestAgencyInfo());
         } else {
             testAgencyInfoService.update(itemCirculatOrderDto.getTestAgencyInfo());
@@ -139,19 +139,19 @@
         return true;
     }
 
-    public ItemCirculatOrderDto getDto(Long projectId, Long circulatOrderid) {
+    public ItemCirculatOrderDto getDto(Long projectId, Long circulatOrderId) {
         ItemCirculatOrderDto data = new ItemCirculatOrderDto();
-        if (circulatOrderid != null) {
-            data.setId(circulatOrderid);
-            ItemCirculatOrder itemCirculatOrder = this.get(circulatOrderid);
+        if (circulatOrderId != null) {
+            data.setId(circulatOrderId);
+            ItemCirculatOrder itemCirculatOrder = this.get(circulatOrderId);
             data.setCirculatOrder(itemCirculatOrder);
             if (projectId == null) {
                 projectId = itemCirculatOrder.getProjectId();
             }
 
-            data.setTestAgencyInfo(testAgencyInfoService.get(circulatOrderid));
+            data.setTestAgencyInfo(testAgencyInfoService.get(circulatOrderId));
 
-            List<ItemCirculatOrderTechnical> technicalList = technicalService.getList(circulatOrderid);
+            List<ItemCirculatOrderTechnical> technicalList = technicalService.getList(circulatOrderId);
             data.setTechnicalList(technicalList);
 
         } else {
@@ -176,7 +176,7 @@
         }
         if (data.getTestAgencyInfo() == null)
             data.setTestAgencyInfo(testAgencyInfoService.get(10000L));
-        if (circulatOrderid != null) {
+        if (circulatOrderId != null) {
             for (ItemCirculatOrderTechnical technical : data.getTechnicalList()) {
                 Long technicalId = technical.getId();
                 OssDto ossDto = sysOssConfigService.getOssByBusiType(technicalId, "circulat_order");
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/project/dao/SoftwareTestOrderDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/project/dao/SoftwareTestOrderDao.java
index a642ae3..fa49e20 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/project/dao/SoftwareTestOrderDao.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/project/dao/SoftwareTestOrderDao.java
@@ -21,4 +21,5 @@
 
     List<SoftwareTestOrder> getList(Map<String, Object> params);
     List<DictIstance> dictList(String dictType, String projectCode,String softIdentity);
+    String selectOrderId(Long projectId);
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/project/service/SoftwareTestOrderService.java b/modules/mainPart/src/main/java/com/zt/life/modules/project/service/SoftwareTestOrderService.java
index ecdd3f3..8526b69 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/project/service/SoftwareTestOrderService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/project/service/SoftwareTestOrderService.java
@@ -78,6 +78,9 @@
         }
         return list;
     }
+    public String selectOrderId(Long projectId) {
+        return baseDao.selectOrderId(projectId);
+    }
 
 
     /**
diff --git a/modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewDao.xml b/modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewDao.xml
new file mode 100644
index 0000000..399bbb6
--- /dev/null
+++ b/modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewDao.xml
@@ -0,0 +1,21 @@
+<?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.contractReview.dao.ContractReviewDao">
+
+    <select id="getList" resultType="com.zt.life.modules.contractReview.model.ContractReview">
+        select a.*, p.software_name,p.software_identity
+        from contract_review a
+        INNER JOIN  project p ON p.id = a.project_id
+        <where>
+            a.is_delete = 0 and p.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/contractReview/ContractReviewItemDao.xml b/modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewItemDao.xml
new file mode 100644
index 0000000..80c8adf
--- /dev/null
+++ b/modules/mainPart/src/main/resources/mapper/contractReview/ContractReviewItemDao.xml
@@ -0,0 +1,34 @@
+<?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.contractReview.dao.ContractReviewItemDao">
+
+    <select id="getList" resultType="com.zt.life.modules.contractReview.model.ContractReviewItem">
+        select a.*
+        from contract_review_item a
+        <where>
+            a.is_delete = 0
+            <if test="reviewId!=null">
+                and warehouse_id = ${reviewId}
+            </if>
+        </where>
+        <if test="orderBySql!=null">
+            ORDER BY ${orderBySql}
+        </if>
+    </select>
+    <select id="itemList" resultType="com.zt.life.modules.contractReview.model.ContractReviewItem">
+        SET @row_number = 0;
+        SELECT dd.dict_label AS item,
+        (@row_number := @row_number + 1) AS no
+        FROM sys_dict_type dt
+        JOIN sys_dict_data dd ON dt.ID = dd.DICT_TYPE_ID
+        <where>
+            dd.IS_DELETE = 0
+            <if test="dictType != null and dictType != ''">
+                and dt.DICT_TYPE = #{dictType}
+            </if>
+        </where>
+        ORDER BY dd.sort
+    </select>
+
+</mapper>
diff --git a/modules/mainPart/src/main/resources/mapper/project/ProjectDao.xml b/modules/mainPart/src/main/resources/mapper/project/ProjectDao.xml
index 719f9d1..154daf9 100644
--- a/modules/mainPart/src/main/resources/mapper/project/ProjectDao.xml
+++ b/modules/mainPart/src/main/resources/mapper/project/ProjectDao.xml
@@ -14,6 +14,9 @@
             <if test="tableName!=null">
                 and id not in (select project_id from ${tableName} where is_delete = 0)
             </if>
+            <if test="tableName =='contract_review'">
+                and is_contract =1
+            </if>
         </where>
         <if test="orderBySql!=null">
             ORDER BY ${orderBySql}
diff --git a/modules/mainPart/src/main/resources/mapper/project/SoftwareTestOrderDao.xml b/modules/mainPart/src/main/resources/mapper/project/SoftwareTestOrderDao.xml
index eb6db4d..b5b8bf9 100644
--- a/modules/mainPart/src/main/resources/mapper/project/SoftwareTestOrderDao.xml
+++ b/modules/mainPart/src/main/resources/mapper/project/SoftwareTestOrderDao.xml
@@ -6,7 +6,7 @@
     <select id="getList" resultType="com.zt.life.modules.project.model.SoftwareTestOrder">
         SELECT a.*, p.software_name,p.software_identity
         FROM software_test_order a
-        INNER JOIN  project p ON p.id = a.project_id
+        INNER JOIN project p ON p.id = a.project_id
         <where>
             a.is_delete = 0 and p.is_delete = 0
             <if test="whereSql!=null">
@@ -18,6 +18,17 @@
         </if>
     </select>
 
+    <select id="selectOrderId" resultType="java.lang.String">
+        SELECT code
+        FROM software_test_order
+        <where>
+            is_delete = 0
+            <if test="projectId != null and projectId != ''">
+                and project_id = ${projectId}
+            </if>
+        </where>
+    </select>
+
     <select id="dictList" resultType="com.zt.core.sys.dto.DictIstance">
         SET @row_number = 0;
         SELECT concat('${softIdentity}', dd.dict_label) AS name,
diff --git a/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue b/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue
new file mode 100644
index 0000000..5ac9a39
--- /dev/null
+++ b/web/src/views/modules/contractReview/ContractReview-AddOrUpdate.vue
@@ -0,0 +1,204 @@
+<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="warehouseFormAuto">
+      <div>
+        <el-form-item label-width="60px" label="缂栧彿:" style="width:100%;margin-bottom: -5px">
+          <span>{{dataForm.contractReview.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="warehouseContentWidth">
+          <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>
+          <zt-dict v-model="dataForm.contractReview.reviewType" :radio="true" dict="review_type"></zt-dict>
+          <el-form-item label-width="60px" label="鍘熷鎵樺崟缂栧彿:" style="width:100%;margin-bottom: -5px">
+            <span>{{dataForm.contractReview.orderCode}}</span>
+          </el-form-item>
+        </div>
+        <div class="el-flexManageDialog 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" width="200" label="閰嶇疆椤瑰悕绉�">
+                  <template v-slot="{ row }">
+                    <el-input v-model="row.item" placeholder="璇勫椤�"></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="result" label="瀵嗙骇" width="100" align="center">
+                  <template v-slot="{ row }">
+                    <zt-dict v-model="row.result" placeholder="璇勫缁撴灉" dict="tristate1"></zt-dict>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="el-flexManageDialog el-border-bottom">
+        <div class="DFormWidth DAlign DHold">
+          璇勫璁板綍
+        </div>
+        <div style="width: calc(100% - 120px)" class="el-border-left">
+          <el-form-item class="el-wt-form-item-margin" label-width="20px" style="width: 85%">
+            <el-input type="textarea" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�"
+                      v-model="dataForm.contractReview.reviewRecord"></el-input>
+          </el-form-item>
+        </div>
+      </div>
+      <div class="el-flexManageDialog 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-flexManageDialog">
+        <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-flexManageDialog">
+        <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%">
+            <span>{{dataForm.contractReview.technicalDirector}}</span>
+          </el-form-item>
+          <el-form-item label="鏃ユ湡锛�" style="width: 48%">
+            <span>{{dataForm.contractReview.reviewDate}}</span>
+          </el-form-item>
+        </div>
+      </div>
+      <div class="el-flexManageDialog">
+        <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>
+      <add-or-update-check ref="addOrUpdate" @recall="setCheckId"/>
+    </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 {
+        dataForm: {
+          id: '',
+          contractReview: {
+            code: '',
+            orderCode: '',
+            reviewType: '',
+            reviewRecord: '',
+            specialRequire: '',
+            subcontract: '',
+            reviewConclusion: '',
+            technicalDirector: '',
+            reviewDate: '',
+            reviewPanelMember: '',
+          },
+          testAgencyInfo:{
+            agencyName:'',
+            labContactNum:''
+          },
+          reviewItemList:[]
+        }
+      }
+    },
+    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.getInfo()
+        console.log(this.dataForm.id, this.dataForm.projectId, 'params params')
+      },
+      // 鑾峰彇淇℃伅
+      async getInfo() {
+        let params = {
+          reviewId: this.dataForm.id,
+          projectId: this.dataForm.projectId
+        }
+        let res = await this.$http.get(`/contractReview/ContractReview/getDto`, {params: params})
+        this.dataForm = {
+          ...this.dataForm,
+          ...res.data
+        }
+        console.log(this.dataForm, "getInfo this.dataForm")
+      },
+
+      setCheckId(checkId, row) {
+        console.log(checkId, row, "setCheckId(checkId, row)")
+        this.$set(row, 'checkId', checkId)
+      },
+      /*async print(){
+        var params = qs.stringify({
+          token: Cookies.get('token'),
+          id:this.dataForm.id
+        })
+        let apiURL = `/contractReview/ContractReview/exportWarehouseOrder`
+        window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${params}`
+      },*/
+      // 琛ㄥ崟鎻愪氦
+      async formSubmit(submitType) {
+        let res = await this.$http[!this.dataForm.id ? 'post' : 'put']('/contractReview/ContractReview/', this.dataForm)
+        if (res.success) {
+          await this.$tip.success()
+          this.$refs.dialog.close()
+          this.$emit('refreshDataList')
+        }
+      }
+    }
+  }
+</script>
diff --git a/web/src/views/modules/contractReview/ContractReview.vue b/web/src/views/modules/contractReview/ContractReview.vue
new file mode 100644
index 0000000..1fadbb7
--- /dev/null
+++ b/web/src/views/modules/contractReview/ContractReview.vue
@@ -0,0 +1,65 @@
+<template>
+  <el-card shadow="never" class="aui-card--fill">
+    <div class="mod-contractReview-contractReview}">
+      <zt-table-wraper query-url="/contractReview/ContractReview/page" delete-url="/contractReview/ContractReview" v-slot="{ table }">
+        <el-form :inline="true" :model="dataForm" @keyup.enter.native="table.query()">
+          <el-form-item>
+            <zt-dict v-model="dataForm.reviewType" dict="review_type" placeholder="璇烽�夋嫨璇勫闃舵" clearable></zt-dict>
+          </el-form-item>
+          <el-form-item>
+            <el-input v-model="dataForm.softwareName" 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"  @click="add()">鏂板</zt-button>
+            <zt-button type="delete" perm="contractReview: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="reviewType" label="璇勫闃舵"/>
+            <el-table-column prop="softwareName" width="250px" label="杞欢鍚嶇О"/>
+            <el-table-column prop="softwareIdentity" width="150px" label="椤圭洰鏍囪瘑"/>
+              <zt-table-column-handle :table="table" edit-perm="contractReview:update" delete-perm="contractReview::delete"/>
+        </el-table>
+        <!-- 寮圭獥, 鏂板 / 淇敼 -->
+        <add-or-update ref="addOrUpdate" @refreshDataList="table.query"/>
+        <ProjectSelect ref="projectSelect"
+                       @refreshDataList="table.query"
+                       @setProjectInfo="openAddWin">
+        </ProjectSelect>
+      </zt-table-wraper>
+    </div>
+  </el-card>
+</template>
+
+<script>
+  import AddOrUpdate from './ContractReview-AddOrUpdate'
+  import ProjectSelect from "../project/Project-select.vue"
+  export default {
+    data() {
+      return {
+        dataForm: {
+          reviewType: '',
+        }
+      }
+    },
+    components: {
+      AddOrUpdate,
+      ProjectSelect,
+    },
+    methods: {
+      add() {
+        this.$refs.projectSelect.$refs.dialog.init("contract_review")
+      },
+      isCheckbox(row,index){
+        return !(row.flowInfo && row.flowInfo.bizId);
+      },
+      openAddWin(row) {
+        console.log(row.id, 'row.id')
+        this.$refs.addOrUpdate.$refs.dialog.init(null, {id: null, projectId: row.id})
+      },
+    }
+  }
+</script>

--
Gitblit v1.9.1