From 022b17044ab6bb284fd6313da91d1d1dfb2d5079 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期一, 03 六月 2024 13:20:42 +0800
Subject: [PATCH] update

---
 assess-admin/src/main/resources/db/migration/V20240409001_change_user.sql                          |    4 
 assess-admin/src/main/resources/application-dev.yml                                                |    2 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java                       |    4 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java      |    2 
 assess-admin/src/main/resources/application-pro.yml                                                |    6 
 assess-common/src/main/java/com/gkhy/assess/common/domain/vo/LoginBody.java                        |    2 
 assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml                                 |    8 
 assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java     |   13 +
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java            |    7 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java        |   31 ++-
 assess-admin/src/main/resources/db/migration/V20240408002_change_agency.sql                        |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java            |   12 
 assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java                        |    4 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java                 |    3 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java                     |   12 +
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java                           |   10 
 assess-common/src/main/java/com/gkhy/assess/common/domain/JwtToken.java                            |    4 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java      |   12 +
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java              |    4 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java    |    5 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java                         |    2 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java    |    5 
 assess-admin/src/main/resources/db/migration/V20240408001_change_access_file.sql                   |    2 
 assess-admin/src/test/java/com/gkhy/admin/RegionTest.java                                          |   10 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java                             |    2 
 assess-common/src/main/java/com/gkhy/assess/common/enums/AttachTypeEnum.java                       |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java                    |    4 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/filter/JwtFilter.java               |    4 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java                          |    4 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java                    |   15 +
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java            |   83 ++++---
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java              |    4 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java    |   26 +
 pom.xml                                                                                            |    2 
 assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java   |    2 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java           |    2 
 assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java                         |   35 ++
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java        |   22 +-
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java          |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java            |   13 +
 assess-system/src/main/resources/mapper/SysUserMapper.xml                                          |    6 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java                |    9 
 assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml                               |    7 
 assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java             |    2 
 assess-common/src/main/java/com/gkhy/assess/common/utils/RedisUtils.java                           |    2 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java    |    8 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java   |   18 +
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java   |  108 ++++++----
 assess-system/src/main/resources/mapper/AssProjectMapper.xml                                       |    4 
 assess-system/src/main/resources/mapper/AssInvestigationMapper.xml                                 |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java    |    2 
 assess-system/src/main/resources/mapper/SysAgencyMapper.xml                                        |    3 
 assess-common/src/main/java/com/gkhy/assess/common/domain/CustomerUsernamePasswordToken.java       |   25 ++
 54 files changed, 401 insertions(+), 185 deletions(-)

diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java
index 7d836a1..42e8cf7 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java
@@ -44,10 +44,11 @@
     @GetMapping("/getAccessoryFileByProjectId")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "query", name = "processId", dataType = "long", required = true, value = "过程id"),
             @ApiImplicitParam(paramType = "query", name = "moduleType", dataType = "int", required = true, value = "上传模块code")
     })
-    public CommonResult getAccessoryFileByProjectId(Long projectId,Integer moduleType){
-        return CommonResult.success(assAccessoryFileService.getAccessoryFileByProjectId(projectId,moduleType));
+    public CommonResult getAccessoryFileByProjectId(Long projectId,Integer moduleType,@RequestParam(required = false) Long processId){
+        return CommonResult.success(assAccessoryFileService.getAccessoryFileByProjectId(projectId,processId,moduleType));
     }
 
 
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java
index 996883e..5266744 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java
@@ -35,13 +35,19 @@
         return CommonResult.success(investigationService.getInvestigationByProjectId(projectId));
     }
 
+    @ApiOperation(value = "根据id获取现场勘验记录表详情")
+    @GetMapping("/detail/{investigationId}")
+    public CommonResult investigationDetail(@PathVariable(value = "investigationId") Long investigationId){
+        return CommonResult.success(investigationService.getInvestigationById(investigationId));
+    }
+
     @RepeatSubmit
     @ApiOperation(value = "创建现场勘验记录表")
     @PostMapping("/add")
     public CommonResult addInvestigation(@Validated @RequestBody AssInvestigation investigation){
         //app端只能保存数据,不能改变项目流程状态
         investigation.setState(ApproveStatusEnum.TEMPORARY.getCode());
-        return CommonResult.success(investigationService.addInvestigation(investigation, RequestSourceEnum.APP.getCode()));
+        return CommonResult.success(investigationService.addInvestigation(investigation));
     }
 
     @RepeatSubmit
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 be5100b..63580c4 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
@@ -44,10 +44,11 @@
     @GetMapping("/getAccessoryFileByProjectId")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "query", name = "processId", dataType = "long", required = true, value = "过程id"),
             @ApiImplicitParam(paramType = "query", name = "moduleType", dataType = "int", required = true, value = "上传模块code")
     })
-    public CommonResult getAccessoryFileByProjectId(Long projectId,Integer moduleType){
-        return CommonResult.success(assAccessoryFileService.getAccessoryFileByProjectId(projectId,moduleType));
+    public CommonResult getAccessoryFileByProjectId(Long projectId,Integer moduleType,@RequestParam(required = false) Long processId){
+        return CommonResult.success(assAccessoryFileService.getAccessoryFileByProjectId(projectId,processId,moduleType));
     }
 
 
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java
index 8fadb5b..2d644a8 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java
@@ -7,10 +7,14 @@
 import com.gkhy.assess.system.domain.AssInvestigation;
 import com.gkhy.assess.system.service.AssInvestigationService;
 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.*;
+
+import java.util.Map;
 
 /**
  * <p>
@@ -31,7 +35,7 @@
     @ApiOperation(value = "根据id获取现场勘验记录表详情")
     @GetMapping("/detail/{investigationId}")
     public CommonResult investigationDetail(@PathVariable(value = "investigationId") Long investigationId){
-        return CommonResult.success(investigationService.getInvestigationByProjectId(investigationId));
+        return CommonResult.success(investigationService.getInvestigationById(investigationId));
     }
 
     @ApiOperation(value = "根据项目id获取现场勘验记录表详情")
@@ -44,7 +48,18 @@
     @ApiOperation(value = "创建现场勘验记录表")
     @PostMapping("/add")
     public CommonResult addInvestigation(@Validated @RequestBody AssInvestigation investigation){
-        return CommonResult.success(investigationService.addInvestigation(investigation, RequestSourceEnum.WEB.getCode()));
+        return CommonResult.success(investigationService.addInvestigation(investigation));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "现场勘验项目状态流转")
+    @PostMapping("/doProcess")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+    })
+    public CommonResult doProcess(@RequestBody Map map){
+        investigationService.doInvestigationProcess(map);
+        return CommonResult.success();
     }
 
     @RepeatSubmit
@@ -54,13 +69,6 @@
         return CommonResult.success(investigationService.editInvestigation(investigation));
     }
 
-//    @RepeatSubmit
-//    @ApiOperation(value = "现场勘验记录项目状态流转")
-//    @PostMapping("/doProcess")
-//    public CommonResult doProcess(@RequestBody Long projectId){
-//        investigationService.doInvestigationProcess(projectId);
-//        return CommonResult.success();
-//    }
 
 
 }
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
index bc8d9a2..b1482e3 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
@@ -32,7 +32,7 @@
         return CommonResult.success(agencyService.agencyList(agency));
     }
 
-    @RequiresPermissions("system:assess:monitor")
+    @RequiresPermissions(value={"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
     @ApiOperation(value = "根据id获取机构详情")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "agencyId", dataType = "int", required = true, value = "机构id")
diff --git a/assess-admin/src/main/resources/application-dev.yml b/assess-admin/src/main/resources/application-dev.yml
index cdb2cd3..4a7ca0a 100644
--- a/assess-admin/src/main/resources/application-dev.yml
+++ b/assess-admin/src/main/resources/application-dev.yml
@@ -73,7 +73,7 @@
   level:
     root: INFO
     org:
-      com.nms.swspkmas_standalone: DEBUG
+      com.gkhy.assess: DEBUG
 
 
 swagger:
diff --git a/assess-admin/src/main/resources/application-pro.yml b/assess-admin/src/main/resources/application-pro.yml
index 6997820..5058228 100644
--- a/assess-admin/src/main/resources/application-pro.yml
+++ b/assess-admin/src/main/resources/application-pro.yml
@@ -5,7 +5,7 @@
     druid:
       # 主库数据源
       master:
-        url: jdbc:mysql://172.17.254.237:7006/smart_assess?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
+        url: jdbc:mysql://127.0.0.1:7006/smart_assess?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
         username: root
         password: 2farwL3yPXfbH2AP
       # 从库数据源
@@ -48,7 +48,7 @@
     database: 0
     host: 127.0.0.1
     port: 6379
-    password: gkhy@202306
+    password: akj78avauba789a
 
 
 # mybatis-plus相关配置
@@ -75,7 +75,7 @@
   level:
     root: INFO
     org:
-      com.nms.swspkmas_standalone: INFO
+      com.gkhy.assess: INFO
 
 
 swagger:
diff --git a/assess-admin/src/main/resources/db/migration/V20240408001_change_access_file.sql b/assess-admin/src/main/resources/db/migration/V20240408001_change_access_file.sql
new file mode 100644
index 0000000..5a617c8
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240408001_change_access_file.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `smart_assess`.`ass_accessory_file`
+ADD COLUMN `process_id` bigint NULL COMMENT '项目过程id';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240408002_change_agency.sql b/assess-admin/src/main/resources/db/migration/V20240408002_change_agency.sql
new file mode 100644
index 0000000..06b3cd2
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240408002_change_agency.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `smart_assess`.`sys_agency`
+ADD COLUMN `cert_path` varchar(60) NULL COMMENT '资质证书图片路径';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240409001_change_user.sql b/assess-admin/src/main/resources/db/migration/V20240409001_change_user.sql
new file mode 100644
index 0000000..7bacb9f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240409001_change_user.sql
@@ -0,0 +1,4 @@
+ALTER TABLE `smart_assess`.`sys_user`
+MODIFY COLUMN `certificate_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '证书编号';
+ALTER TABLE `smart_assess`.`sys_user`
+MODIFY COLUMN `level` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '评价师等级';
\ No newline at end of file
diff --git a/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java b/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
index 32cc777..2654ebc 100644
--- a/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
+++ b/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
@@ -105,8 +105,14 @@
             }
 
         }
+    }
 
-
-
+    @Test
+    public void testLog(){
+        try {
+            int i = 1 / 0;
+        }catch (Exception e){
+            log.error("error=",e);
+        }
     }
 }
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/CustomerUsernamePasswordToken.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/CustomerUsernamePasswordToken.java
new file mode 100644
index 0000000..c632843
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/CustomerUsernamePasswordToken.java
@@ -0,0 +1,25 @@
+package com.gkhy.assess.common.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.shiro.authc.UsernamePasswordToken;
+
+public class CustomerUsernamePasswordToken extends UsernamePasswordToken {
+    @ApiModelProperty("用户身份(0代表监管用户,1代表机构用户,2代表专家用户)")
+    private Integer identity;
+
+    public CustomerUsernamePasswordToken() {
+    }
+
+    public CustomerUsernamePasswordToken(String username, String password, Integer identity) {
+        super(username, password);
+        this.identity = identity;
+    }
+
+    public Integer getIdentity() {
+        return identity;
+    }
+
+    public void setIdentity(Integer identity) {
+        this.identity = identity;
+    }
+}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/JwtToken.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/JwtToken.java
similarity index 76%
rename from assess-framework/src/main/java/com/gkhy/assess/framework/shiro/JwtToken.java
rename to assess-common/src/main/java/com/gkhy/assess/common/domain/JwtToken.java
index a8d733f..b4cc8af 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/JwtToken.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/JwtToken.java
@@ -1,8 +1,8 @@
-package com.gkhy.assess.framework.shiro;
+package com.gkhy.assess.common.domain;
 
 import org.apache.shiro.authc.UsernamePasswordToken;
 
-public class JwtToken extends UsernamePasswordToken {
+public class JwtToken extends CustomerUsernamePasswordToken {
 
     private String jwtToken;
 
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 3f71537..8d8860f 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
@@ -42,6 +42,6 @@
     @ApiModelProperty("用户身份(0代表监管用户,1代表机构用户,2代表专家用户)")
     private Integer identity;
 
-    @ApiModelProperty("用户人脸数据(app使用)")
-    private Object userFace;
+    @ApiModelProperty("用户人脸图片地址(app使用),前端访问图片链接格式:http://ip:port/api/文件保存相对路径")
+    private String idPhoto;
 }
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/LoginBody.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/LoginBody.java
index 7c0ef26..efc5857 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/LoginBody.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/LoginBody.java
@@ -21,4 +21,6 @@
     private String code;
     @ApiModelProperty(value = "验证码唯一标识",required = false)
     private String uuid;
+    @ApiModelProperty("用户身份(0代表监管用户,1代表机构用户,2代表专家用户)")
+    private Integer identity;
 }
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/AttachTypeEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/AttachTypeEnum.java
index 096c6e8..9e004df 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/enums/AttachTypeEnum.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/AttachTypeEnum.java
@@ -6,7 +6,7 @@
  */
 public enum AttachTypeEnum
 {
-    SOCIAL(1, "社保"), MEDICAL(2, "医保"),SALARY(3, "工资单");
+    SOCIAL(1, "社保"), MEDICAL(2, "医保"),SALARY(3, "工资单"),AGENCY_CERT(4, "机构资质证书");
 
     private final Integer code;
     private final String info;
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 0447a9a..dd9aae4 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
@@ -6,10 +6,12 @@
 import com.auth0.jwt.JWTVerifier;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.Claim;
 import com.auth0.jwt.interfaces.DecodedJWT;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gkhy.assess.common.api.CommonResult;
 import com.gkhy.assess.common.exception.ApiException;
+import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.crypto.hash.Md5Hash;
 import org.slf4j.Logger;
@@ -21,6 +23,8 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * JwtToken生成的工具类
@@ -59,10 +63,11 @@
      * @param secret  用户密码
      * @return
      */
-    public static boolean verify(String token,String username,String secret){
+    public static boolean verify(String token,String username,String secret,Integer identity){
         try {
             Algorithm algorithm = Algorithm.HMAC256(secret);
-            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username)
+                    .withClaim("identity",identity).build();
             DecodedJWT jwt = verifier.verify(token);
             return true;
         }catch (Exception e){
@@ -71,11 +76,12 @@
     }
 
 
-    public static boolean isNeedUpdate(String token,String username,String secret){
+    public static boolean isNeedUpdate(String token, String username, String secret,Integer identity){
         Date expertsAt =null;
         try {
             Algorithm algorithm = Algorithm.HMAC256(secret);
-            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username)
+                    .withClaim("identity",identity).build();
             expertsAt = verifier.verify(token).getExpiresAt();
         }catch (Exception e){
             throw new ApiException("token非法无效");
@@ -99,15 +105,32 @@
     }
 
     /**
+     * 获取token中的信息  无需secret解密也能获得
+     * @param token
+     * @return
+     */
+    public static Integer getIdentity(String token){
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("identity").asInt();
+        }catch (JWTDecodeException e){
+            return null;
+        }
+    }
+
+
+
+    /**
      * 生成签名
      * @param username
      * @param secret
      * @return
      */
-    public static String sign(String username,String secret){
+    public static String sign(String username,String secret,Integer identity){
         Date date=new Date(System.currentTimeMillis()+EXPIRATION*1000);
         Algorithm algorithm=Algorithm.HMAC256(secret);
-        return JWT.create().withClaim("username",username).withExpiresAt(date).sign(algorithm);
+        return JWT.create().withClaim("username",username)
+                .withClaim("identity",identity).withExpiresAt(date).sign(algorithm);
     }
 
     /**
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/RedisUtils.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/RedisUtils.java
index e0e3917..bb0e003 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/utils/RedisUtils.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/RedisUtils.java
@@ -34,6 +34,7 @@
     @Value("${spring.profiles.active}")
     public String activeName;
 
+
     private static final Long RELEASE_SUCCESS = 1L;
     private static final String LOCK_SUCCESS = "OK";
     private static final String SET_IF_NOT_EXIST = "NX";
@@ -777,4 +778,5 @@
     }
 
 
+
 }
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 d517027..5bc2a53 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
@@ -53,7 +53,7 @@
             builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
             //接收时间数据反序列化
             builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
-            builder.timeZone(TimeZone.getDefault());
+            builder.timeZone(TimeZone.getTimeZone("UTC+8"));
         };
     }
 
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java b/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java
index 6d6083b..a92ec25 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java
@@ -4,6 +4,7 @@
 import com.gkhy.assess.common.exception.ApiException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.UnauthorizedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -79,6 +80,16 @@
     /**
      * 拦截未知的运行时异常
      */
+    @ExceptionHandler(UnauthorizedException.class)
+    public CommonResult handleUnauthorizedException(RuntimeException ex, HttpServletRequest request)
+    {
+        writeExceptionLogFile(ex);
+        return CommonResult.failed("权限不足,无权操作!");
+    }
+
+    /**
+     * 拦截未知的运行时异常
+     */
     @ExceptionHandler(RuntimeException.class)
     public CommonResult handleRuntimeException(RuntimeException ex, HttpServletRequest request)
     {
@@ -105,7 +116,7 @@
         if (request!=null) {
             url=request.getRequestURI();
         }
-        log.error("error={}",ex);
+        log.error("error:",ex);
         log.error(ex.getMessage()+",url={}",url);
     }
 }
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java
index 4da74f7..bf2f35c 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java
@@ -59,7 +59,7 @@
         String submitKey = StringUtils.trimToEmpty(request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN));
 
         // 唯一标识(指定key + url + 消息头)
-        String cacheRepeatKey = CacheConstant.REPEAT_SUBMIT_KEY + url + submitKey;
+        String cacheRepeatKey = redisUtils.generateKey(CacheConstant.REPEAT_SUBMIT_KEY + url + submitKey);
 
         Object sessionObj = redisUtils.get(cacheRepeatKey);
         if (sessionObj != null)
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/filter/JwtFilter.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/filter/JwtFilter.java
index 5e5e18d..1f19d66 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/filter/JwtFilter.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/filter/JwtFilter.java
@@ -3,9 +3,8 @@
 import com.alibaba.fastjson.JSONObject;
 import com.gkhy.assess.common.api.CommonResult;
 import com.gkhy.assess.common.api.ResultCode;
-import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.JwtTokenUtil;
-import com.gkhy.assess.framework.shiro.JwtToken;
+import com.gkhy.assess.common.domain.JwtToken;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.subject.Subject;
@@ -20,7 +19,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
-import java.util.Date;
 
 @Slf4j
 public class JwtFilter extends BasicHttpAuthenticationFilter {
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 a56af8e..cd24912 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
@@ -1,10 +1,10 @@
 package com.gkhy.assess.framework.shiro.realm;
 
+import com.gkhy.assess.common.domain.CustomerUsernamePasswordToken;
 import com.gkhy.assess.common.enums.UserIdentityEnum;
-import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.RequestUtil;
 import com.gkhy.assess.common.utils.SpringContextUtils;
-import com.gkhy.assess.framework.shiro.JwtToken;
+import com.gkhy.assess.common.domain.JwtToken;
 import com.gkhy.assess.framework.shiro.service.SysLoginService;
 import com.gkhy.assess.system.domain.SysUser;
 import lombok.extern.slf4j.Slf4j;
@@ -66,7 +66,6 @@
         if(authenticationToken instanceof JwtToken){
             String token= (String) authenticationToken.getCredentials();
             if(token==null){
-
                 log.info("————————身份认证失败——————————IP地址:  "+ RequestUtil.getRequestIp(req) +",URL:"+req.getRequestURI());
                 throw new AuthenticationException("token为空!");
             }
@@ -75,10 +74,10 @@
                 return new SimpleAuthenticationInfo(sysUser,token,this.getName());
             }
         }else{
-            UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
+            CustomerUsernamePasswordToken upToken = (CustomerUsernamePasswordToken) authenticationToken;
             String username = upToken.getUsername();
             String password=new String(upToken.getPassword());
-            sysUser=sysLoginService.login(username,password);
+            sysUser=sysLoginService.login(username,password,upToken.getIdentity());
             if(sysUser!=null){
                 return new SimpleAuthenticationInfo(sysUser,password,this.getName());
             }
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 ab85786..96d9a40 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
@@ -4,7 +4,6 @@
 import com.gkhy.assess.common.enums.ApproveStatusEnum;
 import com.gkhy.assess.common.enums.UserIdentityEnum;
 import com.gkhy.assess.common.enums.UserStatusEnum;
-import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.JwtTokenUtil;
 import com.gkhy.assess.common.utils.RedisUtils;
 import com.gkhy.assess.system.domain.SysUser;
@@ -29,8 +28,8 @@
     @Autowired
     private HttpServletRequest request;
 
-    public SysUser login(String username, String password) {
-        SysUser sysUser=sysUserService.getUserByUsernamePhone(username);
+    public SysUser login(String username, String password,Integer identity) {
+        SysUser sysUser=sysUserService.getUserByUsernamePhone(username,identity);
         validUser(sysUser);
         passwordService.validate(sysUser,password);
         recordLoginInfo(sysUser.getId());
@@ -67,15 +66,16 @@
     public SysUser validJwtToken(String jwtToken){
 
         String username= JwtTokenUtil.getUsername(jwtToken);
-        if(StringUtils.isEmpty(username)){
+        Integer identity=JwtTokenUtil.getIdentity(jwtToken);
+        if(StringUtils.isEmpty(username)||identity==null){
             throw new AuthenticationException("token非法无效!");
         }
-        SysUser sysUser=sysUserService.getUserByUsernamePhone(username);
+        SysUser sysUser=sysUserService.getUserByUsernamePhone(username,identity);
         validUser(sysUser);
-        if(!JwtTokenUtil.verify(jwtToken,username,sysUser.getPassword())){
+        if(!JwtTokenUtil.verify(jwtToken,username,sysUser.getPassword(),identity)){
             throw new AuthenticationException("token非法无效!");
         }
-        if(!jwtTokenRefresh(jwtToken,username,sysUser.getPassword())){
+        if(!jwtTokenRefresh(jwtToken,username,sysUser.getPassword(),identity)){
             throw new AuthenticationException("Token已失效,请重新登录!");
         }
      //   setRolePermission(sysUser);
@@ -95,14 +95,14 @@
      * @param passWord
      * @return
      */
-    public boolean jwtTokenRefresh(String jwtToken,String username,String passWord){
+    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);
+        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)){
-                String newToken=JwtTokenUtil.sign(username,passWord);
+            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);
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 9890066..24c7e2e 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
@@ -72,4 +72,8 @@
     @ApiModelProperty("删除标志(0正常,1删除,默认0)")
     @TableField("del_flag")
     private Integer delFlag;
+
+    @ApiModelProperty(value = "项目过程id",required = false)
+    @TableField("process_id")
+    private Long processId;
 }
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 2126a98..28c791a 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
@@ -14,8 +14,10 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 
 import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
 
@@ -85,24 +87,27 @@
     @TableField(exist = false)
     private List<AssAccessoryFile> assAccessoryFiles;
 
-
+    @NotNull(message = "企业陪同合照不能为空")
     @ApiModelProperty("企业陪同合照列表")
     @TableField(exist = false)
-    private List<AssAccessoryFile> ccompanyImages;
+    @Size(min = 1,message = "企业陪同合照不能为空")
+    private List<AssAccessoryFile> companyImages;
 
+    @NotNull(message = "主要装置前的合影照片不能为空")
     @ApiModelProperty("主要装置前的合影照片列表")
     @TableField(exist = false)
+    @Size(min = 1,message = "主要装置前的合影照片不能为空")
     private List<AssAccessoryFile> deviceImages;
 
+    @NotNull(message = "现场勘验照片不能为空")
     @ApiModelProperty("现场勘验照片")
     @TableField(exist = false)
+    @Size(min = 1,message = "现场勘验照片不能为空")
     private List<AssAccessoryFile> investingationImages;
+
 
     @ApiModelProperty("现场勘验视频")
     @TableField(exist = false)
     private List<AssAccessoryFile> investingationVideos;
-
-
-
 
 }
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 01fe651..6fca7e2 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
@@ -194,4 +194,8 @@
     @ApiModelProperty("归档确认总人数和已确认人数")
     @TableField(exist = false)
     private PersonRecognitionVO personRecognition;
+
+    @ApiModelProperty("机构名称")
+    @TableField(exist = false)
+    private String agencyName;
 }
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 ed2f452..f08252a 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
@@ -12,6 +12,7 @@
 import com.gkhy.assess.common.domain.BaseEntity;
 import com.gkhy.assess.common.enums.SensitiveTypeEnum;
 import com.gkhy.assess.common.validate.AgencyGroup;
+import com.gkhy.assess.common.validate.ExpertGroup;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -129,6 +130,11 @@
     @TableField("cert_number")
     private String certNumber;
 
+    @NotNull(message = "资质证书图片路径不能为空")
+    @ApiModelProperty("资质证书图片路径,创建机构时传入")
+    @TableField("cert_path")
+    private String certPath;
+
 
     @NotNull(message = "发证日期不能为空")
     @ApiModelProperty(value = "发证日期",required = true)
@@ -177,7 +183,7 @@
     private String business;
 
 
-    @NotBlank(message = "机构信息上报表存放路径不能为空")
+//    @NotBlank(message = "机构信息上报表存放路径不能为空")
     @ApiModelProperty(value = "机构信息上报表存放路径",required = true)
     @TableField("report_path")
     private String reportPath;
@@ -203,4 +209,6 @@
     @TableField("version")
     private Integer version;
 
+
+
 }
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 b76074d..3c08c3d 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
@@ -160,7 +160,7 @@
     @TableField("version")
     private Integer version;
 
-    @ApiModelProperty("证书编号")
+    @ApiModelProperty("证书编号,多个证书,逗号隔开")
     @TableField("certificate_no")
     private String certificateNo;
 
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 f90bf31..b013c9a 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
@@ -40,7 +40,7 @@
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
-    @NotBlank(message = "人脸数据不能为空")
+
     @ApiModelProperty(value = "人脸数据",required = true)
     @TableField("face_base")
     private String faceBase;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java
index 775f14c..66e4be9 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java
@@ -23,7 +23,7 @@
      * @param moduleType
      * @return
      */
-    List<AssAccessoryFile> getAccessoryFileByProjectId(@Param("projectId") Long projectId, @Param("moduleType") Integer moduleType);
+    List<AssAccessoryFile> getAccessoryFileByProjectId(@Param("projectId") Long projectId,@Param("processId") Long processId, @Param("moduleType") Integer moduleType);
 
     /**
      * 获取数量
@@ -31,7 +31,7 @@
      * @param moduleType
      * @return
      */
-    Integer getAccessoryFileCountByProjectId(@Param("projectId") Long projectId, @Param("moduleType") Integer moduleType);
+    Integer getAccessoryFileCountByProjectId(@Param("projectId") Long projectId, @Param("processId") Long processId,@Param("moduleType") Integer moduleType);
 
     /**
      * 根据id删除评估文件
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java
index 8530086..f2221b2 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java
@@ -31,6 +31,13 @@
     List<AssFaceRecognition> getFaceRecognitionByProjectId(Long projectId);
 
     /**
+     *
+     * @param projectId
+     * @return
+     */
+    List<AssFaceRecognition> getSimpleFaceRecognitionByProjectId(Long projectId);
+
+    /**
      * 根据id获取签字确认
      * @param faceRecognitionId
      * @return
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java
index 559ab35..019f94b 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java
@@ -4,6 +4,8 @@
 import com.gkhy.assess.system.domain.AssInvestigation;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * <p>
  * 现场勘验记录表 Mapper 接口
@@ -28,7 +30,7 @@
      * @param projectId
      * @return
      */
-    AssInvestigation getInvestigationByProjectId(Long projectId);
+    List<AssInvestigation> getInvestigationByProjectId(Long projectId);
 
     /**
      * 根据id获取现场勘验记录
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java
index ece8e63..d8b2f43 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java
@@ -29,7 +29,7 @@
      * @param username
      * @return
      */
-    public SysUser getUserByUsernamePhone(String username);
+    public SysUser getUserByUsernamePhone(@Param("username") String username,@Param("identity") Integer identity);
 
     /**
      * 获取监管用户列表
@@ -87,7 +87,7 @@
      * @param phone
      * @return
      */
-    SysUser checkPhoneUnique(String phone);
+    SysUser checkPhoneUnique(String phone,Integer identity);
 
     /**
      * 校验邮箱是否唯一
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java
index f1eb175..7653987 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java
@@ -30,7 +30,8 @@
      * @param moduleType
      * @return
      */
-    List<AssAccessoryFile> getAccessoryFileByProjectId(Long projectId, Integer moduleType);
+    List<AssAccessoryFile> getAccessoryFileByProjectId(Long projectId,Long processId, Integer moduleType);
+
 
     /**
      * 根据id删除评估文件
@@ -53,5 +54,13 @@
      * @param moduleType
      * @return
      */
-    Integer getAccessoryFileCountByProjectId(Long projectId, Integer moduleType);
+    Integer getAccessoryFileCountByProjectId(Long projectId,Long processId, Integer moduleType);
+
+    /**
+     * 批量更新文件processId
+     * @param accessoryFileIds
+     * @param processId
+     * @return
+     */
+    Boolean batchUpdateAccessoryFileProcessId(List<Long> accessoryFileIds,Long processId);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java
index 4e8d8dd..33d675a 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java
@@ -3,6 +3,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.gkhy.assess.system.domain.AssInvestigation;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 现场勘验记录表 服务类
@@ -18,7 +21,7 @@
      * @param investigation
      * @return
      */
-    int addInvestigation(AssInvestigation investigation,String requestSourceType);
+    Long addInvestigation(AssInvestigation investigation);
 
     /**
      * 修改勘验记录
@@ -32,7 +35,7 @@
      * @param projectId
      * @return
      */
-    AssInvestigation getInvestigationByProjectId(Long projectId);
+    List<AssInvestigation> getInvestigationByProjectId(Long projectId);
 
 
     /**
@@ -44,7 +47,8 @@
 
     /**
      * 项目状态流转
-     * @param projectId
+     * @param map
      */
-    void doInvestigationProcess(Long projectId);
+    void doInvestigationProcess(Map map);
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java
index 0096e0b..e7717fe 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java
@@ -2,6 +2,7 @@
 
 import com.gkhy.assess.system.domain.SysUserFace;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.vo.UploadObjectVO;
 
 /**
  * <p>
@@ -17,7 +18,7 @@
      * @param userFace
      * @return
      */
-    int addUserFace(SysUserFace userFace);
+    UploadObjectVO addUserFace(SysUserFace userFace);
 
     /**
      * 根据用户id获取人脸数据
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java
index 21f10f0..17ba65d 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java
@@ -62,14 +62,14 @@
      * @param username
      * @return
      */
-    SysUser getUserByUsername(String username);
+    SysUser getUserByUsername(String username,Integer identity);
 
     /**
      * 登录名或者手机号获取用户
      * @param username
      * @return
      */
-    SysUser getUserByUsernamePhone(String username);
+    SysUser getUserByUsernamePhone(String username,Integer identity);
 
     /**
      * 新增监管用户
@@ -196,4 +196,12 @@
      */
     SysUser getUserInfoById(Long userId);
 
+    /**
+     * 清空缓存
+     * @param username
+     * @param identity
+     */
+    void delCacheByUsername(String username,Integer identity);
+
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java
index 6e75233..6c65ff8 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java
@@ -56,15 +56,23 @@
     }
 
     @Override
-    public List<AssAccessoryFile> getAccessoryFileByProjectId(Long projectId, Integer moduleType) {
+    public List<AssAccessoryFile> getAccessoryFileByProjectId(Long projectId,Long processId, Integer moduleType) {
         projectService.checkUserAllowed(projectId);
-        return baseMapper.getAccessoryFileByProjectId(projectId,moduleType);
+        return baseMapper.getAccessoryFileByProjectId(projectId,processId,moduleType);
+    }
+
+
+    @Override
+    public Integer getAccessoryFileCountByProjectId(Long projectId,Long processId, Integer moduleType) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getAccessoryFileCountByProjectId(projectId,processId,moduleType);
     }
 
     @Override
-    public Integer getAccessoryFileCountByProjectId(Long projectId, Integer moduleType) {
-        projectService.checkUserAllowed(projectId);
-        return baseMapper.getAccessoryFileCountByProjectId(projectId,moduleType);
+    public Boolean batchUpdateAccessoryFileProcessId(List<Long> accessoryFileIds, Long processId) {
+        return update(Wrappers.<AssAccessoryFile>lambdaUpdate()
+                .in(AssAccessoryFile::getId,accessoryFileIds)
+                .set(AssAccessoryFile::getProcessId,processId));
     }
 
 
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 646d7ac..0cff0a8 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
@@ -69,7 +69,7 @@
     public AssConclusion getConclusionByProjectId(Long projectId) {
         projectService.checkUserAllowed(projectId);
         AssConclusion conclusion= baseMapper.getConclusionByProjectId(projectId);
-        conclusion.setAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.CONCLUSION.getCode()));
+        conclusion.setAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId,null, AccessoryFileTypeEnum.CONCLUSION.getCode()));
         return conclusion;
     }
 
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 66c5fd6..df6722f 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
@@ -69,7 +69,7 @@
     public Boolean checkAllFaceRecongnition(Long projectId){
         projectService.checkUserAllowed(projectId);
         List<AssPlanPerson> planPersonList=planPersonMapper.getAllPlanPersonByProjectId(projectId);
-        List<AssFaceRecognition> faceRecognitionList=baseMapper.getFaceRecognitionByProjectId(projectId);
+        List<AssFaceRecognition> faceRecognitionList=baseMapper.getSimpleFaceRecognitionByProjectId(projectId);
         Map<Long,AssFaceRecognition> map=faceRecognitionList.stream().collect(Collectors.toMap(AssFaceRecognition::getPersonId,a -> a,(k1,k2) -> k1));
         String message="";
         for(AssPlanPerson planPerson:planPersonList){
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 907c2cd..24f5e55 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
@@ -2,6 +2,7 @@
 
 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.enums.AccessoryFileTypeEnum;
 import com.gkhy.assess.system.enums.ReportProgressEnum;
@@ -14,6 +15,11 @@
 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.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -34,49 +40,38 @@
 
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
-    public int addInvestigation(AssInvestigation investigation,String requestSourceType) {
+    public Long addInvestigation(AssInvestigation investigation) {
         Long projectId=investigation.getProjectId();
         projectService.checkUserAllowed(projectId);
-        checkInvestigationCount(projectId);
+     //   checkInvestigationCount(projectId);
         investigation.setCreateBy(ShiroUtils.getSysUser().getUsername());
         if(investigation.getIsSafetyCheck()!=null&&investigation.getIsSafetyCheck()==1){
-            Integer fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_ATTACHMENT.getCode());
+            Integer fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId,null, AccessoryFileTypeEnum.INVESTINGATION_ATTACHMENT.getCode());
             if(fileCount==0){
                 throw new ApiException("未上传现场安全检查表");
             }
         }
-        //校验图片数量
-        Integer fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.DEVICE_IMAGE.getCode());
-        if(fileCount==0){
-            throw new ApiException("主要装置前的合影照片不能为空");
+        List<AssAccessoryFile> accessFiles=new ArrayList<>();
+        accessFiles.addAll(investigation.getCompanyImages());
+        accessFiles.addAll(investigation.getDeviceImages());
+        accessFiles.addAll(investigation.getInvestingationImages());
+        if(investigation.getInvestingationVideos()!=null&& !investigation.getInvestingationVideos().isEmpty()){
+            accessFiles.addAll(investigation.getInvestingationVideos());
         }
-        fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_IMAGE.getCode());
-        if(fileCount==0){
-            throw new ApiException("现场勘验照片照片不能为空");
+        if(investigation.getAssAccessoryFiles()!=null&&!investigation.getAssAccessoryFiles().isEmpty()){
+            accessFiles.addAll(investigation.getAssAccessoryFiles());
         }
-        fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.COMPANY_IMAGE.getCode());
-        if(fileCount==0){
-            throw new ApiException("现场勘验人员与企业陪同人员图片不能为空");
+        List<Long> fileIds=new ArrayList<>();
+        for(AssAccessoryFile accessoryFile:accessFiles){
+            if(accessoryFile.getId()==null){
+                throw new ApiException("附件或图片id不能为空");
+            }
+            fileIds.add(accessoryFile.getId());
         }
-//        fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_VIDEO.getCode());
-//        if(fileCount==0){
-//            throw new ApiException("现场勘验视频不能为空");
-//        }
-        int row=baseMapper.insert(investigation);
-        if(requestSourceType== RequestSourceEnum.WEB.getCode()){
-            //校验项目状态
-            projectService.checkReportProgress(projectId, ReportProgressEnum.WORK_NOTIFICATION);
-            //更新项目状态
-            projectService.changeReportProgress(projectId,ReportProgressEnum.INVESTINGATION);
-        }
-        //校验项目状态
-//        projectService.checkReportProgress(projectId, ReportProgressEnum.WORK_NOTIFICATION);
-//        int row=baseMapper.insert(investigation);
-//        if(row>0 && (investigation.getState()==null||!investigation.getState().equals(ApproveStatusEnum.TEMPORARY.getCode()))) {
-//            //更新项目状态
-//            projectService.changeReportProgress(projectId,ReportProgressEnum.INVESTINGATION);
-//        }
-        return row;
+        baseMapper.insert(investigation);
+        //更新图片过程id
+        accessoryFileService.batchUpdateAccessoryFileProcessId(fileIds,investigation.getId());
+        return investigation.getId();
     }
 
     public void checkInvestigationCount(Long projectId){
@@ -88,36 +83,61 @@
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public int editInvestigation(AssInvestigation investigation) {
+        if(investigation.getId()==null){
+            throw new ApiException("现场勘验记录id不能为空!");
+        }
         projectService.checkUserAllowed(investigation.getProjectId());
         investigation.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        List<AssAccessoryFile> accessFiles=new ArrayList<>();
+        accessFiles.addAll(investigation.getCompanyImages());
+        accessFiles.addAll(investigation.getDeviceImages());
+        accessFiles.addAll(investigation.getInvestingationImages());
+        if(investigation.getInvestingationVideos()!=null&& !investigation.getInvestingationVideos().isEmpty()){
+            accessFiles.addAll(investigation.getInvestingationVideos());
+        }
+        if(investigation.getAssAccessoryFiles()!=null&&!investigation.getAssAccessoryFiles().isEmpty()){
+            accessFiles.addAll(investigation.getAssAccessoryFiles());
+        }
+        List<Long> fileIds=new ArrayList<>();
+        for(AssAccessoryFile accessoryFile:accessFiles){
+            if(accessoryFile.getId()==null){
+                throw new ApiException("附件或图片id不能为空");
+            }
+            fileIds.add(accessoryFile.getId());
+        }
+        accessoryFileService.batchUpdateAccessoryFileProcessId(fileIds,investigation.getId());
         int row=baseMapper.updateById(investigation);
         return row;
     }
 
     @Override
-    public AssInvestigation getInvestigationByProjectId(Long projectId) {
+    public List<AssInvestigation> getInvestigationByProjectId(Long projectId) {
         projectService.checkUserAllowed(projectId);
-        AssInvestigation investigation= baseMapper.getInvestigationByProjectId(projectId);
-        if(investigation!=null) {
-            investigation.setAssAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_ATTACHMENT.getCode()));
-            investigation.setCcompanyImages(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.COMPANY_IMAGE.getCode()));
-            investigation.setDeviceImages(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.DEVICE_IMAGE.getCode()));
-            investigation.setInvestingationImages(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_IMAGE.getCode()));
-            investigation.setInvestingationVideos(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_VIDEO.getCode()));
-        }
-        return investigation;
+        List<AssInvestigation> investigations= baseMapper.getInvestigationByProjectId(projectId);
+        return investigations;
     }
 
 
     @Override
     public AssInvestigation getInvestigationById(Long investigationId) {
-        return baseMapper.getInvestigationById(investigationId);
+        AssInvestigation investigation= baseMapper.getInvestigationById(investigationId);
+        if(investigation!=null) {
+            investigation.setAssAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(investigation.getProjectId(),investigation.getId(), AccessoryFileTypeEnum.INVESTINGATION_ATTACHMENT.getCode()));
+            investigation.setCompanyImages(accessoryFileService.getAccessoryFileByProjectId(investigation.getProjectId(),investigation.getId(), AccessoryFileTypeEnum.COMPANY_IMAGE.getCode()));
+            investigation.setDeviceImages(accessoryFileService.getAccessoryFileByProjectId(investigation.getProjectId(),investigation.getId(), AccessoryFileTypeEnum.DEVICE_IMAGE.getCode()));
+            investigation.setInvestingationImages(accessoryFileService.getAccessoryFileByProjectId(investigation.getProjectId(),investigation.getId(), AccessoryFileTypeEnum.INVESTINGATION_IMAGE.getCode()));
+            investigation.setInvestingationVideos(accessoryFileService.getAccessoryFileByProjectId(investigation.getProjectId(),investigation.getId(), AccessoryFileTypeEnum.INVESTINGATION_VIDEO.getCode()));
+        }
+        return investigation;
     }
 
     @Override
-    public void doInvestigationProcess(Long projectId) {
+    public void doInvestigationProcess(Map map) {
+        Long projectId= Long.parseLong(map.get("projectId").toString());
         projectService.checkUserAllowed(projectId);
+
         //校验项目状态
         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 e641012..3d3f27b 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
@@ -6,9 +6,11 @@
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.StringUtils;
 import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.domain.SysUser;
 import com.gkhy.assess.system.enums.PlayRoleEnum;
 import com.gkhy.assess.system.mapper.AssPlanPersonMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.mapper.SysUserMapper;
 import com.gkhy.assess.system.service.AssPlanPersonService;
 import com.gkhy.assess.system.service.AssProjectService;
 import com.gkhy.assess.system.utils.ShiroUtils;
@@ -29,6 +31,8 @@
 public class AssPlanPersonServiceImpl extends ServiceImpl<AssPlanPersonMapper, AssPlanPerson> implements AssPlanPersonService {
     @Autowired
     private AssProjectService projectService;
+    @Autowired
+    private SysUserMapper sysUserMapper;
     @Override
     public List<AssPlanPerson> getByProjectId(Long projectId) {
         projectService.checkUserAllowed(projectId);
@@ -57,11 +61,15 @@
         AssPlanPerson pPerson= getOne(lambdaQueryWrapper);
         if(pPerson!=null){
             PlayRoleEnum playRoleEnum=PlayRoleEnum.getInfoByCode(pPerson.getPlayRole());
+            SysUser sysUser=sysUserMapper.selectById(planPerson.getPersonId());
+            if(sysUser==null){
+                throw new ApiException("选择的用户不存在");
+            }
             String message=playRoleEnum!=null?playRoleEnum.getInfo():"";
             if(StringUtils.isBlank(message)){
-                message="该用户已存在";
+                message=String.format("用户<%s>已担任职务",sysUser.getName());
             }else{
-                message="该用户已担任"+message;
+                message=String.format("用户<%s>已担任%s",sysUser.getName(),message);
             }
             throw new ApiException(message);
         }
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 a6f1b86..ec01bbf 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
@@ -89,7 +89,7 @@
     public AssProcessAudit getProcessAuditByProjectId(Long projectId) {
         projectService.checkUserAllowed(projectId);
         AssProcessAudit processAudit= baseMapper.getProcessAuditByProjectId(projectId);
-        processAudit.setAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.PROCESS_ATTACHMENT.getCode()));
+        processAudit.setAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId, null,AccessoryFileTypeEnum.PROCESS_ATTACHMENT.getCode()));
         return processAudit;
     }
 
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java
index 9d842fb..f30a351 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java
@@ -26,7 +26,7 @@
 
     @Override
     public String getConfigByKey(String configKey) {
-        String redisKey=getCacheKey(configKey);
+        String redisKey=redisUtils.generateKey(getCacheKey(configKey));
         String configValue= (String) redisUtils.get(redisKey);
         if(StringUtils.isNotEmpty(configValue)){
             return configValue;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java
index c384eb1..2114126 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java
@@ -1,5 +1,7 @@
 package com.gkhy.assess.system.service.impl;
 
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.StringUtils;
 import com.gkhy.assess.system.domain.SysUser;
 import com.gkhy.assess.system.domain.SysUserFace;
 import com.gkhy.assess.system.domain.vo.UploadObjectVO;
@@ -8,6 +10,7 @@
 import com.gkhy.assess.system.service.SysCommonService;
 import com.gkhy.assess.system.service.SysUserFaceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.SysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,20 +28,28 @@
     @Autowired
     private SysCommonService commonService;
     @Autowired
-    private SysUserMapper userMapper;
+    private SysUserService userService;
     @Override
-    @Transactional
-    public int addUserFace(SysUserFace userFace) {
-        int row=0;
-        SysUserFace oldUserFace=baseMapper.getFaceByUserId(userFace.getUserId());
+    @Transactional(rollbackFor = RuntimeException.class)
+    public UploadObjectVO addUserFace(SysUserFace userFace) {
+
+     //   SysUserFace oldUserFace=baseMapper.getFaceByUserId(userFace.getUserId());
         UploadObjectVO uploadObjectVO =commonService.doUpload(userFace.getFile());
-        if(oldUserFace==null){
-            row= baseMapper.insert(userFace);
+        /*if(oldUserFace==null){
+            baseMapper.insert(userFace);
         }else{
-            row= baseMapper.updateById(new SysUserFace().setId(oldUserFace.getId()).setFaceBase(userFace.getFaceBase()));
+            baseMapper.updateById(new SysUserFace().setId(oldUserFace.getId()).setFaceBase(userFace.getFaceBase()));
+        }*/
+        boolean res=userService.updateById(new SysUser().setId(userFace.getUserId()).setIdPhoto(uploadObjectVO.getPath()));
+        if(!res){
+            throw new ApiException("人脸数据上传失败");
         }
-        userMapper.updateById(new SysUser().setId(userFace.getUserId()).setIdPhoto(uploadObjectVO.getPath()));
-        return row;
+        SysUser sysUser=userService.getById(userFace.getUserId());
+        userService.delCacheByUsername(sysUser.getUsername(),sysUser.getIdentity());
+        if(StringUtils.isNotBlank(sysUser.getPhone())) {
+            userService.delCacheByUsername(sysUser.getPhone(), sysUser.getIdentity());
+        }
+        return uploadObjectVO;
     }
 
     @Override
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 41ff653..c0cef63 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
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.assess.common.api.CommonPage;
 import com.gkhy.assess.common.constant.CacheConstant;
+import com.gkhy.assess.common.domain.CustomerUsernamePasswordToken;
 import com.gkhy.assess.common.domain.vo.AccountVO;
 import com.gkhy.assess.common.domain.vo.LoginBody;
 import com.gkhy.assess.common.enums.AttachTypeEnum;
@@ -70,9 +71,13 @@
 
     @Override
     public AccountVO login(LoginBody loginBody) {
+        if(loginBody.getIdentity()==null){
+            throw new ApiException("请选择登录用户身份");
+        }
         // 验证码校验
         validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
-        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
+     //   UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
+        CustomerUsernamePasswordToken usernamePasswordToken=new CustomerUsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()),loginBody.getIdentity());
         Subject subject= SecurityUtils.getSubject();
         String msg ;
         try {
@@ -87,9 +92,9 @@
                 accountVO.setAgentName(agency.getName());
                 accountVO.setAgentId(agency.getId());
             }
-            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
+            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword(),loginBody.getIdentity());
             accountVO.setToken(token);
-            cacheUserToken(sysUser.getUsername(),token);
+            cacheUserToken(sysUser.getUsername(),sysUser.getIdentity(),token);
             return accountVO;
         }catch (UnknownAccountException | IncorrectCredentialsException uae){
             throw new ApiException("用户名/密码错误,请重新输入");
@@ -106,8 +111,9 @@
 
     @Override
     public AccountVO appLogin(LoginBody loginBody) {
-        // 验证码校验
-        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
+        // app端只能是专家用户登录
+        loginBody.setIdentity(UserIdentityEnum.EXPERT.getCode());
+        CustomerUsernamePasswordToken usernamePasswordToken = new CustomerUsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), loginBody.getIdentity());
         Subject subject= SecurityUtils.getSubject();
         String msg ;
         try {
@@ -122,10 +128,10 @@
                 accountVO.setAgentName(agency.getName());
                 accountVO.setAgentId(agency.getId());
             }
-            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
+            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword(),loginBody.getIdentity());
             accountVO.setToken(token);
-            cacheUserToken(sysUser.getUsername(),token);
-            accountVO.setUserFace(userFaceMapper.getFaceByUserId(sysUser.getId()));
+            cacheUserToken(sysUser.getUsername(),sysUser.getIdentity(),token);
+            accountVO.setIdPhoto(sysUser.getIdPhoto());
             return accountVO;
         }catch (UnknownAccountException | IncorrectCredentialsException uae){
             throw new ApiException("用户名/密码错误,请重新输入");
@@ -142,9 +148,8 @@
      * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
      * @param username
      */
-    public void cacheUserToken(String username,String newToken){
-
-        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + 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));
@@ -159,6 +164,7 @@
         redisUtils.set(tokenKey,newToken);
         redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
     }
+
 
     /**
      * 校验验证码
@@ -191,7 +197,8 @@
         String jwtToken = request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN);
         if(StringUtils.isNotBlank(jwtToken)){
             String username=JwtTokenUtil.getUsername(jwtToken);
-            String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
+            Integer identity=JwtTokenUtil.getIdentity(jwtToken);
+            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);
@@ -238,8 +245,8 @@
     }
 
     @Override
-    public SysUser getUserByUsername(String username) {
-        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+    public SysUser getUserByUsername(String username,Integer identity) {
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME + ":" + username+"_"+identity);
         SysUser sysUser =null;
         if(redisUtils.hasKey(key)){
             sysUser= (SysUser) redisUtils.get(key);
@@ -250,19 +257,20 @@
         return sysUser;
     }
 
-    public void delCacheByUsername(String username){
-        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+    @Override
+    public void delCacheByUsername(String username,Integer identity){
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username+"_"+identity);
         redisUtils.del(key);
     }
 
     @Override
-    public SysUser getUserByUsernamePhone(String username) {
-        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+    public SysUser getUserByUsernamePhone(String username,Integer identity) {
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username+"_"+identity);
         SysUser sysUser =null;
         if(redisUtils.hasKey(key)){
             sysUser= (SysUser) redisUtils.get(key);
         }else {
-            sysUser = baseMapper.getUserByUsernamePhone(username);
+            sysUser = baseMapper.getUserByUsernamePhone(username,identity);
             redisUtils.set(key,sysUser,10*60);
         }
         return sysUser;
@@ -280,7 +288,7 @@
         if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.MONITOR.getCode()))){
             throw new ApiException("手机号已存在");
         }
         String originPsword=Base64.decodeStr(user.getPassword());
@@ -303,7 +311,7 @@
         if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.AGENCY.getCode()))){
             throw new ApiException("手机号已存在");
         }
         String originPsword=Base64.decodeStr(user.getPassword());
@@ -317,15 +325,17 @@
         if(!agencyService.checkAgencyNameUnique(new SysAgency().setName(agency.getName()))){
             throw new ApiException("机构名称已存在");
         }
-        agency.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        agency.setCreateBy(ShiroUtils.getSysUser()!=null?ShiroUtils.getSysUser().getUsername():"");
         boolean b=agencyService.save(agency);
         if(!b){
             throw new ApiException("保存机构信息失败");
         }
+
+        //创建机构用户
         user.setIdentity(UserIdentityEnum.AGENCY.getCode());
         user.setAgencyId(agency.getId());
         user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
-        user.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        user.setCreateBy(ShiroUtils.getSysUser()!=null?ShiroUtils.getSysUser().getUsername():"");
         b=save(user);
         if(!b){
             throw new ApiException("创建机构用户信息失败");
@@ -342,7 +352,7 @@
         if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.EXPERT.getCode()))){
             throw new ApiException("手机号已存在");
         }
         String major=user.getMajor();
@@ -424,7 +434,7 @@
                 agencyService.updateById(agency);
             }
         }
-        delCacheByUsername(user.getUsername());
+        delCacheByUsername(user.getUsername(),user.getIdentity());
         user=new SysUser().setId(userId);
         user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         user.setDelFlag(DeleteFlagEnum.DELETED.getCode());
@@ -437,10 +447,10 @@
         if(!checkUsernameUnique(user)){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(user)){
+        if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.MONITOR.getCode()))){
             throw new ApiException("手机号已存在");
         }
-        delCacheByUsername(user.getUsername());
+        delCacheByUsername(user.getUsername(),UserIdentityEnum.MONITOR.getCode());
         user.setPassword(null);
         user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(user);
@@ -458,7 +468,7 @@
         if(!checkUsernameUnique(user)){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(user)){
+        if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.AGENCY.getCode()))){
             throw new ApiException("手机号已存在");
         }
         SysAgency agency=user.getAgency();
@@ -471,7 +481,7 @@
             throw new ApiException("机构名称已存在");
         }
 
-        delCacheByUsername(user.getUsername());
+        delCacheByUsername(user.getUsername(),UserIdentityEnum.AGENCY.getCode());
         agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         agencyService.updateById(agency);
         user.setPassword(null);
@@ -490,7 +500,7 @@
         if(!checkUsernameUnique(user)){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(user)){
+        if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.EXPERT.getCode()))){
             throw new ApiException("手机号已存在");
         }
         String major=user.getMajor();
@@ -542,7 +552,7 @@
         if(!delIds.isEmpty()){
             attachService.deleteAttachsByIds(delIds);
         }
-        delCacheByUsername(user.getUsername());
+        delCacheByUsername(user.getUsername(),UserIdentityEnum.EXPERT.getCode());
         return row;
     }
 
@@ -554,7 +564,7 @@
         SysUser oldUser=checkUserDataScope(user.getId());
         SysUser newUser=new SysUser().setId(user.getId()).setPassword(JwtTokenUtil.encryptPassword(oldUser.getUsername(),originPsword,oldUser.getSalt()));
         newUser.setUpdateBy(ShiroUtils.getSysUser().getUsername());
-        delCacheByUsername(oldUser.getUsername());
+        delCacheByUsername(oldUser.getUsername(),oldUser.getIdentity());
         return updateById(newUser);
     }
 
@@ -571,8 +581,11 @@
 
     @Override
     public boolean checkPhoneUnique(SysUser user) {
+        if(user.getIdentity()==null){
+            throw new ApiException("用户身份不能为空");
+        }
         Long userId = user.getId()==null ? -1L : user.getId();
-        SysUser info = baseMapper.checkPhoneUnique(user.getPhone());
+        SysUser info = baseMapper.checkPhoneUnique(user.getPhone(),user.getIdentity());
         if (info!=null && info.getId().longValue() != userId.longValue())
         {
             return false;
@@ -625,7 +638,7 @@
         SysUser existUser=checkUserDataScope(user.getId());
         SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
         su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
-        delCacheByUsername(existUser.getUsername());
+        delCacheByUsername(existUser.getUsername(),existUser.getIdentity());
         return updateById(su);
     }
 
@@ -634,7 +647,7 @@
         SysUser existUser=checkUserDataScope(user.getId());
         SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
         su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
-        delCacheByUsername(existUser.getUsername());
+        delCacheByUsername(existUser.getUsername(),existUser.getIdentity());
         return updateById(su);
     }
 }
diff --git a/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml b/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml
index ac9b382..fae37a0 100644
--- a/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml
+++ b/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml
@@ -7,12 +7,18 @@
 
 
     <select id="getAccessoryFileByProjectId" resultType="com.gkhy.assess.system.domain.AssAccessoryFile">
-        select id,file_name,path,module_type,project_id,del_flag,origin_name,create_time from ass_accessory_file
+        select id,file_name,path,module_type,project_id,process_id,del_flag,origin_name,create_time from ass_accessory_file
         where project_id=#{projectId} and del_flag=0 and module_type=#{moduleType}
+        <if test="processId!=null and processId!=''">
+            and process_id=#{processId}
+        </if>
     </select>
 
     <select id="getAccessoryFileCountByProjectId" resultType="java.lang.Integer">
         select count(1) from ass_accessory_file
         where project_id=#{projectId} and del_flag=0 and module_type=#{moduleType}
+        <if test="processId!=null and processId!=''">
+            and process_id=#{processId}
+        </if>
     </select>
 </mapper>
diff --git a/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml b/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml
index 7512fc8..b0741e1 100644
--- a/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml
+++ b/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml
@@ -63,7 +63,7 @@
     </select>
 
     <select id="getFaceRecognitionByProjectId" resultMap="faceRecognitionResult">
-        select f.id,f.person_id,p.project_id,f.sign_path,f.insurance_path,
+        select f.id,p.person_id,p.project_id,f.sign_path,f.insurance_path,
                f.version,f.del_flag,f.create_by,f.create_time,f.update_by,f.update_time,f.remark,
                p.job_type,p.play_role,
                u.name as person_name,u.major as person_major,u.phone as person_phone,u.post as person_post,u.level as person_level,
@@ -75,6 +75,11 @@
         where p.project_id=#{projectId} and p.del_flag=0
     </select>
 
+    <select id="getSimpleFaceRecognitionByProjectId" resultType="com.gkhy.assess.system.domain.AssFaceRecognition">
+        select * from ass_face_recognition
+        where project_id=#{projectId} and del_flag=0
+    </select>
+
     <select id="getFaceRecognitionById" resultMap="faceRecognitionResult">
         <include refid="selectFaceRecognitionVo"/>
         where f.id=#{faceRecognitionId} and a.del_flag=0
diff --git a/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml b/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml
index 44c6e9d..e9f4d74 100644
--- a/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml
+++ b/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml
@@ -31,7 +31,7 @@
 
     <select id="getInvestigationByProjectId" resultMap="investigationResult">
         <include refid="selectInvestigationVo"/>
-        where project_id=#{projectId} and del_flag=0
+        where project_id=#{projectId} and del_flag=0 order by create_time desc
     </select>
 
     <select id="getInvestigationById" resultMap="investigationResult">
diff --git a/assess-system/src/main/resources/mapper/AssProjectMapper.xml b/assess-system/src/main/resources/mapper/AssProjectMapper.xml
index 5aa9f2a..6171261 100644
--- a/assess-system/src/main/resources/mapper/AssProjectMapper.xml
+++ b/assess-system/src/main/resources/mapper/AssProjectMapper.xml
@@ -35,6 +35,7 @@
         <result property="businessName"     column="business_name"      />
         <result property="leaderId"     column="leader_id"      />
         <result property="estimateTypeName"     column="estimate_type_name"      />
+        <result property="agencyName"     column="agency_name"      />
         <association property="leader" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
         <association property="contract" javaType="com.gkhy.assess.system.domain.AssContract" resultMap="contractResult" />
     </resultMap>
@@ -55,7 +56,7 @@
                p.actual_location,p.location,p.estimate_type,p.filing_date,
                p.credit_code,p.report_progress,p.phase,p.state,p.introduction,p.is_review,p.del_flag,p.create_by,p.create_time,
                p.update_by,p.update_time,p.remark,d1.label as business_name,d2.label as estimate_type_name,e.leader_id,u.name as leader_name,
-               c.id as contract_id,c.contract_money,c.actual_contract_money,
+               c.id as contract_id,c.contract_money,c.actual_contract_money,a.name as agency_name,
                (select count(*) from ass_project_material m where m.project_id=p.id and m.file_id is not null) as material_cnt
         from ass_project p
         left join ass_estimate_task e on e.project_id=p.id
@@ -63,6 +64,7 @@
         left join sys_dict_data  d1 on d1.id=p.business
         left join sys_dict_data  d2 on d2.id=p.estimate_type
         left join ass_contract c on c.project_id=p.id
+        left join sys_agency a on a.id=p.agency_id
     </sql>
 
 
diff --git a/assess-system/src/main/resources/mapper/SysAgencyMapper.xml b/assess-system/src/main/resources/mapper/SysAgencyMapper.xml
index 8afaa7e..b7f578b 100644
--- a/assess-system/src/main/resources/mapper/SysAgencyMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysAgencyMapper.xml
@@ -16,6 +16,7 @@
         <result property="manager"     column="manager"      />
         <result property="managerPhone"     column="manager_phone"      />
         <result property="certNumber"     column="cert_number"      />
+        <result property="certPath"     column="cert_path"      />
         <result property="issueDate"     column="issue_date"      />
         <result property="validDate"     column="valid_date"      />
         <result property="assetValue"     column="asset_value"      />
@@ -41,7 +42,7 @@
 
     <sql id="selectAgencyVo">
         select a.id,a.name,a.credit_code,a.attribute,a.province,a.city,a.district,a.address,a.web,a.legal_person,
-               a.legal_phone,a.manager,a.manager_phone,a.cert_number,a.issue_date,a.valid_date,a.asset_value,a.work_area,a.archive_area,
+               a.legal_phone,a.manager,a.manager_phone,a.cert_number,a.cert_path,a.issue_date,a.valid_date,a.asset_value,a.work_area,a.archive_area,
                a.reg_address,a.business,a.report_path,a.del_flag,a.publication,a.create_time,a.remark,
                b.id as user_id,b.username,b.phone
         from sys_agency a
diff --git a/assess-system/src/main/resources/mapper/SysUserMapper.xml b/assess-system/src/main/resources/mapper/SysUserMapper.xml
index 5ebd431..af9f852 100644
--- a/assess-system/src/main/resources/mapper/SysUserMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysUserMapper.xml
@@ -155,7 +155,7 @@
     </select>
 
     <select id="checkPhoneUnique" resultType="com.gkhy.assess.system.domain.SysUser">
-        select id,phone from sys_user where phone=#{phone} and del_flag=0 limit 1
+        select id,phone from sys_user where phone=#{phone} and identity=#{identity} and del_flag=0 limit 1
     </select>
 
     <select id="checkEmailUnique" resultType="com.gkhy.assess.system.domain.SysUser">
@@ -163,8 +163,8 @@
     </select>
 
     <select id="getUserByUsernamePhone" resultType="com.gkhy.assess.system.domain.SysUser">
-        select id,username,name,password,salt,identity,state,status,del_flag,agency_id from sys_user
-        where (username=#{username} or phone=#{username}) and del_flag=0
+        select id,username,name,password,salt,identity,id_photo,state,status,del_flag,agency_id from sys_user
+        where (username=#{username} or phone=#{username}) and del_flag=0 and identity=#{identity}
     </select>
 
 
diff --git a/pom.xml b/pom.xml
index 10f15ac..e6f7a16 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,7 +37,7 @@
         <mybatis-plus.version>3.5.1</mybatis-plus.version>
         <mysql-connector.version>8.0.29</mysql-connector.version>
         <java-jwt.version>3.11.0</java-jwt.version>
-        <fastjson.version>1.2.76</fastjson.version>
+        <fastjson.version>1.2.83</fastjson.version>
         <caffeine.version>2.9.3</caffeine.version>
         <kaptcha.version>2.3.2</kaptcha.version>
         <commons.io.version>2.13.0</commons.io.version>

--
Gitblit v1.9.2