From 983bdb5b89932b38d08a11ad1eed6ea89d1597e1 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期一, 29 一月 2024 10:07:31 +0800
Subject: [PATCH] 更新

---
 assess-admin/src/main/resources/application-dev.yml                                                 |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java       |   86 
 assess-admin/src/main/resources/application-pro.yml                                                 |   82 
 assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectStaticVO.java                   |   31 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssRecitificationService.java            |   50 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssContractController.java          |   56 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java           |  104 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java                      |   89 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java                          |   16 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecognitionService.java           |   67 
 assess-common/src/main/java/com/gkhy/assess/common/domain/vo/LoginBody.java                         |    2 
 assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql                         |    2 
 assess-admin/pom.xml                                                                                |   31 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java                        |   69 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java                    |    7 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssContractService.java                  |   45 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java           |   63 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssConclusionService.java                |   45 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRecitificationController.java    |   59 
 assess-system/src/test/java/com/gkhy/system/MybatisPlusGenerator.java                               |    8 
 assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql                        |    6 
 assess-admin/src/main/resources/db/migration/V20231123006_notice.sql                                |    4 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateScheduleServiceImpl.java |   71 
 assess-system/src/main/resources/mapper/SysRegionMapper.xml                                         |    0 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRiskEstimateServiceImpl.java     |   89 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysDictTypeMapper.java                    |    3 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java                          |   80 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java                            |   30 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimatePlanController.java      |   56 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssContractMapper.java                    |   40 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java         |   22 
 assess-framework/src/main/java/com/gkhy/assess/framework/aop/DataDesensitizationAspect.java         |   47 
 assess-system/src/main/java/com/gkhy/assess/system/domain/vo/PersonProjectVO.java                   |   22 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java               |   43 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java     |   61 
 assess-admin/src/main/resources/db/migration/V20231124002_attach.sql                                |    1 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java                          |   86 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMaterialMapper.java             |   39 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimatePlanService.java              |   44 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java       |    4 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectMaterialServiceImpl.java  |   91 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectService.java                   |  130 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecordMapper.java                  |   27 
 assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql                           |   15 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java                   |   72 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAttachMapper.java                      |    8 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppProjectController.java           |   58 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateTaskMapper.java                |   39 
 assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql                         |    2 
 assess-admin/src/main/resources/db/migration/V20231123007_law.sql                                   |    4 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java                           |  192 +
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java                     |  108 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAttachServiceImpl.java           |    5 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAgencyMapper.java                      |    6 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java                     |    6 
 pom.xml                                                                                             |    1 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java           |   27 
 assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql                             |    6 
 assess-system/src/main/java/com/gkhy/assess/system/enums/ReportProgressEnum.java                    |  141 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserController.java              |   44 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java                          |   18 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssWorkNotificationServiceImpl.java |   71 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java                       |   62 
 assess-admin/src/main/resources/db/migration/V20231130001_project.sql                               |   11 
 assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitizationType.java          |   19 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java             |   57 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java               |    6 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java   |    6 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java                        |   95 
 assess-system/src/main/resources/mapper/AssFilingApplyMapper.xml                                    |   37 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateTaskController.java      |   57 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java    |   93 
 assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql                           |    7 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssWorkNotificationMapper.java            |   38 
 assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql                      |    5 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConfirmFinalServiceImpl.java     |   36 
 assess-system/src/main/resources/mapper/SysDictTypeMapper.xml                                       |   14 
 assess-common/src/main/java/com/gkhy/assess/common/config/MybatisPlusConfig.java                    |    1 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java                      |   92 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssWorkNotificationService.java          |   44 
 assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql                       |   28 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java                            |   73 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecordController.java        |   60 
 assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java                           |   14 
 assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java                    |    3 
 assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml                                  |   18 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFilingApplyServiceImpl.java      |   66 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectMaterialService.java           |   46 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssConclusionMapper.java                  |   40 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProcessAuditMapper.java                |   38 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java             |   50 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserFaceController.java          |   39 
 assess-system/src/main/resources/mapper/SysExpertClassifyMapper.xml                                 |    0 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java                  |   29 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysConfig.java                            |   11 
 assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql                     |    1 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecognitionController.java   |   76 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java       |  105 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppPlanPersonController.java        |   39 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConfirmFinalController.java      |   44 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java              |   11 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java                             |  159 
 assess-system/src/main/resources/mapper/AssDeviceMapper.xml                                         |   42 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFilingApplyMapper.java                 |   25 
 assess-system/src/main/resources/mapper/AssRiskEstimateMapper.xml                                   |   59 
 assess-system/src/main/java/com/gkhy/assess/system/enums/PlayRoleEnum.java                          |   47 
 assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql                         |    3 
 assess-admin/src/test/java/com/gkhy/admin/RegionTest.java                                           |    4 
 assess-system/src/main/resources/mapper/AssEstimateScheduleMapper.xml                               |   17 
 assess-common/src/main/java/com/gkhy/assess/common/api/ResultCode.java                              |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java  |  131 
 assess-admin/src/main/resources/db/migration/V20240105002_change_dict_data.sql                      |   43 
 assess-system/src/main/java/com/gkhy/assess/system/enums/AccessoryFileTypeEnum.java                 |   41 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java         |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java     |  108 
 assess-system/src/main/resources/mapper/AssEstimateTaskMapper.xml                                   |   48 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConclusionController.java        |   56 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java                  |   78 
 assess-system/src/main/resources/mapper/AssAuditMapper.xml                                          |   71 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssDeviceServiceImpl.java           |  105 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssAuditService.java                     |   43 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssProcessAuditService.java              |   43 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java            |  106 
 assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java                          |   56 
 assess-system/src/main/resources/mapper/AssContractMapper.xml                                       |   42 
 assess-common/src/main/java/com/gkhy/assess/common/config/BaseRedisConfig.java                      |   24 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java         |   21 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecognitionController.java   |   58 
 assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java                         |    5 
 assess-admin/src/main/resources/db/migration/V20240109001_add_delflag.sql                           |   11 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java                    |   82 
 assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml                                |   68 
 assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java              |    6 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecordController.java        |   60 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserFaceMapper.java                    |   23 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateScheduleMapper.java            |   33 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java    |  125 
 assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml                                     |   75 
 assess-system/src/main/resources/mapper/AssProjectMapper.xml                                        |  235 +
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java       |   87 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAuditMapper.java                       |   42 
 assess-admin/src/main/resources/db/migration/V20231208003_filing_apply.sql                          |   17 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java                        |  104 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java       |   39 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java                        |   12 
 assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitization.java              |   13 
 assess-system/src/main/resources/mapper/AssEstimatePlanMapper.xml                                   |   50 
 assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java      |    3 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRiskEstimateMapper.java                |   48 
 assess-admin/src/main/resources/db/migration/V20231204001_device.sql                                |   27 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysAttachService.java                    |    9 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssContractServiceImpl.java         |   75 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java         |   50 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java              |   13 
 assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java                         |    8 
 assess-admin/src/main/resources/db/migration/V20240109002_user_face.sql                             |   17 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssConfirmFinalService.java              |   21 
 assess-system/src/main/resources/mapper/AssRecitificationMapper.xml                                 |   41 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppLoginController.java             |   43 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysCommonService.java                    |    8 
 assess-admin/src/main/resources/db/migration/V20231123004_config.sql                                |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java                               |   26 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java                  |    7 
 assess-system/src/main/resources/mapper/AssWorkNotificationMapper.xml                               |   41 
 assess-admin/src/main/resources/db/migration/V20231130003_contract.sql                              |    5 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java           |    9 
 assess-admin/src/main/resources/db/migration/V20231124001_region.sql                                |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java                              |   46 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java                     |   75 
 assess-admin/src/main/resources/db/migration/V20240105001_change_user.sql                           |    5 
 assess-framework/src/main/java/com/gkhy/assess/framework/shiro/filter/JwtFilter.java                |    3 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java             |  272 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java               |   41 
 assess-system/src/main/resources/mapper/SysConfigMapper.xml                                         |    0 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictDataServiceImpl.java         |   32 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java                    |   15 
 assess-system/src/main/resources/mapper/SysNoticeMapper.xml                                         |    3 
 assess-admin/src/main/resources/db/migration/V20231205005_audit.sql                                 |    3 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRecitificationServiceImpl.java   |   69 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java            |    8 
 assess-admin/src/main/resources/db/migration/V20231208002_face_recognition.sql                      |   19 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java          |  249 +
 assess-system/src/main/java/com/gkhy/assess/system/service/AssFilingApplyService.java               |   53 
 assess-system/src/main/resources/mapper/AssConclusionMapper.xml                                     |   39 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimatePlanMapper.java                |   39 
 assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql                              |   10 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateScheduleService.java          |   39 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssReviewRecordController.java      |   45 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java                   |   83 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssRiskEstimateService.java              |   45 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRiskEstimateController.java      |   57 
 assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql                     |    2 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java                  |   80 
 assess-system/src/main/resources/mapper/AssInvestigationMapper.xml                                  |   41 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java            |    4 
 assess-common/src/main/java/com/gkhy/assess/common/enums/SensitiveTypeEnum.java                     |   10 
 assess-system/src/main/resources/mapper/AssProjectMaterialMapper.xml                                |   50 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java     |  101 
 assess-system/src/main/resources/mapper/SysAgencyMapper.xml                                         |   13 
 assess-admin/src/main/resources/db/migration/V20240125001_change_region.sql                         |    2 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateScheduleController.java  |   50 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecordService.java                |   46 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppDictTypeController.java          |   30 
 assess-system/src/main/resources/mapper/SysUserFaceMapper.xml                                       |    8 
 assess-admin/src/main/resources/db/migration/V20231123005_agency.sql                                |    6 
 assess-system/src/main/java/com/gkhy/assess/system/enums/ProgressPhaseEnum.java                     |   51 
 assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml                                     |   24 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java                            |   21 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectMaterialController.java   |   54 
 assess-system/src/main/resources/mapper/SysAttachMapper.xml                                         |   19 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java             |   47 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssDeviceService.java                    |   66 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java                            |   19 
 assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java                          |    1 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java                      |   14 
 assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java                   |   39 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRecitificationMapper.java              |   28 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java                      |  144 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java     |   96 
 assess-admin/src/main/resources/application.yml                                                     |    4 
 assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql                           |   44 
 assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql                         |    1 
 assess-common/src/main/java/com/gkhy/assess/common/domain/TableSupport.java                         |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java                |   14 
 assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java                 |    4 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java                            |    2 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java           |    3 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java     |   61 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssDeviceMapper.java                      |   40 
 assess-common/src/main/java/com/gkhy/assess/common/enums/RequestSourceEnum.java                     |   29 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssReviewRecordService.java              |   11 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFilingApplyController.java       |   56 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssReviewRecordServiceImpl.java     |   24 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssPlanPersonController.java        |   69 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java          |    5 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssDeviceController.java            |   56 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java          |    9 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateTaskService.java              |   43 
 assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java                      |  184 
 assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java                |   66 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java     |   66 
 assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql                         |    2 
 assess-system/src/main/resources/mapper/SysLawMapper.xml                                            |    3 
 assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql                            |    3 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java            |    5 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAuditController.java             |   62 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java                     |   82 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssWorkNotificationController.java  |   55 
 assess-common/src/main/java/com/gkhy/assess/common/utils/DesenseUtil.java                           |   78 
 assess-system/src/main/resources/mapper/AssProcessAuditMapper.xml                                   |   80 
 assess-system/src/main/resources/mapper/SysUserMapper.xml                                           |   57 
 assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql                             |   16 
 assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectMaterialVO.java                 |   53 
 assess-system/src/main/resources/mapper/SysDictDataMapper.xml                                       |    7 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java     |   55 
 assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java                  |   47 
 assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java                        |   95 
 /dev/null                                                                                           |   38 
 assess-system/src/main/resources/mapper/AssFaceRecordMapper.xml                                     |   53 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java             |    2 
 assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProcessAuditController.java      |   60 
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java           |    7 
 assess-admin/src/main/resources/db/migration/V20231208001_recitification.sql                        |   20 
 263 files changed, 10,656 insertions(+), 513 deletions(-)

diff --git a/assess-admin/pom.xml b/assess-admin/pom.xml
index 3ac6c4b..e69bc5d 100644
--- a/assess-admin/pom.xml
+++ b/assess-admin/pom.xml
@@ -24,4 +24,35 @@
         </dependency>
     </dependencies>
 
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.5.15</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java b/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java
index b901f3e..17339e9 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java
@@ -8,7 +8,6 @@
 
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @ComponentScan("com.gkhy.assess")
-//@MapperScan("com.gkhy.**.mapper")
 public class GkhyAdminApplication {
 
     public static void main(String[] args) {
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
new file mode 100644
index 0000000..7d836a1
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppAccessoryFileController.java
@@ -0,0 +1,61 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.service.AssAccessoryFileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 评估文件上传记录表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "APP评估文件上传 前端控制器")
+@RestController
+@RequestMapping("/app/manage/accessory-file")
+public class AppAccessoryFileController {
+    @Autowired
+    private AssAccessoryFileService assAccessoryFileService;
+
+    @RepeatSubmit
+    @ApiOperation(value = "评估文件上传(图片/文件)")
+    @PostMapping("/uploadFile")
+    @ApiImplicitParams({
+            @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));
+    }
+
+    @ApiOperation(value = "根据项目id获取评估文件")
+    @GetMapping("/getAccessoryFileByProjectId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "projectId", 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));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除评估文件")
+    @DeleteMapping("/remove/{accessoryFileId}")
+    public CommonResult deleteAccessoryFile(@PathVariable(value = "accessoryFileId")Long accessoryFileId){
+        return CommonResult.success(assAccessoryFileService.deleteById(accessoryFileId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppDictTypeController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppDictTypeController.java
new file mode 100644
index 0000000..eb58ebe
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppDictTypeController.java
@@ -0,0 +1,30 @@
+package com.gkhy.assess.admin.controller.app;
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.SysDictType;
+import com.gkhy.assess.system.service.SysDictTypeService;
+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.*;
+
+@Api(tags = "APP数据字典类型前端控制器")
+@RestController
+@RequestMapping("/app/system/dictType")
+public class AppDictTypeController {
+    @Autowired
+    private SysDictTypeService dictTypeService;
+
+    @ApiOperation(value = "根据类型获取字典数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "dictType", dataType = "int", required = true, value = "类型")
+    })
+    @GetMapping("/getDictDataByType")
+    public CommonResult getDictDataByType(@RequestParam(required = true)String dictType){
+        return CommonResult.success(dictTypeService.getDictDataByType(dictType));
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecognitionController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecognitionController.java
new file mode 100644
index 0000000..d22a505
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecognitionController.java
@@ -0,0 +1,58 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.common.enums.RequestSourceEnum;
+import com.gkhy.assess.system.domain.AssFaceRecognition;
+import com.gkhy.assess.system.service.AssFaceRecognitionService;
+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-12 10:46:54
+ */
+@Api(tags = "APP签字确认 前端控制器")
+@RestController
+@RequestMapping("/app/manage/face-recognition")
+public class AppFaceRecognitionController {
+
+    @Autowired
+    private AssFaceRecognitionService faceRecognitionService;
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增签字确认")
+    @PostMapping("/add")
+    public CommonResult addContract(@Validated @ModelAttribute AssFaceRecognition faceRecognition){
+        return CommonResult.success(faceRecognitionService.addFaceRecognition(faceRecognition));
+    }
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "编辑签字确认")
+//    @PutMapping("/edit")
+//    public CommonResult editContract(@Validated @RequestBody AssFaceRecognition faceRecognition){
+//        return CommonResult.success(faceRecognitionService.editFaceRecognition(faceRecognition));
+//    }
+
+
+    @ApiOperation(value = "根据成员id获取签字确认")
+    @GetMapping("/getRecognitionByPersonId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "body", name = "personId", dataType = "long", required = true, value = "成员id")
+    })
+    public CommonResult getRecognitionByPersonId( Long projectId,Long personId){
+        return CommonResult.success(faceRecognitionService.getRecognitionByPersonId(projectId,personId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecordController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecordController.java
new file mode 100644
index 0000000..3e25cc9
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppFaceRecordController.java
@@ -0,0 +1,60 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.AssFaceRecord;
+import com.gkhy.assess.system.service.AssFaceRecordService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "APP人脸识别记录 前端控制器")
+@RestController
+@RequestMapping("/app/manage/face-record")
+public class AppFaceRecordController {
+
+    @Autowired
+    private AssFaceRecordService faceRecordService;
+
+//    @ApiOperation(value = "根据项目id获取人脸识别记录列表")
+//    @GetMapping("/getFaceByProjectId")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+//            @ApiImplicitParam(paramType = "body", name = "scene", dataType = "int", required = true, value = "是否是现场勘验人脸识别记录,0否,1是,默认0")
+//    })
+//    public CommonResult getFaceByProjectId(Long projectId,@RequestParam(defaultValue = "0",required = false) Integer scene){
+//        return CommonResult.success(faceRecordService.faceRecordList(projectId,scene));
+//    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增人脸识别记录")
+    @PostMapping("/add")
+    public CommonResult addDevice(@Validated @ModelAttribute AssFaceRecord faceRecord){
+        return CommonResult.success(faceRecordService.addFaceRecord(faceRecord));
+    }
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "编辑人脸识别记录")
+//    @PutMapping("/edit")
+//    public CommonResult editDevice(@Validated @RequestBody AssFaceRecord faceRecord){
+//        return CommonResult.success(faceRecordService.editFaceRecord(faceRecord));
+//    }
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "删除人脸识别记录")
+//    @DeleteMapping("/remove/{faceId}")
+//    public CommonResult deleteDevice(@PathVariable(value = "faceId")Long faceId){
+//        return CommonResult.success(faceRecordService.deleteById(faceId));
+//    }
+}
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
new file mode 100644
index 0000000..996883e
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppInvestigationController.java
@@ -0,0 +1,55 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.common.enums.ApproveStatusEnum;
+import com.gkhy.assess.common.enums.RequestSourceEnum;
+import com.gkhy.assess.system.domain.AssInvestigation;
+import com.gkhy.assess.system.service.AssInvestigationService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "APP现场勘验记录 前端控制器")
+@RestController
+@RequestMapping("/app/manage/investigation")
+public class AppInvestigationController {
+
+    @Autowired
+    private AssInvestigationService investigationService;
+
+    @ApiOperation(value = "根据项目id获取现场勘验记录表详情")
+    @GetMapping("/getInvestigationByProjectId")
+    public CommonResult getInvestigationByProjectId( Long projectId){
+        return CommonResult.success(investigationService.getInvestigationByProjectId(projectId));
+    }
+
+    @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()));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑现场勘验记录表")
+    @PutMapping("/edit")
+    public CommonResult editInvestigation(@Validated @RequestBody AssInvestigation investigation){
+        return CommonResult.success(investigationService.editInvestigation(investigation));
+    }
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppLoginController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppLoginController.java
new file mode 100644
index 0000000..6e2e360
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppLoginController.java
@@ -0,0 +1,43 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.common.domain.vo.LoginBody;
+import com.gkhy.assess.system.service.SysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-10-17 14:26:29
+ */
+@Api(tags = "APP用户登录前端控制器")
+@RestController
+@RequestMapping("/app/system/account")
+public class AppLoginController {
+    @Autowired
+    private SysUserService sysUserService;
+
+    @ApiOperation(value = "用户登录")
+    @PostMapping("/login")
+    public CommonResult login(@RequestBody LoginBody loginBody){
+        return CommonResult.success(sysUserService.appLogin(loginBody));
+    }
+
+    @ApiOperation(value = "用户退出")
+    @PostMapping("/logout")
+    public CommonResult logout(){
+        sysUserService.logout();
+        return CommonResult.success();
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppPlanPersonController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppPlanPersonController.java
new file mode 100644
index 0000000..f8fb1ff
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppPlanPersonController.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.service.AssPlanPersonService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 评价项目组成员表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "APP项目组成员 前端控制器")
+@RestController
+@RequestMapping("/app/manage/plan-person")
+public class AppPlanPersonController {
+
+    @Autowired
+    private AssPlanPersonService planPersonService;
+
+    @ApiOperation(value = "根据成员id获取项目组成员详细信息")
+    @GetMapping("/getPlanPersonByPersonId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "body", name = "personId", dataType = "long", required = true, value = "项目成员id")
+    })
+    public CommonResult<AssPlanPerson> getPlanPersonByProjectId( Long personId,Long projectId){
+        return CommonResult.success(planPersonService.getPlanPersonByPersonId(personId,projectId));
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppProjectController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppProjectController.java
new file mode 100644
index 0000000..e1898d0
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppProjectController.java
@@ -0,0 +1,58 @@
+package com.gkhy.assess.admin.controller.app;
+
+
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.service.AssProjectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 现场勘验人员人脸识别记录表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "APP项目 前端控制器")
+@RestController
+@RequestMapping("/app/manage/project")
+public class AppProjectController {
+
+    @Autowired
+    private AssProjectService projectService;
+
+    @ApiOperation(value = "根据项目成员id获取项目列表")
+    @GetMapping("/memberProjects")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = true, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = true, value = "每页数量,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "personId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "query", name = "finish", dataType = "int", required = false, value = "是否完结:0否,1是")
+    })
+    public CommonResult memberProjects(@RequestParam(required = true) Long personId,@RequestParam(required = false)Integer finish){
+        return CommonResult.success(projectService.memberProjects(personId,finish));
+    }
+
+    @ApiOperation(value = "根据项目组长id获取项目列表")
+    @GetMapping("/leaderProjects")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = true, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = true, value = "每页数量,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "personId", dataType = "long", required = true, value = "项目id")
+    })
+    public CommonResult leaderProjects(@RequestParam(required = true) Long personId){
+        return CommonResult.success(projectService.leaderProjects(personId));
+    }
+
+    @ApiOperation(value = "根据id获取项目详情")
+    @GetMapping("/detail/{projectId}")
+    public CommonResult projectDetail(@PathVariable(value = "projectId") Long projectId){
+        return CommonResult.success(projectService.getProjectById(projectId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserController.java
new file mode 100644
index 0000000..2fc187c
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserController.java
@@ -0,0 +1,44 @@
+package com.gkhy.assess.admin.controller.app;
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.common.validate.AgencyGroup;
+import com.gkhy.assess.common.validate.ExpertGroup;
+import com.gkhy.assess.common.validate.MonitorGroup;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.service.SysUserService;
+import io.swagger.annotations.Api;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "APP用户前端控制器")
+@RestController
+@RequestMapping("/app/system/user")
+public class AppUserController {
+    @Autowired
+    private SysUserService sysUserService;
+
+    @ApiOperation(value = "根据id获取用户详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "userId", dataType = "int", required = true, value = "用户id")
+    })
+    @GetMapping("/getUserById")
+    public CommonResult getUserById(@RequestParam(required = true) Long userId){
+        return CommonResult.success(sysUserService.getUserInfoById(userId));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "用户修改密码")
+    @PutMapping("/resetUserPwd")
+    public CommonResult resetUserPwd(@RequestBody SysUser user)
+    {
+        return CommonResult.success(sysUserService.resetUserPwd(user));
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserFaceController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserFaceController.java
new file mode 100644
index 0000000..b869bb7
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/app/AppUserFaceController.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.admin.controller.app;
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.SysUserFace;
+import com.gkhy.assess.system.service.SysUserFaceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "APP人脸数据控制器")
+@RestController
+@RequestMapping("/app/system/user-face")
+public class AppUserFaceController {
+    @Autowired
+    private SysUserFaceService userFaceService;
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增人脸数据")
+    @PostMapping("/add")
+    public CommonResult addUserFace(@Validated @ModelAttribute SysUserFace userFace){
+        return CommonResult.success(userFaceService.addUserFace(userFace));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "根据用户id获取人脸数据")
+    @PostMapping("/getFaceByUserId")
+    public CommonResult getUserFace(Long userId){
+        return CommonResult.success(userFaceService.getFaceByUserId(userId));
+    }
+
+}
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
new file mode 100644
index 0000000..be5100b
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAccessoryFileController.java
@@ -0,0 +1,61 @@
+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.service.AssAccessoryFileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 评估文件上传记录表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "评估文件上传前端控制器")
+@RestController
+@RequestMapping("/manage/accessory-file")
+public class AssAccessoryFileController {
+    @Autowired
+    private AssAccessoryFileService assAccessoryFileService;
+
+    @RepeatSubmit
+    @ApiOperation(value = "评估文件上传(图片/文件)")
+    @PostMapping("/uploadFile")
+    @ApiImplicitParams({
+            @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));
+    }
+
+    @ApiOperation(value = "根据项目id获取评估文件")
+    @GetMapping("/getAccessoryFileByProjectId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "projectId", 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));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除评估文件")
+    @DeleteMapping("/remove/{accessoryFileId}")
+    public CommonResult deleteAccessoryFile(@PathVariable(value = "accessoryFileId")Long accessoryFileId){
+        return CommonResult.success(assAccessoryFileService.deleteById(accessoryFileId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAuditController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAuditController.java
new file mode 100644
index 0000000..17034d2
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssAuditController.java
@@ -0,0 +1,62 @@
+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.AssAudit;
+import com.gkhy.assess.system.service.AssAuditService;
+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-12 10:46:54
+ */
+@Api(tags = "内部审核-技术审核前端控制器")
+@RestController
+@RequestMapping("/manage/ass-audit")
+public class AssAuditController {
+
+    @Autowired
+    private AssAuditService auditService;
+
+    @ApiOperation(value = "根据id获取审核详情")
+    @GetMapping("/detail/{auditId}")
+    public CommonResult auditDetail(@PathVariable(value = "auditId") Long auditId){
+        return CommonResult.success(auditService.getAuditById(auditId));
+    }
+
+    @ApiOperation(value = "根据项目id获取审核详情")
+    @GetMapping("/getAuditByProjectId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "body", name = "auditType", dataType = "int", required = true, value = "审核类型:1内部审核 2技术审核")
+    })
+    public CommonResult getAuditByProjectId(Long projectId,Integer auditType){
+        return CommonResult.success(auditService.getAuditByProjectId(projectId,auditType));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建审核")
+    @PostMapping("/add")
+    public CommonResult addRiskEstimate(@Validated @RequestBody AssAudit audit){
+        return CommonResult.success(auditService.addAudit(audit));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑审核")
+    @PutMapping("/edit")
+    public CommonResult editRiskEstimate(@Validated @RequestBody AssAudit audit){
+        return CommonResult.success(auditService.editAudit(audit));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConclusionController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConclusionController.java
new file mode 100644
index 0000000..221b643
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConclusionController.java
@@ -0,0 +1,56 @@
+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.AssConclusion;
+import com.gkhy.assess.system.service.AssConclusionService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "评价结论表 前端控制器")
+@RestController
+@RequestMapping("/manage/conclusion")
+public class AssConclusionController {
+    @Autowired
+    private AssConclusionService conclusionService;
+
+    @ApiOperation(value = "根据id获取评价结论详情")
+    @GetMapping("/detail/{conclusionId}")
+    public CommonResult conclusionDetail(@PathVariable(value = "conclusionId") Long conclusionId){
+        return CommonResult.success(conclusionService.getConclusionById(conclusionId));
+    }
+
+    @ApiOperation(value = "根据项目id获取评价结论详情")
+    @GetMapping("/getConclusionByProjectId")
+    public CommonResult getConclusionByProjectId( Long projectId){
+        return CommonResult.success(conclusionService.getConclusionByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建评价结论")
+    @PostMapping("/add")
+    public CommonResult addConclusion(@Validated @RequestBody AssConclusion conclusion){
+        return CommonResult.success(conclusionService.addConclusion(conclusion));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑评价结论")
+    @PutMapping("/edit")
+    public CommonResult editConclusion(@Validated @RequestBody AssConclusion conclusion){
+        return CommonResult.success(conclusionService.editConclusion(conclusion));
+    }
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConfirmFinalController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConfirmFinalController.java
new file mode 100644
index 0000000..d7a59c5
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssConfirmFinalController.java
@@ -0,0 +1,44 @@
+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.service.AssConfirmFinalService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 确认完结 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-1-4 10:46:54
+ */
+@Api(tags = "确认完结 前端控制器")
+@RestController
+@RequestMapping("/manage/confirm")
+public class AssConfirmFinalController {
+    @Autowired
+    private AssConfirmFinalService confirmFinalService;
+
+    @RepeatSubmit
+    @ApiOperation(value = "确认完结")
+    @PostMapping("/doConfirm")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+    })
+    public CommonResult doConfirm(@RequestBody Map map){
+        confirmFinalService.doConfirmFinal(map);
+        return CommonResult.success();
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssContractController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssContractController.java
new file mode 100644
index 0000000..bdfd259
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssContractController.java
@@ -0,0 +1,56 @@
+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.AssContract;
+import com.gkhy.assess.system.service.AssContractService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "合同管理前端控制器")
+@RestController
+@RequestMapping("/manage/contract")
+public class AssContractController {
+    @Autowired
+    private AssContractService contractService;
+
+    @ApiOperation(value = "根据id获取合同详情")
+    @GetMapping("/detail/{contractId}")
+    public CommonResult contractDetail(@PathVariable(value = "contractId") Long contractId){
+        return CommonResult.success(contractService.getContractById(contractId));
+    }
+
+    @ApiOperation(value = "根据项目id获取合同详情")
+    @GetMapping("/getContractByProjectId")
+    public CommonResult getContractByProjectId( Long projectId){
+        return CommonResult.success(contractService.getContractByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建合同")
+    @PostMapping("/add")
+    public CommonResult addContract(@Validated @RequestBody AssContract contract){
+        return CommonResult.success(contractService.addContract(contract));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑合同")
+    @PutMapping("/edit")
+    public CommonResult editContract(@Validated @RequestBody AssContract contract){
+        return CommonResult.success(contractService.editContract(contract));
+    }
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssDeviceController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssDeviceController.java
new file mode 100644
index 0000000..e4dfe3b
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssDeviceController.java
@@ -0,0 +1,56 @@
+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.AssDevice;
+import com.gkhy.assess.system.service.AssDeviceService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "设备 前端控制器")
+@RestController
+@RequestMapping("/manage/device")
+public class AssDeviceController {
+
+    @Autowired
+    private AssDeviceService deviceService;
+
+    @ApiOperation(value = "根据项目id获取设备列表")
+    @GetMapping("/getDeviceByProjectId")
+    public CommonResult getDeviceByProjectId(Long projectId){
+        return CommonResult.success(deviceService.getByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增设备")
+    @PostMapping("/add")
+    public CommonResult addDevice(@Validated @RequestBody AssDevice device){
+        return CommonResult.success(deviceService.addDevice(device));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑设备")
+    @PutMapping("/edit")
+    public CommonResult editDevice(@Validated @RequestBody AssDevice device){
+        return CommonResult.success(deviceService.editDevice(device));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除设备")
+    @DeleteMapping("/remove/{deviceId}")
+    public CommonResult deleteDevice(@PathVariable(value = "deviceId")Long deviceId){
+        return CommonResult.success(deviceService.deleteById(deviceId));
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimatePlanController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimatePlanController.java
new file mode 100644
index 0000000..c9452b9
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimatePlanController.java
@@ -0,0 +1,56 @@
+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.AssEstimatePlan;
+import com.gkhy.assess.system.service.AssEstimatePlanService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "评价项目计划 前端控制器")
+@RestController
+@RequestMapping("/manage/estimate-plan")
+public class AssEstimatePlanController {
+    @Autowired
+    private AssEstimatePlanService estimatePlanService;
+
+    @ApiOperation(value = "根据id获取评价计划详情")
+    @GetMapping("/detail/{planId}")
+    public CommonResult planDetail(@PathVariable(value = "planId") Long planId){
+        return CommonResult.success(estimatePlanService.getEstimatePlanById(planId));
+    }
+
+    @ApiOperation(value = "根据项目id获取评价计划详情")
+    @GetMapping("/getPlanByProjectId")
+    public CommonResult getPlanByProjectId( Long projectId){
+        return CommonResult.success(estimatePlanService.getEstimatePlanByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建评价计划")
+    @PostMapping("/add")
+    public CommonResult addPlan(@Validated @RequestBody AssEstimatePlan estimatePlan){
+        return CommonResult.success(estimatePlanService.addEstimatePlan(estimatePlan));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑评价计划")
+    @PutMapping("/edit")
+    public CommonResult editPlan(@Validated @RequestBody AssEstimatePlan estimatePlan){
+        return CommonResult.success(estimatePlanService.editEstimatePlan(estimatePlan));
+    }
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateScheduleController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateScheduleController.java
new file mode 100644
index 0000000..5188808
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateScheduleController.java
@@ -0,0 +1,50 @@
+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.AssEstimateSchedule;
+import com.gkhy.assess.system.service.AssEstimateScheduleService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "评价日程安排 前端控制器")
+@RestController
+@RequestMapping("/manage/estimate-schedule")
+public class AssEstimateScheduleController {
+
+    @Autowired
+    private AssEstimateScheduleService estimateScheduleService;
+
+    @ApiOperation(value = "根据项目id获取评价日程安排")
+    @GetMapping("/getScheduleByProjectId")
+    public CommonResult getScheduleByProjectId(Long projectId){
+        return CommonResult.success(estimateScheduleService.getByProjectId(projectId));
+    }
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "新增评价日程安排")
+//    @PostMapping("/add")
+//    public CommonResult addSchedule(@Validated @RequestBody AssEstimateSchedule estimateSchedule){
+//        return CommonResult.success(estimateScheduleService.addSchedule(estimateSchedule));
+//    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑评价日程安排")
+    @PutMapping("/edit")
+    public CommonResult editSchedule(@Validated @RequestBody AssEstimateSchedule estimateSchedule){
+        return CommonResult.success(estimateScheduleService.editSchedule(estimateSchedule));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateTaskController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateTaskController.java
new file mode 100644
index 0000000..b3231cd
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssEstimateTaskController.java
@@ -0,0 +1,57 @@
+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.AssEstimateTask;
+import com.gkhy.assess.system.service.AssEstimateTaskService;
+import io.swagger.annotations.Api;
+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>
+ * xi表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "评价任务通知 前端控制器")
+@RestController
+@RequestMapping("/manage/estimate-task")
+public class AssEstimateTaskController {
+
+    @Autowired
+    private AssEstimateTaskService estimateTaskService;
+
+    @ApiOperation(value = "根据id获取评价任务通知详情")
+    @GetMapping("/detail/{taskId}")
+    public CommonResult taskDetail(@PathVariable(value = "taskId") Long taskId){
+        return CommonResult.success(estimateTaskService.getEstimateTaskById(taskId));
+    }
+
+    @ApiOperation(value = "根据项目id获取评价任务通知")
+    @GetMapping("/getTaskByProjectId")
+    public CommonResult getTaskByProjectId( Long projectId){
+        return CommonResult.success(estimateTaskService.getEstimateTaskByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建评价任务通知")
+    @PostMapping("/add")
+    public CommonResult addTask(@Validated @RequestBody AssEstimateTask estimateTask){
+        return CommonResult.success(estimateTaskService.addEstimateTask(estimateTask));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑评价任务通知")
+    @PutMapping("/edit")
+    public CommonResult editTask(@Validated @RequestBody AssEstimateTask estimateTask){
+        return CommonResult.success(estimateTaskService.editEstimateTask(estimateTask));
+    }
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecognitionController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecognitionController.java
new file mode 100644
index 0000000..3c1e389
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecognitionController.java
@@ -0,0 +1,76 @@
+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.service.AssFaceRecognitionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 签字确认表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "签字确认 前端控制器")
+@RestController
+@RequestMapping("/manage/face-recognition")
+public class AssFaceRecognitionController {
+    @Autowired
+    private AssFaceRecognitionService faceRecognitionService;
+
+    @ApiOperation(value = "根据项目id获取签字确认列表")
+    @GetMapping("/getRecognitionByProjectId")
+    public CommonResult getRecognitionByProjectId( Long projectId){
+        return CommonResult.success(faceRecognitionService.getFaceRecognitionByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "签字确认项目状态流转")
+    @PostMapping("/doProcess")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+    })
+    public CommonResult doProcess(@RequestBody Map map){
+        faceRecognitionService.doFaceRecognition(map);
+        return CommonResult.success();
+    }
+//
+//    @RepeatSubmit
+//    @ApiOperation(value = "编辑签字确认")
+//    @PutMapping("/edit")
+//    public CommonResult editContract(@Validated @RequestBody AssFaceRecognition faceRecognition){
+//        return CommonResult.success(faceRecognitionService.editFaceRecognition(faceRecognition));
+//    }
+
+
+    @ApiOperation(value = "根据成员id获取签字确认")
+    @GetMapping("/getRecognitionByPersonId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "body", name = "personId", dataType = "long", required = true, value = "成员id")
+    })
+    public CommonResult getRecognitionByPersonId( Long projectId,Long personId){
+        return CommonResult.success(faceRecognitionService.getRecognitionByPersonId(projectId,personId));
+    }
+
+
+    @ApiOperation(value = "根据项目id校验所有人是否签字确认")
+    @PostMapping("/checkAllFaceRecongnition")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id")
+    })
+    public CommonResult checkAllFaceRecongnition(@RequestBody Long projectId){
+        return CommonResult.success(faceRecognitionService.checkAllFaceRecongnition(projectId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecordController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecordController.java
new file mode 100644
index 0000000..1e05715
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFaceRecordController.java
@@ -0,0 +1,60 @@
+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.service.AssFaceRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 现场勘验人员人脸识别记录表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "人脸识别 前端控制器")
+@RestController
+@RequestMapping("/manage/face-record")
+public class AssFaceRecordController {
+
+    @Autowired
+    private AssFaceRecordService faceRecordService;
+
+    @ApiOperation(value = "根据项目id获取人脸识别记录列表")
+    @GetMapping("/getFaceByProjectId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "body", name = "scene", dataType = "int", required = true, value = "是否是现场勘验人脸识别记录,0否,1是,默认1")
+    })
+    public CommonResult getFaceByProjectId(Long projectId,@RequestParam(defaultValue = "1",required = false) Integer scene){
+        return CommonResult.success(faceRecordService.faceRecordList(projectId,scene));
+    }
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "新增人脸识别记录")
+//    @PostMapping("/add")
+//    public CommonResult addDevice(@Validated @RequestBody AssFaceRecord faceRecord){
+//        return CommonResult.success(faceRecordService.addFaceRecord(faceRecord));
+//    }
+//
+//    @RepeatSubmit
+//    @ApiOperation(value = "编辑人脸识别记录")
+//    @PutMapping("/edit")
+//    public CommonResult editDevice(@Validated @RequestBody AssFaceRecord faceRecord){
+//        return CommonResult.success(faceRecordService.editFaceRecord(faceRecord));
+//    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除人脸识别记录")
+    @DeleteMapping("/remove/{faceId}")
+    public CommonResult deleteDevice(@PathVariable(value = "faceId")Long faceId){
+        return CommonResult.success(faceRecordService.deleteById(faceId));
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFilingApplyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFilingApplyController.java
new file mode 100644
index 0000000..5c04160
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssFilingApplyController.java
@@ -0,0 +1,56 @@
+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.AssFilingApply;
+import com.gkhy.assess.system.service.AssFilingApplyService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "报备申请 前端控制器")
+@RestController
+@RequestMapping("/manage/filing-apply")
+public class AssFilingApplyController {
+
+    @Autowired
+    private AssFilingApplyService filingApplyService;
+
+    @ApiOperation(value = "根据项目id获取报备申请列表")
+    @GetMapping("/getApplyByProjectId")
+    public CommonResult getApplyByProjectId(Long projectId){
+        return CommonResult.success(filingApplyService.getFilingApplyByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增报备申请")
+    @PostMapping("/add")
+    public CommonResult addApply(@Validated @RequestBody AssFilingApply filingApply){
+        return CommonResult.success(filingApplyService.addFilingApply(filingApply));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑报备申请")
+    @PutMapping("/edit")
+    public CommonResult editApply(@Validated @RequestBody AssFilingApply filingApply){
+        return CommonResult.success(filingApplyService.editFilingApply(filingApply));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除报备申请")
+    @DeleteMapping("/remove/{applyId}")
+    public CommonResult deleteApply(@PathVariable(value = "applyId")Long applyId){
+        return CommonResult.success(filingApplyService.deleteById(applyId));
+    }
+}
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
new file mode 100644
index 0000000..8fadb5b
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssInvestigationController.java
@@ -0,0 +1,66 @@
+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.common.enums.RequestSourceEnum;
+import com.gkhy.assess.system.domain.AssInvestigation;
+import com.gkhy.assess.system.service.AssInvestigationService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "现场勘验记录 前端控制器")
+@RestController
+@RequestMapping("/manage/investigation")
+public class AssInvestigationController {
+
+    @Autowired
+    private AssInvestigationService investigationService;
+
+    @ApiOperation(value = "根据id获取现场勘验记录表详情")
+    @GetMapping("/detail/{investigationId}")
+    public CommonResult investigationDetail(@PathVariable(value = "investigationId") Long investigationId){
+        return CommonResult.success(investigationService.getInvestigationByProjectId(investigationId));
+    }
+
+    @ApiOperation(value = "根据项目id获取现场勘验记录表详情")
+    @GetMapping("/getInvestigationByProjectId")
+    public CommonResult getInvestigationByProjectId( Long projectId){
+        return CommonResult.success(investigationService.getInvestigationByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建现场勘验记录表")
+    @PostMapping("/add")
+    public CommonResult addInvestigation(@Validated @RequestBody AssInvestigation investigation){
+        return CommonResult.success(investigationService.addInvestigation(investigation, RequestSourceEnum.WEB.getCode()));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑现场勘验记录表")
+    @PutMapping("/edit")
+    public CommonResult editInvestigation(@Validated @RequestBody AssInvestigation investigation){
+        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/AssPlanPersonController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssPlanPersonController.java
new file mode 100644
index 0000000..f5837d2
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssPlanPersonController.java
@@ -0,0 +1,69 @@
+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.AssPlanPerson;
+import com.gkhy.assess.system.service.AssPlanPersonService;
+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-12 10:46:54
+ */
+@Api(tags = "项目组成员 前端控制器")
+@RestController
+@RequestMapping("/manage/plan-person")
+public class AssPlanPersonController {
+
+    @Autowired
+    private AssPlanPersonService planPersonService;
+
+    @ApiOperation(value = "根据项目id获取项目组成员")
+    @GetMapping("/getPlanPersonByProjectId")
+    public CommonResult getPlanPersonByProjectId( Long projectId){
+        return CommonResult.success(planPersonService.getByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增项目组成成员")
+    @PostMapping("/add")
+    public CommonResult addPlanPerson(@Validated @RequestBody AssPlanPerson planPerson){
+        return CommonResult.success(planPersonService.addPlanPerson(planPerson));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑项目组成成员")
+    @PutMapping("/edit")
+    public CommonResult editPlan(@RequestBody AssPlanPerson planPerson){
+        return CommonResult.success(planPersonService.editPlanPerson(planPerson));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除项目组成成员")
+    @DeleteMapping("/remove/{planPersonId}")
+    public CommonResult deletePlan(@PathVariable(value = "planPersonId")Long planPersonId){
+        return CommonResult.success(planPersonService.deletePlanPersonById(planPersonId));
+    }
+
+    @ApiOperation(value = "根据成员id获取项目组成员详细信息(校验)")
+    @GetMapping("/getPlanPersonByPersonId")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+            @ApiImplicitParam(paramType = "body", name = "personId", dataType = "long", required = true, value = "项目成员id")
+    })
+    public CommonResult getPlanPersonByProjectId( Long personId,Long projectId){
+        return CommonResult.success(planPersonService.getPlanPersonByPersonId(personId,projectId));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProcessAuditController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProcessAuditController.java
new file mode 100644
index 0000000..9f82581
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProcessAuditController.java
@@ -0,0 +1,60 @@
+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.AssPlanPerson;
+import com.gkhy.assess.system.domain.AssProcessAudit;
+import com.gkhy.assess.system.service.AssProcessAuditService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "过程控制负责人审核 前端控制器")
+@RestController
+@RequestMapping("/manage/process-audit")
+public class AssProcessAuditController {
+
+    @Autowired
+    private AssProcessAuditService processAuditService;
+
+    @ApiOperation(value = "根据id获取过程控制详情")
+    @GetMapping("/detail/{processId}")
+    public CommonResult processDetail(@PathVariable(value = "processId") Long processId){
+        return CommonResult.success(processAuditService.getProcessAuditById(processId));
+    }
+
+    @ApiOperation(value = "根据项目id获取过程控制详情")
+    @GetMapping("/getProcessByProjectId")
+    public CommonResult getProcessByProjectId( Long projectId){
+        return CommonResult.success(processAuditService.getProcessAuditByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建过程控制")
+    @PostMapping("/add")
+    public CommonResult addProcess(@Validated @RequestBody AssProcessAudit processAudit){
+        return CommonResult.success(processAuditService.addProcessAudit(processAudit));
+    }
+
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑过程控制")
+    @PutMapping("/edit")
+    public CommonResult editProcess(@Validated @RequestBody AssProcessAudit processAudit){
+        return CommonResult.success(processAuditService.editProcessAudit(processAudit));
+    }
+
+
+}
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
new file mode 100644
index 0000000..9bdaf66
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectController.java
@@ -0,0 +1,104 @@
+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.AssProject;
+import com.gkhy.assess.system.service.AssProjectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 项目表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-11 14:16:18
+ */
+@Api(tags = "项目前端控制器")
+@RestController
+@RequestMapping("/manage/project")
+public class AssProjectController {
+    @Autowired
+    private AssProjectService projectService;
+
+    @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"),
+            @ApiImplicitParam(paramType = "query", name = "projectPhase", dataType = "int", required = false, value = "params字段内:1风险分析评价计划,2现场勘验,3项目审核,4出具报告,5项目归档")
+    })
+    @GetMapping("/list")
+    public CommonResult projectList(AssProject project){
+        return CommonResult.success(projectService.projectList(project));
+    }
+
+    @ApiOperation(value = "根据id获取项目详情")
+    @GetMapping("/detail/{projectId}")
+    public CommonResult projectDetail(@PathVariable(value = "projectId") Long projectId){
+        return CommonResult.success(projectService.getProjectById(projectId));
+    }
+
+
+    @ApiOperation(value = "根据id获取项目当前状态")
+    @GetMapping("/progress/{projectId}")
+    public CommonResult getProjectProgress(@PathVariable(value = "projectId") Long projectId){
+        return CommonResult.success(projectService.getProjectReportProgress(projectId));
+    }
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "创建项目")
+//    @PostMapping("/add")
+//    public CommonResult addProject(@Validated @RequestBody AssProject project){
+//        return CommonResult.success(projectService.addProject(project));
+//    }
+
+
+
+//    @RepeatSubmit
+//    @ApiOperation(value = "编辑项目")
+//    @PutMapping("/edit")
+//    public CommonResult editProject(@RequestBody AssProject project){
+//        return CommonResult.success(projectService.editProject(project));
+//    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除项目")
+    @DeleteMapping("/remove/{projectId}")
+    public CommonResult deleteProject(@PathVariable(value = "projectId")Long projectId){
+        return CommonResult.success(projectService.deleteProjectById(projectId));
+    }
+
+
+    @ApiOperation(value = "校验项目名称是否唯一")
+    @PostMapping("/checkProjectNameUnique")
+    public CommonResult checkProjectNameUnique(@RequestBody AssProject project)
+    {
+        return CommonResult.success(projectService.checkNameUnique(project));
+    }
+
+
+    @ApiOperation(value = "项目统计")
+    @GetMapping("/statistics")
+    public CommonResult projectStat(AssProject project){
+        return CommonResult.success(projectService.projectStat(project));
+    }
+
+    @ApiOperation(value = "根据项目成员id获取项目列表")
+    @GetMapping("/memberProjects")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = true, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = true, value = "每页数量,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "personId", dataType = "long", required = true, value = "项目id")
+    })
+    public CommonResult memberProjects(@RequestParam(required = true) Long personId){
+        return CommonResult.success(projectService.memberProjects(personId,null));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectMaterialController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectMaterialController.java
new file mode 100644
index 0000000..947b18a
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssProjectMaterialController.java
@@ -0,0 +1,54 @@
+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.AssProjectMaterial;
+import com.gkhy.assess.system.domain.vo.ProjectMaterialVO;
+import com.gkhy.assess.system.service.AssProjectMaterialService;
+import io.swagger.annotations.Api;
+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.List;
+
+/**
+ * <p>
+ * 项目归档文件表 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Api(tags = "项目归档文件 前端控制器")
+@RestController
+@RequestMapping("/manage/project-material")
+public class AssProjectMaterialController {
+
+    @Autowired
+    private AssProjectMaterialService projectMaterialService;
+
+
+    @ApiOperation(value = "根据项目id获取归档材料")
+    @GetMapping("/getMaterialByProjectId")
+    public CommonResult getMaterialByProjectId( Long projectId){
+        return CommonResult.success(projectMaterialService.getProjectMaterialByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "批量创建归档材料")
+    @PostMapping("/add")
+    public CommonResult addMaterial(@Validated @RequestBody ProjectMaterialVO projectMaterialVO){
+        return CommonResult.success(projectMaterialService.addProjectMaterial(projectMaterialVO));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "批量编辑归档材料")
+    @PutMapping("/edit")
+    public CommonResult editContract(@Validated @RequestBody ProjectMaterialVO projectMaterialVO){
+        return CommonResult.success(projectMaterialService.editProjectMaterial(projectMaterialVO));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRecitificationController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRecitificationController.java
new file mode 100644
index 0000000..f9e5615
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRecitificationController.java
@@ -0,0 +1,59 @@
+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.AssRecitification;
+import com.gkhy.assess.system.service.AssRecitificationService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "整改情况 前端控制器")
+@RestController
+@RequestMapping("/manage/recitification")
+public class AssRecitificationController {
+    @Autowired
+    private AssRecitificationService recitificationService;
+
+    @ApiOperation(value = "根据项目id获取整改情况列表")
+    @GetMapping("/getRectifyByProjectId")
+    public CommonResult getRectifyByProjectId(Long projectId){
+        return CommonResult.success(recitificationService.recitificationList(projectId));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建整改情况")
+    @PostMapping("/add")
+    public CommonResult addRecitification(@Validated @RequestBody AssRecitification recitification){
+        return CommonResult.success(recitificationService.addRecitification(recitification));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑整改情况")
+    @PutMapping("/edit")
+    public CommonResult editRecitification(@Validated @RequestBody AssRecitification recitification){
+        return CommonResult.success(recitificationService.editRecitification(recitification));
+    }
+
+
+    @RepeatSubmit
+    @ApiOperation(value = "删除整改情况")
+    @DeleteMapping("/remove/{rectifyId}")
+    public CommonResult deleteRectify(@PathVariable(value = "rectifyId")Long rectifyId){
+        return CommonResult.success(recitificationService.deleteById(rectifyId));
+    }
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssReviewRecordController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssReviewRecordController.java
new file mode 100644
index 0000000..e428640
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssReviewRecordController.java
@@ -0,0 +1,45 @@
+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.service.AssConfirmFinalService;
+import com.gkhy.assess.system.service.AssReviewRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 评审记录 前端控制器
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-1-4 10:46:54
+ */
+@Api(tags = "评审记录 前端控制器")
+@RestController
+@RequestMapping("/manage/review-record")
+public class AssReviewRecordController {
+    @Autowired
+    private AssReviewRecordService reviewRecordService;
+
+    @RepeatSubmit
+    @ApiOperation(value = "评审记录完成")
+    @PostMapping("/doReview")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "body", name = "projectId", dataType = "long", required = true, value = "项目id"),
+       })
+    public CommonResult doReview(@RequestBody Map map){
+        reviewRecordService.doReview(map);
+        return CommonResult.success();
+    }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRiskEstimateController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRiskEstimateController.java
new file mode 100644
index 0000000..05c07c6
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssRiskEstimateController.java
@@ -0,0 +1,57 @@
+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.AssRiskEstimate;
+import com.gkhy.assess.system.service.AssRiskEstimateService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "项目风险评估 前端控制器")
+@RestController
+@RequestMapping("/manage/risk-estimate")
+public class AssRiskEstimateController {
+    @Autowired
+    private AssRiskEstimateService riskEstimateService;
+
+    @ApiOperation(value = "根据id获取风险评估详情")
+    @GetMapping("/detail/{riskId}")
+    public CommonResult riskEstimateDetail(@PathVariable(value = "riskId") Long riskId){
+        return CommonResult.success(riskEstimateService.getRiskEstimateById(riskId));
+    }
+
+    @ApiOperation(value = "根据项目id获取风险评估详情")
+    @GetMapping("/getRiskByProjectId")
+    public CommonResult getRiskByProjectId( Long projectId){
+        return CommonResult.success(riskEstimateService.getRiskEstimateByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建风险评估")
+    @PostMapping("/add")
+    public CommonResult addRiskEstimate(@Validated @RequestBody AssRiskEstimate riskEstimate){
+        return CommonResult.success(riskEstimateService.addRiskEstimate(riskEstimate));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑风险评估")
+    @PutMapping("/edit")
+    public CommonResult editRiskEstimate(@Validated @RequestBody AssRiskEstimate riskEstimate){
+        return CommonResult.success(riskEstimateService.editRiskEstimate(riskEstimate));
+    }
+
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssWorkNotificationController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssWorkNotificationController.java
new file mode 100644
index 0000000..01f1be6
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/AssWorkNotificationController.java
@@ -0,0 +1,55 @@
+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.AssWorkNotification;
+import com.gkhy.assess.system.service.AssWorkNotificationService;
+import io.swagger.annotations.Api;
+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-12 10:46:54
+ */
+@Api(tags = "从业告知 前端控制器")
+@RestController
+@RequestMapping("/manage/work-notification")
+public class AssWorkNotificationController {
+    @Autowired
+    private AssWorkNotificationService workNotificationService;
+
+    @ApiOperation(value = "根据id获取从业告知详情")
+    @GetMapping("/detail/{notificationId}")
+    public CommonResult workNotificationDetail(@PathVariable(value = "notificationId") Long notificationId){
+        return CommonResult.success(workNotificationService.getWorkNotificationById(notificationId));
+    }
+
+    @ApiOperation(value = "根据项目id获取从业告知详情")
+    @GetMapping("/getWorkNotificationByProjectId")
+    public CommonResult getWorkNotificationByProjectId( Long projectId){
+        return CommonResult.success(workNotificationService.getWorkNotificationByProjectId(projectId));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "创建从业告知")
+    @PostMapping("/add")
+    public CommonResult addWorkNotification(@Validated @RequestBody AssWorkNotification workNotification){
+        return CommonResult.success(workNotificationService.addWorkNotification(workNotification));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "编辑从业告知")
+    @PutMapping("/edit")
+    public CommonResult editWorkNotification(@Validated @RequestBody AssWorkNotification workNotification){
+        return CommonResult.success(workNotificationService.editWorkNotification(workNotification));
+    }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java
index bb19588..0291b85 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java
@@ -6,6 +6,7 @@
 import com.gkhy.assess.system.service.SysExpertClassifyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -22,6 +23,7 @@
         return CommonResult.success(expertClassifyService.classifyTree(expertClassify));
     }
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "修改专家分类")
     @PutMapping("/mod")
@@ -29,6 +31,7 @@
         return CommonResult.success(expertClassifyService.modClassify(expertClassify));
     }
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "删除专家分类")
     @DeleteMapping("/del/{classifyId}")
@@ -37,6 +40,7 @@
     }
 
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "新增专家分类")
     @PostMapping("/add")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java
index 8a87e30..09a448f 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java
@@ -5,11 +5,13 @@
 import com.gkhy.assess.system.domain.SysAgency;
 import com.gkhy.assess.system.domain.SysExpertClassify;
 import com.gkhy.assess.system.domain.SysExpertInfo;
+import com.gkhy.assess.system.domain.SysUser;
 import com.gkhy.assess.system.service.SysExpertInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -20,16 +22,18 @@
     @Autowired
     private SysExpertInfoService expertInfoService;
 
+    @RequiresPermissions("system:assess:monitor")
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/list")
     public CommonResult exportInfoList(SysExpertInfo expertInfo){
         return CommonResult.success(expertInfoService.exportInfoList(expertInfo));
     }
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "新增专家信息")
     @PostMapping("/add")
@@ -37,6 +41,7 @@
         return CommonResult.success(expertInfoService.addExpertInfo(expertInfo));
     }
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "修改专家信息")
     @PutMapping("/mod")
@@ -44,7 +49,7 @@
         return CommonResult.success(expertInfoService.modExpertInfo(expertInfo));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "删除专家信息")
     @DeleteMapping("/del/{expertId}")
@@ -52,7 +57,7 @@
         return CommonResult.success(expertInfoService.delExpertInfo(expertId));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "批量删除专家信息")
     @DeleteMapping("/del/batch/{expertIds}")
@@ -60,7 +65,23 @@
         return CommonResult.success(expertInfoService.delExpertInfoBatch(expertIds));
     }
 
+    @RequiresPermissions("system:assess:monitor")
+    @ApiOperation(value = "根据id获取专家信息")
+    @GetMapping("/detail/{expertId}")
+    public CommonResult exportInfoDetail(@PathVariable(value = "expertId") Long expertId){
+        return CommonResult.success(expertInfoService.exportInfoDetail(expertId));
+    }
 
 
 
+    @RepeatSubmit
+    @RequiresPermissions("system:assess:monitor")
+    @ApiOperation(value = "审批状态修改,审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废)")
+    @PostMapping("/changeApprove")
+    public CommonResult changeApprove(@RequestBody SysExpertInfo expertInfo)
+    {
+        return CommonResult.success(expertInfoService.changeApprove(expertInfo));
+    }
+
+
 }
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 892fdd1..bc8d9a2 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
@@ -21,17 +21,18 @@
     @Autowired
     private SysAgencyService agencyService;
 
+    @RequiresPermissions("system:assess:monitor")
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/agencyList")
     public CommonResult agencyList(SysAgency agency){
         return CommonResult.success(agencyService.agencyList(agency));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @ApiOperation(value = "根据id获取机构详情")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "agencyId", dataType = "int", required = true, value = "机构id")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
index 0b2067a..60a9f05 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
@@ -9,6 +9,7 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -39,6 +40,7 @@
         return CommonResult.success(dictDataService.getDictDataById(dictId));
     }
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "新增字典数据")
     @PostMapping("/addDictData")
@@ -47,6 +49,7 @@
     }
 
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "编辑字典数据")
     @PutMapping("/editDictData")
@@ -55,6 +58,7 @@
     }
 
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "删除字典数据")
     @DeleteMapping("/remove/{dictId}")
@@ -63,6 +67,7 @@
     }
 
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "字典数据状态修改,停用/启用")
     @PostMapping("/changeStatus")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
index 7a98a2d..a1e0a77 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
@@ -10,6 +10,7 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -52,7 +53,7 @@
     }
 
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "新增字典类型")
     @PostMapping("/addDictType")
@@ -60,7 +61,7 @@
         return CommonResult.success(dictTypeService.addDictType(dictType));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "编辑字典类型")
     @PutMapping("/editDictType")
@@ -68,7 +69,7 @@
         return CommonResult.success(dictTypeService.editDictType(dictType));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "删除字典类型")
     @DeleteMapping("/remove/{dictId}")
@@ -76,7 +77,7 @@
         return CommonResult.success(dictTypeService.deleteDictTypeById(dictId));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "字典类型状态修改,停用/启用")
     @PostMapping("/changeStatus")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
index b913ea0..c8cc4c0 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
@@ -19,18 +19,18 @@
 public class SysLawController {
     @Autowired
     private SysLawService lawService;
-
+    @RequiresPermissions("system:assess:monitor")
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/lawList")
     public CommonResult lawList(SysLaw law){
         return CommonResult.success(lawService.lawList(law));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @ApiOperation(value = "根据id获取法律法规详情")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "lawId", dataType = "int", required = true, value = "法律法规id")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
index 64e5a75..267b48c 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
@@ -23,7 +23,7 @@
  */
 @Api(tags = "用户登录前端控制器")
 @RestController
-@RequestMapping("/account")
+@RequestMapping("/system/account")
 public class SysLoginController {
     @Autowired
     private SysUserService sysUserService;
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
index 8964a06..c5cc573 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
@@ -20,10 +20,11 @@
     @Autowired
     private SysNoticeService noticeService;
 
+    @RequiresPermissions("system:assess:monitor")
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/noticeList")
     public CommonResult noticeList(SysNotice notice){
@@ -31,6 +32,7 @@
     }
 
 
+    @RequiresPermissions("system:assess:monitor")
     @ApiOperation(value = "根据id获取通知详情")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "noticeId", dataType = "int", required = true, value = "通知id")
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
index 44d11d0..4c2a17d 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
@@ -1,5 +1,6 @@
 package com.gkhy.assess.admin.controller.web;
 
+import com.gkhy.assess.common.annotation.DataDesensitization;
 import com.gkhy.assess.common.annotation.RepeatSubmit;
 import com.gkhy.assess.common.api.CommonResult;
 import com.gkhy.assess.system.domain.SysRegion;
@@ -8,6 +9,7 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -35,7 +37,7 @@
         return CommonResult.success(regionService.getChildRegionById(regionId));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "新增地区")
     @PostMapping("/addRegion")
@@ -43,7 +45,7 @@
         return CommonResult.success(regionService.addRegion(region));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "编辑地区")
     @PutMapping("/editRegion")
@@ -51,7 +53,7 @@
         return CommonResult.success(regionService.editRegion(region));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "删除地区")
     @DeleteMapping("/remove/{regionId}")
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 fe343cb..2f13c70 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
@@ -24,22 +24,22 @@
     @Autowired
     private SysUserService sysUserService;
 
-
+    @RequiresPermissions("system:assess:monitor")
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/monitorList")
     public CommonResult monitorList(SysUser user){
         return CommonResult.success(sysUserService.monitorList(user));
     }
 
-
+    @RequiresPermissions("system:assess:monitor")
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/agencyList")
     public CommonResult agencyList(SysUser user){
@@ -50,13 +50,14 @@
     @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")
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10,最大50")
     })
     @GetMapping("/expertList")
     public CommonResult expertList(SysUser user){
         return CommonResult.success(sysUserService.expertList(user));
     }
 
+    @RequiresPermissions("system:assess:monitor")
     @RepeatSubmit
     @ApiOperation(value = "创建监管用户")
     @PostMapping("/addMonitor")
@@ -116,7 +117,7 @@
 
     @ApiOperation(value = "校验用户名")
     @PostMapping("/checkUserNameUnique")
-    public CommonResult checkLoginNameUnique(@RequestBody SysUser user)
+    public CommonResult checkUserNameUnique(@RequestBody SysUser user)
     {
         return CommonResult.success(sysUserService.checkUsernameUnique(user));
     }
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
index 3245b1b..a56b010 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
@@ -1,5 +1,6 @@
 package com.gkhy.assess.admin.controller.web.front;
 
+import com.gkhy.assess.common.annotation.DataDesensitization;
 import com.gkhy.assess.common.api.CommonResult;
 import com.gkhy.assess.system.domain.SysAgency;
 import com.gkhy.assess.system.service.SysAgencyService;
@@ -31,6 +32,7 @@
     }
 
 
+    @DataDesensitization
     @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 517467d..cdb2cd3 100644
--- a/assess-admin/src/main/resources/application-dev.yml
+++ b/assess-admin/src/main/resources/application-dev.yml
@@ -50,7 +50,7 @@
 # mybatis-plus相关配置
 mybatis-plus:
   # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
-  mapper-locations: classpath*:mapper/**/*Mapper.xml
+  mapper-locations: classpath*:mapper/*Mapper.xml
   # 以下配置均有默认值,可以不设置
   global-config:
     db-config:
diff --git a/assess-admin/src/main/resources/application-pro.yml b/assess-admin/src/main/resources/application-pro.yml
new file mode 100644
index 0000000..0c6ce23
--- /dev/null
+++ b/assess-admin/src/main/resources/application-pro.yml
@@ -0,0 +1,82 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 主库数据源
+      master:
+        url: jdbc:mysql://192.168.30.118:3306/smart_assess?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
+        username: root
+        password: e7be93ef5413e5ed
+      # 从库数据源
+      slave:
+        enabled: false
+        url:
+        username:
+        password:
+      initialSize: 5 #连接池初始化大小
+      minIdle: 10 #最小空闲连接数
+      maxActive: 20 #最大连接数
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置连接超时时间
+      connectTimeout: 30000
+      # 配置网络超时时间
+      socketTimeout: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      # 配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 900000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      web-stat-filter:
+        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据
+      stat-view-servlet: #访问监控网页的登录用户名和密码
+        login-username: druid
+        login-password: druid
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow: 114.216.178.42
+        url-pattern: /druid/*
+  #redis 配置
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: gkhy@202306
+
+
+# mybatis-plus相关配置
+mybatis-plus:
+  # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
+  mapper-locations: classpath*:mapper/*Mapper.xml
+  # 以下配置均有默认值,可以不设置
+  global-config:
+    db-config:
+      #主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
+      id-type: auto
+      #字段策略 IGNORED:"忽略判断"  NOT_NULL:"非 NULL 判断")  NOT_EMPTY:"非空判断"
+      field-strategy: NOT_EMPTY
+      #数据库类型
+      db-type: MYSQL
+  configuration:
+    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
+    map-underscore-to-camel-case: true
+    # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
+    call-setters-on-nulls: true
+
+
+logging:
+  level:
+    root: INFO
+    org:
+      com.nms.swspkmas_standalone: INFO
+
+
+swagger:
+  enabled: false
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/application.yml b/assess-admin/src/main/resources/application.yml
index f82a6b9..e1e6343 100644
--- a/assess-admin/src/main/resources/application.yml
+++ b/assess-admin/src/main/resources/application.yml
@@ -36,6 +36,6 @@
   # 过滤开关
   enabled: true
   # 排除链接(多个用逗号分隔)
-  excludes: /system/notice
+  excludes:
   # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
+  urlPatterns: /system/*,/manage/*
diff --git a/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql b/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql
index 9caf8db..e090d9c 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql
@@ -1,4 +1,3 @@
-drop table if exists `smart_assess`.`sys_user`;
 CREATE TABLE `smart_assess`.`sys_user`  (
 `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
 `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号',
@@ -23,13 +22,16 @@
 `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '最后登录ip',
 `login_date` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后登录时间',
 `pwd_update_date` datetime NULL DEFAULT NULL COMMENT '密码最后更新时间',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL  COMMENT '创建者',
 `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL  COMMENT '更新者',
 `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
 `remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL  COMMENT '备注',
 PRIMARY KEY (`id`) USING BTREE,
-UNIQUE INDEX `index_username`(`username`) USING BTREE
+INDEX `index_username`(`username`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
--- admin  admin@123
-insert into sys_user values(1,'admin', '国科鸿宇', 0, 'gkhy@163.com', '15888888888', 0, '', 'b3065cdf5dfdbbc573e2f576c8dc147a', '111111', 0, 0, 0,'',null,null,'','','',1,'127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', sysdate(), '管理员');
+-- admin  admin@3.1416
+insert into sys_user values(1,'admin', '国科鸿宇', 0, 'gkhy@163.com', '15888888888', 0, '', '1d3a86b6057285745c07a08dcc8ab078', '111111', 0, 0, 0,'',null,null,'','','',1,'127.0.0.1', sysdate(), sysdate(),1, 'admin', sysdate(), '', sysdate(), '管理员');
+-- administrator  admin@3.1416
+insert into sys_user values(2,'administrator', '智慧安评管理员', 0, 'gkhy2@163.com', '15888888889', 0, '', '275b57c4363e285d8beed63edfe350ee', '222222', 0, 0, 0,'',null,null,'','','',1,'127.0.0.1', sysdate(), sysdate(),1, 'admin', sysdate(), '', sysdate(), '管理员');
diff --git a/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql b/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql
index 3a2b9af..6aaa2d0 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql
@@ -2,12 +2,12 @@
 -- ----------------------------
 -- 字典类型表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_dict_type`;
 CREATE TABLE `smart_assess`.`sys_dict_type`  (
 `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
 `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典名称',
 `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典类型',
 `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常,1停用)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
 `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
 `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
@@ -18,5 +18,5 @@
 UNIQUE INDEX `index_type`(`dict_type`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
 
-insert into sys_dict_type values(1,  '评价类型', 'sys_assess_type', 0, 'admin', sysdate(), '', sysdate(), '评价类型列表');
-insert into sys_dict_type values(2,  '业务范围', 'sys_business_scope', 0, 'admin', sysdate(), '', sysdate(), '业务范围列表');
\ No newline at end of file
+insert into sys_dict_type values(1,  '评价类型', 'sys_assess_type', 0, 1, 'admin', sysdate(), '', sysdate(), '评价类型列表');
+insert into sys_dict_type values(2,  '业务范围', 'sys_business_scope', 0, 1, 'admin', sysdate(), '', sysdate(), '业务范围列表');
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql b/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql
index 98c2cd0..2dc4f66 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 字典数据表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_dict_data`;
 CREATE TABLE `smart_assess`.`sys_dict_data`  (
 `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
 `sort` int NOT NULL DEFAULT 0 COMMENT '字典排序',
@@ -11,6 +10,7 @@
 `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典类型',
 `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
 `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
 `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
 `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
@@ -20,10 +20,10 @@
 UNIQUE INDEX `index_l_v_t`(`dict_type`, `label`, `value`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
 
-insert into sys_dict_data values(1, 0, '煤炭开采业','0', 'sys_business_scope', 'Y',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
-insert into sys_dict_data values(2, 0, '金属、非金属矿及其他矿采选业','1', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
-insert into sys_dict_data values(3, 0, '陆地石油和天然气开采业','2', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
-insert into sys_dict_data values(4, 0, '陆上油气管道运输业','3', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
-insert into sys_dict_data values(5, 0, '石油加工业,化学原料、化学品及医药制造业','4', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
-insert into sys_dict_data values(6, 0, '烟花爆竹制造业','5', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
-insert into sys_dict_data values(7, 0, '金属冶炼','6', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data() values(1, 0, '煤炭开采业','0', 'sys_business_scope', 'Y',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(2, 0, '金属、非金属矿及其他矿采选业','1', 'sys_business_scope', 'N',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(3, 0, '陆地石油和天然气开采业','2', 'sys_business_scope', 'N',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(4, 0, '陆上油气管道运输业','3', 'sys_business_scope', 'N',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(5, 0, '石油加工业,化学原料、化学品及医药制造业','4', 'sys_business_scope', 'N',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(6, 0, '烟花爆竹制造业','5', 'sys_business_scope', 'N',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(7, 0, '金属冶炼','6', 'sys_business_scope', 'N',0, 1 ,'admin', sysdate(), '', sysdate(), '业务范围数据');
diff --git a/assess-admin/src/main/resources/db/migration/V20231123004_config.sql b/assess-admin/src/main/resources/db/migration/V20231123004_config.sql
index 1d86c69..f39d74e 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123004_config.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123004_config.sql
@@ -2,13 +2,13 @@
 -- ----------------------------
 -- 系统配置表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_config`;
 CREATE TABLE `smart_assess`.`sys_config`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(100) NOT NULL COMMENT '参数名称',
 `config_key` varchar(100) NOT NULL COMMENT '参数键名',
 `config_value` varchar(500) NOT NULL COMMENT '参数键值',
 `type` char(1) NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(64) NULL COMMENT '创建人',
 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `update_by` varchar(64) NULL COMMENT '更新人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql b/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql
index 10a7652..22e203b 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 系统机构表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_agency`;
 CREATE TABLE `smart_assess`.`sys_agency`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL COMMENT '机构名称',
@@ -25,8 +24,9 @@
 `archive_area` varchar(20) NOT NULL COMMENT '档案室面积',
 `reg_address` varchar(100) NOT NULL COMMENT '注册地址',
 `business` varchar(20) NOT NULL COMMENT '业务范围',
-`report_path` varchar(50) NULL COMMENT '机构信息上报表存放路径',
-`publication` tinyint(2) NULL DEFAULT 0 COMMENT '是否公示(0代表公示,1代表不公示,默认0)',
+`report_path` varchar(60) NULL COMMENT '机构信息上报表存放路径',
+`publication` tinyint(2) NULL DEFAULT 1 COMMENT '是否公示(0代表公示,1代表不公示,默认1)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `del_flag` tinyint(2) NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
 `create_by` varchar(20) NULL COMMENT '创建人',
 `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
diff --git a/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql b/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql
index 67711f2..02c6daf 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql
@@ -2,12 +2,12 @@
 -- ----------------------------
 -- 系统通知表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_notice`;
 CREATE TABLE `smart_assess`.`sys_notice`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `title` varchar(50) NOT NULL COMMENT '通知标题',
-`content` text NULL COMMENT '通知内容',
+`content` mediumtext NULL COMMENT '通知内容',
 `status` tinyint(2) 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 '更新人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231123007_law.sql b/assess-admin/src/main/resources/db/migration/V20231123007_law.sql
index 4606862..32e3b03 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123007_law.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123007_law.sql
@@ -2,16 +2,16 @@
 -- ----------------------------
 -- 系统法律法规表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_law`;
 CREATE TABLE `smart_assess`.`sys_law`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '住标题',
 `sub_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '副标题',
-`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
+`content` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
 `law_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '法律法规类别',
 `pub_agency` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '颁布机构',
 `pub_date` datetime NOT NULL COMMENT '颁布日期',
 `status` tinyint NULL DEFAULT 0 COMMENT '状态(0正常,1关闭 默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL  COMMENT '创建人',
 `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231124001_region.sql b/assess-admin/src/main/resources/db/migration/V20231124001_region.sql
index 1d4a9d8..f83ebec 100644
--- a/assess-admin/src/main/resources/db/migration/V20231124001_region.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231124001_region.sql
@@ -2,12 +2,12 @@
 -- ----------------------------
 -- 系统地区表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_region`;
 CREATE TABLE `smart_assess`.`sys_region`  (
 `id` bigint(0) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '地区名称',
 `sort` int NULL DEFAULT 0 COMMENT '排序',
 `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父主键',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `region_type` tinyint NULL DEFAULT 0 COMMENT '地区类型(0是疆内,1是疆外,默认0)',
 `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
diff --git a/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql b/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql
index 08cc0c4..bc2c532 100644
--- a/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 系统上传文件表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_attach`;
 CREATE TABLE `smart_assess`.`sys_attach`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',
diff --git a/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql b/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql
index e4644b2..52fea18 100644
--- a/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql
@@ -2,16 +2,36 @@
 -- ----------------------------
 -- 系统专家分类表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_expert_classify`;
 CREATE TABLE `smart_assess`.`sys_expert_classify`  (
-`classify_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
 `classify_name` varchar(20) NOT NULL COMMENT '分类名称',
 `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父id',
 `del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(20) NULL COMMENT '创建人',
 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `update_by` varchar(20) NULL COMMENT '修改人',
 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
 `remark` varchar(100) NULL COMMENT '备注',
-PRIMARY KEY (`classify_id`)
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统专家分类表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统专家分类表' ROW_FORMAT = DYNAMIC;
+
+
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (1, '安全生产类', 0);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (2, '防灾减灾救灾类', 0);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (3, '应急救援类', 0);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (4, '煤矿', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (5, '金属非金属矿山', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (6, '石油天然气开采', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (7, '危险化学品', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (8, '烟花爆竹', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (9, '工贸', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (10, '综合监管', 1);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (11, '森林草原防灭火', 2);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (13, '地质灾害', 2);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (14, '防汛抗旱', 2);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (15, '气象灾害', 2);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (16, '综合防灾减灾', 2);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (17, '安全生产专业救援', 3);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (18, '综合救援', 3);
+INSERT INTO `smart_assess`.`sys_expert_classify`(`id`, `classify_name`, `parent_id`) VALUES (24, '地震灾害', 2);
diff --git a/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql b/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql
index 517d21f..816f731 100644
--- a/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql
@@ -2,44 +2,46 @@
 -- ----------------------------
 -- 系统专家分类表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_expert_info`;
 CREATE TABLE `smart_assess`.`sys_expert_info`  (
-`expert_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
 `name` varchar(20) NOT NULL COMMENT '专家名称',
 `sex` tinyint NULL DEFAULT 2 COMMENT '性别(0男,1女,2未知,默认2)',
 `big_classify` bigint NULL COMMENT '类别id',
 `small_classify` bigint NULL COMMENT '类别id',
 `birthday` datetime NULL COMMENT '出生日期',
-`phone` varchar(11) NULL COMMENT '手机号',
+`phone` varchar(12) NULL COMMENT '手机号',
 `title` varchar(20) NULL COMMENT '职称',
 `electronic_photo` varchar(100) NULL COMMENT '电子照片',
 `id_card` varchar(18) NULL COMMENT '身份证号码',
-`duty_status` tinyint NULL COMMENT '在职状态',
-`company_name` varchar(20) NULL COMMENT '公司名称',
-`company_address` varchar(50) NULL COMMENT '公司地址',
+`duty_status` tinyint NULL COMMENT '在岗情况(0在岗,1退休)',
+`company_name` varchar(50) NULL COMMENT '单位名称',
+`company_address` varchar(60) NULL COMMENT '单位地址',
 `dept_name` varchar(20) NULL COMMENT '部门名称',
 `job` varchar(10) NULL COMMENT '职务',
-`company_telephone` varchar(11) NULL COMMENT '公司电话',
-`fax_num` varchar(11) NULL COMMENT '传真',
+`company_telephone` varchar(11) NULL COMMENT '单位电话',
+`fax_num` varchar(11) NULL COMMENT '传真号',
 `email` varchar(20) NULL COMMENT '邮箱',
-`graduation_school` varchar(20) NULL COMMENT '毕业学校',
-`degree` varchar(10) NULL COMMENT '学历',
+`graduation_school` varchar(30) NULL COMMENT '毕业学校',
+`degree` varchar(10) NULL COMMENT '最高学历',
 `speciality` varchar(20) NULL COMMENT '专业',
-`current_profession` varchar(20) NULL COMMENT '当前专业',
-`support_direction_safety` varchar(20) NULL COMMENT '支撑安全',
-`support_direction_prevention` varchar(20) NULL COMMENT '支撑预防',
-`support_direction_emergency` varchar(20) NULL COMMENT '支持应急',
-`resume_key` varchar(20) NULL COMMENT '简述',
-`paper_situation_key` varchar(20) NULL,
-`reward_key` varchar(20) NULL,
-`achievement_key` varchar(20) NULL,
-`personal_opinion_key` varchar(20) NULL,
-`recommend_unit_opinion_key` varchar(20) NULL,
+`current_profession` varchar(100) NULL COMMENT '现在从事专业或方向',
+`support_direction_safety` varchar(40) NULL COMMENT '支撑方向安全生产',
+`support_direction_prevention` varchar(40) NULL COMMENT '支撑方向防灾救灾',
+`support_direction_emergency` varchar(40) NULL COMMENT '支撑方向应急救援',
+`resume_key` varchar(600) NULL COMMENT '简历',
+`paper_situation_key` varchar(600) NULL COMMENT '论文情况',
+`reward_key` varchar(600) NULL COMMENT '奖励',
+`achievement_key` varchar(600) NULL COMMENT '成绩成果',
+`personal_opinion_key` varchar(600) NULL COMMENT '专家个人意见',
+`recommend_unit_opinion_key` varchar(600) NULL COMMENT '推荐单位意见',
+`source` tinyint NULL COMMENT '来源(1问卷,2系统)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`state` tinyint(2) NULL DEFAULT 1 COMMENT '审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)',
 `del_flag` tinyint(255) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
 `create_by` varchar(20) NULL COMMENT '创建人',
 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `update_by` varchar(20) NULL COMMENT '修改人',
 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
 `remark` varchar(100) NULL,
-PRIMARY KEY (`expert_id`)
+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/V20231130001_project.sql b/assess-admin/src/main/resources/db/migration/V20231130001_project.sql
index 2a43432..0edc50c 100644
--- a/assess-admin/src/main/resources/db/migration/V20231130001_project.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231130001_project.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 项目表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_project`;
 CREATE TABLE `smart_assess`.`ass_project`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL COMMENT '项目名称',
@@ -10,21 +9,21 @@
 `agency_id` bigint NOT NULL COMMENT '机构id',
 `client` varchar(50) NOT NULL COMMENT '委托方',
 `province` varchar(20) NULL COMMENT '省份',
+`phase` int NULL DEFAULT 1 COMMENT '项目阶段(1风险分析评价计划,2现场勘验,3项目审核,4出具报告,5项目归档)',
 `city` varchar(20) NOT NULL COMMENT '城市',
 `district` varchar(20) NOT NULL COMMENT '区县',
 `business` varchar(20) NOT NULL COMMENT '业务范围,字典id',
 `invest` varchar(10) NOT NULL COMMENT '项目投资额/万',
 `address` varchar(100) NOT NULL COMMENT '地址',
 `actual_location` varchar(60) NULL COMMENT '实际纬度/经度',
-`location` varchar(20) NULL COMMENT '纬度/经度',
+`location` varchar(60) NULL COMMENT '纬度/经度',
 `estimate_type` bigint NULL COMMENT '评估类型,字典id',
-`leader_id` bigint NOT NULL COMMENT '负责人id',
-`defect_numb` int NULL,
-`review_plan_date` datetime NULL COMMENT '评估计划时间',
-`township` varchar(20) NULL,
+`filing_date` datetime NULL COMMENT '项目完成时间',
 `credit_code` varchar(30) NOT NULL COMMENT '委托单位社会统一信用代码',
 `report_progress` tinyint(2) NULL DEFAULT 0 COMMENT '项目状态(0创建,1风险评估,2合同管理,默认0)',
 `state` tinyint(2) NULL DEFAULT 1 COMMENT '审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)',
+`introduction` varchar(500) NOT NULL COMMENT '项目基本概况(500字以内)',
+`is_review` tinyint(1) NULL DEFAULT 0 COMMENT '是否参与评审(0否,1是,默认0)',
 `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(20) NULL COMMENT '创建人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql b/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql
index 306f28f..e222cda 100644
--- a/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql
@@ -2,11 +2,9 @@
 -- ----------------------------
 -- 风险评估表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_risk_estimate`;
 CREATE TABLE `smart_assess`.`ass_risk_estimate`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `project_id` bigint NOT NULL COMMENT '项目id',
-`introduction` varchar(500) NOT NULL COMMENT '基本概况(500字以内)',
 `risk_character` varchar(500) NOT NULL COMMENT '行业风险特性(500字以内)',
 `surroundings` varchar(500) NOT NULL COMMENT '周边环境(500字以内)',
 `equipment` varchar(500) NULL COMMENT '主要生产装置(500字以内)',
diff --git a/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql b/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql
index ad2d82b..aa67ef5 100644
--- a/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql
@@ -2,11 +2,10 @@
 -- ----------------------------
 -- 合同管理表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_contract`;
 CREATE TABLE `smart_assess`.`ass_contract`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
-`contract_money` decimal NOT NULL COMMENT '合同价格/万',
-`actual_contract_money` decimal NOT NULL COMMENT '实际合同价格/万',
+`contract_money` varchar(30) NOT NULL COMMENT '合同价格/万',
+`actual_contract_money` varchar(30) NULL COMMENT '实际合同价格/万',
 `contract_sign_date` datetime NOT NULL COMMENT '合同签订时间',
 `project_id` bigint NOT NULL COMMENT '项目id',
 `contract_introduction` varchar(100) NULL COMMENT '合同额外说明(100字以内)',
diff --git a/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql b/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql
index fce085f..a9e55f5 100644
--- a/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 评价认为通知表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_estimate_task`;
 CREATE TABLE `smart_assess`.`ass_estimate_task`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `leader_id` bigint NOT NULL COMMENT '项目负责人id',
diff --git a/assess-admin/src/main/resources/db/migration/V20231204001_device.sql b/assess-admin/src/main/resources/db/migration/V20231204001_device.sql
index c5c7a6f..39dafab 100644
--- a/assess-admin/src/main/resources/db/migration/V20231204001_device.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231204001_device.sql
@@ -1,13 +1,14 @@
-
 -- ----------------------------
 -- 设备表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_device`;
 CREATE TABLE `smart_assess`.`ass_device`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
+`project_id` bigint NOT NULL COMMENT '项目id',
 `device_name` varchar(20) NOT NULL COMMENT '设备名称',
-`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`start_date` datetime NOT NULL COMMENT '开始时间',
+`end_date` datetime NOT NULL COMMENT '结束时间',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
 `create_by` varchar(20) NULL COMMENT '创建人',
 `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `update_by` varchar(20) NULL COMMENT '更新人',
@@ -15,24 +16,4 @@
 `remark` varchar(100) NULL COMMENT '备注',
 PRIMARY KEY (`id`)
 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '设备表' ROW_FORMAT = DYNAMIC;
-
-
--- ----------------------------
--- 项目需要的设备清单表
--- ----------------------------
-drop table if exists `smart_assess`.`ass_project_device`;
-CREATE TABLE `smart_assess`.`ass_project_device`  (
-`id` bigint NOT NULL AUTO_INCREMENT,
-`project_id` bigint NOT NULL COMMENT '项目id',
-`device_id` bigint NOT NULL COMMENT '设备id',
-`start_date` datetime NOT NULL COMMENT '开始时间',
-`end_date` datetime NOT NULL COMMENT '结束时间',
-`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;
 
diff --git a/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql b/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql
index daaa103..4c040c5 100644
--- a/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql
@@ -2,11 +2,9 @@
 -- ----------------------------
 -- 评价项目计划表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_estimate_plan`;
 CREATE TABLE `smart_assess`.`ass_estimate_plan`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `auser_id` bigint NOT NULL COMMENT '评价机构负责人id',
-`technical_id` bigint NOT NULL COMMENT '技术负责人负责人id',
 `start_date` datetime NOT NULL COMMENT '评价开始时间',
 `end_date` datetime NOT NULL COMMENT '评价结束时间',
 `project_id` bigint NOT NULL COMMENT '项目id',
diff --git a/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql b/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql
index 0dff831..eae0c54 100644
--- a/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 评价日程安排表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_estimate_schedule`;
 CREATE TABLE `smart_assess`.`ass_estimate_schedule`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL COMMENT '日程名称',
@@ -10,6 +9,7 @@
 `start_date` datetime NOT NULL COMMENT '开始时间',
 `end_date` datetime NOT NULL COMMENT '结束时间',
 `project_id` bigint NOT NULL COMMENT '项目id',
+`sort` int NULL DEFAULT 0 COMMENT '序号',
 `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(20) NULL COMMENT '创建人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql b/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql
index 34ec067..4d3259d 100644
--- a/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql
@@ -2,19 +2,14 @@
 -- ----------------------------
 -- 评价项目组成员表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_plan_person`;
 CREATE TABLE `smart_assess`.`ass_plan_person`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `person_id` bigint NOT NULL COMMENT '成员id',
-`certificate_number` varchar(30) NOT NULL COMMENT '资格证书编号',
-`ability` varchar(10) NOT NULL COMMENT '能力',
-`business_ability_id` bigint  NULL COMMENT '能力id(字典id)',
-`identification_number` varchar(10) NOT NULL COMMENT '识别码',
-`job_type` tinyint(2) NOT NULL DEFAULT 1 COMMENT '工作类型:1普通人员,2组长',
-`later_promise` tinyint(1) NOT NULL COMMENT '承诺后期前往现场勘验(0否,1是)',
-`professional_ability` varchar(50) NOT NULL COMMENT '专业能力',
-`work` varchar(50) NOT NULL COMMENT '承担工作',
-`scene_statue` tinyint(2) NOT NULL DEFAULT 1 COMMENT '场景状态1 2',
+`job_type` tinyint NOT NULL DEFAULT 1 COMMENT '工作类型:1普通人员,2组长',
+`play_role` tinyint NOT NULL DEFAULT 2 COMMENT '项目担任角色:1项目负责人,2项目组成员,3过程控制负责人,4机构评价负责人,5技术负责人,默认2',
+`later_promise` tinyint(1) NOT NULL DEFAULT 0 COMMENT '承诺后期前往现场勘验(0否,1是)',
+`informed` tinyint NULL DEFAULT 0 COMMENT '是否已告知(0否,1是,默认0)',
+`work` varchar(50) NULL COMMENT '承担工作',
 `reason` varchar(30) NULL COMMENT '未到现场勘验原因(30字)',
 `sort` int NULL DEFAULT 0 COMMENT '排序',
 `project_id` bigint NOT NULL COMMENT '项目id',
diff --git a/assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql b/assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql
deleted file mode 100644
index 515c1c7..0000000
--- a/assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql
+++ /dev/null
@@ -1,25 +0,0 @@
-
--- ----------------------------
--- 评价项目组专家表
--- ----------------------------
-drop table if exists `smart_assess`.`ass_plan_expert`;
-CREATE TABLE `smart_assess`.`ass_plan_expert`  (
-`id` bigint NOT NULL AUTO_INCREMENT,
-`expert_id` bigint NOT NULL COMMENT '专家id',
-`ability` varchar(10) NOT NULL COMMENT '能力',
-`business_ability_id` bigint  NULL COMMENT '能力id(字典id)',
-`later_promise` tinyint(1) NOT NULL COMMENT '承诺后期前往现场勘验(0否,1是)',
-`professional_ability` varchar(50) NOT NULL COMMENT '专业能力',
-`work` varchar(50) NOT NULL COMMENT '工作任务',
-`sort` int NULL DEFAULT 0 COMMENT '排序',
-`project_id` bigint NOT NULL COMMENT '项目id',
-`work_notification_id` bigint 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/V20231205001_work_notification.sql b/assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql
index e89f339..776be73 100644
--- a/assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 从业告知表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_work_notification`;
 CREATE TABLE `smart_assess`.`ass_work_notification`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `service_start_date` datetime NOT NULL COMMENT '服务开始时间',
diff --git a/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql b/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql
index 5963af0..f13e029 100644
--- a/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql
@@ -2,7 +2,6 @@
 -- ----------------------------
 -- 现场勘验记录表
 -- ----------------------------
-drop table if exists `smart_assess`.`ass_investigation`;
 CREATE TABLE `smart_assess`.`ass_investigation`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `investigation_date` datetime NOT NULL COMMENT '现场勘验时间',
@@ -10,6 +9,7 @@
 `is_safety_check` tinyint(1) NULL DEFAULT 0 COMMENT '编制现场安全检查表',
 `record_data` varchar(200) NULL COMMENT '现场勘验记录(200字)',
 `project_id` bigint NOT NULL COMMENT '项目id',
+`location` varchar(60) NULL COMMENT '纬度/经度',
 `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `create_by` varchar(20) NULL COMMENT '创建人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql b/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql
index 34492ad..45364c2 100644
--- a/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql
@@ -2,12 +2,12 @@
 -- ----------------------------
 -- 评估文件上传记录表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_accessory_file`;
-CREATE TABLE `smart_assess`.`sys_accessory_file`  (
+CREATE TABLE `smart_assess`.`ass_accessory_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 '文件存放路径',
-`module_type` tinyint NOT NULL COMMENT '模块code',
+`module_type` int NOT NULL COMMENT '模块code',
 `project_id` bigint NOT NULL COMMENT '项目id',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
diff --git a/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql b/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql
index cf246a4..3ce8472 100644
--- a/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql
@@ -2,12 +2,13 @@
 -- ----------------------------
 -- 现场勘验人员人脸识别记录表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_face_record`;
-CREATE TABLE `smart_assess`.`sys_face_record`  (
+CREATE TABLE `smart_assess`.`ass_face_record`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `person_id` bigint NOT NULL COMMENT '用户id',
-`file_id` bigint NOT NULL COMMENT '评估文件id(图片id)',
 `project_id` bigint NOT NULL COMMENT '项目id',
+`location` varchar(60) NULL COMMENT '纬度/经度',
+`face_path` varchar(100) NULL COMMENT '人脸图片路径',
+`scene` tinyint NULL DEFAULT 0 COMMENT '是否是现场勘验人脸识别(0否 1是,默认0)',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
 `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
 `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
diff --git a/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql b/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql
index 9c5aba2..1fbd2c5 100644
--- a/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql
@@ -2,8 +2,7 @@
 -- ----------------------------
 -- 审核表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_audit`;
-CREATE TABLE `smart_assess`.`sys_audit`  (
+CREATE TABLE `smart_assess`.`ass_audit`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `audit_date` datetime NOT NULL COMMENT '审核日期',
 `affirm_date` datetime NOT NULL COMMENT '内部审核确定日期',
diff --git a/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql b/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql
index 96d9010..ff52605 100644
--- a/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql
@@ -2,8 +2,7 @@
 -- ----------------------------
 -- 项目结论表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_conclusion`;
-CREATE TABLE `smart_assess`.`sys_conclusion`  (
+CREATE TABLE `smart_assess`.`ass_conclusion`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `conclusion` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '评价结论',
 `is_revise_manual` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否有评价报告修改说明(0否 1是)',
diff --git a/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql b/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql
index f755394..f73435f 100644
--- a/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql
@@ -2,8 +2,7 @@
 -- ----------------------------
 -- 过程控制负责人审核表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_process_audit`;
-CREATE TABLE `smart_assess`.`sys_process_audit`  (
+CREATE TABLE `smart_assess`.`ass_process_audit`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `audit_date` datetime NOT NULL COMMENT '审核日期',
 `process_leader_id` bigint NOT NULL COMMENT '过程控制负责人id',
diff --git a/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql b/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql
index 7dff537..bfb3ea6 100644
--- a/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql
@@ -2,11 +2,10 @@
 -- ----------------------------
 -- 项目归档文件表
 -- ----------------------------
-drop table if exists `smart_assess`.`sys_project_material`;
-CREATE TABLE `smart_assess`.`sys_project_material`  (
+CREATE TABLE `smart_assess`.`ass_project_material`  (
 `id` bigint NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL COMMENT '名称',
-`type` tinyint NOT NULL COMMENT '类型',
+`type` tinyint NOT NULL DEFAULT 1 COMMENT '是否是文件,0否 1是 默认1',
 `project_id` bigint NOT NULL COMMENT '项目id',
 `file_id` bigint  NULL COMMENT '评估文件id',
 `version` int NULL DEFAULT 0 COMMENT '乐观锁',
diff --git a/assess-admin/src/main/resources/db/migration/V20231208001_recitification.sql b/assess-admin/src/main/resources/db/migration/V20231208001_recitification.sql
new file mode 100644
index 0000000..b3b341f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231208001_recitification.sql
@@ -0,0 +1,20 @@
+
+-- ----------------------------
+-- 项目整改情况说明表
+-- ----------------------------
+CREATE TABLE `smart_assess`.`ass_recitification`  (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`rectify_person` varchar(20) NOT NULL COMMENT '整改人',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`file_id` bigint  NULL COMMENT '文件id',
+`rectify_time` datetime NOT NULL COMMENT '整改时间',
+`reason` varchar(30) NULL COMMENT '整改说明',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`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,
+`remark` varchar(50) NULL COMMENT '原因说明',
+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/V20231208002_face_recognition.sql b/assess-admin/src/main/resources/db/migration/V20231208002_face_recognition.sql
new file mode 100644
index 0000000..1dbc325
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231208002_face_recognition.sql
@@ -0,0 +1,19 @@
+
+-- ----------------------------
+-- 签字确认表
+-- ----------------------------
+CREATE TABLE `smart_assess`.`ass_face_recognition`  (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`person_id` bigint NOT NULL COMMENT '人员id',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`sign_path` varchar(100) NULL COMMENT '签字图片路径',
+`insurance_pic_id` bigint  DEFAULT NULL COMMENT '承诺书图片id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`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,
+`remark` varchar(50) NULL COMMENT '原因说明',
+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/V20231208003_filing_apply.sql b/assess-admin/src/main/resources/db/migration/V20231208003_filing_apply.sql
new file mode 100644
index 0000000..88d0d7e
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231208003_filing_apply.sql
@@ -0,0 +1,17 @@
+
+-- ----------------------------
+-- 报备申请表
+-- ----------------------------
+CREATE TABLE `smart_assess`.`ass_filing_apply`  (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`project_id` bigint NOT NULL COMMENT '项目id',
+`file_id` bigint  NULL COMMENT '报备文件id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`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,
+`remark` varchar(50) NULL COMMENT '原因说明',
+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/V20240105001_change_user.sql b/assess-admin/src/main/resources/db/migration/V20240105001_change_user.sql
new file mode 100644
index 0000000..cbe6a3f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240105001_change_user.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `smart_assess`.`sys_user`
+ADD COLUMN `id_photo` varchar(100) NULL COMMENT '证件照',
+ADD COLUMN `certificate_no` varchar(100) NOT NULL COMMENT '证书编号',
+ADD COLUMN `level` varchar(10) NOT NULL COMMENT '评价师等级',
+ADD COLUMN `work_type` tinyint NOT NULL DEFAULT 1 COMMENT '人员类型(1专职,2兼职,默认1)';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240105002_change_dict_data.sql b/assess-admin/src/main/resources/db/migration/V20240105002_change_dict_data.sql
new file mode 100644
index 0000000..3762077
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240105002_change_dict_data.sql
@@ -0,0 +1,43 @@
+-- 字典类型
+insert into `smart_assess`.`sys_dict_type`(`name`,`dict_type`,`remark`) values('专业方向', 'sys_major_orientation','专业方向列表');
+
+-- 字典数据
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`)  values('预评价(设立评价)','0', 'sys_assess_type', 'Y','评价类型');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`)  values('现状评价','1', 'sys_assess_type', 'N','评价类型');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`)  values('验收评价','2', 'sys_assess_type', 'N','评价类型');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`)  values('重大危险源评估','3', 'sys_assess_type', 'N','评价类型');
+
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`)  values('安全','0', 'sys_major_orientation', 'Y','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('机械','1', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('电气','2', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('采矿','3', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('通风','4', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('矿建','5', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('地质','6', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('水工结构','7', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('采油','8', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('储运','9', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('油气储运','10', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('工艺设备与控制','11', 'sys_major_orientation', 'N', '专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('自动化(仪表)','12', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('防腐','13', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('化工工艺','14', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('化工机械','15', 'sys_major_orientation', 'N', '专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('自动化','16', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('火炸药','17', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('冶金','18', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('有色金属','19', 'sys_major_orientation', 'N','专业方向');
+insert into `smart_assess`.`sys_dict_data`(`label`, `value`, `dict_type`,`is_default`,`remark`) values('爆炸技术','20', 'sys_major_orientation', 'N','专业方向');
+
+
+ALTER TABLE `smart_assess`.`sys_dict_data`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
+
+ALTER TABLE `smart_assess`.`sys_dict_type`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
+
+ALTER TABLE `smart_assess`.`sys_notice`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
+
+ALTER TABLE `smart_assess`.`sys_law`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240109001_add_delflag.sql b/assess-admin/src/main/resources/db/migration/V20240109001_add_delflag.sql
new file mode 100644
index 0000000..cafbe78
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240109001_add_delflag.sql
@@ -0,0 +1,11 @@
+ALTER TABLE `smart_assess`.`sys_dict_data`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
+
+ALTER TABLE `smart_assess`.`sys_dict_type`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
+
+ALTER TABLE `smart_assess`.`sys_notice`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
+
+ALTER TABLE `smart_assess`.`sys_law`
+ADD COLUMN `del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)';
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20240109002_user_face.sql b/assess-admin/src/main/resources/db/migration/V20240109002_user_face.sql
new file mode 100644
index 0000000..c68ea05
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240109002_user_face.sql
@@ -0,0 +1,17 @@
+
+-- ----------------------------
+-- 用户人脸数据表
+-- ----------------------------
+CREATE TABLE `smart_assess`.`sys_user_face`  (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`face_base` text NOT NULL COMMENT '人脸数据',
+`user_id` bigint NOT NULL COMMENT '用户id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`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,
+`remark` varchar(20) NULL COMMENT '原因说明',
+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/V20240125001_change_region.sql b/assess-admin/src/main/resources/db/migration/V20240125001_change_region.sql
new file mode 100644
index 0000000..82d46c5
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20240125001_change_region.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `smart_assess`.`sys_region`
+ADD COLUMN `remark` varchar(20) NULL COMMENT '备注';
\ No newline at end of file
diff --git a/assess-admin/src/test/java/com/gkhy/admin/MybatisPlusGenerator.java b/assess-admin/src/test/java/com/gkhy/admin/MybatisPlusGenerator.java
deleted file mode 100644
index 5c26675..0000000
--- a/assess-admin/src/test/java/com/gkhy/admin/MybatisPlusGenerator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.gkhy.admin;
-
-import com.baomidou.mybatisplus.generator.FastAutoGenerator;
-import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
-import com.baomidou.mybatisplus.generator.config.OutputFile;
-import com.baomidou.mybatisplus.generator.config.rules.DateType;
-import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class MybatisPlusGenerator {
-    public static void main(String[] args) {
-        System.out.println(System.getProperty("user.dir"));
-        String model="/assess-system";
-        // 数据库配置
-        DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig
-                .Builder("jdbc:mysql://localhost:3306/smart_assess" +
-                "?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"
-                , "root", "password");
-        FastAutoGenerator.create(dataSourceConfigBuilder)
-                // 全局配置
-                .globalConfig((scanner, builder) -> {
-                    builder.author("kzy")
-                            // 覆盖已生成文件
-                            .fileOverride()
-                            // 指定输出目录
-                            .outputDir(System.getProperty("user.dir") +model+ "/src/main/java/")
-                            // 开启 swagger 模式
-                            .enableSwagger()
-                            // 禁止打开输出目录
-                            .disableOpenDir()
-                            // 时间策略
-                            .dateType(DateType.TIME_PACK)
-                            // 类注释日期的格式
-                            .commentDate("yyyy-MM-dd HH:mm:ss")
-                            .build();
-                })
-                // 包配置
-                .packageConfig((scanner, builder) -> {
-                    // 父包名
-                    builder.parent("com.gkhy.assess")
-                            // 模块名
-                            .moduleName("system")
-                            // Entity 包名
-                            .entity("domain")
-                            // Service 包名
-                            .service("service")
-                            //	Service Impl 包名
-                            .serviceImpl("service.impl")
-                            // Controller 包名
-                            .controller("controller")
-                            // Mapper 包名
-                            .mapper("mapper.system")
-                            // MapperXML 包名
-                            .xml("mapper.system")
-                            // 路径配置信息
-                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") +model+ "/src/main/resources/mapper/"));
-                })
-                //策略配置
-                .strategyConfig((scanner, builder) -> {
-                    // 增加表匹配(内存过滤),	include 与 exclude 只能配置一项
-                    builder.addInclude(getTables(scanner.apply("请输入要生成的表名,多个英文逗号分隔?所有输入 all")))
-                            // 	增加表排除匹配(内存过滤),	include 与 exclude 只能配置一项
-                            // .addExclude(scanner.apply("请输入要忽略的表名,多个英文逗号分隔?"))
-                            // 	增加过滤表后缀
-                            .addTableSuffix("")
-                            // 	增加过滤表前缀
-                            .addTablePrefix("")
-                            // service 策略配置
-                            .serviceBuilder()
-                            // 	格式化文件名称
-                            .formatServiceFileName("%sService")
-                            .formatServiceImplFileName("%sServiceImpl")
-                            // 实体策略配置
-                            .entityBuilder()
-                            // 开启 lombok 模型
-                            .enableLombok()
-                            // 开启生成实体时生成字段注解
-                            .enableTableFieldAnnotation()
-                            // controller 策略配置
-                            .controllerBuilder()
-                            .formatFileName("%sController")
-                            // 开启生成@RestController 控制器
-                            .enableRestStyle()
-                            // 	mapper 策略配置
-                            .mapperBuilder()
-                            .formatMapperFileName("%sMapper")
-                            .enableMapperAnnotation()
-                            .formatXmlFileName("%sMapper");
-                })
-                // 使用Freemarker引擎模板,默认的是Velocity引擎模板
-                .templateEngine(new FreemarkerTemplateEngine())
-                .execute();
-    }
-
-
-
-    /**
-     * 处理 all 情况
-     *
-     * @param tables
-     * @return
-     */
-    protected static List<String> getTables(String tables) {
-        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
-    }
-}
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 13a25d5..32cc777 100644
--- a/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
+++ b/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
@@ -6,16 +6,12 @@
 import com.gkhy.assess.admin.GkhyAdminApplication;
 import com.gkhy.assess.system.domain.SysRegion;
 import com.gkhy.assess.system.service.SysRegionService;
-import com.gkhy.assess.system.service.impl.SysRegionServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
-import sun.swing.plaf.GTKKeybindings;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitization.java b/assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitization.java
new file mode 100644
index 0000000..50166e7
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitization.java
@@ -0,0 +1,13 @@
+package com.gkhy.assess.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据脱敏注解,方法含有该注解表示需要数据脱敏
+ */
+@Target({ElementType.PARAMETER,ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataDesensitization {
+
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitizationType.java b/assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitizationType.java
new file mode 100644
index 0000000..02c8a5c
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/annotation/DataDesensitizationType.java
@@ -0,0 +1,19 @@
+package com.gkhy.assess.common.annotation;
+
+import com.gkhy.assess.common.enums.SensitiveTypeEnum;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据脱敏注解,字段上含有该注解表示需要数据脱敏
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataDesensitizationType {
+    /**
+     * 脱敏类型(规则)
+     * @return
+     */
+    SensitiveTypeEnum type();
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/api/ResultCode.java b/assess-common/src/main/java/com/gkhy/assess/common/api/ResultCode.java
index dfd9e42..aef3b0c 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/api/ResultCode.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/api/ResultCode.java
@@ -6,7 +6,7 @@
 public enum ResultCode implements IErrorCode {
     SUCCESS(200,"操作成功"),
     FAILED(500, "操作失败"),
-    VALIDATE_FAILED(404, "参数检验失败"),
+    VALIDATE_FAILED(400, "参数检验失败"),
     UNAUTHORIZED(401, "暂未登录或token已经过期"),
     FORBIDDEN(403, "没有相关权限");
 
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/config/BaseRedisConfig.java b/assess-common/src/main/java/com/gkhy/assess/common/config/BaseRedisConfig.java
index 2eb4f50..072f2ee 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/config/BaseRedisConfig.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/config/BaseRedisConfig.java
@@ -3,7 +3,13 @@
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.gkhy.assess.common.service.RedisService;
 import com.gkhy.assess.common.service.impl.RedisServiceImpl;
 import org.springframework.context.annotation.Bean;
@@ -18,6 +24,9 @@
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 
 /**
  * Redis基础配置
@@ -48,6 +57,21 @@
         Jackson2JsonRedisSerializer<Object> serializer=new Jackson2JsonRedisSerializer<>(Object.class);
         ObjectMapper objectMapper=new ObjectMapper();
         objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+
+        //LocalDatetime序列化
+        JavaTimeModule timeModule = new JavaTimeModule();
+        timeModule.addDeserializer(LocalDate.class,
+                new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        timeModule.addDeserializer(LocalDateTime.class,
+                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        timeModule.addSerializer(LocalDate.class,
+                new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        timeModule.addSerializer(LocalDateTime.class,
+                new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.registerModule(timeModule);
+
         //必须设置,否则无法将JSON转化为对象,会转化成Map类型
         objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
         serializer.setObjectMapper(objectMapper);
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/config/MybatisPlusConfig.java b/assess-common/src/main/java/com/gkhy/assess/common/config/MybatisPlusConfig.java
index d2e5f88..d81f4f7 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/config/MybatisPlusConfig.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/config/MybatisPlusConfig.java
@@ -21,6 +21,7 @@
         PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
         paginationInnerInterceptor.setOverflow(false);//溢出总页数 总是跳到第一页
         interceptor.addInnerInterceptor(paginationInnerInterceptor);
+        //添加乐观锁插件
         interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
         return interceptor;
     }
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java
index ed74267..f3aabd1 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java
@@ -3,11 +3,16 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -16,7 +21,6 @@
 
 @Getter
 @Setter
-@Accessors(chain = true)
 @ApiModel(value = "baseEntity对象", description = "基础类")
 public class BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -25,18 +29,22 @@
     @TableField("create_by")
     private String createBy;
 
+//    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
+//    @JsonSerialize(using = LocalDateTimeSerializer.class)
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty("创建时间")
     @TableField("create_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
     @ApiModelProperty("更新者")
     @TableField("update_by")
     private String updateBy;
 
+//    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
+//    @JsonSerialize(using = LocalDateTimeSerializer.class)
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty("更新时间")
     @TableField("update_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime updateTime;
 
     @ApiModelProperty("备注")
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/TableSupport.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/TableSupport.java
index 5c548cc..6abe2c8 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/TableSupport.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/TableSupport.java
@@ -42,7 +42,7 @@
     {
         PageDomain pageDomain = new PageDomain();
         pageDomain.setPageNum(Convert.toInt(ServletUtil.getParameter(PAGE_NUM), 1));
-        pageDomain.setPageSize(Convert.toInt(ServletUtil.getParameter(PAGE_SIZE), 10));
+        pageDomain.setPageSize(Convert.toInt(ServletUtil.getParameter(PAGE_SIZE), 10)<=50?Convert.toInt(ServletUtil.getParameter(PAGE_SIZE), 10):50);
         pageDomain.setOrderByColumn(ServletUtil.getParameter(ORDER_BY_COLUMN));
         pageDomain.setIsAsc(ServletUtil.getParameter(IS_ASC));
         pageDomain.setReasonable(ServletUtil.getParameterToBool(REASONABLE));
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 f9ba2c5..3f71537 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
@@ -27,6 +27,12 @@
     @ApiModelProperty(value = "用户昵称",required = true)
     private String name;
 
+    @ApiModelProperty(value = "机构名称")
+    private String agentName;
+
+    @ApiModelProperty(value = "机构Id")
+    private Long agentId;
+
     @ApiModelProperty("用户角色")
     private String role;
 
@@ -36,4 +42,6 @@
     @ApiModelProperty("用户身份(0代表监管用户,1代表机构用户,2代表专家用户)")
     private Integer identity;
 
+    @ApiModelProperty("用户人脸数据(app使用)")
+    private Object userFace;
 }
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 2910ef7..7c0ef26 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
@@ -14,7 +14,7 @@
     @ApiModelProperty(value = "登录名",required = true)
     @NotBlank(message = "登录名不能为空")
     private String username;
-    @ApiModelProperty(value = "密码",required = true)
+    @ApiModelProperty(value = "密码(base64加密)",required = true)
     @NotBlank(message = "密码不能为空")
     private String password;
     @ApiModelProperty(value = "验证码",required = false)
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java
deleted file mode 100644
index b413c40..0000000
--- a/assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.gkhy.assess.common.enums;
-
-/**
- * 评估文件类型
- *
- */
-public enum AccessoryFileTypeEnum
-{
-    DEVICE_IMAGE(1, "评价机构项目现场勘验人员在主要装置前的合影照片"),
-    INVESTINGATION_IMAGE(2, "评价机构项目现场勘验照片"),
-    COMPANY_IMAGE(3, "评价机构项目现场勘验人员与企业陪同人员图片"),
-    INVESTINGATION_EAST_IMAGE(4, "预评价现场勘验照片-东"),
-    INVESTINGATION_SOUTH_IMAGE(5, "预评价现场勘验照片-南"),
-    INVESTINGATION_WEST_IMAGE(6, "预评价现场勘验照片-西"),
-    INVESTINGATION_NORTH_IMAGE(7, "预评价现场勘验照片-北"),
-    INVESTINGATION_VIDEO(8, "评价机构项目现场勘验视频"),
-    EXCODE(9, "二维码"),
-    PROARCHIVE_FILE(10, "安全评价过程控制记录文档附件");
-
-    private final Integer code;
-    private final String info;
-
-    AccessoryFileTypeEnum(Integer code, String info)
-    {
-        this.code = code;
-        this.info = info;
-    }
-
-    public Integer getCode()
-    {
-        return code;
-    }
-
-    public String getInfo()
-    {
-        return info;
-    }
-}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/RequestSourceEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/RequestSourceEnum.java
new file mode 100644
index 0000000..c9c17ae
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/RequestSourceEnum.java
@@ -0,0 +1,29 @@
+package com.gkhy.assess.common.enums;
+
+/**
+ * 请求来源状态
+ *
+ */
+public enum RequestSourceEnum
+{
+    WEB("web", "web请求"), APP("app", "app请求");
+
+    private final String code;
+    private final String info;
+
+    RequestSourceEnum(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/SensitiveTypeEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/SensitiveTypeEnum.java
new file mode 100644
index 0000000..c22b484
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/SensitiveTypeEnum.java
@@ -0,0 +1,10 @@
+package com.gkhy.assess.common.enums;
+
+/**
+ * 脱敏类型枚举
+ */
+public enum SensitiveTypeEnum {
+    CHINESE_NAME,
+    ID_CARD,
+    MOBILE_PHONE;
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/DesenseUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/DesenseUtil.java
new file mode 100644
index 0000000..93cff71
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/DesenseUtil.java
@@ -0,0 +1,78 @@
+package com.gkhy.assess.common.utils;
+
+import cn.hutool.core.util.DesensitizedUtil;
+import com.gkhy.assess.common.annotation.DataDesensitizationType;
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.api.CommonResult;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.List;
+
+/**
+ * 脱密工具类,(缺陷,不支持子类数据脱密)
+ */
+public class DesenseUtil {
+
+    public static void assertResult(Object data) throws ClassNotFoundException, IllegalAccessException {
+        if(data instanceof CommonResult){
+            CommonResult cr= (CommonResult) data;
+            Object obj=cr.getData();
+            if(obj instanceof CommonPage){
+                assetListResult(((CommonPage)obj).getList());
+            }else if (obj instanceof List){
+                assetListResult(obj);
+            }else{
+                assetOneResult(obj);
+            }
+        }
+    }
+    public static void assetListResult(Object data) throws ClassNotFoundException, IllegalAccessException {
+        List list=(List) data;
+        for (Object record : list) {
+            Class<?> targetClass = Class.forName(record.getClass().getName());
+            Field[] fields = targetClass.getDeclaredFields();
+            reflexUpdateData(record, fields);
+        }
+    }
+
+    public static void assetOneResult(Object data) throws IllegalAccessException, ClassNotFoundException {
+        Class<?> targetClass = Class.forName(data.getClass().getName());
+        Field[] fields=targetClass.getDeclaredFields();
+        reflexUpdateData(data,fields);
+    }
+
+    public static void reflexUpdateData(Object data, Field[] fields) throws IllegalAccessException {
+        for (Field field : fields) {
+            field.setAccessible(true);
+            Object value = field.get(data);
+            if (!(value instanceof String)) {
+                continue;
+            }
+            String valueStr = (String) value;
+            Annotation[] annotations = field.getDeclaredAnnotations();
+            for (Annotation annotation : annotations) {
+                if (annotation instanceof DataDesensitizationType) {
+                    DataDesensitizationType targetAnnotation = (DataDesensitizationType) annotation;
+                    switch (targetAnnotation.type()) {
+                        case CHINESE_NAME: {
+                            field.set(data, DesensitizedUtil.chineseName(valueStr));
+                            break;
+                        }
+                        case ID_CARD: {
+                            field.set(data, DesensitizedUtil.idCardNum(valueStr, 3, 3));
+                            break;
+                        }
+                        case MOBILE_PHONE: {
+                            field.set(data, DesensitizedUtil.mobilePhone(valueStr));
+                            break;
+                        }
+                        default: {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
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 cd30016..0447a9a 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
@@ -1,18 +1,25 @@
 package com.gkhy.assess.common.utils;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.JWTVerifier;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.auth0.jwt.exceptions.JWTDecodeException;
 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 org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.crypto.hash.Md5Hash;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.util.Date;
 
 /**
@@ -37,8 +44,13 @@
 
     public static String tokenHead="";
 
-    /**Token有效期为7天(Token在reids中缓存时间为两倍)*/
-    public static final long EXPIRATION=(7 * 12) * 60 * 60 * 1000;  //JWT的超期限时间(60*60*24*7)
+    /**Token有效期为1天(Token在reids中缓存时间为两倍)  单位ms*/
+    public static final long EXPIRATION=(1 * 24) * 60 * 60 * 1000;  //JWT的超期限时间(60*60*24*1)
+
+    /**
+     * token有效期还有30分钟,刷新token  单位ms
+     */
+    public static final long NEED_UPDATE_TIME= 30 * 60 * 1000;
 
     /**
      * 校验token是否正确
@@ -56,6 +68,20 @@
         }catch (Exception e){
             return false;
         }
+    }
+
+
+    public static boolean isNeedUpdate(String token,String username,String secret){
+        Date expertsAt =null;
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(secret);
+            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+            expertsAt = verifier.verify(token).getExpiresAt();
+        }catch (Exception e){
+            throw new ApiException("token非法无效");
+        }
+        //如果剩余过期时间少于过期时常的一半时 需要更新
+        return (expertsAt.getTime()-System.currentTimeMillis()) < NEED_UPDATE_TIME;
     }
 
     /**
@@ -127,4 +153,30 @@
     }
 
 
+    /**
+     *
+     * @param response
+     * @param code
+     * @param errorMsg
+     */
+    public static void responseError(ServletResponse response, String errorMsg) {
+        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+        // issues/I4YH95浏览器显示乱码问题
+        httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8");
+        CommonResult jsonResult = CommonResult.failed(errorMsg);
+        OutputStream os = null;
+        try {
+            os = httpServletResponse.getOutputStream();
+            httpServletResponse.setCharacterEncoding("UTF-8");
+         //   httpServletResponse.setStatus(code);
+            os.write(new ObjectMapper().writeValueAsString(jsonResult).getBytes("UTF-8"));
+            os.flush();
+            os.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
 }
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/aop/DataDesensitizationAspect.java b/assess-framework/src/main/java/com/gkhy/assess/framework/aop/DataDesensitizationAspect.java
new file mode 100644
index 0000000..09fe57d
--- /dev/null
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/aop/DataDesensitizationAspect.java
@@ -0,0 +1,47 @@
+package com.gkhy.assess.framework.aop;
+
+import com.gkhy.assess.common.annotation.DataDesensitization;
+import com.gkhy.assess.common.utils.DesenseUtil;
+import com.gkhy.assess.common.utils.JwtTokenUtil;
+import com.gkhy.assess.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+
+/**
+ * 数据脱密
+ */
+@Aspect
+@Component
+@Slf4j
+public class DataDesensitizationAspect {
+    @Autowired
+    private HttpServletRequest request;
+    @Pointcut("@annotation(com.gkhy.assess.common.annotation.DataDesensitization)")
+    public void pointcut(){}
+
+    @Around("pointcut()")
+    public Object doaround(ProceedingJoinPoint point) throws Throwable {
+        Object object=point.proceed();
+        String jwtToken = request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN);
+        if(StringUtils.isNotBlank(jwtToken)){//token为空,进行数据脱敏
+            return object;
+        }
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        Method method = signature.getMethod();
+        if(!method.isAnnotationPresent(DataDesensitization.class)){
+            return object;
+        }
+        DesenseUtil.assertResult(object);
+        return object;
+    }
+}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java b/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java
index f810eb2..510651b 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java
@@ -57,7 +57,10 @@
         webLog.put("basePath", StringUtils.removeSuffix(urlStr, URLUtil.url(urlStr).getPath()));
         webLog.put("ip", ServletUtil.getClientIP(request,null));
         webLog.put("method",request.getMethod());
-        Object params=getParameter(method, joinPoint.getArgs());
+        Object params=null;
+        if(!requestURL.equals("/api/app/system/user-face")){
+            params=getParameter(method, joinPoint.getArgs());
+        }
         webLog.put("parameter",params);
         webLog.put("uri",request.getRequestURI());
         webLog.put("url",requestURL.toString());
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 579768a..d517027 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
@@ -25,8 +25,6 @@
 @Configuration
 // 表示通过aop框架暴露该代理对象,AopContext能够访问
 @EnableAspectJAutoProxy(exposeProxy = true)
-// 指定要扫描的Mapper类的包的路径
-@MapperScan("com.gkhy.**.mapper")
 public class ApplicationConfig
 {
 
@@ -42,6 +40,10 @@
 //        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
 //    }
 
+    /**
+     * 时间序列化
+     * @return
+     */
     @Bean
     public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
         return builder -> {
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java
index 94d83f8..fec038e 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java
@@ -25,26 +25,31 @@
 
     @Value("${xss.urlPatterns}")
     private String urlPatterns;
-//
-//    @SuppressWarnings({ "rawtypes", "unchecked" })
-//    @Bean
-//    @ConditionalOnProperty(value = "xss.enabled", havingValue = "true")
-//    public FilterRegistrationBean xssFilterRegistration()
-//    {
-//        FilterRegistrationBean registration = new FilterRegistrationBean();
-//        registration.setDispatcherTypes(DispatcherType.REQUEST);
-//        registration.setFilter(new XssFilter());
-//        registration.addUrlPatterns(String.valueOf(StringUtils.split(urlPatterns, ",")));
-//        registration.setName("xssFilter");
-//        registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);
-//        Map<String, String> initParameters = new HashMap<String, String>();
-//        initParameters.put("excludes", excludes);
-//        registration.setInitParameters(initParameters);
-//        return registration;
-//    }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Bean
+    @ConditionalOnProperty(value = "xss.enabled", havingValue = "true")
+    public FilterRegistrationBean xssFilterRegistration()
+    {
+        FilterRegistrationBean registration = new FilterRegistrationBean();
+        registration.setDispatcherTypes(DispatcherType.REQUEST);
+        registration.setFilter(new XssFilter());
+        StringUtils.split(urlPatterns,10);
+        registration.addUrlPatterns(String.join(",",StringUtils.split(urlPatterns, ",")));
+        registration.setName("xssFilter");
+        registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);
+        Map<String, String> initParameters = new HashMap<String, String>();
+        initParameters.put("excludes", excludes);
+        registration.setInitParameters(initParameters);
+        return registration;
+    }
+
+    /**
+     * 重复请求校验
+     * @return
+     */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Bean
     public FilterRegistrationBean someFilterRegistration()
     {
         FilterRegistrationBean registration = new FilterRegistrationBean();
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java
index b03009d..df0aa62 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java
@@ -2,6 +2,7 @@
 
 import com.gkhy.assess.framework.interceptor.LogInterceptor;
 import com.gkhy.assess.framework.interceptor.RepeatSubmitInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
@@ -13,6 +14,8 @@
 
 
 @Configuration
+// 指定要扫描的Mapper类的包的路径
+@MapperScan("com.gkhy.**.mapper")
 public class MyWebMvcConfig implements WebMvcConfigurer {
     @Value("${image.upload_path}")
     private String uploadPath;
@@ -40,4 +43,5 @@
         registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
 
     }
+
 }
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 633d963..6d6083b 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
@@ -18,6 +18,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import java.sql.SQLException;
+import java.sql.SQLSyntaxErrorException;
 
 /**
  * 全局异常处理类
@@ -82,7 +83,7 @@
     public CommonResult handleRuntimeException(RuntimeException ex, HttpServletRequest request)
     {
         writeExceptionLogFile(ex);
-        return CommonResult.failed(ex.getMessage());
+        return CommonResult.failed("内部服务异常");
     }
 
 
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 98bb8c4..f2deed4 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
@@ -68,8 +68,10 @@
         chain.addPathDefinition("/error", "anon");
         chain.addPathDefinition("/upload/**", "anon");
 
-        chain.addPathDefinition("/account/login","anon");
-        chain.addPathDefinition("/logout", "logout");
+        chain.addPathDefinition("/system/account/login","anon");
+        chain.addPathDefinition("/system/logout", "anon");
+        chain.addPathDefinition("/app/system/account/login","anon");
+        chain.addPathDefinition("/app/system/logout", "anon");
 
         chain.addPathDefinition("/notice/noticeList","anon");
         chain.addPathDefinition("/notice/getNoticeById","anon");
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 ea6f44c..5e5e18d 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,6 +3,7 @@
 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 lombok.extern.slf4j.Slf4j;
@@ -19,6 +20,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
+import java.util.Date;
 
 @Slf4j
 public class JwtFilter extends BasicHttpAuthenticationFilter {
@@ -76,6 +78,7 @@
             return true;
         } catch (Exception e){ //未找到token
             log.error(e.getMessage());
+            JwtTokenUtil.responseError(response,e.getMessage());
         }
         return false;
     }
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 31cf00c..ab85786 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
@@ -15,6 +15,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 
 @Component
@@ -25,6 +26,8 @@
     private SysPasswordService passwordService;
     @Autowired
     private RedisUtils redisUtils;
+    @Autowired
+    private HttpServletRequest request;
 
     public SysUser login(String username, String password) {
         SysUser sysUser=sysUserService.getUserByUsernamePhone(username);
@@ -37,6 +40,16 @@
     public void validUser(SysUser sysUser){
         if(sysUser==null) {
             throw new AuthenticationException("用户不存在");
+        }
+        String uri=request.getRequestURI();
+        if(uri.startsWith("/api/system")){
+            if(UserIdentityEnum.EXPERT.getCode().equals(sysUser.getIdentity())){
+                throw new AuthenticationException("专家用户无权登录后台");
+            }
+        }else if(uri.startsWith("/api/app/")){
+            if(!UserIdentityEnum.EXPERT.getCode().equals(sysUser.getIdentity())){
+                throw new AuthenticationException("只有专家用户才能登录APP");
+            }
         }
         if(UserStatusEnum.DELETED.getCode().equals(sysUser.getDelFlag())){
             throw new AuthenticationException("用户已被删除");
@@ -52,14 +65,18 @@
     }
 
     public SysUser validJwtToken(String jwtToken){
+
         String username= JwtTokenUtil.getUsername(jwtToken);
         if(StringUtils.isEmpty(username)){
             throw new AuthenticationException("token非法无效!");
         }
         SysUser sysUser=sysUserService.getUserByUsernamePhone(username);
         validUser(sysUser);
+        if(!JwtTokenUtil.verify(jwtToken,username,sysUser.getPassword())){
+            throw new AuthenticationException("token非法无效!");
+        }
         if(!jwtTokenRefresh(jwtToken,username,sysUser.getPassword())){
-            throw new AuthenticationException("Token失效,请重新登录!");
+            throw new AuthenticationException("Token已失效,请重新登录!");
         }
      //   setRolePermission(sysUser);
         return sysUser;
@@ -84,7 +101,7 @@
         String cacheToken= (String) redisUtils.get(tokenKey);
         if(StringUtils.isNotEmpty(cacheToken)){
             // 校验token有效性
-            if(!JwtTokenUtil.verify(cacheToken,username,passWord)){
+            if(!JwtTokenUtil.isNeedUpdate(cacheToken,username,passWord)){
                 String newToken=JwtTokenUtil.sign(username,passWord);
                 // 设置超时时间
                 redisUtils.set(tokenKey,newToken);
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
new file mode 100644
index 0000000..9890066
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAccessoryFile.java
@@ -0,0 +1,75 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 评估文件上传记录表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_accessory_file")
+@ApiModel(value = "AssAccessoryFile对象", description = "评估文件上传记录表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
+public class AssAccessoryFile extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("文件名称")
+    @TableField("file_name")
+    private String fileName;
+
+    @ApiModelProperty("文件原始名称")
+    @TableField("origin_name")
+    private String originName;
+
+    @NotBlank(message = "文件存放路径不能为空")
+    @ApiModelProperty(value = "文件存放路径",required = true)
+    @TableField("path")
+    private String path;
+
+    @NotNull(message = "模块code不能为空")
+    @ApiModelProperty(value = "模块code:1主要装置前的合影照片,2现场勘验照片,3企业陪同人员图片,4现场勘验视频,5现场勘验记录附件,6评审记录附件,7评价结论,8过程控制记录文档附件,9项目归档材料,10报备申请附件,11项目整改情况附件",required = true)
+    @TableField("module_type")
+    private Integer moduleType;
+
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+}
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
new file mode 100644
index 0000000..b0c0e6a
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssAudit.java
@@ -0,0 +1,159 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.system.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 审核表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_audit")
+@ApiModel(value = "AssAudit对象", description = "审核表")
+@JsonInclude(NON_NULL)
+public class AssAudit extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "审核日期不能为空")
+    @ApiModelProperty(value = "审核日期(格式yyyy-MM-dd 00:00:00)",required = true)
+    @TableField("audit_date")
+    private LocalDateTime auditDate;
+
+    @ApiModelProperty("内部审核确定日期")
+    @TableField("affirm_date")
+    private LocalDateTime affirmDate;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty("项目id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @NotNull(message = "审核类型不能为空")
+    @ApiModelProperty("审核类型(1内部审核2技术审核)")
+    @TableField("audit_type")
+    private Integer auditType;
+
+    @NotNull(message = "审核人不能为空")
+    @ApiModelProperty("审核人id")
+    @TableField("assessor_id")
+    private Long assessorId;
+
+    @ApiModelProperty("已按要求修改完成(0否 1是)")
+    @TableField("is_amend_finish")
+    private Boolean isAmendFinish;
+
+    @ApiModelProperty("评价依据是否充分、准确、有效(0否 1是)")
+    @TableField("is_basis")
+    private Boolean isBasis;
+
+    @ApiModelProperty("结论是否正确(0否 1是)")
+    @TableField("is_conclusion")
+    private Boolean isConclusion;
+
+    @ApiModelProperty("危险有害因素识别是否全面(0否 1是)")
+    @TableField("is_danger_overall")
+    private Boolean isDangerOverall;
+
+    @ApiModelProperty("附件与附图是否有效及规范(0否 1是)")
+    @TableField("is_file")
+    private Boolean isFile;
+
+    @ApiModelProperty("格式是否符合要求(0否 1是)")
+    @TableField("is_format")
+    private Boolean isFormat;
+
+    @ApiModelProperty("对策措施与建议是否可行(0否 1是)")
+    @TableField("is_measure")
+    private Boolean isMeasure;
+
+    @ApiModelProperty("评价方法选择是否适当(0否 1是)")
+    @TableField("is_method_selection")
+    private Boolean isMethodSelection;
+
+    @ApiModelProperty("可报技术负责人审核(0否 1是)")
+    @TableField("is_report_audit")
+    private Boolean isReportAudit;
+
+    @ApiModelProperty("评价范围是否与合同一致(0否 1是)")
+    @TableField("is_scope")
+    private Boolean isScope;
+
+    @ApiModelProperty("文字、数据是否准确(0否 1是)")
+    @TableField("is_text")
+    private Boolean isText;
+
+    @ApiModelProperty("评价单元划分是否合理(0否 1是)")
+    @TableField("is_unit_division")
+    private Boolean isUnitDivision;
+
+    @ApiModelProperty("报告中所列评价依据是否得到引用和验证(0否 1是)")
+    @TableField("is_basis_quote")
+    private Boolean isBasisQuote;
+
+    @ApiModelProperty("评价结论及格式是否正确(0否 1是)")
+    @TableField("is_conclusion_right")
+    private Boolean isConclusionRight;
+
+    @ApiModelProperty("危险有害因素识别是否充分(0否 1是)")
+    @TableField("is_danger_full")
+    private Boolean isDangerFull;
+
+    @ApiModelProperty("现场收集的有关资料是否齐全、有效(0否 1是)")
+    @TableField("is_data")
+    private Boolean isData;
+
+    @ApiModelProperty("报告中是否有重大遗漏(0否 1是)")
+    @TableField("is_omission")
+    private Boolean isOmission;
+
+    @ApiModelProperty("对策措施及建议是否有针对性、合理性(0否 1是)")
+    @TableField("is_measure_equitable")
+    private Boolean isMeasureEquitable;
+
+    @ApiModelProperty("评价方法选用是否合理(0否 1是)")
+    @TableField("is_method_rational")
+    private Boolean isMethodRational;
+
+    @ApiModelProperty("存在问题及建议(500字符)")
+    @TableField("suggestions")
+    private String suggestions;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("审核人对象")
+    @TableField(exist = false)
+    private SysUser assessor;
+
+
+}
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
new file mode 100644
index 0000000..95ac9a2
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssConclusion.java
@@ -0,0 +1,69 @@
+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 java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 项目结论表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_conclusion")
+@ApiModel(value = "AssConclusion对象", description = "项目结论表")
+@JsonInclude(NON_NULL)
+public class AssConclusion extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "评价结论不能为空")
+    @ApiModelProperty(value = "评价结论",required = true)
+    @TableField("conclusion")
+    private String conclusion;
+
+    @NotNull(message = "是否有评价报告修改说明不能为空")
+    @ApiModelProperty(value = "是否有评价报告修改说明(0否 1是)",required = true)
+    @TableField("is_revise_manual")
+    private Boolean isReviseManual;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @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
new file mode 100644
index 0000000..ec298b7
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssContract.java
@@ -0,0 +1,80 @@
+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 java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 合同管理表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_contract")
+@ApiModel(value = "AssContract对象", description = "合同管理表")
+@JsonInclude(NON_NULL)
+public class AssContract extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "合同价格不能为空")
+    @ApiModelProperty(value = "合同价格/万",required = true)
+    @TableField("contract_money")
+    private String contractMoney;
+
+    @ApiModelProperty("实际合同价格/万")
+    @TableField("actual_contract_money")
+    private String actualContractMoney;
+
+    @NotNull(message = "合同签订时间不能为空")
+    @ApiModelProperty(value = "合同签订时间(yyyy-MM-dd 00:00:00)",required = true)
+    @TableField("contract_sign_date")
+    private LocalDateTime contractSignDate;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty("项目id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("合同额外说明(100字以内)")
+    @TableField("contract_introduction")
+    private String contractIntroduction;
+
+    @ApiModelProperty("实际合同额外说明(100字以内)")
+    @TableField("actual_contract_introduction")
+    private String actualContractIntroduction;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @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
new file mode 100644
index 0000000..9075f00
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssDevice.java
@@ -0,0 +1,73 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 设备表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_device")
+@ApiModel(value = "AssDevice对象", description = "设备表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
+public class AssDevice extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "设备名称不能为空")
+    @ApiModelProperty(value = "设备名称",required = true)
+    @TableField("device_name")
+    private String deviceName;
+
+    @NotNull(message = "使用开始时间不能为空")
+    @ApiModelProperty(value = "使用开始时间",required = true)
+    @TableField("start_date")
+    private LocalDateTime startDate;
+
+    @NotNull(message = "使用结束时间不能为空")
+    @ApiModelProperty(value = "使用结束时间",required = true)
+    @TableField("end_date")
+    private LocalDateTime endDate;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @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
new file mode 100644
index 0000000..0ee466b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimatePlan.java
@@ -0,0 +1,92 @@
+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 java.time.LocalDateTime;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 评价项目计划表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_estimate_plan")
+@ApiModel(value = "AssEstimatePlan对象", description = "评价项目计划表")
+@JsonInclude(NON_NULL)
+public class AssEstimatePlan extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "评价机构负责人id不能为空")
+    @ApiModelProperty(value = "评价机构负责人id",required = true)
+    @TableField("auser_id")
+    private Long auserId;
+
+    @NotNull(message = "评价开始时间不能为空")
+    @ApiModelProperty(value = "评价开始时间",required = true)
+    @TableField("start_date")
+    private LocalDateTime startDate;
+
+    @NotNull(message = "评价结束时间不能为空")
+    @ApiModelProperty(value = "评价结束时间",required = true)
+    @TableField("end_date")
+    private LocalDateTime endDate;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @Valid
+    @NotNull(message = "评价日程安排列表不能为空")
+    @ApiModelProperty(value = "评价日程安排列表",required = true)
+    @TableField(exist = false)
+    private List<AssEstimateSchedule> estimateSchedules;
+
+
+    @ApiModelProperty(value = "项目组成员列表")
+    @TableField(exist = false)
+    private List<AssPlanPerson> planPersons;
+
+
+    @ApiModelProperty("所需仪器列表")
+    @TableField(exist = false)
+    private List<AssDevice> devices;
+
+    @ApiModelProperty("机构负责人对象")
+    @TableField(exist = false)
+    private SysUser auser;
+
+
+}
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
new file mode 100644
index 0000000..b7c506b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateSchedule.java
@@ -0,0 +1,80 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 评价日程安排表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_estimate_schedule")
+@ApiModel(value = "AssEstimateSchedule对象", description = "评价日程安排表")
+@JsonInclude(NON_NULL)
+public class AssEstimateSchedule extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "日程名称不能为空")
+    @ApiModelProperty(value = "日程名称",required = true)
+    @TableField("name")
+    private String name;
+
+    @NotNull(message = "日程类型不能为空")
+    @ApiModelProperty("日程类型:1勘验准备,2现场勘验,3材料分析整理,4评价报告编写,5整改情况现场确认,6整理评价报告,7报告审核,8报告修改")
+    @TableField("schedule_type")
+    private Integer scheduleType;
+
+    @NotNull(message = "开始时间不能为空")
+    @ApiModelProperty("开始时间")
+    @TableField("start_date")
+    private LocalDateTime startDate;
+
+    @NotNull(message = "结束时间不能为空")
+    @ApiModelProperty("结束时间")
+    @TableField("end_date")
+    private LocalDateTime endDate;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty("项目id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @NotNull(message = "序号不能为空")
+    @ApiModelProperty("序号")
+    @TableField("sort")
+    private Integer sort;
+
+}
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
new file mode 100644
index 0000000..fa84b3c
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssEstimateTask.java
@@ -0,0 +1,89 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.system.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 评价认为通知表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_estimate_task")
+@ApiModel(value = "AssEstimateTask对象", description = "评价认为通知表")
+@JsonInclude(NON_NULL)
+public class AssEstimateTask extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message ="项目负责人id不能为空" )
+    @ApiModelProperty(value = "项目负责人id",required = true)
+    @TableField("leader_id")
+    private Long leaderId;
+
+    @NotBlank(message ="联系人不能为空" )
+    @ApiModelProperty(value = "联系人(10个字符)",required = true)
+    @TableField("link_man")
+    private String linkMan;
+
+    @NotBlank(message ="联系电话不能为空" )
+    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$",message = "手机号码有误!")
+    @ApiModelProperty(value = "联系电话(11个字符)",required = true)
+    @TableField("link_phone")
+    private String linkPhone;
+
+    @ApiModelProperty("传真")
+    @TableField("fax")
+    private String fax;
+
+    @NotNull(message ="任务下达时间不能为空" )
+    @ApiModelProperty(value = "任务下达时间(yyyy-MM-dd 00:00:00)",required = true)
+    @TableField("transmit_date")
+    private LocalDateTime transmitDate;
+
+    @ApiModelProperty("任务下达人")
+    @TableField("transmit_person")
+    private String transmitPerson;
+
+    @NotNull(message ="项目id不能为空" )
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("负责人")
+    @TableField(exist = false)
+    private SysUser leader;
+}
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
new file mode 100644
index 0000000..60c7de2
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecognition.java
@@ -0,0 +1,83 @@
+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.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotNull;
+
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 签字确认表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_face_recognition")
+@ApiModel(value = "AssFaceRecognition对象", description = "签字确认表")
+@JsonInclude(NON_NULL)
+public class AssFaceRecognition extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "人员id不能为空")
+    @ApiModelProperty(value = "人员id",required = true)
+    @TableField("person_id")
+    private Long personId;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "签字图片路径")
+    @TableField("sign_path")
+    private String signPath;
+
+    @ApiModelProperty(value = "承诺书图片id",required = true)
+    @TableField("insurance_pic_id")
+    private Long insurancePicId;
+
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @NotNull(message = "签字图片对象不能为空")
+    @ApiModelProperty(value = "签字图片对象",required = true)
+    @TableField(exist = false)
+    private MultipartFile file;
+
+
+    @ApiModelProperty("人脸识别记录对象")
+    @TableField(exist = false)
+    private AssFaceRecord faceRecord;
+
+    @ApiModelProperty("人员对象")
+    @TableField(exist = false)
+    private SysUser person;
+
+}
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
new file mode 100644
index 0000000..9c7a4f1
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFaceRecord.java
@@ -0,0 +1,95 @@
+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.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 现场勘验人员人脸识别记录表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_face_record")
+@ApiModel(value = "AssFaceRecord对象", description = "现场勘验人员人脸识别记录表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
+public class AssFaceRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "用户id不能为空")
+    @ApiModelProperty(value = "用户id",required = true)
+    @TableField("person_id")
+    private Long personId;
+
+    @ApiModelProperty(value = "人脸识别图片存放路径")
+    @TableField("face_path")
+    private String facePath;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @NotBlank(message = "定位坐标不能为空")
+    @ApiModelProperty(value = "定位坐标(纬度/经度,逗号隔开)",required = true)
+    @TableField("location")
+    private String location;
+
+    @NotNull(message = "是否是现场勘验人脸识别不能为空")
+    @ApiModelProperty(value = "是否是现场勘验人脸识别(0否 1是,默认0)",required = true)
+    @TableField("scene")
+    private Integer  scene;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @NotNull(message = "图片对象不能为空")
+    @ApiModelProperty(value = "图片对象",required = true)
+    @TableField(exist = false)
+    private MultipartFile file;
+
+    @ApiModelProperty("项目组成员对象")
+    @TableField(exist = false)
+    private AssPlanPerson planPerson;
+
+    @ApiModelProperty("用户对象")
+    @TableField(exist = false)
+    private SysUser person;
+
+    @ApiModelProperty(value = "现场勘验填报坐标")
+    @TableField(exist = false)
+    private String investLocation;
+
+
+
+
+}
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
new file mode 100644
index 0000000..8876572
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssFilingApply.java
@@ -0,0 +1,62 @@
+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.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 报备申请表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_filing_apply")
+@ApiModel(value = "AssFilingApply对象", description = "报备申请表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
+public class AssFilingApply extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @NotNull(message = "报备文件id不能为空")
+    @ApiModelProperty(value = "报备文件id",required = true)
+    @TableField("file_id")
+    private Long fileId;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("报备申请附件")
+    @TableField(exist = false)
+    private AssAccessoryFile accessoryFile;
+
+}
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
new file mode 100644
index 0000000..2126a98
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssInvestigation.java
@@ -0,0 +1,108 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 现场勘验记录表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_investigation")
+@ApiModel(value = "AssInvestigation对象", description = "现场勘验记录表")
+@JsonInclude(NON_NULL)
+public class AssInvestigation extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "现场勘验时间不能为空")
+    @ApiModelProperty(value = "现场勘验时间,时间格式yyyy-MM-dd 00:00:00",required = true)
+    @TableField("investigation_date")
+    private LocalDateTime investigationDate;
+
+    @ApiModelProperty("是否第一次(0是,1否)")
+    @TableField("is_first")
+    private Boolean isFirst;
+
+
+    @ApiModelProperty("编制现场安全检查表(1是,0否)")
+    @TableField("is_safety_check")
+    private Integer isSafetyCheck;
+
+    @ApiModelProperty("现场勘验记录(200字)")
+    @TableField("record_data")
+    private String recordData;
+
+    @NotNull(message = "现场勘验坐标不能为空")
+    @ApiModelProperty(value = "现场勘验坐标(纬度/经度,逗号隔开)",required = true)
+    @TableField("location")
+    private String location;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty("项目id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+    @ApiModelProperty("审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+    @TableField(exist = false)
+    private Integer state;
+
+
+    @ApiModelProperty("现场勘验记录附件")
+    @TableField(exist = false)
+    private List<AssAccessoryFile> assAccessoryFiles;
+
+
+    @ApiModelProperty("企业陪同合照列表")
+    @TableField(exist = false)
+    private List<AssAccessoryFile> ccompanyImages;
+
+    @ApiModelProperty("主要装置前的合影照片列表")
+    @TableField(exist = false)
+    private List<AssAccessoryFile> deviceImages;
+
+    @ApiModelProperty("现场勘验照片")
+    @TableField(exist = false)
+    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/AssPlanPerson.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java
new file mode 100644
index 0000000..7e2b11a
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssPlanPerson.java
@@ -0,0 +1,104 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.system.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 评价项目组成员表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_plan_person")
+@ApiModel(value = "AssPlanPerson对象", description = "评价项目组成员表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
+public class AssPlanPerson extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "成员id不能为空")
+    @ApiModelProperty(value = "成员id",required = true)
+    @TableField("person_id")
+    private Long personId;
+
+    @NotNull(message = "工作类型不能为空")
+    @ApiModelProperty(value = "工作类型:1普通人员,2组长",required = true)
+    @TableField("job_type")
+    private Integer jobType;
+
+
+    @ApiModelProperty(value = "项目担任角色:1项目负责人,2项目组成员,3过程控制负责人,4机构评价负责人,5技术负责人,默认2")
+    @TableField("play_role")
+    private Integer playRole;
+
+    @NotNull(message = "承诺后期前往现场勘验不能为空")
+    @ApiModelProperty(value = "承诺后期前往现场勘验(0否,1是)",required = true)
+    @TableField("later_promise")
+    private Boolean laterPromise;
+
+    @NotBlank(message = "承担工作不能为空")
+    @ApiModelProperty(value = "承担工作,多个英文逗号分隔",required = true)
+    @TableField("work")
+    private String work;
+
+    @ApiModelProperty("未到现场勘验原因(最多30字)")
+    @TableField("reason")
+    private String reason;
+
+    @ApiModelProperty("排序")
+    @TableField("sort")
+    private Integer sort;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+
+    @ApiModelProperty(value = "是否已告知 0否 1是 默认0",required = true)
+    @TableField("informed")
+    private Integer informed;
+
+//    @ApiModelProperty(value = "从业告知id",required = true)
+//    @TableField("work_notification_id")
+//    private Long workNotificationId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("成员对象")
+    @TableField(exist = false)
+    private SysUser person;
+
+}
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
new file mode 100644
index 0000000..967145f
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProcessAudit.java
@@ -0,0 +1,184 @@
+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.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.system.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 过程控制负责人审核表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_process_audit")
+@ApiModel(value = "AssProcessAudit对象", description = "过程控制负责人审核表")
+@JsonInclude(NON_NULL)
+public class AssProcessAudit extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "审核日期不能为空")
+    @ApiModelProperty(value = "审核日期",required = true)
+    @TableField("audit_date")
+    private LocalDateTime auditDate;
+
+    @NotNull(message = "过程控制负责不能为空")
+    @ApiModelProperty(value = "过程控制负责人id",required = true)
+    @TableField("process_leader_id")
+    private Long processLeaderId;
+
+    @ApiModelProperty("存在问题及建议(500字符)")
+    @TableField("suggestions")
+    private String suggestions;
+
+    @ApiModelProperty("编制安全评价项目计划书(0否 1是)")
+    @TableField("is_estimate_plan")
+    private Boolean isEstimatePlan;
+
+    @ApiModelProperty("评价任务通知书(0否 1是)")
+    @TableField("is_estimate_task")
+    private Boolean isEstimateTask;
+
+    @ApiModelProperty("签订合同(0否 1是)")
+    @TableField("is_sign_contract")
+    private Boolean isSignContract;
+
+    @ApiModelProperty("评价报告外审意见0否 1是)")
+    @TableField("is_exterior_audit")
+    private Boolean isExteriorAudit;
+
+    @ApiModelProperty("报告归档材料完整性(0否 1是)")
+    @TableField("is_full_materials")
+    private Boolean isFullMaterials;
+
+    @ApiModelProperty("评价报告内部审核(0否 1是)")
+    @TableField("is_interior_audit")
+    private Boolean isInteriorAudit;
+
+    @ApiModelProperty("现场勘验记录及影像资料(0否 1是)")
+    @TableField("is_investigation_site")
+    private Boolean isInvestigationSite;
+
+    @ApiModelProperty("评价项目网上信息公开(0否 1是)")
+    @TableField("is_open_information")
+    private Boolean isOpenInformation;
+
+    @ApiModelProperty("被评价单位提供材料清单(0否 1是)")
+    @TableField("is_provide_materials")
+    private Boolean isProvideMaterials;
+
+    @ApiModelProperty("风险分析(0否 1是)")
+    @TableField("is_risk_analyse")
+    private Boolean isRiskAnalyse;
+
+    @ApiModelProperty("技术负责人审核(0否 1是)")
+    @TableField("is_technolgy_audit")
+    private Boolean isTechnolgyAudit;
+
+    @ApiModelProperty("二维码的使用(0否 1是)")
+    @TableField("is_use_qrcode")
+    private Boolean isUseQrcode;
+
+    @ApiModelProperty("从业告知(0否 1是)")
+    @TableField("is_work_notification")
+    private Boolean isWorkNotification;
+
+    @ApiModelProperty("编制安全评价项目计划书-不符合描述(20字符)")
+    @TableField("estimate_plan_des")
+    private String estimatePlanDes;
+
+    @ApiModelProperty("评价任务通知书-不符合描述(20字符)")
+    @TableField("estimate_task_des")
+    private String estimateTaskDes;
+
+    @ApiModelProperty("签订合同-不符合描述(20字符)")
+    @TableField("sign_contract_des")
+    private String signContractDes;
+
+    @ApiModelProperty("评价报告外审意见-不符合描述(20字符)")
+    @TableField("exterior_audit_des")
+    private String exteriorAuditDes;
+
+    @ApiModelProperty("报告归档材料完整性-不符合描述(20字符)")
+    @TableField("full_materials_des")
+    private String fullMaterialsDes;
+
+    @ApiModelProperty("评价报告内部审核-不符合描述(20字符)")
+    @TableField("interior_audit_des")
+    private String interiorAuditDes;
+
+    @ApiModelProperty("现场勘验记录及影像资料-不符合描述(20字符)")
+    @TableField("investigation_site_des")
+    private String investigationSiteDes;
+
+    @ApiModelProperty("评价项目网上信息公开-不符合描述(20字符)")
+    @TableField("open_information_des")
+    private String openInformationDes;
+
+    @ApiModelProperty("被评价单位提供材料清单-不符合描述(20字符)")
+    @TableField("provide_materials_des")
+    private String provideMaterialsDes;
+
+    @ApiModelProperty("风险分析-不符合描述(20字符)")
+    @TableField("risk_analyse_des")
+    private String riskAnalyseDes;
+
+    @ApiModelProperty("技术负责人审核-不符合描述(20字符)")
+    @TableField("technolgy_audit_des")
+    private String technolgyAuditDes;
+
+    @ApiModelProperty("二维码的使用-不符合描述(20字符)")
+    @TableField("use_qrcode_des")
+    private String useQrcodeDes;
+
+    @ApiModelProperty("从业告知-不符合描述(20字符)")
+    @TableField("work_notification_des")
+    private String workNotificationDes;
+
+    @ApiModelProperty("审核结论是否满足过程控制要求(0否 1是)")
+    @TableField("is_full_process")
+    private Boolean isFullProcess;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("过程负责人对象)")
+    @TableField(exist = false)
+    private SysUser processLeader;
+
+    @ApiModelProperty("过程控制附件")
+    @TableField(exist = false)
+    List<AssAccessoryFile> accessoryFiles;
+
+}
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
new file mode 100644
index 0000000..9a2359c
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProject.java
@@ -0,0 +1,192 @@
+package com.gkhy.assess.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+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 static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 项目表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-11 14:16:18
+ */
+@Getter
+@Setter
+@TableName("ass_project")
+@Accessors(chain = true)
+@ApiModel(value = "AssProject对象", description = "项目表")
+@JsonInclude(NON_NULL)
+public class AssProject extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "项目名称不能为空")
+    @ApiModelProperty(value = "项目名称",required = true)
+    @TableField("name")
+    private String name;
+
+
+    @ApiModelProperty(value = "项目编号",required = true)
+    @TableField("code")
+    private String code;
+
+
+    @ApiModelProperty(value = "机构id")
+    @TableField("agency_id")
+    private Long agencyId;
+
+    @NotBlank(message = "委托方不能为空")
+    @ApiModelProperty(value = "委托方",required = true)
+    @TableField("client")
+    private String client;
+
+    @NotBlank(message = "省份不能为空")
+    @ApiModelProperty(value = "省份",required = true)
+    @TableField("province")
+    private String province;
+
+    @NotBlank(message = "城市不能为空")
+    @ApiModelProperty(value = "城市",required = true)
+    @TableField("city")
+    private String city;
+
+    @ApiModelProperty("区县")
+    @TableField("district")
+    private String district;
+
+    @NotBlank(message = "业务范围不能为空")
+    @ApiModelProperty(value = "业务范围,字典id",required = true)
+    @TableField("business")
+    private String business;
+
+    @NotBlank(message = "项目投资额不能为空")
+    @ApiModelProperty(value = "项目投资额/万",required = true)
+    @TableField("invest")
+    private String invest;
+
+    @NotBlank(message = "项目地址不能为空")
+    @Length(min=0,max=100,message = "项目地址不能超过{max}字符")
+    @ApiModelProperty(value = "项目地址(最大长度100字符)",required = true)
+    @TableField("address")
+    private String address;
+
+    @ApiModelProperty("实际纬度/经度")
+    @TableField("actual_location")
+    private String actualLocation;
+
+
+    @ApiModelProperty("纬度/经度")
+    @TableField("location")
+    private String location;
+
+    @NotNull(message = "评估类型不能为空")
+    @ApiModelProperty(value = "评估类型,字典id",required = true)
+    @TableField("estimate_type")
+    private Long estimateType;
+
+//    @NotBlank(message = "负责人不能为空")
+//    @ApiModelProperty(value = "负责人id",required = true)
+//    @TableField("leader_id")
+//    private Long leaderId;
+
+
+    @ApiModelProperty(value = "项目完成时间")
+    @TableField("filing_date")
+    private LocalDateTime filingDate;
+
+
+    @NotBlank(message = "社会统一信用代码不能为空")
+    @ApiModelProperty(value = "委托单位社会统一信用代码",required = true)
+    @TableField("credit_code")
+    private String creditCode;
+
+    @ApiModelProperty("项目状态(0创建,1风险评估,2合同管理,默认0)")
+    @TableField("report_progress")
+    private Integer reportProgress;
+
+    @ApiModelProperty("项目阶段(1风险分析评价计划,2现场勘验,3项目审核,4出具报告,5项目归档)")
+    @TableField("phase")
+    private Integer phase;
+
+    @ApiModelProperty("审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+    @TableField("state")
+    private Integer state;
+
+    @NotBlank(message = "项目基本概况不能为空")
+    @Length(min =1,max =  500,message = "项目基本概况不能超过500字")
+    @ApiModelProperty(value = "项目基本概况(500字以内)",required = true)
+    @TableField("introduction")
+    private String introduction;
+
+    @ApiModelProperty("是否参与评审(0否,1是,默认0)")
+    @TableField("is_review")
+    private Boolean isReview;
+
+
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+    @ApiModelProperty("负责人对象")
+    @TableField(exist = false)
+    private SysUser leader;
+
+    @ApiModelProperty("负责人id")
+    @TableField(exist = false)
+    private Long leaderId;
+
+    @ApiModelProperty("业务范围")
+    @TableField(exist = false)
+    private String businessName;
+
+    @ApiModelProperty("评估类型名称")
+    @TableField(exist = false)
+    private String estimateTypeName;
+
+    @ApiModelProperty("项目归档材料列表")
+    @TableField(exist = false)
+    private List<AssProjectMaterial> projectMaterials;
+
+    @ApiModelProperty("项目成员id")
+    @TableField(exist = false)
+    private Long planPersonId;
+
+    @ApiModelProperty("项目成员对象")
+    @TableField(exist = false)
+    private AssPlanPerson planPerson;
+
+    @ApiModelProperty("项目合同")
+    @TableField(exist = false)
+    private AssContract contract;
+
+    @ApiModelProperty("要件数量")
+    @TableField(exist = false)
+    private Integer materialCnt;
+}
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
new file mode 100644
index 0000000..b1b95b6
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssProjectMaterial.java
@@ -0,0 +1,72 @@
+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.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 项目归档文件表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_project_material")
+@ApiModel(value = "AssProjectMaterial对象", description = "项目归档文件表")
+@JsonInclude(NON_NULL)
+public class AssProjectMaterial extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "名称不能为空")
+    @ApiModelProperty(value = "名称",required = true)
+    @TableField("name")
+    private String name;
+
+
+    @ApiModelProperty("是否是文件,0否 1是 默认1")
+    @TableField("type")
+    private Integer type;
+
+    @NotNull(message = "项目id为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("评估文件id")
+    @TableField("file_id")
+    private Long fileId;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("归档文件附件")
+    @TableField(exist = false)
+    private AssAccessoryFile accessoryFile;
+
+
+}
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
new file mode 100644
index 0000000..8282aee
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRecitification.java
@@ -0,0 +1,82 @@
+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 java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 项目整改情况说明表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_recitification")
+@ApiModel(value = "AssRecitification对象", description = "项目整改情况说明表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
+public class AssRecitification extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotBlank(message = "整改人不能为空")
+    @ApiModelProperty(value = "整改人",required = true)
+    @TableField("rectify_person")
+    private String rectifyPerson;
+
+    @NotNull(message = "整改时间不能为空")
+    @ApiModelProperty(value = "整改时间",required = true)
+    @TableField("rectify_time")
+    private LocalDateTime rectifyTime;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @NotNull(message = "整改文件不能为空")
+    @ApiModelProperty(value = "文件id",required = true)
+    @TableField("file_id")
+    private Long fileId;
+
+    @NotBlank(message = "整改说明不能为空(30字)")
+    @ApiModelProperty(value = "整改说明",required = true)
+    @TableField("reason")
+    private String reason;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("整改附件")
+    @TableField(exist = false)
+    private AssAccessoryFile accessoryFile;
+
+
+}
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
new file mode 100644
index 0000000..706b967
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssRiskEstimate.java
@@ -0,0 +1,144 @@
+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 java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+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.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 风险评估表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+@TableName("ass_risk_estimate")
+@ApiModel(value = "AssRiskEstimate对象", description = "风险评估表")
+@JsonInclude(NON_NULL)
+public class AssRiskEstimate extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "项目id")
+    @TableField("project_id")
+    private Long projectId;
+
+    @NotBlank(message = "行业风险特性不能为空")
+    @Length(min =1,max =  500,message = "行业风险特性长度1~500字")
+    @ApiModelProperty(value = "行业风险特性(500字以内)",required = true)
+    @TableField("risk_character")
+    private String riskCharacter;
+
+    @NotBlank(message = "周边环境不能为空")
+    @Length(min =1,max =  500,message = "周边环境长度1~500字")
+    @ApiModelProperty(value = "周边环境(500字以内)",required = true)
+    @TableField("surroundings")
+    private String surroundings;
+
+
+    @Length(min =0,max =  500,message = "主要生产装置长度不能超过500字")
+    @ApiModelProperty(value = "主要生产装置(500字以内)",required = true)
+    @TableField("equipment")
+    private String equipment;
+
+    @Length(min =0,max =  500,message = "生产工艺概况长度不能超过500字")
+    @ApiModelProperty(value = "生产工艺概况(500字以内)",required = true)
+    @TableField("technology")
+    private String technology;
+
+    @NotNull(message = "评价费用是否在本机构所接受的范围内不能为空")
+    @ApiModelProperty(value = "评价费用是否在本机构所接受的范围内(0否,1是)",required = true)
+    @TableField("is_accept_chargess")
+    private Boolean isAcceptChargess;
+
+    @NotNull(message = "项目的可行性不能为空")
+    @ApiModelProperty(value = "项目的可行性(0否,1是)",required = true)
+    @TableField("is_feasibility")
+    private Boolean isFeasibility;
+
+    @NotNull(message = "是否能在约定的时间内完成评价报告不能为空")
+    @ApiModelProperty(value = "是否能在约定的时间内完成评价报告(0否,1是)",required = true)
+    @TableField("is_finish_report")
+    private Boolean isFinishReport;
+
+    @NotNull(message = "评价项目是否在本机构资质业务范围内不能为空")
+    @ApiModelProperty(value = "评价项目是否在本机构资质业务范围内(0否,1是)",required = true)
+    @TableField("is_in_business")
+    private Boolean isInBusiness;
+
+    @NotNull(message = "是否需要聘请相关专业的技术专家不能为空")
+    @ApiModelProperty(value = "是否需要聘请相关专业的技术专家(0否,1是)",required = true)
+    @TableField("is_need_expert")
+    private Boolean isNeedExpert;
+
+    @NotNull(message = "评价人员专业构成是否满足评价项目需要不能为空")
+    @ApiModelProperty(value = "评价人员专业构成是否满足评价项目需要(0否,1是)",required = true)
+    @TableField("is_satisfy_need")
+    private Boolean isSatisfyNeed;
+
+    @NotNull(message = "评估时间不能为空")
+    @ApiModelProperty(value = "评估时间(格式yyyy-MM-dd 00:00:00)",required = true)
+    @TableField("estimate_date")
+    private LocalDateTime estimateDate;
+
+    @NotBlank(message = "技术负责人意见不能为空")
+    @Length(min =1,max =  30,message = "技术负责人意见长度1~30字")
+    @ApiModelProperty(value = "技术负责人意见(30字以内)",required = true)
+    @TableField("tech_opinion")
+    private String techOpinion;
+
+    @NotBlank(message = "风险评估人意见不能为空")
+    @Length(min =1,max =  30,message = "风险评估人意见长度1~30字")
+    @ApiModelProperty(value = "风险评估人意见(30字以内)",required = true)
+    @TableField("risk_opinion")
+    private String riskOpinion;
+
+    @NotBlank(message = "机构评价负责人意见不能为空")
+    @Length(min =1,max =  30,message = "机构评价负责人意见长度1~30字")
+    @ApiModelProperty(value = "机构评价负责人意见(30字以内)",required = true)
+    @TableField("agency_opinon")
+    private String agencyOpinon;
+
+    @ApiModelProperty("审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+    @TableField("state")
+    private Integer state;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @Valid
+    @NotNull(message = "项目不能为空")
+    @ApiModelProperty("项目")
+    @TableField(exist = false)
+    private AssProject project;
+
+}
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
new file mode 100644
index 0000000..83f962d
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/AssWorkNotification.java
@@ -0,0 +1,78 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.system.domain.SysUser;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 从业告知表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@TableName("ass_work_notification")
+@ApiModel(value = "AssWorkNotification对象", description = "从业告知表")
+@JsonInclude(NON_NULL)
+public class AssWorkNotification extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @NotNull(message = "服务开始时间不能为空")
+    @ApiModelProperty(value = "服务开始时间",required = true)
+    @TableField("service_start_date")
+    private LocalDateTime serviceStartDate;
+
+    @NotNull(message = "服务结束时间不能为空")
+    @ApiModelProperty(value = "服务结束时间",required = true)
+    @TableField("service_end_date")
+    private LocalDateTime serviceEndDate;
+
+    @NotNull(message = "计划现场勘验时间不能为空")
+    @ApiModelProperty(value = "计划现场勘验时间",required = true)
+    @TableField("investigation_plan_date")
+    private LocalDateTime investigationPlanDate;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    @TableField("project_id")
+    private Long projectId;
+
+    @ApiModelProperty("审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+    @TableField("state")
+    private Integer state;
+
+    @ApiModelProperty("审核人员id")
+    @TableField("audit_id")
+    private Long auditId;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @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 51943af..ed2f452 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
@@ -1,16 +1,16 @@
 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.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.annotation.DataDesensitizationType;
 import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.common.enums.SensitiveTypeEnum;
 import com.gkhy.assess.common.validate.AgencyGroup;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -23,6 +23,7 @@
 import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
 
@@ -49,6 +50,7 @@
 
 
     @NotBlank(message = "机构名称不能为空")
+    @Length(min = 1, max = 50, message = "机构名称不能超过50个字符")
     @ApiModelProperty("机构名称")
     @TableField("name")
     private String name;
@@ -83,6 +85,7 @@
 
 
     @NotBlank(message = "经营地址不能为空")
+    @Length(min = 1, max = 100, message = "经营地址不能超过100个字符")
     @ApiModelProperty(value = "经营地址",required = true)
     @TableField("address")
     private String address;
@@ -98,8 +101,10 @@
     private String legalPerson;
 
 
+    @DataDesensitizationType(type = SensitiveTypeEnum.MOBILE_PHONE)
     @NotBlank(message = "法人电话不能为空")
     @Length(min = 11, max = 11, message = "手机号只能为11位")
+    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$",message = "手机号码有误!")
     @ApiModelProperty(value = "法人电话",required = true)
     @TableField("legal_phone")
     private String legalPhone;
@@ -110,9 +115,10 @@
     @TableField("manager")
     private String manager;
 
-
+    @DataDesensitizationType(type = SensitiveTypeEnum.MOBILE_PHONE)
     @NotBlank(message = "负责人电话不能为空")
     @Length(min = 11, max = 11, message = "手机号只能为11位")
+    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$",message = "手机号码有误!")
     @ApiModelProperty(value = "负责人电话",required = true)
     @TableField("manager_phone")
     private String managerPhone;
@@ -127,16 +133,16 @@
     @NotNull(message = "发证日期不能为空")
     @ApiModelProperty(value = "发证日期",required = true)
     @TableField("issue_date")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime issueDate;
 
 
     @NotNull(message = "有效日期不能为空")
     @ApiModelProperty(value = "有效日期",required = true)
     @TableField("valid_date")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime validDate;
 
 
@@ -159,6 +165,7 @@
 
 
     @NotBlank(message = "注册地址不能为空")
+    @Length(min = 1, max = 100, message = "注册地址不能超过100个字符")
     @ApiModelProperty(value = "注册地址",required = true)
     @TableField("reg_address")
     private String regAddress;
@@ -191,4 +198,9 @@
     @TableField(exist = false)
     private SysUser user;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java
index 33ec092..1f5cba9 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java
@@ -12,6 +12,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 import javax.validation.constraints.NotBlank;
 
@@ -29,6 +30,7 @@
 @Setter
 @TableName("sys_attach")
 @ApiModel(value = "SysAttach对象", description = "系统上传文件表,用户信息相关的")
+@Accessors(chain = true)
 @JsonInclude(NON_NULL)
 public class SysAttach implements Serializable {
 
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysConfig.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysConfig.java
index 44487da..58c33a9 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysConfig.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysConfig.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 io.swagger.annotations.ApiModel;
@@ -66,5 +64,10 @@
     @TableField("remark")
     private String remark;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
 
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java
index b4be289..0803364 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.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;
 
@@ -13,6 +11,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 import javax.validation.constraints.NotBlank;
 
@@ -29,6 +28,7 @@
 @Getter
 @Setter
 @TableName("sys_dict_data")
+@Accessors(chain = true)
 @ApiModel(value = "SysDictData对象", description = "字典数据表")
 @JsonInclude(NON_NULL)
 public class SysDictData extends BaseEntity {
@@ -65,4 +65,14 @@
     @TableField("status")
     private Integer status;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java
index 0c57758..24262fd 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.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;
 
@@ -54,4 +52,14 @@
     @TableField("status")
     private Integer status;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java
index a5a603e..532710d 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.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;
@@ -37,8 +35,8 @@
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("主键")
-    @TableId(value = "classify_id", type = IdType.AUTO)
-    private Long classifyId;
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
 
     @NotBlank(message = "分类名称不能为空")
     @ApiModelProperty(value = "分类名称",required = true)
@@ -53,6 +51,11 @@
     @TableField("del_flag")
     private Integer delFlag;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
     @ApiModelProperty("子分类")
     @TableField(exist = false)
     private List<SysExpertClassify> children;
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 969c2aa..b755c85 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
@@ -1,18 +1,22 @@
 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 com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
 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 static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
 
@@ -30,59 +34,75 @@
 @Accessors(chain = true)
 @ApiModel(value = "SysExpertInfo对象", description = "系统专家信息表")
 @JsonInclude(NON_NULL)
-public class SysExpertInfo implements Serializable {
+public class SysExpertInfo extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("主键")
-    @TableId(value = "expert_id", type = IdType.AUTO)
-    private Long expertId;
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
 
+    @NotBlank(message = "专家名称不能为空")
+    @Length(min=1,max=20,message = "专家名称不能超过20个字")
     @ApiModelProperty("专家名称")
     @TableField("name")
     private String name;
 
+    @NotNull(message ="性别不能为空" )
     @ApiModelProperty("性别(0男,1女,2未知,默认2)")
     @TableField("sex")
     private Integer sex;
 
-    @ApiModelProperty("类别id")
+    @NotNull(message ="大类别不能为空" )
+    @ApiModelProperty("大类别id")
     @TableField("big_classify")
     private Long bigClassify;
 
-    @ApiModelProperty("类别id")
+    @NotNull(message ="小类别不能为空" )
+    @ApiModelProperty("小类别id")
     @TableField("small_classify")
     private Long smallClassify;
 
+    @NotNull(message ="出生日期不能为空" )
     @ApiModelProperty("出生日期")
     @TableField("birthday")
     private LocalDateTime birthday;
 
+    @NotBlank(message ="手机号不能为空" )
+    @Length(min = 11, max = 11, message = "手机号只能为11位")
+    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$",message = "手机号码有误!")
     @ApiModelProperty("手机号")
     @TableField("phone")
     private String phone;
 
+    @NotBlank(message ="职称不能为空" )
     @ApiModelProperty("职称")
     @TableField("title")
     private String title;
 
+    @NotBlank(message ="电子照片不能为空" )
     @ApiModelProperty("电子照片")
     @TableField("electronic_photo")
     private String electronicPhoto;
 
+    @NotBlank(message ="身份证号码不能为空" )
+    @Length(min = 18, max = 18, message = "身份证只能为18位")
     @ApiModelProperty("身份证号码")
     @TableField("id_card")
     private String idCard;
 
-    @ApiModelProperty("在职状态")
+    @NotNull(message ="在岗情况不能为空" )
+    @ApiModelProperty("在岗情况(0在岗,1退休)")
     @TableField("duty_status")
     private Integer dutyStatus;
 
-    @ApiModelProperty("公司名称")
+    @NotBlank(message ="单位名称不能为空" )
+    @Length(min=1,max=30,message = "专家名称不能超过30个字")
+    @ApiModelProperty("单位名称")
     @TableField("company_name")
     private String companyName;
 
-    @ApiModelProperty("公司地址")
+    @ApiModelProperty("单位地址")
     @TableField("company_address")
     private String companyAddress;
 
@@ -94,11 +114,11 @@
     @TableField("job")
     private String job;
 
-    @ApiModelProperty("公司电话")
+    @ApiModelProperty("单位电话")
     @TableField("company_telephone")
     private String companyTelephone;
 
-    @ApiModelProperty("传真")
+    @ApiModelProperty("传真号")
     @TableField("fax_num")
     private String faxNum;
 
@@ -110,7 +130,9 @@
     @TableField("graduation_school")
     private String graduationSchool;
 
-    @ApiModelProperty("学历")
+    @NotBlank(message ="最高学历不能为空" )
+    @Length(min=1,max=10,message = "最高学历不能超过10个字")
+    @ApiModelProperty("最高学历")
     @TableField("degree")
     private String degree;
 
@@ -118,63 +140,66 @@
     @TableField("speciality")
     private String speciality;
 
-    @ApiModelProperty("当前专业")
+    @ApiModelProperty("现在从事专业或方向")
     @TableField("current_profession")
     private String currentProfession;
 
-    @ApiModelProperty("支撑安全")
+    @ApiModelProperty("支撑方向安全生产")
     @TableField("support_direction_safety")
     private String supportDirectionSafety;
 
-    @ApiModelProperty("支撑预防")
+    @ApiModelProperty("支撑方向防灾救灾")
     @TableField("support_direction_prevention")
     private String supportDirectionPrevention;
 
-    @ApiModelProperty("支持应急")
+    @ApiModelProperty("支撑方向应急救援")
     @TableField("support_direction_emergency")
     private String supportDirectionEmergency;
 
-    @ApiModelProperty("简述")
+    @ApiModelProperty("简历")
     @TableField("resume_key")
     private String resumeKey;
 
+    @ApiModelProperty("论文情况")
     @TableField("paper_situation_key")
     private String paperSituationKey;
 
+    @ApiModelProperty("奖励")
     @TableField("reward_key")
     private String rewardKey;
 
+    @ApiModelProperty("成绩成果")
     @TableField("achievement_key")
     private String achievementKey;
 
+    @ApiModelProperty("专家个人意见")
     @TableField("personal_opinion_key")
     private String personalOpinionKey;
 
+    @ApiModelProperty("推荐单位意见")
     @TableField("recommend_unit_opinion_key")
     private String recommendUnitOpinionKey;
+
+    //来源(1问卷,2系统)
+    @NotNull(message ="来源不能为空" )
+    @ApiModelProperty("来源(1问卷,2系统)")
+    @TableField("source")
+    private Integer source;
 
     @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
     @TableField("del_flag")
     private Integer delFlag;
 
-    @ApiModelProperty("创建人")
-    @TableField("create_by")
-    private String createBy;
 
-    @ApiModelProperty("创建时间")
-    @TableField("create_time")
-    private LocalDateTime createTime;
+    @ApiModelProperty("审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+    @TableField("state")
+    private Integer state;
 
-    @ApiModelProperty("修改人")
-    @TableField("update_by")
-    private String updateBy;
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
 
-    @ApiModelProperty("修改时间")
-    @TableField("update_time")
-    private LocalDateTime updateTime;
-
-    @TableField("remark")
-    private String remark;
 
 
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java
index 80c99df..6d6de54 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.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;
 
@@ -13,6 +11,9 @@
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Size;
 
 import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
 
@@ -36,16 +37,18 @@
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
-
-    @ApiModelProperty("住标题")
+    @Length(min = 1, max = 50, message = "主标题不能超过50个字符")
+    @ApiModelProperty("主标题")
     @TableField("title")
     private String title;
 
+    @Length(min = 0, max = 50, message = "副标题不能超过50个字符")
     @ApiModelProperty("副标题")
     @TableField("sub_title")
     private String subTitle;
 
     @ApiModelProperty("内容")
+    @Length(min = 1,max=16777215,message = "法律法规内容过长,无法保存")
     @TableField("content")
     private String content;
 
@@ -53,6 +56,7 @@
     @TableField("law_type")
     private String lawType;
 
+    @Length(min = 0, max = 50, message = "颁布机构名称不能超过50个字符")
     @ApiModelProperty("颁布机构")
     @TableField("pub_agency")
     private String pubAgency;
@@ -85,5 +89,15 @@
     @TableField("remark")
     private String remark;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+
 
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java
index 2baba16..ba22f7c 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.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;
 
@@ -13,6 +11,7 @@
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
 
@@ -40,11 +39,13 @@
     private Long id;
 
     @NotBlank(message = "通知标题不能为空")
-    @ApiModelProperty(value = "通知标题",required = true)
+    @Length(min = 1, max = 50, message = "标题不能超过50个字符")
+    @ApiModelProperty(value = "通知标题(50个字)",required = true)
     @TableField("title")
     private String title;
 
     @NotBlank(message = "通知内容不能为空")
+    @Length(min = 1,max=16777215,message = "通知内容过长,无法保存")
     @ApiModelProperty(value = "通知内容",required = true)
     @TableField("content")
     private String content;
@@ -73,5 +74,15 @@
     @TableField("remark")
     private String remark;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+
 
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java
index 221bc87..c416388 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java
@@ -1,17 +1,19 @@
 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.util.List;
 
+import com.gkhy.assess.common.domain.BaseEntity;
 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;
 
 /**
  * <p>
@@ -26,13 +28,15 @@
 @Accessors(chain = true)
 @TableName("sys_region")
 @ApiModel(value = "SysRegion对象", description = "系统地区表")
-public class SysRegion implements Serializable {
+public class SysRegion extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @NotBlank(message = "地区名称不能为空")
+    @Length(min = 1, max = 20, message = "地区名称不能超过20个字符")
     @ApiModelProperty("地区名称")
     @TableField("name")
     private String name;
@@ -49,6 +53,11 @@
     @TableField("region_type")
     private Integer regionType;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
     @TableField(exist = false)
     private List<SysRegion> children;
 
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 cefea2c..b76074d 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
@@ -1,14 +1,12 @@
 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.common.validate.AgencyGroup;
 import com.gkhy.assess.common.validate.ExpertGroup;
 import com.gkhy.assess.common.validate.MonitorGroup;
+import com.gkhy.assess.system.domain.vo.PersonProjectVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -17,6 +15,7 @@
 import org.hibernate.validator.constraints.Length;
 
 import javax.validation.Valid;
+import javax.validation.constraints.Max;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
@@ -53,6 +52,7 @@
     @TableField("username")
     private String username;
 
+    @Length(min = 0, max = 20, message = "用户昵称/姓名不能超过20个字符")
     @ApiModelProperty("用户昵称/姓名")
     @TableField("name")
     private String name;
@@ -85,6 +85,9 @@
     @TableField("avatar")
     private String avatar;
 
+    /**
+     * 密码生成规则:md5(用户名+密码+盐)
+     */
     @NotBlank(message = "密码不能为空")
     @ApiModelProperty(value = "密码(base64)",required = true)
     @TableField("password")
@@ -132,7 +135,7 @@
     private String jobTitle;
 
     @NotBlank(message = "专业方向不能为空",groups ={ExpertGroup.class} )
-    @ApiModelProperty("专业方向")
+    @ApiModelProperty("专业方向,新增时传(json字符串{'专业id':'证书编号1','专业id':'证书编号2'}),查询时传字典id")
     @TableField("major")
     private String major;
 
@@ -152,25 +155,50 @@
     @TableField("pwd_update_date")
     private LocalDateTime pwdUpdateDate;
 
+    @Version
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("证书编号")
+    @TableField("certificate_no")
+    private String certificateNo;
+
+    @ApiModelProperty("近期证件照路径")
+    @TableField("id_photo")
+    private String idPhoto;
+
+    @ApiModelProperty("评价师等级")
+    @TableField("level")
+    private String level;
+
     @Valid
     @NotNull(message = "机构不能为空",groups ={AgencyGroup.class} )
-    @ApiModelProperty("机构对象,只限创建机构用户传")
+    @ApiModelProperty("机构对象,只限创建机构用户传参")
     @TableField(exist = false)
     private SysAgency agency;
 
     @NotNull(message = "社保照片不能为空",groups ={ExpertGroup.class} )
-    @ApiModelProperty("社保照片路径列表,创建专家传")
+    @ApiModelProperty("社保照片路径列表,创建专家传参")
     @TableField(exist = false)
     private List<SysAttach> socialAttach;
 
     @NotNull(message = "医保照片不能为空",groups ={ExpertGroup.class} )
-    @ApiModelProperty("医保照片路径列表,创建专家传")
+    @ApiModelProperty("医保照片路径列表,创建专家传参")
     @TableField(exist = false)
     private List<SysAttach> medicalAttach;
 
     @NotNull(message = "工资照片不能为空",groups ={ExpertGroup.class} )
-    @ApiModelProperty("工资照片路径列表,创建专家传")
+    @ApiModelProperty("工资照片路径列表,创建专家传参")
     @TableField(exist = false)
     private List<SysAttach> salaryAttach;
 
+    @ApiModelProperty("专业列表")
+    @TableField(exist = false)
+    List<String> majorNames;
+
+    @ApiModelProperty("汇总项目信息")
+    @TableField(exist = false)
+    private PersonProjectVO personProjectVO;
+
 }
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
new file mode 100644
index 0000000..f90bf31
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUserFace.java
@@ -0,0 +1,86 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 用户人脸数据表
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-01-09 17:10:01
+ */
+@Getter
+@Setter
+@TableName("sys_user_face")
+@Accessors(chain = true)
+@ApiModel(value = "SysUserFace对象", description = "用户人脸数据表")
+@JsonInclude(NON_NULL)
+public class SysUserFace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    @NotBlank(message = "人脸数据不能为空")
+    @ApiModelProperty(value = "人脸数据",required = true)
+    @TableField("face_base")
+    private String faceBase;
+
+    @NotNull(message = "用户id不能为空")
+    @ApiModelProperty(value = "用户id",required = true)
+    @TableField("user_id")
+    private Long userId;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+    @ApiModelProperty("删除标志(0正常,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @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;
+
+    @ApiModelProperty("原因说明")
+    @TableField("remark")
+    private String remark;
+
+
+    @NotNull(message = "图片对象不能为空")
+    @ApiModelProperty(value = "图片对象",required = true)
+    @TableField(exist = false)
+    private MultipartFile file;
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/PersonProjectVO.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/PersonProjectVO.java
new file mode 100644
index 0000000..d771e3f
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/PersonProjectVO.java
@@ -0,0 +1,22 @@
+package com.gkhy.assess.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+@Setter
+@Getter
+@ApiModel(value = "个人参与项目汇总对象", description = "个人参与项目汇总对象")
+public class PersonProjectVO {
+    @ApiModelProperty("成员用户id")
+    private Long personId;
+
+    @ApiModelProperty("参与的项目数量")
+    private Integer projectCount;
+
+    @ApiModelProperty("最新评价项目时间")
+    private LocalDateTime lastEstimateTime;
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectMaterialVO.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectMaterialVO.java
new file mode 100644
index 0000000..1fbb41d
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectMaterialVO.java
@@ -0,0 +1,53 @@
+package com.gkhy.assess.system.domain.vo;
+
+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.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.system.domain.AssAccessoryFile;
+import com.gkhy.assess.system.domain.AssContract;
+import com.gkhy.assess.system.domain.AssProjectMaterial;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 项目归档文件表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Getter
+@Setter
+@ApiModel(value = "ProjectMaterialVO对象", description = "项目归档表单")
+@JsonInclude(NON_NULL)
+public class ProjectMaterialVO  {
+
+    @NotNull(message = "项目id为空")
+    @ApiModelProperty(value = "项目id",required = true)
+    private Long projectId;
+
+    @Valid
+    @NotNull(message = "项目归档列表不能为空")
+    @ApiModelProperty(value = "项目归档列表",required = true)
+    private List<AssProjectMaterial> projectMaterials;
+
+    @Valid
+    @NotNull(message = "合同对象不能为空")
+    @ApiModelProperty(value = "合同对象",required = true)
+    private AssContract contract;
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectStaticVO.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectStaticVO.java
new file mode 100644
index 0000000..664c082
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/ProjectStaticVO.java
@@ -0,0 +1,31 @@
+package com.gkhy.assess.system.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+@Setter
+@Getter
+@ApiModel(value = "项目统计对象", description = "项目统计对象")
+@Accessors(chain = true)
+public class ProjectStaticVO {
+    @ApiModelProperty("项目总数")
+    private Integer projectTotal;
+
+    @ApiModelProperty("风险分析及计划评价总数")
+    private Integer riskTotal;
+
+    @ApiModelProperty("现场勘验总数")
+    private Integer investigationTotal;
+
+    @ApiModelProperty("项目审核总数")
+    private Integer reviewTotal;
+
+    @ApiModelProperty("出具报告总数")
+    private Integer reportTotal;
+
+    @ApiModelProperty("项目归档总数")
+    private Integer archiveTotal;
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java
index 0932e0b..d9c4cc8 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java
@@ -17,6 +17,9 @@
     @ApiModelProperty("文件保存相对路径")
     private String path;
 
+    @ApiModelProperty("文件原始名称")
+    private String originName;
+
 //    @ApiModelProperty("访问链接")
 //    private String url;
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/enums/AccessoryFileTypeEnum.java b/assess-system/src/main/java/com/gkhy/assess/system/enums/AccessoryFileTypeEnum.java
new file mode 100644
index 0000000..6e7a39e
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/enums/AccessoryFileTypeEnum.java
@@ -0,0 +1,41 @@
+package com.gkhy.assess.system.enums;
+
+/**
+ * 评估文件类型
+ *
+ */
+public enum AccessoryFileTypeEnum
+{
+    DEVICE_IMAGE(1, "评价机构项目现场勘验人员在主要装置前的合影照片"),
+    INVESTINGATION_IMAGE(2, "评价机构项目现场勘验照片"),
+    COMPANY_IMAGE(3, "评价机构项目现场勘验人员与企业陪同人员图片"),
+    INVESTINGATION_VIDEO(4, "评价机构项目现场勘验视频"),
+
+    INVESTINGATION_ATTACHMENT(5, "现场勘验记录附件"),
+
+    REVIEW_RECORD(6, "评审记录附件"),
+    CONCLUSION(7, "评价结论"),
+    PROCESS_ATTACHMENT(8, "过程控制记录文档附件"),
+    PROJECT_MATERIAL(9, "项目归档材料"),
+    FILING_APPLY(10, "报备申请附件"),
+    PROJECT_RECITIFICATON(11, "项目整改情况附件");
+
+    private final Integer code;
+    private final String info;
+
+    AccessoryFileTypeEnum(Integer code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/enums/PlayRoleEnum.java b/assess-system/src/main/java/com/gkhy/assess/system/enums/PlayRoleEnum.java
new file mode 100644
index 0000000..b7756c3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/enums/PlayRoleEnum.java
@@ -0,0 +1,47 @@
+package com.gkhy.assess.system.enums;
+
+/**
+ * 项目成员担任角色
+ *
+ */
+public enum PlayRoleEnum
+{
+    PROJECT_LEADER(1, "项目负责人"),
+    PROJECT_MEMBER(2, "项目组成员"),
+    PROCESS_LEADER(3, "过程控制负责人"),
+    ANGENCY_LEADER(4, "机构评价负责人"),
+    TEACH_LEADER(5, "技术负责人"),
+    INNER_LEADER(6, "内部审核员");
+
+    private final Integer code;
+    private final String info;
+
+    PlayRoleEnum(Integer code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+
+    public static PlayRoleEnum getInfoByCode(Integer code) {
+        PlayRoleEnum[] values = PlayRoleEnum.values();
+        for (PlayRoleEnum value : values) {
+            if (value.getCode().equals(code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/enums/ProgressPhaseEnum.java b/assess-system/src/main/java/com/gkhy/assess/system/enums/ProgressPhaseEnum.java
new file mode 100644
index 0000000..fe1566d
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/enums/ProgressPhaseEnum.java
@@ -0,0 +1,51 @@
+package com.gkhy.assess.system.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 项目五大阶段
+ *
+ */
+public enum ProgressPhaseEnum
+{
+    RISK(1, "风险分析评价计划"),
+    INVESTIGATION(2, "现场勘验"),
+    REVIEW(3, "项目审核"),
+    REPORT(4, "出具报告"),
+    ARCHIVE(5, "项目归档");
+
+    private final Integer code;
+    private final String info;
+
+    ProgressPhaseEnum(Integer code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+
+    public static Integer getPhaseByProcess(int reportProgress){
+        if(reportProgress<=ReportProgressEnum.ESTIMATE_PLAN.getCode()){
+            return ProgressPhaseEnum.RISK.getCode();
+        }else if(reportProgress<=ReportProgressEnum.INVESTINGATION.getCode()){
+            return ProgressPhaseEnum.INVESTIGATION.getCode();
+        }else if(reportProgress<=ReportProgressEnum.REVIEW_RECORD.getCode()){
+            return ProgressPhaseEnum.REVIEW.getCode();
+        }else if(reportProgress<=ReportProgressEnum.PROCESS_AUDIT.getCode()){
+            return ProgressPhaseEnum.REPORT.getCode();
+        }else{
+            return ProgressPhaseEnum.ARCHIVE.getCode();
+        }
+    }
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/enums/ReportProgressEnum.java b/assess-system/src/main/java/com/gkhy/assess/system/enums/ReportProgressEnum.java
new file mode 100644
index 0000000..d6032c0
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/enums/ReportProgressEnum.java
@@ -0,0 +1,141 @@
+package com.gkhy.assess.system.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 项目状态类型(五大阶段的详细状态)
+ *
+ */
+public enum ReportProgressEnum
+{
+    ADD(0, "新增"),
+    RISK_ESTIMATE(1, "项目分析分析"),
+    CONTRACT(2, "合同管理"),
+    ESTIMATE_TASK(3, "评价任务通知"),
+    ESTIMATE_PLAN(4, "评价项目计划"),
+    WORK_NOTIFICATION(5, "从业告知"),
+    INVESTINGATION(6, "现场勘验记录"),
+    INNER_AUDIT(7, "内部审核"),
+    TECH_AUDIT(8, "技术负责人审核"),
+    REVIEW_RECORD(9, "评审记录"),
+    CONCLUSION(10, "评价结论"),
+    PROCESS_AUDIT(11, "过程控制人审核"),
+    PROJECT_MATERIAL(12, "项目归档"),
+    FACE_RECOGNITION(13, "签字确认"),
+    CONFIRM_FINAL(14, "确认完结");
+
+    private final Integer code;
+    private final String info;
+
+    ReportProgressEnum(Integer code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+
+    public static ReportProgressEnum getByCode(Integer code) {
+        for (ReportProgressEnum e : values()) {
+            if (e.getCode().equals(code)) {
+                return e;
+            }
+        }
+        throw new RuntimeException("enum not exists.");
+    }
+
+    public static List<Integer> getProcessByPhase(int projectPhase){
+        if(projectPhase==ProgressPhaseEnum.RISK.getCode()){
+            return getRiskProcess();
+        }else if(projectPhase==ProgressPhaseEnum.INVESTIGATION.getCode()){
+            return getInvestigationProcess();
+        }else if(projectPhase==ProgressPhaseEnum.REVIEW.getCode()){
+            return getReviewProcess();
+        }else if(projectPhase==ProgressPhaseEnum.REPORT.getCode()){
+            return getReportProcess();
+        }else if(projectPhase==ProgressPhaseEnum.ARCHIVE.getCode()){
+            return getArchiveProcess();
+        }
+        return null;
+    }
+
+    /**
+     *
+     * 风险分析及计划评价阶段 项目状态码
+     * @return
+     */
+    public static List<Integer> getRiskProcess(){
+        List<Integer> riskProcess=new ArrayList<>();
+        for (ReportProgressEnum e : values()) {
+            if (e.getCode()<=4) {
+                riskProcess.add(e.getCode());
+            }
+        }
+        return riskProcess;
+    }
+
+    /**
+     * 现场勘验阶段 项目状态码
+     * @return
+     */
+    public static List<Integer> getInvestigationProcess(){
+        List<Integer> investigationProcess=new ArrayList<>();
+        for (ReportProgressEnum e : values()) {
+            if (e.getCode()>4 &&e.getCode()<=6) {
+                investigationProcess.add(e.getCode());
+            }
+        }
+        return investigationProcess;
+    }
+
+    /**
+     * 项目审核阶段 项目状态码
+     * @return
+     */
+    public static List<Integer> getReviewProcess(){
+        List<Integer> reviewProcess=new ArrayList<>();
+        for (ReportProgressEnum e : values()) {
+            if (e.getCode()>6 &&e.getCode()<=9) {
+                reviewProcess.add(e.getCode());
+            }
+        }
+        return reviewProcess;
+    }
+
+    /**
+     * 出具报告阶段 项目状态码
+     * @return
+     */
+    public static List<Integer> getReportProcess(){
+        List<Integer> reportProcess=new ArrayList<>();
+        for (ReportProgressEnum e : values()) {
+            if (e.getCode()>9 &&e.getCode()<=11) {
+                reportProcess.add(e.getCode());
+            }
+        }
+        return reportProcess;
+    }
+
+    /**
+     * 项目归档阶段 项目状态码
+     * @return
+     */
+    public static List<Integer> getArchiveProcess(){
+        List<Integer> archiveProcess=new ArrayList<>();
+        for (ReportProgressEnum e : values()) {
+            if (e.getCode()>11) {
+                archiveProcess.add(e.getCode());
+            }
+        }
+        return archiveProcess;
+    }
+}
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
new file mode 100644
index 0000000..775f14c
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAccessoryFileMapper.java
@@ -0,0 +1,43 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssAccessoryFile;
+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 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssAccessoryFileMapper extends BaseMapper<AssAccessoryFile> {
+    /**
+     * 根据项目id获取评估文件
+     * @param projectId
+     * @param moduleType
+     * @return
+     */
+    List<AssAccessoryFile> getAccessoryFileByProjectId(@Param("projectId") Long projectId, @Param("moduleType") Integer moduleType);
+
+    /**
+     * 获取数量
+     * @param projectId
+     * @param moduleType
+     * @return
+     */
+    Integer getAccessoryFileCountByProjectId(@Param("projectId") Long projectId, @Param("moduleType") Integer moduleType);
+
+    /**
+     * 根据id删除评估文件
+     * @param accessoryFileId
+     * @return
+     */
+    int deleteAccessoryFileById(Long accessoryFileId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAuditMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAuditMapper.java
new file mode 100644
index 0000000..a13d886
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssAuditMapper.java
@@ -0,0 +1,42 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssAudit;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 审核表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssAuditMapper extends BaseMapper<AssAudit> {
+
+    /**
+     * 根据项目id获取审核数量
+     * @param projectId
+     * @param auditType
+     * @return
+     */
+    int getCountByProjectId(@Param("projectId") Long projectId,@Param("auditType") Integer auditType);
+
+    /**
+     * 根据项目id获取审核记录
+     * @param projectId
+     * @return
+     */
+    AssAudit getAuditByProjectId(Long projectId,Integer auditType);
+
+    /**
+     * 根据id获取审核记录
+     * @param auditId
+     * @return
+     */
+    AssAudit getAuditById(Long auditId);
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssConclusionMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssConclusionMapper.java
new file mode 100644
index 0000000..d4ed75c
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssConclusionMapper.java
@@ -0,0 +1,40 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssConclusion;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 项目结论表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssConclusionMapper extends BaseMapper<AssConclusion> {
+
+    /**
+     * 根据项目id获取评价结论数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 更具项目id获取评价结论
+     * @param projectId
+     * @return
+     */
+    AssConclusion getConclusionByProjectId(Long projectId);
+
+    /**
+     * 根据id获取评价结论
+     * @param conclusionId
+     * @return
+     */
+    AssConclusion getConclusionById(Long conclusionId);
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssContractMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssContractMapper.java
new file mode 100644
index 0000000..415450b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssContractMapper.java
@@ -0,0 +1,40 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssContract;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 合同管理表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssContractMapper extends BaseMapper<AssContract> {
+    /**
+     * 根据项目id获取合同信息
+     * @param projectId
+     * @return
+     */
+    AssContract getContractByProjectId(Long projectId);
+
+
+
+    /**
+     * 根据id获取合同
+     * @param contractId
+     * @return
+     */
+    AssContract getContractById(Long contractId);
+
+
+    /**
+     * 根据项目id获取合同数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssDeviceMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssDeviceMapper.java
new file mode 100644
index 0000000..87fd6ad
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssDeviceMapper.java
@@ -0,0 +1,40 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssDevice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 设备表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssDeviceMapper extends BaseMapper<AssDevice> {
+
+    /**
+     * 根据名称查询设备
+     * @param deviceName
+     * @return
+     */
+    AssDevice getDeviceByName(String deviceName);
+
+    /**
+     * 根据项目id获取设备列表
+     * @param projectId
+     * @return
+     */
+    List<AssDevice> getDevicesByProjectId(Long projectId);
+
+    /**
+     * 批量删除设备
+     * @param ids
+     * @return
+     */
+    int deleteDeviceByIds(List<Long> ids);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimatePlanMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimatePlanMapper.java
new file mode 100644
index 0000000..895b6c4
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimatePlanMapper.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gkhy.assess.system.domain.AssEstimatePlan;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 评价项目计划表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssEstimatePlanMapper extends BaseMapper<AssEstimatePlan> {
+
+    /**
+     * 根据项目id获取评价计划数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取评价计划
+     * @param projectId
+     * @return
+     */
+    AssEstimatePlan getEstimatePlanByProjectId(Long projectId);
+
+    /**
+     * 根据id获取评价计划
+     * @param estimatePlanId
+     * @return
+     */
+    AssEstimatePlan getEstimatePlanById(Long estimatePlanId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateScheduleMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateScheduleMapper.java
new file mode 100644
index 0000000..40bb8af
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateScheduleMapper.java
@@ -0,0 +1,33 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssEstimateSchedule;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评价日程安排表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssEstimateScheduleMapper extends BaseMapper<AssEstimateSchedule> {
+
+    /**
+     * 根据项目id获取评价日程安排表
+     * @param projectId
+     * @return
+     */
+    List<AssEstimateSchedule> getEstimateScheduleByProjectId(Long projectId);
+
+    /**
+     * 根据id批量删除评价日程
+     * @param ids
+     * @return
+     */
+    int deleteEstimateScheduleByIds(List<Long> ids);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateTaskMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateTaskMapper.java
new file mode 100644
index 0000000..45af0ed
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssEstimateTaskMapper.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssEstimateTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 评价认为通知表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssEstimateTaskMapper extends BaseMapper<AssEstimateTask> {
+    /**
+     * 根据项目id获取评价任务通知数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取评价任务通知
+     * @param projectId
+     * @return
+     */
+    AssEstimateTask getTaskByProjectId(Long projectId);
+
+    /**
+     * 根据id获取评价任务通知
+     * @param taskId
+     * @return
+     */
+    AssEstimateTask getTaskById(Long taskId);
+
+
+}
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
new file mode 100644
index 0000000..8530086
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecognitionMapper.java
@@ -0,0 +1,47 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssFaceRecognition;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 签字确认表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssFaceRecognitionMapper extends BaseMapper<AssFaceRecognition> {
+    /**
+     * 根据项目id获取签字确认数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取签字确认
+     * @param projectId
+     * @return
+     */
+    List<AssFaceRecognition> getFaceRecognitionByProjectId(Long projectId);
+
+    /**
+     * 根据id获取签字确认
+     * @param faceRecognitionId
+     * @return
+     */
+    AssFaceRecognition getFaceRecognitionById(Long faceRecognitionId);
+
+
+    /**
+     * 获取项目签字确认数量
+     * @param projectId
+     * @return
+     */
+    int getFaceRecognitionCount(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecordMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecordMapper.java
new file mode 100644
index 0000000..025f1b8
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFaceRecordMapper.java
@@ -0,0 +1,27 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssFaceRecord;
+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 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssFaceRecordMapper extends BaseMapper<AssFaceRecord> {
+    /**
+     * 获取人脸识别列表
+     * @param projectId
+     * @return
+     */
+    List<AssFaceRecord> faceRecordList(@Param("projectId") Long projectId, @Param("scene") Integer scene);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFilingApplyMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFilingApplyMapper.java
new file mode 100644
index 0000000..d0f3ce3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssFilingApplyMapper.java
@@ -0,0 +1,25 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssFilingApply;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 报备申请表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssFilingApplyMapper extends BaseMapper<AssFilingApply> {
+    /**
+     * 根据项目id获取报备列表
+     * @param projectId
+     * @return
+     */
+    List<AssFilingApply> getFilingApplyByProjectId(Long projectId);
+}
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
new file mode 100644
index 0000000..559ab35
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssInvestigationMapper.java
@@ -0,0 +1,41 @@
+package com.gkhy.assess.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gkhy.assess.system.domain.AssInvestigation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 现场勘验记录表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssInvestigationMapper extends BaseMapper<AssInvestigation> {
+
+    /**
+     * 根据项目id获取现场勘验记录数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+
+    /**
+     * 根据项目id获取现场勘验记录
+     * @param projectId
+     * @return
+     */
+    AssInvestigation getInvestigationByProjectId(Long projectId);
+
+    /**
+     * 根据id获取现场勘验记录
+     * @param investigationId
+     * @return
+     */
+    AssInvestigation getInvestigationById(Long investigationId);
+
+
+}
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
new file mode 100644
index 0000000..df83799
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssPlanPersonMapper.java
@@ -0,0 +1,47 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评价项目组成员表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssPlanPersonMapper extends BaseMapper<AssPlanPerson> {
+    /**
+     * 根据项目id获取项目普通成员
+     * @param projectId
+     * @return
+     */
+    List<AssPlanPerson> getPlanPersonByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取项目成员,包括负责人,技术负责人,过程负责人等
+     * @param projectId
+     * @return
+     */
+    List<AssPlanPerson> getAllPlanPersonByProjectId(Long projectId);
+
+    /**
+     * 根据id删除项目成员
+     * @param ids
+     * @return
+     */
+    int deletePlanPersonByIds(List<Long> ids);
+
+    /**
+     * 根据id列表获取项目组成员
+     * @param ids
+     * @return
+     */
+    List<AssPlanPerson> getPlanPersonsByIds(List<Long> ids);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProcessAuditMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProcessAuditMapper.java
new file mode 100644
index 0000000..0d67da3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProcessAuditMapper.java
@@ -0,0 +1,38 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssProcessAudit;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 过程控制负责人审核表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssProcessAuditMapper extends BaseMapper<AssProcessAudit> {
+    /**
+     * 根据项目id获取过程控制数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取过程控制
+     * @param projectId
+     * @return
+     */
+    AssProcessAudit getProcessAuditByProjectId(Long projectId);
+
+    /**
+     * 根据id获取过程控制
+     * @param processAuditId
+     * @return
+     */
+    AssProcessAudit getProcessAuditById(Long processAuditId);
+
+}
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
new file mode 100644
index 0000000..8f1747b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMapper.java
@@ -0,0 +1,82 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gkhy.assess.system.domain.vo.PersonProjectVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-11 14:16:18
+ */
+@Mapper
+public interface AssProjectMapper extends BaseMapper<AssProject> {
+
+    /**
+     * 项目列表
+     * @param project
+     * @return
+     */
+    List<AssProject> projectList(AssProject project);
+
+
+    /**
+     * 根据id获取项目详情
+     * @param projectId
+     * @return
+     */
+    AssProject getProjectById(Long projectId);
+
+    /**
+     * 根据项目名称获取项目
+     * @param name
+     * @return
+     */
+    AssProject getProjectByName(String name);
+
+    /**
+     * 获取项目状态
+     * @param projectId
+     * @return
+     */
+    Integer getReportProgress(Long projectId);
+
+    /**
+     * 根据项目组成员id获取项目
+     * @param personId
+     * @param finish
+     * @return
+     */
+    List<AssProject> getMemberProjectByUserId(@Param("personId") Long personId,@Param("finish") Integer finish,@Param("agencyId") Long agencyId);
+
+
+    /**
+     * 根据项目组长id获取项目
+     * @param personId
+     * @return
+     */
+    List<AssProject> getLeaderProjectByUserId(@Param("personId")Long personId,@Param("agencyId")Long agencyId);
+
+    /**
+     * 获取项目总数
+     * @param project
+     * @return
+     */
+    Integer getProjectCount(AssProject project);
+
+    /**
+     * 根据成员id列表汇总项目数量
+     * @param personIds
+     * @return
+     */
+    List<PersonProjectVO> getProjectByPersonIds(List<Long> personIds);
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMaterialMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMaterialMapper.java
new file mode 100644
index 0000000..484237b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssProjectMaterialMapper.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssProjectMaterial;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+
+/**
+ * <p>
+ * 项目归档文件表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssProjectMaterialMapper extends BaseMapper<AssProjectMaterial> {
+    /**
+     * 根据项目id获取项目归档数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取项目归档
+     * @param projectId
+     * @return
+     */
+    List<AssProjectMaterial> getProjectMaterialByProjectId(Long projectId);
+
+    /**
+     * 根据id或许项目归档
+     * @param projectMaterialId
+     * @return
+     */
+    AssProjectMaterial getProjectMaterialById(Long projectMaterialId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRecitificationMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRecitificationMapper.java
new file mode 100644
index 0000000..83cbd67
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRecitificationMapper.java
@@ -0,0 +1,28 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssRecitification;
+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 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssRecitificationMapper extends BaseMapper<AssRecitification> {
+
+    /**
+     * 分页获取整改情况
+     * @param projectId
+     * @return
+     */
+    List<AssRecitification> recitificationList(@Param("projectId") Long projectId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRiskEstimateMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRiskEstimateMapper.java
new file mode 100644
index 0000000..69ac1b2
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssRiskEstimateMapper.java
@@ -0,0 +1,48 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssProject;
+import com.gkhy.assess.system.domain.AssRiskEstimate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 风险评估表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssRiskEstimateMapper extends BaseMapper<AssRiskEstimate> {
+
+    /**
+     * 根据项目id获取项目风险评估详情
+     * @param projectId
+     * @return
+     */
+    AssRiskEstimate getRiskEstimateByProjectId(Long projectId);
+
+    /**
+     * 根据id获取风险评估
+     * @param riskId
+     * @return
+     */
+    AssRiskEstimate getRiskEstimateById(Long riskId);
+
+
+    /**
+     * 根据风险评估id获取项目
+     * @param riskId
+     * @return
+     */
+    AssProject getProjectByRiskId(Long riskId);
+
+
+    /**
+     * 根据项目id获取风险评估数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssWorkNotificationMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssWorkNotificationMapper.java
new file mode 100644
index 0000000..c12a4d3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/AssWorkNotificationMapper.java
@@ -0,0 +1,38 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.AssWorkNotification;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 从业告知表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Mapper
+public interface AssWorkNotificationMapper extends BaseMapper<AssWorkNotification> {
+    /**
+     * 根据项目id获取从业告知数量
+     * @param projectId
+     * @return
+     */
+    int getCountByProjectId(Long projectId);
+
+    /**
+     * 根据项目id获取从业告知
+     * @param projectId
+     * @return
+     */
+    AssWorkNotification getWorkNotificationByProjectId(Long projectId);
+
+    /**
+     * 根据id获取从业告知
+     * @param workNotificationId
+     * @return
+     */
+    AssWorkNotification getWorkNotificationById(Long workNotificationId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAgencyMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAgencyMapper.java
index c702e64..092835a 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAgencyMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAgencyMapper.java
@@ -23,12 +23,6 @@
      */
     SysAgency checkAgencyNameUnique(String name);
 
-    /**
-     * 根据id删除机构
-     * @param agencyId
-     * @return
-     */
-    int deleteAgencyById(Long agencyId);
 
     /**
      * 根据条件查询机构列表
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAttachMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAttachMapper.java
index 2e55e73..abeb7ea 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAttachMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysAttachMapper.java
@@ -33,4 +33,12 @@
      * @return
      */
     int deleteAttachsByUserId(Long userId, Integer type);
+
+
+    /**
+     * 根据ids批量删除附件
+     * @param ids
+     * @return
+     */
+    int deleteAttachsByIds(List<Long> ids);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysDictTypeMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysDictTypeMapper.java
index 4871cec..1d6445b 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysDictTypeMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysDictTypeMapper.java
@@ -3,6 +3,7 @@
 import com.gkhy.assess.system.domain.SysDictType;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -35,7 +36,7 @@
      * @param dictType
      * @return
      */
-    SysDictType checkDictTypeUnique(String dictType);
+    SysDictType checkDictTypeUnique(@Param("dictType") String dictType, @Param("name") String name);
 
     /**
      * 根据类型获取数据字典
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java
index abab04d..d945c6f 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java
@@ -36,4 +36,11 @@
      * @return
      */
     int deleteBatchByIds(Long[] expertIds);
+
+    /**
+     * 根据id获取专家信息
+     * @param expertId
+     * @return
+     */
+    SysExpertInfo getExpertInfoById(Long expertId);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserFaceMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserFaceMapper.java
new file mode 100644
index 0000000..7c253c0
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserFaceMapper.java
@@ -0,0 +1,23 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.SysUserFace;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 用户人脸数据表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-01-09 17:10:01
+ */
+@Mapper
+public interface SysUserFaceMapper extends BaseMapper<SysUserFace> {
+    /**
+     * 根据用户id获取人脸识别数据
+     * @param userId
+     * @return
+     */
+    SysUserFace getFaceByUserId(Long userId);
+}
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 f4b8f2f..ece8e63 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
@@ -73,19 +73,7 @@
      */
     public SysUser getUserById(Long userId);
 
-    /**
-     * 删除用户
-     * @param userId
-     * @return
-     */
-    public int deleteUserById(Long userId);
 
-    /**
-     * 批量删除用户
-     * @param userIds
-     * @return
-     */
-    public int deleteUserByIds(Long[] userIds);
 
     /**
      * 校验用户名称是否唯一
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
new file mode 100644
index 0000000..f1eb175
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssAccessoryFileService.java
@@ -0,0 +1,57 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssAccessoryFile;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评估文件上传记录表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssAccessoryFileService extends IService<AssAccessoryFile> {
+    /**
+     * 上传评估文件(包括图片、文件、视频等)
+     * @param projectId
+     * @param moduleType
+     * @param file
+     * @return
+     */
+    AssAccessoryFile uploadFile(Long projectId,Integer moduleType,MultipartFile file);
+
+    /**
+     * 根据项目id获取评估文件
+     * @param projectId
+     * @param moduleType
+     * @return
+     */
+    List<AssAccessoryFile> getAccessoryFileByProjectId(Long projectId, Integer moduleType);
+
+    /**
+     * 根据id删除评估文件
+     * @param accessoryFileId
+     * @return
+     */
+    int deleteById(Long accessoryFileId);
+
+    /**
+     * 根据项目id批量删除评估文件
+     * @param projectId
+     * @param moduleType
+     * @return
+     */
+    int deleteByProjectId(Long projectId,Integer moduleType);
+
+    /**
+     * 获取数量
+     * @param projectId
+     * @param moduleType
+     * @return
+     */
+    Integer getAccessoryFileCountByProjectId(Long projectId, Integer moduleType);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssAuditService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssAuditService.java
new file mode 100644
index 0000000..ec81453
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssAuditService.java
@@ -0,0 +1,43 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssAudit;
+
+/**
+ * <p>
+ * 审核表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssAuditService extends IService<AssAudit> {
+
+    /**
+     * 新增审核
+     * @param audit
+     * @return
+     */
+    int addAudit(AssAudit audit);
+
+    /**
+     * 修改审核
+     * @param audit
+     * @return
+     */
+    int editAudit(AssAudit audit);
+
+    /**
+     * 根据项目id获取审核
+     * @param projectId
+     * @return
+     */
+    AssAudit getAuditByProjectId(Long projectId,Integer auditType);
+
+    /**
+     * 根据id获取审核
+     * @param auditId
+     * @return
+     */
+    AssAudit  getAuditById(Long auditId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssConclusionService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssConclusionService.java
new file mode 100644
index 0000000..a10774f
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssConclusionService.java
@@ -0,0 +1,45 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssConclusion;
+
+/**
+ * <p>
+ * 项目结论表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssConclusionService extends IService<AssConclusion> {
+
+    /**
+     * 新增评审结论
+     * @param conclusion
+     * @return
+     */
+    int addConclusion(AssConclusion conclusion);
+
+    /**
+     * 修改评审结论
+     * @param conclusion
+     * @return
+     */
+    int editConclusion(AssConclusion conclusion);
+
+    /**
+     * 根据项目id获取评审结论
+     * @param projectId
+     * @return
+     */
+    AssConclusion getConclusionByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取评审结论
+     * @param conclusionId
+     * @return
+     */
+    AssConclusion  getConclusionById(Long conclusionId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssConfirmFinalService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssConfirmFinalService.java
new file mode 100644
index 0000000..919dd0c
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssConfirmFinalService.java
@@ -0,0 +1,21 @@
+package com.gkhy.assess.system.service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 确认完结服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssConfirmFinalService  {
+
+    /**
+     * 确认完结
+     * @param map
+     * @return
+     */
+    void doConfirmFinal(Map map);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssContractService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssContractService.java
new file mode 100644
index 0000000..7c552a4
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssContractService.java
@@ -0,0 +1,45 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssContract;
+
+/**
+ * <p>
+ * 合同管理表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssContractService extends IService<AssContract> {
+
+
+    /**
+     * 新增合同
+     * @param contract
+     * @return
+     */
+    int addContract(AssContract contract);
+
+    /**
+     * 修改合同
+     * @param contract
+     * @return
+     */
+    int editContract(AssContract contract);
+
+    /**
+     * 根据项目id获取项目合同
+     * @param projectId
+     * @return
+     */
+    AssContract getContractByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取合同详情
+     * @param contractId
+     * @return
+     */
+    AssContract  getContractById(Long contractId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssDeviceService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssDeviceService.java
new file mode 100644
index 0000000..c6e381f
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssDeviceService.java
@@ -0,0 +1,66 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssDevice;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 设备表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssDeviceService extends IService<AssDevice> {
+    /**
+     * 新增设备
+     * @param device
+     * @return
+     */
+    int addDevice(AssDevice device);
+
+    /**
+     * 修改设备
+     * @param device
+     * @return
+     */
+    int editDevice(AssDevice device);
+
+    /**
+     * 删除设备
+     * @param deviceId
+     * @return
+     */
+    int deleteById(Long deviceId);
+
+    /**
+     * 根据id获取报备
+     * @param deviceId
+     * @return
+     */
+    AssDevice  getDeviceById(Long deviceId);
+
+
+    /**
+     * 检验设备名称是否唯一
+     * @param device
+     * @return
+     */
+    boolean checkNameUnique(AssDevice device);
+
+    /**
+     * 根据项目id获取设备列表
+     * @param projectId
+     * @return
+     */
+    List<AssDevice> getByProjectId(Long projectId);
+
+    /**
+     * 批量删除设备
+     * @param ids
+     * @return
+     */
+    int deleteByIds(List<Long> ids,Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimatePlanService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimatePlanService.java
new file mode 100644
index 0000000..17242ae
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimatePlanService.java
@@ -0,0 +1,44 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssEstimatePlan;
+
+/**
+ * <p>
+ * 评价项目计划表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssEstimatePlanService extends IService<AssEstimatePlan> {
+
+    /**
+     * 新增评价计划
+     * @param estimatePlan
+     * @return
+     */
+    int addEstimatePlan(AssEstimatePlan estimatePlan);
+
+    /**
+     * 修改评价计划
+     * @param estimatePlan
+     * @return
+     */
+    int editEstimatePlan(AssEstimatePlan estimatePlan);
+
+    /**
+     * 根据项目id获取评价计划
+     * @param projectId
+     * @return
+     */
+    AssEstimatePlan getEstimatePlanByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取评价计划详情
+     * @param estimatePlanId
+     * @return
+     */
+    AssEstimatePlan  getEstimatePlanById(Long estimatePlanId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateScheduleService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateScheduleService.java
new file mode 100644
index 0000000..7a18d8a
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateScheduleService.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssEstimateSchedule;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评价日程安排表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssEstimateScheduleService extends IService<AssEstimateSchedule> {
+    /**
+     * 根据项目id获取评价日程安排
+     * @param projectId
+     * @return
+     */
+    List<AssEstimateSchedule> getByProjectId(Long projectId);
+
+
+    /**
+     * 新增日程安排
+     * @param estimateSchedule
+     * @return
+     */
+    int addSchedule(AssEstimateSchedule estimateSchedule);
+
+    /**
+     * 编辑日程安排
+     * @param estimateSchedule
+     * @return
+     */
+    int editSchedule(AssEstimateSchedule estimateSchedule);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateTaskService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateTaskService.java
new file mode 100644
index 0000000..24dbe54
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssEstimateTaskService.java
@@ -0,0 +1,43 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssEstimateTask;
+
+/**
+ * <p>
+ * 评价任务通知表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssEstimateTaskService extends IService<AssEstimateTask> {
+
+    /**
+     * 新增评价任务通知
+     * @param estimateTask
+     * @return
+     */
+    int addEstimateTask(AssEstimateTask estimateTask);
+
+    /**
+     * 编辑评价任务通知
+     * @param estimateTask
+     * @return
+     */
+    int editEstimateTask(AssEstimateTask estimateTask);
+
+    /**
+     * 根据项目id获取评价任务通知
+     * @param projectId
+     * @return
+     */
+    AssEstimateTask getEstimateTaskByProjectId(Long projectId);
+
+    /**
+     * 根据id获取评价任务通知详情
+     * @param taskId
+     * @return
+     */
+    AssEstimateTask  getEstimateTaskById(Long taskId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecognitionService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecognitionService.java
new file mode 100644
index 0000000..254d831
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecognitionService.java
@@ -0,0 +1,67 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssFaceRecognition;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 签字确认表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssFaceRecognitionService extends IService<AssFaceRecognition> {
+    /**
+     * 项目状态流转
+     * @param map
+     */
+    void doFaceRecognition(Map map);
+
+    /**
+     * 新增签字确认
+     * @param faceRecognition
+     * @return
+     */
+    int addFaceRecognition(AssFaceRecognition faceRecognition);
+
+    /**
+     * 修改签字确认
+     * @param faceRecognition
+     * @return
+     */
+    int editFaceRecognition(AssFaceRecognition faceRecognition);
+
+    /**
+     * 根据项目id获取签字确认
+     * @param projectId
+     * @return
+     */
+    List<AssFaceRecognition> getFaceRecognitionByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取签字确认
+     * @param faceRecognitionId
+     * @return
+     */
+    AssFaceRecognition  getFaceRecognitionById(Long faceRecognitionId);
+
+    /**
+     * 根据成员id获取签字确认
+     * @param projectId
+     * @param personId
+     * @return
+     */
+    AssFaceRecognition getRecognitionByPersonId(Long projectId, Long personId);
+
+    /**
+     * 校验是否都签字确认
+     * @param projectId
+     * @return
+     */
+    Boolean checkAllFaceRecongnition(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecordService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecordService.java
new file mode 100644
index 0000000..b1a094c
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssFaceRecordService.java
@@ -0,0 +1,46 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssFaceRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 现场勘验人员人脸识别记录表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssFaceRecordService extends IService<AssFaceRecord> {
+    /**
+     * 新增人脸识别
+     * @param faceRecord
+     * @return
+     */
+     int addFaceRecord(AssFaceRecord faceRecord);
+
+    /**
+     * 获取人脸识别列表
+     * @param projectId
+     * @return
+     */
+     List<AssFaceRecord> faceRecordList(Long projectId,Integer scene);
+
+    /**
+     * 编辑人脸识别
+     * @param faceRecord
+     * @return
+     */
+    int editFaceRecord(AssFaceRecord faceRecord);
+
+    /**
+     * 删除人脸识别
+     * @param faceId
+     * @return
+     */
+    int deleteById(Long faceId);
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssFilingApplyService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssFilingApplyService.java
new file mode 100644
index 0000000..15b473a
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssFilingApplyService.java
@@ -0,0 +1,53 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssFilingApply;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 报备申请表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssFilingApplyService extends IService<AssFilingApply> {
+
+    /**
+     * 新增报备
+     * @param filingApply
+     * @return
+     */
+    int addFilingApply(AssFilingApply filingApply);
+
+    /**
+     * 修改报备
+     * @param filingApply
+     * @return
+     */
+    int editFilingApply(AssFilingApply filingApply);
+
+    /**
+     * 根据项目id获取报备
+     * @param projectId
+     * @return
+     */
+    List<AssFilingApply> getFilingApplyByProjectId(Long projectId);
+
+    /**
+     * 删除报备
+     * @param filingApplyId
+     * @return
+     */
+    int deleteById(Long filingApplyId);
+
+    /**
+     * 根据id获取报备
+     * @param filingApplyId
+     * @return
+     */
+    AssFilingApply  getFilingApplyById(Long filingApplyId);
+
+}
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
new file mode 100644
index 0000000..4e8d8dd
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssInvestigationService.java
@@ -0,0 +1,50 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssInvestigation;
+
+/**
+ * <p>
+ * 现场勘验记录表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssInvestigationService extends IService<AssInvestigation> {
+
+    /**
+     * 新增勘验记录
+     * @param investigation
+     * @return
+     */
+    int addInvestigation(AssInvestigation investigation,String requestSourceType);
+
+    /**
+     * 修改勘验记录
+     * @param investigation
+     * @return
+     */
+    int editInvestigation(AssInvestigation investigation);
+
+    /**
+     * 根据项目id获取勘验记录
+     * @param projectId
+     * @return
+     */
+    AssInvestigation getInvestigationByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取勘验记录
+     * @param investigationId
+     * @return
+     */
+    AssInvestigation  getInvestigationById(Long investigationId);
+
+    /**
+     * 项目状态流转
+     * @param projectId
+     */
+    void doInvestigationProcess(Long projectId);
+}
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
new file mode 100644
index 0000000..8c18244
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssPlanPersonService.java
@@ -0,0 +1,66 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评价项目组成员表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssPlanPersonService extends IService<AssPlanPerson> {
+
+    /**
+     * 根据项目id获取项目成员
+     * @param projectId
+     * @return
+     */
+    List<AssPlanPerson> getByProjectId(Long projectId);
+
+
+    /**
+     * 新增项目组成员
+     * @param planPerson
+     * @return
+     */
+    int addPlanPerson(AssPlanPerson planPerson);
+
+    /**
+     * 编辑项目组成员
+     * @param planPerson
+     * @return
+     */
+    int editPlanPerson(AssPlanPerson planPerson);
+
+    /**
+     * 根据id删除项目组成员
+     * @param planPersonId
+     * @return
+     */
+    int deletePlanPersonById(Long planPersonId);
+
+    /**
+     * 根据成员id删除项目组成员
+     * @param personId
+     * @return
+     */
+    int deletePlanPersonByPersonId(Long personId);
+
+    /**
+     * 校验项目成员是否唯一
+     * @param planPerson
+     */
+    void checkPersonUnique(AssPlanPerson planPerson);
+
+    /**
+     * 根据成员id获取成员详细信息
+     * @param personId
+     * @return
+     */
+    AssPlanPerson getPlanPersonByPersonId(Long personId,Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssProcessAuditService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProcessAuditService.java
new file mode 100644
index 0000000..e883d5a
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProcessAuditService.java
@@ -0,0 +1,43 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssProcessAudit;
+
+/**
+ * <p>
+ * 过程控制负责人审核表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssProcessAuditService extends IService<AssProcessAudit> {
+    /**
+     * 新增过程控制审核
+     * @param processAudit
+     * @return
+     */
+    int addProcessAudit(AssProcessAudit processAudit);
+
+    /**
+     * 修改过程控制审核
+     * @param processAudit
+     * @return
+     */
+    int editProcessAudit(AssProcessAudit processAudit);
+
+    /**
+     * 根据项目id获取过程控制审核
+     * @param projectId
+     * @return
+     */
+    AssProcessAudit getProcessAuditByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取过程控制审核
+     * @param processAuditId
+     * @return
+     */
+    AssProcessAudit  getProcessAuditById(Long processAuditId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectMaterialService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectMaterialService.java
new file mode 100644
index 0000000..b641654
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectMaterialService.java
@@ -0,0 +1,46 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.AssProjectMaterial;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.vo.ProjectMaterialVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目归档文件表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssProjectMaterialService extends IService<AssProjectMaterial> {
+    /**
+     * 新增项目归档文件
+     * @param projectMaterialVO
+     * @return
+     */
+    int addProjectMaterial(ProjectMaterialVO projectMaterialVO);
+
+    /**
+     * 修改项目归档文件
+     * @param projectMaterialVO
+     * @return
+     */
+    int editProjectMaterial(ProjectMaterialVO projectMaterialVO);
+
+    /**
+     * 根据项目id获取项目归档文件
+     * @param projectId
+     * @return
+     */
+    List<AssProjectMaterial> getProjectMaterialByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取项目归档文件
+     * @param projectMaterialId
+     * @return
+     */
+    AssProjectMaterial  getProjectMaterialById(Long projectMaterialId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectService.java
new file mode 100644
index 0000000..b8116e4
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssProjectService.java
@@ -0,0 +1,130 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.system.domain.AssProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.vo.ProjectStaticVO;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+
+/**
+ * <p>
+ * 项目表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-11 14:16:18
+ */
+public interface AssProjectService extends IService<AssProject> {
+
+    /**
+     * 根据条件分页查询项目列表
+     * @param project
+     * @return
+     */
+    CommonPage projectList(AssProject project);
+
+    /**
+     * 根据id获取项目
+     * @param projectId
+     * @return
+     */
+    AssProject getProjectById(Long projectId);
+
+
+    /**
+     * 新增项目
+     * @param project
+     * @return
+     */
+    int addProject(AssProject project);
+
+
+    /**
+     * 根据id删除项目
+     * @param projectId
+     * @return
+     */
+    int deleteProjectById(Long projectId);
+
+    /**
+     * 编辑项目
+     * @param project
+     * @return
+     */
+    int editProject(AssProject project);
+
+
+    /**
+     * 校验项目
+     * @param projectId
+     */
+    AssProject checkProjectDataScope(Long projectId);
+
+
+    /**
+     * 获取项目当前的项目过程状态
+     * @param projectId
+     * @return
+     */
+    Integer getProjectReportProgress(Long projectId);
+
+
+    /**
+     * 检验项目名称是否唯一
+     * @param project
+     * @return
+     */
+    boolean checkNameUnique(AssProject project);
+
+    /**
+     * 校验项目状态
+     * @param projectId
+     * @param reportProgressEnum  项目状态
+     * @return
+     */
+    void checkReportProgress(Long projectId, ReportProgressEnum reportProgressEnum);
+
+    /**
+     * 修改项目状态
+     * @param projectId
+     * @param reportProgressEnum
+     * @return
+     */
+    int changeReportProgress(Long projectId,ReportProgressEnum reportProgressEnum);
+
+
+    /**
+     * 根据项目成员获取项目列表 分页(供app使用)
+     * @param personId
+     * @param finish
+     * @return
+     */
+    CommonPage memberProjects(Long personId,Integer finish);
+
+
+    /**
+     * 根据项目组长id获取项目列表 分页(供app使用)
+     * @param personId
+     * @return
+     */
+    CommonPage leaderProjects(Long personId);
+
+    /**
+     * 项目统计
+     * @return
+     */
+    ProjectStaticVO projectStat(AssProject project);
+
+    /**
+     * 获取项目agencyId
+     * @param projectId
+     * @return
+     */
+    Long getProjectAgencyId(Long projectId);
+
+    /**
+     * 校验当前用户是否拥有操作项目权限
+     * @param projectId
+     */
+    void checkUserAllowed(Long projectId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssRecitificationService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssRecitificationService.java
new file mode 100644
index 0000000..6745912
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssRecitificationService.java
@@ -0,0 +1,50 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.system.domain.AssRecitification;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 项目整改情况说明表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssRecitificationService extends IService<AssRecitification> {
+    /**
+     * 根据项目id分页获取整改情况
+     * @param projectId
+     * @return
+     */
+    CommonPage recitificationList(Long projectId);
+
+    /**
+     * 新增整改情况
+     * @param recitification
+     * @return
+     */
+    int addRecitification(AssRecitification recitification);
+
+    /**
+     * 修改整改情况
+     * @param recitification
+     * @return
+     */
+    int editRecitification(AssRecitification recitification);
+
+    /**
+     * 删除整改情况
+     * @param recitificationId
+     * @return
+     */
+    int deleteById(Long recitificationId);
+
+    /**
+     * 根据id获取整改情况
+     * @param recitificationId
+     * @return
+     */
+    AssRecitification  getRecitificationById(Long recitificationId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssReviewRecordService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssReviewRecordService.java
new file mode 100644
index 0000000..ff107ae
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssReviewRecordService.java
@@ -0,0 +1,11 @@
+package com.gkhy.assess.system.service;
+
+import java.util.Map;
+
+public interface AssReviewRecordService {
+    /**
+     * 状态流转
+     * @param map
+     */
+    void doReview(Map map);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssRiskEstimateService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssRiskEstimateService.java
new file mode 100644
index 0000000..d185069
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssRiskEstimateService.java
@@ -0,0 +1,45 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssRiskEstimate;
+
+/**
+ * <p>
+ * 风险评估表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssRiskEstimateService extends IService<AssRiskEstimate> {
+
+    /**
+     * 新增风险评估
+     * @param riskEstimate
+     * @return
+     */
+    Long addRiskEstimate(AssRiskEstimate riskEstimate);
+
+    /**
+     * 修改风险评估
+     * @param riskEstimate
+     * @return
+     */
+    int editRiskEstimate(AssRiskEstimate riskEstimate);
+
+    /**
+     * 根据项目id获取项目风险评估详情
+     * @param projectId
+     * @return
+     */
+    AssRiskEstimate getRiskEstimateByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取风险评估详情
+     * @param riskId
+     * @return
+     */
+    AssRiskEstimate  getRiskEstimateById(Long riskId);
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/AssWorkNotificationService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/AssWorkNotificationService.java
new file mode 100644
index 0000000..fffcebc
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/AssWorkNotificationService.java
@@ -0,0 +1,44 @@
+package com.gkhy.assess.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.assess.system.domain.AssWorkNotification;
+
+/**
+ * <p>
+ * 从业告知表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+public interface AssWorkNotificationService extends IService<AssWorkNotification> {
+
+    /**
+     * 新增从业告知
+     * @param workNotification
+     * @return
+     */
+    int addWorkNotification(AssWorkNotification workNotification);
+
+    /**
+     * 修改从业告知
+     * @param workNotification
+     * @return
+     */
+    int editWorkNotification(AssWorkNotification workNotification);
+
+    /**
+     * 根据项目id获取从业告知
+     * @param projectId
+     * @return
+     */
+    AssWorkNotification getWorkNotificationByProjectId(Long projectId);
+
+
+    /**
+     * 根据id获取从业告知详情
+     * @param workNotificationId
+     * @return
+     */
+    AssWorkNotification  getWorkNotificationById(Long workNotificationId);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java
index 1385517..e7e9ce6 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java
@@ -42,4 +42,11 @@
      * @return
      */
     boolean changePublic(SysAgency agency);
+
+    /**
+     * 根据id删除机构
+     * @param agencyId
+     * @return
+     */
+    int deleteAgencyById(Long agencyId);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysAttachService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysAttachService.java
index 13c5f0e..06dfabd 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysAttachService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysAttachService.java
@@ -29,4 +29,13 @@
      * @return
      */
     int deleteAttachsByUserId(Long userId,Integer type);
+
+    /**
+     * 批量删除附件
+     * @param ids
+     * @return
+     */
+    int deleteAttachsByIds(List<Long> ids);
+
+
 }
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 4e22674..8a03413 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
@@ -12,6 +12,14 @@
      */
     public UploadObjectVO uploadFile(MultipartFile file);
 
+    UploadObjectVO doUpload(MultipartFile file);
+
+    /**
+     * base64字符串
+     * @param imageBase64
+     * @return
+     */
+    UploadObjectVO doUpload(String imageBase64);
 
     public boolean removeFile(String path);
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java
index bd60fa5..9f6efe0 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java
@@ -47,4 +47,18 @@
      * @return
      */
     int delExpertInfoBatch(Long[] expertIds);
+
+    /**
+     * 根据id获取专家信息
+     * @param expertId
+     * @return
+     */
+    SysExpertInfo exportInfoDetail(Long expertId);
+
+    /**
+     * 修改评定状态
+     * @param expertInfo
+     * @return
+     */
+    boolean changeApprove(SysExpertInfo expertInfo);
 }
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
new file mode 100644
index 0000000..0096e0b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserFaceService.java
@@ -0,0 +1,29 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.SysUserFace;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户人脸数据表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-01-09 17:10:01
+ */
+public interface SysUserFaceService extends IService<SysUserFace> {
+    /**
+     * 新增用户人脸识别数据
+     * @param userFace
+     * @return
+     */
+    int addUserFace(SysUserFace userFace);
+
+    /**
+     * 根据用户id获取人脸数据
+     * @param userId
+     * @return
+     */
+    SysUserFace getFaceByUserId(Long userId);
+
+}
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 611359d..21f10f0 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
@@ -25,6 +25,13 @@
     AccountVO login(LoginBody loginBody);
 
     /**
+     * app登录
+     * @param loginBody
+     * @return
+     */
+    AccountVO appLogin(LoginBody loginBody);
+
+    /**
      * 退出
      */
     void logout();
@@ -167,13 +174,6 @@
      */
     SysUser checkUserDataScope(Long userId);
 
-    /**
-     * 导入用户数据
-     * @param userList
-     * @param isUpdateSupport  是否更新支持,如果已存在,则进行更新数据
-     * @return
-     */
-    String importUser(List<SysUser> userList,Boolean isUpdateSupport);
 
     /**
      * 修改用户状态
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
new file mode 100644
index 0000000..6e75233
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAccessoryFileServiceImpl.java
@@ -0,0 +1,93 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.enums.UserIdentityEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssAccessoryFile;
+import com.gkhy.assess.system.domain.AssProject;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.domain.vo.UploadObjectVO;
+import com.gkhy.assess.system.mapper.AssAccessoryFileMapper;
+import com.gkhy.assess.system.mapper.AssProjectMapper;
+import com.gkhy.assess.system.service.AssAccessoryFileService;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.service.SysCommonService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评估文件上传记录表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssAccessoryFileServiceImpl extends ServiceImpl<AssAccessoryFileMapper, AssAccessoryFile> implements AssAccessoryFileService {
+
+    @Autowired
+    private SysCommonService commonService;
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public AssAccessoryFile uploadFile(Long projectId, Integer moduleType, MultipartFile file) {
+        if(projectId==null||moduleType==null||file==null){
+            throw new ApiException("参数或者上传文件不能为空");
+        }
+        projectService.checkUserAllowed(projectId);
+        UploadObjectVO uploadObjectVO = commonService.doUpload(file);
+        AssAccessoryFile accessoryFile=new AssAccessoryFile()
+                .setFileName(uploadObjectVO.getFilename())
+                .setOriginName(uploadObjectVO.getOriginName())
+                .setPath(uploadObjectVO.getPath())
+                .setProjectId(projectId)
+                .setModuleType(moduleType);
+        accessoryFile.setCreateBy(ShiroUtils.getSysUser().getName());
+        save(accessoryFile);
+        return accessoryFile;
+    }
+
+    @Override
+    public List<AssAccessoryFile> getAccessoryFileByProjectId(Long projectId, Integer moduleType) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getAccessoryFileByProjectId(projectId,moduleType);
+    }
+
+    @Override
+    public Integer getAccessoryFileCountByProjectId(Long projectId, Integer moduleType) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getAccessoryFileCountByProjectId(projectId,moduleType);
+    }
+
+
+    @Override
+    public int deleteById(Long accessoryFileId) {
+        AssAccessoryFile accessoryFile=getById(accessoryFileId);
+        projectService.checkUserAllowed(accessoryFile.getProjectId());
+        return update(Wrappers.<AssAccessoryFile>lambdaUpdate()
+                .eq(AssAccessoryFile::getId,accessoryFileId)
+                .set(AssAccessoryFile::getDelFlag, DeleteFlagEnum.DELETED.getCode())
+                .set(AssAccessoryFile::getUpdateBy,ShiroUtils.getSysUser().getName()))?1:0;
+    }
+
+
+
+    @Override
+    public int deleteByProjectId(Long projectId, Integer moduleType) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.update(null,Wrappers.<AssAccessoryFile>lambdaUpdate()
+                .set(AssAccessoryFile::getDelFlag,DeleteFlagEnum.DELETED.getCode())
+                .set(AssAccessoryFile::getUpdateBy,ShiroUtils.getSysUser().getName())
+                .eq(AssAccessoryFile::getProjectId,projectId)
+                .eq(AssAccessoryFile::getModuleType,moduleType));
+    }
+
+}
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
new file mode 100644
index 0000000..240fbb0
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssAuditServiceImpl.java
@@ -0,0 +1,106 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.enums.UserIdentityEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssAudit;
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.domain.AssProject;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.enums.PlayRoleEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssAuditMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssAuditService;
+import com.gkhy.assess.system.service.AssPlanPersonService;
+import com.gkhy.assess.system.service.AssProjectService;
+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;
+
+/**
+ * <p>
+ * 审核表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssAuditServiceImpl extends ServiceImpl<AssAuditMapper, AssAudit> implements AssAuditService {
+
+    @Autowired
+    private AssProjectService projectService;
+    @Autowired
+    private AssPlanPersonService planPersonService;
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addAudit(AssAudit audit) {
+        Long projectId=audit.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkAuditCount(projectId,audit.getAuditType());
+        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());
+        int row=baseMapper.insert(audit);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,audit.getAuditType()==1?ReportProgressEnum.INNER_AUDIT:ReportProgressEnum.TECH_AUDIT);
+            //todo 新增项目组成员
+            AssPlanPerson planPerson=new AssPlanPerson().setPersonId(audit.getAssessorId())
+                    .setPlayRole(audit.getAuditType()==1?PlayRoleEnum.INNER_LEADER.getCode():PlayRoleEnum.TEACH_LEADER.getCode())
+                    .setProjectId(projectId);
+            planPersonService.addPlanPerson(planPerson);
+
+        }
+        return row;
+    }
+
+    public void checkAuditCount(Long projectId,Integer auditType){
+        //校验项目下勘验记录数量
+        int count= baseMapper.getCountByProjectId(projectId,auditType);
+        if(count>0){
+            throw new ApiException("项目下已存在审核记录");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editAudit(AssAudit audit) {
+        projectService.checkUserAllowed(audit.getProjectId());
+        AssAudit oldAudit=getById(audit.getId());
+        audit.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        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()));
+                //todo 删除旧的项目成员
+                planPersonService.deletePlanPersonByPersonId(oldAudit.getAssessorId());
+                //todo 新增新的项目成员
+                planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(audit.getAssessorId())
+                        .setPlayRole(audit.getAuditType()==1?PlayRoleEnum.INNER_LEADER.getCode():PlayRoleEnum.TEACH_LEADER.getCode())
+                        .setProjectId(audit.getProjectId()));
+            }
+        }
+        return row;
+    }
+
+    @Override
+    public AssAudit getAuditByProjectId(Long projectId, Integer auditType) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getAuditByProjectId(projectId,auditType);
+    }
+
+
+    @Override
+    public AssAudit getAuditById(Long auditId) {
+        AssAudit audit= baseMapper.getAuditById(auditId);
+        projectService.checkUserAllowed(audit.getProjectId());
+        return audit;
+    }
+
+
+}
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
new file mode 100644
index 0000000..646d7ac
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConclusionServiceImpl.java
@@ -0,0 +1,86 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.enums.UserIdentityEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssConclusion;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.enums.AccessoryFileTypeEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssConclusionMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssAccessoryFileService;
+import com.gkhy.assess.system.service.AssConclusionService;
+import com.gkhy.assess.system.service.AssProjectService;
+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;
+
+/**
+ * <p>
+ * 项目结论表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssConclusionServiceImpl extends ServiceImpl<AssConclusionMapper, AssConclusion> implements AssConclusionService {
+
+    @Autowired
+    private AssProjectService projectService;
+    @Autowired
+    private AssAccessoryFileService accessoryFileService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addConclusion(AssConclusion conclusion) {
+        Long projectId=conclusion.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkConclusionCount(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.REVIEW_RECORD);
+        conclusion.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(conclusion);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.CONCLUSION);
+        }
+        return row;
+    }
+
+    public void checkConclusionCount(Long projectId){
+        //校验项目下评审结论数量
+        int count= baseMapper.getCountByProjectId(projectId);
+        if(count>0){
+            throw new ApiException("项目下已存在评审结论");
+        }
+    }
+
+    @Override
+    public int editConclusion(AssConclusion conclusion) {
+        projectService.checkUserAllowed(conclusion.getProjectId());
+        conclusion.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(conclusion);
+        return row;
+    }
+
+    @Override
+    public AssConclusion getConclusionByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        AssConclusion conclusion= baseMapper.getConclusionByProjectId(projectId);
+        conclusion.setAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.CONCLUSION.getCode()));
+        return conclusion;
+    }
+
+
+    @Override
+    public AssConclusion getConclusionById(Long conclusionId) {
+        AssConclusion conclusion= baseMapper.getConclusionById(conclusionId);
+        projectService.checkUserAllowed(conclusion.getProjectId());
+        return conclusion;
+    }
+
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConfirmFinalServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConfirmFinalServiceImpl.java
new file mode 100644
index 0000000..360a5c6
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssConfirmFinalServiceImpl.java
@@ -0,0 +1,36 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.system.domain.AssProject;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.service.AssConfirmFinalService;
+import com.gkhy.assess.system.service.AssProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * <p>
+ * 确认完结服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-1-4 10:46:54
+ */
+@Service
+public class AssConfirmFinalServiceImpl implements AssConfirmFinalService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public void doConfirmFinal(Map map) {
+        Long projectId= Long.parseLong(map.get("projectId").toString());
+        projectService.checkUserAllowed(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.FACE_RECOGNITION);
+        //更新项目状态
+        projectService.changeReportProgress(projectId,ReportProgressEnum.CONFIRM_FINAL);
+    }
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssContractServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssContractServiceImpl.java
new file mode 100644
index 0000000..fd0a8fa
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssContractServiceImpl.java
@@ -0,0 +1,75 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssContract;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssContractMapper;
+import com.gkhy.assess.system.service.AssContractService;
+import com.gkhy.assess.system.service.AssProjectService;
+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;
+
+/**
+ * <p>
+ * 合同管理表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssContractServiceImpl extends ServiceImpl<AssContractMapper, AssContract> implements AssContractService {
+    @Autowired
+    private AssProjectService projectService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addContract(AssContract contract) {
+        Long projectId=contract.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkConstractCount(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId,ReportProgressEnum.RISK_ESTIMATE);
+        contract.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(contract);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.CONTRACT);
+        }
+        return row;
+    }
+
+    public void checkConstractCount(Long projectId){
+        //校验项目下风险评估数量
+        int contractCount= baseMapper.getCountByProjectId(projectId);
+        if(contractCount>0){
+            throw new ApiException("项目下已存在合同信息");
+        }
+    }
+
+    @Override
+    public int editContract(AssContract contract) {
+        projectService.checkUserAllowed(contract.getProjectId());
+        contract.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(contract);
+        return row;
+    }
+
+    @Override
+    public AssContract getContractByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getContractByProjectId(projectId);
+    }
+
+
+    @Override
+    public AssContract getContractById(Long contractId) {
+
+        AssContract contract= baseMapper.getContractById(contractId);
+        projectService.checkUserAllowed(contract.getProjectId());
+        return contract;
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssDeviceServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssDeviceServiceImpl.java
new file mode 100644
index 0000000..69c900d
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssDeviceServiceImpl.java
@@ -0,0 +1,105 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssDevice;
+import com.gkhy.assess.system.mapper.AssDeviceMapper;
+import com.gkhy.assess.system.service.AssDeviceService;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 设备表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssDeviceServiceImpl extends ServiceImpl<AssDeviceMapper, AssDevice> implements AssDeviceService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public int addDevice(AssDevice device) {
+        projectService.checkUserAllowed(device.getProjectId());
+        if(!checkNameUnique(device)){
+            throw new ApiException("项目下已存在相同设备");
+        }
+        device.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(device);
+        return row;
+    }
+
+
+    @Override
+    public int editDevice(AssDevice device) {
+        projectService.checkUserAllowed(device.getProjectId());
+        if(!checkNameUnique(device)){
+            throw new ApiException("项目下已存在相同设备");
+        }
+        device.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.updateById(device);
+        return row;
+    }
+
+
+    @Override
+    public int deleteById(Long deviceId) {
+        AssDevice device=getById(deviceId);
+        if(device==null){
+            throw new ApiException("设备不存在");
+        }
+        projectService.checkUserAllowed(device.getProjectId());
+        device=new AssDevice().setId(deviceId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        device.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(device);
+    }
+
+    @Override
+    public AssDevice getDeviceById(Long deviceId) {
+        AssDevice device= getById(deviceId);
+        projectService.checkUserAllowed(device.getProjectId());
+        return device;
+    }
+
+    @Override
+    public boolean checkNameUnique(AssDevice device) {
+        LambdaQueryWrapper<AssDevice> lambdaQueryWrapper = Wrappers.<AssDevice>lambdaQuery()
+                .eq(AssDevice::getDeviceName, device.getDeviceName())
+                .eq(AssDevice::getDelFlag, DeleteFlagEnum.UN_DELETE)
+                .eq(AssDevice::getProjectId, device.getProjectId());
+        if(device.getId()!=null){
+            lambdaQueryWrapper.ne(AssDevice::getId,device.getId());
+        }
+        long contractCount= count(lambdaQueryWrapper);
+        if(contractCount>0){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public List<AssDevice> getByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getDevicesByProjectId(projectId);
+    }
+
+    @Override
+    public int deleteByIds(List<Long> ids,Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.update(null,Wrappers.<AssDevice>lambdaUpdate()
+                .in(AssDevice::getId,ids)
+                .set(AssDevice::getDelFlag,DeleteFlagEnum.DELETED.getCode())
+                .set(AssDevice::getUpdateBy,ShiroUtils.getSysUser().getUsername()));
+    }
+}
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
new file mode 100644
index 0000000..b402d2f
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimatePlanServiceImpl.java
@@ -0,0 +1,108 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssEstimatePlan;
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.enums.PlayRoleEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssEstimatePlanMapper;
+import com.gkhy.assess.system.service.*;
+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;
+
+/**
+ * <p>
+ * 评价项目计划表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssEstimatePlanServiceImpl extends ServiceImpl<AssEstimatePlanMapper, AssEstimatePlan> implements AssEstimatePlanService {
+    @Autowired
+    private AssProjectService projectService;
+
+    @Autowired
+    private AssEstimateScheduleService estimateScheduleService;
+
+    @Autowired
+    private AssPlanPersonService planPersonService;
+
+    @Autowired
+    private AssDeviceService deviceService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addEstimatePlan(AssEstimatePlan estimatePlan) {
+        Long projectId=estimatePlan.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkEstimatePlanCount(projectId);
+        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimatePlan.getAuserId()).setProjectId(projectId));
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.ESTIMATE_TASK);
+        estimatePlan.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(estimatePlan);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.ESTIMATE_PLAN);
+            //todo 机构负责人
+            planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(estimatePlan.getAuserId())
+                    .setPlayRole(PlayRoleEnum.ANGENCY_LEADER.getCode())
+                    .setProjectId(projectId));
+        }
+        //todo 新增评价日程安排
+        estimateScheduleService.saveBatch(estimatePlan.getEstimateSchedules());
+        return row;
+    }
+
+    public void checkEstimatePlanCount(Long projectId){
+        //校验项目下评价计划数量
+        int contractCount= baseMapper.getCountByProjectId(projectId);
+        if(contractCount>0){
+            throw new ApiException("项目下已存在评价计划信息");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editEstimatePlan(AssEstimatePlan estimatePlan) {
+        projectService.checkUserAllowed(estimatePlan.getProjectId());
+        AssEstimatePlan oldPlan=getById(estimatePlan.getId());
+        estimatePlan.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(estimatePlan);
+        if(row>0) {
+            if (estimatePlan.getAuserId() != null && !estimatePlan.getAuserId().equals(oldPlan.getAuserId())) {
+                planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimatePlan.getAuserId()).setProjectId(oldPlan.getProjectId()));
+                //todo 删除旧的项目成员
+                planPersonService.deletePlanPersonByPersonId(oldPlan.getAuserId());
+                //todo 新增新的项目成员
+                planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(estimatePlan.getAuserId())
+                        .setPlayRole(PlayRoleEnum.ANGENCY_LEADER.getCode())
+                        .setProjectId(oldPlan.getProjectId()));
+            }
+        }
+        return row;
+    }
+
+    @Override
+    public AssEstimatePlan getEstimatePlanByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        AssEstimatePlan assEstimatePlan= baseMapper.getEstimatePlanByProjectId(projectId);
+        assEstimatePlan.setPlanPersons(planPersonService.getByProjectId(projectId));
+        assEstimatePlan.setEstimateSchedules(estimateScheduleService.getByProjectId(projectId));
+        assEstimatePlan.setDevices(deviceService.getByProjectId(projectId));
+        return assEstimatePlan;
+    }
+
+
+    @Override
+    public AssEstimatePlan getEstimatePlanById(Long estimatePlanId) {
+        AssEstimatePlan estimatePlan= baseMapper.getEstimatePlanById(estimatePlanId);
+        projectService.checkUserAllowed(estimatePlan.getProjectId());
+        return estimatePlan;
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateScheduleServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateScheduleServiceImpl.java
new file mode 100644
index 0000000..5bcb70b
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateScheduleServiceImpl.java
@@ -0,0 +1,71 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssEstimateSchedule;
+import com.gkhy.assess.system.mapper.AssEstimateScheduleMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssEstimateScheduleService;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评价日程安排表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssEstimateScheduleServiceImpl extends ServiceImpl<AssEstimateScheduleMapper, AssEstimateSchedule> implements AssEstimateScheduleService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public List<AssEstimateSchedule> getByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getEstimateScheduleByProjectId(projectId);
+    }
+
+
+    @Override
+    public int addSchedule(AssEstimateSchedule estimateSchedule) {
+        projectService.checkUserAllowed(estimateSchedule.getProjectId());
+        if(!checkNameUnique(estimateSchedule)){
+            throw new ApiException("项目下已存在该日程安排");
+        }
+        estimateSchedule.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.insert(estimateSchedule);
+    }
+
+    public boolean checkNameUnique(AssEstimateSchedule estimateSchedule) {
+        LambdaQueryWrapper<AssEstimateSchedule> lambdaQueryWrapper = Wrappers.<AssEstimateSchedule>lambdaQuery()
+                .eq(AssEstimateSchedule::getName, estimateSchedule.getName())
+                .eq(AssEstimateSchedule::getDelFlag, DeleteFlagEnum.UN_DELETE)
+                .eq(AssEstimateSchedule::getProjectId, estimateSchedule.getProjectId());
+        if(estimateSchedule.getId()!=null){
+            lambdaQueryWrapper.ne(AssEstimateSchedule::getId,estimateSchedule.getId());
+        }
+        long contractCount= count(lambdaQueryWrapper);
+        if(contractCount>0){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public int editSchedule(AssEstimateSchedule estimateSchedule) {
+        projectService.checkUserAllowed(estimateSchedule.getProjectId());
+        if(!checkNameUnique(estimateSchedule)){
+            throw new ApiException("项目下已存在该日程安排");
+        }
+        estimateSchedule.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(estimateSchedule);
+    }
+}
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
new file mode 100644
index 0000000..261bfd2
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssEstimateTaskServiceImpl.java
@@ -0,0 +1,96 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssEstimateTask;
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.enums.PlayRoleEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssEstimateTaskMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssEstimateTaskService;
+import com.gkhy.assess.system.service.AssPlanPersonService;
+import com.gkhy.assess.system.service.AssProjectService;
+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;
+
+/**
+ * <p>
+ * 评价任务通知表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssEstimateTaskServiceImpl extends ServiceImpl<AssEstimateTaskMapper, AssEstimateTask> implements AssEstimateTaskService {
+
+    @Autowired
+    private AssProjectService projectService;
+    @Autowired
+    private AssPlanPersonService planPersonService;
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addEstimateTask(AssEstimateTask estimateTask) {
+        Long projectId=estimateTask.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkTaskCount(projectId);
+        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(estimateTask.getLeaderId()).setProjectId(projectId));
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.CONTRACT);
+        estimateTask.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(estimateTask);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.ESTIMATE_TASK);
+            //todo 新增项目组成员
+            AssPlanPerson planPerson=new AssPlanPerson().setPersonId(estimateTask.getLeaderId())
+                    .setPlayRole(PlayRoleEnum.PROJECT_LEADER.getCode())
+                    .setProjectId(projectId);
+            planPersonService.addPlanPerson(planPerson);
+        }
+        return row;
+    }
+
+    public void checkTaskCount(Long projectId){
+        //校验项目下评价任务数量
+        int contractCount= baseMapper.getCountByProjectId(projectId);
+        if(contractCount>0){
+            throw new ApiException("项目下已存在评价任务数量");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editEstimateTask(AssEstimateTask estimateTask) {
+        projectService.checkUserAllowed(estimateTask.getProjectId());
+        AssEstimateTask oldTask=getById(estimateTask.getId());
+        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()));
+            //todo 删除旧的项目成员
+            planPersonService.deletePlanPersonByPersonId(oldTask.getLeaderId());
+            //todo 新增新的项目成员
+            planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(estimateTask.getLeaderId())
+                    .setPlayRole(PlayRoleEnum.PROJECT_LEADER.getCode())
+                    .setProjectId(oldTask.getProjectId()));
+        }
+        return row;
+    }
+
+    @Override
+    public AssEstimateTask getEstimateTaskByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getTaskByProjectId(projectId);
+    }
+
+
+    @Override
+    public AssEstimateTask getEstimateTaskById(Long taskId) {
+        AssEstimateTask estimateTask= baseMapper.getTaskById(taskId);
+        projectService.checkUserAllowed(estimateTask.getProjectId());
+        return estimateTask;
+    }
+}
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
new file mode 100644
index 0000000..79215f3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecognitionServiceImpl.java
@@ -0,0 +1,131 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.StringUtils;
+import com.gkhy.assess.system.domain.AssFaceRecognition;
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssFaceRecognitionMapper;
+import com.gkhy.assess.system.mapper.AssPlanPersonMapper;
+import com.gkhy.assess.system.domain.vo.UploadObjectVO;
+import com.gkhy.assess.system.service.AssFaceRecognitionService;
+import com.gkhy.assess.system.service.AssProjectService;
+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 java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 签字确认表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssFaceRecognitionServiceImpl extends ServiceImpl<AssFaceRecognitionMapper, AssFaceRecognition> implements AssFaceRecognitionService {
+
+    @Autowired
+    private AssProjectService projectService;
+    @Autowired
+    private SysCommonService commonService;
+    @Autowired
+    private AssPlanPersonMapper planPersonMapper;
+
+    @Override
+    public int addFaceRecognition(AssFaceRecognition faceRecognition) {
+        int row=0;
+        projectService.checkUserAllowed(faceRecognition.getProjectId());
+        UploadObjectVO uploadObjectVO=commonService.doUpload(faceRecognition.getFile());
+        faceRecognition.setSignPath(uploadObjectVO.getPath());
+        AssFaceRecognition existRecord=checkFaceRecognitionUnique(faceRecognition.getPersonId(),faceRecognition.getProjectId());
+        if(existRecord!=null){
+            existRecord.setSignPath(faceRecognition.getSignPath());
+            existRecord.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+            row =baseMapper.updateById(existRecord);
+        }else{
+            faceRecognition.setCreateBy(ShiroUtils.getSysUser().getUsername());
+            row=baseMapper.insert(faceRecognition);
+        }
+        return row;
+    }
+
+    @Override
+    public void doFaceRecognition(Map map) {
+        Long projectId= Long.parseLong(map.get("projectId").toString());
+        projectService.checkUserAllowed(projectId);
+        //todo 校验项目成员是否都完成了签字确认
+        checkAllFaceRecongnition(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.PROJECT_MATERIAL);
+        //更新项目状态
+        projectService.changeReportProgress(projectId,ReportProgressEnum.FACE_RECOGNITION);
+    }
+
+    @Override
+    public Boolean checkAllFaceRecongnition(Long projectId){
+        projectService.checkUserAllowed(projectId);
+        List<AssPlanPerson> planPersonList=planPersonMapper.getAllPlanPersonByProjectId(projectId);
+        List<AssFaceRecognition> faceRecognitionList=baseMapper.getFaceRecognitionByProjectId(projectId);
+        Map<Long,AssFaceRecognition> map=faceRecognitionList.stream().collect(Collectors.toMap(AssFaceRecognition::getPersonId,a -> a,(k1,k2) -> k1));
+        String message="";
+        for(AssPlanPerson planPerson:planPersonList){
+            if(map.get(planPerson.getPersonId())==null){
+                message=message+planPerson.getPerson().getName()+",";
+            }
+        }
+        if(StringUtils.isNotBlank(message)){
+            message=message+"未签字确认";
+            throw new ApiException(message);
+        }
+        return true;
+    }
+
+    public AssFaceRecognition checkFaceRecognitionUnique(Long personId,Long projectId){
+        LambdaQueryWrapper<AssFaceRecognition> lambdaQueryWrapper = Wrappers.<AssFaceRecognition>lambdaQuery()
+                .eq(AssFaceRecognition::getPersonId, personId)
+                .eq(AssFaceRecognition::getProjectId, projectId)
+                .eq(AssFaceRecognition::getDelFlag, DeleteFlagEnum.UN_DELETE);
+        return getOne(lambdaQueryWrapper);
+    }
+
+    @Override
+    public int editFaceRecognition(AssFaceRecognition faceRecognition) {
+        projectService.checkUserAllowed(faceRecognition.getProjectId());
+        faceRecognition.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(faceRecognition);
+        return row;
+    }
+
+    @Override
+    public List<AssFaceRecognition> getFaceRecognitionByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getFaceRecognitionByProjectId(projectId);
+    }
+
+
+    @Override
+    public AssFaceRecognition getFaceRecognitionById(Long faceRecognitionId) {
+        AssFaceRecognition faceRecognition= baseMapper.getFaceRecognitionById(faceRecognitionId);
+        projectService.checkUserAllowed(faceRecognition.getProjectId());
+        return faceRecognition;
+    }
+
+    @Override
+    public AssFaceRecognition getRecognitionByPersonId(Long projectId, Long personId) {
+        projectService.checkUserAllowed(projectId);
+        return getOne(Wrappers.<AssFaceRecognition>lambdaQuery()
+                .eq(AssFaceRecognition::getPersonId,personId)
+                .eq(AssFaceRecognition::getProjectId,projectId)
+                .eq(AssFaceRecognition::getDelFlag, DeleteFlagEnum.UN_DELETE.getCode()));
+    }
+}
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
new file mode 100644
index 0000000..1e4e9b3
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFaceRecordServiceImpl.java
@@ -0,0 +1,87 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssFaceRecord;
+import com.gkhy.assess.system.mapper.AssFaceRecordMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.domain.vo.UploadObjectVO;
+import com.gkhy.assess.system.service.AssFaceRecordService;
+import com.gkhy.assess.system.service.AssProjectService;
+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 java.util.List;
+
+/**
+ * <p>
+ * 现场勘验人员人脸识别记录表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssFaceRecordServiceImpl extends ServiceImpl<AssFaceRecordMapper, AssFaceRecord> implements AssFaceRecordService {
+    @Autowired
+    private SysCommonService commonService;
+    @Autowired
+    private AssProjectService projectService;
+
+    @Override
+    public int addFaceRecord(AssFaceRecord faceRecord) {
+        int row=0;
+        projectService.checkUserAllowed(faceRecord.getProjectId());
+        UploadObjectVO uploadObjectVO=commonService.doUpload(faceRecord.getFile());
+        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);
+        }else{
+            faceRecord.setCreateBy(ShiroUtils.getSysUser().getUsername());
+            row=baseMapper.insert(faceRecord);
+        }
+        return row;
+    }
+
+    public AssFaceRecord checkFaceUnique(Long personId,Long projectId) {
+        LambdaQueryWrapper<AssFaceRecord> lambdaQueryWrapper = Wrappers.<AssFaceRecord>lambdaQuery()
+                .eq(AssFaceRecord::getPersonId, personId)
+                .eq(AssFaceRecord::getProjectId, projectId)
+                .eq(AssFaceRecord::getDelFlag, DeleteFlagEnum.UN_DELETE);
+        return getOne(lambdaQueryWrapper);
+    }
+
+
+    @Override
+    public List<AssFaceRecord> faceRecordList(Long projectId,Integer scene) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.faceRecordList(projectId,scene);
+    }
+
+    @Override
+    public int editFaceRecord(AssFaceRecord faceRecord) {
+        projectService.checkUserAllowed(faceRecord.getProjectId());
+        faceRecord.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.updateById(faceRecord);
+        return row;
+    }
+
+    @Override
+    public int deleteById(Long faceId) {
+        AssFaceRecord faceRecord=getById(faceId);
+        projectService.checkUserAllowed(faceRecord.getProjectId());
+        faceRecord=new AssFaceRecord().setId(faceId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        faceRecord.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(faceRecord);
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFilingApplyServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFilingApplyServiceImpl.java
new file mode 100644
index 0000000..5fde535
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssFilingApplyServiceImpl.java
@@ -0,0 +1,66 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.system.domain.AssFilingApply;
+import com.gkhy.assess.system.mapper.AssFilingApplyMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssFilingApplyService;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 报备申请表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssFilingApplyServiceImpl extends ServiceImpl<AssFilingApplyMapper, AssFilingApply> implements AssFilingApplyService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public int addFilingApply(AssFilingApply filingApply) {
+        projectService.checkUserAllowed(filingApply.getProjectId());
+        filingApply.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(filingApply);
+        return row;
+    }
+
+    @Override
+    public int editFilingApply(AssFilingApply filingApply) {
+        projectService.checkUserAllowed(filingApply.getProjectId());
+        filingApply.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(filingApply);
+        return row;
+    }
+
+    @Override
+    public List<AssFilingApply> getFilingApplyByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getFilingApplyByProjectId(projectId);
+    }
+
+    @Override
+    public int deleteById(Long filingApplyId) {
+        AssFilingApply filingApply=getById(filingApplyId);
+        projectService.checkUserAllowed(filingApply.getProjectId());
+        filingApply=new AssFilingApply().setId(filingApplyId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        filingApply.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(filingApply);
+        return row;
+    }
+
+    @Override
+    public AssFilingApply getFilingApplyById(Long filingApplyId) {
+        AssFilingApply filingApply=getById(filingApplyId);
+        projectService.checkUserAllowed(filingApply.getProjectId());
+        return filingApply;
+    }
+}
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
new file mode 100644
index 0000000..97c7212
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssInvestigationServiceImpl.java
@@ -0,0 +1,125 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.enums.RequestSourceEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssInvestigation;
+import com.gkhy.assess.system.enums.AccessoryFileTypeEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssInvestigationMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssAccessoryFileService;
+import com.gkhy.assess.system.service.AssInvestigationService;
+import com.gkhy.assess.system.service.AssProjectService;
+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;
+
+/**
+ * <p>
+ * 现场勘验记录表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssInvestigationServiceImpl extends ServiceImpl<AssInvestigationMapper, AssInvestigation> implements AssInvestigationService {
+
+    @Autowired
+    private AssProjectService projectService;
+
+    @Autowired
+    private AssAccessoryFileService accessoryFileService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addInvestigation(AssInvestigation investigation,String requestSourceType) {
+        Long projectId=investigation.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkInvestigationCount(projectId);
+        investigation.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        if(investigation.getIsSafetyCheck()!=null&&investigation.getIsSafetyCheck()==1){
+            Integer fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, 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("主要装置前的合影照片不能为空");
+        }
+        fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.INVESTINGATION_IMAGE.getCode());
+        if(fileCount==0){
+            throw new ApiException("现场勘验照片照片不能为空");
+        }
+        fileCount=accessoryFileService.getAccessoryFileCountByProjectId(projectId, AccessoryFileTypeEnum.COMPANY_IMAGE.getCode());
+        if(fileCount==0){
+            throw new ApiException("现场勘验人员与企业陪同人员图片不能为空");
+        }
+//        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;
+    }
+
+    public void checkInvestigationCount(Long projectId){
+        //校验项目下勘验记录数量
+        int count= baseMapper.getCountByProjectId(projectId);
+        if(count>0){
+            throw new ApiException("项目下已存在现场勘验记录");
+        }
+    }
+
+    @Override
+    public int editInvestigation(AssInvestigation investigation) {
+        projectService.checkUserAllowed(investigation.getProjectId());
+        investigation.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(investigation);
+        return row;
+    }
+
+    @Override
+    public AssInvestigation getInvestigationByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        AssInvestigation investigation= baseMapper.getInvestigationByProjectId(projectId);
+        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;
+    }
+
+
+    @Override
+    public AssInvestigation getInvestigationById(Long investigationId) {
+        return baseMapper.getInvestigationById(investigationId);
+    }
+
+    @Override
+    public void doInvestigationProcess(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.WORK_NOTIFICATION);
+        //更新项目状态
+        projectService.changeReportProgress(projectId,ReportProgressEnum.INVESTINGATION);
+    }
+}
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
new file mode 100644
index 0000000..b8fbf46
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssPlanPersonServiceImpl.java
@@ -0,0 +1,105 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+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.enums.PlayRoleEnum;
+import com.gkhy.assess.system.mapper.AssPlanPersonMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssPlanPersonService;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 评价项目组成员表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssPlanPersonServiceImpl extends ServiceImpl<AssPlanPersonMapper, AssPlanPerson> implements AssPlanPersonService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public List<AssPlanPerson> getByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getPlanPersonByProjectId(projectId);
+    }
+
+
+    @Override
+    public int addPlanPerson(AssPlanPerson planPerson) {
+        projectService.checkUserAllowed(planPerson.getProjectId());
+        checkPersonUnique(planPerson);
+        planPerson.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.insert(planPerson);
+    }
+
+
+    @Override
+    public void checkPersonUnique(AssPlanPerson planPerson) {
+        LambdaQueryWrapper<AssPlanPerson> lambdaQueryWrapper = Wrappers.<AssPlanPerson>lambdaQuery()
+                .eq(AssPlanPerson::getPersonId, planPerson.getPersonId())
+                .eq(AssPlanPerson::getDelFlag, DeleteFlagEnum.UN_DELETE)
+                .eq(AssPlanPerson::getProjectId, planPerson.getProjectId());
+        if(planPerson.getId()!=null){
+            lambdaQueryWrapper.ne(AssPlanPerson::getId,planPerson.getId());
+        }
+        AssPlanPerson pPerson= getOne(lambdaQueryWrapper);
+        if(pPerson!=null){
+            PlayRoleEnum playRoleEnum=PlayRoleEnum.getInfoByCode(pPerson.getPlayRole());
+            String message=playRoleEnum!=null?playRoleEnum.getInfo():"";
+            if(StringUtils.isBlank(message)){
+                message="改用户已存在";
+            }else{
+                message="该用户已担任"+message;
+            }
+            throw new ApiException(message);
+        }
+    }
+
+    @Override
+    public AssPlanPerson getPlanPersonByPersonId(Long personId,Long projectId) {
+        return getOne(Wrappers.<AssPlanPerson>lambdaQuery()
+                .eq(AssPlanPerson::getPersonId,personId)
+                .eq(AssPlanPerson::getDelFlag,DeleteFlagEnum.UN_DELETE.getCode())
+                .eq(AssPlanPerson::getProjectId,projectId));
+    }
+
+    @Override
+    public int editPlanPerson(AssPlanPerson planPerson) {
+        projectService.checkUserAllowed(planPerson.getProjectId());
+        if(planPerson.getPersonId()!=null){
+            checkPersonUnique(planPerson);
+        }
+        planPerson.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(planPerson);
+    }
+
+    @Override
+    public int deletePlanPersonById(Long planPersonId) {
+        AssPlanPerson planPerson=getById(planPersonId);
+        projectService.checkUserAllowed(planPerson.getProjectId());
+        planPerson=new AssPlanPerson().setId(planPersonId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        planPerson.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(planPerson);
+    }
+
+    @Override
+    public int deletePlanPersonByPersonId(Long personId) {
+        return baseMapper.update(null,Wrappers.<AssPlanPerson>lambdaUpdate()
+                .set(AssPlanPerson::getDelFlag,DeleteFlagEnum.DELETED.getCode())
+                .set(AssPlanPerson::getUpdateBy,ShiroUtils.getSysUser().getUsername())
+                .eq(AssPlanPerson::getPersonId,personId));
+    }
+}
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
new file mode 100644
index 0000000..a6f1b86
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProcessAuditServiceImpl.java
@@ -0,0 +1,101 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssPlanPerson;
+import com.gkhy.assess.system.domain.AssProcessAudit;
+import com.gkhy.assess.system.enums.AccessoryFileTypeEnum;
+import com.gkhy.assess.system.enums.PlayRoleEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssProcessAuditMapper;
+import com.gkhy.assess.system.service.AssAccessoryFileService;
+import com.gkhy.assess.system.service.AssPlanPersonService;
+import com.gkhy.assess.system.service.AssProcessAuditService;
+import com.gkhy.assess.system.service.AssProjectService;
+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;
+
+/**
+ * <p>
+ * 过程控制负责人审核表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssProcessAuditServiceImpl extends ServiceImpl<AssProcessAuditMapper, AssProcessAudit> implements AssProcessAuditService {
+
+    @Autowired
+    private AssProjectService projectService;
+    @Autowired
+    private AssPlanPersonService planPersonService;
+    @Autowired
+    private AssAccessoryFileService accessoryFileService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addProcessAudit(AssProcessAudit processAudit) {
+        Long projectId=processAudit.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkProcessAuditCount(projectId);
+        planPersonService.checkPersonUnique(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId()).setProjectId(projectId));
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.CONCLUSION);
+        processAudit.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(processAudit);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.PROCESS_AUDIT);
+            //todo 新增项目组成员
+            AssPlanPerson planPerson=new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId())
+                    .setPlayRole(PlayRoleEnum.PROCESS_LEADER.getCode())
+                    .setProjectId(projectId);
+            planPersonService.addPlanPerson(planPerson);
+        }
+        return row;
+    }
+
+    public void checkProcessAuditCount(Long projectId){
+        //校验项目下过程控制数量
+        int count= baseMapper.getCountByProjectId(projectId);
+        if(count>0){
+            throw new ApiException("项目下已存在过程控制");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editProcessAudit(AssProcessAudit processAudit) {
+        projectService.checkUserAllowed(processAudit.getProjectId());
+        AssProcessAudit oldProcess=getById(processAudit.getId());
+        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()));
+            //todo 删除旧的项目成员
+            planPersonService.deletePlanPersonByPersonId(oldProcess.getProcessLeaderId());
+            //todo 新增新的项目成员
+            planPersonService.addPlanPerson(new AssPlanPerson().setPersonId(processAudit.getProcessLeaderId())
+                    .setPlayRole(PlayRoleEnum.PROCESS_LEADER.getCode())
+                    .setProjectId(oldProcess.getProjectId()));
+        }
+        return row;
+    }
+
+    @Override
+    public AssProcessAudit getProcessAuditByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        AssProcessAudit processAudit= baseMapper.getProcessAuditByProjectId(projectId);
+        processAudit.setAccessoryFiles(accessoryFileService.getAccessoryFileByProjectId(projectId, AccessoryFileTypeEnum.PROCESS_ATTACHMENT.getCode()));
+        return processAudit;
+    }
+
+
+    @Override
+    public AssProcessAudit getProcessAuditById(Long processAuditId) {
+        return baseMapper.getProcessAuditById(processAuditId);
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectMaterialServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectMaterialServiceImpl.java
new file mode 100644
index 0000000..22faebb
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectMaterialServiceImpl.java
@@ -0,0 +1,91 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssContract;
+import com.gkhy.assess.system.domain.AssProjectMaterial;
+import com.gkhy.assess.system.domain.vo.ProjectMaterialVO;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssProjectMaterialMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssContractService;
+import com.gkhy.assess.system.service.AssProjectMaterialService;
+import com.gkhy.assess.system.service.AssProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目归档文件表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssProjectMaterialServiceImpl extends ServiceImpl<AssProjectMaterialMapper, AssProjectMaterial> implements AssProjectMaterialService {
+
+    @Autowired
+    private AssProjectService projectService;
+    @Autowired
+    private AssContractService contractService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addProjectMaterial(ProjectMaterialVO projectMaterialVO) {
+        List<AssProjectMaterial> projectMaterials=projectMaterialVO.getProjectMaterials();
+        Long projectId=projectMaterialVO.getProjectId();
+        if(projectMaterials==null||projectMaterials.size()!=3){
+            throw new ApiException("项目归档为空或者项目归档数量不正确");
+        }
+        projectService.checkUserAllowed(projectId);
+        checkProjectMaterialCount(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.PROCESS_AUDIT);
+        boolean b=saveBatch(projectMaterials);
+        if(b) {
+            //更新合同
+            AssContract contract= projectMaterialVO.getContract();
+            contractService.updateById(contract);
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.PROJECT_MATERIAL);
+        }
+        return 1;
+    }
+
+    public void checkProjectMaterialCount(Long projectId){
+        //校验项目下项目归档数量
+        int count= baseMapper.getCountByProjectId(projectId);
+        if(count>0){
+            throw new ApiException("项目下已存在项目归档");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editProjectMaterial(ProjectMaterialVO projectMaterialVO) {
+        Long projectId=projectMaterialVO.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        boolean b=updateBatchById(projectMaterialVO.getProjectMaterials());
+        if(b){
+            //更新合同
+            AssContract contract= projectMaterialVO.getContract();
+            contractService.updateById(contract);
+        }
+        return 1;
+    }
+
+    @Override
+    public List<AssProjectMaterial> getProjectMaterialByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getProjectMaterialByProjectId(projectId);
+    }
+
+
+    @Override
+    public AssProjectMaterial getProjectMaterialById(Long projectMaterialId) {
+        return baseMapper.getProjectMaterialById(projectMaterialId);
+    }
+}
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
new file mode 100644
index 0000000..baec209
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssProjectServiceImpl.java
@@ -0,0 +1,249 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+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.AssPlanPerson;
+import com.gkhy.assess.system.domain.AssProject;
+import com.gkhy.assess.system.domain.vo.ProjectStaticVO;
+import com.gkhy.assess.system.enums.ProgressPhaseEnum;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssPlanPersonMapper;
+import com.gkhy.assess.system.mapper.AssProjectMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 项目表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-11 14:16:18
+ */
+@Service
+public class AssProjectServiceImpl extends ServiceImpl<AssProjectMapper, AssProject> implements AssProjectService {
+    @Autowired
+    private AssPlanPersonMapper planPersonMapper;
+
+    @Override
+    public CommonPage projectList(AssProject project) {
+        SysUser user= ShiroUtils.getSysUser();
+        if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            //机构用户只能查看本机构的项目
+            if(user.getAgencyId()==null){
+                throw new ApiException("用户机构id为空");
+            }
+            project.setAgencyId(user.getAgencyId());
+        }
+        PageUtil.startPage();
+        List<AssProject> projects=baseMapper.projectList(project);
+        //获取签字确认人数
+        return CommonPage.restPage(projects);
+    }
+
+    @Override
+    public AssProject getProjectById(Long projectId) {
+        return baseMapper.getProjectById(projectId);
+    }
+
+    @Override
+    public int addProject(AssProject project) {
+        //todo 校验用户,只有机构账号有权限创建项目
+        SysUser user= ShiroUtils.getSysUser();
+        if(!user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){
+            throw new ApiException("无权操作,只有机构用户可以创建项目");
+        }
+        if(user.getAgencyId()==null){
+            throw new ApiException("用户机构id为空");
+        }
+        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);
+        return row;
+    }
+
+    @Override
+    public int deleteProjectById(Long projectId) {
+        //todo  权限校验
+        SysUser user= ShiroUtils.getSysUser();
+        checkUserAllowed(projectId);
+        AssProject project=new AssProject()
+                .setId(projectId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        project.setUpdateBy(user.getUsername());
+        return baseMapper.updateById(project);
+    }
+
+    @Override
+    public int editProject(AssProject project) {
+        Long projectId=project.getId();
+        if(projectId==null){
+            throw new ApiException("项目id不能为空");
+        }
+        checkUserAllowed(projectId);
+        if(!checkNameUnique(project)){
+            throw new ApiException("项目名已存在");
+        }
+        project.setAgencyId(null);//机构id不能修改
+        project.setReportProgress(null);//项目状态不能修改
+        project.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.updateById(project);
+        return row;
+    }
+
+    @Override
+    public AssProject checkProjectDataScope(Long projectId) {
+        return null;
+    }
+
+    @Override
+    public Integer getProjectReportProgress(Long projectId) {
+        checkUserAllowed(projectId);
+        return baseMapper.getReportProgress(projectId);
+    }
+
+
+    @Override
+    public boolean checkNameUnique(AssProject project) {
+        Long projectId = project.getId()==null? -1L : project.getId();
+        AssProject pro = baseMapper.getProjectByName(project.getName());
+        if (pro!=null && pro.getId().longValue() != projectId.longValue())
+        {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public  void checkReportProgress(Long projectId, ReportProgressEnum reportProgressEnum) {
+        Integer reportProgress= getProjectReportProgress(projectId);
+        if(reportProgressEnum.getCode()!=reportProgress){
+            throw new ApiException(String.format("项目状态不是%s,不能操作", reportProgressEnum.getInfo()));
+        }
+    }
+
+    @Override
+    public int changeReportProgress(Long projectId, ReportProgressEnum reportProgressEnum) {
+        AssProject project=new AssProject().setId(projectId)
+                .setReportProgress(reportProgressEnum.getCode())
+                .setPhase(ProgressPhaseEnum.getPhaseByProcess(reportProgressEnum.getCode()));
+        project.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        if(reportProgressEnum.getCode().equals(ReportProgressEnum.CONFIRM_FINAL.getCode())){
+            project.setFilingDate(LocalDateTime.now());
+        }
+        return baseMapper.updateById(project);
+    }
+
+    @Override
+    public CommonPage memberProjects(Long personId, Integer finish) {
+        SysUser user= ShiroUtils.getSysUser();
+        if(!user.getIdentity().equals(UserIdentityEnum.EXPERT.getCode())){
+            throw new ApiException("无权限,只有专家用户才能操作");
+        }
+
+        PageUtil.startPage();
+        List<AssProject> projects=baseMapper.getMemberProjectByUserId(personId,finish,user.getAgencyId());
+        if(projects.size()>0) {
+            getProjectPlanPerson(projects);
+        }
+        return CommonPage.restPage(projects);
+    }
+
+    @Override
+    public CommonPage leaderProjects(Long personId) {
+        SysUser user= ShiroUtils.getSysUser();
+        if(!user.getIdentity().equals(UserIdentityEnum.EXPERT.getCode())){
+            throw new ApiException("无权限,只有专家用户才能操作");
+        }
+        PageUtil.startPage();
+        List<AssProject> projects=baseMapper.getLeaderProjectByUserId(personId,user.getAgencyId());
+        return CommonPage.restPage(projects);
+    }
+
+    private void getProjectPlanPerson(List<AssProject> projects){
+        List<Long> planPersonIds=projects.stream().map(AssProject::getPlanPersonId).collect(Collectors.toList());
+        List<AssPlanPerson> planPersonList=planPersonMapper.getPlanPersonsByIds(planPersonIds);
+        Map<Long,AssPlanPerson> maps=planPersonList.stream().collect(Collectors.toMap(AssPlanPerson::getId,a -> a));
+        for(AssProject project:projects){
+            project.setPlanPerson(maps.get(project.getPlanPersonId()));
+        }
+    }
+
+    @Override
+    public ProjectStaticVO projectStat(AssProject project) {
+        SysUser user=ShiroUtils.getSysUser();
+        if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            if(user.getAgencyId()==null){
+                throw new ApiException("用户机构id为空");
+            }
+            project.setAgencyId(user.getAgencyId());
+        }
+        Integer projectTotal=baseMapper.getProjectCount(project);
+        project.setPhase(ProgressPhaseEnum.RISK.getCode());
+        Integer riskTotal=baseMapper.getProjectCount(project);
+
+        project.setPhase(ProgressPhaseEnum.INVESTIGATION.getCode());
+        Integer investigationTotal=baseMapper.getProjectCount(project);
+
+        project.setPhase(ProgressPhaseEnum.REVIEW.getCode());
+        Integer reviewTotal=baseMapper.getProjectCount(project);
+
+        project.setPhase(ProgressPhaseEnum.REPORT.getCode());
+        Integer reportTotal=baseMapper.getProjectCount(project);
+
+        project.setPhase(ProgressPhaseEnum.ARCHIVE.getCode());
+        Integer archiveTotal=baseMapper.getProjectCount(project);
+
+        ProjectStaticVO projectStaticVO=new ProjectStaticVO()
+                .setProjectTotal(projectTotal)
+                .setRiskTotal(riskTotal)
+                .setInvestigationTotal(investigationTotal)
+                .setReviewTotal(reviewTotal)
+                .setReportTotal(reportTotal)
+                .setArchiveTotal(archiveTotal);
+        return projectStaticVO;
+    }
+
+    @Override
+    public Long getProjectAgencyId(Long projectId) {
+        AssProject project=getOne(Wrappers.<AssProject>lambdaQuery()
+                .select(AssProject::getAgencyId)
+                .eq(AssProject::getId,projectId)
+                .eq(AssProject::getDelFlag, DeleteFlagEnum.UN_DELETE.getCode()));
+        if(project==null){
+            throw new ApiException("项目不存在");
+        }
+        return project.getAgencyId();
+    }
+
+    @Override
+    public void checkUserAllowed(Long projectId) {
+        if(projectId==null){
+            throw new ApiException("项目id不能为空");
+        }
+        SysUser currentUser=ShiroUtils.getSysUser();
+        if(!Objects.equals(currentUser.getIdentity(),UserIdentityEnum.MONITOR.getCode())){
+            if(!Objects.equals(currentUser.getAgencyId(), getProjectAgencyId(projectId))){
+                throw new ApiException("没有权限操作其他机构数据");
+            }
+        }
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRecitificationServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRecitificationServiceImpl.java
new file mode 100644
index 0000000..7a156c2
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRecitificationServiceImpl.java
@@ -0,0 +1,69 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.utils.PageUtil;
+import com.gkhy.assess.system.domain.AssProcessAudit;
+import com.gkhy.assess.system.domain.AssRecitification;
+import com.gkhy.assess.system.mapper.AssRecitificationMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.service.AssRecitificationService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 项目整改情况说明表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssRecitificationServiceImpl extends ServiceImpl<AssRecitificationMapper, AssRecitification> implements AssRecitificationService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public CommonPage recitificationList(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        PageUtil.startPage();
+        List<AssRecitification> recitifications=baseMapper.recitificationList(projectId);
+        return CommonPage.restPage(recitifications);
+    }
+
+    @Override
+    public int addRecitification(AssRecitification recitification) {
+        projectService.checkUserAllowed(recitification.getProjectId());
+        recitification.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(recitification);
+        return row;
+    }
+
+    @Override
+    public int editRecitification(AssRecitification recitification) {
+        projectService.checkUserAllowed(recitification.getProjectId());
+        recitification.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.updateById(recitification);
+        return row;
+    }
+
+    @Override
+    public int deleteById(Long recitificationId) {
+        AssRecitification recitification=getById(recitificationId);
+        projectService.checkUserAllowed(recitification.getProjectId());
+        recitification=new AssRecitification()
+                .setId(recitificationId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        recitification.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(recitification);
+    }
+
+    @Override
+    public AssRecitification getRecitificationById(Long recitificationId) {
+        return getById(recitificationId);
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssReviewRecordServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssReviewRecordServiceImpl.java
new file mode 100644
index 0000000..224f303
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssReviewRecordServiceImpl.java
@@ -0,0 +1,24 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.service.AssReviewRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class AssReviewRecordServiceImpl implements AssReviewRecordService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    public void doReview(Map map) {
+        Long projectId= Long.parseLong(map.get("projectId").toString());
+        projectService.checkUserAllowed(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.TECH_AUDIT);
+        //更新项目状态
+        projectService.changeReportProgress(projectId,ReportProgressEnum.REVIEW_RECORD);
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRiskEstimateServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRiskEstimateServiceImpl.java
new file mode 100644
index 0000000..735c168
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssRiskEstimateServiceImpl.java
@@ -0,0 +1,89 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssProject;
+import com.gkhy.assess.system.domain.AssRiskEstimate;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssRiskEstimateMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.service.AssRiskEstimateService;
+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;
+
+/**
+ * <p>
+ * 风险评估表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssRiskEstimateServiceImpl extends ServiceImpl<AssRiskEstimateMapper, AssRiskEstimate> implements AssRiskEstimateService {
+    @Autowired
+    private AssProjectService projectService;
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public Long addRiskEstimate(AssRiskEstimate riskEstimate) {
+        SysUser user= ShiroUtils.getSysUser();
+        if(user.getAgencyId()==null){
+            throw new ApiException("无权操作,只有机构用户有权操作");
+        }
+        AssProject project=riskEstimate.getProject();
+        project.setAgencyId(user.getAgencyId());
+        projectService.addProject(project);
+        Long projectId=project.getId();
+        riskEstimate.setProjectId(projectId);
+        riskEstimate.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(riskEstimate);
+        if(row>0){
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.RISK_ESTIMATE);
+        }
+        return projectId;
+    }
+
+    public void checkRiskEstimateCount(Long projectId){
+        //校验项目下风险评估数量
+        int contractCount= baseMapper.getCountByProjectId(projectId);
+        if(contractCount>0){
+            throw new ApiException("项目下已存在风险评估信息");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int editRiskEstimate(AssRiskEstimate riskEstimate) {
+        AssProject project=riskEstimate.getProject();
+        projectService.editProject(project);
+        Long riskId=riskEstimate.getId();
+        if(riskId==null){
+            throw new ApiException("项目风险分析id不能为空");
+        }
+        riskEstimate.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row =baseMapper.updateById(riskEstimate);
+        return row;
+    }
+
+    @Override
+    public AssRiskEstimate getRiskEstimateByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        AssRiskEstimate riskEstimate= baseMapper.getRiskEstimateByProjectId(projectId);
+        if(riskEstimate==null){
+            throw new ApiException("项目风险分析不存在");
+        }
+        riskEstimate.setProject(projectService.getProjectById(riskEstimate.getProjectId()));
+        return riskEstimate;
+    }
+
+
+    @Override
+    public AssRiskEstimate getRiskEstimateById(Long riskId) {
+        return baseMapper.getRiskEstimateById(riskId);
+    }
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssWorkNotificationServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssWorkNotificationServiceImpl.java
new file mode 100644
index 0000000..b422bac
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/AssWorkNotificationServiceImpl.java
@@ -0,0 +1,71 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.system.domain.AssWorkNotification;
+import com.gkhy.assess.system.enums.ReportProgressEnum;
+import com.gkhy.assess.system.mapper.AssWorkNotificationMapper;
+import com.gkhy.assess.system.service.AssProjectService;
+import com.gkhy.assess.system.service.AssWorkNotificationService;
+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;
+
+/**
+ * <p>
+ * 从业告知表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-12-12 10:46:54
+ */
+@Service
+public class AssWorkNotificationServiceImpl extends ServiceImpl<AssWorkNotificationMapper, AssWorkNotification> implements AssWorkNotificationService {
+    @Autowired
+    private AssProjectService projectService;
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addWorkNotification(AssWorkNotification workNotification) {
+        Long projectId=workNotification.getProjectId();
+        projectService.checkUserAllowed(projectId);
+        checkWorkNotificationCount(projectId);
+        //校验项目状态
+        projectService.checkReportProgress(projectId, ReportProgressEnum.ESTIMATE_PLAN);
+        workNotification.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.insert(workNotification);
+        if(row>0) {
+            //更新项目状态
+            projectService.changeReportProgress(projectId,ReportProgressEnum.WORK_NOTIFICATION);
+        }
+        return row;
+    }
+
+    public void checkWorkNotificationCount(Long projectId){
+        //校验项目下从业告知数量
+        int count= baseMapper.getCountByProjectId(projectId);
+        if(count>0){
+            throw new ApiException("项目下已存在从业告知");
+        }
+    }
+
+    @Override
+    public int editWorkNotification(AssWorkNotification workNotification) {
+        projectService.checkUserAllowed(workNotification.getProjectId());
+        workNotification.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(workNotification);
+        return row;
+    }
+
+    @Override
+    public AssWorkNotification getWorkNotificationByProjectId(Long projectId) {
+        projectService.checkUserAllowed(projectId);
+        return baseMapper.getWorkNotificationByProjectId(projectId);
+    }
+
+    @Override
+    public AssWorkNotification getWorkNotificationById(Long workNotificationId) {
+        return baseMapper.getWorkNotificationById(workNotificationId);
+    }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java
index 65803ab..6ce89ad 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java
@@ -3,6 +3,7 @@
 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.DeleteFlagEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.PageUtil;
 import com.gkhy.assess.system.domain.SysAgency;
@@ -58,6 +59,14 @@
         return updateById(ay);
     }
 
+    @Override
+    public int deleteAgencyById(Long agencyId) {
+        SysAgency agency=new SysAgency().setId(agencyId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return baseMapper.updateById(agency);
+    }
+
     public SysAgency checkAgencyDataScope(Long agencyId) {
         if(agencyId==null){
             throw new ApiException("机构id为空!");
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAttachServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAttachServiceImpl.java
index 24130a5..5bac989 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAttachServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAttachServiceImpl.java
@@ -29,5 +29,10 @@
         return baseMapper.deleteAttachsByUserId(userId,type);
     }
 
+    @Override
+    public int deleteAttachsByIds(List<Long> ids) {
+        return baseMapper.deleteAttachsByIds(ids);
+    }
+
 
 }
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 25f68bd..c957622 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
@@ -7,10 +7,9 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Decoder;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import java.io.*;
 import java.util.Date;
 import java.util.UUID;
 
@@ -22,6 +21,9 @@
 
     @Override
     public UploadObjectVO uploadFile(MultipartFile file) {
+        if(file==null){
+            throw new ApiException("上传文件不能为空");
+        }
         UploadObjectVO uploadObjectVO=doUpload(file);
         return uploadObjectVO;
     }
@@ -41,8 +43,10 @@
         return true;
     }
 
+    @Override
     public UploadObjectVO doUpload(MultipartFile file){
-        String filename=file.getOriginalFilename();
+        String originName=file.getOriginalFilename();
+        String filename=originName;
         String subfix=filename.substring(filename.lastIndexOf("."));
         filename= UUID.randomUUID().toString().replace("-","")+subfix;
         String systemDir=System.getProperty("user.dir");
@@ -62,24 +66,47 @@
         }
         filePath=filePath.replace("\\","/");
         UploadObjectVO uploadObjectVO=new UploadObjectVO().setFilename(filename)
-                .setPath(filePath);
+                .setPath(filePath).setOriginName(originName);
         return uploadObjectVO;
     }
 
-
-    public boolean checkImageType(String subfix){
-        if(".jpg".equalsIgnoreCase(subfix)||
-                ".jpeg".equalsIgnoreCase(subfix)||
-                ".png".equalsIgnoreCase(subfix)||
-                ".bmp".equalsIgnoreCase(subfix)||
-                ".tif".equalsIgnoreCase(subfix)||
-                ".jfif".equalsIgnoreCase(subfix)||
-                ".webp".equalsIgnoreCase(subfix)||
-                ".gif".equalsIgnoreCase(subfix)
-        ){
-            return true;
+    @Override
+    public UploadObjectVO doUpload(String imageBase64) {
+        String originName="";
+        String filename=originName;
+        String subfix=".png";
+        filename= UUID.randomUUID().toString().replace("-","")+subfix;
+        String systemDir=System.getProperty("user.dir");
+        String dateStr= DateUtil.format(new Date(),"yyyyMMdd");
+        String filePath=uploadPath+File.separator+dateStr;
+        File dirFile=new File(filePath);
+        if(!dirFile.exists()){
+            dirFile.mkdirs();
         }
-        return false;
+        filePath=filePath+File.separator+filename;
+        BASE64Decoder decoder = new BASE64Decoder();
+        try {
+            // Base64解码
+            byte[] bytes = decoder.decodeBuffer(imageBase64);
+            for (int i = 0; i < bytes.length; ++i) {
+                if (bytes[i] < 0) {// 调整异常数据
+                    bytes[i] += 256;
+                }
+            }
+            // 生成jpeg图片
+            OutputStream out = new FileOutputStream(systemDir+File.separator+filePath);
+            out.write(bytes);
+            out.flush();
+            out.close();
+        } catch (FileNotFoundException e) {
+            throw new ApiException("找不到文件");
+        } catch (IOException e) {
+            throw new ApiException("发生错误,请联系管理员");
+        }
+        filePath=filePath.replace("\\","/");
+        UploadObjectVO uploadObjectVO=new UploadObjectVO().setFilename(filename)
+                .setPath(filePath).setOriginName(originName);
+        return uploadObjectVO;
     }
 
 }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictDataServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictDataServiceImpl.java
index 0cf0828..c7aa3fc 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictDataServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictDataServiceImpl.java
@@ -1,12 +1,16 @@
 package com.gkhy.assess.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.PageUtil;
 import com.gkhy.assess.system.domain.SysDictData;
 import com.gkhy.assess.system.mapper.SysDictDataMapper;
 import com.gkhy.assess.system.service.SysDictDataService;
+import com.gkhy.assess.system.utils.ShiroUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -29,6 +33,10 @@
 
     @Override
     public int addDictData(SysDictData dictData) {
+        if(!checkDictDataUnique(dictData)){
+            throw new ApiException("已存在相同字典数据");
+        }
+        dictData.setCreateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=save(dictData);
         if(!b){
             throw new ApiException("新增字典数据失败");
@@ -36,8 +44,27 @@
         return 1;
     }
 
+    public boolean checkDictDataUnique(SysDictData dictData) {
+        LambdaQueryWrapper<SysDictData> lambdaQueryWrapper = Wrappers.<SysDictData>lambdaQuery()
+                .eq(SysDictData::getDictType, dictData.getDictType())
+                .eq(SysDictData::getDelFlag, DeleteFlagEnum.UN_DELETE)
+                .eq(SysDictData::getLabel, dictData.getLabel());
+        if(dictData.getId()!=null){
+            lambdaQueryWrapper.ne(SysDictData::getId,dictData.getId());
+        }
+        long existCount= count(lambdaQueryWrapper);
+        if(existCount>0){
+            return false;
+        }
+        return true;
+    }
+
     @Override
     public int editDictData(SysDictData dictData) {
+        if(!checkDictDataUnique(dictData)){
+            throw new ApiException("已存在相同字典数据");
+        }
+        dictData.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(dictData);
         if(!b){
             throw new ApiException("修改字典数据失败");
@@ -47,7 +74,10 @@
 
     @Override
     public int deleteDictDataById(Long dictId) {
-        boolean b=removeById(dictId);
+        SysDictData sysDictData=new SysDictData().setId(dictId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        sysDictData.setUpdateBy(ShiroUtils.getSysUser().getName());
+        boolean b=updateById(sysDictData);
         if(!b){
             throw new ApiException("删除字典数据失败");
         }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java
index f26be53..b088ff1 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java
@@ -1,20 +1,21 @@
 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.PageUtil;
 import com.gkhy.assess.system.domain.SysDictData;
 import com.gkhy.assess.system.domain.SysDictType;
-import com.gkhy.assess.system.domain.SysLaw;
 import com.gkhy.assess.system.mapper.SysDictDataMapper;
 import com.gkhy.assess.system.mapper.SysDictTypeMapper;
 import com.gkhy.assess.system.service.SysDictTypeService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.List;
 
@@ -45,6 +46,10 @@
 
     @Override
     public int addDictType(SysDictType dictType) {
+        if(!checkDictTypeUnique(dictType)){
+            throw new ApiException("新增字典类型已存在");
+        }
+        dictType.setCreateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=save(dictType);
         if(!b){
             throw new ApiException("新增字典类型失败");
@@ -55,8 +60,12 @@
     @Override
    // @Transactional(rollbackFor = RuntimeException.class)
     public int editDictType(SysDictType dict) {
+        if(!checkDictTypeUnique(dict)){
+            throw new ApiException("字典类型已存在");
+        }
         SysDictType oldDict= baseMapper.getDictTypeById(dict.getId());
         dict.setDictType(oldDict.getDictType());//字典类型不能修改
+        dict.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(dict);
         if(!b){
             throw new ApiException("修改数据字典类型失败");
@@ -70,7 +79,10 @@
         if(dictDataMapper.countDictDataByType(dictType.getDictType())>0){
             throw new ApiException(String.format("%1$s已分配,不能删除", dictType.getName()));
         }
-        boolean b=removeById(dictId);
+        SysDictType sysDictType=new SysDictType().setId(dictId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        sysDictType.setUpdateBy(ShiroUtils.getSysUser().getName());
+        boolean b=updateById(sysDictType);
         if(!b){
             throw new ApiException("删除字典类型失败");
         }
@@ -87,7 +99,7 @@
     @Override
     public boolean checkDictTypeUnique(SysDictType dict) {
         Long dictId = ObjectUtil.isNull(dict.getId()) ? -1L : dict.getId();
-        SysDictType dictType = baseMapper.checkDictTypeUnique(dict.getDictType());
+        SysDictType dictType = baseMapper.checkDictTypeUnique(dict.getDictType(),dict.getName());
         if (ObjectUtil.isNotNull(dictType) && dictType.getId().longValue() != dictId.longValue())
         {
             return false;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java
index c3f44fd..d452bcc 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java
@@ -33,6 +33,7 @@
         if(StringUtils.isNotBlank(expertClassify.getClassifyName())){
             lambdaQueryWrapper.like(SysExpertClassify::getClassifyName,expertClassify.getClassifyName());
         }
+        lambdaQueryWrapper.eq(SysExpertClassify::getDelFlag,DeleteFlagEnum.UN_DELETE.getCode());
         List<SysExpertClassify> classifies= list(lambdaQueryWrapper);
         //筛选出所有一级标签
         return classifies.stream()
@@ -44,7 +45,7 @@
     public List<SysExpertClassify> listClassifyChildren(SysExpertClassify classify,List<SysExpertClassify> classifies){
         //递归查找子类
         return classifies.stream()
-                .filter(classifyEntity -> Objects.equals(classifyEntity.getParentId(), classify.getClassifyId()))
+                .filter(classifyEntity -> Objects.equals(classifyEntity.getParentId(), classify.getId()))
                 .peek(classifyEntity -> classifyEntity.setChildren(this.listClassifyChildren(classifyEntity,classifies)))
                 .collect(Collectors.toList());
     }
@@ -63,8 +64,9 @@
     @Override
     public int delClassify(Long classifyId) {
         SysExpertClassify classify = new SysExpertClassify();
-        classify.setClassifyId(classifyId);
+        classify.setId(classifyId);
         classify.setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        classify.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(classify);
         if(!b){
             throw new ApiException("删除专家分类失败");
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java
index ce0272d..fe922cb 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java
@@ -1,6 +1,8 @@
 package com.gkhy.assess.system.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.PageUtil;
 import com.gkhy.assess.system.domain.SysAgency;
@@ -50,6 +52,7 @@
         if(!checkIdCardUnique(expertInfo)){
             throw new ApiException(expertInfo.getIdCard()+"身份证号码已经存在");
         }
+        expertInfo.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(expertInfo);
         if(!b){
             throw new ApiException("修改专家信息失败");
@@ -60,8 +63,9 @@
     @Override
     public int delExpertInfo(Long expertId) {
         SysExpertInfo expertInfo = new SysExpertInfo();
-        expertInfo.setExpertId(expertId);
-        expertInfo.setDelFlag(1);
+        expertInfo.setId(expertId);
+        expertInfo.setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        expertInfo.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b= updateById(expertInfo);
         if(!b){
             throw new ApiException("删除专家信息失败");
@@ -74,10 +78,37 @@
         return baseMapper.deleteBatchByIds(expertIds);
     }
 
+    @Override
+    public SysExpertInfo exportInfoDetail(Long expertId) {
+        return baseMapper.getExpertInfoById(expertId);
+    }
+
+
+
+    public SysExpertInfo checkExpertInfoDataScope(Long expertId) {
+        if(expertId==null){
+            throw new ApiException("专家id为空!");
+        }
+        SysExpertInfo expertInfo = baseMapper.getExpertInfoById(expertId);
+        if (ObjectUtil.isNull(expertInfo))
+        {
+            throw new ApiException("专家数据不存在!");
+        }
+        return expertInfo;
+    }
+
+    @Override
+    public boolean changeApprove(SysExpertInfo expertInfo) {
+        checkExpertInfoDataScope(expertInfo.getId());
+        SysExpertInfo se=new SysExpertInfo().setId(expertInfo.getId()).setState(expertInfo.getState());
+        se.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        return updateById(se);
+    }
+
     public boolean checkIdCardUnique(SysExpertInfo expertInfo){
-        Long expertId = expertInfo.getExpertId()==null? -1L : expertInfo.getExpertId();
+        Long expertId = expertInfo.getId()==null? -1L : expertInfo.getId();
         SysExpertInfo info = baseMapper.checkIdcardUnique(expertInfo.getIdCard());
-        if (info!=null && info.getExpertId().longValue() != expertId.longValue())
+        if (info!=null && info.getId().longValue() != expertId.longValue())
         {
             return false;
         }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java
index 22b85e0..13a83e1 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java
@@ -1,14 +1,14 @@
 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.DeleteFlagEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.PageUtil;
 import com.gkhy.assess.system.domain.SysLaw;
-import com.gkhy.assess.system.domain.SysNotice;
 import com.gkhy.assess.system.mapper.SysLawMapper;
 import com.gkhy.assess.system.service.SysLawService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.assess.system.utils.ShiroUtils;
 import org.springframework.stereotype.Service;
 
@@ -40,6 +40,7 @@
     @Override
     public int addLaw(SysLaw law) {
         boolean b=save(law);
+        law.setCreateBy(ShiroUtils.getSysUser().getUsername());
         if(!b){
             throw new ApiException("新增法律法规失败");
         }
@@ -48,6 +49,7 @@
 
     @Override
     public int editLaw(SysLaw law) {
+        law.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(law);
         if(!b){
             throw new ApiException("修改法律法规失败");
@@ -57,7 +59,10 @@
 
     @Override
     public int deleteLawById(Long lawId) {
-        boolean b=removeById(lawId);
+        SysLaw sysLaw=new SysLaw().setId(lawId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        sysLaw.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        boolean b=updateById(sysLaw);
         if(!b){
             throw new ApiException("删除法律法规失败");
         }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java
index 51c50e9..acab316 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java
@@ -3,8 +3,10 @@
 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.DeleteFlagEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.PageUtil;
+import com.gkhy.assess.system.domain.SysLaw;
 import com.gkhy.assess.system.domain.SysNotice;
 import com.gkhy.assess.system.domain.SysUser;
 import com.gkhy.assess.system.mapper.SysNoticeMapper;
@@ -57,7 +59,10 @@
 
     @Override
     public int deleteNoticeById(Long noticeId) {
-        boolean b=removeById(noticeId);
+        SysNotice sysNotice=new SysNotice().setId(noticeId)
+                .setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        sysNotice.setUpdateBy(ShiroUtils.getSysUser().getName());
+        boolean b=updateById(sysNotice);
         if(!b){
             throw new ApiException("删除通知失败");
         }
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java
index 6baaa09..5556dca 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java
@@ -11,6 +11,7 @@
 import com.gkhy.assess.system.domain.SysRegion;
 import com.gkhy.assess.system.mapper.SysRegionMapper;
 import com.gkhy.assess.system.service.SysRegionService;
+import com.gkhy.assess.system.utils.ShiroUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -76,6 +77,7 @@
             throw new ApiException("已存在相同地区名称");
         }
         region.setRegionType(RegionTypeEnum.INSIDE.getCode());
+        region.setCreateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=save(region);
         if(!b){
             throw new ApiException("新增地区失败");
@@ -107,6 +109,7 @@
         if(!checkRegionUnique(region)){
             throw new ApiException("已存在相同地区名称");
         }
+        region.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(region);
         if(!b){
             throw new ApiException("修改地区失败");
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
new file mode 100644
index 0000000..c384eb1
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserFaceServiceImpl.java
@@ -0,0 +1,50 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.domain.SysUserFace;
+import com.gkhy.assess.system.domain.vo.UploadObjectVO;
+import com.gkhy.assess.system.mapper.SysUserFaceMapper;
+import com.gkhy.assess.system.mapper.SysUserMapper;
+import com.gkhy.assess.system.service.SysCommonService;
+import com.gkhy.assess.system.service.SysUserFaceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ * 用户人脸数据表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2024-01-09 17:10:01
+ */
+@Service
+public class SysUserFaceServiceImpl extends ServiceImpl<SysUserFaceMapper, SysUserFace> implements SysUserFaceService {
+    @Autowired
+    private SysCommonService commonService;
+    @Autowired
+    private SysUserMapper userMapper;
+    @Override
+    @Transactional
+    public int addUserFace(SysUserFace userFace) {
+        int row=0;
+        SysUserFace oldUserFace=baseMapper.getFaceByUserId(userFace.getUserId());
+        UploadObjectVO uploadObjectVO =commonService.doUpload(userFace.getFile());
+        if(oldUserFace==null){
+            row= baseMapper.insert(userFace);
+        }else{
+            row= baseMapper.updateById(new SysUserFace().setId(oldUserFace.getId()).setFaceBase(userFace.getFaceBase()));
+        }
+        userMapper.updateById(new SysUser().setId(userFace.getUserId()).setIdPhoto(uploadObjectVO.getPath()));
+        return row;
+    }
+
+    @Override
+    public SysUserFace getFaceByUserId(Long userId) {
+        return baseMapper.getFaceByUserId(userId);
+    }
+
+
+}
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 a552f44..5004259 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
@@ -2,19 +2,22 @@
 
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.vo.AccountVO;
 import com.gkhy.assess.common.domain.vo.LoginBody;
 import com.gkhy.assess.common.enums.AttachTypeEnum;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
 import com.gkhy.assess.common.enums.UserIdentityEnum;
 import com.gkhy.assess.common.exception.ApiException;
 import com.gkhy.assess.common.utils.*;
-import com.gkhy.assess.system.domain.SysAgency;
-import com.gkhy.assess.system.domain.SysAttach;
-import com.gkhy.assess.system.domain.SysUser;
-import com.gkhy.assess.system.mapper.SysAgencyMapper;
+import com.gkhy.assess.system.domain.*;
+import com.gkhy.assess.system.domain.vo.PersonProjectVO;
+import com.gkhy.assess.system.mapper.AssProjectMapper;
+import com.gkhy.assess.system.mapper.SysUserFaceMapper;
 import com.gkhy.assess.system.mapper.SysUserMapper;
 import com.gkhy.assess.system.service.SysAgencyService;
 import com.gkhy.assess.system.service.SysAttachService;
@@ -24,6 +27,7 @@
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.subject.Subject;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,9 +35,8 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Validator;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -55,18 +58,20 @@
 
     @Autowired
     private HttpServletRequest request;
-    @Autowired
-    private SysAgencyMapper agencyMapper;
+
     @Autowired
     private SysAgencyService agencyService;
     @Autowired
     private SysAttachService attachService;
-
+    @Autowired
+    private SysUserFaceMapper userFaceMapper;
+    @Autowired
+    private AssProjectMapper projectMapper;
 
     @Override
     public AccountVO login(LoginBody loginBody) {
         // 验证码校验
-      //  validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
+        //validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
         UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
         Subject subject= SecurityUtils.getSubject();
         String msg ;
@@ -75,10 +80,52 @@
             SysUser sysUser = (SysUser) subject.getPrincipal();
             AccountVO accountVO = new AccountVO();
             BeanUtils.copyProperties(sysUser, accountVO);
-
+            if(sysUser.getAgencyId()!=null){
+                SysAgency agency=agencyService.getOne(Wrappers.<SysAgency>lambdaQuery()
+                        .select(SysAgency::getId,SysAgency::getName)
+                        .eq(SysAgency::getId,sysUser.getAgencyId()));
+                accountVO.setAgentName(agency.getName());
+                accountVO.setAgentId(agency.getId());
+            }
             String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
             accountVO.setToken(token);
             cacheUserToken(sysUser.getUsername(),token);
+            return accountVO;
+        }catch (UnknownAccountException | IncorrectCredentialsException uae){
+            throw new ApiException("用户名/密码错误,请重新输入");
+        } catch (LockedAccountException lae) { // 账号已被锁定
+            msg = "账号已被锁定";
+            throw new ApiException(msg);
+        }catch (AuthenticationException ae) { // 其他身份验证异常
+            msg = "用户认证失败:"+ae.getMessage();
+            throw new ApiException(msg);
+        }
+    }
+
+
+
+    @Override
+    public AccountVO appLogin(LoginBody loginBody) {
+        // 验证码校验
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
+        Subject subject= SecurityUtils.getSubject();
+        String msg ;
+        try {
+            subject.login(usernamePasswordToken);
+            SysUser sysUser = (SysUser) subject.getPrincipal();
+            AccountVO accountVO = new AccountVO();
+            BeanUtils.copyProperties(sysUser, accountVO);
+            if(sysUser.getAgencyId()!=null){
+                SysAgency agency=agencyService.getOne(Wrappers.<SysAgency>lambdaQuery()
+                        .select(SysAgency::getId,SysAgency::getName)
+                        .eq(SysAgency::getId,sysUser.getAgencyId()));
+                accountVO.setAgentName(agency.getName());
+                accountVO.setAgentId(agency.getId());
+            }
+            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
+            accountVO.setToken(token);
+            cacheUserToken(sysUser.getUsername(),token);
+            accountVO.setUserFace(userFaceMapper.getFaceByUserId(sysUser.getId()));
             return accountVO;
         }catch (UnknownAccountException | IncorrectCredentialsException uae){
             throw new ApiException("用户名/密码错误,请重新输入");
@@ -97,14 +144,14 @@
      */
     public void cacheUserToken(String username,String newToken){
 
-//        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
-//        String oldToken = (String) redisUtils.get(userKey);
-//        if (StrUtil.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 userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
+        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));
@@ -142,9 +189,14 @@
     @Override
     public void logout() {
         String jwtToken = request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN);
-        String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
-        //删除redis缓存
-        redisUtils.del(key);
+        if(StringUtils.isNotBlank(jwtToken)){
+            String username=JwtTokenUtil.getUsername(jwtToken);
+            String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
+            String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
+            //删除redis缓存
+            redisUtils.del(tokenKey);
+            redisUtils.del(userKey);
+        }
     }
 
     @Override
@@ -163,8 +215,25 @@
 
     @Override
     public CommonPage<SysUser> expertList(SysUser user) {
+        SysUser currentUser= ShiroUtils.getSysUser();
+        if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            //机构用户只能查看本机构的专家
+            if(currentUser.getAgencyId()==null){
+                throw new ApiException("用户机构id为空");
+            }
+            user.setAgencyId(currentUser.getAgencyId());
+        }
         PageUtil.startPage();
         List<SysUser> users=baseMapper.expertList(user);
+        if(users.size()>0) {
+            //统计用户参与项目的信息
+            List<Long> userIds = users.stream().map(item -> item.getId()).collect(Collectors.toList());
+            List<PersonProjectVO> personProjectVOList = projectMapper.getProjectByPersonIds(userIds);
+            Map<Long, PersonProjectVO> maps = personProjectVOList.stream().collect(Collectors.toMap(PersonProjectVO::getPersonId, a -> a));
+            for (SysUser sysUser : users) {
+                sysUser.setPersonProjectVO(maps.get(sysUser.getId()));
+            }
+        }
         return CommonPage.restPage(users);
     }
 
@@ -216,8 +285,10 @@
         }
         String originPsword=Base64.decodeStr(user.getPassword());
         validatorPassword(originPsword);
+        //密码生成规则:md5(username+password+salt)
         user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
         user.setIdentity(UserIdentityEnum.MONITOR.getCode());
+        user.setCreateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=save(user);
         if(!b){
             throw new ApiException("创建监管用户信息失败");
@@ -246,15 +317,16 @@
         if(!agencyService.checkAgencyNameUnique(new SysAgency().setName(agency.getName()))){
             throw new ApiException("机构名称已存在");
         }
-        int i=agencyMapper.insert(agency);
-        if(i<1){
+        agency.setCreateBy(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()));
-
-        boolean b=save(user);
+        user.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        b=save(user);
         if(!b){
             throw new ApiException("创建机构用户信息失败");
         }
@@ -264,6 +336,8 @@
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public int addExpert(SysUser user) {
+        user.setIdentity(UserIdentityEnum.EXPERT.getCode());
+        checkUserAllowed(user);
         //校验用户信息
         if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
             throw new ApiException("用户名已存在");
@@ -271,11 +345,19 @@
         if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
             throw new ApiException("手机号已存在");
         }
+        String major=user.getMajor();
+        List<Integer> majors=new ArrayList<>();
+        JSONObject jsonObject=JSONObject.parseObject(major);
+        jsonObject.forEach((key,value)-> {
+            majors.add(Integer.valueOf(key));
+        });
+        user.setMajor(StringUtils.join(",",majors));
+        user.setCertificateNo(major);
         String originPsword=Base64.decodeStr(user.getPassword());
         validatorPassword(originPsword);
-        user.setIdentity(UserIdentityEnum.EXPERT.getCode());
         user.setCreateBy(ShiroUtils.getSysUser().getUsername());
         user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+
         boolean b=save(user);
         if(!b){
             throw new ApiException("创建专家信息失败");
@@ -322,22 +404,31 @@
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public int deleteUserById(Long userId) {
-        SysUser user=getUserById(userId);
-        if(user==null){
-            throw new ApiException("用户不存在");
-        }
+        SysUser currentUser=ShiroUtils.getSysUser();
+        SysUser user=checkUserDataScope(userId);
         if(Objects.equals(ShiroUtils.getUserId(), userId)){
             throw new ApiException("不能删除自己账号");
         }
-        //机构用户,将机构信息设置成删除状态
-        if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){
-            if(user.getAgencyId()==null){
-                throw new ApiException("获取机构id为空");
+        if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())||user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+                throw new ApiException("没有权限,只有监管用户才能操作");
             }
-            agencyMapper.deleteAgencyById(user.getAgencyId());
+            //机构用户,将机构信息设置成删除状态
+            if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())) {
+                if (user.getAgencyId() == null) {
+                    throw new ApiException("获取机构id为空");
+                }
+                SysAgency agency=new SysAgency().setId(user.getAgencyId());
+                agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+                agency.setDelFlag(DeleteFlagEnum.DELETED.getCode());
+                agencyService.updateById(agency);
+            }
         }
         delCacheByUsername(user.getUsername());
-        return baseMapper.deleteUserById(userId);
+        user=new SysUser().setId(userId);
+        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        user.setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        return baseMapper.updateById(user);
     }
 
     @Override
@@ -351,6 +442,7 @@
         }
         delCacheByUsername(user.getUsername());
         user.setPassword(null);
+        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(user);
         if(!b){
             throw new ApiException("更新监管用户信息失败");
@@ -380,8 +472,10 @@
         }
 
         delCacheByUsername(user.getUsername());
+        agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         agencyService.updateById(agency);
         user.setPassword(null);
+        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
         boolean b=updateById(user);
         if(!b){
             throw new ApiException("更新用户失败");
@@ -391,6 +485,7 @@
 
     @Override
     public int editExpert(SysUser user) {
+        checkUserDataScope(user.getId());
         //校验用户信息
         if(!checkUsernameUnique(user)){
             throw new ApiException("用户名已存在");
@@ -398,13 +493,23 @@
         if(!checkPhoneUnique(user)){
             throw new ApiException("手机号已存在");
         }
-        user.setPassword(null);
-        boolean b=updateById(user);
-        if(!b){
-            throw new ApiException("更新专家信息失败");
+        String major=user.getMajor();
+        if(StringUtils.isNotBlank(major)){
+            List<Integer> majors=new ArrayList<>();
+            JSONObject jsonObject=JSONObject.parseObject(major);
+            jsonObject.forEach((key,value)-> {
+                majors.add(Integer.valueOf(key));
+            });
+            user.setMajor(StringUtils.join(",",majors));
+            user.setCertificateNo(major);
         }
-        //刪除旧数据
-        attachService.deleteAttachsByUserId(user.getId(),null);
+        user.setPassword(null);
+        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        int row=baseMapper.updateById(user);
+
+        List<SysAttach> existAttaches=attachService.getAttachsByUserId(user.getId(),null);
+        // 刪除旧数据
+        // attachService.deleteAttachsByUserId(user.getId(),null);
 
         List<SysAttach> socialAttach=user.getSocialAttach();
         List<SysAttach> medicalAttach=user.getMedicalAttach();
@@ -425,9 +530,20 @@
             attach.setUserId(user.getId());
             attaches.add(attach);
         }
-        attachService.saveBatch(attaches);
+        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())){
+                delIds.add(attach.getId());
+            }
+        }
+        if(!delIds.isEmpty()){
+            attachService.deleteAttachsByIds(delIds);
+        }
         delCacheByUsername(user.getUsername());
-        return 1;
+        return row;
     }
 
 
@@ -435,7 +551,6 @@
     public boolean resetUserPwd(SysUser user) {
         String originPsword=Base64.decodeStr(user.getPassword());
         validatorPassword(originPsword);
-        checkUserAllowed(user);
         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());
@@ -478,7 +593,15 @@
 
     @Override
     public void checkUserAllowed(SysUser user) {
-
+        SysUser currentUser=ShiroUtils.getSysUser();
+        if(!Objects.equals(currentUser.getIdentity(), UserIdentityEnum.MONITOR.getCode())){
+            if(Objects.equals(user.getIdentity(), UserIdentityEnum.MONITOR.getCode())){
+                throw new ApiException("无权操作监管用户");
+            }
+            if(!Objects.equals(currentUser.getAgencyId(), user.getAgencyId())){
+                throw new ApiException("无权操作其他机构用户");
+            }
+        }
     }
 
     @Override
@@ -486,67 +609,19 @@
         if(userId==null){
             throw new ApiException("用户id为空!");
         }
-        SysUser user = baseMapper.getUserById(userId);
+        SysUser user = getById(userId);
         if (ObjectUtil.isNull(user))
         {
             throw new ApiException("用户数据不存在!");
         }
+        checkUserAllowed(user);
         return user;
     }
 
-    @Override
-    public String importUser(List<SysUser> userList,Boolean isUpdateSupport) {
-        if(ObjectUtil.isEmpty(userList)||userList.size()==0){
-            throw new ApiException("导入用户数据不能为空");
-        }
-        int successNum=0;
-        int failureNum=0;
-        StringBuilder successMsg=new StringBuilder();
-        StringBuilder failureMsg=new StringBuilder();
-        String password=configService.getConfigByKey("sys.user.initPassword");
-        for(SysUser user:userList){
-            try {
-                SysUser u = baseMapper.getUserByUsername(user.getUsername());
-                if (ObjectUtil.isNull(u)) {
-                    BeanValidators.validateWithException(validator, user);
-                    user.setPassword(JwtTokenUtil.md5Encode(user.getUsername() + password));
-                    user.setCreateBy("");
-                    save(user);
-                    successNum++;
-                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUsername() + " 导入成功");
-                } else if (isUpdateSupport) {
-                    BeanValidators.validateWithException(validator, user);
-                    checkUserAllowed(u);
-                    checkUserDataScope(u.getId());
-                    user.setId(u.getId());
-                    user.setUpdateBy("");
-                    updateById(user);
-                    successNum++;
-                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUsername() + " 更新成功");
-                } else {
-                    failureNum++;
-                    failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUsername() + " 已存在");
-                }
-            }catch (Exception e){
-                failureNum++;
-                String msg = "<br/>" + failureNum + "、账号 " + user.getUsername() + " 导入失败:";
-                failureMsg.append(msg + e.getMessage());
-                log.error(msg, e);
-            }
-        }
-        if (failureNum > 0){
-            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
-            throw new ApiException(failureMsg.toString());
-        }else{
-            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
-        }
 
-        return successMsg.toString();
-    }
 
     @Override
     public boolean changeUserStatus(SysUser user) {
-        checkUserAllowed(user);
         SysUser existUser=checkUserDataScope(user.getId());
         SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
         su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
@@ -556,7 +631,6 @@
 
     @Override
     public boolean changeApprove(SysUser user) {
-        checkUserAllowed(user);
         SysUser existUser=checkUserDataScope(user.getId());
         SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
         su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
diff --git a/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml b/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml
new file mode 100644
index 0000000..ac9b382
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssAccessoryFileMapper.xml
@@ -0,0 +1,18 @@
+<?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.AssAccessoryFileMapper">
+    <update id="deleteAccessoryFileById" parameterType="java.lang.Long">
+        update ass_accessory_file set del_flag=1 where id=#{accessoryFileId}
+    </update>
+
+
+    <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
+        where project_id=#{projectId} and del_flag=0 and module_type=#{moduleType}
+    </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}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssAuditMapper.xml b/assess-system/src/main/resources/mapper/AssAuditMapper.xml
new file mode 100644
index 0000000..794d6bb
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssAuditMapper.xml
@@ -0,0 +1,71 @@
+<?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.AssAuditMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssAudit" id="auditResult">
+        <id     property="id"        column="id"         />
+        <result property="auditDate"     column="audit_date"      />
+        <result property="affirmDate"     column="affirm_date"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="auditType"     column="audit_type"      />
+        <result property="assessorId"     column="assessor_id"      />
+        <result property="isAmendFinish"     column="is_amend_finish"      />
+        <result property="isBasis"     column="is_basis"      />
+        <result property="isConclusion"     column="is_conclusion"      />
+        <result property="isDangerOverall"     column="is_danger_overall"      />
+        <result property="isFile"     column="is_file"      />
+        <result property="isFormat"     column="is_format"      />
+        <result property="isMeasure"     column="is_measure"      />
+        <result property="isMethodSelection"     column="is_method_selection"      />
+        <result property="isReportAudit"     column="is_report_audit"      />
+        <result property="isScope"     column="is_scope"      />
+        <result property="isText"     column="is_text"      />
+        <result property="isUnitDivision"     column="is_unit_division"      />
+        <result property="isBasisQuote"     column="is_basis_quote"      />
+        <result property="isConclusionRight"     column="is_conclusion_right"      />
+        <result property="isDangerFull"     column="is_danger_full"      />
+        <result property="isData"     column="is_data"      />
+        <result property="isOmission"     column="is_omission"      />
+        <result property="isMeasureEquitable"     column="is_measure_equitable"      />
+        <result property="isMethodRational"     column="is_method_rational"      />
+        <result property="suggestions"     column="suggestions"      />
+        <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"      />
+        <association property="assessor" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+    </resultMap>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="assessor_id"        />
+        <result property="name"     column="assessor_name"      />
+    </resultMap>
+
+    <sql id="selectAuditVo">
+        select a.id,a.audit_date,a.affirm_date,a.project_id,a.audit_type,a.assessor_id,a.is_amend_finish,
+               a.is_basis,a.is_conclusion,a.is_danger_overall,a.is_file,a.is_format,a.is_measure,a.is_method_selection,
+               a.is_method_selection,a.is_report_audit,a.is_scope,a.is_text,a.is_unit_division,a.is_basis_quote,
+               a.is_conclusion_right,a.is_conclusion_right,a.is_danger_full,a.is_data,a.is_omission,a.is_measure_equitable,
+               a.is_method_rational,a.is_method_rational,a.suggestions,
+               a.version,a.del_flag,a.create_by,a.create_time,a.update_by,a.update_time,a.remark,u.name as assessor_name
+        from ass_audit a
+        left join sys_user u on u.id=a.assessor_id
+    </sql>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer">
+        select count(1) from ass_audit where project_id=#{projectId} and audit_type=#{auditType} and del_flag=0
+    </select>
+
+    <select id="getAuditByProjectId" resultMap="auditResult">
+        <include refid="selectAuditVo"/>
+        where a.project_id=#{projectId} and a.del_flag=0 and a.audit_type=#{auditType}
+    </select>
+
+    <select id="getAuditById" resultMap="auditResult">
+        <include refid="selectAuditVo"/>
+        where a.id=#{auditId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssConclusionMapper.xml b/assess-system/src/main/resources/mapper/AssConclusionMapper.xml
new file mode 100644
index 0000000..ad211a8
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssConclusionMapper.xml
@@ -0,0 +1,39 @@
+<?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.AssConclusionMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssConclusion" id="conclusionResult">
+        <id     property="id"        column="id"         />
+        <result property="conclusion"     column="conclusion"      />
+        <result property="isReviseManual"     column="is_revise_manual"      />
+        <result property="projectId"     column="project_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"      />
+    </resultMap>
+
+    <sql id="selectConclusionVo">
+        select c.id,c.conclusion,c.is_revise_manual,c.project_id,
+               c.version,c.del_flag,c.create_by,c.create_time,c.update_by,c.update_time,c.remark
+        from ass_conclusion c
+    </sql>
+
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_conclusion where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getConclusionByProjectId" resultMap="conclusionResult">
+        <include refid="selectConclusionVo"/>
+        where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getConclusionById" resultMap="conclusionResult">
+        <include refid="selectConclusionVo"/>
+        where id=#{conclusionId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssContractMapper.xml b/assess-system/src/main/resources/mapper/AssContractMapper.xml
new file mode 100644
index 0000000..f697100
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssContractMapper.xml
@@ -0,0 +1,42 @@
+<?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.AssContractMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssContract" id="ContractResult">
+        <id     property="id"        column="id"         />
+        <result property="contractMoney"     column="contract_money"      />
+        <result property="actualContractMoney"     column="actual_contract_money"      />
+        <result property="contractSignDate"     column="contract_sign_date"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="contractIntroduction"     column="contract_introduction"      />
+        <result property="actualContractIntroduction"     column="actual_contract_introduction"      />
+        <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"      />
+    </resultMap>
+
+    <sql id="selectContractVo">
+        select c.id,c.contract_money, c.actual_contract_money,c.contract_sign_date,c.project_id,c.contract_introduction,c.actual_contract_introduction,
+               c.del_flag,c.create_by,c.create_time,c.update_by,c.update_time,c.remark
+        from ass_contract c
+    </sql>
+
+
+    <select id="getContractByProjectId" resultMap="ContractResult">
+        <include refid="selectContractVo"/>
+        where project_id=#{projectId} and del_flag=0 limit 1
+    </select>
+
+    <select id="getContractById" resultMap="ContractResult">
+        <include refid="selectContractVo"/>
+        where id=#{contractId}
+    </select>
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer">
+        select count(1) from ass_contract where project_id=#{projectId} and del_flag=0
+    </select>
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssDeviceMapper.xml b/assess-system/src/main/resources/mapper/AssDeviceMapper.xml
new file mode 100644
index 0000000..f0e6eb3
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssDeviceMapper.xml
@@ -0,0 +1,42 @@
+<?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.AssDeviceMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssDevice" id="deviceResult">
+        <id     property="id"        column="id"         />
+        <result property="deviceName"     column="device_name"      />
+        <result property="startDate"     column="start_date"      />
+        <result property="endDate"     column="end_date"      />
+        <result property="projectId"     column="project_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"      />
+    </resultMap>
+
+    <sql id="selectDeviceVo">
+        select d.id,d.device_name,d.start_date,d.end_date,d.project_id,
+               d.version,d.del_flag,d.create_by,d.create_time,d.update_by,d.update_time,d.remark
+        from ass_device d
+    </sql>
+
+
+    <update id="deleteDeviceByIds">
+        update ass_device set del_flag=1 where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <select id="getDeviceByName" resultMap="deviceResult">
+        <include refid="selectDeviceVo"/>
+        where id=#{deviceId}
+    </select>
+
+    <select id="getDevicesByProjectId" resultType="com.gkhy.assess.system.domain.AssDevice">
+        <include refid="selectDeviceVo"/>
+        where project_id=#{projectId} and del_flag=0
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssEstimatePlanMapper.xml b/assess-system/src/main/resources/mapper/AssEstimatePlanMapper.xml
new file mode 100644
index 0000000..784c604
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssEstimatePlanMapper.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.AssEstimatePlanMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssEstimatePlan" id="estimatePlanResult">
+        <id     property="id"        column="id"         />
+        <result property="auserId"     column="auser_id"      />
+        <result property="startDate"     column="start_date"      />
+        <result property="endDate"     column="end_date"      />
+        <result property="projectId"     column="project_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"      />
+        <association property="auser" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+    </resultMap>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="assessor_id"        />
+        <result property="name"     column="assessor_name"      />
+    </resultMap>
+
+    <sql id="selectEstimatePlanVo">
+        select e.id,e.auser_id, e.start_date,e.end_date,e.project_id,
+               e.del_flag,e.create_by,e.create_time,e.update_by,e.update_time,e.remark,u.id as assessor_id,u.name as assessor_name
+        from ass_estimate_plan e
+        left join sys_user u on u.id=e.auser_id
+    </sql>
+
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_estimate_plan
+        where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getEstimatePlanByProjectId" resultMap="estimatePlanResult">
+        <include refid="selectEstimatePlanVo"/>
+        where e.project_id=#{projectId} and e.del_flag=0
+    </select>
+
+    <select id="getEstimatePlanById" resultMap="estimatePlanResult">
+        <include refid="selectEstimatePlanVo"/>
+        where e.id=#{estimatePlanId}
+    </select>
+
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssEstimateScheduleMapper.xml b/assess-system/src/main/resources/mapper/AssEstimateScheduleMapper.xml
new file mode 100644
index 0000000..c9f35b9
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssEstimateScheduleMapper.xml
@@ -0,0 +1,17 @@
+<?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.AssEstimateScheduleMapper">
+
+    <update id="deleteEstimateScheduleByIds">
+        update ass_estimate_schedule set del_flag=1
+        where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <select id="getEstimateScheduleByProjectId" resultType="com.gkhy.assess.system.domain.AssEstimateSchedule">
+        select * from ass_estimate_schedule
+        where project_id=#{projectId} and del_flag=0 order by sort asc
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssEstimateTaskMapper.xml b/assess-system/src/main/resources/mapper/AssEstimateTaskMapper.xml
new file mode 100644
index 0000000..e64f93f
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssEstimateTaskMapper.xml
@@ -0,0 +1,48 @@
+<?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.AssEstimateTaskMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssEstimateTask" id="estimateTaskResult">
+        <id     property="id"        column="id"         />
+        <result property="leaderId"     column="leader_id"      />
+        <result property="linkMan"     column="link_man"      />
+        <result property="linkPhone"     column="link_phone"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="fax"     column="fax"      />
+        <result property="transmitDate"     column="transmit_date"      />
+        <result property="transmitPerson"     column="transmit_person"      />
+        <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"      />
+        <association property="leader" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+    </resultMap>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="leader_id"        />
+        <result property="name"     column="leader_name"      />
+    </resultMap>
+
+    <sql id="selectEstimateTaskVo">
+        select e.id,e.leader_id,e.link_man,e.link_phone,e.project_id,e.fax,e.transmit_date,e.transmit_person,
+               e.del_flag,e.create_by,e.create_time,e.update_by,e.update_time,e.remark,u.name as leader_name
+        from ass_estimate_task e
+        left join sys_user u on u.id=e.leader_id
+    </sql>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_estimate_task where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getTaskByProjectId" resultMap="estimateTaskResult">
+        <include refid="selectEstimateTaskVo"/>
+        where e.project_id=#{projectId} and e.del_flag=0 limit 1
+    </select>
+
+    <select id="getTaskById" resultType="com.gkhy.assess.system.domain.AssEstimateTask">
+        select * from ass_estimate_task where id=#{taskId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml b/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml
new file mode 100644
index 0000000..7465df5
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssFaceRecognitionMapper.xml
@@ -0,0 +1,68 @@
+<?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.AssFaceRecognitionMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssFaceRecognition" id="faceRecognitionResult">
+        <id     property="id"        column="id"         />
+        <result property="personId"     column="person_id"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="signPath"     column="sign_path"      />
+        <result property="insurancePicId"     column="insurance_pic_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"      />
+        <association property="faceRecord" javaType="com.gkhy.assess.system.domain.AssFaceRecord" resultMap="faceRecordesult" />
+        <association property="person" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+    </resultMap>
+
+    <resultMap id="faceRecordesult" type="com.gkhy.assess.system.domain.AssFaceRecord">
+        <id     property="id"       column="person_id"        />
+        <result property="facePath"     column="face_path"      />
+        <result property="updateTime"      column="face_time"       />
+    </resultMap>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="person_id"        />
+        <result property="name"     column="person_name"      />
+        <result property="major"      column="person_major"       />
+        <result property="phone"      column="person_phone"       />
+        <result property="post"      column="person_post"       />
+        <result property="level"      column="person_level"       />
+    </resultMap>
+
+    <sql id="selectFaceRecognitionVo">
+        select f.id,f.person_id,f.project_id,f.sign_path,f.insurance_pic_id,
+               f.version,f.del_flag,f.create_by,f.create_time,f.update_by,f.update_time,f.remark,
+               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,
+               a.face_path,a.update_time as face_time
+        from ass_face_recognition f
+        left join sys_user u on u.id=f.person_id
+        left join ass_face_record a on a.person_id=f.person_id
+
+    </sql>
+
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_face_recognition where project_id=#{projectId} and del_flag=0
+
+    </select>
+
+    <select id="getFaceRecognitionByProjectId" resultMap="faceRecognitionResult">
+        <include refid="selectFaceRecognitionVo"/>
+        where f.project_id=#{projectId} and f.del_flag=0 and a.del_flag=0
+    </select>
+
+    <select id="getFaceRecognitionById" resultMap="faceRecognitionResult">
+        <include refid="selectFaceRecognitionVo"/>
+        where f.id=#{faceRecognitionId} and a.del_flag=0
+    </select>
+
+    <select id="getFaceRecognitionCount" resultType="java.lang.Integer">
+        select count(1) from ass_face_recognition where project_id=#{projectId} and del_flag=0
+    </select>
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssFaceRecordMapper.xml b/assess-system/src/main/resources/mapper/AssFaceRecordMapper.xml
new file mode 100644
index 0000000..68e1ba6
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssFaceRecordMapper.xml
@@ -0,0 +1,53 @@
+<?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.AssFaceRecordMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssFaceRecord" id="faceResult">
+        <id     property="id"        column="id"         />
+        <result property="personId"     column="person_id"      />
+        <result property="facePath"     column="face_path"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="location"     column="location"      />
+        <result property="scene"     column="scene"      />
+        <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="investLocation"     column="invest_location"      />
+        <association property="person" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+        <association property="planPerson" javaType="com.gkhy.assess.system.domain.AssPlanPerson" resultMap="planPersonResult" />
+    </resultMap>
+
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="person_id"        />
+        <result property="name"     column="person_name"      />
+        <result property="major"      column="person_major"       />
+    </resultMap>
+
+    <resultMap id="planPersonResult" type="com.gkhy.assess.system.domain.AssPlanPerson">
+        <id     property="id"       column="person_id"        />
+        <result property="laterPromise"     column="later_promise"      />
+        <result property="work"      column="work"       />
+    </resultMap>
+
+    <sql id="selectFaceRecordVo">
+        select f.id,f.person_id, f.face_path,f.project_id,f.location,f.scene,
+               f.del_flag,f.create_by,f.create_time,f.update_by,f.update_time,f.remark,a.origin_name,a.file_name,a.path,
+               u.name as person_name,u.major as person_major,p.later_promise,p.work,i.location as invest_location
+        from ass_face_record f
+        left join sys_user u on u.id=f.person_id
+        left join ass_plan_person p on p.project_id=f.project_id
+        left join ass_investigation i on i.project_id=f.project_id
+    </sql>
+
+
+    <select id="faceRecordList" resultMap="faceResult">
+        <include refid="selectFaceRecordVo"/>
+        where f.project_id=#{projectId} and f.del_flag=0
+        and f.scene=#{scene} and p.del_flag=0 and i.del_flag=0
+
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssFilingApplyMapper.xml b/assess-system/src/main/resources/mapper/AssFilingApplyMapper.xml
new file mode 100644
index 0000000..e8875a4
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssFilingApplyMapper.xml
@@ -0,0 +1,37 @@
+<?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.AssFilingApplyMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssFilingApply" id="filingApplyResult">
+        <id     property="id"        column="id"         />
+        <result property="projectId"     column="project_id"      />
+        <result property="fileId"     column="file_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"      />
+        <association property="accessoryFile" javaType="com.gkhy.assess.system.domain.AssAccessoryFile" resultMap="fileResult" />
+    </resultMap>
+
+    <resultMap id="fileResult" type="com.gkhy.assess.system.domain.AssAccessoryFile">
+        <id     property="id"       column="file_id"        />
+        <result property="originName"     column="origin_name"      />
+        <result property="fileName"      column="file_name"       />
+        <result property="path"      column="path"       />
+    </resultMap>
+
+    <sql id="selectFilingApplyVo">
+        select f.id,f.file_id,f.project_id,
+               f.version,f.del_flag,f.create_by,f.create_time,f.update_by,f.update_time,f.remark
+        from ass_filing_apply f
+        left join ass_accessory_file a on a.id=f.file_id
+    </sql>
+
+
+    <select id="getFilingApplyByProjectId" resultMap="filingApplyResult">
+        <include refid="selectFilingApplyVo"/>
+        where f.project_id=#{projectId} and f.del_flag=0
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml b/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml
new file mode 100644
index 0000000..44c6e9d
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssInvestigationMapper.xml
@@ -0,0 +1,41 @@
+<?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.AssInvestigationMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssInvestigation" id="investigationResult">
+        <id     property="id"        column="id"         />
+        <result property="investigationDate"     column="investigation_date"      />
+        <result property="isFirst"     column="is_first"      />
+        <result property="isSafetyCheck"     column="is_safety_check"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="recordData"     column="record_data"      />
+        <result property="location"     column="location"      />
+        <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"      />
+    </resultMap>
+
+    <sql id="selectInvestigationVo">
+        select i.id,i.investigation_date, i.is_first,i.is_safety_check,i.project_id,i.record_data,i.location,
+               i.del_flag,i.create_by,i.create_time,i.update_by,i.update_time,i.remark
+        from ass_investigation i
+    </sql>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_investigation where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getInvestigationByProjectId" resultMap="investigationResult">
+        <include refid="selectInvestigationVo"/>
+        where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getInvestigationById" resultMap="investigationResult">
+        <include refid="selectInvestigationVo"/>
+        where id=#{investigationId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml b/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml
new file mode 100644
index 0000000..c9b183c
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssPlanPersonMapper.xml
@@ -0,0 +1,75 @@
+<?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.AssPlanPersonMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssPlanPerson" id="planPersonResult">
+        <id     property="id"        column="id"         />
+        <result property="personId"     column="person_id"      />
+        <result property="jobType"     column="job_type"      />
+        <result property="laterPromise"     column="later_promise"      />
+        <result property="work"     column="work"      />
+        <result property="informed"     column="informed"      />
+        <result property="sort"     column="sort"      />
+        <result property="playRole"     column="play_role"      />
+        <result property="reason"     column="reason"      />
+        <result property="projectId"     column="project_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"      />
+        <association property="person" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+    </resultMap>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="person_id"        />
+        <result property="name"     column="person_name"      />
+        <result property="major"      column="person_major"       />
+        <result property="certificateNo"      column="certificate_no"       />
+        <collection property="majorNames" ofType="java.lang.String" select="getMajorById" column="{major=person_major}"/>
+    </resultMap>
+
+    <sql id="selectPlanPersonVo">
+        select p.id,p.person_id, p.job_type,p.later_promise,p.informed,p.work,p.sort,p.reason,p.project_id,p.play_role,
+               p.del_flag,p.create_by,p.create_time,p.update_by,p.update_time,p.remark,u.name as person_name,u.major as person_major,u.certificate_no
+        from ass_plan_person p
+        left join sys_user u on u.id=p.person_id
+    </sql>
+
+    <update id="deletePlanPersonByIds">
+        update ass_plan_person set del_flag=1 where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+
+
+    <select id="getPlanPersonByProjectId" resultMap="planPersonResult">
+        <include refid="selectPlanPersonVo"/>
+        where p.project_id=#{projectId} and p.del_flag=0 and p.play_role=2
+    </select>
+
+
+    <select id="getAllPlanPersonByProjectId" resultMap="planPersonResult">
+        <include refid="selectPlanPersonVo"/>
+        where p.project_id=#{projectId} and p.del_flag=0
+    </select>
+
+    <select id="getPlanPersonsByIds" resultType="com.gkhy.assess.system.domain.AssPlanPerson">
+        select * from ass_plan_person
+        where id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
+    <select id="getMajorById" resultType="java.lang.String">
+        select label from sys_dict_data where id in
+        <foreach item="item" index="index" collection="major.split(',')"  open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssProcessAuditMapper.xml b/assess-system/src/main/resources/mapper/AssProcessAuditMapper.xml
new file mode 100644
index 0000000..9b6a8e3
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssProcessAuditMapper.xml
@@ -0,0 +1,80 @@
+<?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.AssProcessAuditMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssProcessAudit" id="processAuditResult">
+        <id     property="id"        column="id"         />
+        <result property="auditDate"     column="audit_date"      />
+        <result property="processLeaderId"     column="process_leader_id"      />
+        <result property="suggestions"     column="suggestions"      />
+        <result property="isEstimatePlan"     column="is_estimate_plan"      />
+        <result property="isEstimateTask"     column="is_estimate_task"      />
+        <result property="isSignContract"     column="is_sign_contract"      />
+        <result property="isExteriorAudit"     column="is_exterior_audit"      />
+        <result property="isFullMaterials"     column="is_full_materials"      />
+        <result property="isInteriorAudit"     column="is_interior_audit"      />
+        <result property="isInvestigationSite"     column="is_investigation_site"      />
+        <result property="isOpenInformation"     column="is_open_information"      />
+        <result property="isProvideMaterials"     column="is_provide_materials"      />
+        <result property="isRiskAnalyse"     column="is_risk_analyse"      />
+        <result property="isTechnolgyAudit"     column="is_technolgy_audit"      />
+        <result property="isUseQrcode"     column="is_use_qrcode"      />
+        <result property="isWorkNotification"     column="is_work_notification"      />
+        <result property="estimatePlanDes"     column="estimate_plan_des"      />
+        <result property="estimateTaskDes"     column="estimate_task_des"      />
+        <result property="signContractDes"     column="sign_contract_des"      />
+        <result property="exteriorAuditDes"     column="exterior_audit_des"      />
+        <result property="fullMaterialsDes"     column="full_materials_des"      />
+        <result property="interiorAuditDes"     column="interior_audit_des"      />
+        <result property="investigationSiteDes"     column="investigation_site_des"      />
+        <result property="openInformationDes"     column="open_information_des"      />
+        <result property="provideMaterialsDes"     column="provide_materials_des"      />
+        <result property="riskAnalyseDes"     column="risk_analyse_des"      />
+        <result property="technolgyAuditDes"     column="technolgy_audit_des"      />
+        <result property="useQrcodeDes"     column="use_qrcode_des"      />
+        <result property="workNotificationDes"     column="work_notification_des"      />
+        <result property="isFullProcess"     column="is_full_process"      />
+        <result property="projectId"     column="project_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"      />
+        <association property="processLeader" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+
+    </resultMap>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="process_leader_id"        />
+        <result property="name"     column="leader_name"      />
+    </resultMap>
+
+
+    <sql id="selectProcessAuditVo">
+        select p.id,p.audit_date,p.process_leader_id,p.suggestions,p.is_estimate_plan,p.is_estimate_task,p.is_sign_contract,
+               p.is_exterior_audit,p.is_full_materials,p.is_interior_audit,p.is_investigation_site,p.is_open_information,
+               p.is_provide_materials,p.is_risk_analyse,p.is_technolgy_audit,p.is_use_qrcode,p.is_work_notification,
+               p.estimate_plan_des,p.estimate_task_des,p.sign_contract_des,p.exterior_audit_des,p.full_materials_des,
+               p.interior_audit_des,p.investigation_site_des,p.open_information_des,p.provide_materials_des,p.risk_analyse_des,
+               p.technolgy_audit_des,p.use_qrcode_des,p.work_notification_des,p.is_full_process,p.project_id,
+               p.version,p.del_flag,p.create_by,p.create_time,p.update_by,p.update_time,p.remark,u.name as leader_name
+        from ass_process_audit p
+        left join sys_user u on u.id=p.process_leader_id
+    </sql>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_process_audit where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getProcessAuditByProjectId" resultMap="processAuditResult">
+        <include refid="selectProcessAuditVo"/>
+        where p.project_id=#{projectId} and p.del_flag=0
+    </select>
+
+    <select id="getProcessAuditById" resultMap="processAuditResult">
+        <include refid="selectProcessAuditVo"/>
+        where p.id=#{processAuditId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssProjectMapper.xml b/assess-system/src/main/resources/mapper/AssProjectMapper.xml
new file mode 100644
index 0000000..5aa9f2a
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssProjectMapper.xml
@@ -0,0 +1,235 @@
+<?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.AssProjectMapper">
+
+    <resultMap type="com.gkhy.assess.system.domain.AssProject" id="projectResult">
+        <id     property="id"        column="id"         />
+        <result property="name"     column="name"      />
+        <result property="code"     column="code"      />
+        <result property="client"     column="client"      />
+        <result property="province"     column="province"      />
+        <result property="city"     column="city"      />
+        <result property="district"     column="district"      />
+        <result property="business"     column="business"      />
+        <result property="invest"     column="invest"      />
+        <result property="address"     column="address"      />
+        <result property="actualLocation"     column="actual_location"      />
+        <result property="location"     column="location"      />
+        <result property="materialCnt"     column="material_cnt"      />
+        <result property="estimateType"     column="estimate_type"      />
+        <result property="filingDate"     column="filing_date"      />
+        <result property="creditCode"     column="credit_code"      />
+        <result property="reportProgress"     column="report_progress"      />
+        <result property="phase"     column="phase"      />
+        <result property="state"     column="state"      />
+        <result property="agencyId"     column="agency_id"      />
+        <result property="introduction"     column="introduction"      />
+        <result property="isReview"     column="is_review"      />
+        <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="businessName"     column="business_name"      />
+        <result property="leaderId"     column="leader_id"      />
+        <result property="estimateTypeName"     column="estimate_type_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>
+
+    <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+        <id     property="id"       column="leader_id"        />
+        <result property="name"     column="leader_name"      />
+    </resultMap>
+
+    <resultMap id="contractResult" type="com.gkhy.assess.system.domain.AssContract">
+        <id     property="id"       column="contract_id"        />
+        <result property="contractMoney"     column="contract_money"      />
+        <result property="actualContractMoney"     column="actual_contract_money"      />
+    </resultMap>
+
+    <sql id="selectProjectVo">
+        select distinct p.id,p.name, p.code,p.client,p.province,p.city,p.district,p.business,p.invest,p.address,p.agency_id,
+               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,
+               (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
+        left join sys_user u on u.id=e.leader_id
+        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
+    </sql>
+
+
+    <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
+        </if>
+        <if test="params.lostMaterial != null">
+            left join ass_project_material m on m.project_id=p.id
+        </if>
+        <where>
+            and p.del_flag = 0
+            <if test="name != null and name != ''">
+                AND p.name like concat('%', #{name}, '%')
+            </if>
+            <if test="client != null and client != ''">
+                AND p.client like concat('%', #{client}, '%')
+            </if>
+            <if test="business != null and business != ''">
+                AND p.business = #{business}
+            </if>
+            <if test="estimateType != null and estimateType != ''">
+                AND p.estimate_type = #{estimateType}
+            </if>
+            <if test="province != null and province != ''">
+                AND p.province = #{province}
+            </if>
+            <if test="city != null and city != ''">
+                AND p.city = #{city}
+            </if>
+            <if test="district != null and district != ''">
+                AND p.district = #{district}
+            </if>
+            <if test="agencyId!=null and agencyId!=''">
+                AND p.agency_id=#{agencyId}
+            </if>
+            <if test="phase!=null and phase!=''">
+                AND p.phase=#{phase}
+            </if>
+            <if test="params.startTime != null "><!-- 开始时间检索 -->
+                and date_format(p.create_time,'%y%m%d') &gt;= date_format(#{params.startTime},'%y%m%d')
+            </if>
+            <if test="params.endTime != null "><!-- 结束时间检索 -->
+                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
+            </if>
+            <if test="params.lostMaterial != null and params.lostMaterial==1">
+                and (m.file_id is null)
+            </if>
+            <if test="params.lostMaterial != null and params.lostMaterial==0">
+                and (m.file_id is not null)
+            </if>
+        </where>
+        order by p.create_time desc
+    </select>
+
+    <select id="getProjectById"  resultMap="projectResult">
+        <include refid="selectProjectVo"/>
+        where p.id=#{projectId}
+    </select>
+
+    <select id="getProjectByName" resultType="com.gkhy.assess.system.domain.AssProject">
+        select id,name from ass_project
+        where name=#{name}
+    </select>
+
+    <select id="getReportProgress" resultType="java.lang.Integer">
+        select report_progress from ass_project
+        where id=#{projectId}
+    </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,
+        e.leader_id,u.name as leader_name
+        from ass_project p
+        left join ass_plan_person a on a.project_id=p.id
+        left join ass_estimate_task e on e.project_id=p.id
+        left join sys_user u on u.id=e.leader_id
+        <where>
+            and a.person_id=#{personId} and p.del_flag=0 and a.del_flag=0
+            <if test="finish!=null and finish==1">
+            and p.report_progress=14
+            </if>
+            <if test="finish!=null and finish==0">
+                and p.report_progress!=14
+            </if>
+            <if test="agencyId!=null and agencyId!=''">
+                AND p.agency_id=#{agencyId}
+            </if>
+        </where>
+        order by p.create_time desc
+    </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,
+        e.leader_id,u.name as leader_name
+        from ass_project p
+        left join ass_plan_person a on a.project_id=p.id
+        left join ass_estimate_task e on e.project_id=p.id
+        left join sys_user u on u.id=e.leader_id
+        where a.person_id=#{personId} and p.del_flag=0 and a.job_type=2 and a.del_flag=0
+        <if test="agencyId!=null and agencyId!=''">
+            and p.agency_id=#{agencyId}
+        </if>
+        order by p.create_time desc
+    </select>
+
+    <select id="getProjectCount" resultType="java.lang.Integer">
+        select count(distinct  p.id) from ass_project p
+        <if test="params.lostMaterial != null">
+            left join ass_project_material m on m.project_id=p.id
+        </if>
+        <where>
+            and p.del_flag=0
+            <if test="agencyId!=null and agencyId!=''">
+                and p.agency_id=#{agencyId}
+            </if>
+            <if test="name != null and name != ''">
+                AND p.name like concat('%', #{name}, '%')
+            </if>
+            <if test="client != null and client != ''">
+                AND p.client like concat('%', #{client}, '%')
+            </if>
+            <if test="business != null and business != ''">
+                AND p.business = #{business}
+            </if>
+            <if test="estimateType != null and estimateType != ''">
+                AND p.estimate_type = #{estimateType}
+            </if>
+            <if test="province != null and province != ''">
+                AND p.province = #{province}
+            </if>
+            <if test="city != null and city != ''">
+                AND p.city = #{city}
+            </if>
+            <if test="district != null and district != ''">
+                AND p.district = #{district}
+            </if>
+            <if test="phase!=null and phase!=''">
+                AND p.phase=#{phase}
+            </if>
+            <if test="params.startTime != null "><!-- 开始时间检索 -->
+                and date_format(p.create_time,'%y%m%d') &gt;= date_format(#{params.startTime},'%y%m%d')
+            </if>
+            <if test="params.endTime != null "><!-- 结束时间检索 -->
+                and date_format(p.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
+            </if>
+            <if test="params.lostMaterial != null and params.lostMaterial==1">
+                and (m.file_id is null)
+            </if>
+            <if test="params.lostMaterial != null and params.lostMaterial==0">
+                and (m.file_id is not null)
+            </if>
+        </where>
+    </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
+        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
+    </select>
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssProjectMaterialMapper.xml b/assess-system/src/main/resources/mapper/AssProjectMaterialMapper.xml
new file mode 100644
index 0000000..b384925
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssProjectMaterialMapper.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.AssProjectMaterialMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssProjectMaterial" id="projectMaterialResult">
+        <id     property="id"        column="id"         />
+        <result property="name"     column="name"      />
+        <result property="type"     column="type"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="fileId"     column="file_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"      />
+        <association property="accessoryFile" javaType="com.gkhy.assess.system.domain.AssAccessoryFile" resultMap="fileResult" />
+
+    </resultMap>
+
+    <resultMap id="fileResult" type="com.gkhy.assess.system.domain.AssAccessoryFile">
+        <id     property="id"       column="file_id"        />
+        <result property="originName"     column="origin_name"      />
+        <result property="fileName"      column="file_name"       />
+        <result property="path"      column="path"       />
+    </resultMap>
+
+
+    <sql id="selectProjectMaterialVo">
+        select p.id,p.name,p.type,p.project_id,p.file_id,
+               p.version,p.del_flag,p.create_by,p.create_time,p.update_by,p.update_time,p.remark,a.origin_name,a.file_name,a.path
+        from ass_project_material p
+        left join ass_accessory_file a on a.id=p.file_id
+    </sql>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_project_material where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getProjectMaterialByProjectId" resultMap="projectMaterialResult">
+        <include refid="selectProjectMaterialVo"/>
+        where p.project_id=#{projectId} and p.del_flag=0
+    </select>
+
+    <select id="getProjectMaterialById" resultMap="projectMaterialResult">
+        <include refid="selectProjectMaterialVo"/>
+        where p.id=#{projectMaterialId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssRecitificationMapper.xml b/assess-system/src/main/resources/mapper/AssRecitificationMapper.xml
new file mode 100644
index 0000000..32cd96b
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssRecitificationMapper.xml
@@ -0,0 +1,41 @@
+<?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.AssRecitificationMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssRecitification" id="recitifyResult">
+        <id     property="id"        column="id"         />
+        <result property="rectifyPerson"     column="rectify_person"      />
+        <result property="rectifyTime"     column="rectify_time"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="fileId"     column="file_id"      />
+        <result property="reason"     column="reason"      />
+        <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"      />
+        <association property="accessoryFile" javaType="com.gkhy.assess.system.domain.AssAccessoryFile" resultMap="fileResult" />
+    </resultMap>
+
+    <resultMap id="fileResult" type="com.gkhy.assess.system.domain.AssAccessoryFile">
+        <id     property="id"       column="file_id"        />
+        <result property="originName"     column="origin_name"      />
+        <result property="fileName"      column="file_name"       />
+        <result property="path"      column="path"       />
+    </resultMap>
+
+    <sql id="selectProjectMaterialVo">
+        select r.id,r.rectify_person,r.rectify_person,r.project_id,r.file_id,r.reason,
+               r.version,r.del_flag,r.create_by,r.create_time,r.update_by,r.update_time,r.remark,a.origin_name,a.file_name,a.path
+        from ass_recitification r
+        left join ass_accessory_file a on a.id=r.file_id
+    </sql>
+
+
+
+    <select id="recitificationList" resultMap="recitifyResult">
+        <include refid="selectProjectMaterialVo"/>
+        where r.project_id=#{projectId} and r.del_flag=0
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssRiskEstimateMapper.xml b/assess-system/src/main/resources/mapper/AssRiskEstimateMapper.xml
new file mode 100644
index 0000000..c9bfe07
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssRiskEstimateMapper.xml
@@ -0,0 +1,59 @@
+<?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.AssRiskEstimateMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssRiskEstimate" id="riskEstimateResult">
+        <id     property="id"        column="id"         />
+        <result property="projectId"     column="project_id"      />
+        <result property="riskCharacter"     column="risk_character"      />
+        <result property="surroundings"     column="surroundings"      />
+        <result property="equipment"     column="equipment"      />
+        <result property="technology"     column="technology"      />
+        <result property="isAcceptChargess"     column="is_accept_chargess"      />
+        <result property="isFeasibility"     column="is_feasibility"      />
+        <result property="isFinishReport"     column="is_finish_report"      />
+        <result property="isInBusiness"     column="is_in_business"      />
+        <result property="isNeedExpert"     column="is_need_expert"      />
+        <result property="isSatisfyNeed"     column="is_satisfy_need"      />
+        <result property="estimateDate"     column="estimate_date"      />
+        <result property="techOpinion"     column="tech_opinion"      />
+        <result property="riskOpinion"     column="risk_opinion"      />
+        <result property="agencyOpinon"     column="agency_opinon"      />
+        <result property="state"     column="state"      />
+        <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"      />
+    </resultMap>
+
+    <sql id="selectRiskEstimateVo">
+        select r.id,r.project_id,r.risk_character,r.surroundings,r.equipment,r.technology,r.is_accept_chargess,r.is_feasibility,
+               r.is_finish_report,r.is_in_business,r.is_need_expert,r.is_satisfy_need,r.estimate_date,r.tech_opinion,r.risk_opinion,
+               r.agency_opinon,r.state,r.del_flag,r.version,r.del_flag,r.create_by,r.create_time,r.update_by,r.update_time,r.remark
+        from ass_risk_estimate r
+    </sql>
+
+    <select id="getRiskEstimateByProjectId" resultType="com.gkhy.assess.system.domain.AssRiskEstimate">
+        <include refid="selectRiskEstimateVo"/>
+        where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getRiskEstimateById" resultType="com.gkhy.assess.system.domain.AssRiskEstimate">
+        <include refid="selectRiskEstimateVo"/>
+        where r.id=#{riskId}
+    </select>
+
+    <select id="getProjectByRiskId" resultType="com.gkhy.assess.system.domain.AssProject">
+        select p.id,p.name,p.report_progress from ass_project p
+        left join ass_risk_estimate r on r.project_id=p.id
+        where r.id=${riskId}
+    </select>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer">
+        select count(1) from ass_risk_estimate where project_id=#{projectId} and del_flag=0
+    </select>
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/AssWorkNotificationMapper.xml b/assess-system/src/main/resources/mapper/AssWorkNotificationMapper.xml
new file mode 100644
index 0000000..50d886f
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/AssWorkNotificationMapper.xml
@@ -0,0 +1,41 @@
+<?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.AssWorkNotificationMapper">
+    <resultMap type="com.gkhy.assess.system.domain.AssWorkNotification" id="WorkNotificationResult">
+        <id     property="id"        column="id"         />
+        <result property="serviceStartDate"     column="service_start_date"      />
+        <result property="serviceEndDate"     column="service_end_date"      />
+        <result property="investigationPlanDate"     column="investigation_plan_date"      />
+        <result property="projectId"     column="project_id"      />
+        <result property="auditId"     column="audit_id"      />
+        <result property="state"     column="state"      />
+        <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"      />
+    </resultMap>
+
+    <sql id="selectWorkNotificationVo">
+        select w.id,w.service_start_date, w.service_end_date,w.investigation_plan_date,w.project_id,w.state,w.audit_id,
+               w.del_flag,w.create_by,w.create_time,w.update_by,w.update_time,w.remark
+        from ass_work_notification w
+    </sql>
+
+
+    <select id="getCountByProjectId" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(1) from ass_work_notification where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getWorkNotificationByProjectId" resultMap="WorkNotificationResult">
+        <include refid="selectWorkNotificationVo"/>
+        where project_id=#{projectId} and del_flag=0
+    </select>
+
+    <select id="getWorkNotificationById" resultMap="WorkNotificationResult">
+        <include refid="selectWorkNotificationVo"/>
+        where id=#{workNotificationId}
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml b/assess-system/src/main/resources/mapper/SysAgencyMapper.xml
similarity index 92%
rename from assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml
rename to assess-system/src/main/resources/mapper/SysAgencyMapper.xml
index cab000a..8afaa7e 100644
--- a/assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysAgencyMapper.xml
@@ -59,11 +59,20 @@
             <if test="name != null and name != ''">
                 AND a.name like concat('%', #{name}, '%')
             </if>
+            <if test="province != null and province != ''">
+                AND a.province=#{province}
+            </if>
             <if test="city != null and city != ''">
                 AND a.city=#{city}
             </if>
+            <if test="district != null and district != ''">
+                AND a.district=#{district}
+            </if>
             <if test="business != null and business != ''">
                 AND a.business like concat("%",#{business},"%")
+            </if>
+            <if test="publication != null">
+                AND a.publication =#{publication}
             </if>
         </where>
         order by a.create_time desc
@@ -73,10 +82,6 @@
         <include refid="selectAgencyVo"/>
         where a.del_flag = 0 and a.id=#{agencyId}
     </select>
-
-    <delete id="deleteAgencyById" parameterType="java.lang.Long">
-        update sys_agency set del_flag=1 where id=#{agencyId}
-    </delete>
 
 
     <select id="getBusinessById" resultType="java.lang.String">
diff --git a/assess-system/src/main/resources/mapper/system/SysAttachMapper.xml b/assess-system/src/main/resources/mapper/SysAttachMapper.xml
similarity index 65%
rename from assess-system/src/main/resources/mapper/system/SysAttachMapper.xml
rename to assess-system/src/main/resources/mapper/SysAttachMapper.xml
index abdd9ff..b9e3450 100644
--- a/assess-system/src/main/resources/mapper/system/SysAttachMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysAttachMapper.xml
@@ -1,6 +1,7 @@
 <?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.SysAttachMapper">
+
     <delete id="deleteAttachsByUserId">
         delete from sys_attach
         <where>
@@ -14,13 +15,17 @@
         </where>
     </delete>
 
+    <delete id="deleteAttachsByIds">
+        delete from sys_attach where id in
+        <foreach collection="ids" item="id" separator="," open="(" close=")">
+            #{id}
+        </foreach>
+    </delete>
+
     <select id="getAttachsByUserId" resultType="com.gkhy.assess.system.domain.SysAttach">
-        select * from sys_attach
-        <where>
-            and user_id=#{userId}
-            <if test="type!=null and type!=''">
-               and type=#{type}
-            </if>
-        </where>
+        select * from sys_attach where user_id=#{userId}
+        <if test="type!=null and type!=''">
+           and type=#{type}
+        </if>
     </select>
 </mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysConfigMapper.xml b/assess-system/src/main/resources/mapper/SysConfigMapper.xml
similarity index 100%
rename from assess-system/src/main/resources/mapper/system/SysConfigMapper.xml
rename to assess-system/src/main/resources/mapper/SysConfigMapper.xml
diff --git a/assess-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/assess-system/src/main/resources/mapper/SysDictDataMapper.xml
similarity index 90%
rename from assess-system/src/main/resources/mapper/system/SysDictDataMapper.xml
rename to assess-system/src/main/resources/mapper/SysDictDataMapper.xml
index 4fa0e8a..3d6e404 100644
--- a/assess-system/src/main/resources/mapper/system/SysDictDataMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysDictDataMapper.xml
@@ -12,12 +12,12 @@
     </update>
 
     <select id="countDictDataByType" resultType="java.lang.Integer">
-        select count(1) from sys_dict_data where dict_type=#{dictType}
+        select count(1) from sys_dict_data where dict_type=#{dictType} and del_flag=0
     </select>
 
     <select id="getDictDataByType" resultType="com.gkhy.assess.system.domain.SysDictData">
         <include refid="selectDictDataVo"/>
-        where d.dict_type=#{dictType} and d.status=0
+        where d.dict_type=#{dictType} and d.status=0 and d.del_flag=0
         order by d.sort asc
     </select>
 
@@ -29,13 +29,14 @@
     <select id="dictDataList" resultType="com.gkhy.assess.system.domain.SysDictData">
         <include refid="selectDictDataVo"/>
         <where>
+            and del_flag=0
             <if test="dictType != null and dictType != ''">
                 AND dict_type = #{dictType}
             </if>
             <if test="label != null and label != ''">
                 AND label like concat('%', #{label}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 AND status = #{status}
             </if>
         </where>
diff --git a/assess-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/assess-system/src/main/resources/mapper/SysDictTypeMapper.xml
similarity index 79%
rename from assess-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
rename to assess-system/src/main/resources/mapper/SysDictTypeMapper.xml
index bd85203..2622601 100644
--- a/assess-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysDictTypeMapper.xml
@@ -9,10 +9,11 @@
     <select id="dictTypeList" resultType="com.gkhy.assess.system.domain.SysDictType">
         <include refid="selectDictTypeVo"/>
         <where>
+            and d.del_flag=0
             <if test="name != null and name != ''">
                 AND d.name like concat('%', #{name}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 AND d.status = #{status}
             </if>
             <if test="dictType != null and dictType != ''">
@@ -28,12 +29,19 @@
 
     <select id="checkDictTypeUnique" resultType="com.gkhy.assess.system.domain.SysDictType">
         <include refid="selectDictTypeVo"/>
-        where d.dict_type = #{dictType} limit 1
+        <where>
+            and (d.dict_type = #{dictType}
+            <if test="name!=null and name!=''">
+                or name=#{name}
+            </if>
+            )
+            and d.del_flag=0 limit 1
+        </where>
     </select>
 
     <select id="getDictTypeByType" resultType="com.gkhy.assess.system.domain.SysDictType">
         <include refid="selectDictTypeVo"/>
-        where d.dict_type = #{dictType}
+        where d.dict_type = #{dictType} and d.del_flag=0
     </select>
 
 
diff --git a/assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml b/assess-system/src/main/resources/mapper/SysExpertClassifyMapper.xml
similarity index 100%
rename from assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml
rename to assess-system/src/main/resources/mapper/SysExpertClassifyMapper.xml
diff --git a/assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml b/assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml
similarity index 72%
rename from assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml
rename to assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml
index 1bd95ed..36bc8ef 100644
--- a/assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysExpertInfoMapper.xml
@@ -3,24 +3,24 @@
 <mapper namespace="com.gkhy.assess.system.mapper.SysExpertInfoMapper">
 
     <sql id="selectExpertInfoVo">
-        select expert_id,name,sex,birthday,phone,title,electronic_photo,id_card,duty_status,
+        select id,name,sex,birthday,phone,title,state,electronic_photo,id_card,duty_status,
                company_name,company_address,dept_name,job,company_telephone,fax_num,email,
                graduation_school,degree,speciality,current_profession,support_direction_safety,
                support_direction_prevention,support_direction_emergency,resume_key,paper_situation_key,
                reward_key,achievement_key,personal_opinion_key,recommend_unit_opinion_key,remark,create_by,
-               create_time,big_classify,small_classify,del_flag
-        from sys_agency
+               create_time,big_classify,small_classify,del_flag,source
+        from sys_expert_info
     </sql>
 
-    <delete id="deleteBatchByIds">
-        update expert_info set del_flag = 1  where expert_id in
+    <update id="deleteBatchByIds">
+        update expert_info set del_flag = 1  where id in
         <foreach collection="expertIds" item="expertId" separator="," open="(" close=")">
             #{expertId}
         </foreach>
-    </delete>
+    </update>
 
     <select id="expertInfoList" resultType="com.gkhy.assess.system.domain.SysExpertInfo">
-        <include refid="selectExpertInfoVo"/>
+        select id,name,sex,birthday,phone,title,degree,state,speciality,big_classify,small_classify,create_time from sys_expert_info
         <where>
             and del_flag = 0
             <if test="name != null and name != ''">
@@ -35,6 +35,9 @@
             <if test="dutyStatus != null">
                 and duty_status = #{dutyStatus}
             </if>
+            <if test="state != null">
+                and state = #{state}
+            </if>
             <if test="params.startTime != null "><!-- 开始时间检索 -->
                 and date_format(create_time,'%y%m%d') &gt;= date_format(#{params.startTime},'%y%m%d')
             </if>
@@ -45,6 +48,11 @@
         order by create_time desc
     </select>
     <select id="checkIdcardUnique" resultType="com.gkhy.assess.system.domain.SysExpertInfo">
-        select expert_id,name from sys_expert_info where del_flag=0 limit 1
+        select id,name from sys_expert_info where id_card=#{idCard} and del_flag=0 limit 1
+    </select>
+
+    <select id="getExpertInfoById" resultType="com.gkhy.assess.system.domain.SysExpertInfo">
+        <include refid="selectExpertInfoVo"/>
+        where id=#{expertId}
     </select>
 </mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysLawMapper.xml b/assess-system/src/main/resources/mapper/SysLawMapper.xml
similarity index 93%
rename from assess-system/src/main/resources/mapper/system/SysLawMapper.xml
rename to assess-system/src/main/resources/mapper/SysLawMapper.xml
index 679233f..875265d 100644
--- a/assess-system/src/main/resources/mapper/system/SysLawMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysLawMapper.xml
@@ -9,10 +9,11 @@
     <select id="lawList" resultType="com.gkhy.assess.system.domain.SysLaw">
         select l.id,l.title,l.sub_title,l.law_type,l.pub_agency,l.pub_date,l.create_time from sys_law l
         <where>
+            and l.del_flag=0
             <if test="title != null and title != ''">
                 AND l.title like concat('%', #{title}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 AND l.status = #{status}
             </if>
         </where>
diff --git a/assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/assess-system/src/main/resources/mapper/SysNoticeMapper.xml
similarity index 93%
rename from assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml
rename to assess-system/src/main/resources/mapper/SysNoticeMapper.xml
index 290bbcf..73b31c1 100644
--- a/assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysNoticeMapper.xml
@@ -10,10 +10,11 @@
     <select id="noticeList" resultType="com.gkhy.assess.system.domain.SysNotice">
         select n.id,n.title,n.create_time,n.update_time from sys_notice n
         <where>
+            and n.del_flag=0
             <if test="title != null and title != ''">
                 AND n.title like concat('%', #{title}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 AND n.status = #{status}
             </if>
         </where>
diff --git a/assess-system/src/main/resources/mapper/system/SysRegionMapper.xml b/assess-system/src/main/resources/mapper/SysRegionMapper.xml
similarity index 100%
rename from assess-system/src/main/resources/mapper/system/SysRegionMapper.xml
rename to assess-system/src/main/resources/mapper/SysRegionMapper.xml
diff --git a/assess-system/src/main/resources/mapper/SysUserFaceMapper.xml b/assess-system/src/main/resources/mapper/SysUserFaceMapper.xml
new file mode 100644
index 0000000..71bc06c
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/SysUserFaceMapper.xml
@@ -0,0 +1,8 @@
+<?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.SysUserFaceMapper">
+
+    <select id="getFaceByUserId" resultType="com.gkhy.assess.system.domain.SysUserFace">
+        select * from sys_user_face where del_flag=0 and user_id=#{userId} limit 1
+    </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysUserMapper.xml b/assess-system/src/main/resources/mapper/SysUserMapper.xml
similarity index 80%
rename from assess-system/src/main/resources/mapper/system/SysUserMapper.xml
rename to assess-system/src/main/resources/mapper/SysUserMapper.xml
index f42a7e2..5ebd431 100644
--- a/assess-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/assess-system/src/main/resources/mapper/SysUserMapper.xml
@@ -22,6 +22,9 @@
         <result property="expertType"        column="expert_type"         />
         <result property="jobTitle"        column="job_title"         />
         <result property="major"        column="major"         />
+        <result property="level"        column="level"         />
+        <result property="idPhoto"        column="id_photo"         />
+        <result property="certificateNo"        column="certificate_no"         />
         <result property="state"        column="state"         />
         <result property="loginIp"       column="login_ip"        />
         <result property="loginDate"     column="login_date"      />
@@ -35,6 +38,7 @@
         <collection property="socialAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getSocialAttachByUserId" column="{userId=id}"/>
         <collection property="medicalAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getMedicalAttachByUserId" column="{userId=id}"/>
         <collection property="salaryAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getSalaryAttachByUserId" column="{userId=id}"/>
+        <collection property="majorNames" ofType="java.lang.String" select="getMajorById" column="{major=major}"/>
     </resultMap>
 
 
@@ -45,23 +49,17 @@
     </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,a.id as agency_id,a.name as agency_name,a.credit_code
+        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
         from sys_user u
         left join sys_agency a on u.agency_id=a.id
     </sql>
-    <delete id="deleteUserById" parameterType="java.lang.Long">
-        update sys_user set del_flag=1 where id=#{userId}
-    </delete>
 
-    <delete id="deleteUserByIds">
-        update sys_user set del_flag = 1 where id in
-        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
-            #{userId}
-        </foreach>
-    </delete>
 
     <select id="getUserByUsername" resultMap="SysUserResult">
-        select id,username,name,password,salt,identity,state,status,del_flag from sys_user
+        select id,username,name,password,salt,identity,state,status,del_flag,agency_id,major from sys_user
         where username=#{username} and del_flag=0
     </select>
 
@@ -72,7 +70,7 @@
             <if test="username != null and username != ''">
                 AND u.username like concat('%', #{username}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 AND u.status = #{status}
             </if>
             <if test="phone != null and phone != ''">
@@ -89,7 +87,7 @@
             <if test="username != null and username != ''">
                 AND u.username like concat('%', #{username}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 AND u.status = #{status}
             </if>
             <if test="phone != null and phone != ''">
@@ -106,8 +104,14 @@
             <if test="username != null and username != ''">
                 AND u.username like concat('%', #{username}, '%')
             </if>
-            <if test="status != null and status != ''">
+            <if test="name != null and name != ''">
+                AND u.name like concat('%', #{name}, '%')
+            </if>
+            <if test="status != null">
                 AND u.status = #{status}
+            </if>
+            <if test="level != null and level!=''">
+                AND u.level = #{level}
             </if>
             <if test="phone != null and phone != ''">
                 AND u.phone like concat('%', #{phone}, '%')
@@ -115,6 +119,16 @@
             <if test="expertType != null and expertType != ''">
                 AND u.expert_type =#{expertType}
             </if>
+            <if test="agencyId != null and agencyId != ''">
+                AND u.agency_id =#{agencyId}
+            </if>
+            <if test="major != null and major != ''">
+                AND u.major like concat("%",#{major},"%")
+            </if>
+            <if test="post != null and post != ''">
+                AND u.post =#{post}
+            </if>
+
         </where>
         order by u.create_time desc
     </select>
@@ -122,17 +136,17 @@
 
 
     <select id="getUserByPhone" resultMap="SysUserResult">
-        select id,username,name,password,salt,identity,state,status,del_flag from sys_user
+        select id,username,name,password,salt,identity,state,status,del_flag,major from sys_user
         where phone=#{phone} and del_flag=0
     </select>
 
     <select id="getUserByEmail" resultMap="SysUserResult">
-        select id,username,name,password,salt,identity,state,status,del_flag from sys_user
+        select id,username,name,password,salt,identity,state,status,del_flag,major from sys_user
         where email=#{email} and del_flag=0
     </select>
 
     <select id="getUserById" resultMap="SysUserResult">
-        select id,username,name,password,salt,identity,status,del_flag,agency_id from sys_user
+        select id,username,name,password,salt,identity,status,del_flag,agency_id,major from sys_user
         where id=#{userId}
     </select>
 
@@ -149,7 +163,7 @@
     </select>
 
     <select id="getUserByUsernamePhone" resultType="com.gkhy.assess.system.domain.SysUser">
-        select id,username,name,password,salt,identity,state,status,del_flag from sys_user
+        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>
 
@@ -166,6 +180,13 @@
         select id,name,path,type,user_id,create_time from sys_attach where user_id=#{userId} and type=3 order by create_time desc
     </select>
 
+    <select id="getMajorById" resultType="java.lang.String">
+        select label from sys_dict_data where id in
+        <foreach item="item" index="index" collection="major.split(',')"  open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
     <select id="getUserInfoById" resultMap="SysUserResult">
         <include refid="selectUserVo"/>
         where u.id=#{userId}
diff --git a/assess-system/src/test/java/com/gkhy/system/MybatisPlusGenerator.java b/assess-system/src/test/java/com/gkhy/system/MybatisPlusGenerator.java
index 8c72f52..2617aab 100644
--- a/assess-system/src/test/java/com/gkhy/system/MybatisPlusGenerator.java
+++ b/assess-system/src/test/java/com/gkhy/system/MybatisPlusGenerator.java
@@ -13,10 +13,10 @@
 public class MybatisPlusGenerator {
     public static void main(String[] args) {
         System.out.println(System.getProperty("user.dir"));
-        String model="/gkhy-system";
+        String model="/assess-system";
         // 数据库配置
         DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig
-                .Builder("jdbc:mysql://localhost:3306/gkhy" +
+                .Builder("jdbc:mysql://localhost:3306/smart_assess" +
                 "?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"
                 , "root", "password");
         FastAutoGenerator.create(dataSourceConfigBuilder)
@@ -40,7 +40,7 @@
                 // 包配置
                 .packageConfig((scanner, builder) -> {
                     // 父包名
-                    builder.parent("com.gkhy")
+                    builder.parent("com.gkhy.assess")
                             // 模块名
                             .moduleName("system")
                             // Entity 包名
@@ -54,7 +54,7 @@
                             // Mapper 包名
                             .mapper("mapper")
                             // MapperXML 包名
-                            .xml("mapper.system")
+                            .xml("mapper")
                             // 路径配置信息
                             .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") +model+ "/src/main/resources/mapper/"));
                 })
diff --git a/pom.xml b/pom.xml
index 5fbb586..10f15ac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,6 @@
                 <artifactId>assess-admin</artifactId>
                 <version>${assess.version}</version>
             </dependency>
-
             <!--MyBatis分页插件-->
             <dependency>
                 <groupId>com.github.pagehelper</groupId>

--
Gitblit v1.9.2