From 28aaf2ffa1dbb860a292ba330a7e9362e60e7832 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期五, 12 七月 2024 16:41:03 +0800
Subject: [PATCH] update

---
 assess-admin/src/main/resources/application-dev.yml                                                      |    1 
 assess-admin/src/main/resources/db/migration/V20240712001_change_expert_info.sql                         |    6 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java                                 |    7 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementServiceImpl.java     |  139 ++++
 assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml                                          |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java            |    1 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java                |    3 
 assess-system/src/main/resources/mapper/AssProjectSupplementFileMapper.xml                               |   12 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java                           |    7 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java                             |    8 
 assess-admin/src/main/resources/db/migration/V20240611002_project_supplement_file.sql                    |   17 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java                |   15 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementMapper.java                |   41 +
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java                   |    2 
 assess-admin/src/main/resources/db/migration/V20240615001_change_project.sql                             |    5 
 assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java                              |    3 
 assess-system/src/main/java/com/gkhy/assess/system/domain/vo/SysExpertInfoExcelVO.java                   |  105 +++
 assess-system/src/main/java/com/gkhy/assess/system/excel/ExpertExcelListener.java                        |   98 +++
 assess-system/src/main/java/com/gkhy/assess/system/service/SysCommonService.java                         |    6 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java                               |    7 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java                           |    6 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java                                 |    2 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java                 |   10 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java          |    6 
 assess-admin/src/main/resources/application.yml                                                          |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java            |   22 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementService.java              |   58 ++
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplementFile.java                  |   71 ++
 assess-admin/src/main/resources/db/migration/V20240613001_change_supplement_file.sql                     |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java                                  |    7 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java          |    9 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java                               |    7 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementFileService.java          |   34 +
 assess-common/src/main/java/com/gkhy/assess/common/excel/SexConvert.java                                 |   33 +
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java       |   19 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java                                   |    8 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java                          |    7 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java                        |    6 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementFileMapper.java            |   33 +
 assess-system/src/main/resources/mapper/AssProjectSupplementMapper.xml                                   |   50 +
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java          |   19 
 assess-admin/src/test/java/com/gkhy/admin/ExcelTest.java                                                 |   33 +
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java                                |    1 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java                          |    7 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java                       |    7 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java                           |    6 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java                  |  172 ++++-
 assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java                     |    9 
 assess-common/pom.xml                                                                                    |    5 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java                          |    1 
 pom.xml                                                                                                  |    7 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java                 |    6 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementFileServiceImpl.java |   39 +
 assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java                               |    4 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java               |   20 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java              |   19 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java                          |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java                            |    6 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java                         |    6 
 assess-common/src/main/java/com/gkhy/assess/common/excel/BirthdayConvert.java                            |   34 +
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java                        |    8 
 assess-system/src/main/resources/mapper/SysUserMapper.xml                                                |    9 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java                      |    3 
 assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java                   |   23 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java                             |    6 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java                       |    6 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java         |   24 
 assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml                                          |    4 
 assess-system/src/main/resources/mapper/AssProjectMapper.xml                                             |   16 
 assess-admin/src/main/resources/db/migration/V20240611001_project_supplement.sql                         |   20 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java            |   10 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplement.java                      |  106 +++
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java                       |    7 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java                             |    8 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java          |    6 
 assess-common/src/main/java/com/gkhy/assess/common/excel/DutyConvert.java                                |   33 +
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java                           |    6 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectSupplementController.java      |   71 ++
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java                             |   12 
 assess-admin/src/main/resources/db/migration/V20240614001_add_index.sql                                  |   44 +
 80 files changed, 1,503 insertions(+), 199 deletions(-)

diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java
index 63580c4..97c3298 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java
@@ -3,11 +3,14 @@
 
 import com.gkhy.assess.common.annotation.RepeatSubmit;
 import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.AssProjectSupplement;
 import com.gkhy.assess.system.service.AssAccessoryFileService;
+import com.gkhy.assess.system.service.AssProjectSupplementFileService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -28,6 +31,8 @@
 public class AssAccessoryFileController {
     @Autowired
     private AssAccessoryFileService assAccessoryFileService;
+    @Autowired
+    private AssProjectSupplementFileService assProjectSupplementFileService;
 
     @RepeatSubmit
     @ApiOperation(value = "评估文件上传(图片/文件)")
@@ -36,8 +41,8 @@
             @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
             @ApiImplicitParam(paramType = "body", name = "moduleType", dataType = "int", required = true, value = "上传模块code:1主要装置前的合影照片,2现场勘验照片,3企业陪同人员图片,4现场勘验视频,5编制现场安全检查表,6评审记录附件,7评价结论,8过程控制记录文档附件,9项目归档材料,10报备申请附件,11项目整改情况附件")
     })
-    public CommonResult uploadFile(@RequestParam @NotNull Long projectId,@RequestParam @NotNull Integer moduleType, @RequestParam MultipartFile file){
-        return CommonResult.success(assAccessoryFileService.uploadFile(projectId,moduleType,file));
+    public CommonResult uploadFile(@RequestParam @NotNull Long projectId,@RequestParam @NotNull Integer moduleType,@RequestParam MultipartFile file){
+            return CommonResult.success(assAccessoryFileService.uploadFile(projectId, moduleType,  file));
     }
 
     @ApiOperation(value = "根据项目id获取评估文件")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java
index 9bdaf66..1243d26 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java
@@ -9,6 +9,8 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -69,6 +71,7 @@
 
 
     @RepeatSubmit
+    @RequiresPermissions(value={"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
     @ApiOperation(value = "删除项目")
     @DeleteMapping("/remove/{projectId}")
     public CommonResult deleteProject(@PathVariable(value = "projectId")Long projectId){
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectSupplementController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectSupplementController.java
new file mode 100644
index 0000000..ebdd9ee
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectSupplementController.java
@@ -0,0 +1,71 @@
+package com.gkhy.assess.admin.controller.web;
+
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.AssProjectSupplement;
+import com.gkhy.assess.system.service.AssProjectSupplementService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 项目补录表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-11 14:16:18
+ */
+@Api(tags = "项目补录前端控制器")
+@RestController
+@RequestMapping("/manage/project-supplement")
+public class AssProjectSupplementController {
+    @Autowired
+    private AssProjectSupplementService projectSupplementService;
+
+    @ApiOperation(value = "项目列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
+    })
+    @GetMapping("/list")
+    public CommonResult projectList(AssProjectSupplement projectSupplement){
+        return CommonResult.success(projectSupplementService.projectSupplementList(projectSupplement));
+    }
+
+    @ApiOperation(value = "根据id获取项目详情")
+    @GetMapping("/detail/{projectId}")
+    public CommonResult projectDetail(@PathVariable(value = "projectId") Long projectId){
+        return CommonResult.success(projectSupplementService.getProjectSupplementById(projectId));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建项目补录")
+    @PostMapping("/add")
+    public CommonResult addProject(@Validated @RequestBody AssProjectSupplement projectSupplement){
+        return CommonResult.success(projectSupplementService.addProjectSupplement(projectSupplement));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑项目补录")
+    @PutMapping("/edit")
+    public CommonResult editProject(@Validated @RequestBody AssProjectSupplement projectSupplement){
+        return CommonResult.success(projectSupplementService.editProjectSupplement(projectSupplement));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除项目")
+    @DeleteMapping("/remove/{projectId}")
+    public CommonResult deleteProject(@PathVariable(value = "projectId")Long projectId){
+        return CommonResult.success(projectSupplementService.deleteProjectSupplement(projectId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
index b3e22f6..6ef14fb 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
@@ -13,6 +13,8 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+
 @Api(tags = "通用接口前端控制器")
 @RestController
 @RequestMapping("/system/common")
@@ -34,4 +36,12 @@
     }
 
 
+    @ApiOperation(value = "Excel导入")
+    @GetMapping("/importExcel")
+    public CommonResult importExcel() throws IOException {
+        commonService.importExcel();
+        return CommonResult.success();
+    }
+
+
 }
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
index 2f13c70..4945ee7 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
@@ -90,7 +90,7 @@
     }
 
     @RepeatSubmit
-    @RequiresPermissions("system:assess:monitor")
+    @RequiresPermissions(value = {"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
     @ApiOperation(value = "编辑机构")
     @PutMapping("/editAgency")
     public CommonResult editAgency(@RequestBody SysUser user){
diff --git a/assess-admin/src/main/resources/application-dev.yml b/assess-admin/src/main/resources/application-dev.yml
index 4a7ca0a..e579e73 100644
--- a/assess-admin/src/main/resources/application-dev.yml
+++ b/assess-admin/src/main/resources/application-dev.yml
@@ -8,7 +8,6 @@
         url: jdbc:mysql://localhost:3306/smart_assess?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
         username: root
         password: password
-      # 从库数据源
       slave:
         enabled: false
         url:
diff --git a/assess-admin/src/main/resources/application.yml b/assess-admin/src/main/resources/application.yml
index 79b029e..64b5108 100644
--- a/assess-admin/src/main/resources/application.yml
+++ b/assess-admin/src/main/resources/application.yml
@@ -7,7 +7,7 @@
     multipart:
       enabled: true
       # 单个文件大小
-      max-file-size: 20MB
+      max-file-size: 50MB
       # 设置总上传的文件大小
       max-request-size: 100MB
   mvc:
diff --git a/assess-admin/src/main/resources/db/migration/V20240611001_project_supplement.sql b/assess-admin/src/main/resources/db/migration/V20240611001_project_supplement.sql
new file mode 100644
index 0000000..2b0e259
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240611001_project_supplement.sql
@@ -0,0 +1,20 @@
+
+-- ----------------------------
+-- 项目补录表
+-- ----------------------------
+CREATE TABLE `smart_assess`.`ass_project_supplement`  (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`name` varchar(50) NOT NULL COMMENT '项目名称',
+`writer` varchar(50) NOT NULL COMMENT '报告撰写人',
+`reviewer` varchar(50) NOT NULL COMMENT '报告审批人',
+`filing_date` datetime NOT NULL COMMENT '项目时间',
+`agency_id` bigint NOT NULL COMMENT '机构id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目补录表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240611002_project_supplement_file.sql b/assess-admin/src/main/resources/db/migration/V20240611002_project_supplement_file.sql
new file mode 100644
index 0000000..c181d6d
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240611002_project_supplement_file.sql
@@ -0,0 +1,17 @@
+
+-- ----------------------------
+-- 项目补录附件表
+-- ----------------------------
+CREATE TABLE `smart_assess`.`ass_project_supplement_file`  (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`file_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',
+`origin_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件原始名称',
+`path` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件存放路径',
+`project_id` bigint NOT NULL COMMENT '项目补录id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目补录附件表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240613001_change_supplement_file.sql b/assess-admin/src/main/resources/db/migration/V20240613001_change_supplement_file.sql
new file mode 100644
index 0000000..91dcaea
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240613001_change_supplement_file.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `smart_assess`.`ass_project_supplement_file`
+MODIFY COLUMN `origin_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件原始名称';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240614001_add_index.sql b/assess-admin/src/main/resources/db/migration/V20240614001_add_index.sql
new file mode 100644
index 0000000..e79ef69
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240614001_add_index.sql
@@ -0,0 +1,44 @@
+ALTER TABLE `smart_assess`.`ass_project`
+ADD INDEX `index_agency_id`(`agency_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_audit`
+ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_conclusion`
+ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_contract`
+ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_estimate_plan`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_estimate_task`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_filing_apply`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_investigation`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_process_audit`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_project_material`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_project_supplement`
+    ADD INDEX `index_agency_id`(`agency_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_project_supplement_file`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_recitification`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_risk_estimate`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
+
+ALTER TABLE `smart_assess`.`ass_work_notification`
+    ADD INDEX `index_project_id`(`project_id`) USING BTREE;
diff --git a/assess-admin/src/main/resources/db/migration/V20240615001_change_project.sql b/assess-admin/src/main/resources/db/migration/V20240615001_change_project.sql
new file mode 100644
index 0000000..444bbf4
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240615001_change_project.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `smart_assess`.`ass_project`
+MODIFY COLUMN `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '项目名称';
+
+ALTER TABLE `smart_assess`.`ass_project_supplement`
+MODIFY COLUMN `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '项目名称';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240712001_change_expert_info.sql b/assess-admin/src/main/resources/db/migration/V20240712001_change_expert_info.sql
new file mode 100644
index 0000000..8b440b0
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240712001_change_expert_info.sql
@@ -0,0 +1,6 @@
+ALTER TABLE `smart_assess`.`sys_expert_info`
+MODIFY COLUMN `title` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职称',
+MODIFY COLUMN `company_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '单位名称',
+MODIFY COLUMN `current_profession` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '现在从事专业或方向',
+ADD COLUMN `domain` varchar(10) NULL COMMENT '专家领域',
+ADD COLUMN `level` varchar(10) NULL COMMENT '入库分级';
\ No newline at end of file
diff --git a/assess-admin/src/test/java/com/gkhy/admin/ExcelTest.java b/assess-admin/src/test/java/com/gkhy/admin/ExcelTest.java
new file mode 100644
index 0000000..873d322
--- /dev/null
+++ b/assess-admin/src/test/java/com/gkhy/admin/ExcelTest.java
@@ -0,0 +1,33 @@
+package com.gkhy.admin;
+
+import com.alibaba.excel.EasyExcel;
+import com.gkhy.assess.admin.GkhyAdminApplication;
+import com.gkhy.assess.system.excel.ExpertExcelListener;
+import com.gkhy.assess.system.domain.vo.SysExpertInfoExcelVO;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.io.Resource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = GkhyAdminApplication.class)
+//@ActiveProfiles("dev")
+@Slf4j
+public class ExcelTest {
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    @Test
+    public void testExcel() throws IOException {
+        Resource resource = applicationContext.getResource("classpath:abc.xlsx");
+        InputStream resourceAsStream =resource.getInputStream();
+        EasyExcel.read(resourceAsStream, SysExpertInfoExcelVO.class,new ExpertExcelListener()).sheet(0).doRead();
+    }
+}
diff --git a/assess-common/pom.xml b/assess-common/pom.xml
index 2e310ce..f22f60d 100644
--- a/assess-common/pom.xml
+++ b/assess-common/pom.xml
@@ -116,6 +116,11 @@
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java
index 8d8860f..047dfa7 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java
@@ -33,6 +33,9 @@
     @ApiModelProperty(value = "机构Id")
     private Long agentId;
 
+    @ApiModelProperty(value = "审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+    private Integer state;
+
     @ApiModelProperty("用户角色")
     private String role;
 
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/excel/BirthdayConvert.java b/assess-common/src/main/java/com/gkhy/assess/common/excel/BirthdayConvert.java
new file mode 100644
index 0000000..5bc0f4c
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/excel/BirthdayConvert.java
@@ -0,0 +1,34 @@
+package com.gkhy.assess.common.excel;
+
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.converters.ReadConverterContext;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.data.DataFormatData;
+
+import java.util.Date;
+
+public class BirthdayConvert implements Converter<Date> {
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return Date.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public Date convertToJavaData(ReadConverterContext<?> context) throws Exception {
+        DataFormatData dataFormatData = context.getReadCellData().getDataFormatData();
+        Object data = context.getReadCellData().getData();
+        String borthday=dataFormatData.toString();
+        borthday=borthday.trim();
+        String year=borthday.substring(0,4);
+
+        return new Date();
+
+    }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/excel/DutyConvert.java b/assess-common/src/main/java/com/gkhy/assess/common/excel/DutyConvert.java
new file mode 100644
index 0000000..9a52ec3
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/excel/DutyConvert.java
@@ -0,0 +1,33 @@
+package com.gkhy.assess.common.excel;
+
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.converters.ReadConverterContext;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+
+public class DutyConvert implements Converter<Integer> {
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return Integer.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public Integer convertToJavaData(ReadConverterContext<?> context) throws Exception {
+        String duty=context.getReadCellData().getStringValue();
+        switch (duty){
+            case "在岗":
+                return 0;
+            case "退休":
+                return 1;
+            default:
+                return 0;
+        }
+
+    }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/excel/SexConvert.java b/assess-common/src/main/java/com/gkhy/assess/common/excel/SexConvert.java
new file mode 100644
index 0000000..5a8b2d2
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/excel/SexConvert.java
@@ -0,0 +1,33 @@
+package com.gkhy.assess.common.excel;
+
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.converters.ReadConverterContext;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+
+public class SexConvert implements Converter<Integer> {
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return Integer.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public Integer convertToJavaData(ReadConverterContext<?> context) throws Exception {
+        String sex=context.getReadCellData().getStringValue();
+        switch (sex){
+            case "男":
+                return 0;
+            case "女":
+                return 1;
+            default:
+                return 2;
+        }
+
+    }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
index dd9aae4..302045a 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
@@ -49,7 +49,7 @@
     public static String tokenHead="";
 
     /**Token有效期为1天(Token在reids中缓存时间为两倍)  单位ms*/
-    public static final long EXPIRATION=(1 * 24) * 60 * 60 * 1000;  //JWT的超期限时间(60*60*24*1)
+    public static final long EXPIRATION=(1 *12) * 60 * 60 * 1000;  //JWT的超期限时间(60*60*24*1)
 
     /**
      * token有效期还有30分钟,刷新token  单位ms
@@ -127,7 +127,7 @@
      * @return
      */
     public static String sign(String username,String secret,Integer identity){
-        Date date=new Date(System.currentTimeMillis()+EXPIRATION*1000);
+        Date date=new Date(System.currentTimeMillis()+EXPIRATION);
         Algorithm algorithm=Algorithm.HMAC256(secret);
         return JWT.create().withClaim("username",username)
                 .withClaim("identity",identity).withExpiresAt(date).sign(algorithm);
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java
index 5bc2a53..f820a65 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java
@@ -13,8 +13,10 @@
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
 
+import java.lang.reflect.Array;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
 import java.util.TimeZone;
 
 /**
@@ -61,16 +63,21 @@
     @Bean
     public CorsFilter corsFilter() {
         final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
-        final CorsConfiguration corsConfiguration = new CorsConfiguration();
+        final CorsConfiguration config = new CorsConfiguration();
         //是否允许请求带有验证信息
-        corsConfiguration.setAllowCredentials(true);
+        config.setAllowCredentials(true);
+        config.setAllowedOrigins(Arrays.asList("*"));
+        config.setAllowedMethods(Arrays.asList("*"));
+        config.setAllowCredentials(true);
+        config.setMaxAge(168000L);
+
         // 允许访问的客户端域名
-        corsConfiguration.addAllowedOriginPattern("*");
-        // 允许服务端访问的客户端请求头
-        corsConfiguration.addAllowedHeader("*");
-        // 允许访问的方法名,GET POST等
-        corsConfiguration.addAllowedMethod("*");
-        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
+//        config.addAllowedOriginPattern("*");
+//        // 允许服务端访问的客户端请求头
+//        config.addAllowedHeader("*");
+//        // 允许访问的方法名,GET POST等
+//        config.addAllowedMethod("*");
+        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", config);
         return new CorsFilter(urlBasedCorsConfigurationSource);
     }
 }
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java
index f2deed4..fa572be 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java
@@ -67,6 +67,7 @@
         // 配置shiro错误从定向问题 /error 路径的错误处理
         chain.addPathDefinition("/error", "anon");
         chain.addPathDefinition("/upload/**", "anon");
+        chain.addPathDefinition("/system/common/importExcel", "anon");
 
         chain.addPathDefinition("/system/account/login","anon");
         chain.addPathDefinition("/system/logout", "anon");
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java
index cd24912..5a55de1 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java
@@ -5,6 +5,7 @@
 import com.gkhy.assess.common.utils.RequestUtil;
 import com.gkhy.assess.common.utils.SpringContextUtils;
 import com.gkhy.assess.common.domain.JwtToken;
+import com.gkhy.assess.common.utils.StringUtils;
 import com.gkhy.assess.framework.shiro.service.SysLoginService;
 import com.gkhy.assess.system.domain.SysUser;
 import lombok.extern.slf4j.Slf4j;
@@ -65,7 +66,7 @@
         SysUser sysUser=null;
         if(authenticationToken instanceof JwtToken){
             String token= (String) authenticationToken.getCredentials();
-            if(token==null){
+            if(StringUtils.isBlank(token)){
                 log.info("————————身份认证失败——————————IP地址:  "+ RequestUtil.getRequestIp(req) +",URL:"+req.getRequestURI());
                 throw new AuthenticationException("token为空!");
             }
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java
index 96d9a40..f2a37b9 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java
@@ -56,11 +56,11 @@
         if(UserStatusEnum.DISABLE.getCode().equals(sysUser.getStatus())){
             throw new AuthenticationException("用户已被停用");
         }
-        if(UserIdentityEnum.AGENCY.getCode().equals(sysUser.getIdentity())){
-            if(!ApproveStatusEnum.APPROVED.getCode().equals(sysUser.getState())){
-                throw new AuthenticationException("机构账户审批还未通过");
-            }
-        }
+//        if(UserIdentityEnum.AGENCY.getCode().equals(sysUser.getIdentity())){
+//            if(!ApproveStatusEnum.APPROVED.getCode().equals(sysUser.getState())){
+//                throw new AuthenticationException("机构账户审批还未通过");
+//            }
+//        }
     }
 
     public SysUser validJwtToken(String jwtToken){
@@ -76,7 +76,7 @@
             throw new AuthenticationException("token非法无效!");
         }
         if(!jwtTokenRefresh(jwtToken,username,sysUser.getPassword(),identity)){
-            throw new AuthenticationException("Token已失效,请重新登录!");
+            throw new AuthenticationException("您的账号登录过期,请重新登录!");
         }
      //   setRolePermission(sysUser);
         return sysUser;
@@ -97,16 +97,15 @@
      */
     public boolean jwtTokenRefresh(String jwtToken, String username, String passWord, Integer identity){
         String tokenKey=redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
-        String userKey=redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+username+"_"+identity);
+      //  String userKey=redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+username+"_"+identity);
         String cacheToken= (String) redisUtils.get(tokenKey);
         if(StringUtils.isNotEmpty(cacheToken)){
             // 校验token有效性
             if(!JwtTokenUtil.isNeedUpdate(cacheToken,username,passWord,identity)){
                 String newToken=JwtTokenUtil.sign(username,passWord,identity);
                 // 设置超时时间
-                redisUtils.set(tokenKey,newToken);
-                redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
-                redisUtils.expire(userKey,(JwtTokenUtil.EXPIRATION*2/1000)+2);
+                redisUtils.set(tokenKey,newToken,JwtTokenUtil.EXPIRATION*2/1000);
+               // redisUtils.expire(userKey,(JwtTokenUtil.EXPIRATION*2/1000)+2);
             }
             return true;
         }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java
index 24c7e2e..2bbcbfd 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -65,6 +63,7 @@
     @TableField("project_id")
     private Long projectId;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java
index b0c0e6a..eadfc01 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -147,6 +145,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java
index 95ac9a2..99a407b 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import java.util.List;
 
@@ -15,6 +12,7 @@
 import lombok.Setter;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
 import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
@@ -54,6 +52,7 @@
     @TableField("project_id")
     private Long projectId;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
@@ -62,6 +61,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @NotEmpty(message = "评价报告不能为空")
     @ApiModelProperty("评价结论附件")
     @TableField(exist = false)
     List<AssAccessoryFile> accessoryFiles;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java
index ec298b7..4dfb7d7 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -71,6 +69,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java
index 9075f00..18453d8 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -66,6 +64,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java
index 0ee466b..238ee3a 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -64,6 +61,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java
index b7c506b..93543f6 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -68,6 +66,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java
index fa84b3c..a263e76 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -79,6 +77,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java
index 0992ee0..ceb2aee 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.gkhy.assess.common.domain.BaseEntity;
@@ -55,12 +52,13 @@
     @TableField("sign_path")
     private String signPath;
 
-    @NotBlank(message = "承诺书图片路径不能为空")
+   // @NotBlank(message = "承诺书图片路径不能为空")
     @ApiModelProperty(value = "承诺书图片路径",required = true)
     @TableField("insurance_path")
     private String insurancePath;
 
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java
index 9c7a4f1..cd57849 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.gkhy.assess.common.domain.BaseEntity;
@@ -64,6 +61,7 @@
     @TableField("scene")
     private Integer  scene;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java
index 8876572..d02fd21 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.gkhy.assess.common.domain.BaseEntity;
@@ -47,6 +44,7 @@
     @TableField("file_id")
     private Long fileId;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java
index 28c791a..214c3ff 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -73,6 +71,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java
index 7e2b11a..feb2b87 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java
@@ -1,11 +1,10 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.gkhy.assess.common.domain.BaseEntity;
@@ -93,6 +92,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
@@ -101,4 +101,8 @@
     @TableField(exist = false)
     private SysUser person;
 
+    @ApiModelProperty("项目担任角色数组")
+    @TableField(exist = false)
+    private List<Integer> playRoles;
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java
index 967145f..05da18d 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.gkhy.assess.common.domain.BaseEntity;
 import com.gkhy.assess.system.domain.SysUser;
@@ -165,6 +162,7 @@
     @TableField("project_id")
     private Long projectId;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java
index 6fca7e2..6639a88 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java
@@ -42,6 +42,7 @@
     private Long id;
 
     @NotBlank(message = "项目名称不能为空")
+    @Length(min=1,max=100,message = "项目名称不能超过{max}字符")
     @ApiModelProperty(value = "项目名称",required = true)
     @TableField("name")
     private String name;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java
index b1b95b6..cd6e697 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.gkhy.assess.common.domain.BaseEntity;
@@ -56,6 +53,7 @@
     @TableField("file_id")
     private Long fileId;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplement.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplement.java
new file mode 100644
index 0000000..1a3e66b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplement.java
@@ -0,0 +1,106 @@
+package com.gkhy.assess.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 项目补录表
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:14
+ */
+@Getter
+@Setter
+@TableName("ass_project_supplement")
+@ApiModel(value = "AssProjectSupplement对象", description = "项目补录表")
+public class AssProjectSupplement implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+
+    @NotBlank(message = "项目名称不能为空")
+    @Length(min=1,max=100,message = "项目名称不能超过{max}字符")
+    @ApiModelProperty(value = "项目名称",required = true)
+    @TableField("name")
+    private String name;
+
+    @NotBlank(message = "报告撰写人不能为空")
+    @Length(min=1,max=50,message = "报告撰写人不能超过{max}字符")
+    @ApiModelProperty(value = "报告撰写人",required = true)
+    @TableField("writer")
+    private String writer;
+
+    @NotBlank(message = "报告审批人不能为空")
+    @Length(min=1,max=50,message = "报告审批人不能超过{max}字符")
+    @ApiModelProperty(value = "报告审批人",required = true)
+    @TableField("reviewer")
+    private String reviewer;
+
+    @NotNull(message = "项目时间不能为空")
+    @ApiModelProperty(value = "项目时间",required = true)
+    @TableField("filing_date")
+    private LocalDateTime filingDate;
+
+    @NotNull(message = "机构id不能为空")
+    @ApiModelProperty(value = "机构id",required = true)
+    @TableField("agency_id")
+    private Long agencyId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("备注")
+    @TableField("remark")
+    private String remark;
+
+    @NotEmpty(message = "附件列表不能为空")
+    @ApiModelProperty(value = "附件列表",required = true)
+    @TableField(exist = false)
+    private List<AssProjectSupplementFile> files;
+
+    @ApiModelProperty("机构名称")
+    @TableField(exist = false)
+    private String agencyName;
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplementFile.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplementFile.java
new file mode 100644
index 0000000..16a8e77
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectSupplementFile.java
@@ -0,0 +1,71 @@
+package com.gkhy.assess.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ * 项目补录附件表
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:15
+ */
+@Getter
+@Setter
+@TableName("ass_project_supplement_file")
+@ApiModel(value = "AssProjectSupplementFile对象", description = "项目补录附件表")
+public class AssProjectSupplementFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("文件名称")
+    @TableField("file_name")
+    private String fileName;
+
+    @Length(min = 0,max = 100,message = "文件名长度不能超过100个字符")
+    @ApiModelProperty("文件原始名称")
+    @TableField("origin_name")
+    private String originName;
+
+    @ApiModelProperty("文件存放路径")
+    @TableField("path")
+    private String path;
+
+    @ApiModelProperty("项目补录id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java
index 8282aee..7899e8c 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import java.time.LocalDateTime;
 
@@ -66,6 +63,7 @@
     @TableField("reason")
     private String reason;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java
index 706b967..4df4982 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java
@@ -1,9 +1,6 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 
 import java.time.LocalDateTime;
 
@@ -131,6 +128,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java
index 83f962d..092d671 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -71,6 +69,7 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java
index f08252a..94a72a3 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java
@@ -74,7 +74,7 @@
     private String province;
 
 
-    @NotBlank(message = "市不能为空")
+  //  @NotBlank(message = "市不能为空")
     @ApiModelProperty(value = "市",required = true)
     @TableField("city")
     private String city;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java
index b755c85..2d201cc 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java
@@ -200,6 +200,14 @@
     @TableField("version")
     private Integer version;
 
+    @ApiModelProperty("专家领域")
+    @TableField("domain")
+    private String domain;
+
+    @ApiModelProperty("入库分级")
+    @TableField("level")
+    private String level;
+
 
 
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java
index 3c08c3d..128ec62 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java
@@ -178,17 +178,15 @@
     @TableField(exist = false)
     private SysAgency agency;
 
-    @NotNull(message = "社保照片不能为空",groups ={ExpertGroup.class} )
+
     @ApiModelProperty("社保照片路径列表,创建专家传参")
     @TableField(exist = false)
     private List<SysAttach> socialAttach;
 
-    @NotNull(message = "医保照片不能为空",groups ={ExpertGroup.class} )
     @ApiModelProperty("医保照片路径列表,创建专家传参")
     @TableField(exist = false)
     private List<SysAttach> medicalAttach;
 
-    @NotNull(message = "工资照片不能为空",groups ={ExpertGroup.class} )
     @ApiModelProperty("工资照片路径列表,创建专家传参")
     @TableField(exist = false)
     private List<SysAttach> salaryAttach;
@@ -201,4 +199,8 @@
     @TableField(exist = false)
     private PersonProjectVO personProjectVO;
 
+    @ApiModelProperty("机构名称")
+    @TableField(exist = false)
+    private String agencyName;
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java
index b013c9a..07de6f8 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java
@@ -1,9 +1,7 @@
 package com.gkhy.assess.system.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -50,6 +48,7 @@
     @TableField("user_id")
     private Long userId;
 
+    @Version
     @ApiModelProperty("乐观锁")
     @TableField("version")
     private Integer version;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/SysExpertInfoExcelVO.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/SysExpertInfoExcelVO.java
new file mode 100644
index 0000000..6c4abd2
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/SysExpertInfoExcelVO.java
@@ -0,0 +1,105 @@
+package com.gkhy.assess.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.common.excel.BirthdayConvert;
+import com.gkhy.assess.common.excel.DutyConvert;
+import com.gkhy.assess.common.excel.SexConvert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 系统专家信息表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Getter
+@Setter
+public class SysExpertInfoExcelVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("序号")
+    @ExcelProperty(value = "序号",index = 0)
+    private String number;
+
+    @ApiModelProperty("专家名称")
+    @ExcelProperty(value = "姓名",index = 1)
+    private String name;
+
+    @ApiModelProperty("身份证号码")
+    @ExcelProperty(value = "身份证号",index = 2)
+    private String idCard;
+
+
+    @ApiModelProperty("出生日期")
+    @ExcelProperty(value = "出生年月",index = 3)
+    private LocalDateTime birthday;
+
+    @ApiModelProperty("性别(0男,1女,2未知,默认2)")
+    @ExcelProperty(value = "性别",converter = SexConvert.class,index = 4)
+    private Integer sex;
+
+    @ApiModelProperty("最高学历")
+    @ExcelProperty(value = "学历",index = 5)
+    private String degree;
+
+
+    @ApiModelProperty("专业")
+    @ExcelProperty(value = "所学专业",index = 6)
+    private String speciality;
+
+    @ApiModelProperty("职称")
+    @ExcelProperty(value = "职称",index = 7)
+    private String title;
+
+    @ApiModelProperty("在岗情况(0在岗,1退休)")
+    @ExcelProperty(value = "在岗情况",converter = DutyConvert.class,index = 8)
+    private Integer dutyStatus;
+
+
+    @ApiModelProperty("单位名称")
+    @ExcelProperty(value = "单位全称",index = 9)
+    private String companyName;
+
+
+
+    @ApiModelProperty("现在从事专业或方向")
+    @ExcelProperty(value = "现从事专业及方向",index = 10)
+    private String currentProfession;
+
+
+    @ApiModelProperty("手机号")
+    @ExcelProperty(value = "联系方式",index = 11)
+    private String phone;
+
+    @ApiModelProperty("支撑方向安全生产")
+    @ExcelProperty(value = "支持方向",index = 12)
+    private String supportDirectionSafety;
+
+    @ApiModelProperty("专家领域")
+    @ExcelProperty(value = "专家领域",index = 13)
+    private String domain;
+
+    @ApiModelProperty("入库分级")
+    @ExcelProperty(value = "入库分级",index = 14)
+    private String level;
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/excel/ExpertExcelListener.java b/assess-system/src/main/java/com/gkhy/assess/system/excel/ExpertExcelListener.java
new file mode 100644
index 0000000..296877f
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/excel/ExpertExcelListener.java
@@ -0,0 +1,98 @@
+package com.gkhy.assess.system.excel;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.util.ListUtils;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.utils.StringUtils;
+import com.gkhy.assess.system.domain.SysExpertInfo;
+import com.gkhy.assess.system.domain.vo.SysExpertInfoExcelVO;
+import com.gkhy.assess.system.service.SysExpertInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+
+public class ExpertExcelListener extends AnalysisEventListener<SysExpertInfoExcelVO> {
+
+
+    private static final int BATCH_COUNT=100;
+
+    private List<SysExpertInfoExcelVO> cachedDateList= ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
+
+    @Override
+    public void onException(Exception exception, AnalysisContext context) throws Exception {
+        log.error("解析异常:",exception);
+        throw exception;
+    }
+
+    @Override
+    public void invoke(SysExpertInfoExcelVO sysExpertInfoExcelVO, AnalysisContext analysisContext) {
+        if(!StringUtils.isBlank(sysExpertInfoExcelVO.getName())){
+            cachedDateList.add(sysExpertInfoExcelVO);
+        }
+        if(cachedDateList.size()>=BATCH_COUNT){
+            saveData();
+            cachedDateList.clear();
+        }
+    }
+
+    private void saveData(){
+        for(SysExpertInfoExcelVO sysExpertInfoExcelVO:cachedDateList){
+            String direction=sysExpertInfoExcelVO.getSupportDirectionSafety();
+            String name=sysExpertInfoExcelVO.getName();
+            String idCard = sysExpertInfoExcelVO.getIdCard();
+            SysExpertInfo existExpertInfo = SpringUtil.getBean(SysExpertInfoService.class).getOne(Wrappers.<SysExpertInfo>lambdaQuery()
+                    .eq(true, SysExpertInfo::getIdCard, idCard)
+                    .last(" limit 1"));
+            direction=direction.replace("安全生产:","").trim();
+            String[] splits = direction.split("、");
+            List<String> safetyArray=new ArrayList<>();
+            for(String str:splits){
+                str=str.trim();
+                String code="1";
+                if(str.equals("现场检查")){
+                    code="1";
+                }else if(str.equals("调查评估")){
+                    code="2";
+                }else if(str.equals("咨询服务")){
+                    code="3";
+                }else if(str.equals("教育培训")){
+                    code="4";
+                }else{
+                    code="5";
+                }
+                safetyArray.add(code);
+            }
+            if(existExpertInfo!=null){
+                existExpertInfo.setState(2);
+                existExpertInfo.setSupportDirectionSafety(String.join( ",",safetyArray));
+                existExpertInfo.setDomain(sysExpertInfoExcelVO.getDomain());
+                existExpertInfo.setLevel(sysExpertInfoExcelVO.getLevel());
+                SpringUtil.getBean(SysExpertInfoService.class).updateById(existExpertInfo);
+            }else{
+                SysExpertInfo sysExpertInfo=new SysExpertInfo();
+                BeanUtils.copyProperties(sysExpertInfoExcelVO,sysExpertInfo);
+                sysExpertInfo.setSupportDirectionSafety(String.join( ",",safetyArray));
+                sysExpertInfo.setState(2);
+                SpringUtil.getBean(SysExpertInfoService.class).save(sysExpertInfo);
+            }
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        saveData();
+        log.info("sheet={}解析完成",analysisContext.readSheetHolder().getSheetName());
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java
index 0bf27f5..ab954ff 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java
@@ -53,4 +53,10 @@
      */
     List<PersonRecognitionVO> getPersonAndRecognitionCount(List<Long> projectIds);
 
+    /**
+     * 查找项目组长人数
+     * @param projectId
+     * @return
+     */
+    int getMajorPlanPersonCountByProject(Long projectId);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java
index 8f1747b..890aac0 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java
@@ -39,7 +39,7 @@
      * @param name
      * @return
      */
-    AssProject getProjectByName(String name);
+    AssProject getProjectByName(@Param("name")String name,@Param("agencyId")Long agencyId);
 
     /**
      * 获取项目状态
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementFileMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementFileMapper.java
new file mode 100644
index 0000000..39d40bf
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementFileMapper.java
@@ -0,0 +1,33 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssProjectSupplementFile;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目补录附件表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:15
+ */
+@Mapper
+public interface AssProjectSupplementFileMapper extends BaseMapper<AssProjectSupplementFile> {
+    /**
+     * 获取项目的附件
+     * @param projectId
+     * @return
+     */
+    List<AssProjectSupplementFile> getFilesByProjectId(Long projectId);
+
+
+    /**
+     * 根据项目id删除附件
+     * @param projectId
+     * @return
+     */
+    int deleteByProjectId(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementMapper.java
new file mode 100644
index 0000000..d85bda4
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectSupplementMapper.java
@@ -0,0 +1,41 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssProjectSupplement;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目补录表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:14
+ */
+@Mapper
+public interface AssProjectSupplementMapper extends BaseMapper<AssProjectSupplement> {
+    /**
+     * 根据名称获取项目
+     * @param name
+     * @param agencyId
+     * @return
+     */
+    AssProjectSupplement getProjectByName(@Param("name") String name, @Param("agencyId") Long agencyId);
+
+    /**
+     * 分页获取项目列表
+     * @param projectSupplement
+     * @return
+     */
+    List<AssProjectSupplement> projectList(AssProjectSupplement projectSupplement);
+
+    /**
+     * 根据id查询项目
+     * @param projectSupplementId
+     * @return
+     */
+    AssProjectSupplement getProjectSupplementById(Long projectSupplementId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java
index 8c18244..1d23096 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java
@@ -49,7 +49,7 @@
      * @param personId
      * @return
      */
-    int deletePlanPersonByPersonId(Long personId);
+    int deletePlanPersonByPersonId(Long personId,Long projectId,Integer playCode);
 
     /**
      * 校验项目成员是否唯一
@@ -63,4 +63,11 @@
      * @return
      */
     AssPlanPerson getPlanPersonByPersonId(Long personId,Long projectId);
+
+    /**
+     * 查询项目成员组长人数
+     * @param projectId
+     * @return
+     */
+    int getMajorPlanPersonCountByProject(Long projectId);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementFileService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementFileService.java
new file mode 100644
index 0000000..b86c0b4
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementFileService.java
@@ -0,0 +1,34 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssAccessoryFile;
+import com.gkhy.assess.system.domain.AssProjectSupplementFile;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目补录附件表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:15
+ */
+public interface AssProjectSupplementFileService extends IService<AssProjectSupplementFile> {
+
+    /**
+     * 根据项目id获取文件
+     * @param projectId
+     * @return
+     */
+    List<AssProjectSupplementFile> getSupplementFileByProjectId(Long projectId);
+
+
+    /**
+     * 根据项目id批量删除文件
+     * @param projectId
+     * @return
+     */
+    int deleteByProjectId(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementService.java
new file mode 100644
index 0000000..b30c892
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectSupplementService.java
@@ -0,0 +1,58 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.system.domain.AssProjectSupplement;
+
+/**
+ * <p>
+ * 项目补录表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:14
+ */
+public interface AssProjectSupplementService extends IService<AssProjectSupplement> {
+    /**
+     * 新增项目补录
+     * @param projectSupplement
+     * @return
+     */
+    int addProjectSupplement(AssProjectSupplement projectSupplement);
+
+    /**
+     * 编辑项目补录
+     * @param projectSupplement
+     * @return
+     */
+    int editProjectSupplement(AssProjectSupplement projectSupplement);
+
+    /**
+     * 根据id获取项目补录信息
+     * @param projectSupplementId
+     * @return
+     */
+    AssProjectSupplement getProjectSupplementById(Long projectSupplementId);
+
+    /**
+     * 分页获取项目补录
+     * @param projectSupplement
+     * @return
+     */
+    CommonPage projectSupplementList(AssProjectSupplement projectSupplement);
+
+    /**
+     * 删除项目补录
+     * @param projectSupplementId
+     * @return
+     */
+    int deleteProjectSupplement(Long projectSupplementId);
+
+    /**
+     * 校验名称是否唯一
+     * @param projectSupplement
+     * @return
+     */
+    Boolean checkNameUnique(AssProjectSupplement projectSupplement);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysCommonService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysCommonService.java
index 8a03413..8c8116f 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysCommonService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysCommonService.java
@@ -3,6 +3,8 @@
 import com.gkhy.assess.system.domain.vo.UploadObjectVO;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+
 public interface SysCommonService {
 
     /**
@@ -22,4 +24,8 @@
     UploadObjectVO doUpload(String imageBase64);
 
     public boolean removeFile(String path);
+
+
+
+    public void importExcel() throws IOException;
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java
index 240fbb0..bcedb40 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java
@@ -41,7 +41,7 @@
         Long projectId=audit.getProjectId();
         projectService.checkUserAllowed(projectId);
         checkAuditCount(projectId,audit.getAuditType());
-        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(audit.getAssessorId()).setProjectId(projectId));
+       // planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(audit.getAssessorId()).setProjectId(projectId));
         //校验项目状态
         projectService.checkReportProgress(projectId, audit.getAuditType()==1?ReportProgressEnum.INVESTINGATION:ReportProgressEnum.INNER_AUDIT);
         audit.setCreateBy(ShiroUtils.getSysUser().getUsername());
@@ -76,9 +76,9 @@
         int row=baseMapper.updateById(audit);
         if(row>0){
             if(audit.getAssessorId()!=null&& !audit.getAssessorId().equals(oldAudit.getAssessorId())){
-                planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(audit.getAssessorId()).setProjectId(oldAudit.getProjectId()));
+               // planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(audit.getAssessorId()).setProjectId(oldAudit.getProjectId()));
                 //todo 删除旧的项目成员
-                planPersonService.deletePlanPersonByPersonId(oldAudit.getAssessorId());
+                planPersonService.deletePlanPersonByPersonId(oldAudit.getAssessorId(),audit.getProjectId(),audit.getAuditType()==1?PlayRoleEnum.INNER_LEADER.getCode():PlayRoleEnum.TEACH_LEADER.getCode());
                 //todo 新增新的项目成员
                 planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(audit.getAssessorId())
                         .setPlayRole(audit.getAuditType()==1?PlayRoleEnum.INNER_LEADER.getCode():PlayRoleEnum.TEACH_LEADER.getCode())
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java
index 0cff0a8..b2ed2a0 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java
@@ -41,6 +41,7 @@
         //校验项目状态
         projectService.checkReportProgress(projectId, ReportProgressEnum.REVIEW_RECORD);
         conclusion.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        conclusion.setIsReviseManual(true);
         int row=baseMapper.insert(conclusion);
         if(row>0) {
             //更新项目状态
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java
index ee94840..b192665 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java
@@ -44,9 +44,10 @@
         Long projectId=estimatePlan.getProjectId();
         projectService.checkUserAllowed(projectId);
         checkEstimatePlanCount(projectId);
-        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimatePlan.getAuserId()).setProjectId(projectId));
         //校验项目状态
         projectService.checkReportProgress(projectId, ReportProgressEnum.ESTIMATE_TASK);
+        //校验是否设置了组长
+        checkMajorPlanPersonCount(projectId);
         estimatePlan.setCreateBy(ShiroUtils.getSysUser().getUsername());
         int row=baseMapper.insert(estimatePlan);
         if(row>0) {
@@ -70,10 +71,22 @@
         }
     }
 
+    /**
+     * 校验项目组成员是否设置了组长
+     * @param projectId
+     */
+    public void checkMajorPlanPersonCount(Long projectId){
+        int count=planPersonService.getMajorPlanPersonCountByProject(projectId);
+        if(count<1){
+            throw new ApiException("项目组成员中必须有一个人设置为组长");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public int editEstimatePlan(AssEstimatePlan estimatePlan) {
         projectService.checkUserAllowed(estimatePlan.getProjectId());
+        checkMajorPlanPersonCount(estimatePlan.getProjectId());
         AssEstimatePlan oldPlan=getById(estimatePlan.getId());
         estimatePlan.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         int row=baseMapper.updateById(estimatePlan);
@@ -83,9 +96,9 @@
         }
         if(row>0) {
             if (estimatePlan.getAuserId() != null && !estimatePlan.getAuserId().equals(oldPlan.getAuserId())) {
-                planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimatePlan.getAuserId()).setProjectId(oldPlan.getProjectId()));
+              //  planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimatePlan.getAuserId()).setProjectId(oldPlan.getProjectId()));
                 //todo 删除旧的项目成员
-                planPersonService.deletePlanPersonByPersonId(oldPlan.getAuserId());
+                planPersonService.deletePlanPersonByPersonId(oldPlan.getAuserId(),estimatePlan.getProjectId(),PlayRoleEnum.ANGENCY_LEADER.getCode());
                 //todo 新增新的项目成员
                 planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(estimatePlan.getAuserId())
                         .setPlayRole(PlayRoleEnum.ANGENCY_LEADER.getCode())
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java
index 261bfd2..9b4c1e2 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java
@@ -36,7 +36,7 @@
         Long projectId=estimateTask.getProjectId();
         projectService.checkUserAllowed(projectId);
         checkTaskCount(projectId);
-        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimateTask.getLeaderId()).setProjectId(projectId));
+      //  planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimateTask.getLeaderId()).setProjectId(projectId));
         //校验项目状态
         projectService.checkReportProgress(projectId, ReportProgressEnum.CONTRACT);
         estimateTask.setCreateBy(ShiroUtils.getSysUser().getUsername());
@@ -69,9 +69,9 @@
         estimateTask.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         int row=baseMapper.updateById(estimateTask);
         if(row>0 &&estimateTask.getLeaderId()!=null&& !estimateTask.getLeaderId().equals(oldTask.getLeaderId())){
-            planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimateTask.getLeaderId()).setProjectId(oldTask.getProjectId()));
+           // planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimateTask.getLeaderId()).setProjectId(oldTask.getProjectId()));
             //todo 删除旧的项目成员
-            planPersonService.deletePlanPersonByPersonId(oldTask.getLeaderId());
+            planPersonService.deletePlanPersonByPersonId(oldTask.getLeaderId(),estimateTask.getProjectId(),PlayRoleEnum.PROJECT_LEADER.getCode());
             //todo 新增新的项目成员
             planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(estimateTask.getLeaderId())
                     .setPlayRole(PlayRoleEnum.PROJECT_LEADER.getCode())
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java
index df6722f..917922f 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java
@@ -19,6 +19,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -69,6 +70,8 @@
     public Boolean checkAllFaceRecongnition(Long projectId){
         projectService.checkUserAllowed(projectId);
         List<AssPlanPerson> planPersonList=planPersonMapper.getAllPlanPersonByProjectId(projectId);
+        Map<Long,AssPlanPerson> planPersonMap=planPersonList.stream().collect(Collectors.toMap(AssPlanPerson::getPersonId,a -> a,(k1,k2) -> k1));
+        planPersonList=planPersonMap.values().stream().collect(Collectors.toList());
         List<AssFaceRecognition> faceRecognitionList=baseMapper.getSimpleFaceRecognitionByProjectId(projectId);
         Map<Long,AssFaceRecognition> map=faceRecognitionList.stream().collect(Collectors.toMap(AssFaceRecognition::getPersonId,a -> a,(k1,k2) -> k1));
         String message="";
@@ -104,7 +107,21 @@
     public List<AssFaceRecognition> getFaceRecognitionByProjectId(Long projectId) {
         projectService.checkUserAllowed(projectId);
         List<AssFaceRecognition> faceRecognitionList= baseMapper.getFaceRecognitionByProjectId(projectId);
-        return faceRecognitionList;
+        //同一个人员担任多种角色
+        Map<Long,List<Integer>> playRoleMap=faceRecognitionList.stream().collect(Collectors.toMap(AssFaceRecognition::getPersonId,p -> {
+            List<Integer> pRoles=new ArrayList<>();
+            pRoles.add(p.getPlanPerson().getPlayRole());
+            return pRoles;
+        },(List<Integer>value1,List<Integer> value2) -> {
+                value1.addAll(value2);
+                return value1;
+        }));
+        Map<Long,AssFaceRecognition> faceMap=faceRecognitionList.stream().collect(Collectors.toMap(AssFaceRecognition::getPersonId,a -> a,(k1,k2) -> k2));
+        List<AssFaceRecognition> faceRecognitions=faceMap.values().stream().collect(Collectors.toList());
+        for(AssFaceRecognition faceRecognition:faceRecognitions){
+            faceRecognition.getPlanPerson().setPlayRoles(playRoleMap.get(faceRecognition.getPersonId()));
+        }
+        return faceRecognitions;
     }
 
 
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java
index 1e4e9b3..8dbff18 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java
@@ -40,11 +40,11 @@
         faceRecord.setFacePath(uploadObjectVO.getPath());
         AssFaceRecord existRecord=checkFaceUnique(faceRecord.getPersonId(),faceRecord.getProjectId());
         if(existRecord!=null){
-            throw new ApiException("已存在人脸识别记录");
-//            existRecord.setFacePath(uploadObjectVO.getPath());
-//            existRecord.setLocation(faceRecord.getLocation());
-//            existRecord.setScene(faceRecord.getScene());
-//            row =baseMapper.updateById(existRecord);
+       //     throw new ApiException("已存在人脸识别记录");
+            existRecord.setFacePath(uploadObjectVO.getPath());
+            existRecord.setLocation(faceRecord.getLocation());
+            existRecord.setScene(faceRecord.getScene());
+            row =baseMapper.updateById(existRecord);
         }else{
             faceRecord.setCreateBy(ShiroUtils.getSysUser().getUsername());
             row=baseMapper.insert(faceRecord);
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java
index 24f5e55..bb5661c 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java
@@ -1,9 +1,14 @@
 package com.gkhy.assess.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
 import com.gkhy.assess.common.enums.RequestSourceEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.system.domain.AssAccessoryFile;
 import com.gkhy.assess.system.domain.AssInvestigation;
+import com.gkhy.assess.system.domain.AssPlanPerson;
 import com.gkhy.assess.system.enums.AccessoryFileTypeEnum;
 import com.gkhy.assess.system.enums.ReportProgressEnum;
 import com.gkhy.assess.system.mapper.AssInvestigationMapper;
@@ -43,6 +48,11 @@
     public Long addInvestigation(AssInvestigation investigation) {
         Long projectId=investigation.getProjectId();
         projectService.checkUserAllowed(projectId);
+        String location=investigation.getLocation();
+        String[] locationArray = location.split(",");
+        if(locationArray.length!=2){
+            throw new ApiException("现场勘验位置格式不正确");
+        }
      //   checkInvestigationCount(projectId);
         investigation.setCreateBy(ShiroUtils.getSysUser().getUsername());
         if(investigation.getIsSafetyCheck()!=null&&investigation.getIsSafetyCheck()==1){
@@ -68,6 +78,7 @@
             }
             fileIds.add(accessoryFile.getId());
         }
+
         baseMapper.insert(investigation);
         //更新图片过程id
         accessoryFileService.batchUpdateAccessoryFileProcessId(fileIds,investigation.getId());
@@ -89,6 +100,11 @@
             throw new ApiException("现场勘验记录id不能为空!");
         }
         projectService.checkUserAllowed(investigation.getProjectId());
+        String location=investigation.getLocation();
+        String[] locationArray = location.split(",");
+        if(locationArray.length!=2){
+            throw new ApiException("现场勘验位置格式不正确");
+        }
         investigation.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         List<AssAccessoryFile> accessFiles=new ArrayList<>();
         accessFiles.addAll(investigation.getCompanyImages());
@@ -138,6 +154,14 @@
         Long projectId= Long.parseLong(map.get("projectId").toString());
         projectService.checkUserAllowed(projectId);
 
+        LambdaQueryWrapper< AssInvestigation > lambdaQueryWrapper = Wrappers.<AssInvestigation>lambdaQuery()
+                .eq(AssInvestigation::getProjectId, projectId)
+                .eq(AssInvestigation::getDelFlag, DeleteFlagEnum.UN_DELETE);
+
+        Long count= count(lambdaQueryWrapper);
+        if(count<1){
+            throw new ApiException("现场勘验记录不能为空");
+        }
         //校验项目状态
         projectService.checkReportProgress(projectId, ReportProgressEnum.WORK_NOTIFICATION);
         //更新项目状态
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java
index 3d3f27b..5b9beeb 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java
@@ -1,5 +1,6 @@
 package com.gkhy.assess.system.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.gkhy.assess.common.enums.DeleteFlagEnum;
@@ -17,7 +18,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -48,13 +52,16 @@
         return baseMapper.insert(planPerson);
     }
 
-
     @Override
     public void checkPersonUnique(AssPlanPerson planPerson) {
+        if(planPerson.getPlayRole()==null){
+            planPerson.setPlayRole(PlayRoleEnum.PROJECT_MEMBER.getCode());
+        }
         LambdaQueryWrapper<AssPlanPerson> lambdaQueryWrapper = Wrappers.<AssPlanPerson>lambdaQuery()
                 .eq(AssPlanPerson::getPersonId, planPerson.getPersonId())
                 .eq(AssPlanPerson::getDelFlag, DeleteFlagEnum.UN_DELETE)
-                .eq(AssPlanPerson::getProjectId, planPerson.getProjectId());
+                .eq(AssPlanPerson::getProjectId, planPerson.getProjectId())
+                .eq(AssPlanPerson::getPlayRole,planPerson.getPlayRole());
         if(planPerson.getId()!=null){
             lambdaQueryWrapper.ne(AssPlanPerson::getId,planPerson.getId());
         }
@@ -84,6 +91,11 @@
     }
 
     @Override
+    public int getMajorPlanPersonCountByProject(Long projectId) {
+        return baseMapper.getMajorPlanPersonCountByProject(projectId);
+    }
+
+    @Override
     public int editPlanPerson(AssPlanPerson planPerson) {
         projectService.checkUserAllowed(planPerson.getProjectId());
         if(planPerson.getPersonId()!=null){
@@ -104,10 +116,12 @@
     }
 
     @Override
-    public int deletePlanPersonByPersonId(Long personId) {
+    public int deletePlanPersonByPersonId(Long personId,Long projectId,Integer playCode) {
         return baseMapper.update(null,Wrappers.<AssPlanPerson>lambdaUpdate()
                 .set(AssPlanPerson::getDelFlag,DeleteFlagEnum.DELETED.getCode())
                 .set(AssPlanPerson::getUpdateBy,ShiroUtils.getSysUser().getUsername())
-                .eq(AssPlanPerson::getPersonId,personId));
+                .eq(AssPlanPerson::getPersonId,personId)
+                .eq(AssPlanPerson::getProjectId,projectId)
+                .eq(AssPlanPerson::getPlayRole,playCode));
     }
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java
index ec01bbf..ee6bf7b 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java
@@ -41,7 +41,7 @@
         Long projectId=processAudit.getProjectId();
         projectService.checkUserAllowed(projectId);
         checkProcessAuditCount(projectId);
-        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId()).setProjectId(projectId));
+      //  planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId()).setProjectId(projectId));
         //校验项目状态
         projectService.checkReportProgress(projectId, ReportProgressEnum.CONCLUSION);
         processAudit.setCreateBy(ShiroUtils.getSysUser().getUsername());
@@ -74,9 +74,9 @@
         processAudit.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         int row=baseMapper.updateById(processAudit);
         if(row>0 && processAudit.getProcessLeaderId()!=null&& !processAudit.getProcessLeaderId().equals(oldProcess.getProcessLeaderId())){
-            planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId()).setProjectId(oldProcess.getProjectId()));
+          //  planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId()).setProjectId(oldProcess.getProjectId()));
             //todo 删除旧的项目成员
-            planPersonService.deletePlanPersonByPersonId(oldProcess.getProcessLeaderId());
+            planPersonService.deletePlanPersonByPersonId(oldProcess.getProcessLeaderId(),processAudit.getProjectId(),PlayRoleEnum.PROCESS_LEADER.getCode());
             //todo 新增新的项目成员
             planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId())
                     .setPlayRole(PlayRoleEnum.PROCESS_LEADER.getCode())
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java
index deb847c..2346449 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java
@@ -86,10 +86,11 @@
         if(user.getAgencyId()==null){
             throw new ApiException("用户机构id为空");
         }
+        project.setAgencyId(user.getAgencyId());
         if(!checkNameUnique(project)){
             throw new ApiException("项目名已存在");
         }
-        project.setAgencyId(user.getAgencyId());
+
         project.setReportProgress(ReportProgressEnum.ADD.getCode());
         project.setCreateBy(ShiroUtils.getSysUser().getUsername());
         int row=baseMapper.insert(project);
@@ -101,7 +102,14 @@
         //todo  权限校验
         SysUser user= ShiroUtils.getSysUser();
         checkUserAllowed(projectId);
-        AssProject project=new AssProject()
+        //判断项目流转状态
+        AssProject project=getById(projectId);
+        if(project.getReportProgress().equals(ReportProgressEnum.CONFIRM_FINAL.getCode())){
+            if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+                throw new ApiException("没有权限删除确认完结的项目,请联系监管用户删除");
+            }
+        }
+        project=new AssProject()
                 .setId(projectId)
                 .setDelFlag(DeleteFlagEnum.DELETED.getCode());
         project.setUpdateBy(user.getUsername());
@@ -115,9 +123,9 @@
             throw new ApiException("项目id不能为空");
         }
         checkUserAllowed(projectId);
-        if(!checkNameUnique(project)){
-            throw new ApiException("项目名已存在");
-        }
+//        if(!checkNameUnique(project)){
+//            throw new ApiException("项目名已存在");
+//        }
         project.setAgencyId(null);//机构id不能修改
         project.setReportProgress(null);//项目状态不能修改
         project.setUpdateBy(ShiroUtils.getSysUser().getUsername());
@@ -140,7 +148,7 @@
     @Override
     public boolean checkNameUnique(AssProject project) {
         Long projectId = project.getId()==null? -1L : project.getId();
-        AssProject pro = baseMapper.getProjectByName(project.getName());
+        AssProject pro = baseMapper.getProjectByName(project.getName(),project.getAgencyId());
         if (pro!=null && pro.getId().longValue() != projectId.longValue())
         {
             return false;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementFileServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementFileServiceImpl.java
new file mode 100644
index 0000000..43b532b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementFileServiceImpl.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssAccessoryFile;
+import com.gkhy.assess.system.domain.AssProjectSupplementFile;
+import com.gkhy.assess.system.domain.vo.UploadObjectVO;
+import com.gkhy.assess.system.mapper.AssProjectSupplementFileMapper;
+import com.gkhy.assess.system.service.AssProjectSupplementFileService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目补录附件表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:15
+ */
+@Service
+public class AssProjectSupplementFileServiceImpl extends ServiceImpl<AssProjectSupplementFileMapper, AssProjectSupplementFile> implements AssProjectSupplementFileService {
+
+
+
+    @Override
+    public List<AssProjectSupplementFile> getSupplementFileByProjectId(Long projectId) {
+        return baseMapper.getFilesByProjectId(projectId);
+    }
+
+
+    @Override
+    public int deleteByProjectId(Long projectId) {
+        return baseMapper.deleteByProjectId(projectId);
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementServiceImpl.java
new file mode 100644
index 0000000..0ef40d3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectSupplementServiceImpl.java
@@ -0,0 +1,139 @@
+package com.gkhy.assess.system.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.enums.UserIdentityEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.PageUtil;
+import com.gkhy.assess.system.domain.AssProjectSupplement;
+import com.gkhy.assess.system.domain.AssProjectSupplementFile;
+import com.gkhy.assess.system.domain.SysAttach;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.mapper.AssProjectSupplementFileMapper;
+import com.gkhy.assess.system.mapper.AssProjectSupplementMapper;
+import com.gkhy.assess.system.service.AssProjectSupplementFileService;
+import com.gkhy.assess.system.service.AssProjectSupplementService;
+import com.gkhy.assess.system.service.SysCommonService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 项目补录表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-06-11 15:44:14
+ */
+@Service
+public class AssProjectSupplementServiceImpl extends ServiceImpl<AssProjectSupplementMapper, AssProjectSupplement> implements AssProjectSupplementService {
+    @Autowired
+    private AssProjectSupplementFileService projectSupplementFileService;
+    @Autowired
+    private SysCommonService commonService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addProjectSupplement(AssProjectSupplement projectSupplement) {
+        if(!checkNameUnique(projectSupplement)){
+            throw new ApiException("补录的项目名称已存在");
+        }
+        projectSupplement.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.insert(projectSupplement);
+        if(row<1){
+            throw new ApiException("新增项目失败");
+        }
+        List<AssProjectSupplementFile> fileList=projectSupplement.getFiles();
+        if(ObjectUtil.isNotEmpty(fileList)) {
+            for (AssProjectSupplementFile file : fileList) {
+                file.setProjectId(projectSupplement.getId());
+            }
+            projectSupplementFileService.saveBatch(fileList);
+        }
+        return row;
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editProjectSupplement(AssProjectSupplement projectSupplement) {
+        if(!checkNameUnique(projectSupplement)){
+            throw new ApiException("补录的项目名称已存在");
+        }
+        projectSupplement.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.updateById(projectSupplement);
+        if(row<1){
+            throw new ApiException("编辑项目失败");
+        }
+        List<AssProjectSupplementFile> fileList=projectSupplement.getFiles();
+        List<AssProjectSupplementFile> existFileList=projectSupplementFileService.getSupplementFileByProjectId(projectSupplement.getId());
+        if(ObjectUtil.isNotEmpty(fileList)) {
+            for (AssProjectSupplementFile psf : fileList) {
+                psf.setProjectId(projectSupplement.getId());
+            }
+            projectSupplementFileService.saveOrUpdateBatch(fileList);
+        }
+        //删除附件
+        List<Long> newIds=fileList.stream().map(AssProjectSupplementFile::getId).collect(Collectors.toList());
+        List<Long> delIds = new ArrayList<>();
+        for(AssProjectSupplementFile psf:existFileList){
+            if(!newIds.contains(psf.getId())){
+                delIds.add(psf.getId());
+            }
+        }
+        if(!delIds.isEmpty()){
+            projectSupplementFileService.removeBatchByIds(delIds);
+        }
+        return row;
+    }
+
+    @Override
+    public AssProjectSupplement getProjectSupplementById(Long projectSupplementId) {
+        return baseMapper.getProjectSupplementById(projectSupplementId);
+    }
+
+    @Override
+    public CommonPage projectSupplementList(AssProjectSupplement projectSupplement) {
+        SysUser user= ShiroUtils.getSysUser();
+        if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            //机构用户只能查看本机构的项目
+            if(user.getAgencyId()==null){
+                throw new ApiException("用户机构id为空");
+            }
+            projectSupplement.setAgencyId(user.getAgencyId());
+        }
+        PageUtil.startPage();
+        List<AssProjectSupplement> projects=baseMapper.projectList(projectSupplement);
+        return CommonPage.restPage(projects);
+    }
+
+    @Override
+    public int deleteProjectSupplement(Long projectSupplementId) {
+        //删除附件
+        List<AssProjectSupplementFile> fileList=projectSupplementFileService.getSupplementFileByProjectId(projectSupplementId);
+        if(fileList.size()>0){
+            for(AssProjectSupplementFile file:fileList){
+                commonService.removeFile(file.getPath());
+                projectSupplementFileService.removeById(file.getId());
+            }
+        }
+        return baseMapper.deleteById(projectSupplementId);
+    }
+
+    @Override
+    public Boolean checkNameUnique(AssProjectSupplement projectSupplement) {
+        Long projectId = projectSupplement.getId()==null? -1L : projectSupplement.getId();
+        AssProjectSupplement pro = baseMapper.getProjectByName(projectSupplement.getName(),projectSupplement.getAgencyId());
+        if (pro!=null && pro.getId().longValue() != projectId.longValue())
+        {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java
index c957622..da2a60a 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java
@@ -1,10 +1,15 @@
 package com.gkhy.assess.system.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
 import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.excel.ExpertExcelListener;
+import com.gkhy.assess.system.domain.vo.SysExpertInfoExcelVO;
 import com.gkhy.assess.system.domain.vo.UploadObjectVO;
 import com.gkhy.assess.system.service.SysCommonService;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 import sun.misc.BASE64Decoder;
@@ -44,6 +49,16 @@
     }
 
     @Override
+    public void importExcel() throws IOException {
+        ClassPathResource classPathResource = new ClassPathResource("abc.xlsx");
+        InputStream inputStream = classPathResource.getInputStream();
+        if(inputStream==null){
+            throw new ApiException("获取文件失败");
+        }
+        EasyExcel.read(inputStream, SysExpertInfoExcelVO.class,new ExpertExcelListener()).sheet(0).doRead();
+    }
+
+    @Override
     public UploadObjectVO doUpload(MultipartFile file){
         String originName=file.getOriginalFilename();
         String filename=originName;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
index c0cef63..f77f75f 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
@@ -148,23 +148,42 @@
      * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
      * @param username
      */
-    public void cacheUserToken(String username,Integer identity,String newToken){
-        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
-        String oldToken = (String) redisUtils.get(userKey);
-        if (StringUtils.isNotBlank(oldToken)) {
-            String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
-            redisUtils.del(oldTokenkey);
-            redisUtils.del(userKey);
-        }
-        redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
+//    public void cacheUserToken(String username,Integer identity,String newToken){
+//        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
+//        String oldToken = (String) redisUtils.get(userKey);
+//        if (StringUtils.isNotBlank(oldToken)) {
+//            String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
+//            redisUtils.del(oldTokenkey);
+//            redisUtils.del(userKey);
+//        }
+//        redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
+//
+//
+//        String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(newToken));
+//        // 设置超时时间
+//        redisUtils.set(tokenKey,newToken);
+//        redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
+//    }
 
+
+    /**
+     * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
+     * @param username
+     */
+    public void cacheUserToken(String username,Integer identity,String newToken){
+     //   String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
+//        String oldToken = (String) redisUtils.get(userKey);
+//        if (StringUtils.isNotBlank(oldToken)) {
+//            String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
+//            redisUtils.del(oldTokenkey);
+//            redisUtils.del(userKey);
+//        }
+      //  redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
 
         String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(newToken));
         // 设置超时时间
-        redisUtils.set(tokenKey,newToken);
-        redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
+        redisUtils.set(tokenKey,newToken,JwtTokenUtil.EXPIRATION*2/1000);
     }
-
 
     /**
      * 校验验证码
@@ -198,11 +217,11 @@
         if(StringUtils.isNotBlank(jwtToken)){
             String username=JwtTokenUtil.getUsername(jwtToken);
             Integer identity=JwtTokenUtil.getIdentity(jwtToken);
-            String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
+           // String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
             String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
             //删除redis缓存
             redisUtils.del(tokenKey);
-            redisUtils.del(userKey);
+           // redisUtils.del(userKey);
         }
     }
 
@@ -355,6 +374,17 @@
         if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.EXPERT.getCode()))){
             throw new ApiException("手机号已存在");
         }
+        List<SysAttach> socialAttach=user.getSocialAttach();
+        List<SysAttach> medicalAttach=user.getMedicalAttach();
+        List<SysAttach> salaryAttach=user.getSalaryAttach();
+        //疆外企业必须上传社保、医保、薪资
+        SysAgency agency=agencyService.getAgencyById(user.getAgencyId());
+        if(agency.getAttribute()==0){
+            if(ObjectUtil.isEmpty(socialAttach)||ObjectUtil.isEmpty(medicalAttach)||ObjectUtil.isEmpty(salaryAttach)){
+                throw new ApiException("疆内企业必须上传社保、医保、工资照片");
+            }
+        }
+
         String major=user.getMajor();
         List<Integer> majors=new ArrayList<>();
         JSONObject jsonObject=JSONObject.parseObject(major);
@@ -372,26 +402,32 @@
         if(!b){
             throw new ApiException("创建专家信息失败");
         }
-        List<SysAttach> socialAttach=user.getSocialAttach();
-        List<SysAttach> medicalAttach=user.getMedicalAttach();
-        List<SysAttach> salaryAttach=user.getSalaryAttach();
+
         List<SysAttach> attaches=new ArrayList<>();
-        for(SysAttach attach:socialAttach){
-            attach.setType(AttachTypeEnum.SOCIAL.getCode());
-            attach.setUserId(user.getId());
-            attaches.add(attach);
+        if(socialAttach!=null&& !socialAttach.isEmpty()) {
+            for (SysAttach attach : socialAttach) {
+                attach.setType(AttachTypeEnum.SOCIAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
         }
-        for(SysAttach attach:medicalAttach){
-            attach.setType(AttachTypeEnum.MEDICAL.getCode());
-            attach.setUserId(user.getId());
-            attaches.add(attach);
+        if(medicalAttach!=null&& !medicalAttach.isEmpty()) {
+            for (SysAttach attach : medicalAttach) {
+                attach.setType(AttachTypeEnum.MEDICAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
         }
-        for(SysAttach attach:salaryAttach){
-            attach.setType(AttachTypeEnum.SALARY.getCode());
-            attach.setUserId(user.getId());
-            attaches.add(attach);
+        if(salaryAttach!=null&& !salaryAttach.isEmpty()) {
+            for (SysAttach attach : salaryAttach) {
+                attach.setType(AttachTypeEnum.SALARY.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
         }
-        attachService.saveBatch(attaches);
+        if(!attaches.isEmpty()) {
+            attachService.saveBatch(attaches);
+        }
         return 1;
     }
 
@@ -435,6 +471,7 @@
             }
         }
         delCacheByUsername(user.getUsername(),user.getIdentity());
+        delCacheByUsername(user.getPhone(),user.getIdentity());
         user=new SysUser().setId(userId);
         user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         user.setDelFlag(DeleteFlagEnum.DELETED.getCode());
@@ -451,6 +488,7 @@
             throw new ApiException("手机号已存在");
         }
         delCacheByUsername(user.getUsername(),UserIdentityEnum.MONITOR.getCode());
+        delCacheByUsername(user.getPhone(),UserIdentityEnum.MONITOR.getCode());
         user.setPassword(null);
         user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(user);
@@ -480,12 +518,19 @@
         if(!agencyService.checkAgencyNameUnique(agency)){
             throw new ApiException("机构名称已存在");
         }
+        SysUser currentUser=ShiroUtils.getSysUser();
+        if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            if(!user.getId().equals(currentUser.getId())){
+                throw new ApiException("只能修改自身数据");
+            }
+        }
 
         delCacheByUsername(user.getUsername(),UserIdentityEnum.AGENCY.getCode());
-        agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        delCacheByUsername(user.getPhone(),UserIdentityEnum.AGENCY.getCode());
+        agency.setUpdateBy(currentUser.getUsername());
         agencyService.updateById(agency);
         user.setPassword(null);
-        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        user.setUpdateBy(currentUser.getUsername());
         boolean b=updateById(user);
         if(!b){
             throw new ApiException("更新用户失败");
@@ -503,6 +548,17 @@
         if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.EXPERT.getCode()))){
             throw new ApiException("手机号已存在");
         }
+        List<SysAttach> socialAttach=user.getSocialAttach();
+        List<SysAttach> medicalAttach=user.getMedicalAttach();
+        List<SysAttach> salaryAttach=user.getSalaryAttach();
+        //疆外企业必须上传社保、医保、薪资
+        SysAgency agency=agencyService.getAgencyById(user.getAgencyId());
+        if(agency.getAttribute()==0){
+            if(ObjectUtil.isEmpty(socialAttach)||ObjectUtil.isEmpty(medicalAttach)||ObjectUtil.isEmpty(salaryAttach)){
+                throw new ApiException("疆内企业必须上传社保、医保、工资照片");
+            }
+        }
+
         String major=user.getMajor();
         if(StringUtils.isNotBlank(major)){
             List<Integer> majors=new ArrayList<>();
@@ -521,38 +577,45 @@
         // 刪除旧数据
         // attachService.deleteAttachsByUserId(user.getId(),null);
 
-        List<SysAttach> socialAttach=user.getSocialAttach();
-        List<SysAttach> medicalAttach=user.getMedicalAttach();
-        List<SysAttach> salaryAttach=user.getSalaryAttach();
         List<SysAttach> attaches=new ArrayList<>();
-        for(SysAttach attach:socialAttach){
-            attach.setType(AttachTypeEnum.SOCIAL.getCode());
-            attach.setUserId(user.getId());
-            attaches.add(attach);
+        if(socialAttach!=null&& !socialAttach.isEmpty()) {
+            for (SysAttach attach : socialAttach) {
+                attach.setType(AttachTypeEnum.SOCIAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
         }
-        for(SysAttach attach:medicalAttach){
-            attach.setType(AttachTypeEnum.MEDICAL.getCode());
-            attach.setUserId(user.getId());
-            attaches.add(attach);
+        if(medicalAttach!=null&& !medicalAttach.isEmpty()) {
+            for (SysAttach attach : medicalAttach) {
+                attach.setType(AttachTypeEnum.MEDICAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
         }
-        for(SysAttach attach:salaryAttach){
-            attach.setType(AttachTypeEnum.SALARY.getCode());
-            attach.setUserId(user.getId());
-            attaches.add(attach);
+        if(salaryAttach!=null&& !salaryAttach.isEmpty()) {
+            for (SysAttach attach : salaryAttach) {
+                attach.setType(AttachTypeEnum.SALARY.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
         }
-        attachService.saveOrUpdateBatch(attaches);
+        if(!attaches.isEmpty()) {
+            attachService.saveOrUpdateBatch(attaches);
+        }
 
-        List<Long> newIds=attaches.stream().map(SysAttach::getId).collect(Collectors.toList());
-        List<Long> delIds=new ArrayList<>();
-        for(SysAttach attach:existAttaches){
-            if(!newIds.contains(attach.getId())){
+        List<Long> newIds = attaches.stream().map(SysAttach::getId).collect(Collectors.toList());
+        List<Long> delIds = new ArrayList<>();
+        for (SysAttach attach : existAttaches) {
+            if (!newIds.contains(attach.getId())) {
                 delIds.add(attach.getId());
             }
         }
-        if(!delIds.isEmpty()){
+        if (!delIds.isEmpty()) {
             attachService.deleteAttachsByIds(delIds);
         }
+
         delCacheByUsername(user.getUsername(),UserIdentityEnum.EXPERT.getCode());
+        delCacheByUsername(user.getPhone(),UserIdentityEnum.EXPERT.getCode());
         return row;
     }
 
@@ -565,6 +628,7 @@
         SysUser newUser=new SysUser().setId(user.getId()).setPassword(JwtTokenUtil.encryptPassword(oldUser.getUsername(),originPsword,oldUser.getSalt()));
         newUser.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         delCacheByUsername(oldUser.getUsername(),oldUser.getIdentity());
+        delCacheByUsername(oldUser.getPhone(),oldUser.getIdentity());
         return updateById(newUser);
     }
 
@@ -639,6 +703,7 @@
         SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
         su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         delCacheByUsername(existUser.getUsername(),existUser.getIdentity());
+        delCacheByUsername(existUser.getPhone(),existUser.getIdentity());
         return updateById(su);
     }
 
@@ -648,6 +713,7 @@
         SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
         su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         delCacheByUsername(existUser.getUsername(),existUser.getIdentity());
+        delCacheByUsername(existUser.getPhone(),existUser.getIdentity());
         return updateById(su);
     }
 }
diff --git a/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml b/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml
index 1fd23dd..a2caef0 100644
--- a/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml
+++ b/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml
@@ -81,4 +81,8 @@
         group by a.project_id
     </select>
 
+    <select id="getMajorPlanPersonCountByProject" resultType="java.lang.Integer">
+        select count(1) from ass_plan_person where del_flag=0 and job_type=2 and project_id=#{projectId}
+    </select>
+
 </mapper>
diff --git a/assess-system/src/main/resources/mapper/AssProjectMapper.xml b/assess-system/src/main/resources/mapper/AssProjectMapper.xml
index 6171261..4dc1a92 100644
--- a/assess-system/src/main/resources/mapper/AssProjectMapper.xml
+++ b/assess-system/src/main/resources/mapper/AssProjectMapper.xml
@@ -71,7 +71,7 @@
     <select id="projectList"  resultMap="projectResult">
         <include refid="selectProjectVo"/>
         <if test="params.personId != null and params.personId != ''">
-            left join ass_plan_person a on a.project_id=p.id
+            left join ass_plan_person pp on pp.project_id=p.id
         </if>
         <if test="params.lostMaterial != null">
             left join ass_project_material m on m.project_id=p.id
@@ -112,7 +112,7 @@
                 and date_format(p.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
             </if>
             <if test="params.personId != null and params.personId != ''">
-                and a.person_id=#{params.personId} and a.del_flag=0
+                and pp.person_id=#{params.personId} and pp.del_flag=0
             </if>
             <if test="params.lostMaterial != null and params.lostMaterial==1">
                 and (m.file_id is null)
@@ -131,7 +131,7 @@
 
     <select id="getProjectByName" resultType="com.gkhy.assess.system.domain.AssProject">
         select id,name from ass_project
-        where name=#{name}
+        where name=#{name} and agency_id=#{agencyId} and del_flag=0 limit 1
     </select>
 
     <select id="getReportProgress" resultType="java.lang.Integer">
@@ -140,7 +140,7 @@
     </select>
 
     <select id="getMemberProjectByUserId" resultMap="projectResult">
-        select p.id,p.name,p.report_progress,p.code,p.client,p.province,p.city,p.district,p.business,p.create_time,a.id as plan_person_id,
+        select distinct p.id,p.name,p.report_progress,p.code,p.client,p.province,p.city,p.district,p.business,p.create_time,a.id as plan_person_id,
         e.leader_id,u.name as leader_name
         from ass_project p
         left join ass_plan_person a on a.project_id=p.id
@@ -162,7 +162,7 @@
     </select>
 
     <select id="getLeaderProjectByUserId" resultMap="projectResult">
-        select p.id,p.name,p.report_progress,p.code,p.client,p.province,p.city,p.district,p.business,p.create_time,a.id as plan_person_id,
+        select distinct p.id,p.name,p.report_progress,p.code,p.client,p.province,p.city,p.district,p.business,p.create_time,a.id as plan_person_id,
         e.leader_id,u.name as leader_name
         from ass_project p
         left join ass_plan_person a on a.project_id=p.id
@@ -225,13 +225,15 @@
     </select>
 
     <select id="getProjectByPersonIds" resultType="com.gkhy.assess.system.domain.vo.PersonProjectVO">
-        select a.person_id,count(*) as project_count,max(p.create_time) as last_estimate_time from ass_project p
+        select d.person_id,count(*) as project_count,max(d.create_time) as last_estimate_time from
+        (select a.person_id,a.project_id,max(p.create_time) as create_time from ass_project p
         left join ass_plan_person a on a.project_id=p.id
         where  a.del_flag=0 and p.del_flag=0 and a.person_id in
         <foreach collection="personIds" item="personId" open="(" separator="," close=")">
             #{personId}
         </foreach>
-        group by a.person_id
+        group by a.person_id,a.project_id) d
+        group by d.person_id
     </select>
 
 </mapper>
diff --git a/assess-system/src/main/resources/mapper/AssProjectSupplementFileMapper.xml b/assess-system/src/main/resources/mapper/AssProjectSupplementFileMapper.xml
new file mode 100644
index 0000000..529cc7a
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssProjectSupplementFileMapper.xml
@@ -0,0 +1,12 @@
+<?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.gkhy.assess.system.mapper.AssProjectSupplementFileMapper">
+
+    <delete id="deleteByProjectId">
+        delete from ass_project_supplement_file where project_id=#{projectId}
+    </delete>
+
+    <select id="getFilesByProjectId" resultType="com.gkhy.assess.system.domain.AssProjectSupplementFile">
+        select * from ass_project_supplement_file where project_id=#{projectId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssProjectSupplementMapper.xml b/assess-system/src/main/resources/mapper/AssProjectSupplementMapper.xml
new file mode 100644
index 0000000..d2fe450
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssProjectSupplementMapper.xml
@@ -0,0 +1,50 @@
+<?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.gkhy.assess.system.mapper.AssProjectSupplementMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssProjectSupplement" id="projectResult">
+        <id     property="id"        column="id"         />
+        <result property="name"     column="name"      />
+        <result property="writer"     column="writer"      />
+        <result property="reviewer"     column="reviewer"      />
+        <result property="filingDate"     column="filing_date"      />
+        <result property="agencyId"     column="agency_id"      />
+        <result property="delFlag"     column="del_flag"      />
+        <result property="version"     column="version"      />
+        <result property="createBy"     column="create_by"      />
+        <result property="createTime"     column="create_time"      />
+        <result property="updateBy"     column="update_by"      />
+        <result property="updateTime"     column="update_time"      />
+        <result property="remark"     column="remark"      />
+        <result property="agencyName"     column="agency_name"      />
+        <collection property="files" ofType="com.gkhy.assess.system.domain.AssProjectSupplementFile" select="getFileByProjectId" column="{projectId=id}"/>
+    </resultMap>
+
+    <select id="getProjectByName" resultType="com.gkhy.assess.system.domain.AssProjectSupplement">
+        select id,name,agency_id from ass_project_supplement where name=#{name} and agency_id=#{agencyId} limit 1
+    </select>
+
+    <select id="projectList" resultMap="projectResult">
+        select s.*,a.name as agency_name from ass_project_supplement s
+        left join sys_agency a on a.id=s.agency_id
+        <where>
+             <if test="name!=null and name!=''">
+                 and s.name like ('%',#{name},'%')
+             </if>
+            <if test="agencyId!=null">
+                and s.agency_id =#{agencyId}
+            </if>
+        </where>
+        order by s.create_time desc
+    </select>
+
+    <select id="getFileByProjectId" resultType="com.gkhy.assess.system.domain.AssProjectSupplementFile">
+        select * from ass_project_supplement_file where project_id=#{projectId}
+    </select>
+
+    <select id="getProjectSupplementById" resultMap="projectResult">
+        select s.*,a.name as agency_name from ass_project_supplement s
+        left join sys_agency a on a.id=s.agency_id
+        where s.id=#{projectSupplementId}
+    </select>
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml b/assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml
index 36bc8ef..29e81b0 100644
--- a/assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml
@@ -20,7 +20,7 @@
     </update>
 
     <select id="expertInfoList" resultType="com.gkhy.assess.system.domain.SysExpertInfo">
-        select id,name,sex,birthday,phone,title,degree,state,speciality,big_classify,small_classify,create_time from sys_expert_info
+        select id,name,sex,birthday,phone,title,degree,state,speciality,big_classify,small_classify,id_card,company_name,domain,level,current_profession,duty_status,support_direction_safety,create_time from sys_expert_info
         <where>
             and del_flag = 0
             <if test="name != null and name != ''">
diff --git a/assess-system/src/main/resources/mapper/SysUserMapper.xml b/assess-system/src/main/resources/mapper/SysUserMapper.xml
index af9f852..9811df4 100644
--- a/assess-system/src/main/resources/mapper/SysUserMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysUserMapper.xml
@@ -46,13 +46,14 @@
         <id     property="id"       column="agency_id"        />
         <result property="name"     column="agency_name"      />
         <result property="creditCode"      column="credit_code"       />
+        <result property="attribute"      column="attribute"       />
     </resultMap>
 
     <sql id="selectUserVo">
         select u.id,u.username, u.name,u.identity,u.user_type,u.phone,u.sex,u.status,
                u.del_flag,u.manage_region,u.expert_type,u.agency_id,u.post,u.job_title,
                u.major,u.state,u.create_time,u.remark,u.level,u.id_photo,u.certificate_no,
-               a.id as agency_id,a.name as agency_name,a.credit_code
+               a.id as agency_id,a.name as agency_name,a.credit_code,a.attribute
         from sys_user u
         left join sys_agency a on u.agency_id=a.id
     </sql>
@@ -90,9 +91,15 @@
             <if test="status != null">
                 AND u.status = #{status}
             </if>
+            <if test="state != null">
+                AND u.state = #{state}
+            </if>
             <if test="phone != null and phone != ''">
                 AND u.phone like concat('%', #{phone}, '%')
             </if>
+            <if test="agencyName != null and agencyName != ''">
+                AND a.name like concat('%', #{agencyName}, '%')
+            </if>
         </where>
         order by u.create_time desc
     </select>
diff --git a/pom.xml b/pom.xml
index e6f7a16..00cf479 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,7 @@
         <caffeine.version>2.9.3</caffeine.version>
         <kaptcha.version>2.3.2</kaptcha.version>
         <commons.io.version>2.13.0</commons.io.version>
+        <easyexcel.version>4.0.1</easyexcel.version>
     </properties>
     <dependencyManagement>
         <dependencies>
@@ -158,6 +159,12 @@
                 <version>${commons.io.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

--
Gitblit v1.9.2