From 4f3d1693b40f00c9836cb672155951af42934a92 Mon Sep 17 00:00:00 2001
From: wucongxing8150 <815046773@qq.com>
Date: Sat, 21 Jun 2025 11:06:35 +0800
Subject: [PATCH] first commit
---
.gitignore | 57 ++
Dockerfile | 41 ++
pom.xml | 390 ++++++++++
sa-admin/pom.xml | 57 ++
.../sa/admin/SmartAdminApplication.java | 33 +
.../sa/admin/common/AdminBaseController.java | 13 +
.../sa/admin/config/JweAspectConfig.java | 38 +
.../admin/config/OperateLogAspectConfig.java | 34 +
.../sa/admin/config/SecurityConfig.java | 40 ++
.../sa/admin/config/SecurityMethodConfig.java | 50 ++
.../sa/admin/constant/AdminCacheConst.java | 57 ++
.../sa/admin/constant/AdminRedisKeyConst.java | 17 +
.../admin/constant/AdminSwaggerTagConst.java | 66 ++
.../sa/admin/listener/AdminStartupRunner.java | 40 ++
.../app/expert/admin/ExpertBankVerify.java | 23 +
.../module/app/expert/admin/ExpertEntity.java | 101 +++
.../app/expert/admin/ExpertLoginVO.java | 25 +
.../app/expert/admin/ExpertModifyForm.java | 56 ++
.../app/expert/admin/ExpertModifyVO.java | 48 ++
.../app/expert/admin/ExpertRegisterForm.java | 68 ++
.../app/expert/admin/ExpertSignAddForm.java | 15 +
.../module/app/expert/admin/ExpertSignVO.java | 39 +
.../module/app/expert/admin/ExpertVO.java | 32 +
.../app/expert/admin/ExpertWhiteEntity.java | 68 ++
.../module/app/expert/admin/LoginForm.java | 42 ++
.../module/app/expert/admin/PWDLoginForm.java | 41 ++
.../module/app/expert/admin/SmsLoginForm.java | 36 +
.../module/app/expert/constan/ImageType.java | 18 +
.../app/expert/constan/SmsTypeEnum.java | 34 +
.../expert/controller/ExpertController.java | 588 +++++++++++++++
.../controller/ExpertSignController.java | 59 ++
.../module/app/expert/dao/ExpertDao.java | 18 +
.../module/app/expert/dao/ExpertSignDao.java | 31 +
.../app/expert/dao/ExpertWhiteEntityDao.java | 19 +
.../app/expert/service/ExpertService.java | 82 +++
.../app/expert/service/ExpertSignService.java | 40 ++
.../service/ExpertWhiteEntityService.java | 37 +
.../app/file/constant/OSSFileTypeEnum.java | 26 +
.../file/controller/OSSFileController.java | 73 ++
.../module/app/file/domain/OSSPolicyVO.java | 28 +
.../controller/MedicalRecordController.java | 59 ++
.../dao/MedicalRecorAbstracDao.java | 16 +
.../dao/MedicalRecorCheckDataDao.java | 15 +
.../medicalrecord/dao/MedicalRecorDao.java | 42 ++
.../dao/MedicalRecorDpmasDao.java | 24 +
.../dao/MedicalRecorUserDao.java | 19 +
.../app/medicalrecord/domain/DpmsAddForm.java | 21 +
.../domain/MedicalRecordAbstracEntity.java | 58 ++
.../domain/MedicalRecordAddForm.java | 226 ++++++
.../domain/MedicalRecordCheckdataEntity.java | 155 ++++
.../domain/MedicalRecordDTO.java | 16 +
.../domain/MedicalRecordDetailVO.java | 211 ++++++
.../domain/MedicalRecordDpmsEntity.java | 42 ++
.../domain/MedicalRecordEntity.java | 103 +++
.../domain/MedicalRecordListVO.java | 45 ++
.../domain/MedicalRecordQueryForm.java | 30 +
.../domain/MedicalRecordUpdateForm.java | 24 +
.../domain/MedicalRecordUserEntity.java | 72 ++
.../service/MedicalRecordService.java | 680 ++++++++++++++++++
.../area/controller/AreaController.java | 54 ++
.../module/business/area/dao/AreaDao.java | 51 ++
.../area/domain/entity/AreaEntity.java | 62 ++
.../area/domain/form/AreaQueryForm.java | 17 +
.../business/area/domain/vo/AreaVO.java | 42 ++
.../business/area/domain/vo/ProvVO.java | 14 +
.../business/area/manager/AreaManager.java | 20 +
.../business/area/service/AreaService.java | 57 ++
.../CaseplatformBankController.java | 44 ++
.../bankcard/dao/CaseplatformBankDao.java | 44 ++
.../domain/entity/CaseplatformBankEntity.java | 67 ++
.../domain/form/CaseplatformBankAddForm.java | 48 ++
.../form/CaseplatformBankQueryForm.java | 21 +
.../domain/vo/CaseplatformBankVO.java | 45 ++
.../manager/CaseplatformBankManager.java | 20 +
.../service/CaseplatformBankService.java | 80 +++
.../captcha/controller/CaptchaController.java | 21 +
.../business/captcha/dao/CaptchaDao.java | 16 +
.../captcha/domain/entity/CaptchaEntity.java | 19 +
.../captcha/domain/from/CaptchaAddForm.java | 13 +
.../captcha/service/CaptchaService.java | 140 ++++
.../constant/CaseSettlementEnum.java | 34 +
.../constant/CaseStatusEnum.java | 36 +
.../constant/CasetypeEnum.java | 34 +
.../CaseplatformCaseController.java | 110 +++
.../CaseplatformCaseExcelController.java | 78 ++
.../converter/CaseCaseSettlConverter.java | 43 ++
.../converter/CaseStatusConverter.java | 43 ++
.../converter/CasetypeConverter.java | 43 ++
.../dao/CaseplatformCaseDao.java | 73 ++
.../domain/entity/CaseplatformCaseEntity.java | 67 ++
.../domain/form/CancelExamineForm.java | 18 +
.../domain/form/CaseplatformCaseAddForm.java | 44 ++
.../form/CaseplatformCaseQueryForm.java | 46 ++
.../form/CaseplatformCaseUpdateForm.java | 29 +
.../domain/vo/CaseplatformCaseDetailVO.java | 96 +++
.../domain/vo/CaseplatformCaseVO.java | 67 ++
.../domain/vo/EasyExcelCaseDetailVO.java | 78 ++
.../manager/CaseplatformCaseManager.java | 20 +
.../service/CaseplatformCaseService.java | 169 +++++
.../CaseplatformCaseAbstracController.java | 40 ++
.../dao/CaseplatformCaseAbstracDao.java | 35 +
.../entity/CaseplatformCaseAbstracEntity.java | 52 ++
.../CaseplatformCaseAbstracQueryForm.java | 17 +
.../domain/vo/CaseplatformCaseAbstracVO.java | 40 ++
.../CaseplatformCaseAbstracManager.java | 20 +
.../CaseplatformCaseAbstracService.java | 45 ++
.../CaseplatformCaseCheckdataController.java | 41 ++
.../dao/CaseplatformCaseCheckdataDao.java | 36 +
.../CaseplatformCaseCheckdataEntity.java | 152 ++++
.../CaseplatformCaseCheckdataQueryForm.java | 17 +
.../vo/CaseplatformCaseCheckdataVO.java | 100 +++
.../CaseplatformCaseCheckdataManager.java | 20 +
.../CaseplatformCaseCheckdataService.java | 45 ++
.../CaseplatformCaseDpmsController.java | 41 ++
.../dao/CaseplatformCaseDpmsDao.java | 36 +
.../entity/CaseplatformCaseDpmsEntity.java | 42 ++
.../form/CaseplatformCaseDpmsQueryForm.java | 17 +
.../domain/vo/CaseplatformCaseDpmsVO.java | 33 +
.../manager/CaseplatformCaseDpmsManager.java | 19 +
.../service/CaseplatformCaseDpmsService.java | 45 ++
.../caseplatformuser/constant/SexEnum.java | 24 +
.../CaseplatformUserController.java | 41 ++
.../dao/CaseplatformUserDao.java | 35 +
.../domain/entity/CaseplatformUserEntity.java | 87 +++
.../form/CaseplatformUserQueryForm.java | 21 +
.../domain/vo/CaseplatformUserVO.java | 41 ++
.../manager/CaseplatformUserManager.java | 20 +
.../service/CaseplatformUserService.java | 42 ++
.../category/constant/CategoryTypeEnum.java | 36 +
.../controller/CategoryController.java | 67 ++
.../business/category/dao/CategoryDao.java | 72 ++
.../category/domain/dto/CategoryBaseDTO.java | 44 ++
.../domain/dto/CategorySimpleDTO.java | 26 +
.../domain/entity/CategoryEntity.java | 67 ++
.../category/domain/form/CategoryAddForm.java | 49 ++
.../domain/form/CategoryTreeQueryForm.java | 25 +
.../domain/form/CategoryUpdateForm.java | 24 +
.../category/domain/vo/CategoryTreeVO.java | 40 ++
.../category/domain/vo/CategoryVO.java | 51 ++
.../manager/CategoryCacheManager.java | 120 ++++
.../service/CategoryQueryService.java | 214 ++++++
.../category/service/CategoryService.java | 220 ++++++
.../goods/constant/GoodsStatusEnum.java | 42 ++
.../goods/controller/GoodsController.java | 75 ++
.../module/business/goods/dao/GoodsDao.java | 43 ++
.../goods/domain/entity/GoodsEntity.java | 75 ++
.../goods/domain/form/GoodsAddForm.java | 57 ++
.../goods/domain/form/GoodsQueryForm.java | 46 ++
.../goods/domain/form/GoodsUpdateForm.java | 23 +
.../business/goods/domain/vo/GoodsVO.java | 56 ++
.../business/goods/manager/GoodsManager.java | 20 +
.../business/goods/service/GoodsService.java | 168 +++++
.../business/oa/bank/BankController.java | 74 ++
.../module/business/oa/bank/BankDao.java | 61 ++
.../module/business/oa/bank/BankService.java | 162 +++++
.../oa/bank/domain/BankCreateForm.java | 58 ++
.../business/oa/bank/domain/BankEntity.java | 95 +++
.../oa/bank/domain/BankQueryForm.java | 40 ++
.../oa/bank/domain/BankUpdateForm.java | 23 +
.../business/oa/bank/domain/BankVO.java | 58 ++
.../oa/enterprise/EnterpriseController.java | 115 +++
.../enterprise/EnterpriseEmployeeManager.java | 19 +
.../oa/enterprise/EnterpriseService.java | 252 +++++++
.../constant/EnterpriseTypeEnum.java | 40 ++
.../oa/enterprise/dao/EnterpriseDao.java | 72 ++
.../enterprise/dao/EnterpriseEmployeeDao.java | 88 +++
.../entity/EnterpriseEmployeeEntity.java | 51 ++
.../domain/entity/EnterpriseEntity.java | 153 ++++
.../domain/form/EnterpriseCreateForm.java | 98 +++
.../domain/form/EnterpriseEmployeeForm.java | 29 +
.../form/EnterpriseEmployeeQueryForm.java | 35 +
.../domain/form/EnterpriseQueryForm.java | 38 +
.../domain/form/EnterpriseUpdateForm.java | 23 +
.../domain/vo/EnterpriseEmployeeVO.java | 47 ++
.../domain/vo/EnterpriseListVO.java | 20 +
.../oa/enterprise/domain/vo/EnterpriseVO.java | 86 +++
.../oa/invoice/InvoiceController.java | 80 +++
.../business/oa/invoice/InvoiceDao.java | 61 ++
.../business/oa/invoice/InvoiceService.java | 158 ++++
.../oa/invoice/domain/InvoiceAddForm.java | 59 ++
.../oa/invoice/domain/InvoiceEntity.java | 98 +++
.../oa/invoice/domain/InvoiceQueryForm.java | 40 ++
.../oa/invoice/domain/InvoiceUpdateForm.java | 23 +
.../business/oa/invoice/domain/InvoiceVO.java | 58 ++
.../NoticeVisibleRangeDataTypeEnum.java | 30 +
.../notice/controller/NoticeController.java | 135 ++++
.../business/oa/notice/dao/NoticeDao.java | 144 ++++
.../business/oa/notice/dao/NoticeTypeDao.java | 21 +
.../oa/notice/domain/entity/NoticeEntity.java | 99 +++
.../domain/entity/NoticeTypeEntity.java | 41 ++
.../oa/notice/domain/form/NoticeAddForm.java | 78 ++
.../domain/form/NoticeEmployeeQueryForm.java | 35 +
.../notice/domain/form/NoticeQueryForm.java | 48 ++
.../notice/domain/form/NoticeUpdateForm.java | 24 +
.../form/NoticeViewRecordQueryForm.java | 32 +
.../domain/form/NoticeVisibleRangeForm.java | 34 +
.../oa/notice/domain/vo/NoticeDetailVO.java | 82 +++
.../oa/notice/domain/vo/NoticeEmployeeVO.java | 26 +
.../oa/notice/domain/vo/NoticeTypeVO.java | 24 +
.../notice/domain/vo/NoticeUpdateFormVO.java | 33 +
.../oa/notice/domain/vo/NoticeVO.java | 75 ++
.../notice/domain/vo/NoticeViewRecordVO.java | 49 ++
.../domain/vo/NoticeVisibleRangeVO.java | 29 +
.../oa/notice/manager/NoticeManager.java | 67 ++
.../notice/service/NoticeEmployeeService.java | 159 ++++
.../oa/notice/service/NoticeService.java | 250 +++++++
.../oa/notice/service/NoticeTypeService.java | 87 +++
.../controller/StatisticsController.java | 65 ++
.../statistics/dao/StatisticsDao.java | 50 ++
.../statistics/domain/HospitalQureyForm.java | 14 +
.../statistics/domain/HospitalVO.java | 15 +
.../domain/StatisticsExpertQueryForm.java | 25 +
.../statistics/domain/StatisticsExpertVO.java | 41 ++
.../domain/SystemActualEcharsData.java | 14 +
.../domain/SystemActualNumQueryForm.java | 24 +
.../statistics/domain/SystemActualNumVO.java | 23 +
.../statistics/service/StatisticsService.java | 117 +++
.../module/business/token/dao/TokenDao.java | 15 +
.../token/domain/entity/TokenEntity.java | 19 +
.../business/token/service/TokenService.java | 276 +++++++
.../module/system/datascope/DataScope.java | 54 ++
.../system/datascope/DataScopeController.java | 41 ++
.../system/datascope/MyBatisPlugin.java | 186 +++++
.../datascope/constant/DataScopeTypeEnum.java | 56 ++
.../constant/DataScopeViewTypeEnum.java | 53 ++
.../constant/DataScopeWhereInTypeEnum.java | 42 ++
.../domain/DataScopeAndViewTypeVO.java | 35 +
.../system/datascope/domain/DataScopeDTO.java | 32 +
.../datascope/domain/DataScopeSqlConfig.java | 41 ++
.../datascope/domain/DataScopeViewTypeVO.java | 28 +
.../datascope/service/DataScopeService.java | 75 ++
.../service/DataScopeSqlConfigService.java | 149 ++++
.../service/DataScopeViewService.java | 162 +++++
.../strategy/DataScopePowerStrategy.java | 27 +
.../controller/DepartmentController.java | 71 ++
.../system/department/dao/DepartmentDao.java | 40 ++
.../domain/entity/DepartmentEntity.java | 62 ++
.../domain/form/DepartmentAddForm.java | 36 +
.../domain/form/DepartmentUpdateForm.java | 24 +
.../domain/vo/DepartmentEmployeeTreeVO.java | 27 +
.../domain/vo/DepartmentTreeVO.java | 32 +
.../department/domain/vo/DepartmentVO.java | 36 +
.../manager/DepartmentCacheManager.java | 249 +++++++
.../department/manager/DepartmentManager.java | 21 +
.../department/service/DepartmentService.java | 210 ++++++
.../controller/EmployeeController.java | 118 +++
.../system/employee/dao/EmployeeDao.java | 171 +++++
.../domain/entity/EmployeeEntity.java | 81 +++
.../employee/domain/form/EmployeeAddForm.java | 56 ++
.../EmployeeBatchUpdateDepartmentForm.java | 31 +
.../domain/form/EmployeeQueryForm.java | 40 ++
.../domain/form/EmployeeUpdateForm.java | 23 +
.../form/EmployeeUpdatePasswordForm.java | 33 +
.../domain/form/EmployeeUpdateRoleForm.java | 30 +
.../system/employee/domain/vo/EmployeeVO.java | 58 ++
.../employee/manager/EmployeeManager.java | 91 +++
.../service/EmployeePermissionService.java | 104 +++
.../employee/service/EmployeeService.java | 399 ++++++++++
.../login/controller/LoginController.java | 90 +++
.../login/domain/LoginEmployeeDetail.java | 169 +++++
.../module/system/login/domain/LoginForm.java | 41 ++
.../system/login/service/LoginService.java | 338 +++++++++
.../menu/constant/MenuPermsTypeEnum.java | 46 ++
.../system/menu/constant/MenuTypeEnum.java | 48 ++
.../menu/controller/MenuController.java | 86 +++
.../admin/module/system/menu/dao/MenuDao.java | 105 +++
.../system/menu/domain/entity/MenuEntity.java | 139 ++++
.../system/menu/domain/form/MenuAddForm.java | 20 +
.../system/menu/domain/form/MenuBaseForm.java | 86 +++
.../domain/form/MenuPointsOperateForm.java | 43 ++
.../menu/domain/form/MenuUpdateForm.java | 26 +
.../menu/domain/vo/MenuSimpleTreeVO.java | 37 +
.../system/menu/domain/vo/MenuTreeVO.java | 22 +
.../module/system/menu/domain/vo/MenuVO.java | 35 +
.../system/menu/manager/MenuManager.java | 70 ++
.../system/menu/service/MenuService.java | 290 ++++++++
.../role/controller/RoleController.java | 70 ++
.../controller/RoleDataScopeController.java | 50 ++
.../controller/RoleEmployeeController.java | 77 ++
.../role/controller/RoleMenuController.java | 47 ++
.../role/controller/RoleProvCntroller.java | 55 ++
.../admin/module/system/role/dao/RoleDao.java | 33 +
.../system/role/dao/RoleDataScopeDao.java | 46 ++
.../system/role/dao/RoleEmployeeDao.java | 95 +++
.../module/system/role/dao/RoleMenuDao.java | 54 ++
.../module/system/role/dao/RoleProvDao.java | 35 +
.../domain/entity/RoleDataScopeEntity.java | 53 ++
.../domain/entity/RoleEmployeeEntity.java | 41 ++
.../system/role/domain/entity/RoleEntity.java | 41 ++
.../role/domain/entity/RoleMenuEntity.java | 49 ++
.../system/role/domain/form/RoleAddForm.java | 36 +
.../domain/form/RoleDataScopeUpdateForm.java | 43 ++
.../domain/form/RoleEmployeeQueryForm.java | 24 +
.../domain/form/RoleEmployeeUpdateForm.java | 30 +
.../role/domain/form/RoleMenuUpdateForm.java | 35 +
.../role/domain/form/RoleProvUpdateForm.java | 28 +
.../role/domain/form/RoleQueryForm.java | 24 +
.../role/domain/form/RoleUpdateForm.java | 27 +
.../role/domain/vo/RoleDataScopeVO.java | 23 +
.../system/role/domain/vo/RoleEmployeeVO.java | 22 +
.../system/role/domain/vo/RoleMenuTreeVO.java | 29 +
.../system/role/domain/vo/RoleSelectedVO.java | 20 +
.../module/system/role/domain/vo/RoleVO.java | 26 +
.../role/manager/RoleDataScopeManager.java | 20 +
.../role/manager/RoleEmployeeManager.java | 37 +
.../system/role/manager/RoleMenuManager.java | 40 ++
.../role/service/RoleDataScopeService.java | 67 ++
.../role/service/RoleEmployeeService.java | 153 ++++
.../system/role/service/RoleMenuService.java | 139 ++++
.../system/role/service/RoleProvService.java | 49 ++
.../system/role/service/RoleService.java | 119 +++
.../system/support/AdminCacheController.java | 56 ++
.../support/AdminChangeLogController.java | 59 ++
.../system/support/AdminConfigController.java | 59 ++
.../system/support/AdminDictController.java | 79 ++
.../system/support/AdminFileController.java | 43 ++
.../support/AdminHeartBeatController.java | 41 ++
.../support/AdminHelpDocController.java | 108 +++
.../support/AdminLoginLogController.java | 42 ++
.../support/AdminOperateLogController.java | 46 ++
.../system/support/AdminReloadController.java | 54 ++
.../support/AdminSerialNumberController.java | 74 ++
.../wx/miniapp/config/WxMaConfiguration.java | 131 ++++
.../wx/miniapp/config/WxMaProperties.java | 46 ++
.../controller/WxMaMediaController.java | 88 +++
.../controller/WxMaUserController.java | 190 +++++
.../controller/WxPortalController.java | 109 +++
.../wx/miniapp/error/ErrorController.java | 29 +
.../miniapp/error/ErrorPageConfiguration.java | 27 +
.../module/wx/miniapp/utils/JsonUtils.java | 28 +
.../src/main/resources/dev/application.yaml | 43 ++
sa-admin/src/main/resources/dev/log4j2.xml | 99 +++
.../src/main/resources/dev/spy.properties | 18 +
.../mapper/app/expert/ExpertMapper.xml | 7 +
.../MedicalRecordDpmasMapper.xml | 7 +
.../app/medicalrecord/MedicalRecordMapper.xml | 44 ++
.../mapper/business/area/AreaMapper.xml | 13 +
.../bankcard/CaseplatformBankMapper.xml | 21 +
.../mapper/business/captcha/CaptchaMapper.xml | 13 +
.../CaseplatformCaseMapper.xml | 123 ++++
.../CaseplatformCaseAbstracMapper.xml | 18 +
.../CaseplatformCaseCheckdataMapper.xml | 18 +
.../CaseplatformCaseDpmsMapper.xml | 18 +
.../CaseplatformUserMapper.xml | 21 +
.../business/category/CategoryMapper.xml | 61 ++
.../mapper/business/goods/GoodsMapper.xml | 41 ++
.../mapper/business/notice/NoticeMapper.xml | 69 ++
.../mapper/business/oa/bank/BankMapper.xml | 58 ++
.../enterprise/EnterpriseEmployeeMapper.xml | 94 +++
.../oa/enterprise/EnterpriseMapper.xml | 59 ++
.../business/oa/invoice/InvoiceMapper.xml | 56 ++
.../mapper/business/oa/notice/NoticeDao.xml | 246 +++++++
.../business/statistics/StatisticMapper.xml | 222 ++++++
.../mapper/business/token/TokenMapper.xml | 13 +
.../system/department/DepartmentMapper.xml | 23 +
.../mapper/system/employee/EmployeeMapper.xml | 200 ++++++
.../mapper/system/menu/MenuMapper.xml | 78 ++
.../system/role/RoleDataScopeMapper.xml | 24 +
.../mapper/system/role/RoleEmployeeMapper.xml | 134 ++++
.../mapper/system/role/RoleMapper.xml | 35 +
.../mapper/system/role/RoleMenuMapper.xml | 42 ++
.../mapper/system/role/RoleProvMapper.xml | 36 +
.../src/main/resources/pre/application.yaml | 41 ++
sa-admin/src/main/resources/pre/log4j2.xml | 99 +++
.../src/main/resources/prod/application.yaml | 35 +
sa-admin/src/main/resources/prod/log4j2.xml | 99 +++
.../src/main/resources/test/application.yaml | 41 ++
sa-admin/src/main/resources/test/log4j2.xml | 99 +++
.../src/main/resources/test/spy.properties | 18 +
.../sa/admin/SmartAdminApplicationTest.java | 77 ++
sa-common/pom.xml | 267 +++++++
.../common/common/annoation/NoNeedLogin.java | 20 +
.../sa/common/common/annoation/SaAuth.java | 22 +
.../sa/common/common/code/AppErrorCode.java | 39 +
.../sa/common/common/code/ErrorCode.java | 52 ++
.../common/code/ErrorCodeRangeContainer.java | 119 +++
.../common/common/code/ErrorCodeRegister.java | 44 ++
.../common/common/code/SystemErrorCode.java | 36 +
.../common/code/UnexpectedErrorCode.java | 36 +
.../sa/common/common/code/UserErrorCode.java | 53 ++
.../common/constant/RequestHeaderConst.java | 18 +
.../common/common/constant/StringConst.java | 44 ++
.../controller/SupportBaseController.java | 16 +
.../common/common/domain/DataScopePlugin.java | 15 +
.../sa/common/common/domain/PageParam.java | 58 ++
.../sa/common/common/domain/PageResult.java | 53 ++
.../sa/common/common/domain/RequestUrlVO.java | 26 +
.../sa/common/common/domain/RequestUser.java | 49 ++
.../sa/common/common/domain/ResponseDTO.java | 114 +++
.../common/domain/SystemEnvironment.java | 35 +
.../sa/common/common/domain/ValidateData.java | 21 +
.../sa/common/common/domain/ValidateList.java | 153 ++++
.../common/common/enumeration/BaseEnum.java | 99 +++
.../common/common/enumeration/GenderEnum.java | 37 +
.../enumeration/SystemEnvironmentEnum.java | 50 ++
.../common/enumeration/UserTypeEnum.java | 38 +
.../sa/common/common/excel/ExcelStyle.java | 185 +++++
.../common/exception/BusinessException.java | 38 +
.../interceptor/AbstractInterceptor.java | 148 ++++
.../deserializer/DictValueVoDeserializer.java | 52 ++
.../deserializer/FileKeyVoDeserializer.java | 53 ++
.../deserializer/LongJsonDeserializer.java | 30 +
.../BigDecimalNullZeroSerializer.java | 29 +
.../serializer/DictValueVoSerializer.java | 52 ++
.../json/serializer/FileKeySerializer.java | 45 ++
.../json/serializer/FileKeyVoSerializer.java | 46 ++
.../json/serializer/LongJsonSerializer.java | 28 +
.../security/AbstractSecurityConfig.java | 95 +++
.../SecurityAuthenticationFailHandler.java | 43 ++
.../common/security/SecurityMethodSource.java | 66 ++
.../SecurityPermissionCheckService.java | 74 ++
.../common/security/SecurityTokenFilter.java | 64 ++
.../common/swagger/ApiModelPropertyEnum.java | 40 ++
.../swagger/Swagger2MapperImplExtension.java | 91 +++
.../SwaggerApiModelPropertyEnumPlugin.java | 77 ++
.../sa/common/common/util/EncryptionKit.java | 79 ++
.../sa/common/common/util/HttpUtil.java | 542 ++++++++++++++
.../sa/common/common/util/Sha256Util.java | 47 ++
.../sa/common/common/util/SmartBeanUtil.java | 94 +++
.../common/util/SmartBigDecimalUtil.java | 247 +++++++
.../common/util/SmartEasyExcelUtil.java | 41 ++
.../common/util/SmartEasyPoiExcelUtil.java | 114 +++
.../sa/common/common/util/SmartEnumUtil.java | 165 +++++
.../sa/common/common/util/SmartPageUtil.java | 122 ++++
.../common/common/util/SmartRequestUtil.java | 38 +
.../common/common/util/SmartStringUtil.java | 334 +++++++++
.../common/util/SmartVerificationUtil.java | 98 +++
.../validator/enumeration/CheckEnum.java | 52 ++
.../validator/enumeration/EnumValidator.java | 75 ++
.../common/wangyi/yidun/enums/PicType.java | 38 +
.../yidun/enums/SignatureMethodEnum.java | 29 +
.../common/wangyi/yidun/resp/APIResponse.java | 48 ++
.../common/wangyi/yidun/resp/APIResult.java | 50 ++
.../wangyi/yidun/sdk/BankCardCheckAPI.java | 97 +++
.../wangyi/yidun/sdk/IdCardCheckAPI.java | 88 +++
.../wangyi/yidun/utils/ConstantUtil.java | 20 +
.../wangyi/yidun/utils/SignatureUtils.java | 71 ++
.../lab1024/sa/common/config/AsyncConfig.java | 71 ++
.../sa/common/config/CorsFilterConfig.java | 45 ++
.../sa/common/config/DataSourceConfig.java | 197 +++++
.../lab1024/sa/common/config/DateConfig.java | 88 +++
.../sa/common/config/FileCloudConfig.java | 85 +++
.../sa/common/config/HeartBeatConfig.java | 37 +
.../lab1024/sa/common/config/MvcConfig.java | 50 ++
.../sa/common/config/MybatisPlusConfig.java | 33 +
.../sa/common/config/PostProcessorConfig.java | 56 ++
.../lab1024/sa/common/config/RedisConfig.java | 72 ++
.../sa/common/config/ReloadConfig.java | 38 +
.../sa/common/config/RepeatSubmitConfig.java | 40 ++
.../sa/common/config/RestTemplateConfig.java | 130 ++++
.../sa/common/config/ScheduleConfig.java | 47 ++
.../sa/common/config/SwaggerConfig.java | 206 ++++++
.../config/SystemEnvironmentConfig.java | 49 ++
.../lab1024/sa/common/config/UrlConfig.java | 150 ++++
.../sa/common/constant/CacheKeyConst.java | 14 +
.../sa/common/constant/RedisKeyConst.java | 31 +
.../sa/common/constant/ReloadConst.java | 18 +
.../sa/common/constant/SwaggerTagConst.java | 49 ++
.../sa/common/constant/UrlPrefixConst.java | 18 +
.../handler/GlobalExceptionHandler.java | 126 ++++
.../listener/SmartApplicationListener.java | 54 ++
.../module/support/cache/CacheService.java | 78 ++
.../support/captcha/CaptchaController.java | 36 +
.../support/captcha/CaptchaService.java | 114 +++
.../support/captcha/config/CaptchaColor.java | 38 +
.../support/captcha/config/CaptchaConfig.java | 46 ++
.../support/captcha/config/CaptchaNoise.java | 44 ++
.../captcha/config/CaptchaWordRenderer.java | 74 ++
.../support/captcha/domain/CaptchaForm.java | 28 +
.../support/captcha/domain/CaptchaVO.java | 29 +
.../changelog/constant/ChangeLogTypeEnum.java | 28 +
.../controller/ChangeLogController.java | 38 +
.../support/changelog/dao/ChangeLogDao.java | 44 ++
.../domain/entity/ChangeLogEntity.java | 68 ++
.../domain/form/ChangeLogAddForm.java | 46 ++
.../domain/form/ChangeLogQueryForm.java | 42 ++
.../domain/form/ChangeLogUpdateForm.java | 50 ++
.../changelog/domain/vo/ChangeLogVO.java | 49 ++
.../changelog/manager/ChangeLogManager.java | 20 +
.../changelog/service/ChangeLogService.java | 103 +++
.../constant/CodeDeleteEnum.java | 38 +
.../constant/CodeFrontComponentEnum.java | 52 ++
.../constant/CodeGeneratorConstant.java | 30 +
.../constant/CodeGeneratorPageTypeEnum.java | 38 +
.../constant/CodeQueryFieldQueryTypeEnum.java | 43 ++
.../controller/CodeGeneratorController.java | 106 +++
.../dao/CodeGeneratorConfigDao.java | 20 +
.../codegenerator/dao/CodeGeneratorDao.java | 45 ++
.../entity/CodeGeneratorConfigEntity.java | 74 ++
.../domain/form/CodeGeneratorConfigForm.java | 64 ++
.../domain/form/CodeGeneratorPreviewForm.java | 28 +
.../domain/form/TableQueryForm.java | 23 +
.../codegenerator/domain/model/CodeBasic.java | 55 ++
.../domain/model/CodeDelete.java | 40 ++
.../codegenerator/domain/model/CodeField.java | 59 ++
.../domain/model/CodeInsertAndUpdate.java | 42 ++
.../model/CodeInsertAndUpdateField.java | 46 ++
.../domain/model/CodeQueryField.java | 47 ++
.../domain/model/CodeTableField.java | 46 ++
.../domain/vo/TableColumnVO.java | 44 ++
.../domain/vo/TableConfigVO.java | 40 ++
.../codegenerator/domain/vo/TableVO.java | 37 +
.../service/CodeGeneratorService.java | 228 ++++++
.../service/CodeGeneratorTemplateService.java | 238 ++++++
.../CodeGenerateBaseVariableService.java | 162 +++++
.../backend/ControllerVariableService.java | 78 ++
.../variable/backend/DaoVariableService.java | 59 ++
.../backend/ManagerVariableService.java | 55 ++
.../backend/ServiceVariableService.java | 62 ++
.../domain/AddFormVariableService.java | 131 ++++
.../domain/DeleteFormVariableService.java | 130 ++++
.../backend/domain/EntityVariableService.java | 73 ++
.../backend/domain/MapperVariableService.java | 93 +++
.../domain/QueryFormVariableService.java | 128 ++++
.../domain/UpdateFormVariableService.java | 145 ++++
.../backend/domain/VOVariableService.java | 115 +++
.../variable/front/ApiVariableService.java | 29 +
.../variable/front/ConstVariableService.java | 45 ++
.../variable/front/FormVariableService.java | 82 +++
.../variable/front/ListVariableService.java | 57 ++
.../codegenerator/util/CodeGeneratorTool.java | 59 ++
.../support/config/ConfigController.java | 36 +
.../module/support/config/ConfigDao.java | 41 ++
.../module/support/config/ConfigKeyEnum.java | 40 ++
.../module/support/config/ConfigService.java | 205 ++++++
.../support/config/domain/ConfigAddForm.java | 39 +
.../support/config/domain/ConfigEntity.java | 49 ++
.../config/domain/ConfigQueryForm.java | 23 +
.../config/domain/ConfigUpdateForm.java | 23 +
.../support/config/domain/ConfigVO.java | 39 +
.../annoation/DataTracerFieldBigDecimal.java | 21 +
.../annoation/DataTracerFieldDict.java | 22 +
.../annoation/DataTracerFieldEnum.java | 25 +
.../annoation/DataTracerFieldLabel.java | 26 +
.../annoation/DataTracerFieldSql.java | 40 ++
.../datatracer/constant/DataTracerConst.java | 27 +
.../constant/DataTracerTypeEnum.java | 32 +
.../controller/DataTracerController.java | 40 ++
.../support/datatracer/dao/DataTracerDao.java | 42 ++
.../domain/bo/DataTracerContentBO.java | 39 +
.../domain/entity/DataTracerEntity.java | 90 +++
.../domain/form/DataTracerForm.java | 54 ++
.../domain/form/DataTracerQueryForm.java | 32 +
.../datatracer/domain/vo/DataTracerVO.java | 62 ++
.../datatracer/manager/DataTracerManger.java | 19 +
.../DataTracerChangeContentService.java | 486 +++++++++++++
.../datatracer/service/DataTracerService.java | 224 ++++++
.../dict/controller/DictController.java | 63 ++
.../module/support/dict/dao/DictKeyDao.java | 58 ++
.../module/support/dict/dao/DictValueDao.java | 69 ++
.../dict/domain/entity/DictKeyEntity.java | 54 ++
.../dict/domain/entity/DictValueEntity.java | 58 ++
.../dict/domain/form/DictKeyAddForm.java | 34 +
.../dict/domain/form/DictKeyQueryForm.java | 24 +
.../dict/domain/form/DictKeyUpdateForm.java | 23 +
.../dict/domain/form/DictValueAddForm.java | 44 ++
.../dict/domain/form/DictValueQueryForm.java | 30 +
.../dict/domain/form/DictValueUpdateForm.java | 23 +
.../support/dict/domain/vo/DictKeyVO.java | 29 +
.../support/dict/domain/vo/DictValueVO.java | 35 +
.../dict/service/DictCacheService.java | 133 ++++
.../support/dict/service/DictService.java | 196 +++++
.../controller/FeedbackController.java | 53 ++
.../support/feedback/dao/FeedbackDao.java | 31 +
.../feedback/domain/FeedbackAddForm.java | 31 +
.../feedback/domain/FeedbackEntity.java | 62 ++
.../feedback/domain/FeedbackQueryForm.java | 31 +
.../support/feedback/domain/FeedbackVO.java | 49 ++
.../feedback/service/FeedbackService.java | 62 ++
.../file/constant/FileFolderTypeEnum.java | 49 ++
.../file/controller/FileController.java | 72 ++
.../module/support/file/dao/FileDao.java | 44 ++
.../file/domain/entity/FileEntity.java | 73 ++
.../file/domain/form/FileQueryForm.java | 47 ++
.../file/domain/form/FileUrlUploadForm.java | 31 +
.../file/domain/vo/FileDownloadVO.java | 28 +
.../file/domain/vo/FileMetadataVO.java | 31 +
.../support/file/domain/vo/FileUploadVO.java | 35 +
.../module/support/file/domain/vo/FileVO.java | 56 ++
.../support/file/service/FileService.java | 207 ++++++
.../service/FileStorageCloudServiceImpl.java | 215 ++++++
.../service/FileStorageLocalServiceImpl.java | 157 ++++
.../file/service/IFileStorageService.java | 209 ++++++
.../support/heartbeat/HeartBeatRecordDao.java | 51 ++
.../heartbeat/HeartBeatRecordHandler.java | 42 ++
.../support/heartbeat/HeartBeatService.java | 38 +
.../heartbeat/core/HeartBeatManager.java | 59 ++
.../heartbeat/core/HeartBeatRecord.java | 41 ++
.../heartbeat/core/HeartBeatRunnable.java | 71 ++
.../core/IHeartBeatRecordHandler.java | 20 +
.../domain/HeartBeatRecordEntity.java | 53 ++
.../domain/HeartBeatRecordQueryForm.java | 30 +
.../heartbeat/domain/HeartBeatRecordVO.java | 38 +
.../helpdoc/controller/HelpDocController.java | 77 ++
.../helpdoc/dao/HelpDocCatalogDao.java | 21 +
.../support/helpdoc/dao/HelpDocDao.java | 137 ++++
.../domain/entity/HelpDocCatalogEntity.java | 53 ++
.../helpdoc/domain/entity/HelpDocEntity.java | 77 ++
.../helpdoc/domain/form/HelpDocAddForm.java | 57 ++
.../domain/form/HelpDocCatalogAddForm.java | 31 +
.../domain/form/HelpDocCatalogUpdateForm.java | 23 +
.../helpdoc/domain/form/HelpDocQueryForm.java | 33 +
.../domain/form/HelpDocRelationForm.java | 28 +
.../domain/form/HelpDocUpdateForm.java | 24 +
.../form/HelpDocViewRecordQueryForm.java | 32 +
.../helpdoc/domain/vo/HelpDocCatalogVO.java | 30 +
.../helpdoc/domain/vo/HelpDocDetailVO.java | 62 ++
.../helpdoc/domain/vo/HelpDocRecordVO.java | 49 ++
.../helpdoc/domain/vo/HelpDocRelationVO.java | 23 +
.../support/helpdoc/domain/vo/HelpDocVO.java | 50 ++
.../domain/vo/HelpDocViewRecordVO.java | 46 ++
.../helpdoc/manager/HelpDocManager.java | 60 ++
.../service/HelpDocCatalogService.java | 115 +++
.../helpdoc/service/HelpDocService.java | 117 +++
.../helpdoc/service/HelpDocUserService.java | 85 +++
.../module/support/jwe/DecryptData.java | 18 +
.../common/module/support/jwe/JweAspect.java | 128 ++++
.../common/module/support/jwe/JweDecrypt.java | 20 +
.../common/module/support/jwe/JweEncrypt.java | 20 +
.../common/module/support/jwe/JweUserKey.java | 32 +
.../module/support/loginlog/LoginLogDao.java | 46 ++
.../support/loginlog/LoginLogResultEnum.java | 37 +
.../support/loginlog/LoginLogService.java | 67 ++
.../loginlog/domain/LoginLogEntity.java | 67 ++
.../loginlog/domain/LoginLogQueryForm.java | 31 +
.../support/loginlog/domain/LoginLogVO.java | 48 ++
.../support/operatelog/OperateLogDao.java | 49 ++
.../support/operatelog/OperateLogService.java | 57 ++
.../operatelog/annoation/OperateLog.java | 19 +
.../operatelog/core/OperateLogAspect.java | 274 +++++++
.../operatelog/core/OperateLogConfig.java | 38 +
.../operatelog/domain/OperateLogEntity.java | 106 +++
.../domain/OperateLogQueryForm.java | 33 +
.../operatelog/domain/OperateLogVO.java | 72 ++
.../module/support/redis/RedisService.java | 222 ++++++
.../module/support/reload/ReloadCommand.java | 56 ++
.../module/support/reload/ReloadService.java | 68 ++
.../core/AbstractSmartReloadCommand.java | 96 +++
.../reload/core/SmartReloadManager.java | 97 +++
.../reload/core/annoation/SmartReload.java | 22 +
.../reload/core/domain/SmartReloadItem.java | 32 +
.../reload/core/domain/SmartReloadObject.java | 32 +
.../reload/core/domain/SmartReloadResult.java | 43 ++
.../core/thread/SmartReloadRunnable.java | 120 ++++
.../support/reload/dao/ReloadItemDao.java | 25 +
.../support/reload/dao/ReloadResultDao.java | 26 +
.../support/reload/domain/ReloadForm.java | 31 +
.../reload/domain/ReloadItemEntity.java | 50 ++
.../support/reload/domain/ReloadItemVO.java | 36 +
.../reload/domain/ReloadResultEntity.java | 53 ++
.../support/reload/domain/ReloadResultVO.java | 34 +
.../repeatsubmit/RepeatSubmitAspect.java | 90 +++
.../repeatsubmit/annoation/RepeatSubmit.java | 33 +
.../ticket/AbstractRepeatSubmitTicket.java | 56 ++
.../ticket/RepeatSubmitCaffeineTicket.java | 50 ++
.../ticket/RepeatSubmitRedisTicket.java | 48 ++
.../constant/SerialNumberIdEnum.java | 42 ++
.../constant/SerialNumberRuleTypeEnum.java | 44 ++
.../serialnumber/dao/SerialNumberDao.java | 41 ++
.../dao/SerialNumberRecordDao.java | 55 ++
.../domain/SerialNumberEntity.java | 79 ++
.../domain/SerialNumberGenerateForm.java | 28 +
.../domain/SerialNumberGenerateResultBO.java | 52 ++
.../domain/SerialNumberInfoBO.java | 97 +++
.../domain/SerialNumberLastGenerateBO.java | 41 ++
.../domain/SerialNumberRecordEntity.java | 57 ++
.../domain/SerialNumberRecordQueryForm.java | 24 +
.../service/SerialNumberBaseService.java | 252 +++++++
.../service/SerialNumberRecordService.java | 39 +
.../service/SerialNumberService.java | 36 +
.../impl/SerialNumberInternService.java | 78 ++
.../impl/SerialNumberMysqlService.java | 61 ++
.../impl/SerialNumberRedisService.java | 105 +++
.../support/table/TableColumnController.java | 51 ++
.../module/support/table/TableColumnDao.java | 23 +
.../support/table/TableColumnService.java | 72 ++
.../table/domain/TableColumnEntity.java | 49 ++
.../table/domain/TableColumnItemForm.java | 37 +
.../table/domain/TableColumnUpdateForm.java | 27 +
.../common/module/support/token/JwtConst.java | 38 +
.../module/support/token/LoginDeviceEnum.java | 43 ++
.../module/support/token/TokenService.java | 220 ++++++
.../main/resources/META-INF/spring.factories | 2 +
sa-common/src/main/resources/banner.txt | 7 +
.../java/constant/enum.java.vm | 24 +
.../java/controller/Controller.java.vm | 68 ++
.../java/dao/Dao.java.vm | 51 ++
.../java/domain/entity/Entity.java.vm | 32 +
.../java/domain/form/AddForm.java.vm | 30 +
.../java/domain/form/QueryForm.java.vm | 38 +
.../java/domain/form/UpdateForm.java.vm | 30 +
.../java/domain/vo/VO.java.vm | 32 +
.../java/manager/Manager.java.vm | 21 +
.../java/mapper/Mapper.xml.vm | 74 ++
.../java/service/Service.java.vm | 108 +++
.../code-generator-template/js/api.js.vm | 78 ++
.../code-generator-template/js/const.js.vm | 23 +
.../code-generator-template/js/form.vue.vm | 235 ++++++
.../code-generator-template/js/list.vue.vm | 314 ++++++++
.../code-generator-template/tools.xml | 7 +
.../src/main/resources/dev/sa-common.yaml | 127 ++++
.../mapper/support/ChangeLogMapper.xml | 47 ++
.../mapper/support/CodeGeneratorMapper.xml | 36 +
.../resources/mapper/support/ConfigMapper.xml | 22 +
.../mapper/support/DataTracerMapper.xml | 31 +
.../mapper/support/DictKeyMapper.xml | 37 +
.../mapper/support/DictValueMapper.xml | 44 ++
.../mapper/support/FeedbackMapper.xml | 26 +
.../resources/mapper/support/FileMapper.xml | 49 ++
.../mapper/support/HeartBeatRecordMapper.xml | 37 +
.../resources/mapper/support/HelpDocDao.xml | 130 ++++
.../mapper/support/LoginLogMapper.xml | 37 +
.../mapper/support/OperateLogMapper.xml | 37 +
.../mapper/support/ReloadItemMapper.xml | 10 +
.../mapper/support/ReloadResultMapper.xml | 10 +
.../mapper/support/SerialNumberMapper.xml | 21 +
.../support/SerialNumberRecordMapper.xml | 32 +
.../mapper/support/TableColumnMapper.xml | 18 +
.../src/main/resources/pre/sa-common.yaml | 127 ++++
.../main/resources/prod----ttt/sa-common.yaml | 127 ++++
.../src/main/resources/test/sa-common.yaml | 128 ++++
721 files changed, 47462 insertions(+)
create mode 100644 .gitignore
create mode 100644 Dockerfile
create mode 100644 pom.xml
create mode 100644 sa-admin/pom.xml
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/SmartAdminApplication.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/common/AdminBaseController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/config/JweAspectConfig.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/config/OperateLogAspectConfig.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityConfig.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityMethodConfig.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminRedisKeyConst.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminSwaggerTagConst.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/listener/AdminStartupRunner.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertBankVerify.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertLoginVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertRegisterForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertWhiteEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/LoginForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/PWDLoginForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/SmsLoginForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/ImageType.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/SmsTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertSignController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertSignDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertWhiteEntityDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertSignService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertWhiteEntityService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/constant/OSSFileTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/controller/OSSFileController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/domain/OSSPolicyVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/controller/MedicalRecordController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorAbstracDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorCheckDataDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDpmasDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorUserDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/DpmsAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAbstracEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordCheckdataEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDTO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDetailVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDpmsEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordListVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUserEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/service/MedicalRecordService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/controller/AreaController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/dao/AreaDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/entity/AreaEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/form/AreaQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/AreaVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/ProvVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/manager/AreaManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/service/AreaService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/controller/CaseplatformBankController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/dao/CaseplatformBankDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/entity/CaseplatformBankEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/vo/CaseplatformBankVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/manager/CaseplatformBankManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/service/CaseplatformBankService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/controller/CaptchaController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/dao/CaptchaDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/entity/CaptchaEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/from/CaptchaAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/service/CaptchaService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseSettlementEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseStatusEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CasetypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseCaseSettlConverter.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseStatusConverter.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CasetypeConverter.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/dao/CaseplatformCaseDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/entity/CaseplatformCaseEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CancelExamineForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseDetailVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/EasyExcelCaseDetailVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/manager/CaseplatformCaseManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/service/CaseplatformCaseService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/controller/CaseplatformCaseAbstracController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/dao/CaseplatformCaseAbstracDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/entity/CaseplatformCaseAbstracEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/form/CaseplatformCaseAbstracQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/vo/CaseplatformCaseAbstracVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/manager/CaseplatformCaseAbstracManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/service/CaseplatformCaseAbstracService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/controller/CaseplatformCaseCheckdataController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/dao/CaseplatformCaseCheckdataDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/entity/CaseplatformCaseCheckdataEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/form/CaseplatformCaseCheckdataQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/vo/CaseplatformCaseCheckdataVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/manager/CaseplatformCaseCheckdataManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/service/CaseplatformCaseCheckdataService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/controller/CaseplatformCaseDpmsController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/dao/CaseplatformCaseDpmsDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/entity/CaseplatformCaseDpmsEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/form/CaseplatformCaseDpmsQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/vo/CaseplatformCaseDpmsVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/manager/CaseplatformCaseDpmsManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/service/CaseplatformCaseDpmsService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/constant/SexEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/controller/CaseplatformUserController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/dao/CaseplatformUserDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/entity/CaseplatformUserEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/form/CaseplatformUserQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/vo/CaseplatformUserVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/manager/CaseplatformUserManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/service/CaseplatformUserService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/constant/CategoryTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/controller/CategoryController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/dao/CategoryDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategoryBaseDTO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategorySimpleDTO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryTreeQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/manager/CategoryCacheManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryQueryService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/constant/GoodsStatusEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/controller/GoodsController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/dao/GoodsDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/entity/GoodsEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/manager/GoodsManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankCreateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseEmployeeManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/constant/EnterpriseTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/dao/EnterpriseDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/dao/EnterpriseEmployeeDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/entity/EnterpriseEmployeeEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/entity/EnterpriseEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/form/EnterpriseCreateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/form/EnterpriseEmployeeForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/form/EnterpriseEmployeeQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/form/EnterpriseQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/form/EnterpriseUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseEmployeeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseListVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/InvoiceController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/InvoiceDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/InvoiceService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/domain/InvoiceAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/domain/InvoiceEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/domain/InvoiceQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/domain/InvoiceUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/domain/InvoiceVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/constant/NoticeVisibleRangeDataTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/controller/NoticeController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/dao/NoticeDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/dao/NoticeTypeDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/entity/NoticeEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/entity/NoticeTypeEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeEmployeeQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeViewRecordQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeVisibleRangeForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeDetailVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeEmployeeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeTypeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeUpdateFormVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeViewRecordVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/vo/NoticeVisibleRangeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/manager/NoticeManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeEmployeeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeTypeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/controller/StatisticsController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/dao/StatisticsDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/HospitalQureyForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/HospitalVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/StatisticsExpertQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/StatisticsExpertVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/SystemActualEcharsData.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/SystemActualNumQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/domain/SystemActualNumVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/statistics/service/StatisticsService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/token/dao/TokenDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/token/domain/entity/TokenEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/token/service/TokenService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/DataScope.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/DataScopeController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/MyBatisPlugin.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeViewTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeAndViewTypeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeDTO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeSqlConfig.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeViewTypeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeSqlConfigService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeViewService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/strategy/DataScopePowerStrategy.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/controller/DepartmentController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/entity/DepartmentEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/form/DepartmentAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/form/DepartmentUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentEmployeeTreeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentTreeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/controller/EmployeeController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/dao/EmployeeDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/entity/EmployeeEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeBatchUpdateDepartmentForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdatePasswordForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdateRoleForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/vo/EmployeeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/manager/EmployeeManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/service/EmployeePermissionService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/service/EmployeeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/controller/LoginController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginEmployeeDetail.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/constant/MenuPermsTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/constant/MenuTypeEnum.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/controller/MenuController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/dao/MenuDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/entity/MenuEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/form/MenuAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/form/MenuBaseForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/form/MenuPointsOperateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/form/MenuUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/vo/MenuSimpleTreeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/vo/MenuTreeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/domain/vo/MenuVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/manager/MenuManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/service/MenuService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/controller/RoleController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/controller/RoleDataScopeController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/controller/RoleEmployeeController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/controller/RoleMenuController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/controller/RoleProvCntroller.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/dao/RoleDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/dao/RoleDataScopeDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/dao/RoleEmployeeDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/dao/RoleMenuDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/dao/RoleProvDao.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/entity/RoleDataScopeEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/entity/RoleEmployeeEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/entity/RoleEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/entity/RoleMenuEntity.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleAddForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleDataScopeUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleEmployeeQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleEmployeeUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleMenuUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleProvUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleQueryForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/form/RoleUpdateForm.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/vo/RoleDataScopeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/vo/RoleEmployeeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/vo/RoleMenuTreeVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/vo/RoleSelectedVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/domain/vo/RoleVO.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleDataScopeManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleEmployeeManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleMenuManager.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/service/RoleDataScopeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/service/RoleEmployeeService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/service/RoleMenuService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/service/RoleProvService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/service/RoleService.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminChangeLogController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminConfigController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminDictController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminFileController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminHeartBeatController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminHelpDocController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminLoginLogController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminOperateLogController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminReloadController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminSerialNumberController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/config/WxMaConfiguration.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/config/WxMaProperties.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/controller/WxMaMediaController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/controller/WxMaUserController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/controller/WxPortalController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/error/ErrorController.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/error/ErrorPageConfiguration.java
create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/wx/miniapp/utils/JsonUtils.java
create mode 100644 sa-admin/src/main/resources/dev/application.yaml
create mode 100644 sa-admin/src/main/resources/dev/log4j2.xml
create mode 100644 sa-admin/src/main/resources/dev/spy.properties
create mode 100644 sa-admin/src/main/resources/mapper/app/expert/ExpertMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/app/medicalrecord/MedicalRecordDpmasMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/app/medicalrecord/MedicalRecordMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/area/AreaMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/bankcard/CaseplatformBankMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/captcha/CaptchaMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/caseplatformcase/CaseplatformCaseMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/caseplatformcaseabstrac/CaseplatformCaseAbstracMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/caseplatformcasecheckdata/CaseplatformCaseCheckdataMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/caseplatformcasedpms/CaseplatformCaseDpmsMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/caseplatformuser/CaseplatformUserMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/category/CategoryMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/goods/GoodsMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/notice/NoticeMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/oa/bank/BankMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/oa/enterprise/EnterpriseEmployeeMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/oa/enterprise/EnterpriseMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/oa/invoice/InvoiceMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/oa/notice/NoticeDao.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/statistics/StatisticMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/business/token/TokenMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/menu/MenuMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/role/RoleDataScopeMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/role/RoleMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml
create mode 100644 sa-admin/src/main/resources/mapper/system/role/RoleProvMapper.xml
create mode 100644 sa-admin/src/main/resources/pre/application.yaml
create mode 100644 sa-admin/src/main/resources/pre/log4j2.xml
create mode 100644 sa-admin/src/main/resources/prod/application.yaml
create mode 100644 sa-admin/src/main/resources/prod/log4j2.xml
create mode 100644 sa-admin/src/main/resources/test/application.yaml
create mode 100644 sa-admin/src/main/resources/test/log4j2.xml
create mode 100644 sa-admin/src/main/resources/test/spy.properties
create mode 100644 sa-admin/src/test/java/net/lab1024/sa/admin/SmartAdminApplicationTest.java
create mode 100644 sa-common/pom.xml
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/annoation/NoNeedLogin.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/annoation/SaAuth.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/AppErrorCode.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/ErrorCode.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/ErrorCodeRangeContainer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/ErrorCodeRegister.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/SystemErrorCode.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/UnexpectedErrorCode.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/code/UserErrorCode.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/constant/RequestHeaderConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/constant/StringConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/controller/SupportBaseController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/DataScopePlugin.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/PageParam.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/PageResult.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/RequestUrlVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/RequestUser.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/ResponseDTO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/SystemEnvironment.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/ValidateData.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/domain/ValidateList.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/enumeration/BaseEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/enumeration/GenderEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/enumeration/SystemEnvironmentEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/enumeration/UserTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/excel/ExcelStyle.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/exception/BusinessException.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/interceptor/AbstractInterceptor.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/deserializer/DictValueVoDeserializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/deserializer/FileKeyVoDeserializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/deserializer/LongJsonDeserializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/serializer/BigDecimalNullZeroSerializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/serializer/DictValueVoSerializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/serializer/FileKeySerializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/serializer/FileKeyVoSerializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/json/serializer/LongJsonSerializer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/security/AbstractSecurityConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/security/SecurityAuthenticationFailHandler.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/security/SecurityMethodSource.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/security/SecurityPermissionCheckService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/security/SecurityTokenFilter.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/swagger/ApiModelPropertyEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/swagger/Swagger2MapperImplExtension.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/swagger/SwaggerApiModelPropertyEnumPlugin.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/EncryptionKit.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/HttpUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/Sha256Util.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartBeanUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartBigDecimalUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartEasyExcelUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartEasyPoiExcelUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartEnumUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartPageUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartRequestUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartStringUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartVerificationUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/validator/enumeration/CheckEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/validator/enumeration/EnumValidator.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/enums/PicType.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/enums/SignatureMethodEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/resp/APIResponse.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/resp/APIResult.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/sdk/BankCardCheckAPI.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/sdk/IdCardCheckAPI.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/utils/ConstantUtil.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/common/wangyi/yidun/utils/SignatureUtils.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/AsyncConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/CorsFilterConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/DataSourceConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/DateConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/FileCloudConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/HeartBeatConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/MvcConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/MybatisPlusConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/PostProcessorConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/RedisConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/ReloadConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/RepeatSubmitConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/RestTemplateConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/ScheduleConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/SwaggerConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/SystemEnvironmentConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/config/UrlConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/constant/CacheKeyConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/constant/RedisKeyConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/constant/ReloadConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/constant/SwaggerTagConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/constant/UrlPrefixConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/handler/GlobalExceptionHandler.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/listener/SmartApplicationListener.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/cache/CacheService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/CaptchaController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/CaptchaService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/config/CaptchaColor.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/config/CaptchaConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/config/CaptchaNoise.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/config/CaptchaWordRenderer.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/domain/CaptchaForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/captcha/domain/CaptchaVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/constant/ChangeLogTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/controller/ChangeLogController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/dao/ChangeLogDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/domain/entity/ChangeLogEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/domain/form/ChangeLogAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/domain/form/ChangeLogQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/domain/form/ChangeLogUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/domain/vo/ChangeLogVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/manager/ChangeLogManager.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/changelog/service/ChangeLogService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/constant/CodeDeleteEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/constant/CodeFrontComponentEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/constant/CodeGeneratorConstant.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/constant/CodeGeneratorPageTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/constant/CodeQueryFieldQueryTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/controller/CodeGeneratorController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/dao/CodeGeneratorConfigDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/dao/CodeGeneratorDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/entity/CodeGeneratorConfigEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/form/CodeGeneratorConfigForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/form/CodeGeneratorPreviewForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/form/TableQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeBasic.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeDelete.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeField.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeInsertAndUpdate.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeInsertAndUpdateField.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeQueryField.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/model/CodeTableField.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/vo/TableColumnVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/vo/TableConfigVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/domain/vo/TableVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/CodeGeneratorService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/CodeGeneratorTemplateService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/CodeGenerateBaseVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/ControllerVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/DaoVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/ManagerVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/ServiceVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/AddFormVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/DeleteFormVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/EntityVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/QueryFormVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/UpdateFormVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/backend/domain/VOVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/front/ApiVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/front/ConstVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/front/FormVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/service/variable/front/ListVariableService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/codegenerator/util/CodeGeneratorTool.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/ConfigController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/ConfigDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/ConfigKeyEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/ConfigService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/domain/ConfigAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/domain/ConfigEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/domain/ConfigQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/domain/ConfigUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/config/domain/ConfigVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/annoation/DataTracerFieldBigDecimal.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/annoation/DataTracerFieldDict.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/annoation/DataTracerFieldEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/annoation/DataTracerFieldLabel.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/annoation/DataTracerFieldSql.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/constant/DataTracerConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/constant/DataTracerTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/controller/DataTracerController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/dao/DataTracerDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/domain/bo/DataTracerContentBO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/domain/entity/DataTracerEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/domain/form/DataTracerForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/domain/form/DataTracerQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/domain/vo/DataTracerVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/manager/DataTracerManger.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/service/DataTracerChangeContentService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/datatracer/service/DataTracerService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/controller/DictController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/dao/DictKeyDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/dao/DictValueDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/entity/DictKeyEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/entity/DictValueEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/form/DictKeyAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/form/DictKeyQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/form/DictKeyUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/form/DictValueAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/form/DictValueQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/form/DictValueUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/vo/DictKeyVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/domain/vo/DictValueVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/service/DictCacheService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/dict/service/DictService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/controller/FeedbackController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/dao/FeedbackDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/domain/FeedbackAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/domain/FeedbackEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/domain/FeedbackQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/domain/FeedbackVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/feedback/service/FeedbackService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/constant/FileFolderTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/controller/FileController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/dao/FileDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/entity/FileEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/form/FileQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/form/FileUrlUploadForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/vo/FileDownloadVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/vo/FileMetadataVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/vo/FileUploadVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/domain/vo/FileVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/service/FileService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/service/FileStorageCloudServiceImpl.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/service/FileStorageLocalServiceImpl.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/file/service/IFileStorageService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/HeartBeatRecordDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/HeartBeatRecordHandler.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/HeartBeatService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/core/HeartBeatManager.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/core/HeartBeatRecord.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/core/HeartBeatRunnable.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/core/IHeartBeatRecordHandler.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/domain/HeartBeatRecordEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/domain/HeartBeatRecordQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/heartbeat/domain/HeartBeatRecordVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/controller/HelpDocController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/dao/HelpDocCatalogDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/dao/HelpDocDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/entity/HelpDocCatalogEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/entity/HelpDocEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocCatalogAddForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocCatalogUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocRelationForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/form/HelpDocViewRecordQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/vo/HelpDocCatalogVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/vo/HelpDocDetailVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/vo/HelpDocRecordVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/vo/HelpDocRelationVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/vo/HelpDocVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/domain/vo/HelpDocViewRecordVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/manager/HelpDocManager.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/service/HelpDocCatalogService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/service/HelpDocService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/helpdoc/service/HelpDocUserService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/jwe/DecryptData.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/jwe/JweAspect.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/jwe/JweDecrypt.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/jwe/JweEncrypt.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/jwe/JweUserKey.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/loginlog/LoginLogDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/loginlog/LoginLogResultEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/loginlog/LoginLogService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/loginlog/domain/LoginLogEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/loginlog/domain/LoginLogQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/loginlog/domain/LoginLogVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/OperateLogDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/OperateLogService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/annoation/OperateLog.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/core/OperateLogAspect.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/core/OperateLogConfig.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/domain/OperateLogEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/domain/OperateLogQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/operatelog/domain/OperateLogVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/redis/RedisService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/ReloadCommand.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/ReloadService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/AbstractSmartReloadCommand.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/SmartReloadManager.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/annoation/SmartReload.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/domain/SmartReloadItem.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/domain/SmartReloadObject.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/domain/SmartReloadResult.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/core/thread/SmartReloadRunnable.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/dao/ReloadItemDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/dao/ReloadResultDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/domain/ReloadForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/domain/ReloadItemEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/domain/ReloadItemVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/domain/ReloadResultEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/reload/domain/ReloadResultVO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/repeatsubmit/RepeatSubmitAspect.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/repeatsubmit/annoation/RepeatSubmit.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/repeatsubmit/ticket/AbstractRepeatSubmitTicket.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/repeatsubmit/ticket/RepeatSubmitCaffeineTicket.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/repeatsubmit/ticket/RepeatSubmitRedisTicket.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/constant/SerialNumberIdEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/constant/SerialNumberRuleTypeEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/dao/SerialNumberDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/dao/SerialNumberRecordDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberGenerateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberGenerateResultBO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberInfoBO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberLastGenerateBO.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberRecordEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/domain/SerialNumberRecordQueryForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/service/SerialNumberBaseService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/service/SerialNumberRecordService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/service/SerialNumberService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/service/impl/SerialNumberInternService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/service/impl/SerialNumberMysqlService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/serialnumber/service/impl/SerialNumberRedisService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/table/TableColumnController.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/table/TableColumnDao.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/table/TableColumnService.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/table/domain/TableColumnEntity.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/table/domain/TableColumnItemForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/table/domain/TableColumnUpdateForm.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/token/JwtConst.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/token/LoginDeviceEnum.java
create mode 100644 sa-common/src/main/java/net/lab1024/sa/common/module/support/token/TokenService.java
create mode 100644 sa-common/src/main/resources/META-INF/spring.factories
create mode 100644 sa-common/src/main/resources/banner.txt
create mode 100644 sa-common/src/main/resources/code-generator-template/java/constant/enum.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/controller/Controller.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/dao/Dao.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/domain/entity/Entity.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/domain/form/AddForm.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/domain/form/QueryForm.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/domain/form/UpdateForm.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/domain/vo/VO.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/manager/Manager.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/mapper/Mapper.xml.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/java/service/Service.java.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/js/api.js.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/js/const.js.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/js/form.vue.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/js/list.vue.vm
create mode 100644 sa-common/src/main/resources/code-generator-template/tools.xml
create mode 100644 sa-common/src/main/resources/dev/sa-common.yaml
create mode 100644 sa-common/src/main/resources/mapper/support/ChangeLogMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/CodeGeneratorMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/ConfigMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/DataTracerMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/DictKeyMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/DictValueMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/FeedbackMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/FileMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/HeartBeatRecordMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/HelpDocDao.xml
create mode 100644 sa-common/src/main/resources/mapper/support/LoginLogMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/OperateLogMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/ReloadItemMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/ReloadResultMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/SerialNumberMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/SerialNumberRecordMapper.xml
create mode 100644 sa-common/src/main/resources/mapper/support/TableColumnMapper.xml
create mode 100644 sa-common/src/main/resources/pre/sa-common.yaml
create mode 100644 sa-common/src/main/resources/prod----ttt/sa-common.yaml
create mode 100644 sa-common/src/main/resources/test/sa-common.yaml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..23d109a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,57 @@
+HELP.md
+target/
+
+velocity.log
+
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+.DS_Store
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+
+### VS Code ###
+.vscode/
+/logs
+*.log
+*.class
+*.ctxt
+.mtj.tmp/
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+hs_err_pid*
+replay_pid*
+*.vue
+*.js
+*.ts
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..7b9ff1a
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,41 @@
+# 第一阶段:使用 Maven + Java8 构建 JAR 包
+FROM maven:3.9.2-eclipse-temurin-8-alpine AS builder
+
+WORKDIR /app
+
+# 添加国内 Maven 镜像源
+RUN mkdir -p /root/.m2 && \
+ echo ' \
+ \
+ \
+ aliyun \
+ * \
+ aliyun maven \
+ https://maven.aliyun.com/repository/public \
+ \
+ \
+ ' > /root/.m2/settings.xml
+
+# 复制项目代码
+COPY pom.xml .
+COPY src ./src
+
+# 构建项目
+RUN mvn clean package -DskipTests
+
+# 第二阶段:使用更小的 Java8 JDK 镜像运行
+FROM eclipse-temurin:8-jdk-alpine
+
+WORKDIR /app
+
+# 复制构建产物
+COPY --from=builder /app/target/*.jar app.jar
+
+# 暴露端口(请替换成你实际应用端口)
+EXPOSE 5477
+
+# 启动应用
+ENTRYPOINT ["java", "-jar", "app.jar"]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..df86870
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,390 @@
+
+ 4.0.0
+
+ net.1024lab
+ sa-parent
+ 1.0.0
+ pom
+
+ sa-parent
+ SmartAdmin project
+
+
+ sa-common
+ sa-admin
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 2.7.5
+ 2.0.8
+ 3.5.2
+ 3.8.6
+ 2.7.0
+ 2.0.16
+ 1.2.14
+ 1.4.2
+ 20.0
+ 1.21
+ 2.3.2
+ 0.9.11
+ 2.6
+ 3.12.0
+ 4.4
+ 1.13
+ 4.2.0
+ 2.12.0
+ 4.1.1
+ 1.3
+ 1.11.842
+ 2.17.2
+ 5.7.22
+ 2.3
+ 0.9.1
+ 0.9.0
+ 3.1
+ 3.3.3
+ 3.15.1
+ 4.6.0
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${springboot.version}
+ pom
+ import
+
+
+
+
+ org.springframework
+ spring-mock
+ ${spring-mock.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+
+ p6spy
+ p6spy
+ ${p6spy.version}
+
+
+
+ io.springfox
+ springfox-swagger2
+ ${swagger.version}
+
+
+ guava
+ com.google.guava
+
+
+
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${swagger.version}
+
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
+ com.googlecode.concurrentlinkedhashmap
+ concurrentlinkedhashmap-lru
+ ${google-linkedhashmap.version}
+
+
+
+ com.google.guava
+ guava
+ ${google-guava.version}
+
+
+
+ eu.bitwalker
+ UserAgentUtils
+ ${user-agent-utils.version}
+
+
+
+ com.github.penggle
+ kaptcha
+ ${kaptcha.version}
+
+
+
+ org.reflections
+ reflections
+ ${reflections.version}
+
+
+ guava
+ com.google.guava
+
+
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+
+
+ cn.afterturn
+ easypoi-spring-boot-starter
+ ${easypoi.version}
+
+
+
+ cn.afterturn
+ easypoi-web
+ ${easypoi.version}
+
+
+ javassist
+ org.javassist
+
+
+ guava
+ com.google.guava
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.poi
+ poi-scratchpad
+ ${poi-scratchpad.version}
+
+
+
+
+ org.apache.poi
+ ooxml-schemas
+ ${poi-ooxml-schemas.version}
+
+
+
+ com.amazonaws
+ aws-java-sdk-s3
+ ${aws-java-sdk.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+ org.apache.logging.log4j
+ log4j-spring-boot
+ ${log4j-spring-boot.version}
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+
+ io.jsonwebtoken
+ jjwt
+ ${jjwt.version}
+
+
+
+ com.auth0
+ jwks-rsa
+ ${jwks-rsa.version}
+
+
+
+
+ org.apache.velocity
+ velocity-engine-core
+ ${velocity-engine-core.version}
+
+
+ org.apache.velocity.tools
+ velocity-tools-generic
+ ${velocity-tools.version}
+
+
+
+
+ com.alibaba
+ easyexcel
+ ${easyexcel.version}
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ ${aliyun-sdk-oss.version}
+
+
+
+ com.github.binarywang
+ weixin-java-miniapp
+ ${weixin-java-miniapp.version}
+
+
+
+
+
+ ${profiles.active}-${project.name}
+
+
+ false
+ src/main/resources
+
+ dev/*
+ test/*
+ pre/*
+ prod/*
+
+
+
+
+ src/main/resources/${profiles.active}
+ true
+
+ *.yaml
+
+
+
+
+ src/main/resources/${profiles.active}
+ false
+
+ *.*
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.2
+
+ 1.8
+ 1.8
+ UTF-8
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${springboot.version}
+
+
+
+
+
+
+
+ dev
+
+ dev
+
+
+ true
+
+
+
+
+ test
+
+ test
+
+
+
+
+ pre
+
+ pre
+
+
+
+
+ prod
+
+ prod
+
+
+
+
+
\ No newline at end of file
diff --git a/sa-admin/pom.xml b/sa-admin/pom.xml
new file mode 100644
index 0000000..3bc1422
--- /dev/null
+++ b/sa-admin/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+
+ net.1024lab
+ sa-parent
+ 1.0.0
+ ../pom.xml
+
+
+ sa-case-admin
+ 1.0.0
+ jar
+
+ sa-case-admin
+ sa-case-admin project
+
+
+
+
+ net.1024lab
+ sa-case-common
+ ${project.version}
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+
+
+
+ com.github.binarywang
+ weixin-java-miniapp
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ net.lab1024.sa.admin.SmartAdminApplication
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/SmartAdminApplication.java b/sa-admin/src/main/java/net/lab1024/sa/admin/SmartAdminApplication.java
new file mode 100644
index 0000000..8297564
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/SmartAdminApplication.java
@@ -0,0 +1,33 @@
+package net.lab1024.sa.admin;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * SmartAdmin 项目启动类
+ *
+ * @Author 1024创新实验室-主任:卓大
+ * @Date 2022-08-29 21:00:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@EnableCaching
+@EnableScheduling
+@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
+@ComponentScan(basePackages = {"net.lab1024.sa"})
+@MapperScan(value = "net.lab1024.sa", annotationClass = Mapper.class)
+@SpringBootApplication(exclude = {UserDetailsServiceAutoConfiguration.class })
+public class SmartAdminApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SmartAdminApplication.class, args);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/common/AdminBaseController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/common/AdminBaseController.java
new file mode 100644
index 0000000..f54bbd5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/common/AdminBaseController.java
@@ -0,0 +1,13 @@
+package net.lab1024.sa.admin.common;
+
+/**
+ * admin 相关的父类
+ *
+ * @Author 1024创新实验室-主任:卓大
+ * @Date 2022-06-10 21:00:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+public class AdminBaseController {
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/config/JweAspectConfig.java b/sa-admin/src/main/java/net/lab1024/sa/admin/config/JweAspectConfig.java
new file mode 100644
index 0000000..c4e74ff
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/config/JweAspectConfig.java
@@ -0,0 +1,38 @@
+package net.lab1024.sa.admin.config;
+
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.jwe.JweAspect;
+import net.lab1024.sa.common.module.support.jwe.JweUserKey;
+import net.lab1024.sa.common.module.support.operatelog.core.OperateLogAspect;
+import net.lab1024.sa.common.module.support.operatelog.core.OperateLogConfig;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 操作日志切面 配置
+ *
+ * @Author 1024创新实验室: 罗伊
+ * @Date 2022-05-30 21:22:12
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net )
+ */
+@Configuration
+public class JweAspectConfig {
+
+ /**
+ * 配置信息
+ */
+ @Bean
+ public JweAspect jweConfig() {
+ return new JweAspect((request -> {
+ RequestUser requestUser = SmartRequestUtil.getRequestUser();
+ JweUserKey userKey = new JweUserKey();
+ userKey.setUserId(requestUser.getUserId());
+ userKey.setUserName(requestUser.getUserName());
+ userKey.setExtData(requestUser.getUserType().getValue().toString());
+ return userKey;
+ }));
+ }
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/config/OperateLogAspectConfig.java b/sa-admin/src/main/java/net/lab1024/sa/admin/config/OperateLogAspectConfig.java
new file mode 100644
index 0000000..214502e
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/config/OperateLogAspectConfig.java
@@ -0,0 +1,34 @@
+package net.lab1024.sa.admin.config;
+
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.operatelog.core.OperateLogAspect;
+import net.lab1024.sa.common.module.support.operatelog.core.OperateLogConfig;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 操作日志切面 配置
+ *
+ * @Author 1024创新实验室: 罗伊
+ * @Date 2022-05-30 21:22:12
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net )
+ */
+@Configuration
+public class OperateLogAspectConfig extends OperateLogAspect{
+
+ /**
+ * 配置信息
+ * @return
+ */
+ @Override
+ public OperateLogConfig getOperateLogConfig() {
+ OperateLogConfig config = OperateLogConfig.builder().corePoolSize(4).queueCapacity(1000).build();
+ return config;
+ }
+
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityConfig.java b/sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityConfig.java
new file mode 100644
index 0000000..8f12ba2
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityConfig.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.config;
+
+import net.lab1024.sa.admin.module.system.login.service.LoginService;
+import net.lab1024.sa.common.common.security.AbstractSecurityConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.function.BiFunction;
+
+/**
+ * 权限配置
+ *
+ * @Author 1024创新实验室: 罗伊
+ * @Date 2022-05-30 21:22:12
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net )
+ */
+@Configuration
+public class SecurityConfig extends AbstractSecurityConfig {
+ /**
+ * 获取TOKEN 解析类
+ */
+ @Autowired
+ private LoginService loginService;
+
+ @Override
+ protected BiFunction userFunction() {
+ return (token, request) -> loginService.getLoginUserDetail(token, request);
+ }
+
+ @Override
+ protected String[] getAuthenticatedUrlPatterns() {
+ return new String[]{"/**"};
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityMethodConfig.java b/sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityMethodConfig.java
new file mode 100644
index 0000000..772b2d5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/config/SecurityMethodConfig.java
@@ -0,0 +1,50 @@
+package net.lab1024.sa.admin.config;
+
+import net.lab1024.sa.admin.module.system.login.domain.LoginEmployeeDetail;
+import net.lab1024.sa.common.common.annoation.SaAuth;
+import net.lab1024.sa.common.common.security.SecurityMethodSource;
+import net.lab1024.sa.common.common.security.SecurityPermissionCheckService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.access.expression.method.ExpressionBasedAnnotationAttributeFactory;
+import org.springframework.security.access.method.MethodSecurityMetadataSource;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
+import org.springframework.security.core.Authentication;
+
+/**
+ * 1、以类名加方法名为权限字符串的校验模式
+ * 2、重写MethodSecurityMetadataSource将优化security配置,只需在方法上加上@saAuth注解,方法上就会存在权限(权限字符串为类名加方法名),而无需另外手动设置,减轻后端开发成本
+ * 3、security将不再依据权限字符串进行权限控制,
+ * 4、security将依据对应权限字符串下的接口权限进行控制
+ * 5、采用此配置原@PreAuthorize依然有效
+ * 6、如若无需此配置,需将@EnableGlobalMethodSecurity注解添加至SecurityConfig类上
+ *
+ * @Author 1024创新实验室: 罗伊
+ * @Date 2021-08-31 0:01
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net )
+ */
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class SecurityMethodConfig extends GlobalMethodSecurityConfiguration {
+
+ @Bean(SaAuth.saAuth)
+ public SecurityPermissionCheckService securityPermissionCheckService() {
+ return new SecurityPermissionCheckService() {
+ @Override
+ public boolean checkPermission(Authentication authentication, String permission) {
+ LoginEmployeeDetail loginEmployeeDetail = (LoginEmployeeDetail) authentication.getPrincipal();
+ if (loginEmployeeDetail.getAdministratorFlag()) {
+ return true;
+ }
+ return super.permissionJudge(loginEmployeeDetail, permission);
+ }
+ };
+ }
+
+ @Override
+ public MethodSecurityMetadataSource customMethodSecurityMetadataSource() {
+ ExpressionBasedAnnotationAttributeFactory attributeFactory = new ExpressionBasedAnnotationAttributeFactory(this.getExpressionHandler());
+ return new SecurityMethodSource(attributeFactory, SaAuth.saAuth);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java b/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java
new file mode 100644
index 0000000..ebacfdf
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java
@@ -0,0 +1,57 @@
+package net.lab1024.sa.admin.constant;
+
+import net.lab1024.sa.common.constant.CacheKeyConst;
+
+/**
+ * 缓存 key
+ *
+ * @Author 1024创新实验室-主任:卓大
+ * @Date 2022-01-07 18:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+public class AdminCacheConst extends CacheKeyConst {
+
+ public static class Department {
+
+ /**
+ * 部门列表
+ */
+ public static final String DEPARTMENT_LIST_CACHE = "department_list_cache";
+
+ /**
+ * 部门map
+ */
+ public static final String DEPARTMENT_MAP_CACHE = "department_map_cache";
+
+ /**
+ * 部门树
+ */
+ public static final String DEPARTMENT_TREE_CACHE = "department_tree_cache";
+
+ /**
+ * 某个部门以及下级的id列表
+ */
+ public static final String DEPARTMENT_SELF_CHILDREN_CACHE = "department_self_children_cache";
+
+ /**
+ * 部门路径 缓存
+ */
+ public static final String DEPARTMENT_PATH_CACHE = "department_path_cache";
+
+ }
+
+ /**
+ * 分类相关缓存
+ */
+ public static class CATEGORY {
+
+ public static final String CATEGORY_ENTITY = "category_cache";
+
+ public static final String CATEGORY_SUB = "category_sub_cache";
+
+ public static final String CATEGORY_TREE = "category_tree_cache";
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminRedisKeyConst.java b/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminRedisKeyConst.java
new file mode 100644
index 0000000..301c73a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminRedisKeyConst.java
@@ -0,0 +1,17 @@
+package net.lab1024.sa.admin.constant;
+
+import net.lab1024.sa.common.constant.RedisKeyConst;
+
+/**
+ * redis key 常量类
+ *
+ * @Author 1024创新实验室-主任:卓大
+ * @Date 2022-01-07 18:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+public class AdminRedisKeyConst extends RedisKeyConst {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminSwaggerTagConst.java b/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminSwaggerTagConst.java
new file mode 100644
index 0000000..d9eb902
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminSwaggerTagConst.java
@@ -0,0 +1,66 @@
+package net.lab1024.sa.admin.constant;
+
+import net.lab1024.sa.common.constant.SwaggerTagConst;
+
+/**
+ * swagger
+ *
+ * @Author 1024创新实验室:罗伊
+ * @Date 2022-01-07 18:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+public class AdminSwaggerTagConst extends SwaggerTagConst {
+
+ public static class Business {
+ public static final String MANAGER_CATEGORY = "ERP进销存-分类管理";
+
+ public static final String MANAGER_GOODS = "ERP进销存-商品管理";
+
+ public static final String OA_BANK = "OA办公-银行卡信息";
+
+ public static final String OA_ENTERPRISE = "OA办公-企业";
+
+ public static final String OA_INVOICE = "OA办公-发票信息";
+
+ public static final String OA_NOTICE = "OA办公-通知公告";
+ }
+
+
+ public static class System {
+
+ public static final String SYSTEM_LOGIN = "系统-员工登录";
+
+ public static final String SYSTEM_EMPLOYEE = "系统-员工管理";
+
+ public static final String SYSTEM_DEPARTMENT = "系统-部门管理";
+
+ public static final String SYSTEM_MENU = "系统-菜单";
+
+ public static final String SYSTEM_DATA_SCOPE = "系统-系统-数据范围";
+
+ public static final String SYSTEM_ROLE = "系统-角色";
+
+ public static final String SYSTEM_ROLE_DATA_SCOPE = "系统-角色-数据范围";
+
+ public static final String SYSTEM_ROLE_EMPLOYEE = "系统-角色-员工";
+
+ public static final String SYSTEM_ROLE_MENU = "系统-角色-菜单";
+ public static final String SYSTEM_ROLE_PROV = "系统-角色-省份";
+
+ public static final String SYSTEM_DATA_TRACER = "系统-";
+ }
+
+
+ public static class App {
+
+ public static final String MedicalRecord = "前端-病历";
+
+ public static final String Expert = "前端-登录、注册、首页";
+ public static final String ExpertSign = "前端-医生签名";
+
+ public static final String OSS = "前端-oss";
+ public static final String WX_MINI = "前端-微信小程序";
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/listener/AdminStartupRunner.java b/sa-admin/src/main/java/net/lab1024/sa/admin/listener/AdminStartupRunner.java
new file mode 100644
index 0000000..cf8d049
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/listener/AdminStartupRunner.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.listener;
+
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.common.common.code.ErrorCodeRegister;
+import net.lab1024.sa.common.config.ScheduleConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * admin 应用启动加载
+ *
+ * @Author 1024创新实验室-主任:卓大
+ * @Date 2021-08-26 18:46:32
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Slf4j
+@Component
+public class AdminStartupRunner implements CommandLineRunner {
+
+ @Autowired
+ private ScheduleConfig scheduleConfig;
+
+ @Override
+ public void run(String... args) {
+
+ // 初始化状态码
+ int codeCount = ErrorCodeRegister.initialize();
+
+ //TODO <卓大> :根据实际情况来决定是否开启定时任务
+ String destroySchedules = "Spring 定时任务 @Schedule 已启动";
+// destroySchedules = scheduleConfig.destroy();
+
+ log.info("\n ---------------【1024创新实验室 温馨提示:】 ErrorCode 共计完成初始化: {}个!---------------" +
+ "\n ---------------【1024创新实验室 温馨提示:】 {}---------------\n", codeCount, destroySchedules);
+
+ }
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertBankVerify.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertBankVerify.java
new file mode 100644
index 0000000..634901b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertBankVerify.java
@@ -0,0 +1,23 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class ExpertBankVerify {
+
+ @ApiModelProperty("姓名")
+ @NotBlank(message = "姓名 不能为空")
+ private String name;
+
+ @ApiModelProperty("身份证")
+ @NotBlank(message = "身份证 不能为空")
+ private String idCardNo;
+
+ @ApiModelProperty("银行卡")
+ @NotBlank(message = "银行卡 不能为空")
+ private String bankCardNo;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertEntity.java
new file mode 100644
index 0000000..91c10e9
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertEntity.java
@@ -0,0 +1,101 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import net.lab1024.sa.admin.module.system.login.domain.LoginEmployeeDetail;
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.enumeration.UserTypeEnum;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.Set;
+
+@Data
+@TableName("t_caseplatform_expert")
+public class ExpertEntity implements UserDetails, RequestUser {
+
+ @TableId(type = IdType.AUTO)
+ private Long id;
+ private String uuid;
+ private String mobile;
+ private String name;
+ private String photo;
+ private String hospitalUuid;
+ private String hospitalName;
+ private String token;
+ private String ip;
+ private Integer provId;
+ private Integer countyId;
+ private Integer cityId;
+
+ /**
+ * security 权限串
+ */
+ private Set extends GrantedAuthority> authorities;
+
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ return authorities;
+ }
+
+ @Override
+ @JsonIgnore
+ public String getPassword() {
+ return null;
+ }
+
+ @Override
+ public String getUsername() {
+ return this.getName();
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public Long getUserId() {
+ return id;
+ }
+
+ @Override
+ public String getUserName() {
+ return name;
+ }
+
+ @Override
+ public UserTypeEnum getUserType() {
+ return UserTypeEnum.EXPERT;
+ }
+
+ @Override
+ public String getIp() {
+ return this.ip;
+ }
+
+ @Override
+ public String getUserAgent() {
+ return "wx";
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertLoginVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertLoginVO.java
new file mode 100644
index 0000000..6f01966
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertLoginVO.java
@@ -0,0 +1,25 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExpertLoginVO {
+ @ApiModelProperty(value = "专家ID")
+ private Long id;
+
+ @ApiModelProperty(value = "专家UUID")
+ private String uuid;
+
+ @ApiModelProperty(value = "专家姓名")
+ private String name;
+
+ @ApiModelProperty(value = "专家头像")
+ private String photo;
+
+ @ApiModelProperty(value = "专家医院名称")
+ private String hospitalName;
+
+ @ApiModelProperty(value = "token")
+ private String token;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyForm.java
new file mode 100644
index 0000000..475520a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyForm.java
@@ -0,0 +1,56 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class ExpertModifyForm {
+
+ @ApiModelProperty("UUID")
+ @NotBlank(message = "UUID 不能为空")
+ private String uuid;
+
+ @ApiModelProperty("姓名")
+ @NotBlank(message = "姓名 不能为空")
+ @Length(max = 20, message = "姓名最多20字符")
+ private String name;
+
+ @ApiModelProperty("医院UUID")
+ @NotBlank(message = "医院UUID 不能为空")
+ @Length(max = 32, message = "医院UUID最多32字符")
+ private String hospital_uuid;
+
+ @ApiModelProperty("医院名称")
+ @NotBlank(message = "医院名称 不能为空")
+ @Length(max = 50, message = "医院名称最多50字符")
+ private String hospital_name;
+
+ @ApiModelProperty("科室UUID")
+ @NotBlank(message = "科室UUID 不能为空")
+ @Length(max = 32, message = "科室UUID最多32字符")
+ private String office_uuid;
+
+ @ApiModelProperty("科室名称")
+ @NotBlank(message = "科室名称 不能为空")
+ @Length(max = 20, message = "科室名称最多20字符")
+ private String office_name;
+
+ @ApiModelProperty("职称UUID")
+ @NotBlank(message = "职称UUID 不能为空")
+ @Length(max = 32, message = "职称UUID最多32字符")
+ private String position_uuid;
+
+ @ApiModelProperty("执业证号")
+ private String certificate;
+
+ @ApiModelProperty("执业医师资格证或工作胸牌")
+ @NotBlank(message = "执业医师资格证或工作胸牌 不能为空")
+ private String certificate_img;
+
+ @ApiModelProperty("地区ID")
+ @NotBlank(message = "地区ID 不能为空")
+ private String county_id;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyVO.java
new file mode 100644
index 0000000..6eab75b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertModifyVO.java
@@ -0,0 +1,48 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class ExpertModifyVO {
+
+ @ApiModelProperty("UUID")
+ private String uuid;
+
+ @ApiModelProperty("姓名")
+ private String name;
+
+ @ApiModelProperty("医院UUID")
+ private String hospital_uuid;
+
+ @ApiModelProperty("医院名称")
+ private String hospital_name;
+
+ @ApiModelProperty("科室UUID")
+ private String office_uuid;
+
+ @ApiModelProperty("科室名称")
+ private String office_name;
+
+ @ApiModelProperty("职称UUID")
+ private String position_uuid;
+
+ @ApiModelProperty("执业证号")
+ private String certificate;
+
+ @ApiModelProperty("执业医师资格证或工作胸牌")
+ private String certificate_img;
+
+ @ApiModelProperty("地区ID")
+ private Integer county_id;
+
+ @ApiModelProperty("省份ID")
+ private Integer prov_id;
+
+ @ApiModelProperty("城市ID")
+ private Integer city_id;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertRegisterForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertRegisterForm.java
new file mode 100644
index 0000000..6adb3f9
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertRegisterForm.java
@@ -0,0 +1,68 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class ExpertRegisterForm {
+
+ @ApiModelProperty("手机号")
+ @NotBlank(message = "手机号 不能为空")
+ @Length(max = 11, message = "手机号最多11字符")
+ private String mobile;
+
+ @ApiModelProperty("短信验证码")
+ @NotBlank(message = "短信验证码 不能为空")
+ @Length(max = 6, message = "短信验证码最多6字符")
+ private String sms;
+
+ @ApiModelProperty("密码")
+ @NotBlank(message = "密码 不能为空")
+ @Length(max = 32, message = "密码最多32字符")
+ private String password;
+
+ @ApiModelProperty("姓名")
+ @NotBlank(message = "姓名 不能为空")
+ @Length(max = 20, message = "姓名最多20字符")
+ private String name;
+
+ @ApiModelProperty("医院UUID")
+ @NotBlank(message = "医院UUID 不能为空")
+ @Length(max = 32, message = "医院UUID最多32字符")
+ private String hospital_uuid;
+
+ @ApiModelProperty("医院名称")
+ @NotBlank(message = "医院名称 不能为空")
+ @Length(max = 50, message = "医院名称最多50字符")
+ private String hospital_name;
+
+ @ApiModelProperty("科室UUID")
+ @NotBlank(message = "科室UUID 不能为空")
+ @Length(max = 32, message = "科室UUID最多32字符")
+ private String office_uuid;
+
+ @ApiModelProperty("科室名称")
+ @NotBlank(message = "科室名称 不能为空")
+ @Length(max = 20, message = "科室名称最多20字符")
+ private String office_name;
+
+ @ApiModelProperty("职称UUID")
+ @NotBlank(message = "职称UUID 不能为空")
+ @Length(max = 32, message = "职称UUID最多32字符")
+ private String position_uuid;
+
+ @ApiModelProperty("执业证号")
+ private String certificate;
+
+ @ApiModelProperty("执业医师资格证或工作胸牌")
+ @NotBlank(message = "执业医师资格证或工作胸牌 不能为空")
+ private String certificate_img;
+
+ @ApiModelProperty("地区ID")
+ @NotBlank(message = "地区ID 不能为空")
+ private String county_id;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignAddForm.java
new file mode 100644
index 0000000..20d1169
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignAddForm.java
@@ -0,0 +1,15 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ExpertSignAddForm {
+
+ @ApiModelProperty(value = "签名图片")
+ @NotNull(message = "签名图片 不能为空")
+ private String signImg;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignVO.java
new file mode 100644
index 0000000..341ca2f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertSignVO.java
@@ -0,0 +1,39 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.time.LocalDateTime;
+
+@Data
+public class ExpertSignVO {
+
+ @ApiModelProperty(hidden = true)
+ private Long id;
+
+ @ApiModelProperty(value = "专家ID")
+ private String expertId;
+
+ @ApiModelProperty(value = "签名图片地址")
+ private String signImg;
+
+ @ApiModelProperty(value = "专家姓名")
+ private String name;
+
+ @ApiModelProperty(value = "专家手机")
+ private String mobile;
+
+ @ApiModelProperty(value = "专家银行卡号")
+ private String bankCardNo;
+
+ @ApiModelProperty(value = "开户行", required = true)
+ private String bankName;
+
+ @ApiModelProperty(value = "身份证号", required = true)
+ private String idCardNo;
+
+ @ApiModelProperty(value = "签名日期")
+ private LocalDateTime createTime;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertVO.java
new file mode 100644
index 0000000..edc10d3
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertVO.java
@@ -0,0 +1,32 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExpertVO {
+
+ @ApiModelProperty(value = "专家ID")
+ private Long id;
+
+ @ApiModelProperty(value = "专家UUID")
+ private String uuid;
+
+ @ApiModelProperty(value = "专家姓名")
+ private String name;
+
+ @ApiModelProperty(value = "专家头像")
+ private String photo;
+
+ @ApiModelProperty(value = "专家医院名称")
+ private String hospitalName;
+
+ @ApiModelProperty(value = "专家通过数量")
+ private Integer passNum;
+
+ @ApiModelProperty(value = "专家待审核数量")
+ private Integer waitNum;
+
+ @ApiModelProperty(value = "专家待修改数量")
+ private Integer refuseNum;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertWhiteEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertWhiteEntity.java
new file mode 100644
index 0000000..c40cfcb
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/ExpertWhiteEntity.java
@@ -0,0 +1,68 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+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 lombok.Data;
+
+/**
+ * 专家表-白名单实体类
+ */
+@TableName("`t_caseplatform_expert_white`") // 指定数据库表名
+public class ExpertWhiteEntity {
+ /**
+ * 主键
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 手机号
+ */
+ @TableField("mobile")
+ private String mobile;
+
+ /**
+ * 姓名
+ */
+ @TableField("name")
+ private String name;
+
+ /**
+ * 头像
+ */
+ @TableField("photo")
+ private String photo;
+
+ /**
+ * 医院uuid
+ */
+ @TableField("hospital_uuid")
+ private String hospitalUuid;
+
+ /**
+ * 医院名称
+ */
+ @TableField("hospital_name")
+ private String hospitalName;
+
+ /**
+ * 省ID
+ */
+ @TableField("prov_id")
+ private Integer provinceId;
+
+ /**
+ * 市ID
+ */
+ @TableField("city_id")
+ private Integer cityId;
+
+ /**
+ * 区ID
+ */
+ @TableField("county_id")
+ private Integer countyId;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/LoginForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/LoginForm.java
new file mode 100644
index 0000000..0ba8151
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/LoginForm.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.app.expert.constan.SmsTypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.util.SmartVerificationUtil;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaForm;
+import net.lab1024.sa.common.module.support.token.LoginDeviceEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 员工登录
+ *
+ * @Author 1024创新实验室: 开云
+ * @Date 2021-12-19 11:49:45
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class LoginForm extends CaptchaForm {
+
+ @ApiModelProperty("手机号")
+ @NotBlank(message = "手机号 不能为空")
+ @Length(max = 11, message = "登录账号最多11字符")
+ private String mobile;
+
+ @ApiModelProperty(value = "登录终端")
+ @ApiModelPropertyEnum(LoginDeviceEnum.class)
+ @CheckEnum(value = LoginDeviceEnum.class, required = true, message = "此终端不允许登录")
+ private Integer loginDevice;
+
+ @ApiModelProperty(value = "短信类型")
+ @ApiModelPropertyEnum(SmsTypeEnum.class)
+ @CheckEnum(value = SmsTypeEnum.class, required = true, message = "短信类型错误")
+ private Integer smsType;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/PWDLoginForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/PWDLoginForm.java
new file mode 100644
index 0000000..3823496
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/PWDLoginForm.java
@@ -0,0 +1,41 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.app.expert.constan.SmsTypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.util.SmartVerificationUtil;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaForm;
+import net.lab1024.sa.common.module.support.token.LoginDeviceEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 手机号 密码登录
+ *
+ * @Author 1024创新实验室: 开云
+ * @Date 2021-12-19 11:49:45
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class PWDLoginForm extends CaptchaForm {
+
+ @ApiModelProperty("手机号")
+ @NotBlank(message = "手机号 不能为空")
+ @Length(max = 11, message = "登录账号最多11字符")
+ private String mobile;
+
+ @ApiModelProperty(value = "登录终端")
+ @ApiModelPropertyEnum(LoginDeviceEnum.class)
+ @CheckEnum(value = LoginDeviceEnum.class, required = true, message = "此终端不允许登录")
+ private Integer loginDevice;
+
+ @ApiModelProperty(value = "密码")
+ @NotBlank(message = "密码 不能为空")
+ private String pwd;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/SmsLoginForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/SmsLoginForm.java
new file mode 100644
index 0000000..fccfebf
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/admin/SmsLoginForm.java
@@ -0,0 +1,36 @@
+package net.lab1024.sa.admin.module.app.expert.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.app.expert.constan.SmsTypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaForm;
+import net.lab1024.sa.common.module.support.token.LoginDeviceEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 短信验证码登录
+ *
+ * @Author 1024创新实验室: 开云
+ * @Date 2021-12-19 11:49:45
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class SmsLoginForm {
+
+ @ApiModelProperty("手机号")
+ @NotBlank(message = "手机号 不能为空")
+ @Length(max = 11, message = "登录账号最多11字符")
+ private String mobile;
+
+ @ApiModelProperty("短信验证码")
+ @NotBlank(message = "短信验证码 不能为空")
+ @Length(max = 6, message = "短信验证码最多6字符")
+ private String sms;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/ImageType.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/ImageType.java
new file mode 100644
index 0000000..4847178
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/ImageType.java
@@ -0,0 +1,18 @@
+package net.lab1024.sa.admin.module.app.expert.constan;
+
+public enum ImageType {
+ JPG("jpg"),
+ JPEG("jpeg"),
+ PNG("png"),
+ GIF("gif");
+
+ private final String fileExtension;
+
+ ImageType(String fileExtension) {
+ this.fileExtension = fileExtension;
+ }
+
+ public String getFileExtension() {
+ return fileExtension;
+ }
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/SmsTypeEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/SmsTypeEnum.java
new file mode 100644
index 0000000..ba402ed
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/constan/SmsTypeEnum.java
@@ -0,0 +1,34 @@
+package net.lab1024.sa.admin.module.app.expert.constan;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 病历类型
+ *
+ * @Author HMM
+ * @Date 2024-01-11T15:18:32
+ * @Copyright gdxz
+ */
+
+@AllArgsConstructor
+@Getter
+public enum SmsTypeEnum implements BaseEnum {
+ register(1, "短信注册"),
+ login(2, "短信登录"),
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+
+ public static SmsTypeEnum getByVal(int val){
+ for (SmsTypeEnum type: SmsTypeEnum.values()){
+ if(type.getValue() == val){
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertController.java
new file mode 100644
index 0000000..4de0a77
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertController.java
@@ -0,0 +1,588 @@
+package net.lab1024.sa.admin.module.app.expert.controller;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.app.expert.admin.*;
+import net.lab1024.sa.admin.module.app.expert.service.ExpertService;
+import net.lab1024.sa.admin.module.app.expert.service.ExpertWhiteEntityService;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorDao;
+import net.lab1024.sa.admin.module.business.area.domain.vo.ProvVO;
+import net.lab1024.sa.admin.module.business.area.service.AreaService;
+import net.lab1024.sa.admin.module.business.captcha.service.CaptchaService;
+import net.lab1024.sa.admin.module.system.login.service.LoginService;
+import net.lab1024.sa.common.common.annoation.NoNeedLogin;
+import net.lab1024.sa.common.common.constant.RequestHeaderConst;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.Sha256Util;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaVO;
+import net.lab1024.sa.common.module.support.config.ConfigKeyEnum;
+import net.lab1024.sa.common.module.support.config.ConfigService;
+import net.lab1024.sa.common.module.support.config.domain.ConfigVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static net.lab1024.sa.common.common.code.UserErrorCode.*;
+
+@Slf4j
+@RestController
+@Api(tags = {AdminSwaggerTagConst.App.Expert})
+public class ExpertController {
+
+ //发送验证码
+ private final String SENDSMS_URL = "hcp/sendSms";
+
+ //短信登录
+ private final String SMSLOGIN_URL = "hcp/smsLogin";
+
+ //短信注册
+ private final String SMSREGISTER_URL = "hcp/smsRegister";
+
+ private final String UOLOADIMGV2_URL = "hcp/uoloadImgV2";
+
+ //科室列表
+ private final String OFFICELIST_URL = "hcp/officeList";
+
+ //职称列表
+ private final String POSITIONLIST_URL = "hcp/positionList";
+
+ //医院列表
+ private final String HOSPITALLIST_URL = "hcp/hospitalList";
+
+ //获取HCP详情
+ private final String GETINFO_URL = "hcp/getInfo";
+
+ //修改HCP资料
+ private final String MODIFY_URL = "hcp/modify";
+
+ //账户密码登录
+ private final String PWDLOGIN_URL = "hcp/PwdLogin";
+
+ @Value("${igandan.doc.host}")
+ private String IGANDAN_DOC_HOST;
+
+ @Value("${igandan.wx.host}")
+ private String IGANDAN_WX_HOST;
+
+ @Value("${igandan.wx.platform}")
+ private String IGANDAN_WX_PLATFORM;
+
+ @Value("${igandan.wx.token}")
+ private String IGANDAN_WX_token;
+
+ @Autowired
+ private CaptchaService captchaService;
+
+ @Autowired
+ private ExpertService expertService;
+
+ @Autowired
+ private ConfigService configService;
+
+ @Autowired
+ private AreaService areaService;
+
+ @Autowired
+ private LoginService loginService;
+
+ @Autowired
+ private MedicalRecorDao medicalRecorDao;
+
+ @Autowired
+ private ExpertWhiteEntityService expertWhiteEntityService;
+
+ @ApiOperation("获取验证码")
+ @GetMapping("/user/getCaptcha")
+ @NoNeedLogin
+ public ResponseDTO getCaptcha() {
+ return ResponseDTO.app_ok(captchaService.generateCaptcha());
+ }
+
+ /**
+ * 发送验证码
+ * @return
+ */
+ @NoNeedLogin
+ @ApiOperation(value = "发送验证码", notes = "")
+ @PostMapping("/user/sendSms")
+ public ResponseDTO sendSms(@RequestBody @Valid LoginForm loginForm) {
+
+ ResponseDTO checkCaptcha = captchaService.checkCaptcha(loginForm);
+ if(!checkCaptcha.getOk()){
+ return checkCaptcha;
+ }
+
+ Integer smsType = loginForm.getSmsType();
+ String mobile = loginForm.getMobile();
+ Map params = new HashMap<>(8);
+ params.put("type", smsType);
+ params.put("mobile", mobile);
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+
+ String result = HttpUtil.post(IGANDAN_WX_HOST + SENDSMS_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ return responseDTO;
+ }
+
+ /**
+ * 短信注册
+ * @return
+ */
+ @NoNeedLogin
+ @ApiOperation(value = "短信注册")
+ @PostMapping("/user/smsRegister")
+ public ResponseDTO smsRegister(@RequestBody @Valid ExpertRegisterForm form) {
+
+ String mobile = form.getMobile();
+ String sms = form.getSms();
+ String password = form.getPassword();
+ String name = form.getName();
+ String hospital_uuid = form.getHospital_uuid();
+ String hospital_name = form.getHospital_name();
+ String office_uuid = form.getOffice_uuid();
+ String office_name = form.getOffice_name();
+ String position_uuid = form.getPosition_uuid();
+ String certificate = form.getCertificate();
+ String certificate_img = form.getCertificate_img();
+ String county_id = form.getCounty_id();
+ Map params = new HashMap<>(16);
+ params.put("mobile", mobile);
+ params.put("sms", sms);
+ params.put("password", password);
+ params.put("name", name);
+ params.put("hospital_uuid", hospital_uuid);
+ params.put("hospital_name", hospital_name);
+ params.put("office_uuid", office_uuid);
+ params.put("office_name", office_name);
+ params.put("position_uuid", position_uuid);
+ params.put("certificate", certificate);
+ params.put("certificate_img", certificate_img);
+ params.put("county_id", county_id);
+
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+
+ String result = HttpUtil.post(IGANDAN_WX_HOST + SMSREGISTER_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ return responseDTO;
+ }
+
+ /**
+ * 短信登录
+ * @return
+ */
+ @NoNeedLogin
+ @ApiOperation(value = "短信登录")
+ @PostMapping("/user/smsLogin")
+ public ResponseDTO smsLogin(@RequestBody @Valid SmsLoginForm form) {
+ Map params = new HashMap<>(8);
+ String mobile = form.getMobile();
+ params.put("mobile", mobile);
+ params.put("sms", form.getSms());
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+
+ String result = HttpUtil.post(IGANDAN_WX_HOST + SMSLOGIN_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ Map data = (Map) responseDTO.getData();
+ String uuid = (String) data.get("uuid");
+ String name = (String) data.get("name");
+ String photo = (String) data.get("photo");
+ String hospital_uuid = (String) data.get("hospital_uuid");
+ String hospital_name = (String) data.get("hospital_name");
+ Integer prov_id = (Integer) data.get("prov_id");
+ Integer county_id = (Integer) data.get("county_id");
+ Integer city_id = (Integer) data.get("city_id");
+
+ // 获取白名单用户-姓名、医院名称
+ ExpertWhiteEntity expertWhiteEntity = expertWhiteEntityService.getExpertWhiteEntityByNameAndHospitalName(name,hospital_name);
+ if (expertWhiteEntity == null) {
+ responseDTO.setMsg("暂无登录权限");
+ return responseDTO;
+ }
+
+ ExpertEntity expert = new ExpertEntity();
+ expert.setName(name);
+ if(StrUtil.isBlank(photo)){
+ expert.setPhoto("");
+ }else{
+ expert.setPhoto(IGANDAN_DOC_HOST+photo);
+ }
+ expert.setUuid(uuid);
+ expert.setHospitalName(hospital_name);
+ expert.setHospitalUuid(hospital_uuid);
+ expert.setProvId(prov_id);
+ expert.setCityId(city_id);
+ expert.setCountyId(county_id);
+ expert.setMobile(mobile);
+ ExpertEntity expertVO = expertService.addExpert(expert);
+ ExpertLoginVO expertLoginVO = SmartBeanUtil.copy(expertVO, ExpertLoginVO.class);
+ return ResponseDTO.app_ok(expertLoginVO);
+ }else{
+ responseDTO.setMsg("账号未注册,请您注册后登陆");
+ return responseDTO;
+ }
+ }
+
+ @NoNeedLogin
+ @ApiOperation("获取省市区")
+ @GetMapping("/user/areaList")
+ public ResponseDTO> areaList(Long parent) {
+ return ResponseDTO.app_ok(areaService.areaList(parent));
+ }
+
+ @ApiOperation(value = "退出登录")
+ @GetMapping("/user/logOut")
+ public ResponseDTO logOut(@RequestHeader(value = RequestHeaderConst.TOKEN, required = false) String token) {
+ return loginService.appLogout(token, SmartRequestUtil.getRequestUser());
+ }
+
+ @ApiOperation(value = "个人中心")
+ @GetMapping("/user/getInfo")
+ public ResponseDTO getInfo() {
+ return ResponseDTO.app_ok(expertService.getInfo());
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "项目协议")
+ @GetMapping("/user/getDeal")
+ public ResponseDTO getDeal() {
+ ConfigVO config = configService.getConfig(ConfigKeyEnum.DEAL);
+ return ResponseDTO.app_ok(config.getConfigValue());
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "隐私协议")
+ @GetMapping("/user/getPrivacy")
+ public ResponseDTO getPrivacy() {
+ ConfigVO config = configService.getConfig(ConfigKeyEnum.PRIVACY);
+ return ResponseDTO.app_ok(config.getConfigValue());
+ }
+
+ @ApiOperation(value = "项目状态")
+ @GetMapping("/user/getProjectStatus")
+ public ResponseDTO getCaseNum() {
+ ConfigVO CaseSwitch = configService.getConfig(ConfigKeyEnum.CaseSwitch);
+ if(CaseSwitch.getConfigValue().equals("false")){
+ return ResponseDTO.error(PROJECT_CLOSE);
+ }
+
+ ConfigVO CaseNum = configService.getConfig(ConfigKeyEnum.CaseNum);
+ int total = medicalRecorDao.getTotal();
+ if(Integer.parseInt(CaseNum.getConfigValue()) <= total){
+ return ResponseDTO.error(PROJECT_CLOSE);
+ }
+
+ return ResponseDTO.app_ok();
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "操作说明")
+ @GetMapping("/user/getRubric")
+ public ResponseDTO getRubric() {
+ ConfigVO config = configService.getConfig(ConfigKeyEnum.RUBRIC);
+ return ResponseDTO.app_ok(config.getConfigValue());
+ }
+
+ //@NoNeedLogin
+ //@ApiOperation(value = "上传图片", notes = "仅在上传执业医师资格证使用")
+ //@PostMapping("/user/uoloadImg")
+ //public ResponseDTO uoloadImg(@RequestParam("file") MultipartFile file) throws IOException {
+ // HashMap params = new HashMap<>();
+ // //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
+ // byte[] fileBytes = file.getBytes();
+ // String base64String = Base64.getEncoder().encodeToString(fileBytes);
+ //
+ // String originalFilename = file.getOriginalFilename();
+ // String fileExtension = FilenameUtils.getExtension(originalFilename);
+ // ImageType imageType = ImageType.valueOf(fileExtension.toUpperCase());
+ //
+ // long timestamp = System.currentTimeMillis() / 1000;
+ // params.put("type", imageType.getFileExtension());
+ // params.put("base64Img", base64String);
+ // params.put("platform", IGANDAN_WX_PLATFORM);
+ // params.put("timestamp", timestamp);
+ // String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ // params.put("signature", signature);
+ //
+ //
+ // String result = HttpUtil.post(IGANDAN_WX_HOST + UOLOADIMG_URL, params, 60 * 1000);
+ // ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ // if(responseDTO.getCode() == 200){
+ // String data = (String) responseDTO.getData();
+ //
+ // return ResponseDTO.app_ok(IGANDAN_DOC_HOST + data);
+ // }
+ // return ResponseDTO.userErrorParam();
+ //}
+
+ @NoNeedLogin
+ @ApiOperation(value = "上传图片", notes = "仅在上传执业医师资格证使用")
+ @PostMapping("/user/uoloadImg")
+ public ResponseDTO uoloadImg(@RequestParam("file") MultipartFile file) throws IOException {
+ HashMap params = new HashMap<>();
+ //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
+ // 创建一个临时文件
+ File tempFile = File.createTempFile("temp", file.getOriginalFilename());
+ // 将 MultipartFile 的内容写入到临时文件中
+ try (InputStream inputStream = file.getInputStream();
+ OutputStream outputStream = new FileOutputStream(tempFile)) {
+
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+ params.put("file", tempFile);
+ String result= HttpUtil.post(IGANDAN_WX_HOST + UOLOADIMGV2_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ String data = (String) responseDTO.getData();
+ return ResponseDTO.app_ok(IGANDAN_DOC_HOST + data);
+ }
+ }finally {
+ tempFile.deleteOnExit();
+ }
+ return ResponseDTO.userErrorParam();
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "科室列表")
+ @GetMapping("/user/officeList")
+ public ResponseDTO officeList() {
+ HashMap params = new HashMap<>();
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+ String result = HttpUtil.post(IGANDAN_WX_HOST + OFFICELIST_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ Object data = responseDTO.getData();
+ return ResponseDTO.app_ok(data);
+ }
+ return ResponseDTO.userErrorParam();
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "职称列表")
+ @GetMapping("/user/positionList")
+ public ResponseDTO positionList() {
+ HashMap params = new HashMap<>();
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+ String result = HttpUtil.post(IGANDAN_WX_HOST + POSITIONLIST_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ Object data = responseDTO.getData();
+ return ResponseDTO.app_ok(data);
+ }
+ return ResponseDTO.userErrorParam();
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "医院列表")
+ @GetMapping("/user/hospitalList/{countyId}")
+ public ResponseDTO hospitalList(@PathVariable Long countyId) {
+ HashMap params = new HashMap<>();
+ params.put("countyId", countyId);
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+ String result = HttpUtil.post(IGANDAN_WX_HOST + HOSPITALLIST_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ Object data = responseDTO.getData();
+ return ResponseDTO.app_ok(data);
+ }
+ return ResponseDTO.userErrorParam();
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "账户密码登录")
+ @PostMapping("/user/login")
+ public ResponseDTO login(@RequestBody @Valid PWDLoginForm loginForm) {
+
+ ResponseDTO checkCaptcha = captchaService.checkCaptcha(loginForm);
+ if(!checkCaptcha.getOk()){
+ return checkCaptcha;
+ }
+ String pwd = loginForm.getPwd();
+ String mobile = loginForm.getMobile();
+ Map params = new HashMap<>(8);
+ params.put("password", pwd);
+ params.put("mobile", mobile);
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+
+ String result = HttpUtil.post(IGANDAN_WX_HOST + PWDLOGIN_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ Map data = (Map) responseDTO.getData();
+ String uuid = (String) data.get("uuid");
+ String name = (String) data.get("name");
+ String photo = (String) data.get("photo");
+ String hospital_uuid = (String) data.get("hospital_uuid");
+ String hospital_name = (String) data.get("hospital_name");
+ Integer prov_id = (Integer) data.get("prov_id");
+ Integer county_id = (Integer) data.get("county_id");
+ Integer city_id = (Integer) data.get("city_id");
+
+ // 获取白名单用户-姓名、医院名称
+ ExpertWhiteEntity expertWhiteEntity = expertWhiteEntityService.getExpertWhiteEntityByNameAndHospitalName(name,hospital_name);
+ if (expertWhiteEntity == null) {
+ responseDTO.setMsg("暂无登录权限");
+ return responseDTO;
+ }
+
+ ExpertEntity expert = new ExpertEntity();
+ expert.setName(name);
+ if(StrUtil.isBlank(photo)){
+ expert.setPhoto("");
+ }else{
+ expert.setPhoto(IGANDAN_DOC_HOST+photo);
+ }
+ expert.setUuid(uuid);
+ expert.setHospitalName(hospital_name);
+ expert.setHospitalUuid(hospital_uuid);
+ expert.setProvId(prov_id);
+ expert.setCityId(city_id);
+ expert.setCountyId(county_id);
+ expert.setMobile(mobile);
+ ExpertEntity expertVO = expertService.addExpert(expert);
+
+ ExpertLoginVO expertLoginVO = SmartBeanUtil.copy(expertVO, ExpertLoginVO.class);
+ return ResponseDTO.app_ok(expertLoginVO);
+ }else{
+ return responseDTO;
+ }
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "获取待补充资料时候-HCP详情")
+ @GetMapping("/user/getDetail/{mobile}")
+ public ResponseDTO getDetail(@PathVariable String mobile) {
+ HashMap params = new HashMap<>();
+ params.put("mobile", mobile);
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+ String result = HttpUtil.post(IGANDAN_WX_HOST + GETINFO_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ if(responseDTO.getCode() == 200){
+ Map data = (Map) responseDTO.getData();
+ if(data == null){
+ return ResponseDTO.error(NO_MODIFY);
+ }
+ String uuid = (String) data.get("uuid");
+ String name = (String) data.get("realname");
+ String office_uuid = (String) data.get("office_uuid");
+ String office_name = (String) data.get("office_name");
+ String position_uuid = (String) data.get("position_uuid");
+ String certificate = (String) data.get("certificate");
+ String certificate_img = (String) data.get("certificate_img");
+ String hospital_uuid = (String) data.get("hospital_uuid");
+ String hospital_name = (String) data.get("hospital_name");
+ Integer prov_id = (Integer) data.get("prov_id");
+ Integer county_id = (Integer) data.get("county_id");
+ Integer city_id = (Integer) data.get("city_id");
+ ExpertModifyVO expert = new ExpertModifyVO();
+ expert.setName(name);
+ expert.setUuid(uuid);
+ expert.setHospital_name(hospital_name);
+ expert.setHospital_uuid(hospital_uuid);
+ expert.setProv_id(prov_id);
+ expert.setCity_id(city_id);
+ expert.setCounty_id(county_id);
+
+ expert.setOffice_name(office_name);
+ expert.setOffice_uuid(office_uuid);
+ expert.setPosition_uuid(position_uuid);
+ expert.setCertificate(certificate);
+ expert.setCertificate_img(certificate_img);
+ if(StrUtil.isBlank(certificate_img)){
+ expert.setCertificate_img("");
+ }else{
+ expert.setCertificate_img(IGANDAN_DOC_HOST+certificate_img);
+ }
+ return ResponseDTO.app_ok(expert);
+ }
+ return ResponseDTO.userErrorParam();
+ }
+
+ @NoNeedLogin
+ @ApiOperation(value = "修改HCP资料")
+ @PostMapping("/user/modify")
+ public ResponseDTO modify(@RequestBody @Valid ExpertModifyForm form) {
+ String uuid = form.getUuid();
+ String name = form.getName();
+ String hospital_uuid = form.getHospital_uuid();
+ String hospital_name = form.getHospital_name();
+ String office_uuid = form.getOffice_uuid();
+ String office_name = form.getOffice_name();
+ String position_uuid = form.getPosition_uuid();
+ String certificate = form.getCertificate();
+ String certificate_img = form.getCertificate_img().replaceAll(IGANDAN_DOC_HOST,"");
+ String county_id = form.getCounty_id();
+ Map params = new HashMap<>(16);
+ params.put("uuid", uuid);
+ params.put("realname", name);
+ params.put("hospital_uuid", hospital_uuid);
+ params.put("hospital_name", hospital_name);
+ params.put("office_uuid", office_uuid);
+ params.put("office_name", office_name);
+ params.put("position_uuid", position_uuid);
+ params.put("certificate", certificate);
+ params.put("certificate_img", certificate_img);
+ params.put("county_id", county_id);
+ params.put("platform", IGANDAN_WX_PLATFORM);
+ params.put("timestamp", System.currentTimeMillis()/1000);
+ String signature = Sha256Util.getSign(params, IGANDAN_WX_token);
+ params.put("signature", signature);
+ String result = HttpUtil.post(IGANDAN_WX_HOST + MODIFY_URL, params);
+ ResponseDTO responseDTO = JSON.parseObject(result, ResponseDTO.class);
+ return responseDTO;
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertSignController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertSignController.java
new file mode 100644
index 0000000..74530eb
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/controller/ExpertSignController.java
@@ -0,0 +1,59 @@
+package net.lab1024.sa.admin.module.app.expert.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignVO;
+import net.lab1024.sa.admin.module.app.expert.service.ExpertSignService;
+import net.lab1024.sa.admin.module.business.bankcard.domain.form.CaseplatformBankAddForm;
+import net.lab1024.sa.admin.module.business.bankcard.service.CaseplatformBankService;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.wangyi.yidun.sdk.BankCardCheckAPI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+import static net.lab1024.sa.common.common.code.UserErrorCode.ExpertBankVerifyFail;
+
+@RestController
+@Api(tags = {AdminSwaggerTagConst.App.ExpertSign})
+public class ExpertSignController {
+
+ @Autowired
+ private ExpertSignService expertSignService;
+
+ @Autowired
+ private CaseplatformBankService caseplatformBankService;
+
+ /**
+ * 获取专家 签名
+ * @return
+ */
+ @ApiOperation(value = "获取专家 签名")
+ @GetMapping("/user/getSign")
+ public ResponseDTO getExpertSign() {
+ ExpertSignVO expertSign = expertSignService.getExpertSign();
+ return ResponseDTO.app_ok(expertSign);
+ }
+
+ /**
+ * 添加专家 签名
+ * 认证银行卡
+ * @return
+ */
+ @ApiOperation(value = "添加专家 签名 & 认证银行卡")
+ @PostMapping("/user/addBank")
+ public ResponseDTO bankVerify(@RequestBody @Valid CaseplatformBankAddForm addForm) {
+ boolean check = BankCardCheckAPI.check(addForm.getName(), addForm.getIdCardNo(), addForm.getBankCardNo());
+ if(check){
+ return caseplatformBankService.add(addForm);
+ }else {
+ return ResponseDTO.error(ExpertBankVerifyFail);
+ }
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertDao.java
new file mode 100644
index 0000000..bb0f60c
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertDao.java
@@ -0,0 +1,18 @@
+package net.lab1024.sa.admin.module.app.expert.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+@Mapper
+@Component
+public interface ExpertDao extends BaseMapper {
+
+ @Select("select * from t_caseplatform_expert where id=#{id}")
+ public ExpertEntity getExpert(Long id);
+
+ @Select("select * from t_caseplatform_expert where uuid=#{uuid}")
+ public ExpertEntity getExpertByUuid(String uuid);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertSignDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertSignDao.java
new file mode 100644
index 0000000..be7f221
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertSignDao.java
@@ -0,0 +1,31 @@
+package net.lab1024.sa.admin.module.app.expert.dao;
+
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignAddForm;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignVO;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Component;
+
+@Mapper
+@Component
+public interface ExpertSignDao {
+
+ @Insert("insert into t_caseplatform_sign(expert_id, sign_img) values(#{expertId}, #{sign_img}) ")
+ public int addExpertSign(@Param("expertId")Long expertId, @Param("sign_img")String sign_img);
+
+ @Select("select t_caseplatform_sign.id,t_caseplatform_sign.expert_id,t_caseplatform_sign.sign_img,t_caseplatform_sign.create_time," +
+ "t_caseplatform_bank.id_card_no,t_caseplatform_bank.bank_card_no,t_caseplatform_bank.bank_name," +
+ "t_caseplatform_expert.mobile,t_caseplatform_expert.name " +
+ "from t_caseplatform_sign " +
+ "left join t_caseplatform_bank on t_caseplatform_sign.expert_id = t_caseplatform_bank.expert_id " +
+ "left join t_caseplatform_expert on t_caseplatform_expert.id = t_caseplatform_sign.expert_id " +
+ "where t_caseplatform_sign.expert_id=#{expert_id} " +
+ "order by t_caseplatform_sign.create_time desc limit 1")
+ public ExpertSignVO getExpertSign(Long expert_id);
+
+ @Update("update t_caseplatform_sign set sign_img=#{sign_img} where id=#{id}")
+ public int updateById(@Param("id")Long id, @Param("sign_img")String sign_img);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertWhiteEntityDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertWhiteEntityDao.java
new file mode 100644
index 0000000..35cc286
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/dao/ExpertWhiteEntityDao.java
@@ -0,0 +1,19 @@
+package net.lab1024.sa.admin.module.app.expert.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertEntity;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertWhiteEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+@Mapper
+@Component
+public interface ExpertWhiteEntityDao extends BaseMapper {
+ @Select("select * from t_caseplatform_expert_white where id=#{id}")
+ public ExpertWhiteEntity getExpertWhite(Long id);
+
+ @Select("SELECT * FROM t_caseplatform_expert_white WHERE name = #{name} AND hospital_name = #{hospitalName}")
+ ExpertWhiteEntity getExpertWhiteByNameAndHospital(@Param("name")String name, @Param("hospitalName")String hospitalName);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertService.java
new file mode 100644
index 0000000..2bc34f6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertService.java
@@ -0,0 +1,82 @@
+package net.lab1024.sa.admin.module.app.expert.service;
+
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertEntity;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertVO;
+import net.lab1024.sa.admin.module.app.expert.dao.ExpertDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorDao;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.token.service.TokenService;
+import net.lab1024.sa.admin.module.system.login.service.LoginService;
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.enumeration.UserTypeEnum;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.loginlog.LoginLogService;
+import net.lab1024.sa.common.module.support.token.LoginDeviceEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ExpertService {
+
+ @Autowired
+ private TokenService tokenService;
+
+ @Autowired
+ private ExpertDao expertDao;
+
+ @Autowired
+ private MedicalRecorDao medicalRecorDao;
+
+
+
+
+ /**
+ * 根据id 查询
+ * @param userId
+ * @return
+ */
+ public ExpertEntity getById(Long userId) {
+ ExpertEntity expert = expertDao.getExpert(userId);
+ return expert;
+ }
+
+ public ExpertVO getInfo() {
+ Long expertId = SmartRequestUtil.getRequestUserId();
+ ExpertEntity expert = expertDao.getExpert(expertId);
+ int waitNum = medicalRecorDao.getNum(expertId, CaseStatusEnum.WAIT.getValue());
+ int passNum = medicalRecorDao.getNum(expertId, CaseStatusEnum.PASS.getValue());
+ int refuseNum = medicalRecorDao.getNum(expertId, CaseStatusEnum.REFUSE.getValue());
+
+ ExpertVO data = SmartBeanUtil.copy(expert, ExpertVO.class);
+ data.setRefuseNum(refuseNum);
+ data.setPassNum(passNum);
+ data.setWaitNum(waitNum);
+ return data;
+ }
+
+ /**
+ * 添加
+ * @return
+ */
+ public ExpertEntity addExpert(ExpertEntity addForm) {
+ String uuid = addForm.getUuid();
+ ExpertEntity expertByUuid = expertDao.getExpertByUuid(uuid);
+ Long id = null;
+ if(expertByUuid == null){
+ expertDao.insert(addForm);
+ id = addForm.getId();
+ }else{
+ id = expertByUuid.getId();
+ addForm.setId(id);
+ expertDao.updateById(addForm);
+ }
+ String name = addForm.getName();
+ String token = tokenService.generateToken(id, name, UserTypeEnum.EXPERT, LoginDeviceEnum.WEIXIN_MP, false);
+ addForm.setToken(token);
+ return addForm;
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertSignService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertSignService.java
new file mode 100644
index 0000000..b5e1488
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertSignService.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.module.app.expert.service;
+
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignAddForm;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignVO;
+import net.lab1024.sa.admin.module.app.expert.dao.ExpertSignDao;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.validation.Valid;
+
+@Service
+public class ExpertSignService {
+
+ @Autowired
+ private ExpertSignDao expertSignDao;
+
+ public ExpertSignVO getExpertSign() {
+ Long expertId = SmartRequestUtil.getRequestUserId();
+ return expertSignDao.getExpertSign(expertId);
+ }
+
+ /**
+ * 添加专家 签名
+ * @return
+ */
+ public ResponseDTO addExpertSign(ExpertSignAddForm addForm) {
+ Long expertId = SmartRequestUtil.getRequestUserId();
+ String signImg = addForm.getSignImg();
+ ExpertSignVO expertSign = expertSignDao.getExpertSign(expertId);
+ if(expertSign == null){
+ expertSignDao.addExpertSign(expertId, signImg);
+ return ResponseDTO.app_ok();
+ }
+ expertSignDao.updateById(expertSign.getId(), signImg);
+ return ResponseDTO.app_ok();
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertWhiteEntityService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertWhiteEntityService.java
new file mode 100644
index 0000000..01fb564
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/expert/service/ExpertWhiteEntityService.java
@@ -0,0 +1,37 @@
+package net.lab1024.sa.admin.module.app.expert.service;
+
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertEntity;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertVO;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertWhiteEntity;
+import net.lab1024.sa.admin.module.app.expert.dao.ExpertDao;
+import net.lab1024.sa.admin.module.app.expert.dao.ExpertWhiteEntityDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorDao;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.token.service.TokenService;
+import net.lab1024.sa.common.common.enumeration.UserTypeEnum;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.token.LoginDeviceEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ExpertWhiteEntityService {
+ @Autowired
+ private ExpertWhiteEntityDao expertWhiteEntityDao;
+
+ /**
+ * 获取白名单用户-姓名、医院名称
+ * @param name 专家姓名
+ * @param hospitalName 专家所属医院名称
+ * @return 白名单类
+ */
+ public ExpertWhiteEntity getExpertWhiteEntityByNameAndHospitalName(String name, String hospitalName) {
+ if (name == null || hospitalName == null) {
+ return null;
+ }
+
+ return expertWhiteEntityDao.getExpertWhiteByNameAndHospital(name, hospitalName);
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/constant/OSSFileTypeEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/constant/OSSFileTypeEnum.java
new file mode 100644
index 0000000..80cc029
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/constant/OSSFileTypeEnum.java
@@ -0,0 +1,26 @@
+package net.lab1024.sa.admin.module.app.file.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+@AllArgsConstructor
+@Getter
+public enum OSSFileTypeEnum implements BaseEnum {
+ PUBLIC(1, "public"),
+ SIGN(2, "sign"),
+ ;
+
+ public static OSSFileTypeEnum getByVal(int val){
+ OSSFileTypeEnum[] values = OSSFileTypeEnum.values();
+ for(OSSFileTypeEnum type:values){
+ if(val == type.getValue()){
+ return type;
+ }
+ }
+ return null;
+ }
+ private final Integer value;
+
+ private final String desc;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/controller/OSSFileController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/controller/OSSFileController.java
new file mode 100644
index 0000000..dc2e5bb
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/controller/OSSFileController.java
@@ -0,0 +1,73 @@
+package net.lab1024.sa.admin.module.app.file.controller;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.MatchMode;
+import com.aliyun.oss.model.PolicyConditions;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.app.file.constant.OSSFileTypeEnum;
+import net.lab1024.sa.admin.module.app.file.domain.OSSPolicyVO;
+import net.lab1024.sa.common.common.annoation.NoNeedLogin;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+import java.util.Date;
+
+import static net.lab1024.sa.common.common.code.UserErrorCode.LOGIN_STATE_INVALID;
+
+@RestController
+@Api(tags = {AdminSwaggerTagConst.App.OSS})
+public class OSSFileController {
+
+ @Value("${file.storage.cloud.endpoint}")
+ private String endpoint;
+
+ @Value("${file.storage.cloud.bucket-name}")
+ private String bucketName;
+
+ @Value("${file.storage.cloud.access-key}")
+ private String accessKey;
+
+ @Value("${file.storage.cloud.secret-key}")
+ private String secretKey;
+
+ @Value("${file.storage.cloud.url.public}")
+ private String host;
+
+ @ApiOperation(value = "获取上传文件 Policy", notes="type==1 普通;type==2 签名图片")
+ @GetMapping("/file/getOSSPolicy/{type}")
+ public ResponseDTO getOSSPolicy(@PathVariable int type){
+ OSSFileTypeEnum ossFileType = OSSFileTypeEnum.getByVal(type);
+ Long requestUserId = SmartRequestUtil.getRequestUserId();
+ String dir = ossFileType.getDesc() + File.separator + requestUserId + File.separator;
+ // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
+ OSSClient client = new OSSClient(endpoint, accessKey, secretKey);
+ try {
+ long expireTime = 30;
+ long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+ Date expiration = new Date(expireEndTime);
+ PolicyConditions policyConds = new PolicyConditions();
+ policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 10*1024*1024);// 最大 10 M
+ policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossFileType.getDesc());
+
+ String postPolicy = client.generatePostPolicy(expiration, policyConds);
+ byte[] binaryData = postPolicy.getBytes("utf-8");
+ String encodedPolicy = BinaryUtil.toBase64String(binaryData);
+ String postSignature = client.calculatePostSignature(postPolicy);
+
+
+ OSSPolicyVO policyVO = new OSSPolicyVO(accessKey, encodedPolicy, postSignature, dir, host, String.valueOf(expireEndTime / 1000));
+ return ResponseDTO.app_ok(policyVO);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return ResponseDTO.userErrorParam();
+ }
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/domain/OSSPolicyVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/domain/OSSPolicyVO.java
new file mode 100644
index 0000000..06692fc
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/file/domain/OSSPolicyVO.java
@@ -0,0 +1,28 @@
+package net.lab1024.sa.admin.module.app.file.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class OSSPolicyVO {
+
+ @ApiModelProperty(value = "OSS accessid")
+ private String accessid;
+
+ @ApiModelProperty(value = "OSS policy")
+ private String policy;
+
+ @ApiModelProperty(value = "OSS 签名")
+ private String signature;
+
+ @ApiModelProperty(value = "OSS 上传路径")
+ private String dir;
+
+ @ApiModelProperty(value = "OSS host")
+ private String host;
+
+ @ApiModelProperty(value = "OSS 过期时间")
+ private String expire;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/controller/MedicalRecordController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/controller/MedicalRecordController.java
new file mode 100644
index 0000000..55e6ee5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/controller/MedicalRecordController.java
@@ -0,0 +1,59 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordAddForm;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordDetailVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordListVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordQueryForm;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordUpdateForm;
+import net.lab1024.sa.admin.module.app.medicalrecord.service.MedicalRecordService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@RestController
+@Api(tags = {AdminSwaggerTagConst.App.MedicalRecord})
+public class MedicalRecordController {
+
+ @Autowired
+ private MedicalRecordService medicalRecordService;
+
+ /**
+ * 列表页
+ * @param queryForm
+ * @return
+ */
+ @ApiOperation(value = "获取病历列表")
+ @PostMapping("/medicalRecord/getList")
+ public ResponseDTO> getList(@RequestBody @Valid MedicalRecordQueryForm queryForm) {
+ return ResponseDTO.app_ok(medicalRecordService.getList(queryForm));
+ }
+
+ @ApiOperation(value = "获取病历详情")
+ @GetMapping("/medicalRecord/getDetail/{MedicalRecordId}")
+ public ResponseDTO getList(@PathVariable Long MedicalRecordId) {
+ return ResponseDTO.app_ok(medicalRecordService.getDetail(MedicalRecordId));
+ }
+
+ @ApiOperation(value = "添加病历")
+ @PostMapping("/medicalRecord/add")
+ public ResponseDTO add(@RequestBody @Valid MedicalRecordAddForm addForm) {
+ return medicalRecordService.add(addForm);
+ }
+
+ @ApiOperation(value = "修改病历")
+ @PostMapping("/medicalRecord/update")
+ public ResponseDTO update(@RequestBody @Valid MedicalRecordUpdateForm updateForm) {
+ return medicalRecordService.update(updateForm);
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorAbstracDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorAbstracDao.java
new file mode 100644
index 0000000..c9ffb09
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorAbstracDao.java
@@ -0,0 +1,16 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordAbstracEntity;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordUserEntity;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Component;
+
+@Mapper
+@Component
+public interface MedicalRecorAbstracDao extends BaseMapper {
+
+ @Delete("delete from t_caseplatform_case_abstract where case_id=#{medicalRecordId}")
+ int deleteByCaseId(Long medicalRecordId);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorCheckDataDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorCheckDataDao.java
new file mode 100644
index 0000000..f809701
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorCheckDataDao.java
@@ -0,0 +1,15 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordCheckdataEntity;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Component;
+
+@Mapper
+@Component
+public interface MedicalRecorCheckDataDao extends BaseMapper {
+
+ @Delete("delete from t_caseplatform_case_checkdata where case_id=#{medicalRecordId}")
+ int deleteByCaseId(Long medicalRecordId);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDao.java
new file mode 100644
index 0000000..90a7729
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDao.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordAbstracEntity;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordDTO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordDetailVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordEntity;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordListVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordQueryForm;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Mapper
+@Component
+public interface MedicalRecorDao extends BaseMapper {
+
+ List getList(Page page, @Param("queryForm") MedicalRecordQueryForm queryForm);
+
+ MedicalRecordDetailVO getDetail(Long MedicalRecordId);
+
+ @Select("select t_caseplatform_case.id, t_caseplatform_case.admission_time from t_caseplatform_case " +
+ "left join t_caseplatform_user on t_caseplatform_case.user_id = t_caseplatform_user.id " +
+ "where t_caseplatform_case.expert_id=#{expertId} and t_caseplatform_user.uid=#{uid} order by admission_time desc")
+ List getAdmissionTimeByUid(@Param("expertId")Long expertId, @Param("uid")String uid);
+
+ @Select("select * from t_caseplatform_case where id=#{MedicalRecordId}")
+ MedicalRecordListVO getById(Long MedicalRecordId);
+
+ @Select("select count(*) from t_caseplatform_case where expert_id=#{expertId} and status=#{status}")
+ int getNum(@Param("expertId")Long expertId, @Param("status")int status);
+
+ @Select("select count(*) from t_caseplatform_case")
+ int getTotal();
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDpmasDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDpmasDao.java
new file mode 100644
index 0000000..a424f30
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorDpmasDao.java
@@ -0,0 +1,24 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.DpmsAddForm;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordDpmsEntity;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordUserEntity;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Mapper
+@Component
+public interface MedicalRecorDpmasDao extends BaseMapper {
+
+ @Select("select * from t_caseplatform_case_dpms where case_id=#{caseId}")
+ List getByCaseId(Long caseId);
+
+ @Delete("delete from t_caseplatform_case_dpms where case_id=#{medicalRecordId}")
+ int deleteByCaseId(Long medicalRecordId);
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorUserDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorUserDao.java
new file mode 100644
index 0000000..14c1b4e
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/dao/MedicalRecorUserDao.java
@@ -0,0 +1,19 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordDetailVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordListVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordQueryForm;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordUserEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Mapper
+@Component
+public interface MedicalRecorUserDao extends BaseMapper {
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/DpmsAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/DpmsAddForm.java
new file mode 100644
index 0000000..08b9f53
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/DpmsAddForm.java
@@ -0,0 +1,21 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Data
+public class DpmsAddForm {
+
+ @ApiModelProperty(value = "治疗时间", required = true)
+ @NotNull(message = "治疗时间 不能为空")
+ private LocalDateTime treatTime;
+
+ @ApiModelProperty(value = "治疗图片", required = true)
+ @NotNull(message = "治疗图片 不能为空")
+ @Length(min = 1, max = 1000, message = "治疗图片 不能为空")
+ private String dpmasImg;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAbstracEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAbstracEntity.java
new file mode 100644
index 0000000..6148e98
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAbstracEntity.java
@@ -0,0 +1,58 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历摘要表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case_abstract")
+public class MedicalRecordAbstracEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联病历表
+ */
+ private Long caseId;
+
+ /**
+ * 病历摘要 文字
+ */
+ private String abstractStr;
+
+ /**
+ * 病历摘要 图片
+ */
+ private String abstractImg;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+
+ public MedicalRecordAbstracEntity(Long caseId, String abstractStr, String abstractImg, LocalDateTime createTime) {
+ this.caseId = caseId;
+ this.abstractStr = abstractStr;
+ this.abstractImg = abstractImg;
+ this.createTime = createTime;
+ }
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAddForm.java
new file mode 100644
index 0000000..7fd8736
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordAddForm.java
@@ -0,0 +1,226 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.domain.PageParam;
+import net.lab1024.sa.common.common.enumeration.GenderEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 前端提交病历 from
+ */
+@Data
+public class MedicalRecordAddForm {
+
+ /*************************基本信息***************************/
+ @ApiModelProperty(value = "患者姓名", required = true)
+ @NotNull(message = "患者姓名 不能为空")
+ @Length(min = 1, max = 20, message = "患者姓名 的长度为在1-20")
+ private String name;
+
+ @ApiModelProperty(value = "患者id", required = true)
+ @NotNull(message = "患者id 不能为空")
+ @Length(min = 1, max = 100, message = "患者id 的长度为在1-100")
+ private String uid;
+
+ @ApiModelPropertyEnum(GenderEnum.class)
+ @CheckEnum(value = GenderEnum.class, message = "性别错误")
+ private Integer sex;
+
+ @ApiModelProperty(value = "年龄", required = true)
+ @NotNull(message = "年龄 不能为空")
+ @Range(min = 1, max = 120, message = "年龄输入有误")
+ private Integer age;
+
+ @ApiModelProperty(value = "入院时间", required = true)
+ @NotNull(message = "入院时间 不能为空")
+ private LocalDateTime admissionTime;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @CheckEnum(value = CasetypeEnum.class, message = "病历类型 错误", required = true)
+ private Integer caseType;
+
+ @ApiModelProperty(value = "基本信息图片", required = true)
+ @NotNull(message = "基本信息图片 不能为空")
+ @Length(min = 1, max = 1000, message = "基本信息图片 不能为空")
+ private String baseImg;
+
+ /*************************临床资料 病历摘要***************************/
+ @ApiModelProperty(value = "临床资料 病历摘要 文字", required = true)
+ private String abstractStr;
+
+ @ApiModelProperty(value = "临床资料 病历摘要 图片", required = true)
+ private String abstractImg;
+
+
+ /*************************DPMAS***************************/
+ @ApiModelProperty(value = "DPMAS", required = true)
+ @NotNull(message = "DPMAS 不能为空")
+ @Valid
+ private List dpmas;
+
+
+ /*************************实验室数据***************************/
+ @ApiModelProperty(value = "治疗前 检测时间", required = true)
+ @NotNull(message = "治疗前 检测时间 不能为空")
+ private LocalDateTime headTime;
+
+ /**
+ * 治疗后 检测时间
+ */
+ @ApiModelProperty(value = "治疗后 检测时间 ", required = true)
+ @NotNull(message = "治疗后 检测时间 不能为空")
+ private LocalDateTime afterTime;
+
+ /**
+ * 治疗前 总胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗前 总胆红素", required = true)
+ @NotNull(message = "治疗前 总胆红素 不能为空")
+ @Length(min = 1, max = 10, message = "治疗前 总胆红素 输入不合法")
+ private String headTb;
+
+ /**
+ * 治疗后 总胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗后 总胆红素 ", required = true)
+ @NotNull(message = "治疗后 总胆红素 不能为空")
+ @Length(min = 1, max = 10, message = "治疗后 总胆红素 输入不合法")
+ private String afterTb;
+
+ /**
+ * 治疗前 白蛋白(g/L)
+ */
+ @ApiModelProperty(value = "治疗前 白蛋白", required = true)
+ private String headAlb;
+
+ /**
+ * 治疗后 白蛋白(g/L)
+ */
+ @ApiModelProperty(value = "治疗后 白蛋白 ", required = true)
+ private String afterAlb;
+
+ /**
+ * 治疗前 直接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗前 直接胆红素", required = true)
+ private String headDb;
+
+ /**
+ * 治疗后 直接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗后 直接胆红素 ", required = true)
+ private String afterDb;
+
+ /**
+ * 治疗前 凝血酶原活动度 (%)
+ */
+ @ApiModelProperty(value = "治疗前 凝血酶原活动度", required = true)
+ private String headPta;
+
+ /**
+ * 治疗后 凝血酶原活动度 (%)
+ */
+ @ApiModelProperty(value = "治疗后 凝血酶原活动度 ", required = true)
+ private String afterPta;
+
+ /**
+ * 治疗前 间接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗前 间接胆红素", required = true)
+ private String headIb;
+
+ /**
+ * 治疗后 间接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗后 间接胆红素 ", required = true)
+ private String afterIb;
+
+ /**
+ * 治疗前 国际标准化比值 (INR)
+ */
+ @ApiModelProperty(value = "治疗前 国际标准化比值", required = true)
+ @NotNull(message = "治疗前 国际标准化比值 不能为空")
+ @Length(min = 1, max = 10, message = "治疗前 国际标准化比值 输入不合法")
+ private String headInr;
+
+ /**
+ * 治疗后 国际标准化比值 (INR)
+ */
+ @ApiModelProperty(value = "治疗后 国际标准化比值 ", required = true)
+ @NotNull(message = "治疗后 国际标准化比值 不能为空")
+ @Length(min = 1, max = 10, message = "治疗后 国际标准化比值 输入不合法")
+ private String afterInr;
+
+ /**
+ * 治疗前 谷丙转氨 (U/L)
+ */
+ @ApiModelProperty(value = "治疗前 谷丙转氨", required = true)
+ @NotNull(message = "治疗前 谷丙转氨 不能为空")
+ @Length(min = 1, max = 10, message = "治疗前 谷丙转氨 输入不合法")
+ private String headAlt;
+
+ /**
+ * 治疗后 谷丙转氨 (U/L)
+ */
+ @ApiModelProperty(value = "治疗后 谷丙转氨 ", required = true)
+ @NotNull(message = "治疗后 谷丙转氨 不能为空")
+ @Length(min = 1, max = 10, message = "治疗后 谷丙转氨 输入不合法")
+ private String afterAlt;
+
+ /**
+ * 治疗前 白介素6(ng/L)
+ */
+ @ApiModelProperty(value = "治疗前 白介素6", required = true)
+ private String headIl6;
+
+ /**
+ * 治疗后 白介素6(ng/L)
+ */
+ @ApiModelProperty(value = "治疗后 白介素6 ", required = true)
+ private String afterIl6;
+
+ /**
+ * 治疗前 谷草转氨酶 (U/L)
+ */
+ @ApiModelProperty(value = "治疗前 谷草转氨酶", required = true)
+ @NotNull(message = "治疗前 谷草转氨酶 不能为空")
+ @Length(min = 1, max = 10, message = "治疗前 谷草转氨酶 输入不合法")
+ private String headAst;
+
+ /**
+ * 治疗后 谷草转氨酶 (U/L)
+ */
+ @ApiModelProperty(value = "治疗后 谷草转氨酶 ", required = true)
+ @NotNull(message = "治疗后 谷草转氨酶 不能为空")
+ @Length(min = 1, max = 10, message = "治疗后 谷草转氨酶 输入不合法")
+ private String afterAst;
+
+ /**
+ * 治疗前 肿瘤坏死因子α(μg/L)
+ */
+ @ApiModelProperty(value = "治疗前 肿瘤坏死因子α", required = true)
+ private String headTnf;
+
+ /**
+ * 治疗后 肿瘤坏死因子α(μg/L)
+ */
+ @ApiModelProperty(value = "治疗后 肿瘤坏死因子α ", required = true)
+ private String afterTnf;
+
+ @ApiModelProperty(value = "实验室检测 图片 图片", required = true)
+ @NotNull(message = "实验室检测 图片 不能为空")
+ @Length(min = 1, max = 1000, message = "实验室检测 图片 不能为空")
+ private String checkImg;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordCheckdataEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordCheckdataEntity.java
new file mode 100644
index 0000000..8dbdd8f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordCheckdataEntity.java
@@ -0,0 +1,155 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 实验室检测 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case_checkdata")
+@Builder
+public class MedicalRecordCheckdataEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联病历
+ */
+ private Long caseId;
+
+ /**
+ * 治疗前 检测时间
+ */
+ private LocalDateTime headTime;
+
+ /**
+ * 治疗后 检测时间
+ */
+ private LocalDateTime afterTime;
+
+ /**
+ * 治疗前 总胆红素(umol/L)
+ */
+ private String headTb;
+
+ /**
+ * 治疗后 总胆红素(umol/L)
+ */
+ private String afterTb;
+
+ /**
+ * 治疗前 白蛋白(g/L)
+ */
+ private String headAlb;
+
+ /**
+ * 治疗后 白蛋白(g/L)
+ */
+ private String afterAlb;
+
+ /**
+ * 治疗前 直接胆红素(umol/L)
+ */
+ private String headDb;
+
+ /**
+ * 治疗后 直接胆红素(umol/L)
+ */
+ private String afterDb;
+
+ /**
+ * 治疗前 凝血酶原活动度 (%)
+ */
+ private String headPta;
+
+ /**
+ * 治疗后 凝血酶原活动度 (%)
+ */
+ private String afterPta;
+
+ /**
+ * 治疗前 间接胆红素(umol/L)
+ */
+ private String headIb;
+
+ /**
+ * 治疗后 间接胆红素(umol/L)
+ */
+ private String afterIb;
+
+ /**
+ * 治疗前 国际标准化比值 (INR)
+ */
+ private String headInr;
+
+ /**
+ * 治疗后 国际标准化比值 (INR)
+ */
+ private String afterInr;
+
+ /**
+ * 治疗前 谷丙转氨 (U/L)
+ */
+ private String headAlt;
+
+ /**
+ * 治疗后 谷丙转氨 (U/L)
+ */
+ private String afterAlt;
+
+ /**
+ * 治疗前 白介素6(ng/L)
+ */
+ private String headIl6;
+
+ /**
+ * 治疗后 白介素6(ng/L)
+ */
+ private String afterIl6;
+
+ /**
+ * 治疗前 谷草转氨酶 (U/L)
+ */
+ private String headAst;
+
+ /**
+ * 治疗后 谷草转氨酶 (U/L)
+ */
+ private String afterAst;
+
+ /**
+ * 治疗前 肿瘤坏死因子α(μg/L)
+ */
+ private String headTnf;
+
+ /**
+ * 治疗后 肿瘤坏死因子α(μg/L)
+ */
+ private String afterTnf;
+
+ /**
+ * 图片
+ */
+ private String checkImg;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDTO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDTO.java
new file mode 100644
index 0000000..74f633c
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDTO.java
@@ -0,0 +1,16 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class MedicalRecordDTO {
+
+ @ApiModelProperty(value = "入院时间", required = true)
+ private LocalDateTime admissionTime;
+
+ @ApiModelProperty(value = "入院时间", required = true)
+ private Long id;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDetailVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDetailVO.java
new file mode 100644
index 0000000..36ef7b6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDetailVO.java
@@ -0,0 +1,211 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.enumeration.GenderEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 前端病历 详情
+ */
+@Data
+public class MedicalRecordDetailVO {
+
+ /*************************基本信息***************************/
+ @ApiModelProperty(value = "患者姓名", required = true)
+ @NotNull(message = "患者姓名 不能为空")
+ private String name;
+
+ @ApiModelProperty(value = "患者id", required = true)
+ @NotNull(message = "患者id 不能为空")
+ private String uid;
+
+ @ApiModelPropertyEnum(GenderEnum.class)
+ @CheckEnum(value = GenderEnum.class, message = "性别错误")
+ private Integer sex;
+
+ @ApiModelProperty(value = "年龄", required = true)
+ @NotNull(message = "年龄 不能为空")
+ private Integer age;
+
+ @ApiModelProperty(value = "入院时间", required = true)
+ @NotNull(message = "入院时间 不能为空")
+ private LocalDateTime admissionTime;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @CheckEnum(value = CasetypeEnum.class, message = "病历类型 错误", required = true)
+ private Integer caseType;
+
+ @ApiModelProperty(value = "基本信息图片", required = true)
+ @NotNull(message = "基本信息图片 不能为空")
+ private String baseImg;
+
+ @ApiModelProperty(value = "病例状态", required = true)
+ private Integer status;
+
+ /*************************临床资料 病历摘要***************************/
+ @ApiModelProperty(value = "临床资料 病历摘要 文字", required = true)
+ @NotNull(message = "临床资料 病历摘要 文字 不能为空")
+ private String abstractStr;
+
+ @ApiModelProperty(value = "临床资料 病历摘要 图片", required = true)
+ @NotNull(message = "临床资料 病历摘要 图片 不能为空")
+ private String abstractImg;
+
+
+ /*************************DPMAS***************************/
+ @ApiModelProperty(value = "临床资料 病历摘要 图片", required = true)
+ @NotNull(message = "临床资料 病历摘要 图片 不能为空")
+ private List dpmas;
+
+
+ /*************************实验室数据***************************/
+ @ApiModelProperty(value = "治疗前 检测时间", required = true)
+ @NotNull(message = "治疗前 检测时间 不能为空")
+ private LocalDateTime headTime;
+
+ /**
+ * 治疗后 检测时间
+ */
+ @ApiModelProperty(value = "治疗后 检测时间 ", required = true)
+ @NotNull(message = "治疗后 检测时间 不能为空")
+ private LocalDateTime afterTime;
+
+ /**
+ * 治疗前 总胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗前 总胆红素", required = true)
+ @NotNull(message = "治疗前 总胆红素 不能为空")
+ private String headTb;
+
+ /**
+ * 治疗后 总胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗后 总胆红素 ", required = true)
+ @NotNull(message = "治疗后 总胆红素 不能为空")
+ private String afterTb;
+
+ /**
+ * 治疗前 白蛋白(g/L)
+ */
+ @ApiModelProperty(value = "治疗前 白蛋白", required = true)
+ private String headAlb;
+
+ /**
+ * 治疗后 白蛋白(g/L)
+ */
+ @ApiModelProperty(value = "治疗后 白蛋白 ", required = true)
+ private String afterAlb;
+
+ /**
+ * 治疗前 直接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗前 直接胆红素", required = true)
+ private String headDb;
+
+ /**
+ * 治疗后 直接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗后 直接胆红素 ", required = true)
+ private String afterDb;
+
+ /**
+ * 治疗前 凝血酶原活动度 (%)
+ */
+ @ApiModelProperty(value = "治疗前 凝血酶原活动度", required = true)
+ private String headPta;
+
+ /**
+ * 治疗后 凝血酶原活动度 (%)
+ */
+ @ApiModelProperty(value = "治疗后 凝血酶原活动度 ", required = true)
+ private String afterPta;
+
+ /**
+ * 治疗前 间接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗前 间接胆红素", required = true)
+ private String headIb;
+
+ /**
+ * 治疗后 间接胆红素(umol/L)
+ */
+ @ApiModelProperty(value = "治疗后 间接胆红素 ", required = true)
+ private String afterIb;
+
+ /**
+ * 治疗前 国际标准化比值 (INR)
+ */
+ @ApiModelProperty(value = "治疗前 国际标准化比值", required = true)
+ @NotNull(message = "治疗前 国际标准化比值 不能为空")
+ private String headInr;
+
+ /**
+ * 治疗后 国际标准化比值 (INR)
+ */
+ @ApiModelProperty(value = "治疗后 国际标准化比值 ", required = true)
+ @NotNull(message = "治疗后 国际标准化比值 不能为空")
+ private String afterInr;
+
+ /**
+ * 治疗前 谷丙转氨 (U/L)
+ */
+ @ApiModelProperty(value = "治疗前 谷丙转氨", required = true)
+ @NotNull(message = "治疗前 谷丙转氨 不能为空")
+ private String headAlt;
+
+ /**
+ * 治疗后 谷丙转氨 (U/L)
+ */
+ @ApiModelProperty(value = "治疗后 谷丙转氨 ", required = true)
+ @NotNull(message = "治疗后 谷丙转氨 不能为空")
+ private String afterAlt;
+
+ /**
+ * 治疗前 白介素6(ng/L)
+ */
+ @ApiModelProperty(value = "治疗前 白介素6", required = true)
+ private String headIl6;
+
+ /**
+ * 治疗后 白介素6(ng/L)
+ */
+ @ApiModelProperty(value = "治疗后 白介素6 ", required = true)
+ private String afterIl6;
+
+ /**
+ * 治疗前 谷草转氨酶 (U/L)
+ */
+ @ApiModelProperty(value = "治疗前 谷草转氨酶", required = true)
+ @NotNull(message = "治疗前 谷草转氨酶 不能为空")
+ private String headAst;
+
+ /**
+ * 治疗后 谷草转氨酶 (U/L)
+ */
+ @ApiModelProperty(value = "治疗后 谷草转氨酶 ", required = true)
+ @NotNull(message = "治疗后 谷草转氨酶 不能为空")
+ private String afterAst;
+
+ /**
+ * 治疗前 肿瘤坏死因子α(μg/L)
+ */
+ @ApiModelProperty(value = "治疗前 肿瘤坏死因子α", required = true)
+ private String headTnf;
+
+ /**
+ * 治疗后 肿瘤坏死因子α(μg/L)
+ */
+ @ApiModelProperty(value = "治疗后 肿瘤坏死因子α ", required = true)
+ private String afterTnf;
+
+ @ApiModelProperty(value = "实验室检测 病历摘要 图片", required = true)
+ @NotNull(message = "实验室检测 图片 不能为空")
+ private String checkImg;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDpmsEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDpmsEntity.java
new file mode 100644
index 0000000..d1c1c22
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordDpmsEntity.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历摘要表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case_dpms")
+public class MedicalRecordDpmsEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联病历表
+ */
+ private Long caseId;
+
+ /**
+ * 治疗时间
+ */
+ private LocalDateTime treatTime;
+
+ /**
+ * 图片
+ */
+ private String dpmasImg;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordEntity.java
new file mode 100644
index 0000000..40bde3f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordEntity.java
@@ -0,0 +1,103 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case")
+public class MedicalRecordEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联用户表
+ */
+ private Long userId;
+
+ /**
+ * 图片
+ */
+ private String baseImg;
+
+ /**
+ * 入院时间
+ */
+ private LocalDateTime admissionTime;
+
+ /**
+ * 病历类型
+ */
+ private Integer caseType;
+
+ /**
+ * 统计 天
+ */
+ private Integer statisticsDay;
+
+ /**
+ * 统计 月
+ */
+ private Integer statisticsMonth;
+
+ /**
+ * 统计 季度
+ */
+ private Integer statisticsQuarter;
+
+ /**
+ * 统计 年
+ */
+ private Integer statisticsYear;
+
+ /**
+ * 专家 id
+ */
+ private Long expertId;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+
+ private Integer status;
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+
+ public MedicalRecordEntity(Long userId, String baseImg, LocalDateTime admissionTime, Integer caseType, Long expertId, LocalDateTime createTime) {
+ this.userId = userId;
+ this.admissionTime = admissionTime;
+ this.caseType = caseType;
+ this.baseImg = baseImg;
+ this.expertId = expertId;
+ this.createTime = createTime;
+ }
+
+ public MedicalRecordEntity(Long id, Long userId, String baseImg, LocalDateTime admissionTime, Integer caseType, Long expertId, Integer status, LocalDateTime updateTime) {
+ this.id = id;
+ this.userId = userId;
+ this.admissionTime = admissionTime;
+ this.caseType = caseType;
+ this.baseImg = baseImg;
+ this.expertId = expertId;
+ this.status = status;
+ this.updateTime = updateTime;
+ }
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordListVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordListVO.java
new file mode 100644
index 0000000..45226e6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordListVO.java
@@ -0,0 +1,45 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+import java.time.LocalDateTime;
+
+/**
+ * 病历表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class MedicalRecordListVO {
+
+ private Long id;
+
+ @ApiModelProperty(value = "用户关联id")
+ private Long userId;
+
+ @ApiModelProperty(value = "用户姓名")
+ private String userName;
+
+ @ApiModelProperty(value = "用户id")
+ private String uid;
+
+ @ApiModelProperty(value = "不通过原因")
+ private String reason;
+
+ @ApiModelProperty(value = "用户性别")
+ private Integer sex;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "状态")
+ private Integer status;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordQueryForm.java
new file mode 100644
index 0000000..f4e6d10
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordQueryForm.java
@@ -0,0 +1,30 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.domain.PageParam;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+
+/**
+ * 前端请求列表的 from
+ */
+@Data
+public class MedicalRecordQueryForm extends PageParam {
+
+ @ApiModelProperty(value = "name")
+ private String name;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @CheckEnum(value = CasetypeEnum.class, message = "病历类型 错误")
+ private Integer caseType;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "病例状态(0待审核 1审核通过 2审核不通过)")
+ @CheckEnum(value = CaseStatusEnum.class, message = "病例状态 错误")
+ private Integer status;
+
+ @ApiModelProperty(hidden = true)
+ private Long expertId;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUpdateForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUpdateForm.java
new file mode 100644
index 0000000..2be4415
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUpdateForm.java
@@ -0,0 +1,24 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.enumeration.GenderEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 前端提交病历 from
+ */
+@Data
+public class MedicalRecordUpdateForm extends MedicalRecordAddForm{
+
+ @ApiModelProperty(value = "病例ID", required = true)
+ @NotNull(message = "病例ID 不能为空")
+ private Long id;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUserEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUserEntity.java
new file mode 100644
index 0000000..dc368e8
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/domain/MedicalRecordUserEntity.java
@@ -0,0 +1,72 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 用户表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_user")
+public class MedicalRecordUserEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联医生id
+ */
+ private Long expertId;
+
+ /**
+ * 患者姓名
+ */
+ private String name;
+
+ /**
+ * 患者id
+ */
+ private String uid;
+
+
+
+ /**
+ * 性别
+ */
+ private Integer sex;
+
+ /**
+ * 年龄
+ */
+ private Integer age;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+
+ public MedicalRecordUserEntity(Long expertId, String name, String uid, Integer sex, Integer age, LocalDateTime createTime) {
+ this.expertId = expertId;
+ this.name = name;
+ this.uid = uid;
+ this.sex = sex;
+ this.age = age;
+ this.createTime = createTime;
+ }
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/service/MedicalRecordService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/service/MedicalRecordService.java
new file mode 100644
index 0000000..e2b16a5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/app/medicalrecord/service/MedicalRecordService.java
@@ -0,0 +1,680 @@
+package net.lab1024.sa.admin.module.app.medicalrecord.service;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignVO;
+import net.lab1024.sa.admin.module.app.expert.service.ExpertSignService;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorAbstracDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorCheckDataDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorDpmasDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.dao.MedicalRecorUserDao;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.*;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.config.ConfigKeyEnum;
+import net.lab1024.sa.common.module.support.config.ConfigService;
+import net.lab1024.sa.common.module.support.config.domain.ConfigVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static net.lab1024.sa.common.common.code.UserErrorCode.NO_PERMISSION_EDIT;
+import static net.lab1024.sa.common.common.code.UserErrorCode.PROJECT_CLOSE;
+
+@Service
+public class MedicalRecordService {
+
+ @Autowired
+ private MedicalRecorDao medicalRecorDao;
+
+ @Autowired
+ private MedicalRecorUserDao medicalRecorUserDao;
+
+ @Autowired
+ private MedicalRecorAbstracDao medicalRecorAbstracDao;
+
+ @Autowired
+ private MedicalRecorDpmasDao medicalRecorDpmasDao;
+
+ @Autowired
+ private MedicalRecorCheckDataDao medicalRecorCheckDataDao;
+
+ @Autowired
+ private ConfigService configService;
+
+ @Autowired
+ private ExpertSignService expertSignService;
+
+ public PageResult getList(MedicalRecordQueryForm queryForm){
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ Long expertId = SmartRequestUtil.getRequestUserId();
+ queryForm.setExpertId(expertId);
+ List list = medicalRecorDao.getList(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+ public MedicalRecordDetailVO getDetail(Long MedicalRecordId){
+ MedicalRecordDetailVO detail = medicalRecorDao.getDetail(MedicalRecordId);
+ List dpmas = medicalRecorDpmasDao.getByCaseId(MedicalRecordId);
+ detail.setDpmas(dpmas);
+ return detail;
+ }
+
+ @Transactional
+ public ResponseDTO add(MedicalRecordAddForm addForm){
+
+
+ ConfigVO caseNum = configService.getConfig(ConfigKeyEnum.CaseNum);
+ int total = medicalRecorDao.getTotal();
+ if(Integer.parseInt(caseNum.getConfigValue()) <= total){
+ return ResponseDTO.error(PROJECT_CLOSE);
+ }
+
+ Long expertId = SmartRequestUtil.getRequestUserId();
+
+ ExpertSignVO expertSign = expertSignService.getExpertSign();
+ if(expertSign == null){
+ return ResponseDTO.userErrorParam("请先签署项目协议!");
+ }
+ /*************************前置 检查*****************************/
+
+ ResponseDTO check = check(SmartBeanUtil.copy(addForm, MedicalRecordUpdateForm.class), expertId);
+
+ if(!check.getOk()){
+ return check;
+ }
+
+ //病历类型
+ Integer caseType = addForm.getCaseType();
+ List dpmas = addForm.getDpmas();
+ //入院时间
+ LocalDateTime admissionTime = addForm.getAdmissionTime();
+
+ //患者id
+ String uid = addForm.getUid();
+
+ //临床资料 病历摘要 文字
+ String abstractStr = addForm.getAbstractStr();
+
+ //临床资料 病历摘要 图片
+ String abstractImg = addForm.getAbstractImg();
+
+
+ //治疗前 检测时间
+ LocalDateTime headTime = addForm.getHeadTime();
+
+ /**
+ * 治疗后 检测时间
+ */
+ LocalDateTime afterTime = addForm.getAfterTime();
+
+
+
+
+ /*************************基本信息*****************************/
+ //姓名
+ String name = addForm.getName();
+
+ //性别
+ Integer sex = addForm.getSex();
+
+ //年龄
+ Integer age = addForm.getAge();
+
+ //基本信息图片
+ String baseImg = addForm.getBaseImg();
+
+ MedicalRecordUserEntity user = new MedicalRecordUserEntity(expertId, name, uid, sex, age, LocalDateTime.now());
+ medicalRecorUserDao.insert(user);
+ Long userId = user.getId();
+ /*************************病例主体***************************/
+
+ MedicalRecordEntity medicalRecord = new MedicalRecordEntity(userId, baseImg, admissionTime, caseType, expertId, LocalDateTime.now());
+
+ DateTime nowDate = DateUtil.date();
+ String statistics_date = DateUtil.format(nowDate, "yyyyMMdd");
+ String statistics_month = DateUtil.format(nowDate, "yyyyMM");
+ String statistics_year = DateUtil.format(nowDate, "yyyy");
+ int quarter = DateUtil.quarter(nowDate);
+ String statistics_quarter = statistics_year + quarter;
+
+ medicalRecord.setStatisticsDay(Integer.parseInt(statistics_date));
+ medicalRecord.setStatisticsMonth(Integer.parseInt(statistics_month));
+ medicalRecord.setStatisticsQuarter(Integer.parseInt(statistics_quarter));
+ medicalRecord.setStatisticsYear(Integer.parseInt(statistics_year));
+ medicalRecorDao.insert(medicalRecord);
+ Long medicalRecordId = medicalRecord.getId();
+
+ /*************************临床资料 病历摘要***************************/
+
+
+
+ MedicalRecordAbstracEntity abstracEntity = new MedicalRecordAbstracEntity(medicalRecordId, abstractStr, abstractImg, LocalDateTime.now());
+ medicalRecorAbstracDao.insert(abstracEntity);
+ /*************************DPMAS***************************/
+ //DPMAS
+
+ for(DpmsAddForm item:dpmas){
+ MedicalRecordDpmsEntity dp = new MedicalRecordDpmsEntity();
+ dp.setDpmasImg(item.getDpmasImg());
+ dp.setCaseId(medicalRecordId);
+ dp.setTreatTime(item.getTreatTime());
+ medicalRecorDpmasDao.insert(dp);
+ }
+ /*************************实验室数据***************************/
+
+ /**
+ * 治疗前 总胆红素(umol/L)
+ */
+ String headTb = addForm.getHeadTb();
+
+ /**
+ * 治疗后 总胆红素(umol/L)
+ */
+ String afterTb = addForm.getAfterTb();
+
+ /**
+ * 治疗前 白蛋白(g/L)
+ */
+ String headAlb = addForm.getHeadAlb();
+
+ /**
+ * 治疗后 白蛋白(g/L)
+ */
+ String afterAlb = addForm.getAfterAlb();
+
+ /**
+ * 治疗前 直接胆红素(umol/L)
+ */
+ String headDb = addForm.getHeadDb();
+
+ /**
+ * 治疗后 直接胆红素(umol/L)
+ */
+ String afterDb = addForm.getAfterDb();
+
+ /**
+ * 治疗前 凝血酶原活动度 (%)
+ */
+ String headPta = addForm.getHeadPta();
+
+ /**
+ * 治疗后 凝血酶原活动度 (%)
+ */
+ String afterPta = addForm.getAfterPta();
+
+ /**
+ * 治疗前 间接胆红素(umol/L)
+ */
+ String headIb = addForm.getHeadIb();
+
+ /**
+ * 治疗后 间接胆红素(umol/L)
+ */
+ String afterIb = addForm.getAfterIb();
+
+ /**
+ * 治疗前 国际标准化比值 (INR)
+ */
+ String headInr = addForm.getHeadInr();
+
+ /**
+ * 治疗后 国际标准化比值 (INR)
+ */
+ String afterInr = addForm.getAfterInr();
+
+ /**
+ * 治疗前 谷丙转氨 (U/L)
+ */
+ String headAlt = addForm.getHeadAlt();
+
+ /**
+ * 治疗后 谷丙转氨 (U/L)
+ */
+ String afterAlt = addForm.getAfterAlt();
+
+ /**
+ * 治疗前 白介素6(ng/L)
+ */
+ String headIl6 = addForm.getHeadIl6();
+
+ /**
+ * 治疗后 白介素6(ng/L)
+ */
+ String afterIl6 = addForm.getAfterIl6();
+
+ /**
+ * 治疗前 谷草转氨酶 (U/L)
+ */
+ String headAst = addForm.getHeadAst();
+
+ /**
+ * 治疗后 谷草转氨酶 (U/L)
+ */
+ String afterAst = addForm.getAfterAst();
+
+ /**
+ * 治疗前 肿瘤坏死因子α(μg/L)
+ */
+ String headTnf = addForm.getHeadTnf();
+
+ /**
+ * 治疗后 肿瘤坏死因子α(μg/L)
+ */
+ String afterTnf = addForm.getAfterTnf();
+
+ //实验室检测 病历摘要 图片
+ String checkImg = addForm.getCheckImg();
+
+ MedicalRecordCheckdataEntity CheckdataEntity = MedicalRecordCheckdataEntity.builder()
+ .afterAlb(afterAlb)
+ .afterAlt(afterAlt)
+ .afterAst(afterAst)
+ .afterDb(afterDb)
+ .afterIb(afterIb)
+ .afterIl6(afterIl6)
+ .afterInr(afterInr)
+ .afterPta(afterPta)
+ .afterTb(afterTb)
+ .afterTime(afterTime)
+ .afterTnf(afterTnf)
+ .headAst(headAst)
+ .headDb(headDb)
+ .headIb(headIb)
+ .headIl6(headIl6)
+ .headAlb(headAlb)
+ .headAlt(headAlt)
+ .headInr(headInr)
+ .headPta(headPta)
+ .headTb(headTb)
+ .headTime(headTime)
+ .headTnf(headTnf)
+ .headAlt(headAlt)
+ .headAlt(headAlt)
+ .checkImg(checkImg)
+ .createTime(LocalDateTime.now())
+ .caseId(medicalRecordId)
+ .build();
+
+ medicalRecorCheckDataDao.insert(CheckdataEntity);
+ return ResponseDTO.app_ok();
+ }
+
+ @Transactional
+ public ResponseDTO update(MedicalRecordUpdateForm updateForm){
+ Long expertId = SmartRequestUtil.getRequestUserId();
+ Long medicalRecordId = updateForm.getId();
+ MedicalRecordListVO recorDaoById = medicalRecorDao.getById(medicalRecordId);
+ if(recorDaoById == null){
+ return ResponseDTO.userErrorParam();
+ }
+ /*************************前置 检查*****************************/
+
+ Integer status = recorDaoById.getStatus();
+
+ if(!status.equals(CaseStatusEnum.REFUSE.getValue())){
+ return ResponseDTO.error(NO_PERMISSION_EDIT);
+ }
+ ResponseDTO check = check(updateForm, expertId);
+
+ if(!check.getOk()){
+ return check;
+ }
+
+ //病历类型
+ Integer caseType = updateForm.getCaseType();
+ List dpmas = updateForm.getDpmas();
+ //入院时间
+ LocalDateTime admissionTime = updateForm.getAdmissionTime();
+
+ //临床资料 病历摘要 文字
+ String abstractStr = updateForm.getAbstractStr();
+
+ //临床资料 病历摘要 图片
+ String abstractImg = updateForm.getAbstractImg();
+
+
+ //治疗前 检测时间
+ LocalDateTime headTime = updateForm.getHeadTime();
+
+ /**
+ * 治疗后 检测时间
+ */
+ LocalDateTime afterTime = updateForm.getAfterTime();
+
+ /*************************基本信息*****************************/
+ //姓名
+ String name = updateForm.getName();
+
+ //性别
+ Integer sex = updateForm.getSex();
+
+ //年龄
+ Integer age = updateForm.getAge();
+
+ //基本信息图片
+ String baseImg = updateForm.getBaseImg();
+
+ //患者id
+ String uid = updateForm.getUid();
+
+ Long userId = recorDaoById.getUserId();
+ MedicalRecordUserEntity user = new MedicalRecordUserEntity(expertId, name, uid, sex, age, LocalDateTime.now());
+ user.setId(userId);
+ medicalRecorUserDao.updateById(user);
+ /*************************病例主体***************************/
+
+ MedicalRecordEntity medicalRecord = new MedicalRecordEntity(medicalRecordId, userId, baseImg, admissionTime, caseType, expertId, CaseStatusEnum.WAIT.getValue(), LocalDateTime.now());
+ medicalRecorDao.updateById(medicalRecord);
+ /*************************临床资料 病历摘要***************************/
+
+ medicalRecorAbstracDao.deleteByCaseId(medicalRecordId);
+ MedicalRecordAbstracEntity abstracEntity = new MedicalRecordAbstracEntity(medicalRecordId, abstractStr, abstractImg, LocalDateTime.now());
+ medicalRecorAbstracDao.insert(abstracEntity);
+ /*************************DPMAS***************************/
+ //DPMAS
+ medicalRecorDpmasDao.deleteByCaseId(medicalRecordId);
+ for(DpmsAddForm item:dpmas){
+ MedicalRecordDpmsEntity dp = new MedicalRecordDpmsEntity();
+ dp.setDpmasImg(item.getDpmasImg());
+ dp.setCaseId(medicalRecordId);
+ dp.setTreatTime(item.getTreatTime());
+ medicalRecorDpmasDao.insert(dp);
+ }
+ /*************************实验室数据***************************/
+
+ /**
+ * 治疗前 总胆红素(umol/L)
+ */
+ String headTb = updateForm.getHeadTb();
+
+ /**
+ * 治疗后 总胆红素(umol/L)
+ */
+ String afterTb = updateForm.getAfterTb();
+
+ /**
+ * 治疗前 白蛋白(g/L)
+ */
+ String headAlb = updateForm.getHeadAlb();
+
+ /**
+ * 治疗后 白蛋白(g/L)
+ */
+ String afterAlb = updateForm.getAfterAlb();
+
+ /**
+ * 治疗前 直接胆红素(umol/L)
+ */
+ String headDb = updateForm.getHeadDb();
+
+ /**
+ * 治疗后 直接胆红素(umol/L)
+ */
+ String afterDb = updateForm.getAfterDb();
+
+ /**
+ * 治疗前 凝血酶原活动度 (%)
+ */
+ String headPta = updateForm.getHeadPta();
+
+ /**
+ * 治疗后 凝血酶原活动度 (%)
+ */
+ String afterPta = updateForm.getAfterPta();
+
+ /**
+ * 治疗前 间接胆红素(umol/L)
+ */
+ String headIb = updateForm.getHeadIb();
+
+ /**
+ * 治疗后 间接胆红素(umol/L)
+ */
+ String afterIb = updateForm.getAfterIb();
+
+ /**
+ * 治疗前 国际标准化比值 (INR)
+ */
+ String headInr = updateForm.getHeadInr();
+
+ /**
+ * 治疗后 国际标准化比值 (INR)
+ */
+ String afterInr = updateForm.getAfterInr();
+
+ /**
+ * 治疗前 谷丙转氨 (U/L)
+ */
+ String headAlt = updateForm.getHeadAlt();
+
+ /**
+ * 治疗后 谷丙转氨 (U/L)
+ */
+ String afterAlt = updateForm.getAfterAlt();
+
+ /**
+ * 治疗前 白介素6(ng/L)
+ */
+ String headIl6 = updateForm.getHeadIl6();
+
+ /**
+ * 治疗后 白介素6(ng/L)
+ */
+ String afterIl6 = updateForm.getAfterIl6();
+
+ /**
+ * 治疗前 谷草转氨酶 (U/L)
+ */
+ String headAst = updateForm.getHeadAst();
+
+ /**
+ * 治疗后 谷草转氨酶 (U/L)
+ */
+ String afterAst = updateForm.getAfterAst();
+
+ /**
+ * 治疗前 肿瘤坏死因子α(μg/L)
+ */
+ String headTnf = updateForm.getHeadTnf();
+
+ /**
+ * 治疗后 肿瘤坏死因子α(μg/L)
+ */
+ String afterTnf = updateForm.getAfterTnf();
+
+ //实验室检测 病历摘要 图片
+ String checkImg = updateForm.getCheckImg();
+
+ MedicalRecordCheckdataEntity CheckdataEntity = MedicalRecordCheckdataEntity.builder()
+ .afterAlb(afterAlb)
+ .afterAlt(afterAlt)
+ .afterAst(afterAst)
+ .afterDb(afterDb)
+ .afterIb(afterIb)
+ .afterIl6(afterIl6)
+ .afterInr(afterInr)
+ .afterPta(afterPta)
+ .afterTb(afterTb)
+ .afterTime(afterTime)
+ .afterTnf(afterTnf)
+ .headAst(headAst)
+ .headDb(headDb)
+ .headIb(headIb)
+ .headIl6(headIl6)
+ .headAlb(headAlb)
+ .headAlt(headAlt)
+ .headInr(headInr)
+ .headPta(headPta)
+ .headTb(headTb)
+ .headTime(headTime)
+ .headTnf(headTnf)
+ .headAlt(headAlt)
+ .headAlt(headAlt)
+ .checkImg(checkImg)
+ .createTime(LocalDateTime.now())
+ .caseId(medicalRecordId)
+ .build();
+
+ medicalRecorCheckDataDao.deleteByCaseId(medicalRecordId);
+
+ medicalRecorCheckDataDao.insert(CheckdataEntity);
+ return ResponseDTO.app_ok();
+ }
+
+ public ResponseDTO check(MedicalRecordUpdateForm form, Long expertId){
+
+ ConfigVO caseSwitch = configService.getConfig(ConfigKeyEnum.CaseSwitch);
+ if(caseSwitch.getConfigValue().equals("false")){
+ return ResponseDTO.error(PROJECT_CLOSE);
+ }
+ /*************************前置 检查*****************************/
+
+ //入院时间
+ LocalDateTime admissionTime = form.getAdmissionTime();
+ //患者id
+ String uid = form.getUid();
+ //获取全部病例
+ List admissionTimeByUid = medicalRecorDao.getAdmissionTimeByUid(expertId, uid);
+ for(MedicalRecordDTO dto:admissionTimeByUid){
+ if(dto.getId().equals(form.getId())){
+ continue;
+ }
+ long daysDiff = Duration.between(dto.getAdmissionTime(), admissionTime).toDays();
+ if(Math.abs(daysDiff) < 30){
+ return ResponseDTO.userErrorParam("同一患者记录入院时间必须间隔30天以上!");
+ }
+ }
+
+ String baseImg = form.getBaseImg();
+ String[] baseImgNum = baseImg.split(",");
+ if(baseImgNum.length > 6){
+ return ResponseDTO.userErrorParam("病案照片应为(1-6张)!");
+ }
+
+ //临床资料 病历摘要 文字
+ String abstractStr = form.getAbstractStr();
+
+ //临床资料 病历摘要 图片
+ String abstractImg = form.getAbstractImg();
+
+ if(StrUtil.isBlank(abstractStr+abstractImg)){
+ return ResponseDTO.userErrorParam("临床资料 病历摘要或者病历图片至少上传一项");
+ }
+
+ String[] abstractImgNum = abstractImg.split(",");
+ if(abstractImgNum.length > 6){
+ return ResponseDTO.userErrorParam("病历摘要图片照片应为(1-6张)!");
+ }
+ //病历类型
+ Integer caseType = form.getCaseType();
+ List dpmas = form.getDpmas();
+
+ int size = dpmas.size();
+
+ if(caseType == CasetypeEnum.BEFORE.getValue()){
+ if(size == 0){
+ return ResponseDTO.userErrorParam("至少上传1次DPMAS数据!");
+ }
+ }
+ if(caseType == CasetypeEnum.DEFAULT.getValue()){
+ if(size < 4){
+ return ResponseDTO.userErrorParam("至少上传4次DPMAS数据!");
+ }
+ }
+ LocalDateTime firstTreatTime = dpmas.get(0).getTreatTime();//第一次治疗时间
+
+ //治疗时间 2024
+
+ int headYear = firstTreatTime.getYear();
+
+ if(headYear != 2024){
+ return ResponseDTO.userErrorParam("治疗时间:限制在2024年1月1日-2024年12月31日!");
+ }
+
+ LocalDateTime lastTreatTime = dpmas.get(size-1).getTreatTime();//最后一次治疗时间
+
+ if(firstTreatTime.toLocalDate().compareTo(admissionTime.toLocalDate()) < 0){
+ return ResponseDTO.userErrorParam("第1次治疗时间比患者基本信息入院时间后!");
+ }
+ LocalDateTime temp = firstTreatTime;
+ for(int i=0;i 0){
+ if(!treatTime.isAfter(temp)){
+ return ResponseDTO.userErrorParam("第"+(i+1)+"次治疗时间必须在第"+i+"次治疗时间后!");
+ }
+ }
+
+ String dpmasImg = dpmas.get(i).getDpmasImg();
+ String[] dpmasImgNum = dpmasImg.split(",");
+ if(dpmasImgNum.length > 3){
+ return ResponseDTO.userErrorParam("第"+(i+1)+"次治疗照片应为(1-3张)!");
+ }
+ temp = treatTime;
+ }
+
+ int lastYear = lastTreatTime.getYear();
+ if(lastYear != 2024){
+ return ResponseDTO.userErrorParam("治疗时间:限制在2024年1月1日-2024年12月31日!");
+ }
+
+ //治疗前 检测时间
+ LocalDateTime headTime = form.getHeadTime();
+
+ /**
+ * 治疗后 检测时间
+ */
+ LocalDateTime afterTime = form.getAfterTime();
+
+ if(!afterTime.isAfter(headTime)){
+ return ResponseDTO.userErrorParam("治疗前检测时间:应该小于治疗后检测时间!");
+ }
+
+ if(caseType == CasetypeEnum.BEFORE.getValue()){
+ if((headTime.toLocalDate().compareTo(admissionTime.toLocalDate())) < 0 || (headTime.toLocalDate().compareTo(firstTreatTime.toLocalDate())) > 0){
+ return ResponseDTO.userErrorParam("治疗前检测时间:应该在入院时间与第1次治疗时间之间!");
+ }
+ if(size == 1){
+ if(afterTime.toLocalDate().compareTo(firstTreatTime.toLocalDate()) < 0){
+ return ResponseDTO.userErrorParam("治疗后检测时间:应该在第1次治疗时间之后");
+ }
+ }
+ //治疗后检测时间:应该在第一次治疗时间之后,如果有第二次治疗时间,在应该在第一次与第二次治疗时间之间
+ if(size >= 2){
+ LocalDateTime secondTreatTime = dpmas.get(1).getTreatTime();//第2次治疗时间
+ if((afterTime.toLocalDate().compareTo(firstTreatTime.toLocalDate())) < 0 || (afterTime.compareTo(secondTreatTime)) > 0){
+ return ResponseDTO.userErrorParam("治疗后检测时间:应该在第1次与第2次治疗时间之间");
+ }
+ }
+ }
+ if(caseType == CasetypeEnum.DEFAULT.getValue()){
+ if((headTime.toLocalDate().compareTo(admissionTime.toLocalDate())) < 0 || (headTime.toLocalDate().compareTo(firstTreatTime.toLocalDate())) > 0){
+ return ResponseDTO.userErrorParam("治疗前检测时间:应该在入院时间与第1次治疗时间之间!");
+ }
+ if(afterTime.toLocalDate().compareTo(lastTreatTime.toLocalDate()) < 0){
+ return ResponseDTO.userErrorParam("治疗后检测时间:应该在最后1次治疗时间之后");
+ }
+ }
+
+ String checkImg = form.getCheckImg();
+ String[] checkImgNum = checkImg.split(",");
+ if(checkImgNum.length > 6){
+ return ResponseDTO.userErrorParam("实验室检测照片应为(1-6张)!");
+ }
+ return ResponseDTO.app_ok();
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/controller/AreaController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/controller/AreaController.java
new file mode 100644
index 0000000..5a578fa
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/controller/AreaController.java
@@ -0,0 +1,54 @@
+package net.lab1024.sa.admin.module.business.area.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.business.area.domain.form.AreaQueryForm;
+import net.lab1024.sa.admin.module.business.area.domain.vo.ProvVO;
+import net.lab1024.sa.admin.module.business.area.service.AreaService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 省市区 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+
+@RestController
+@Api(tags = "")
+public class AreaController {
+
+ @Autowired
+ private AreaService areaService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/area/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid AreaQueryForm queryForm) {
+ return ResponseDTO.ok(areaService.queryPage(queryForm));
+ }
+
+ @ApiOperation("获取省份 @author HMM")
+ @GetMapping("/area/provList")
+ public ResponseDTO> provList() {
+ return ResponseDTO.ok(areaService.provList());
+ }
+
+ @ApiOperation("获取市区 @author HMM")
+ @GetMapping("/area/cityList/{parent}")
+ public ResponseDTO> cityList(@PathVariable Long parent) {
+ return ResponseDTO.ok(areaService.cityList(parent));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/dao/AreaDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/dao/AreaDao.java
new file mode 100644
index 0000000..a9bfbf1
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/dao/AreaDao.java
@@ -0,0 +1,51 @@
+package net.lab1024.sa.admin.module.business.area.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.area.domain.entity.AreaEntity;
+import net.lab1024.sa.admin.module.business.area.domain.form.AreaQueryForm;
+import net.lab1024.sa.admin.module.business.area.domain.vo.ProvVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 省市区 Dao
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface AreaDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") AreaQueryForm queryForm);
+
+ /**
+ * 获取省份列表
+ * @return
+ */
+ @Select("select * from t_area where parent is null")
+ List provList();
+
+ /**
+ * 获取城市列表
+ * @return
+ */
+ @Select("select * from t_area where parent = #{parent}")
+ List cityList(long parent);
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/entity/AreaEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/entity/AreaEntity.java
new file mode 100644
index 0000000..0a18e77
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/entity/AreaEntity.java
@@ -0,0 +1,62 @@
+package net.lab1024.sa.admin.module.business.area.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 省市区 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_area")
+public class AreaEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createDate;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime modifyDate;
+
+ /**
+ * 排序
+ */
+ private Integer orders;
+
+ /**
+ * 全名
+ */
+ private String fullName;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 树路径
+ */
+ private String treePath;
+
+ /**
+ * 父节点
+ */
+ private Long parent;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/form/AreaQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/form/AreaQueryForm.java
new file mode 100644
index 0000000..f96ba96
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/form/AreaQueryForm.java
@@ -0,0 +1,17 @@
+package net.lab1024.sa.admin.module.business.area.domain.form;
+
+import lombok.Data;
+import net.lab1024.sa.common.common.domain.PageParam;
+
+/**
+ * 省市区 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+
+@Data
+public class AreaQueryForm extends PageParam{
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/AreaVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/AreaVO.java
new file mode 100644
index 0000000..065c7be
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/AreaVO.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.business.area.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 省市区 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+
+@Data
+public class AreaVO {
+
+ @ApiModelProperty(value = "主键")
+ private Long id;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createDate;
+
+ @ApiModelProperty(value = "更新时间")
+ private LocalDateTime modifyDate;
+
+ @ApiModelProperty(value = "排序")
+ private Integer orders;
+
+ @ApiModelProperty(value = "全名")
+ private String fullName;
+
+ @ApiModelProperty(value = "名称")
+ private String name;
+
+ @ApiModelProperty(value = "树路径")
+ private String treePath;
+
+ @ApiModelProperty(value = "父节点")
+ private Long parent;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/ProvVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/ProvVO.java
new file mode 100644
index 0000000..0a4044c
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/domain/vo/ProvVO.java
@@ -0,0 +1,14 @@
+package net.lab1024.sa.admin.module.business.area.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProvVO {
+
+ @ApiModelProperty(value = "主键")
+ private Long id;
+
+ @ApiModelProperty(value = "名称")
+ private String name;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/manager/AreaManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/manager/AreaManager.java
new file mode 100644
index 0000000..73b7d99
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/manager/AreaManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.area.manager;
+
+import net.lab1024.sa.admin.module.business.area.domain.entity.AreaEntity;
+import net.lab1024.sa.admin.module.business.area.dao.AreaDao;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 省市区 Manager
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+@Service
+public class AreaManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/service/AreaService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/service/AreaService.java
new file mode 100644
index 0000000..c8e8258
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/area/service/AreaService.java
@@ -0,0 +1,57 @@
+package net.lab1024.sa.admin.module.business.area.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.area.dao.AreaDao;
+import net.lab1024.sa.admin.module.business.area.domain.form.AreaQueryForm;
+import net.lab1024.sa.admin.module.business.area.domain.vo.ProvVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 省市区 Service
+ *
+ * @Author HMM
+ * @Date 2024-01-12 16:03:16
+ * @Copyright gdxz
+ */
+
+@Service
+public class AreaService {
+
+ @Autowired
+ private AreaDao areaDao;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public PageResult queryPage(AreaQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = areaDao.queryPage(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+ public List provList() {
+ return areaDao.provList();
+ }
+
+ public List cityList(Long parent) {
+ return areaDao.cityList(parent);
+ }
+
+ public List areaList(Long parent) {
+ if(parent == null){
+ return areaDao.provList();
+ }
+ return areaDao.cityList(parent);
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/controller/CaseplatformBankController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/controller/CaseplatformBankController.java
new file mode 100644
index 0000000..8d3dac3
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/controller/CaseplatformBankController.java
@@ -0,0 +1,44 @@
+package net.lab1024.sa.admin.module.business.bankcard.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.business.bankcard.domain.form.CaseplatformBankAddForm;
+import net.lab1024.sa.admin.module.business.bankcard.domain.form.CaseplatformBankQueryForm;
+import net.lab1024.sa.admin.module.business.bankcard.domain.vo.CaseplatformBankVO;
+import net.lab1024.sa.admin.module.business.bankcard.service.CaseplatformBankService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+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.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 银行卡 Controller
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@RestController
+public class CaseplatformBankController {
+
+ @Autowired
+ private CaseplatformBankService caseplatformBankService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/caseplatformBank/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid CaseplatformBankQueryForm queryForm) {
+ return ResponseDTO.ok(caseplatformBankService.queryPage(queryForm));
+ }
+
+ @ApiOperation("添加 @author HMM")
+ @PostMapping("/caseplatformBank/add")
+ public ResponseDTO add(@RequestBody @Valid CaseplatformBankAddForm addForm) {
+ return caseplatformBankService.add(addForm);
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/dao/CaseplatformBankDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/dao/CaseplatformBankDao.java
new file mode 100644
index 0000000..9c0bdeb
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/dao/CaseplatformBankDao.java
@@ -0,0 +1,44 @@
+package net.lab1024.sa.admin.module.business.bankcard.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.bankcard.domain.entity.CaseplatformBankEntity;
+import net.lab1024.sa.admin.module.business.bankcard.domain.form.CaseplatformBankQueryForm;
+import net.lab1024.sa.admin.module.business.bankcard.domain.vo.CaseplatformBankVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 银行卡 Dao
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface CaseplatformBankDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") CaseplatformBankQueryForm queryForm);
+
+ /**
+ * 获取医生的银行卡信息
+ * @param expertId
+ * @return
+ */
+ @Select("select * from t_caseplatform_bank where expert_id=#{expertId} order by create_time desc limit 1")
+ CaseplatformBankVO getExpertBank(Long expertId);
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/entity/CaseplatformBankEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/entity/CaseplatformBankEntity.java
new file mode 100644
index 0000000..ad3598d
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/entity/CaseplatformBankEntity.java
@@ -0,0 +1,67 @@
+package net.lab1024.sa.admin.module.business.bankcard.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 银行卡 实体类
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_bank")
+public class CaseplatformBankEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 专家id
+ */
+ private Long expertId;
+
+ /**
+ * 身份证
+ */
+ private String idCardNo;
+
+ /**
+ * 银行卡
+ */
+ private String bankCardNo;
+
+ /**
+ * 开户行
+ */
+ private String bankName;
+
+ /**
+ * 省
+ */
+ private Integer provId;
+
+ /**
+ * 市
+ */
+ private Integer cityId;
+
+ /**
+ * 区
+ */
+ private Integer countyId;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankAddForm.java
new file mode 100644
index 0000000..0dadf4c
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankAddForm.java
@@ -0,0 +1,48 @@
+package net.lab1024.sa.admin.module.business.bankcard.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignAddForm;
+
+/**
+ * 银行卡 新建表单
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformBankAddForm extends ExpertSignAddForm {
+
+ @ApiModelProperty(value = "身份证", required = true)
+ @NotBlank(message = "身份证 不能为空")
+ private String idCardNo;
+
+ @ApiModelProperty(value = "姓名", required = true)
+ @NotBlank(message = "姓名 不能为空")
+ private String name;
+
+ @ApiModelProperty(value = "开户行", required = true)
+ @NotBlank(message = "开户行 不能为空")
+ private String bankName;
+
+ @ApiModelProperty(value = "银行卡", required = true)
+ @NotBlank(message = "银行卡 不能为空")
+ private String bankCardNo;
+
+ @ApiModelProperty(value = "省", required = true)
+ @NotNull(message = "省 不能为空")
+ private Integer provId;
+
+ @ApiModelProperty(value = "市", required = true)
+ @NotNull(message = "市 不能为空")
+ private Integer cityId;
+
+ @ApiModelProperty(value = "区", required = true)
+ @NotNull(message = "区 不能为空")
+ private Integer countyId;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankQueryForm.java
new file mode 100644
index 0000000..76a02de
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/form/CaseplatformBankQueryForm.java
@@ -0,0 +1,21 @@
+package net.lab1024.sa.admin.module.business.bankcard.domain.form;
+
+import net.lab1024.sa.common.common.domain.PageParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 银行卡 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformBankQueryForm extends PageParam{
+
+ @ApiModelProperty(value = "keywords")
+ private String keywords;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/vo/CaseplatformBankVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/vo/CaseplatformBankVO.java
new file mode 100644
index 0000000..f565282
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/domain/vo/CaseplatformBankVO.java
@@ -0,0 +1,45 @@
+package net.lab1024.sa.admin.module.business.bankcard.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 银行卡 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformBankVO {
+
+ @ApiModelProperty(value = "主键")
+ private Long id;
+
+ @ApiModelProperty(value = "专家id")
+ private Long expertId;
+
+ @ApiModelProperty(value = "身份证")
+ private String idCardNo;
+
+ @ApiModelProperty(value = "银行卡")
+ private String bankCardNo;
+
+ @ApiModelProperty(value = "开户行")
+ private String bankName;
+
+ @ApiModelProperty(value = "省")
+ private Integer provId;
+
+ @ApiModelProperty(value = "市")
+ private Integer cityId;
+
+ @ApiModelProperty(value = "区")
+ private Integer countyId;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/manager/CaseplatformBankManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/manager/CaseplatformBankManager.java
new file mode 100644
index 0000000..ed17eb5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/manager/CaseplatformBankManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.bankcard.manager;
+
+import net.lab1024.sa.admin.module.business.bankcard.domain.entity.CaseplatformBankEntity;
+import net.lab1024.sa.admin.module.business.bankcard.dao.CaseplatformBankDao;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 银行卡 Manager
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+@Service
+public class CaseplatformBankManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/service/CaseplatformBankService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/service/CaseplatformBankService.java
new file mode 100644
index 0000000..6c49328
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/bankcard/service/CaseplatformBankService.java
@@ -0,0 +1,80 @@
+package net.lab1024.sa.admin.module.business.bankcard.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.app.expert.admin.ExpertSignVO;
+import net.lab1024.sa.admin.module.app.expert.dao.ExpertSignDao;
+import net.lab1024.sa.admin.module.business.bankcard.dao.CaseplatformBankDao;
+import net.lab1024.sa.admin.module.business.bankcard.domain.entity.CaseplatformBankEntity;
+import net.lab1024.sa.admin.module.business.bankcard.domain.form.CaseplatformBankAddForm;
+import net.lab1024.sa.admin.module.business.bankcard.domain.form.CaseplatformBankQueryForm;
+import net.lab1024.sa.admin.module.business.bankcard.domain.vo.CaseplatformBankVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 银行卡 Service
+ *
+ * @Author HMM
+ * @Date 2024-02-27 13:20:37
+ * @Copyright gdxz
+ */
+
+@Service
+public class CaseplatformBankService {
+
+ @Autowired
+ private CaseplatformBankDao caseplatformBankDao;
+
+ @Autowired
+ private ExpertSignDao expertSignDao;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public PageResult queryPage(CaseplatformBankQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = caseplatformBankDao.queryPage(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+ /**
+ * 添加
+ */
+ @Transactional
+ public synchronized ResponseDTO add(CaseplatformBankAddForm addForm) {
+ CaseplatformBankEntity caseplatformBankEntity = SmartBeanUtil.copy(addForm, CaseplatformBankEntity.class);
+ Long expertId = SmartRequestUtil.getRequestUserId();
+ caseplatformBankEntity.setExpertId(expertId);
+
+ CaseplatformBankVO expertBank = caseplatformBankDao.getExpertBank(expertId);
+ if(expertBank == null){
+ caseplatformBankDao.insert(caseplatformBankEntity);
+ }else{
+ caseplatformBankEntity.setId(expertBank.getId());
+ caseplatformBankDao.updateById(caseplatformBankEntity);
+ }
+
+
+ String signImg = addForm.getSignImg();
+ ExpertSignVO expertSign = expertSignDao.getExpertSign(expertId);
+ if(expertSign == null){
+ expertSignDao.addExpertSign(expertId, signImg);
+ return ResponseDTO.app_ok();
+ }else{
+ expertSignDao.updateById(expertSign.getId(), signImg);
+ }
+ return ResponseDTO.app_ok();
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/controller/CaptchaController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/controller/CaptchaController.java
new file mode 100644
index 0000000..65c6daa
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/controller/CaptchaController.java
@@ -0,0 +1,21 @@
+package net.lab1024.sa.admin.module.business.captcha.controller;
+
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.business.captcha.service.CaptchaService;
+import net.lab1024.sa.common.common.controller.SupportBaseController;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+
+public class CaptchaController extends SupportBaseController {
+
+ @Autowired
+ private CaptchaService captchaService;
+
+ @ApiOperation("获取图形验证码 @author 胡克")
+ @GetMapping("/captcha")
+ public ResponseDTO generateCaptcha() {
+ return ResponseDTO.ok(captchaService.generateCaptcha());
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/dao/CaptchaDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/dao/CaptchaDao.java
new file mode 100644
index 0000000..095aa39
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/dao/CaptchaDao.java
@@ -0,0 +1,16 @@
+package net.lab1024.sa.admin.module.business.captcha.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.business.captcha.domain.entity.CaptchaEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Component;
+
+@Component
+@Mapper
+public interface CaptchaDao extends BaseMapper {
+
+ CaptchaEntity getByCaptchaKey(String captchaKey);
+
+ int delByCaptchaKey(String captchaKey);
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/entity/CaptchaEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/entity/CaptchaEntity.java
new file mode 100644
index 0000000..31ca903
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/entity/CaptchaEntity.java
@@ -0,0 +1,19 @@
+package net.lab1024.sa.admin.module.business.captcha.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("t_captcha")
+public class CaptchaEntity {
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String captchaUuid;
+ private String captchaKey;
+ private String captchaText;
+ private LocalDateTime exprireDate;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/from/CaptchaAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/from/CaptchaAddForm.java
new file mode 100644
index 0000000..14037b4
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/domain/from/CaptchaAddForm.java
@@ -0,0 +1,13 @@
+package net.lab1024.sa.admin.module.business.captcha.domain.from;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class CaptchaAddForm {
+ private String captchaUuid;
+ private String captchaKey;
+ private String captchaText;
+ private LocalDateTime exprireDate;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/service/CaptchaService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/service/CaptchaService.java
new file mode 100644
index 0000000..7be986f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/captcha/service/CaptchaService.java
@@ -0,0 +1,140 @@
+package net.lab1024.sa.admin.module.business.captcha.service;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.admin.module.business.captcha.dao.CaptchaDao;
+import net.lab1024.sa.admin.module.business.captcha.domain.entity.CaptchaEntity;
+import net.lab1024.sa.admin.module.business.captcha.domain.from.CaptchaAddForm;
+import net.lab1024.sa.common.common.constant.StringConst;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.domain.SystemEnvironment;
+import net.lab1024.sa.common.common.enumeration.SystemEnvironmentEnum;
+import net.lab1024.sa.common.common.exception.BusinessException;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.constant.RedisKeyConst;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaForm;
+import net.lab1024.sa.common.module.support.captcha.domain.CaptchaVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Base64Utils;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.Objects;
+import java.util.UUID;
+
+@Service
+@Slf4j
+public class CaptchaService {
+
+ @Autowired
+ private CaptchaDao captchaDao;
+
+ /**
+ * 过期时间:65秒
+ */
+ private static final long EXPIRE_SECOND = 65L;
+
+ @Autowired
+ private DefaultKaptcha defaultKaptcha;
+
+ @Autowired
+ private SystemEnvironment systemEnvironment;
+
+ public ResponseDTO add(CaptchaAddForm addForm) {
+ CaptchaEntity captchaEntity = SmartBeanUtil.copy(addForm, CaptchaEntity.class);
+ captchaDao.insert(captchaEntity);
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 生成图形验证码
+ * 默认 1 分钟有效期
+ *
+ * @return
+ */
+ public CaptchaVO generateCaptcha() {
+ String captchaText = defaultKaptcha.createText();
+ BufferedImage image = defaultKaptcha.createImage(captchaText);
+
+ String base64Code;
+ try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+ ImageIO.write(image, "jpg", os);
+ base64Code = Base64Utils.encodeToString(os.toByteArray());
+ } catch (Exception e) {
+ log.error("generateCaptcha error:", e);
+ throw new BusinessException("生成验证码错误");
+ }
+
+ /**
+ * 返回验证码对象
+ * 图片 base64格式
+ */
+ // uuid 唯一标识
+ String uuid = UUID.randomUUID().toString().replace("-", StringConst.EMPTY);
+
+ CaptchaVO captchaVO = new CaptchaVO();
+ captchaVO.setCaptchaUuid(uuid);
+ captchaVO.setCaptchaBase64Image("data:image/png;base64," + base64Code);
+ captchaVO.setExpireSeconds(EXPIRE_SECOND);
+ //if (!systemEnvironment.isProd()) {
+ // captchaVO.setCaptchaText(captchaText);
+ //}
+ String redisCaptchaKey = generateRedisKey(RedisKeyConst.Support.CAPTCHA, uuid);
+ CaptchaEntity captchaEntity = new CaptchaEntity();
+ captchaEntity.setCaptchaKey(redisCaptchaKey);
+ captchaEntity.setCaptchaText(captchaText);
+ captchaEntity.setExprireDate(LocalDateTimeUtil.offset(LocalDateTime.now(), EXPIRE_SECOND, ChronoUnit.SECONDS));
+ captchaDao.insert(captchaEntity);
+ return captchaVO;
+ }
+
+ /**
+ * 校验图形验证码
+ *
+ * @param captchaForm
+ * @return
+ */
+ public ResponseDTO checkCaptcha(CaptchaForm captchaForm) {
+
+ if (systemEnvironment.getCurrentEnvironment().equals(SystemEnvironmentEnum.TEST)) {
+ return ResponseDTO.ok();
+ }
+
+ if (StringUtils.isBlank(captchaForm.getCaptchaUuid()) || StringUtils.isBlank(captchaForm.getCaptchaCode())) {
+ return ResponseDTO.userErrorParam("请输入正确验证码");
+ }
+ /**
+ * 1、校验redis里的验证码
+ * 2、校验成功后,删除redis
+ */
+ String redisCaptchaKey = generateRedisKey(RedisKeyConst.Support.CAPTCHA, captchaForm.getCaptchaUuid());
+ try {
+ CaptchaEntity byCaptchaKey = captchaDao.getByCaptchaKey(redisCaptchaKey);
+ if(byCaptchaKey == null){
+ return ResponseDTO.userErrorParam("验证码错误,请输入正确的验证码");
+ }
+ String redisCaptchaCode = byCaptchaKey.getCaptchaText();
+ if (StringUtils.isBlank(redisCaptchaCode)) {
+ return ResponseDTO.userErrorParam("验证码已过期,请刷新重试");
+ }
+ if (!Objects.equals(redisCaptchaCode, captchaForm.getCaptchaCode())) {
+ return ResponseDTO.userErrorParam("验证码错误,请输入正确的验证码");
+ }
+ }finally {
+ // 删除已使用的验证码
+ captchaDao.delByCaptchaKey(redisCaptchaKey);
+ }
+ return ResponseDTO.ok();
+ }
+
+ public String generateRedisKey(String prefix, String key) {
+ SystemEnvironmentEnum currentEnvironment = systemEnvironment.getCurrentEnvironment();
+ return systemEnvironment.getProjectName() + RedisKeyConst.SEPARATOR + currentEnvironment.getValue() + RedisKeyConst.SEPARATOR + prefix + key;
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseSettlementEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseSettlementEnum.java
new file mode 100644
index 0000000..6510eb5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseSettlementEnum.java
@@ -0,0 +1,34 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 病历结算状态
+ *
+ * @Author HMM
+ * @Date 2024-01-11T15:18:32
+ * @Copyright gdxz
+ */
+
+@AllArgsConstructor
+@Getter
+public enum CaseSettlementEnum implements BaseEnum {
+ No(0, "未结算"),
+ Yes(1, "已结算"),
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+
+ public static CaseSettlementEnum getByVal(int val){
+ for (CaseSettlementEnum type: CaseSettlementEnum.values()){
+ if(type.getValue() == val){
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseStatusEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseStatusEnum.java
new file mode 100644
index 0000000..6262e27
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CaseStatusEnum.java
@@ -0,0 +1,36 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 0待审核 1审核通过 2审核不通过
+ *
+ * @Author HMM
+ * @Date 2024-01-11T15:18:32
+ * @Copyright gdxz
+ */
+
+@AllArgsConstructor
+@Getter
+public enum CaseStatusEnum implements BaseEnum {
+ WAIT(0, "待审核"),
+ PASS(1, "审核通过"),
+ REFUSE(2, "审核拒绝"),
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+
+ public static CaseStatusEnum getByVal(int val){
+ for (CaseStatusEnum type:CaseStatusEnum.values()){
+ if(type.getValue() == val){
+ return type;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CasetypeEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CasetypeEnum.java
new file mode 100644
index 0000000..2bdc990
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/constant/CasetypeEnum.java
@@ -0,0 +1,34 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 病历类型
+ *
+ * @Author HMM
+ * @Date 2024-01-11T15:18:32
+ * @Copyright gdxz
+ */
+
+@AllArgsConstructor
+@Getter
+public enum CasetypeEnum implements BaseEnum {
+ DEFAULT(1, "四次及以上疗程化"),
+ BEFORE(2, "早前期(INR≤1.5)"),
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+
+ public static CasetypeEnum getByVal(int val){
+ for (CasetypeEnum type:CasetypeEnum.values()){
+ if(type.getValue() == val){
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseController.java
new file mode 100644
index 0000000..71a1f2f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseController.java
@@ -0,0 +1,110 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.app.medicalrecord.domain.MedicalRecordDetailVO;
+import net.lab1024.sa.admin.module.app.medicalrecord.service.MedicalRecordService;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CancelExamineForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseUpdateForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.CaseplatformCaseDetailVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.CaseplatformCaseVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.service.CaseplatformCaseService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartEasyPoiExcelUtil;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 病历表 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@RestController
+@Api(tags = "")
+@OperateLog
+public class CaseplatformCaseController {
+
+ @Autowired
+ private CaseplatformCaseService caseplatformCaseService;
+
+ @Autowired
+ private MedicalRecordService medicalRecordService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/caseplatformCase/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid CaseplatformCaseQueryForm queryForm) {
+ return caseplatformCaseService.queryPage(queryForm);
+ }
+
+ @ApiOperation("更新 @author HMM")
+ @PostMapping("/caseplatformCase/update")
+ public ResponseDTO update(@RequestBody @Valid CaseplatformCaseUpdateForm updateForm) {
+ return caseplatformCaseService.update(updateForm);
+ }
+
+ @ApiOperation("详情 @author HMM")
+ @GetMapping("/caseplatformCase/get/{caseId}")
+ @PreAuthorize("@saAuth.checkPermission('case-system:case:select')")
+ public ResponseDTO detail(@PathVariable("caseId") Long caseId) {
+ return ResponseDTO.ok(medicalRecordService.getDetail(caseId));
+ }
+
+ @ApiOperation("审核 @author HMM")
+ @GetMapping("/caseplatformCase/examine/{caseId}/{status}")
+ @PreAuthorize("@saAuth.checkPermission('case-system:case:examine')")
+ public ResponseDTO examine(@PathVariable("caseId") Long caseId, @PathVariable("status") int status) {
+ caseplatformCaseService.examine(caseId, status);
+ return ResponseDTO.ok();
+ }
+
+ @ApiOperation("结算 @author HMM")
+ @GetMapping("/caseplatformCase/settlement/{caseId}")
+ @PreAuthorize("@saAuth.checkPermission('case-system:case:settlement')")
+ public ResponseDTO settlement(@PathVariable("caseId") Long caseId) {
+ caseplatformCaseService.settlement(caseId);
+ return ResponseDTO.ok();
+ }
+
+ @ApiOperation("审核拒绝 @author HMM")
+ @PostMapping("/caseplatformCase/cancelExamine")
+ @PreAuthorize("@saAuth.checkPermission('case-system:case:examine')")
+ public ResponseDTO cancelExamine(@RequestBody @Valid CancelExamineForm form) {
+ caseplatformCaseService.cancelExamine(form);
+ return ResponseDTO.ok();
+ }
+
+ @ApiOperation("导出excle @author HMM")
+ @GetMapping("/caseplatformCase/exportExcel")
+ @PreAuthorize("@saAuth.checkPermission('case-system:case:excle')")
+ public void exportExcel(HttpServletResponse response, @RequestBody @Valid CaseplatformCaseQueryForm queryForm) {
+ try {
+ List data = caseplatformCaseService.queryList(queryForm);
+ List list = new ArrayList<>();
+ for(CaseplatformCaseVO vv:data){
+ ResponseDTO detail = caseplatformCaseService.getDetail(vv.getId());
+ CaseplatformCaseDetailVO data1 = detail.getData();
+ list.add(data1);
+ }
+ SmartEasyPoiExcelUtil.exportExcel(list, "qwe", "病例", CaseplatformCaseDetailVO.class, "病例导出数据", response);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java
new file mode 100644
index 0000000..537cad7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java
@@ -0,0 +1,78 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.app.medicalrecord.service.MedicalRecordService;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.EasyExcelCaseDetailVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.service.CaseplatformCaseService;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * 病历表 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Controller
+@Api(tags = "")
+public class CaseplatformCaseExcelController {
+ @Autowired
+ private CaseplatformCaseService caseplatformCaseService;
+
+ @GetMapping("/caseplatformCase/exportEasyExcel")
+ public void exportEasyExcel(HttpServletResponse response, @Valid CaseplatformCaseQueryForm queryForm) {
+ try {
+ List list = caseplatformCaseService.excelList(queryForm);
+ // 1设置表头样式
+ WriteCellStyle headStyle = new WriteCellStyle();
+ // 1.1设置表头数据居中
+ headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+
+ // 2设置表格内容样式
+ WriteCellStyle bodyStyle = new WriteCellStyle();
+ // 2.1设置表格内容水平居中
+ bodyStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+ // 2.2设置表格内容垂直居中
+ bodyStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+
+ // 3设置表格sheet样式
+ WriteSheet sheet = EasyExcel.writerSheet("详细数据").head(EasyExcelCaseDetailVO.class).sheetNo(1).build();
+ // 4拿到表格处理对象
+ ExcelWriter writer = EasyExcel.write(response.getOutputStream()).needHead(true).excelType(ExcelTypeEnum.XLSX)
+ // 设置单元格的风格样式
+ .registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, bodyStyle))
+ .build();
+
+ // 5写入excel数据
+ writer.write(list, sheet);
+ // 6通知浏览器以附件的形式下载处理,设置返回头要注意文件名有中文
+ String fileName = URLEncoder.encode("病例数据", "UTF-8").replaceAll("\\+", "%20");
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+ response.setContentType("multipart/form-data");
+ response.setCharacterEncoding("utf-8");
+ writer.finish();
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseCaseSettlConverter.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseCaseSettlConverter.java
new file mode 100644
index 0000000..cdc18df
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseCaseSettlConverter.java
@@ -0,0 +1,43 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseSettlementEnum;
+
+import java.util.Optional;
+
+public class CaseCaseSettlConverter implements Converter {
+
+ @Override
+ public Class> supportJavaTypeKey() {
+ //对象属性类型(java中数据类型)
+ return Integer.class;
+ }
+
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ //CellData属性类型(Excel中数据类型)
+ return CellDataTypeEnum.STRING;
+ }
+
+ @Override
+ public Integer convertToJavaData(ReadCellData> cellData, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) throws Exception {
+ return Converter.super.convertToJavaData(cellData, contentProperty, globalConfiguration);
+ }
+
+ @Override
+ public WriteCellData> convertToExcelData(Integer value, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) throws Exception {
+
+ CaseSettlementEnum byVal = CaseSettlementEnum.getByVal(value);
+ return new WriteCellData<>(Optional.ofNullable(byVal.getDesc()).orElse("--未知--"));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseStatusConverter.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseStatusConverter.java
new file mode 100644
index 0000000..7163d75
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CaseStatusConverter.java
@@ -0,0 +1,43 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+
+import java.util.Optional;
+
+public class CaseStatusConverter implements Converter {
+
+ @Override
+ public Class> supportJavaTypeKey() {
+ //对象属性类型(java中数据类型)
+ return Integer.class;
+ }
+
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ //CellData属性类型(Excel中数据类型)
+ return CellDataTypeEnum.STRING;
+ }
+
+ @Override
+ public Integer convertToJavaData(ReadCellData> cellData, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) throws Exception {
+ return Converter.super.convertToJavaData(cellData, contentProperty, globalConfiguration);
+ }
+
+ @Override
+ public WriteCellData> convertToExcelData(Integer value, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) throws Exception {
+
+ CaseStatusEnum byVal = CaseStatusEnum.getByVal(value);
+ return new WriteCellData<>(Optional.ofNullable(byVal.getDesc()).orElse("--未知--"));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CasetypeConverter.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CasetypeConverter.java
new file mode 100644
index 0000000..4c80660
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/converter/CasetypeConverter.java
@@ -0,0 +1,43 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+
+import java.util.Optional;
+
+public class CasetypeConverter implements Converter {
+
+ @Override
+ public Class> supportJavaTypeKey() {
+ //对象属性类型(java中数据类型)
+ return Integer.class;
+ }
+
+
+ @Override
+ public CellDataTypeEnum supportExcelTypeKey() {
+ //CellData属性类型(Excel中数据类型)
+ return CellDataTypeEnum.STRING;
+ }
+
+ @Override
+ public Integer convertToJavaData(ReadCellData> cellData, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) throws Exception {
+ return Converter.super.convertToJavaData(cellData, contentProperty, globalConfiguration);
+ }
+
+ @Override
+ public WriteCellData> convertToExcelData(Integer value, ExcelContentProperty contentProperty,
+ GlobalConfiguration globalConfiguration) throws Exception {
+
+ CasetypeEnum byVal = CasetypeEnum.getByVal(value);
+ return new WriteCellData<>(Optional.ofNullable(byVal.getDesc()).orElse("--未知--"));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/dao/CaseplatformCaseDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/dao/CaseplatformCaseDao.java
new file mode 100644
index 0000000..1990598
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/dao/CaseplatformCaseDao.java
@@ -0,0 +1,73 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.dao;
+
+import net.lab1024.sa.admin.module.business.area.domain.vo.ProvVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.entity.CaseplatformCaseEntity;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CancelExamineForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseQueryForm;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.CaseplatformCaseDetailVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.CaseplatformCaseVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.EasyExcelCaseDetailVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 病历表 Dao
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface CaseplatformCaseDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") CaseplatformCaseQueryForm queryForm, @Param("provList")List provList);
+
+ List excelList(@Param("queryForm") CaseplatformCaseQueryForm queryForm, @Param("provList")List provList);
+
+ /**
+ * 获取详情
+ * @param case_id
+ * @return
+ */
+ CaseplatformCaseDetailVO getDetail(Long case_id);
+
+ /**
+ * 审核
+ * @param case_id
+ * @param status
+ * @return
+ */
+ @Update("update t_caseplatform_case set status =#{status} where id=#{case_id}")
+ int examine(@Param("case_id") Long case_id, @Param("status")int status);
+
+ /**
+ * 结算
+ * @param case_id
+ * @return
+ */
+ @Update("update t_caseplatform_case set settlement_flag =1 where id=#{case_id}")
+ int settlement(@Param("case_id") Long case_id);
+
+ /**
+ * 审核拒绝
+ * @param form
+ * @return
+ */
+ @Update("update t_caseplatform_case set status =2,reason=#{form.reason} where id=#{form.caseId}")
+ int cancelExamine(@Param("form") CancelExamineForm form);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/entity/CaseplatformCaseEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/entity/CaseplatformCaseEntity.java
new file mode 100644
index 0000000..2d0e9d5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/entity/CaseplatformCaseEntity.java
@@ -0,0 +1,67 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case")
+public class CaseplatformCaseEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联用户表
+ */
+ private Long userId;
+
+ /**
+ * 入院时间
+ */
+ private LocalDateTime admissionTime;
+
+ /**
+ * 病历类型
+ */
+ private Integer caseType;
+
+ /**
+ * 专家 id
+ */
+ private Long expertId;
+
+ /**
+ * 结算标识
+ */
+ private Integer settlementFlag;
+
+ /**
+ * 0待审核 1审核通过 2审核不通过
+ */
+ private Integer status;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CancelExamineForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CancelExamineForm.java
new file mode 100644
index 0000000..306582a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CancelExamineForm.java
@@ -0,0 +1,18 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class CancelExamineForm {
+
+ @ApiModelProperty(value = "病例id", required = true)
+ @NotNull(message = "病例id 不能为空")
+ private Long caseId;
+
+ @ApiModelProperty(value = "原因", required = true)
+ @NotNull(message = "原因 不能为空")
+ private String reason;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseAddForm.java
new file mode 100644
index 0000000..a99afe3
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseAddForm.java
@@ -0,0 +1,44 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+
+/**
+ * 病历表 新建表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseAddForm {
+
+ @ApiModelProperty(value = "主键", required = true)
+ @NotNull(message = "主键 不能为空")
+ private Long id;
+
+ @ApiModelProperty(value = "关联用户表", required = true)
+ @NotNull(message = "关联用户表 不能为空")
+ private Long userId;
+
+ @ApiModelProperty(value = "入院时间", required = true)
+ @NotNull(message = "入院时间 不能为空")
+ private LocalDateTime admissionTime;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @CheckEnum(value = CasetypeEnum.class, message = "病历类型 错误", required = true)
+ private Integer caseType;
+
+ @ApiModelProperty(value = "创建时间", required = true)
+ @NotNull(message = "创建时间 不能为空")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseQueryForm.java
new file mode 100644
index 0000000..23aa91f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseQueryForm.java
@@ -0,0 +1,46 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.form;
+
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseSettlementEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.domain.PageParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+
+/**
+ * 病历表 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseQueryForm extends PageParam{
+
+ @ApiModelProperty(value = "name")
+ private String name;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @CheckEnum(value = CasetypeEnum.class, message = "病历类型 错误")
+ private Integer caseType;
+
+ @ApiModelPropertyEnum(value = CaseSettlementEnum.class, desc = "结算状态")
+ @CheckEnum(value = CaseSettlementEnum.class, message = "结算状态 错误")
+ private Integer settlementFlag;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "0待审核 1审核通过 2审核不通过")
+ @CheckEnum(value = CaseStatusEnum.class, message = "0待审核 1审核通过 2审核不通过 错误")
+ private Integer status;
+
+ @ApiModelProperty(value = "省份")
+ private Long provId;
+
+ @ApiModelProperty(value = "市区")
+ private Long cityId;
+
+ @ApiModelProperty(value = "医院")
+ private String hospitalUuid;
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseUpdateForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseUpdateForm.java
new file mode 100644
index 0000000..302bfbd
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/form/CaseplatformCaseUpdateForm.java
@@ -0,0 +1,29 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+
+/**
+ * 病历表 更新表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseUpdateForm extends CaseplatformCaseAddForm{
+
+ @ApiModelProperty(value = "主键", required = true)
+ @NotNull(message = "主键 不能为空")
+ private Long id;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "0待审核 1审核通过 2审核不通过")
+ @CheckEnum(value = CaseStatusEnum.class, message = "0待审核 1审核通过 2审核不通过 错误", required = true)
+ private Integer status;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseDetailVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseDetailVO.java
new file mode 100644
index 0000000..0ba6c7a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseDetailVO.java
@@ -0,0 +1,96 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo.CaseplatformCaseAbstracVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo.CaseplatformCaseCheckdataVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.vo.CaseplatformCaseDpmsVO;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 病历表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@ExcelTarget("caseEntity")
+public class CaseplatformCaseDetailVO {
+
+ private Long id;
+
+ @ApiModelProperty(value = "用户关联id")
+ private Long userId;
+
+ @ApiModelProperty(value = "用户姓名")
+ @Excel(name = "患者姓名", orderNum = "1", width = 25,needMerge = true)
+ private String userName;
+
+ @ApiModelProperty(value = "用户id")
+ @Excel(name = "患者ID", orderNum = "2", width = 25,needMerge = true)
+ private String uid;
+
+ @ApiModelProperty(value = "入院时间")
+ @Excel(name = "入院时间", orderNum = "3", databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd", width = 25,needMerge = true)
+ private LocalDateTime admissionTime;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @Excel(name = "病历类型", orderNum = "4", width = 25, replace = { "四次及以上疗程化_1", "早前期_2" }, isImportField = "true_st",needMerge = true)
+ private Integer caseType;
+
+ @ApiModelProperty(value = "专家姓名")
+ @Excel(name = "专家姓名", orderNum = "5", width = 25,needMerge = true)
+ private String expertName;
+
+ @ApiModelProperty(value = "专家所在省份名称")
+ @Excel(name = "省份", orderNum = "6", width = 25,needMerge = true)
+ private String expertProvName;
+
+ @ApiModelProperty(value = "专家所在城市名称")
+ @Excel(name = "城市", orderNum = "7", width = 25,needMerge = true)
+ private String expertCityName;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "状态")
+ @Excel(name = "状态", orderNum = "8", width = 25, replace = { "待审核_0", "审核通过_1", "审核拒绝_2" }, isImportField = "true_st",needMerge = true)
+ private Integer status;
+
+ @ApiModelProperty(value = "创建时间")
+ @Excel(name = "创建时间", orderNum = "9", databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd", width = 25,needMerge = true)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "修改时间")
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty(value = "专家所在城市医院")
+ private String expertHospitalName;
+
+ @ApiModelProperty(value = "结算标识")
+ private Integer settlementFlag;
+ /************************ 病历摘要 ********************************/
+
+ @ApiModelProperty(value = "病历摘要")
+ @ExcelEntity(id = "caseAbstract")
+ private CaseplatformCaseAbstracVO caseAbstract;
+
+ /************************ 病历 DPMAS ********************************/
+ @ExcelCollection(name = "DPMAS", orderNum = "4")
+ private List dpmsList;
+
+ /************************ 病历 实验室检测 ********************************/
+
+ @ApiModelProperty(value = "实验室检测")
+ @ExcelEntity(id = "caseCheckdata")
+ private CaseplatformCaseCheckdataVO caseCheckdata;
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseVO.java
new file mode 100644
index 0000000..18cd314
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/CaseplatformCaseVO.java
@@ -0,0 +1,67 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+/**
+ * 病历表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseVO {
+
+ private Long id;
+
+ @ApiModelProperty(value = "用户关联id")
+ private Long userId;
+
+ @ApiModelProperty(value = "用户姓名")
+ private String userName;
+
+ @ApiModelProperty(value = "用户id")
+ private String uid;
+
+ @ApiModelProperty(value = "入院时间")
+ private LocalDateTime admissionTime;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ private Integer caseType;
+
+ @ApiModelProperty(value = "专家姓名")
+ private String expertName;
+
+ @ApiModelProperty(value = "专家所在省份名称")
+ private String expertProvName;
+
+ @ApiModelProperty(value = "专家所在城市名称")
+ private String expertCityName;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "0待审核 1审核通过 2审核不通过")
+ private Integer status;
+
+ @ApiModelProperty(value = "专家所在城市医院")
+ private String expertHospitalName;
+
+ @ApiModelProperty(value = "原因")
+ private String reason;
+
+ @ApiModelProperty(value = "结算标识")
+ private Integer settlementFlag;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "修改时间")
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/EasyExcelCaseDetailVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/EasyExcelCaseDetailVO.java
new file mode 100644
index 0000000..a361138
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/domain/vo/EasyExcelCaseDetailVO.java
@@ -0,0 +1,78 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CaseStatusEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.constant.CasetypeEnum;
+import net.lab1024.sa.admin.module.business.caseplatformcase.converter.CaseCaseSettlConverter;
+import net.lab1024.sa.admin.module.business.caseplatformcase.converter.CaseStatusConverter;
+import net.lab1024.sa.admin.module.business.caseplatformcase.converter.CasetypeConverter;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+import java.time.LocalDateTime;
+
+/**
+ * 病历表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+@Getter
+@Setter
+@EqualsAndHashCode
+public class EasyExcelCaseDetailVO {
+
+ @ExcelIgnore
+ private Long id;
+
+ @ApiModelProperty(value = "专家姓名")
+ @ExcelProperty("姓名")
+ private String expertName;
+
+ @ApiModelProperty(value = "专家所在省份名称")
+ @ExcelProperty("省份")
+ private String expertProvName;
+
+ @ApiModelProperty(value = "专家所在城市名称")
+ @ExcelProperty("城市")
+ private String expertCityName;
+
+ @ApiModelProperty(value = "专家所在城市医院")
+ @ExcelProperty("医院")
+ private String expertHospitalName;
+
+ @ExcelIgnore
+ @ApiModelProperty(value = "用户关联id")
+ private Long userId;
+
+ @ApiModelProperty(value = "用户姓名")
+ @ExcelProperty("患者")
+ private String userName;
+
+ @ApiModelProperty(value = "用户id")
+ @ExcelProperty("患者ID")
+ private String uid;
+
+ @ApiModelPropertyEnum(value = CasetypeEnum.class, desc = "病历类型")
+ @ExcelProperty(value = "病历类型", converter = CasetypeConverter.class)
+ private Integer caseType;
+
+ @ApiModelProperty(value = "创建时间")
+ @ExcelProperty("提交时间")
+ private LocalDateTime createTime;
+
+ @ApiModelPropertyEnum(value = CaseStatusEnum.class, desc = "状态")
+ @ExcelProperty(value = "病例状态", converter = CaseStatusConverter.class)
+ private Integer status;
+
+ @ApiModelProperty(value = "结算标识")
+ @ExcelProperty(value = "结算状态", converter = CaseCaseSettlConverter.class)
+ private Integer settlementFlag;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/manager/CaseplatformCaseManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/manager/CaseplatformCaseManager.java
new file mode 100644
index 0000000..8eeea5d
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/manager/CaseplatformCaseManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.manager;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.lab1024.sa.admin.module.business.caseplatformcase.dao.CaseplatformCaseDao;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.entity.CaseplatformCaseEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ * 病历表 Manager
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+@Service
+public class CaseplatformCaseManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/service/CaseplatformCaseService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/service/CaseplatformCaseService.java
new file mode 100644
index 0000000..62c1661
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/service/CaseplatformCaseService.java
@@ -0,0 +1,169 @@
+package net.lab1024.sa.admin.module.business.caseplatformcase.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.area.domain.vo.ProvVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.dao.CaseplatformCaseDao;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.entity.CaseplatformCaseEntity;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CancelExamineForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseAddForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.form.CaseplatformCaseUpdateForm;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.CaseplatformCaseDetailVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.CaseplatformCaseVO;
+import net.lab1024.sa.admin.module.business.caseplatformcase.domain.vo.EasyExcelCaseDetailVO;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo.CaseplatformCaseAbstracVO;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.service.CaseplatformCaseAbstracService;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo.CaseplatformCaseCheckdataVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.service.CaseplatformCaseCheckdataService;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.vo.CaseplatformCaseDpmsVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.service.CaseplatformCaseDpmsService;
+import net.lab1024.sa.admin.module.system.login.domain.LoginEmployeeDetail;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+import static net.lab1024.sa.common.common.code.UserErrorCode.NO_PERMISSION;
+
+/**
+ * 病历表 Service
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Service
+public class CaseplatformCaseService {
+
+ @Autowired
+ private CaseplatformCaseDao caseplatformCaseDao;
+
+ @Autowired
+ private CaseplatformCaseAbstracService abstracService;
+
+ @Autowired
+ private CaseplatformCaseDpmsService dpmsService;
+
+ @Autowired
+ private CaseplatformCaseCheckdataService checkdataService;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public ResponseDTO> queryPage(CaseplatformCaseQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+
+ LoginEmployeeDetail requestUser = (LoginEmployeeDetail)SmartRequestUtil.getRequestUser();
+ List provList = requestUser.getProvList();
+ Long provId = queryForm.getProvId();
+ if(provId != null){
+ boolean match = provList.stream().anyMatch(item -> item.getId().equals(provId));
+ if(!match){
+ return ResponseDTO.ok(SmartPageUtil.emptyResult(page));
+ }
+ }
+ List list = caseplatformCaseDao.queryPage(page, queryForm, provList);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return ResponseDTO.ok(pageResult);
+ }
+
+ public List queryList(CaseplatformCaseQueryForm queryForm) {
+ LoginEmployeeDetail requestUser = (LoginEmployeeDetail)SmartRequestUtil.getRequestUser();
+ List provList = requestUser.getProvList();
+ Long provId = queryForm.getProvId();
+ if(provId != null){
+ boolean match = provList.stream().anyMatch(item -> item.getId().equals(provId));
+ if(!match){
+ return null;
+ }
+ }
+ List list = caseplatformCaseDao.queryPage(null, queryForm, provList);
+ return list;
+ }
+
+ /**
+ * 不分页导出 excel
+ * @param queryForm
+ * @return
+ */
+ public List excelList(CaseplatformCaseQueryForm queryForm) {
+ LoginEmployeeDetail requestUser = (LoginEmployeeDetail)SmartRequestUtil.getRequestUser();
+ List provList = requestUser.getProvList();
+ Long provId = queryForm.getProvId();
+ if(provId != null){
+ boolean match = provList.stream().anyMatch(item -> item.getId().equals(provId));
+ if(!match){
+ return null;
+ }
+ }
+ List list = caseplatformCaseDao.excelList(queryForm, provList);
+ return list;
+ }
+
+ /**
+ * 添加
+ */
+ public ResponseDTO add(CaseplatformCaseAddForm addForm) {
+ CaseplatformCaseEntity caseplatformCaseEntity = SmartBeanUtil.copy(addForm, CaseplatformCaseEntity.class);
+ caseplatformCaseDao.insert(caseplatformCaseEntity);
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 更新
+ *
+ * @param updateForm
+ * @return
+ */
+ public ResponseDTO update(CaseplatformCaseUpdateForm updateForm) {
+ CaseplatformCaseEntity caseplatformCaseEntity = SmartBeanUtil.copy(updateForm, CaseplatformCaseEntity.class);
+ caseplatformCaseDao.updateById(caseplatformCaseEntity);
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 审核
+ * @param case_id
+ * @return
+ */
+ public void examine(Long case_id, int status){
+ caseplatformCaseDao.examine(case_id, status);
+ }
+
+ /**
+ * 结算
+ * @param case_id
+ */
+ public void settlement(Long case_id){
+ caseplatformCaseDao.settlement(case_id);
+ }
+
+ /**
+ * 审核拒绝
+ * @param form
+ */
+ public void cancelExamine(CancelExamineForm form){
+ caseplatformCaseDao.cancelExamine(form);
+ }
+
+ public ResponseDTO getDetail(Long case_id){
+ CaseplatformCaseDetailVO detail = caseplatformCaseDao.getDetail(case_id);
+ CaseplatformCaseAbstracVO abstracVO = abstracService.getByCaseId(case_id);
+ List dpmsVOS = dpmsService.getByCaseId(case_id);
+ CaseplatformCaseCheckdataVO checkdataVO = checkdataService.getByCaseId(case_id);
+ detail.setCaseAbstract(abstracVO);
+ detail.setCaseCheckdata(checkdataVO);
+ detail.setDpmsList(dpmsVOS);
+ return ResponseDTO.ok(detail);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/controller/CaseplatformCaseAbstracController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/controller/CaseplatformCaseAbstracController.java
new file mode 100644
index 0000000..cdfc560
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/controller/CaseplatformCaseAbstracController.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.controller;
+
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.form.CaseplatformCaseAbstracQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo.CaseplatformCaseAbstracVO;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.service.CaseplatformCaseAbstracService;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+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.RestController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import javax.validation.Valid;
+
+/**
+ * 病历摘要表 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@RestController
+@Api(tags = "")
+@OperateLog
+public class CaseplatformCaseAbstracController {
+
+ @Autowired
+ private CaseplatformCaseAbstracService caseplatformCaseAbstracService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/caseplatformCaseAbstrac/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid CaseplatformCaseAbstracQueryForm queryForm) {
+ return ResponseDTO.ok(caseplatformCaseAbstracService.queryPage(queryForm));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/dao/CaseplatformCaseAbstracDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/dao/CaseplatformCaseAbstracDao.java
new file mode 100644
index 0000000..20ebbb8
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/dao/CaseplatformCaseAbstracDao.java
@@ -0,0 +1,35 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.dao;
+
+import java.util.List;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.entity.CaseplatformCaseAbstracEntity;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.form.CaseplatformCaseAbstracQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo.CaseplatformCaseAbstracVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+/**
+ * 病历摘要表 Dao
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface CaseplatformCaseAbstracDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") CaseplatformCaseAbstracQueryForm queryForm);
+
+ CaseplatformCaseAbstracVO getByCaseId(Long case_id);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/entity/CaseplatformCaseAbstracEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/entity/CaseplatformCaseAbstracEntity.java
new file mode 100644
index 0000000..7d0acf8
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/entity/CaseplatformCaseAbstracEntity.java
@@ -0,0 +1,52 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历摘要表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case_abstract")
+public class CaseplatformCaseAbstracEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联病历表
+ */
+ private Long caseId;
+
+ /**
+ * 病历摘要 文字
+ */
+ private String abstractStr;
+
+ /**
+ * 病历摘要 图片
+ */
+ private String abstractImg;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/form/CaseplatformCaseAbstracQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/form/CaseplatformCaseAbstracQueryForm.java
new file mode 100644
index 0000000..836e24f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/form/CaseplatformCaseAbstracQueryForm.java
@@ -0,0 +1,17 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.form;
+
+import lombok.Data;
+import net.lab1024.sa.common.common.domain.PageParam;
+
+/**
+ * 病历摘要表 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseAbstracQueryForm extends PageParam{
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/vo/CaseplatformCaseAbstracVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/vo/CaseplatformCaseAbstracVO.java
new file mode 100644
index 0000000..4608b6b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/domain/vo/CaseplatformCaseAbstracVO.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历摘要表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@ExcelTarget("CaseplatformCaseAbstrac")
+public class CaseplatformCaseAbstracVO {
+
+ private Long id;
+
+ @ApiModelProperty(value = "关联病历表")
+ private Long caseId;
+
+ @ApiModelProperty(value = "病历摘要 文字")
+ @Excel(name = "病历摘要 文字", orderNum = "1",needMerge = true)
+ private String abstractStr;
+
+ @ApiModelProperty(value = "病历摘要 图片")
+ //@Excel(name = "病历摘要 图片", orderNum = "1", isImportField = "true_major,true_absent")
+ private String abstractImg;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "修改时间")
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/manager/CaseplatformCaseAbstracManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/manager/CaseplatformCaseAbstracManager.java
new file mode 100644
index 0000000..fe2ce9e
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/manager/CaseplatformCaseAbstracManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.manager;
+
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.dao.CaseplatformCaseAbstracDao;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.entity.CaseplatformCaseAbstracEntity;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 病历摘要表 Manager
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+@Service
+public class CaseplatformCaseAbstracManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/service/CaseplatformCaseAbstracService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/service/CaseplatformCaseAbstracService.java
new file mode 100644
index 0000000..778101b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcaseabstrac/service/CaseplatformCaseAbstracService.java
@@ -0,0 +1,45 @@
+package net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.dao.CaseplatformCaseAbstracDao;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.form.CaseplatformCaseAbstracQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo.CaseplatformCaseAbstracVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 病历摘要表 Service
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Service
+public class CaseplatformCaseAbstracService {
+
+ @Autowired
+ private CaseplatformCaseAbstracDao caseplatformCaseAbstracDao;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public PageResult queryPage(CaseplatformCaseAbstracQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = caseplatformCaseAbstracDao.queryPage(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+ public CaseplatformCaseAbstracVO getByCaseId(Long case_id){
+ return caseplatformCaseAbstracDao.getByCaseId(case_id);
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/controller/CaseplatformCaseCheckdataController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/controller/CaseplatformCaseCheckdataController.java
new file mode 100644
index 0000000..6bd22ba
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/controller/CaseplatformCaseCheckdataController.java
@@ -0,0 +1,41 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.form.CaseplatformCaseCheckdataQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo.CaseplatformCaseCheckdataVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.service.CaseplatformCaseCheckdataService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+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.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 实验室检测 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@RestController
+@Api(tags = "")
+@OperateLog
+public class CaseplatformCaseCheckdataController {
+
+ @Autowired
+ private CaseplatformCaseCheckdataService caseplatformCaseCheckdataService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/caseplatformCaseCheckdata/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid CaseplatformCaseCheckdataQueryForm queryForm) {
+ return ResponseDTO.ok(caseplatformCaseCheckdataService.queryPage(queryForm));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/dao/CaseplatformCaseCheckdataDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/dao/CaseplatformCaseCheckdataDao.java
new file mode 100644
index 0000000..7cf14df
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/dao/CaseplatformCaseCheckdataDao.java
@@ -0,0 +1,36 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.entity.CaseplatformCaseCheckdataEntity;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.form.CaseplatformCaseCheckdataQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo.CaseplatformCaseCheckdataVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 实验室检测 Dao
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface CaseplatformCaseCheckdataDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") CaseplatformCaseCheckdataQueryForm queryForm);
+
+ CaseplatformCaseCheckdataVO getByCaseId(Long case_id);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/entity/CaseplatformCaseCheckdataEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/entity/CaseplatformCaseCheckdataEntity.java
new file mode 100644
index 0000000..150b13d
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/entity/CaseplatformCaseCheckdataEntity.java
@@ -0,0 +1,152 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 实验室检测 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case_checkdata")
+public class CaseplatformCaseCheckdataEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联病历
+ */
+ private Long caseId;
+
+ /**
+ * 治疗前 检测时间
+ */
+ private LocalDateTime headTime;
+
+ /**
+ * 治疗后 检测时间
+ */
+ private LocalDateTime afterTime;
+
+ /**
+ * 治疗前 总胆红素(umol/L)
+ */
+ private String headTb;
+
+ /**
+ * 治疗后 总胆红素(umol/L)
+ */
+ private String afterTb;
+
+ /**
+ * 治疗前 白蛋白(g/L)
+ */
+ private String headAlb;
+
+ /**
+ * 治疗后 白蛋白(g/L)
+ */
+ private String afterAlb;
+
+ /**
+ * 治疗前 直接胆红素(umol/L)
+ */
+ private String headDb;
+
+ /**
+ * 治疗后 直接胆红素(umol/L)
+ */
+ private String afterDb;
+
+ /**
+ * 治疗前 凝血酶原活动度 (%)
+ */
+ private String headPta;
+
+ /**
+ * 治疗后 凝血酶原活动度 (%)
+ */
+ private String afterPta;
+
+ /**
+ * 治疗前 间接胆红素(umol/L)
+ */
+ private String headIb;
+
+ /**
+ * 治疗后 间接胆红素(umol/L)
+ */
+ private String afterIb;
+
+ /**
+ * 治疗前 国际标准化比值 (INR)
+ */
+ private String headInr;
+
+ /**
+ * 治疗后 国际标准化比值 (INR)
+ */
+ private String afterInr;
+
+ /**
+ * 治疗前 谷丙转氨 (U/L)
+ */
+ private String headAlt;
+
+ /**
+ * 治疗后 谷丙转氨 (U/L)
+ */
+ private String afterAlt;
+
+ /**
+ * 治疗前 白介素6(ng/L)
+ */
+ private String headIl6;
+
+ /**
+ * 治疗后 白介素6(ng/L)
+ */
+ private String afterIl6;
+
+ /**
+ * 治疗前 谷草转氨酶 (U/L)
+ */
+ private String headAst;
+
+ /**
+ * 治疗后 谷草转氨酶 (U/L)
+ */
+ private String afterAst;
+
+ /**
+ * 治疗前 肿瘤坏死因子α(μg/L)
+ */
+ private String headTnf;
+
+ /**
+ * 治疗后 肿瘤坏死因子α(μg/L)
+ */
+ private String afterTnf;
+
+ /**
+ * 图片
+ */
+ private String img;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/form/CaseplatformCaseCheckdataQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/form/CaseplatformCaseCheckdataQueryForm.java
new file mode 100644
index 0000000..a9895ff
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/form/CaseplatformCaseCheckdataQueryForm.java
@@ -0,0 +1,17 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.form;
+
+import lombok.Data;
+import net.lab1024.sa.common.common.domain.PageParam;
+
+/**
+ * 实验室检测 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseCheckdataQueryForm extends PageParam{
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/vo/CaseplatformCaseCheckdataVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/vo/CaseplatformCaseCheckdataVO.java
new file mode 100644
index 0000000..c3158d6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/domain/vo/CaseplatformCaseCheckdataVO.java
@@ -0,0 +1,100 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 实验室检测 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseCheckdataVO {
+
+ @ApiModelProperty(value = "主键")
+ private Long id;
+
+ @ApiModelProperty(value = "关联病历")
+ private Long caseId;
+
+ @ApiModelProperty(value = "治疗前 检测时间")
+ @Excel(name = "创建时间", orderNum = "10", databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd", width = 25,needMerge = true)
+ private LocalDateTime headTime;
+
+ @ApiModelProperty(value = "治疗后 检测时间 ")
+ private LocalDateTime afterTime;
+
+ @ApiModelProperty(value = "治疗前 总胆红素(umol/L)")
+ @Excel(name = "治疗前 总胆红素", orderNum = "11", width = 25,needMerge = true)
+ private String headTb;
+
+ @ApiModelProperty(value = "治疗后 总胆红素(umol/L)")
+ @Excel(name = "治疗后 总胆红素", orderNum = "12", width = 25,needMerge = true)
+ private String afterTb;
+
+ @ApiModelProperty(value = "治疗前 白蛋白(g/L)")
+ private String headAlb;
+
+ @ApiModelProperty(value = "治疗后 白蛋白(g/L)")
+ private String afterAlb;
+
+ @ApiModelProperty(value = "治疗前 直接胆红素(umol/L)")
+ private String headDb;
+
+ @ApiModelProperty(value = "治疗后 直接胆红素(umol/L)")
+ private String afterDb;
+
+ @ApiModelProperty(value = "治疗前 凝血酶原活动度 (%)")
+ private String headPta;
+
+ @ApiModelProperty(value = "治疗后 凝血酶原活动度 (%)")
+ private String afterPta;
+
+ @ApiModelProperty(value = "治疗前 间接胆红素(umol/L)")
+ private String headIb;
+
+ @ApiModelProperty(value = "治疗后 间接胆红素(umol/L)")
+ private String afterIb;
+
+ @ApiModelProperty(value = "治疗前 国际标准化比值 (INR)")
+ private String headInr;
+
+ @ApiModelProperty(value = "治疗后 国际标准化比值 (INR)")
+ private String afterInr;
+
+ @ApiModelProperty(value = "治疗前 谷丙转氨 (U/L)")
+ private String headAlt;
+
+ @ApiModelProperty(value = "治疗后 谷丙转氨 (U/L)")
+ private String afterAlt;
+
+ @ApiModelProperty(value = "治疗前 白介素6(ng/L)")
+ private String headIl6;
+
+ @ApiModelProperty(value = "治疗后 白介素6(ng/L)")
+ private String afterIl6;
+
+ @ApiModelProperty(value = "治疗前 谷草转氨酶 (U/L)")
+ private String headAst;
+
+ @ApiModelProperty(value = "治疗后 谷草转氨酶 (U/L)")
+ private String afterAst;
+
+ @ApiModelProperty(value = "治疗前 肿瘤坏死因子α(μg/L)")
+ private String headTnf;
+
+ @ApiModelProperty(value = "治疗后 肿瘤坏死因子α(μg/L)")
+ private String afterTnf;
+
+ @ApiModelProperty(value = "图片")
+ private String img;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/manager/CaseplatformCaseCheckdataManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/manager/CaseplatformCaseCheckdataManager.java
new file mode 100644
index 0000000..9ea53d7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/manager/CaseplatformCaseCheckdataManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.manager;
+
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.dao.CaseplatformCaseCheckdataDao;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.entity.CaseplatformCaseCheckdataEntity;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 实验室检测 Manager
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+@Service
+public class CaseplatformCaseCheckdataManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/service/CaseplatformCaseCheckdataService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/service/CaseplatformCaseCheckdataService.java
new file mode 100644
index 0000000..3a6a7e8
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasecheckdata/service/CaseplatformCaseCheckdataService.java
@@ -0,0 +1,45 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformcaseabstrac.domain.vo.CaseplatformCaseAbstracVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.dao.CaseplatformCaseCheckdataDao;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.form.CaseplatformCaseCheckdataQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo.CaseplatformCaseCheckdataVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 实验室检测 Service
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Service
+public class CaseplatformCaseCheckdataService {
+
+ @Autowired
+ private CaseplatformCaseCheckdataDao caseplatformCaseCheckdataDao;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public PageResult queryPage(CaseplatformCaseCheckdataQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = caseplatformCaseCheckdataDao.queryPage(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+ public CaseplatformCaseCheckdataVO getByCaseId(Long case_id){
+ return caseplatformCaseCheckdataDao.getByCaseId(case_id);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/controller/CaseplatformCaseDpmsController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/controller/CaseplatformCaseDpmsController.java
new file mode 100644
index 0000000..0bcd0e5
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/controller/CaseplatformCaseDpmsController.java
@@ -0,0 +1,41 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.form.CaseplatformCaseDpmsQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.vo.CaseplatformCaseDpmsVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.service.CaseplatformCaseDpmsService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+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.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 病历摘要表 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@RestController
+@Api(tags = "")
+@OperateLog
+public class CaseplatformCaseDpmsController {
+
+ @Autowired
+ private CaseplatformCaseDpmsService caseplatformCaseDpmsService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/caseplatformCaseDpms/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid CaseplatformCaseDpmsQueryForm queryForm) {
+ return ResponseDTO.ok(caseplatformCaseDpmsService.queryPage(queryForm));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/dao/CaseplatformCaseDpmsDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/dao/CaseplatformCaseDpmsDao.java
new file mode 100644
index 0000000..c6e9604
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/dao/CaseplatformCaseDpmsDao.java
@@ -0,0 +1,36 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.entity.CaseplatformCaseDpmsEntity;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.form.CaseplatformCaseDpmsQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.vo.CaseplatformCaseDpmsVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 病历摘要表 Dao
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface CaseplatformCaseDpmsDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") CaseplatformCaseDpmsQueryForm queryForm);
+
+ List getByCaseId(Long case_id);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/entity/CaseplatformCaseDpmsEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/entity/CaseplatformCaseDpmsEntity.java
new file mode 100644
index 0000000..14c418a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/entity/CaseplatformCaseDpmsEntity.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历摘要表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_case_dpms")
+public class CaseplatformCaseDpmsEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联病历表
+ */
+ private Long caseId;
+
+ /**
+ * 治疗时间
+ */
+ private LocalDateTime treatTime;
+
+ /**
+ * 图片
+ */
+ private String img;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/form/CaseplatformCaseDpmsQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/form/CaseplatformCaseDpmsQueryForm.java
new file mode 100644
index 0000000..0996a36
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/form/CaseplatformCaseDpmsQueryForm.java
@@ -0,0 +1,17 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.form;
+
+import lombok.Data;
+import net.lab1024.sa.common.common.domain.PageParam;
+
+/**
+ * 病历摘要表 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseDpmsQueryForm extends PageParam{
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/vo/CaseplatformCaseDpmsVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/vo/CaseplatformCaseDpmsVO.java
new file mode 100644
index 0000000..c085256
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/domain/vo/CaseplatformCaseDpmsVO.java
@@ -0,0 +1,33 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 病历摘要表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformCaseDpmsVO {
+
+ @ApiModelProperty(value = "主键")
+ private Long id;
+
+ @ApiModelProperty(value = "关联病历表")
+ private Long caseId;
+
+ @ApiModelProperty(value = "治疗时间")
+ @Excel(name = "治疗时间", width = 30, databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd")
+ private LocalDateTime treatTime;
+
+ @ApiModelProperty(value = "图片")
+ @Excel(name = "图片", type = 2,width = 40, imageType = 1)
+ private String img;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/manager/CaseplatformCaseDpmsManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/manager/CaseplatformCaseDpmsManager.java
new file mode 100644
index 0000000..31d79ef
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/manager/CaseplatformCaseDpmsManager.java
@@ -0,0 +1,19 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.manager;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.dao.CaseplatformCaseDpmsDao;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.entity.CaseplatformCaseDpmsEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ * 病历摘要表 Manager
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+@Service
+public class CaseplatformCaseDpmsManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/service/CaseplatformCaseDpmsService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/service/CaseplatformCaseDpmsService.java
new file mode 100644
index 0000000..398b9c7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcasedpms/service/CaseplatformCaseDpmsService.java
@@ -0,0 +1,45 @@
+package net.lab1024.sa.admin.module.business.caseplatformcasedpms.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformcasecheckdata.domain.vo.CaseplatformCaseCheckdataVO;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.dao.CaseplatformCaseDpmsDao;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.form.CaseplatformCaseDpmsQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformcasedpms.domain.vo.CaseplatformCaseDpmsVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 病历摘要表 Service
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Service
+public class CaseplatformCaseDpmsService {
+
+ @Autowired
+ private CaseplatformCaseDpmsDao caseplatformCaseDpmsDao;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public PageResult queryPage(CaseplatformCaseDpmsQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = caseplatformCaseDpmsDao.queryPage(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+ public List getByCaseId(Long case_id){
+ return caseplatformCaseDpmsDao.getByCaseId(case_id);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/constant/SexEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/constant/SexEnum.java
new file mode 100644
index 0000000..96657bb
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/constant/SexEnum.java
@@ -0,0 +1,24 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 性别 12
+ *
+ * @Author HMM
+ * @Date 2024-01-11T15:18:32
+ * @Copyright gdxz
+ */
+
+@AllArgsConstructor
+@Getter
+public enum SexEnum implements BaseEnum {
+
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/controller/CaseplatformUserController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/controller/CaseplatformUserController.java
new file mode 100644
index 0000000..cfa384f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/controller/CaseplatformUserController.java
@@ -0,0 +1,41 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.form.CaseplatformUserQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.vo.CaseplatformUserVO;
+import net.lab1024.sa.admin.module.business.caseplatformuser.service.CaseplatformUserService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+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.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 用户表 Controller
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@RestController
+@Api(tags = "")
+@OperateLog
+public class CaseplatformUserController {
+
+ @Autowired
+ private CaseplatformUserService caseplatformUserService;
+
+ @ApiOperation("分页查询 @author HMM")
+ @PostMapping("/caseplatformUser/queryPage")
+ public ResponseDTO> queryPage(@RequestBody @Valid CaseplatformUserQueryForm queryForm) {
+ return ResponseDTO.ok(caseplatformUserService.queryPage(queryForm));
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/dao/CaseplatformUserDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/dao/CaseplatformUserDao.java
new file mode 100644
index 0000000..23402b7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/dao/CaseplatformUserDao.java
@@ -0,0 +1,35 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.dao;
+
+import java.util.List;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.entity.CaseplatformUserEntity;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.form.CaseplatformUserQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.vo.CaseplatformUserVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+/**
+ * 用户表 Dao
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Mapper
+@Component
+public interface CaseplatformUserDao extends BaseMapper {
+
+ /**
+ * 分页 查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") CaseplatformUserQueryForm queryForm);
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/entity/CaseplatformUserEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/entity/CaseplatformUserEntity.java
new file mode 100644
index 0000000..470891a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/entity/CaseplatformUserEntity.java
@@ -0,0 +1,87 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 用户表 实体类
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+@TableName("t_caseplatform_user")
+public class CaseplatformUserEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 患者姓名
+ */
+ private String name;
+
+ /**
+ * 患者id
+ */
+ private String uid;
+
+ /**
+ * 性别
+ */
+ private Integer sex;
+
+ /**
+ * 年龄
+ */
+ private Integer age;
+
+ /**
+ * 专家uuid
+ */
+ private String expertUuid;
+
+ /**
+ * 专家姓名
+ */
+ private String expertName;
+
+ /**
+ * 专家所在省份id
+ */
+ private Integer expertProvId;
+
+ /**
+ * 专家所在省份名称
+ */
+ private String expertProvName;
+
+ /**
+ * 专家所在城市id
+ */
+ private Integer expertCityId;
+
+ /**
+ * 专家所在城市名称
+ */
+ private String expertCityName;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/form/CaseplatformUserQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/form/CaseplatformUserQueryForm.java
new file mode 100644
index 0000000..594dff6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/form/CaseplatformUserQueryForm.java
@@ -0,0 +1,21 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.domain.form;
+
+import net.lab1024.sa.common.common.domain.PageParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 用户表 分页查询表单
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformUserQueryForm extends PageParam{
+
+ @ApiModelProperty(value = "name")
+ private String name;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/vo/CaseplatformUserVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/vo/CaseplatformUserVO.java
new file mode 100644
index 0000000..3639a47
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/domain/vo/CaseplatformUserVO.java
@@ -0,0 +1,41 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.caseplatformuser.constant.SexEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+/**
+ * 用户表 列表VO
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Data
+public class CaseplatformUserVO {
+
+ private Long id;
+
+
+ @ApiModelProperty(value = "患者姓名")
+ private String name;
+
+ @ApiModelProperty(value = "患者id")
+ private String uid;
+
+ @ApiModelPropertyEnum(value = SexEnum.class, desc = "性别")
+ private Integer sex;
+
+ @ApiModelProperty(value = "年龄")
+ private Integer age;
+
+ @ApiModelProperty(value = "创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "修改时间")
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/manager/CaseplatformUserManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/manager/CaseplatformUserManager.java
new file mode 100644
index 0000000..80737e8
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/manager/CaseplatformUserManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.manager;
+
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.entity.CaseplatformUserEntity;
+import net.lab1024.sa.admin.module.business.caseplatformuser.dao.CaseplatformUserDao;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户表 Manager
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+@Service
+public class CaseplatformUserManager extends ServiceImpl {
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/service/CaseplatformUserService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/service/CaseplatformUserService.java
new file mode 100644
index 0000000..434ffe3
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformuser/service/CaseplatformUserService.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.business.caseplatformuser.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.caseplatformuser.dao.CaseplatformUserDao;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.form.CaseplatformUserQueryForm;
+import net.lab1024.sa.admin.module.business.caseplatformuser.domain.vo.CaseplatformUserVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 用户表 Service
+ *
+ * @Author HMM
+ * @Date 2024-01-11 15:18:32
+ * @Copyright gdxz
+ */
+
+@Service
+public class CaseplatformUserService {
+
+ @Autowired
+ private CaseplatformUserDao caseplatformUserDao;
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public PageResult queryPage(CaseplatformUserQueryForm queryForm) {
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = caseplatformUserDao.queryPage(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ return pageResult;
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/constant/CategoryTypeEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/constant/CategoryTypeEnum.java
new file mode 100644
index 0000000..2df51fe
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/constant/CategoryTypeEnum.java
@@ -0,0 +1,36 @@
+package net.lab1024.sa.admin.module.business.category.constant;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 分类类型 枚举
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@AllArgsConstructor
+@Getter
+public enum CategoryTypeEnum implements BaseEnum {
+
+ /**
+ * 1 商品
+ */
+ GOODS(1, "商品"),
+
+ /**
+ * 2 自定义
+ */
+ CUSTOM(2, "自定义"),
+
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/controller/CategoryController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/controller/CategoryController.java
new file mode 100644
index 0000000..8c8493a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/controller/CategoryController.java
@@ -0,0 +1,67 @@
+package net.lab1024.sa.admin.module.business.category.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.common.AdminBaseController;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.business.category.domain.form.CategoryAddForm;
+import net.lab1024.sa.admin.module.business.category.domain.form.CategoryTreeQueryForm;
+import net.lab1024.sa.admin.module.business.category.domain.form.CategoryUpdateForm;
+import net.lab1024.sa.admin.module.business.category.domain.vo.CategoryTreeVO;
+import net.lab1024.sa.admin.module.business.category.domain.vo.CategoryVO;
+import net.lab1024.sa.admin.module.business.category.service.CategoryService;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 类目
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@OperateLog
+@RestController
+//@Api(tags = AdminSwaggerTagConst.Business.MANAGER_CATEGORY)
+public class CategoryController extends AdminBaseController {
+
+ @Autowired
+ private CategoryService categoryService;
+
+ @ApiOperation("添加类目 @author 胡克")
+ @PostMapping("/category/add")
+ public ResponseDTO add(@RequestBody @Valid CategoryAddForm addForm) {
+ return categoryService.add(addForm);
+ }
+
+ @ApiOperation("更新类目 @author 胡克")
+ @PostMapping("/category/update")
+ public ResponseDTO update(@RequestBody @Valid CategoryUpdateForm updateForm) {
+ return categoryService.update(updateForm);
+ }
+
+ @ApiOperation("查询类目详情 @author 胡克")
+ @GetMapping("/category/{categoryId}")
+ public ResponseDTO queryDetail(@PathVariable Long categoryId) {
+ return categoryService.queryDetail(categoryId);
+ }
+
+ @ApiOperation("查询类目层级树 @author 胡克")
+ @PostMapping("/category/tree")
+ public ResponseDTO> queryTree(@RequestBody @Valid CategoryTreeQueryForm queryForm) {
+ return categoryService.queryTree(queryForm);
+ }
+
+ @ApiOperation("删除类目 @author 胡克")
+ @GetMapping("/category/delete/{categoryId}")
+ public ResponseDTO delete(@PathVariable Long categoryId) {
+ return categoryService.delete(categoryId);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/dao/CategoryDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/dao/CategoryDao.java
new file mode 100644
index 0000000..c9ac00f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/dao/CategoryDao.java
@@ -0,0 +1,72 @@
+package net.lab1024.sa.admin.module.business.category.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+import net.lab1024.sa.admin.module.business.category.domain.entity.CategoryEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 类目 dao
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Component
+@Mapper
+public interface CategoryDao extends BaseMapper {
+
+ /**
+ * 根据父级id 类型 查询子类
+ *
+ * @param parentIdList
+ * @param deletedFlag
+ * @return
+ */
+ List queryByParentId(@Param("parentIdList") List parentIdList,
+ @Param("deletedFlag") Boolean deletedFlag);
+
+ /**
+ * 根据父级id 类型 查询子类
+ *
+ * @param parentIdList
+ * @param categoryType {@link CategoryTypeEnum}
+ * @param deletedFlag
+ * @return
+ */
+ List queryByParentIdAndType(@Param("parentIdList") List parentIdList,
+ @Param("categoryType") Integer categoryType,
+ @Param("deletedFlag") Boolean deletedFlag);
+
+ /**
+ * 某个类型的所有
+ * @param categoryType
+ * @param deletedFlag
+ * @return
+ */
+ List queryByType(@Param("categoryType") Integer categoryType,
+ @Param("deletedFlag") Boolean deletedFlag);
+
+ /**
+ * 根据类型和id查询
+ * @param categoryType
+ * @param categoryId
+ * @return
+ */
+ CategoryEntity selectByTypeAndId(@Param("categoryType") Integer categoryType, @Param("categoryId") Long categoryId);
+
+ /**
+ * 查看类目 具体条件 看sql
+ *
+ * @param entity
+ * @return
+ */
+ CategoryEntity selectOne(CategoryEntity entity);
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategoryBaseDTO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategoryBaseDTO.java
new file mode 100644
index 0000000..5381ab9
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategoryBaseDTO.java
@@ -0,0 +1,44 @@
+package net.lab1024.sa.admin.module.business.category.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 类目 基础属性 DTO 类
+ *
+ * @author 胡克
+ * @date 2021/1/20 16:17
+ */
+@Data
+public class CategoryBaseDTO {
+
+ @ApiModelProperty(value = "类目名称", required = true)
+ @NotBlank(message = "类目名称不能为空")
+ @Length(max = 20, message = "类目名称最多20字符")
+ private String categoryName;
+
+ @ApiModelPropertyEnum(desc = "分类类型", value = CategoryTypeEnum.class)
+ @CheckEnum(value = CategoryTypeEnum.class, required = true, message = "分类错误")
+ private Integer categoryType;
+
+ @ApiModelProperty("父级类目id|可选")
+ private Long parentId;
+
+ @ApiModelProperty("排序|可选")
+ private Integer sort;
+
+ @ApiModelProperty("备注|可选")
+ @Length(max = 200, message = "备注最多200字符")
+ private String remark;
+
+ @ApiModelProperty("禁用状态")
+ @NotNull(message = "禁用状态不能为空")
+ private Boolean disabledFlag;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategorySimpleDTO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategorySimpleDTO.java
new file mode 100644
index 0000000..7f25e7b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/dto/CategorySimpleDTO.java
@@ -0,0 +1,26 @@
+package net.lab1024.sa.admin.module.business.category.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 类目 基础属性 DTO 类
+ *
+ * @author 胡克
+ * @date 2021/1/20 16:17
+ */
+@Data
+public class CategorySimpleDTO {
+
+ @ApiModelProperty("类目id")
+ private Long categoryId;
+
+ @ApiModelProperty("类目名称")
+ private String categoryName;
+
+ @ApiModelProperty("类目层级全称")
+ private String categoryFullName;
+
+ @ApiModelProperty("父级id")
+ private Long parentId;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java
new file mode 100644
index 0000000..f8ee74a
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java
@@ -0,0 +1,67 @@
+package net.lab1024.sa.admin.module.business.category.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+
+import java.time.LocalDateTime;
+
+/**
+ * 类目 实体类
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+@TableName("t_category")
+public class CategoryEntity {
+
+ @TableId(type = IdType.AUTO)
+ private Long categoryId;
+
+ /**
+ * 类目名称
+ */
+ private String categoryName;
+
+ /**
+ * 类目 类型
+ *
+ * @see CategoryTypeEnum
+ */
+ private Integer categoryType;
+
+ /**
+ * 父级类目id
+ */
+ private Long parentId;
+
+ /**
+ * 是否禁用
+ */
+ private Boolean disabledFlag;
+
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+ /**
+ * 删除状态
+ */
+ private Boolean deletedFlag;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ private LocalDateTime updateTime;
+
+ private LocalDateTime createTime;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryAddForm.java
new file mode 100644
index 0000000..29a3781
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryAddForm.java
@@ -0,0 +1,49 @@
+package net.lab1024.sa.admin.module.business.category.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+import net.lab1024.sa.admin.module.business.category.domain.dto.CategoryBaseDTO;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 类目 添加
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class CategoryAddForm {
+
+ @ApiModelProperty(value = "类目名称", required = true)
+ @NotBlank(message = "类目名称不能为空")
+ @Length(max = 20, message = "类目名称最多20字符")
+ private String categoryName;
+
+ @ApiModelPropertyEnum(desc = "分类类型", value = CategoryTypeEnum.class)
+ @CheckEnum(value = CategoryTypeEnum.class, required = true, message = "分类错误")
+ private Integer categoryType;
+
+ @ApiModelProperty("父级类目id|可选")
+ private Long parentId;
+
+ @ApiModelProperty("排序|可选")
+ private Integer sort;
+
+ @ApiModelProperty("备注|可选")
+ @Length(max = 200, message = "备注最多200字符")
+ private String remark;
+
+ @ApiModelProperty("禁用状态")
+ @NotNull(message = "禁用状态不能为空")
+ private Boolean disabledFlag;
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryTreeQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryTreeQueryForm.java
new file mode 100644
index 0000000..907bca7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryTreeQueryForm.java
@@ -0,0 +1,25 @@
+package net.lab1024.sa.admin.module.business.category.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+/**
+ * 类目 层级树查询
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class CategoryTreeQueryForm {
+
+ @ApiModelPropertyEnum(desc = "分类类型|可选", value = CategoryTypeEnum.class)
+ private Integer categoryType;
+
+ @ApiModelProperty("父级类目id|可选")
+ private Long parentId;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryUpdateForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryUpdateForm.java
new file mode 100644
index 0000000..959c702
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/form/CategoryUpdateForm.java
@@ -0,0 +1,24 @@
+package net.lab1024.sa.admin.module.business.category.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.domain.dto.CategoryBaseDTO;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 类目 更新
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class CategoryUpdateForm extends CategoryAddForm {
+
+ @ApiModelProperty("类目id")
+ @NotNull(message = "类目id不能为空")
+ private Long categoryId;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java
new file mode 100644
index 0000000..db3ecda
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.module.business.category.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 类目 层级树 vo
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class CategoryTreeVO {
+
+ @ApiModelProperty("类目id")
+ private Long categoryId;
+
+ @ApiModelProperty("类目名称")
+ private String categoryName;
+
+ @ApiModelProperty("类目层级全称")
+ private String categoryFullName;
+
+ @ApiModelProperty("父级id")
+ private Long parentId;
+
+ @ApiModelProperty("类目id")
+ private Long value;
+
+ @ApiModelProperty("类目名称")
+ private String label;
+
+ @ApiModelProperty("子类")
+ private List children;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryVO.java
new file mode 100644
index 0000000..23b7196
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryVO.java
@@ -0,0 +1,51 @@
+package net.lab1024.sa.admin.module.business.category.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+import net.lab1024.sa.admin.module.business.category.domain.dto.CategoryBaseDTO;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+/**
+ * 类目
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class CategoryVO {
+
+ @ApiModelProperty(value = "类目名称", required = true)
+ private String categoryName;
+
+ @ApiModelPropertyEnum(desc = "分类类型", value = CategoryTypeEnum.class)
+ private Integer categoryType;
+
+ @ApiModelProperty("父级类目id|可选")
+ private Long parentId;
+
+ @ApiModelProperty("排序|可选")
+ private Integer sort;
+
+ @ApiModelProperty("备注|可选")
+ private String remark;
+
+ @ApiModelProperty("禁用状态")
+ private Boolean disabledFlag;
+
+ @ApiModelProperty("类目id")
+ private Long categoryId;
+
+ private LocalDateTime updateTime;
+
+ private LocalDateTime createTime;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/manager/CategoryCacheManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/manager/CategoryCacheManager.java
new file mode 100644
index 0000000..819d99d
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/manager/CategoryCacheManager.java
@@ -0,0 +1,120 @@
+package net.lab1024.sa.admin.module.business.category.manager;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.admin.constant.AdminCacheConst;
+import net.lab1024.sa.admin.module.business.category.dao.CategoryDao;
+import net.lab1024.sa.admin.module.business.category.domain.entity.CategoryEntity;
+import net.lab1024.sa.admin.module.business.category.domain.vo.CategoryTreeVO;
+import net.lab1024.sa.common.common.constant.StringConst;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 类目 查询 缓存
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Service
+@Slf4j
+public class CategoryCacheManager {
+
+
+ @Autowired
+ private CategoryDao categoryDao;
+
+
+ /**
+ * 根据类目id 移除缓存
+ */
+ @CacheEvict(value = {AdminCacheConst.CATEGORY.CATEGORY_ENTITY, AdminCacheConst.CATEGORY.CATEGORY_SUB, AdminCacheConst.CATEGORY.CATEGORY_TREE}, allEntries = true)
+ public void removeCache() {
+ log.info("clear CATEGORY ,CATEGORY_SUB ,CATEGORY_TREE");
+ }
+
+ /**
+ * 查詢类目
+ *
+ * @param categoryId
+ * @return
+ */
+ @Cacheable(AdminCacheConst.CATEGORY.CATEGORY_ENTITY)
+ public CategoryEntity queryCategory(Long categoryId) {
+ return categoryDao.selectById(categoryId);
+ }
+
+ /**
+ * 查询类目 子级
+ *
+ * @param categoryId
+ * @return
+ */
+ @Cacheable(AdminCacheConst.CATEGORY.CATEGORY_SUB)
+ public List querySubCategory(Long categoryId) {
+ return categoryDao.queryByParentId(Lists.newArrayList(categoryId), false);
+ }
+
+
+ /**
+ * 查询类目 层级树
+ * 优先查询缓存
+ *
+ * @return
+ */
+ @Cacheable(AdminCacheConst.CATEGORY.CATEGORY_TREE)
+ public List queryCategoryTree(Long parentId, Integer categoryType) {
+ List allCategoryEntityList = categoryDao.queryByType(categoryType, false);
+
+ List categoryEntityList = allCategoryEntityList.stream().filter(e -> e.getParentId().equals(parentId)).collect(Collectors.toList());
+ List treeList = SmartBeanUtil.copyList(categoryEntityList, CategoryTreeVO.class);
+ treeList.forEach(e -> {
+ e.setLabel(e.getCategoryName());
+ e.setValue(e.getCategoryId());
+ e.setCategoryFullName(e.getCategoryName());
+ });
+ // 递归设置子类
+ this.queryAndSetSubCategory(treeList, allCategoryEntityList);
+ return treeList;
+ }
+
+ /**
+ * 递归查询设置类目子类
+ * 从缓存查询子类
+ *
+ * @param treeList
+ */
+ private void queryAndSetSubCategory(List treeList, List allCategoryEntityList) {
+ if (CollectionUtils.isEmpty(treeList)) {
+ return;
+ }
+ List parentIdList = treeList.stream().map(CategoryTreeVO::getValue).collect(Collectors.toList());
+ List categoryEntityList = allCategoryEntityList.stream().filter(e -> parentIdList.contains(e.getParentId())).collect(Collectors.toList());
+ Map> categorySubMap = categoryEntityList.stream().collect(Collectors.groupingBy(CategoryEntity::getParentId));
+ treeList.forEach(e -> {
+ List childrenEntityList = categorySubMap.getOrDefault(e.getValue(), Lists.newArrayList());
+ List childrenVOList = SmartBeanUtil.copyList(childrenEntityList, CategoryTreeVO.class);
+ childrenVOList.forEach(item -> {
+ item.setLabel(item.getCategoryName());
+ item.setValue(item.getCategoryId());
+ item.setCategoryFullName(e.getCategoryFullName() + StringConst.SEPARATOR_SLASH + item.getCategoryName());
+ });
+ // 递归查询
+ this.queryAndSetSubCategory(childrenVOList, allCategoryEntityList);
+ e.setChildren(childrenVOList);
+ });
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryQueryService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryQueryService.java
new file mode 100644
index 0000000..4f643e6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryQueryService.java
@@ -0,0 +1,214 @@
+package net.lab1024.sa.admin.module.business.category.service;
+
+import cn.hutool.core.util.StrUtil;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.admin.module.business.category.dao.CategoryDao;
+import net.lab1024.sa.admin.module.business.category.domain.entity.CategoryEntity;
+import net.lab1024.sa.admin.module.business.category.domain.dto.CategorySimpleDTO;
+import net.lab1024.sa.admin.module.business.category.manager.CategoryCacheManager;
+import net.lab1024.sa.common.common.constant.StringConst;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 类目 查询 业务类
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Service
+@Slf4j
+public class CategoryQueryService {
+
+ private static final Long DEFAULT_CATEGORY_PARENT_ID = 0L;
+
+ @Autowired
+ private CategoryDao categoryDao;
+
+ @Autowired
+ private CategoryCacheManager categoryCacheManager;
+
+ /**
+ * 根据 id 查询未删除的类目
+ *
+ * @param categoryId
+ * @return 可能 null
+ */
+ public Optional queryCategory(Long categoryId) {
+ if (null == categoryId) {
+ return Optional.empty();
+ }
+ CategoryEntity entity = categoryCacheManager.queryCategory(categoryId);
+ if (null == entity || entity.getDeletedFlag()) {
+ return Optional.empty();
+ }
+ return Optional.of(entity);
+ }
+
+
+ /**
+ * 根据 类目id集合 查询未删除的类目集合
+ *
+ * @param categoryIdList
+ * @return
+ */
+ public Map queryCategoryList(List categoryIdList) {
+ if (CollectionUtils.isEmpty(categoryIdList)) {
+ return Collections.emptyMap();
+ }
+ categoryIdList = categoryIdList.stream().distinct().collect(Collectors.toList());
+ Map categoryEntityMap = Maps.newHashMap();
+ for (Long categoryId : categoryIdList) {
+ CategoryEntity categoryEntity = categoryCacheManager.queryCategory(categoryId);
+ if(categoryEntity != null){
+ categoryEntityMap.put(categoryId, categoryEntity);
+ }
+ }
+ return categoryEntityMap;
+ }
+
+
+ /**
+ * 根据类目id 递归查询该id的所有子类id 递归查询
+ * 同时存入缓存
+ * 注意:查询出来的集合 不包含传递的父类参数
+ *
+ * @param categoryIdList
+ */
+ public List queryCategorySubId(List categoryIdList) {
+ if (CollectionUtils.isEmpty(categoryIdList)) {
+ return Collections.emptyList();
+ }
+ //所有子类
+ List categoryEntityList = Lists.newArrayList();
+ categoryIdList.forEach(e -> {
+ categoryEntityList.addAll(categoryCacheManager.querySubCategory(e));
+ });
+ Map> subTypeMap = categoryEntityList.stream().collect(Collectors.groupingBy(CategoryEntity::getCategoryId));
+ // 递归查询子类
+ categoryIdList = subTypeMap.values().stream().flatMap(Collection::stream).map(CategoryEntity::getCategoryId).distinct().collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(categoryIdList)) {
+ return Lists.newArrayList();
+ }
+ categoryIdList.addAll(this.queryCategorySubId(categoryIdList));
+ return categoryIdList;
+ }
+
+
+ /**
+ * 处理类目名称
+ *
+ * @param categoryIdList
+ */
+ public List queryCategoryName(List categoryIdList) {
+ if (CollectionUtils.isEmpty(categoryIdList)) {
+ return null;
+ }
+ Map categoryMap = this.queryCategoryList(categoryIdList);
+ List categoryNameList = Lists.newArrayList();
+ categoryIdList.forEach(e -> {
+ CategoryEntity categoryEntity = categoryMap.get(e);
+ if (categoryEntity != null) {
+ categoryNameList.add(categoryMap.get(e).getCategoryName());
+ }
+ });
+ return categoryNameList;
+ }
+
+ /**
+ * 根据类目id 查询类目名称
+ *
+ * @param categoryId
+ * @return
+ */
+ public String queryCategoryName(Long categoryId) {
+ CategoryEntity categoryEntity = categoryCacheManager.queryCategory(categoryId);
+ if (null == categoryEntity || categoryEntity.getDeletedFlag()) {
+ return null;
+ }
+ return categoryEntity.getCategoryName();
+ }
+
+ /**
+ * 根据类目id 查询类目详情 包含类目全称 如:医考/医师资格/临床执业
+ *
+ * @param categoryId
+ * @return
+ */
+ public CategorySimpleDTO queryCategoryInfo(Long categoryId) {
+ CategoryEntity categoryEntity = categoryCacheManager.queryCategory(categoryId);
+ if (null == categoryEntity || categoryEntity.getDeletedFlag()) {
+ return null;
+ }
+ String fullName = this.queryFullName(categoryId);
+ // 返回DTO
+ CategorySimpleDTO categoryDTO = new CategorySimpleDTO();
+ categoryDTO.setCategoryId(categoryId);
+ categoryDTO.setCategoryName(categoryEntity.getCategoryName());
+ categoryDTO.setCategoryFullName(fullName);
+ categoryDTO.setParentId(categoryEntity.getParentId());
+ return categoryDTO;
+ }
+
+ /**
+ * 递归查询分类和所有父级类目
+ * ps:特别注意返回的集合中 包含自己
+ *
+ * @param categoryId
+ * @return
+ */
+ public List queryCategoryAndParent(Long categoryId) {
+ List parentCategoryList = Lists.newArrayList();
+ CategoryEntity categoryEntity = categoryCacheManager.queryCategory(categoryId);
+ if (null == categoryEntity || categoryEntity.getDeletedFlag()) {
+ return parentCategoryList;
+ }
+
+ // 父级始终放在第一位
+ parentCategoryList.add(0, categoryEntity);
+ Long parentId = categoryEntity.getParentId();
+ if (Objects.equals(DEFAULT_CATEGORY_PARENT_ID, parentId)) {
+ return parentCategoryList;
+ }
+ parentCategoryList.addAll(0, this.queryCategoryAndParent(parentId));
+ return parentCategoryList;
+ }
+
+ /**
+ * 查询 分类全称 如:医考/医师资格/临床执业
+ *
+ * @param categoryId
+ * @return
+ */
+ public String queryFullName(Long categoryId) {
+ List parentCategoryList = this.queryCategoryAndParent(categoryId);
+ // 拼接父级类目名称 斜杠分隔返回
+ List nameList = parentCategoryList.stream().map(CategoryEntity::getCategoryName).collect(Collectors.toList());
+ return StrUtil.join(StringConst.SEPARATOR_SLASH, nameList);
+ }
+
+ /**
+ * 查询 分类全称 如:医考/医师资格/临床执业
+ *
+ * @param categoryIdList
+ * @return
+ */
+ public Map queryFullName(List categoryIdList) {
+ if (CollectionUtils.isEmpty(categoryIdList)) {
+ return Collections.EMPTY_MAP;
+ }
+ // 循环内查询的缓存 还ok
+ return categoryIdList.stream().collect(Collectors.toMap(Function.identity(), this::queryFullName));
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryService.java
new file mode 100644
index 0000000..2dd1ae4
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/service/CategoryService.java
@@ -0,0 +1,220 @@
+package net.lab1024.sa.admin.module.business.category.service;
+
+import com.google.common.collect.Lists;
+import net.lab1024.sa.admin.module.business.category.dao.CategoryDao;
+import net.lab1024.sa.admin.module.business.category.domain.entity.CategoryEntity;
+import net.lab1024.sa.admin.module.business.category.domain.form.CategoryAddForm;
+import net.lab1024.sa.admin.module.business.category.domain.form.CategoryTreeQueryForm;
+import net.lab1024.sa.admin.module.business.category.domain.form.CategoryUpdateForm;
+import net.lab1024.sa.admin.module.business.category.domain.vo.CategoryTreeVO;
+import net.lab1024.sa.admin.module.business.category.domain.vo.CategoryVO;
+import net.lab1024.sa.admin.module.business.category.manager.CategoryCacheManager;
+import net.lab1024.sa.common.common.code.UserErrorCode;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * 类目
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021/08/05 21:26:58
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Service
+public class CategoryService {
+
+ @Autowired
+ private CategoryDao categoryDao;
+
+ @Autowired
+ private CategoryQueryService categoryQueryService;
+
+ @Autowired
+ private CategoryCacheManager categoryCacheManager;
+
+ /**
+ * 添加类目
+ *
+ * @author 胡克
+ * @date 2021/1/20 17:17
+ */
+ public ResponseDTO add(CategoryAddForm addForm) {
+ // 校验类目
+ CategoryEntity categoryEntity = SmartBeanUtil.copy(addForm, CategoryEntity.class);
+ ResponseDTO res = this.checkCategory(categoryEntity, false);
+ if (!res.getOk()) {
+ return res;
+ }
+ // 没有父类则使用默认父类
+ Long parentId = null == addForm.getParentId() ? NumberUtils.LONG_ZERO : addForm.getParentId();
+ categoryEntity.setParentId(parentId);
+ categoryEntity.setSort(null == addForm.getSort() ? 0 : addForm.getSort());
+ categoryEntity.setDeletedFlag(false);
+
+ // 保存数据
+ categoryDao.insert(categoryEntity);
+
+ // 更新缓存
+ categoryCacheManager.removeCache();
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 更新类目
+ * 不能更新父级类目
+ *
+ * @author 胡克
+ * @date 2021/1/20 17:17
+ */
+ public ResponseDTO update(CategoryUpdateForm updateForm) {
+ // 校验类目
+ Long categoryId = updateForm.getCategoryId();
+ Optional optional = categoryQueryService.queryCategory(categoryId);
+ if (!optional.isPresent()) {
+ return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST);
+ }
+ CategoryEntity categoryEntity = SmartBeanUtil.copy(updateForm, CategoryEntity.class);
+
+ /**
+ * 不更新类目类型
+ * 不更新父类id
+ */
+ Integer categoryType = optional.get().getCategoryType();
+ categoryEntity.setCategoryType(categoryType);
+ categoryEntity.setParentId(optional.get().getParentId());
+
+ ResponseDTO responseDTO = this.checkCategory(categoryEntity, true);
+ if (!responseDTO.getOk()) {
+ return responseDTO;
+ }
+ categoryDao.updateById(categoryEntity);
+
+ // 更新缓存
+ categoryCacheManager.removeCache();
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 新增/更新 类目时的 校验
+ *
+ * @param categoryEntity
+ * @param isUpdate
+ * @return
+ */
+ private ResponseDTO checkCategory(CategoryEntity categoryEntity, boolean isUpdate) {
+ // 校验父级是否存在
+ Long parentId = categoryEntity.getParentId();
+ Integer categoryType = categoryEntity.getCategoryType();
+ if (null != parentId) {
+ if (Objects.equals(categoryEntity.getCategoryId(), parentId)) {
+ return ResponseDTO.userErrorParam("父级类目怎么和自己相同了");
+ }
+ if (!Objects.equals(parentId, NumberUtils.LONG_ZERO)) {
+ Optional optional = categoryQueryService.queryCategory(parentId);
+ if (!optional.isPresent()) {
+ return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST, "父级类目不存在~");
+ }
+
+ CategoryEntity parent = optional.get();
+ if (!Objects.equals(categoryType, parent.getCategoryType())) {
+ return ResponseDTO.userErrorParam("与父级类目类型不一致");
+ }
+ }
+
+ } else {
+ // 如果没有父类 使用默认父类
+ parentId = NumberUtils.LONG_ZERO;
+ }
+
+ // 校验同父类下 名称是否重复
+ CategoryEntity queryEntity = new CategoryEntity();
+ queryEntity.setParentId(parentId);
+ queryEntity.setCategoryType(categoryType);
+ queryEntity.setCategoryName(categoryEntity.getCategoryName());
+ queryEntity.setDeletedFlag(false);
+ queryEntity = categoryDao.selectOne(queryEntity);
+ if (null != queryEntity) {
+ if (isUpdate) {
+ if (!Objects.equals(queryEntity.getCategoryId(), categoryEntity.getCategoryId())) {
+ return ResponseDTO.userErrorParam("同级下已存在相同类目~");
+ }
+ } else {
+ return ResponseDTO.userErrorParam("同级下已存在相同类目~");
+ }
+ }
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 查询 类目详情
+ *
+ * @param categoryId
+ * @return
+ */
+ public ResponseDTO queryDetail(Long categoryId) {
+ Optional optional = categoryQueryService.queryCategory(categoryId);
+ if (!optional.isPresent()) {
+ return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST);
+ }
+ CategoryVO adminVO = SmartBeanUtil.copy(optional.get(), CategoryVO.class);
+ return ResponseDTO.ok(adminVO);
+ }
+
+ /**
+ * 根据父级id 查询所有子类 返回层级树
+ * 如果父类id 为空 返回所有类目层级
+ *
+ * @param queryForm
+ * @return
+ */
+ public ResponseDTO> queryTree(CategoryTreeQueryForm queryForm) {
+ if (null == queryForm.getParentId()) {
+ if (null == queryForm.getCategoryType()) {
+ return ResponseDTO.userErrorParam("类目类型不能为空");
+ }
+ queryForm.setParentId(NumberUtils.LONG_ZERO);
+ }
+ List treeList = categoryCacheManager.queryCategoryTree(queryForm.getParentId(), queryForm.getCategoryType());
+ return ResponseDTO.ok(treeList);
+ }
+
+ /**
+ * 删除类目
+ * 如果有未删除的子类 则无法删除
+ *
+ * @param categoryId
+ * @return
+ */
+ public ResponseDTO delete(Long categoryId) {
+ Optional optional = categoryQueryService.queryCategory(categoryId);
+ if (!optional.isPresent()) {
+ return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST);
+ }
+
+ List categorySubId = categoryQueryService.queryCategorySubId(Lists.newArrayList(categoryId));
+ if (CollectionUtils.isNotEmpty(categorySubId)) {
+ return ResponseDTO.userErrorParam("请先删除子级类目");
+ }
+
+ // 更新数据
+ CategoryEntity categoryEntity = new CategoryEntity();
+ categoryEntity.setCategoryId(categoryId);
+ categoryEntity.setDeletedFlag(true);
+ categoryDao.updateById(categoryEntity);
+
+ // 更新缓存
+ categoryCacheManager.removeCache();
+ return ResponseDTO.ok();
+ }
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/constant/GoodsStatusEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/constant/GoodsStatusEnum.java
new file mode 100644
index 0000000..8638da7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/constant/GoodsStatusEnum.java
@@ -0,0 +1,42 @@
+package net.lab1024.sa.admin.module.business.goods.constant;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.lab1024.sa.common.common.enumeration.BaseEnum;
+
+/**
+ * 商品状态
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@AllArgsConstructor
+@Getter
+public enum GoodsStatusEnum implements BaseEnum {
+
+ /**
+ * 1 预约中
+ */
+ APPOINTMENT(1, "预约中"),
+
+ /**
+ * 2 售卖
+ */
+ SELL(2, "售卖中"),
+
+ /**
+ * 3 售罄
+ */
+ SELL_OUT(3, "售罄"),
+
+
+ ;
+
+ private final Integer value;
+
+ private final String desc;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/controller/GoodsController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/controller/GoodsController.java
new file mode 100644
index 0000000..06e13e6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/controller/GoodsController.java
@@ -0,0 +1,75 @@
+package net.lab1024.sa.admin.module.business.goods.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.common.AdminBaseController;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsAddForm;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsQueryForm;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsUpdateForm;
+import net.lab1024.sa.admin.module.business.goods.domain.vo.GoodsVO;
+import net.lab1024.sa.admin.module.business.goods.service.GoodsService;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.domain.ValidateList;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 商品业务
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@OperateLog
+@RestController
+//@Api(tags = AdminSwaggerTagConst.Business.MANAGER_GOODS)
+public class GoodsController extends AdminBaseController {
+
+ @Autowired
+ private GoodsService goodsService;
+
+ @ApiOperation("分页查询 @author 胡克")
+ @PostMapping("/goods/query")
+ @PreAuthorize("@saAuth.checkPermission('goods:query')")
+ public ResponseDTO> query(@RequestBody @Valid GoodsQueryForm queryForm) {
+ return goodsService.query(queryForm);
+ }
+
+ @ApiOperation("添加商品 @author 胡克")
+ @PostMapping("/goods/add")
+ @PreAuthorize("@saAuth.checkPermission('goods:add')")
+ public ResponseDTO add(@RequestBody @Valid GoodsAddForm addForm) {
+ return goodsService.add(addForm);
+ }
+
+ @ApiOperation("更新商品 @author 胡克")
+ @PostMapping("/goods/update")
+ @PreAuthorize("@saAuth.checkPermission('goods:update')")
+ public ResponseDTO update(@RequestBody @Valid GoodsUpdateForm updateForm) {
+ return goodsService.update(updateForm);
+ }
+
+ @ApiOperation("删除 @author 卓大")
+ @GetMapping("/goods/delete/{goodsId}")
+ @PreAuthorize("@saAuth.checkPermission('goods:delete')")
+ public ResponseDTO delete(@PathVariable Long goodsId) {
+ return goodsService.delete(goodsId);
+ }
+
+ @ApiOperation("批量 @author 卓大")
+ @PostMapping("/goods/batchDelete")
+ @PreAuthorize("@saAuth.checkPermission('goods:batchDelete')")
+ public ResponseDTO batchDelete(@RequestBody @Valid ValidateList idList) {
+ return goodsService.batchDelete(idList);
+ }
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/dao/GoodsDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/dao/GoodsDao.java
new file mode 100644
index 0000000..a0872ca
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/dao/GoodsDao.java
@@ -0,0 +1,43 @@
+package net.lab1024.sa.admin.module.business.goods.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.goods.domain.entity.GoodsEntity;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsQueryForm;
+import net.lab1024.sa.admin.module.business.goods.domain.vo.GoodsVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 商品
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Mapper
+@Component
+public interface GoodsDao extends BaseMapper {
+
+ /**
+ * 分页 查询商品
+ *
+ * @param page
+ * @param query
+ * @return
+ */
+ List query(Page page, @Param("query") GoodsQueryForm query);
+
+ /**
+ * 批量更新删除状态
+ */
+
+ void batchUpdateDeleted(@Param("goodsIdList")List goodsIdList,@Param("deletedFlag")Boolean deletedFlag);
+
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/entity/GoodsEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/entity/GoodsEntity.java
new file mode 100644
index 0000000..a2878a6
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/entity/GoodsEntity.java
@@ -0,0 +1,75 @@
+package net.lab1024.sa.admin.module.business.goods.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.category.dao.CategoryDao;
+import net.lab1024.sa.common.module.support.datatracer.annoation.DataTracerFieldBigDecimal;
+import net.lab1024.sa.common.module.support.datatracer.annoation.DataTracerFieldLabel;
+import net.lab1024.sa.common.module.support.datatracer.annoation.DataTracerFieldSql;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 商品 实体类
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+@TableName("t_goods")
+public class GoodsEntity {
+
+ @TableId(type = IdType.AUTO)
+ private Long goodsId;
+
+ /**
+ * 商品状态:[1:预约中,2:售卖中,3:售罄]
+ */
+ private Integer goodsStatus;
+
+ /**
+ * 商品分类
+ */
+ private Long categoryId;
+
+ /**
+ * 商品名称
+ */
+ private String goodsName;
+
+ /**
+ * 产地
+ */
+ private String place;
+
+ /**
+ * 商品价格
+ */
+ private BigDecimal price;
+
+
+ /**
+ * 上架状态
+ */
+ private Boolean shelvesFlag;
+
+ /**
+ * 删除状态
+ */
+ private Boolean deletedFlag;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ private LocalDateTime updateTime;
+
+ private LocalDateTime createTime;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsAddForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsAddForm.java
new file mode 100644
index 0000000..2747427
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsAddForm.java
@@ -0,0 +1,57 @@
+package net.lab1024.sa.admin.module.business.goods.domain.form;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.goods.constant.GoodsStatusEnum;
+import net.lab1024.sa.common.common.json.deserializer.DictValueVoDeserializer;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 商品 添加表单
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class GoodsAddForm {
+
+ @ApiModelProperty("商品分类")
+ @NotNull(message = "商品分类不能为空")
+ private Long categoryId;
+
+ @ApiModelProperty("商品名称")
+ @NotBlank(message = "商品名称不能为空")
+ private String goodsName;
+
+ @ApiModelPropertyEnum(GoodsStatusEnum.class)
+ @CheckEnum(message = "商品状态错误", value = GoodsStatusEnum.class, required = true)
+ private Integer goodsStatus;
+
+ @ApiModelProperty("产地")
+ @NotBlank(message = "产地 不能为空 ")
+ @JsonDeserialize(using = DictValueVoDeserializer.class)
+ private String place;
+
+ @ApiModelProperty("商品价格")
+ @NotNull(message = "商品价格不能为空")
+ @DecimalMin(value = "0", message = "商品价格最低0")
+ private BigDecimal price;
+
+ @ApiModelProperty("上架状态")
+ @NotNull(message = "上架状态不能为空")
+ private Boolean shelvesFlag;
+
+ @ApiModelProperty("备注|可选")
+ private String remark;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java
new file mode 100644
index 0000000..e25e352
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java
@@ -0,0 +1,46 @@
+package net.lab1024.sa.admin.module.business.goods.domain.form;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.goods.constant.GoodsStatusEnum;
+import net.lab1024.sa.common.common.domain.PageParam;
+import net.lab1024.sa.common.common.json.deserializer.DictValueVoDeserializer;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+import net.lab1024.sa.common.common.validator.enumeration.CheckEnum;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 商品 分页查询
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class GoodsQueryForm extends PageParam {
+
+ @ApiModelProperty("商品分类")
+ private Integer categoryId;
+
+ @ApiModelProperty("搜索词")
+ @Length(max = 30, message = "搜索词最多30字符")
+ private String searchWord;
+
+ @ApiModelPropertyEnum(GoodsStatusEnum.class)
+ @CheckEnum(message = "商品状态错误", value = GoodsStatusEnum.class, required = false)
+ private Integer goodsStatus;
+
+ @ApiModelProperty("产地")
+ private String place;
+
+ @ApiModelProperty("上架状态")
+ private Boolean shelvesFlag;
+
+ @ApiModelProperty(hidden = true)
+ private Boolean deletedFlag;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsUpdateForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsUpdateForm.java
new file mode 100644
index 0000000..f72656e
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsUpdateForm.java
@@ -0,0 +1,23 @@
+package net.lab1024.sa.admin.module.business.goods.domain.form;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 商品 更新表单
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class GoodsUpdateForm extends GoodsAddForm {
+
+ @ApiModelProperty("商品id")
+ @NotNull(message = "商品id不能为空")
+ private Long goodsId;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java
new file mode 100644
index 0000000..fe7eaaf
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java
@@ -0,0 +1,56 @@
+package net.lab1024.sa.admin.module.business.goods.domain.vo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.admin.module.business.goods.constant.GoodsStatusEnum;
+import net.lab1024.sa.common.common.json.serializer.DictValueVoSerializer;
+import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 商品
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class GoodsVO {
+
+ @ApiModelProperty("商品分类")
+ private Long categoryId;
+
+ @ApiModelProperty("商品名称")
+ private String goodsName;
+
+ @ApiModelPropertyEnum(GoodsStatusEnum.class)
+ private Integer goodsStatus;
+
+ @ApiModelProperty("产地")
+ @JsonSerialize(using = DictValueVoSerializer.class)
+ private String place;
+
+ @ApiModelProperty("商品价格")
+ private BigDecimal price;
+
+ @ApiModelProperty("上架状态")
+ private Boolean shelvesFlag;
+
+ @ApiModelProperty("备注|可选")
+ private String remark;
+
+ @ApiModelProperty("商品id")
+ private Long goodsId;
+
+ @ApiModelProperty("商品分类")
+ private String categoryName;
+
+ private LocalDateTime updateTime;
+
+ private LocalDateTime createTime;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/manager/GoodsManager.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/manager/GoodsManager.java
new file mode 100644
index 0000000..898b6aa
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/manager/GoodsManager.java
@@ -0,0 +1,20 @@
+package net.lab1024.sa.admin.module.business.goods.manager;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.lab1024.sa.admin.module.business.goods.dao.GoodsDao;
+import net.lab1024.sa.admin.module.business.goods.domain.entity.GoodsEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ * 商品 manager
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Service
+public class GoodsManager extends ServiceImpl {
+
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java
new file mode 100644
index 0000000..dfbdd03
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java
@@ -0,0 +1,168 @@
+package net.lab1024.sa.admin.module.business.goods.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum;
+import net.lab1024.sa.admin.module.business.category.domain.entity.CategoryEntity;
+import net.lab1024.sa.admin.module.business.category.service.CategoryQueryService;
+import net.lab1024.sa.admin.module.business.goods.constant.GoodsStatusEnum;
+import net.lab1024.sa.admin.module.business.goods.dao.GoodsDao;
+import net.lab1024.sa.admin.module.business.goods.domain.entity.GoodsEntity;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsAddForm;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsQueryForm;
+import net.lab1024.sa.admin.module.business.goods.domain.form.GoodsUpdateForm;
+import net.lab1024.sa.admin.module.business.goods.domain.vo.GoodsVO;
+import net.lab1024.sa.admin.module.business.goods.manager.GoodsManager;
+import net.lab1024.sa.common.common.code.UserErrorCode;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import net.lab1024.sa.common.module.support.datatracer.constant.DataTracerTypeEnum;
+import net.lab1024.sa.common.module.support.datatracer.service.DataTracerService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 商品
+ *
+ * @Author 1024创新实验室: 胡克
+ * @Date 2021-10-25 20:26:54
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Service
+public class GoodsService {
+ @Autowired
+ private GoodsDao goodsDao;
+
+ @Autowired
+ private CategoryQueryService categoryQueryService;
+
+ @Autowired
+ private DataTracerService dataTracerService;
+
+ /**
+ * 添加商品
+ *
+ * @param addForm
+ * @return
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseDTO add(GoodsAddForm addForm) {
+ // 商品校验
+ ResponseDTO res = this.checkGoods(addForm, null);
+ if (!res.getOk()) {
+ return res;
+ }
+ GoodsEntity goodsEntity = SmartBeanUtil.copy(addForm, GoodsEntity.class);
+ goodsEntity.setDeletedFlag(Boolean.FALSE);
+ goodsDao.insert(goodsEntity);
+ dataTracerService.insert(goodsEntity.getGoodsId(), DataTracerTypeEnum.GOODS);
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 更新商品
+ *
+ * @param updateForm
+ * @return
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseDTO update(GoodsUpdateForm updateForm) {
+ // 商品校验
+ ResponseDTO res = this.checkGoods(updateForm, updateForm.getGoodsId());
+ if (!res.getOk()) {
+ return res;
+ }
+ GoodsEntity originEntity = goodsDao.selectById(updateForm.getGoodsId());
+ GoodsEntity goodsEntity = SmartBeanUtil.copy(updateForm, GoodsEntity.class);
+ goodsDao.updateById(goodsEntity);
+ dataTracerService.update(updateForm.getGoodsId(), DataTracerTypeEnum.GOODS, originEntity, goodsEntity);
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 添加/更新 商品校验
+ *
+ * @param addForm
+ * @param goodsId 不为空 代表更新商品
+ * @return
+ */
+ private ResponseDTO checkGoods(GoodsAddForm addForm, Long goodsId) {
+ // 校验类目id
+ Long categoryId = addForm.getCategoryId();
+ Optional optional = categoryQueryService.queryCategory(categoryId);
+ if (!optional.isPresent() || !CategoryTypeEnum.GOODS.equalsValue(optional.get().getCategoryType())) {
+ return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST, "商品类目不存在~");
+ }
+
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 删除
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseDTO delete(Long goodsId) {
+ GoodsEntity goodsEntity = goodsDao.selectById(goodsId);
+ if (goodsEntity == null) {
+ return ResponseDTO.userErrorParam("商品不存在");
+ }
+
+ if (!goodsEntity.getGoodsStatus().equals(GoodsStatusEnum.SELL_OUT.getValue())) {
+ return ResponseDTO.userErrorParam("只有售罄的商品才可以删除");
+ }
+
+ batchDelete(Arrays.asList(goodsId));
+ dataTracerService.batchDelete(Arrays.asList(goodsId), DataTracerTypeEnum.GOODS);
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 批量删除
+ */
+ public ResponseDTO batchDelete(List goodsIdList) {
+ if (CollectionUtils.isEmpty(goodsIdList)) {
+ return ResponseDTO.ok();
+ }
+
+ goodsDao.batchUpdateDeleted(goodsIdList, Boolean.TRUE);
+ return ResponseDTO.ok();
+ }
+
+
+ /**
+ * 分页查询
+ *
+ * @param queryForm
+ * @return
+ */
+ public ResponseDTO> query(GoodsQueryForm queryForm) {
+ queryForm.setDeletedFlag(false);
+ Page> page = SmartPageUtil.convert2PageQuery(queryForm);
+ List list = goodsDao.query(page, queryForm);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, list);
+ if (pageResult.getEmptyFlag()) {
+ return ResponseDTO.ok(pageResult);
+ }
+ // 查询分类名称
+ List categoryIdList = list.stream().map(GoodsVO::getCategoryId).distinct().collect(Collectors.toList());
+ Map categoryMap = categoryQueryService.queryCategoryList(categoryIdList);
+ list.forEach(e -> {
+ CategoryEntity categoryEntity = categoryMap.get(e.getCategoryId());
+ if (categoryEntity != null) {
+ e.setCategoryName(categoryEntity.getCategoryName());
+ }
+ });
+ return ResponseDTO.ok(pageResult);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankController.java
new file mode 100644
index 0000000..b4afd17
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankController.java
@@ -0,0 +1,74 @@
+package net.lab1024.sa.admin.module.business.oa.bank;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankCreateForm;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankQueryForm;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankUpdateForm;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankVO;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * OA办公-OA银行信息
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@RestController
+//@Api(tags = {AdminSwaggerTagConst.Business.OA_BANK})
+public class BankController {
+
+ @Autowired
+ private BankService bankService;
+
+ @ApiOperation(value = "分页查询银行信息 @author 善逸")
+ @PostMapping("/oa/bank/page/query")
+ public ResponseDTO> queryByPage(@RequestBody @Valid BankQueryForm queryDTO) {
+ return bankService.queryByPage(queryDTO);
+ }
+
+ @ApiOperation(value = "根据企业ID查询银行信息列表 @author 善逸")
+ @GetMapping("/oa/bank/query/list/{enterpriseId}")
+ public ResponseDTO> queryList(@PathVariable Long enterpriseId) {
+ return bankService.queryList(enterpriseId);
+ }
+
+ @ApiOperation(value = "查询银行信息详情 @author 善逸")
+ @GetMapping("/oa/bank/get/{bankId}")
+ public ResponseDTO getDetail(@PathVariable Long bankId) {
+ return bankService.getDetail(bankId);
+ }
+
+ @ApiOperation(value = "新建银行信息 @author 善逸")
+ @PostMapping("/oa/bank/create")
+ public ResponseDTO createBank(@RequestBody @Valid BankCreateForm createVO) {
+ RequestUser requestUser = SmartRequestUtil.getRequestUser();
+ createVO.setCreateUserId(requestUser.getUserId());
+ createVO.setCreateUserName(requestUser.getUserName());
+ return bankService.createBank(createVO);
+ }
+
+ @ApiOperation(value = "编辑银行信息 @author 善逸")
+ @PostMapping("/oa/bank/update")
+ public ResponseDTO updateBank(@RequestBody @Valid BankUpdateForm updateVO) {
+ return bankService.updateBank(updateVO);
+ }
+
+ @ApiOperation(value = "删除银行信息 @author 善逸")
+ @GetMapping("/oa/bank/delete/{bankId}")
+ public ResponseDTO deleteBank(@PathVariable Long bankId) {
+ return bankService.deleteBank(bankId);
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankDao.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankDao.java
new file mode 100644
index 0000000..a45d406
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankDao.java
@@ -0,0 +1,61 @@
+package net.lab1024.sa.admin.module.business.oa.bank;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankEntity;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankQueryForm;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.BankVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * OA办公-OA银行信息
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Mapper
+@Component
+public interface BankDao extends BaseMapper {
+
+ /**
+ * 根据账号查询
+ * @param enterpriseId
+ * @param accountNumber
+ * @param excludeBankId
+ * @param deletedFlag
+ * @return
+ */
+ BankEntity queryByAccountNumber(@Param("enterpriseId") Long enterpriseId, @Param("accountNumber") String accountNumber, @Param("excludeBankId") Long excludeBankId, @Param("deletedFlag") Boolean deletedFlag);
+
+ /**
+ * 删除银行信息
+ *
+ * @param bankId
+ * @param deletedFlag
+ */
+ void deleteBank(@Param("bankId") Long bankId, @Param("deletedFlag") Boolean deletedFlag);
+
+ /**
+ * 银行信息分页查询
+ *
+ * @param page
+ * @param queryForm
+ * @return
+ */
+ List queryPage(Page page, @Param("queryForm") BankQueryForm queryForm);
+
+ /**
+ * 查询银行信息详情
+ * @param bankId
+ * @param deletedFlag
+ * @return
+ */
+ BankVO getDetail(@Param("bankId") Long bankId, @Param("deletedFlag") Boolean deletedFlag);
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankService.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankService.java
new file mode 100644
index 0000000..48c120b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/BankService.java
@@ -0,0 +1,162 @@
+package net.lab1024.sa.admin.module.business.oa.bank;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.admin.module.business.oa.bank.domain.*;
+import net.lab1024.sa.admin.module.business.oa.enterprise.dao.EnterpriseDao;
+import net.lab1024.sa.admin.module.business.oa.enterprise.domain.entity.EnterpriseEntity;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartBeanUtil;
+import net.lab1024.sa.common.common.util.SmartPageUtil;
+import net.lab1024.sa.common.module.support.datatracer.constant.DataTracerConst;
+import net.lab1024.sa.common.module.support.datatracer.constant.DataTracerTypeEnum;
+import net.lab1024.sa.common.module.support.datatracer.service.DataTracerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * OA办公-OA银行信息
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Service
+@Slf4j
+public class BankService {
+
+ @Autowired
+ private BankDao bankDao;
+ @Autowired
+ private EnterpriseDao enterpriseDao;
+
+ @Autowired
+ private DataTracerService dataTracerService;
+
+ /**
+ * 分页查询银行信息
+ *
+ * @param queryDTO
+ * @return
+ */
+ public ResponseDTO> queryByPage(BankQueryForm queryDTO) {
+ queryDTO.setDeletedFlag(Boolean.FALSE);
+ Page> page = SmartPageUtil.convert2PageQuery(queryDTO);
+ List bankVOS = bankDao.queryPage(page, queryDTO);
+ PageResult pageResult = SmartPageUtil.convert2PageResult(page, bankVOS);
+ return ResponseDTO.ok(pageResult);
+ }
+
+ /**
+ * 根据企业ID查询不分页的银行列表
+ *
+ * @param enterpriseId
+ * @return
+ */
+ public ResponseDTO> queryList(Long enterpriseId) {
+ BankQueryForm queryDTO = new BankQueryForm();
+ queryDTO.setEnterpriseId(enterpriseId);
+ queryDTO.setDeletedFlag(Boolean.FALSE);
+ List bankVOS = bankDao.queryPage(null, queryDTO);
+ return ResponseDTO.ok(bankVOS);
+ }
+
+ /**
+ * 查询银行信息详情
+ *
+ * @param bankId
+ * @return
+ */
+ public ResponseDTO getDetail(Long bankId) {
+ // 校验银行信息是否存在
+ BankVO bankVO = bankDao.getDetail(bankId, Boolean.FALSE);
+ if (Objects.isNull(bankVO)) {
+ return ResponseDTO.userErrorParam("银行信息不存在");
+ }
+ return ResponseDTO.ok(bankVO);
+ }
+
+ /**
+ * 新建银行信息
+ *
+ * @param createVO
+ * @return
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseDTO createBank(BankCreateForm createVO) {
+ Long enterpriseId = createVO.getEnterpriseId();
+ // 校验企业是否存在
+ EnterpriseEntity enterpriseDetail = enterpriseDao.selectById(enterpriseId);
+ if (Objects.isNull(enterpriseDetail) || enterpriseDetail.getDeletedFlag()) {
+ return ResponseDTO.userErrorParam("企业不存在");
+ }
+ // 验证银行信息账号是否重复
+ BankEntity validateBank = bankDao.queryByAccountNumber(enterpriseId, createVO.getAccountNumber(), null, Boolean.FALSE);
+ if (Objects.nonNull(validateBank)) {
+ return ResponseDTO.userErrorParam("银行信息账号重复");
+ }
+ // 数据插入
+ BankEntity insertBank = SmartBeanUtil.copy(createVO, BankEntity.class);
+ bankDao.insert(insertBank);
+ dataTracerService.addTrace(enterpriseId, DataTracerTypeEnum.OA_ENTERPRISE, "新增银行:" + DataTracerConst.HTML_BR + dataTracerService.getChangeContent(insertBank));
+ return ResponseDTO.ok();
+ }
+
+ /**
+ * 编辑银行信息
+ *
+ * @param updateVO
+ * @return
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseDTO updateBank(BankUpdateForm updateVO) {
+ Long enterpriseId = updateVO.getEnterpriseId();
+ // 校验企业是否存在
+ EnterpriseEntity enterpriseDetail = enterpriseDao.selectById(enterpriseId);
+ if (Objects.isNull(enterpriseDetail) || enterpriseDetail.getDeletedFlag()) {
+ return ResponseDTO.userErrorParam("企业不存在");
+ }
+ Long bankId = updateVO.getBankId();
+ // 校验银行信息是否存在
+ BankEntity bankDetail = bankDao.selectById(bankId);
+ if (Objects.isNull(bankDetail) || bankDetail.getDeletedFlag()) {
+ return ResponseDTO.userErrorParam("银行信息不存在");
+ }
+ // 验证银行信息账号是否重复
+ BankEntity validateBank = bankDao.queryByAccountNumber(updateVO.getEnterpriseId(), updateVO.getAccountNumber(), bankId, Boolean.FALSE);
+ if (Objects.nonNull(validateBank)) {
+ return ResponseDTO.userErrorParam("银行信息账号重复");
+ }
+ // 数据编辑
+ BankEntity updateBank = SmartBeanUtil.copy(updateVO, BankEntity.class);
+ bankDao.updateById(updateBank);
+ dataTracerService.addTrace(enterpriseId, DataTracerTypeEnum.OA_ENTERPRISE, "更新银行:" + DataTracerConst.HTML_BR + dataTracerService.getChangeContent(bankDetail, updateBank));
+ return ResponseDTO.ok();
+ }
+
+
+ /**
+ * 删除银行信息
+ *
+ * @param bankId
+ * @return
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseDTO deleteBank(Long bankId) {
+ // 校验银行信息是否存在
+ BankEntity bankDetail = bankDao.selectById(bankId);
+ if (Objects.isNull(bankDetail) || bankDetail.getDeletedFlag()) {
+ return ResponseDTO.userErrorParam("银行信息不存在");
+ }
+ bankDao.deleteBank(bankId, Boolean.TRUE);
+ dataTracerService.addTrace(bankDetail.getEnterpriseId(), DataTracerTypeEnum.OA_ENTERPRISE, "删除银行:" + DataTracerConst.HTML_BR + dataTracerService.getChangeContent(bankDetail));
+ return ResponseDTO.ok();
+ }
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankCreateForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankCreateForm.java
new file mode 100644
index 0000000..031ceb7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankCreateForm.java
@@ -0,0 +1,58 @@
+package net.lab1024.sa.admin.module.business.oa.bank.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * OA办公-银行信息新建
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class BankCreateForm {
+
+ @ApiModelProperty("开户银行")
+ @NotBlank(message = "开户银行不能为空")
+ @Length(max = 200, message = "开户银行最多200字符")
+ private String bankName;
+
+ @ApiModelProperty("账户名称")
+ @NotBlank(message = "账户名称不能为空")
+ @Length(max = 200, message = "账户名称最多200字符")
+ private String accountName;
+
+ @ApiModelProperty("账号")
+ @NotBlank(message = "账号不能为空")
+ @Length(max = 200, message = "账号最多200字符")
+ private String accountNumber;
+
+ @ApiModelProperty("备注")
+ @Length(max = 500, message = "备注最多500字符")
+ private String remark;
+
+ @ApiModelProperty("是否对公")
+ @NotNull(message = "是否对公不能为空")
+ private Boolean businessFlag;
+
+ @ApiModelProperty("企业")
+ @NotNull(message = "企业不能为空")
+ private Long enterpriseId;
+
+ @ApiModelProperty("禁用状态")
+ @NotNull(message = "禁用状态不能为空")
+ private Boolean disabledFlag;
+
+ @ApiModelProperty(value = "创建人", hidden = true)
+ private Long createUserId;
+
+ @ApiModelProperty(value = "创建人", hidden = true)
+ private String createUserName;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankEntity.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankEntity.java
new file mode 100644
index 0000000..0b3ec08
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankEntity.java
@@ -0,0 +1,95 @@
+package net.lab1024.sa.admin.module.business.oa.bank.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import net.lab1024.sa.common.module.support.datatracer.annoation.DataTracerFieldLabel;
+
+import java.time.LocalDateTime;
+
+/**
+ * OA办公-OA银行信息
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+@TableName("t_oa_bank")
+public class BankEntity {
+
+ /**
+ * 银行信息ID
+ */
+ @TableId(type = IdType.AUTO)
+ @DataTracerFieldLabel("银行信息ID")
+ private Long bankId;
+
+ /**
+ * 开户银行
+ */
+ @DataTracerFieldLabel("开户银行")
+ private String bankName;
+
+ /**
+ * 账户名称
+ */
+ @DataTracerFieldLabel("账户名称")
+ private String accountName;
+
+ /**
+ * 账号
+ */
+ @DataTracerFieldLabel("账号")
+ private String accountNumber;
+
+ /**
+ * 备注
+ */
+ @DataTracerFieldLabel("备注")
+ private String remark;
+
+ /**
+ * 是否对公
+ */
+ @DataTracerFieldLabel("是否对公")
+ private Boolean businessFlag;
+
+ /**
+ * 企业ID
+ */
+ private Long enterpriseId;
+
+ /**
+ * 禁用状态
+ */
+ @DataTracerFieldLabel("禁用状态")
+ private Boolean disabledFlag;
+
+ /**
+ * 删除状态
+ */
+ private Boolean deletedFlag;
+
+ /**
+ * 创建人ID
+ */
+ private Long createUserId;
+
+ /**
+ * 创建人ID
+ */
+ private String createUserName;
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankQueryForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankQueryForm.java
new file mode 100644
index 0000000..839b02f
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankQueryForm.java
@@ -0,0 +1,40 @@
+package net.lab1024.sa.admin.module.business.oa.bank.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.lab1024.sa.common.common.domain.PageParam;
+import org.hibernate.validator.constraints.Length;
+
+import java.time.LocalDate;
+
+/**
+ * OA办公-OA银行信息查询
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class BankQueryForm extends PageParam {
+
+ @ApiModelProperty("企业ID")
+ private Long enterpriseId;
+
+ @ApiModelProperty("关键字")
+ @Length(max = 200, message = "关键字最多200字符")
+ private String keywords;
+
+ @ApiModelProperty("开始时间")
+ private LocalDate startTime;
+
+ @ApiModelProperty("结束时间")
+ private LocalDate endTime;
+
+ @ApiModelProperty("禁用状态")
+ private Boolean disabledFlag;
+
+ @ApiModelProperty(value = "删除状态", hidden = true)
+ private Boolean deletedFlag;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankUpdateForm.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankUpdateForm.java
new file mode 100644
index 0000000..db8a2c7
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankUpdateForm.java
@@ -0,0 +1,23 @@
+package net.lab1024.sa.admin.module.business.oa.bank.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * OA办公-银行信息更新
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class BankUpdateForm extends BankCreateForm {
+
+ @ApiModelProperty("银行信息ID")
+ @NotNull(message = "银行信息ID不能为空")
+ private Long bankId;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankVO.java
new file mode 100644
index 0000000..5cfcb5b
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/bank/domain/BankVO.java
@@ -0,0 +1,58 @@
+package net.lab1024.sa.admin.module.business.oa.bank.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * OA办公-OA银行信息
+ *
+ * @Author 1024创新实验室:善逸
+ * @Date 2022/6/23 21:59:22
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Data
+public class BankVO {
+
+ @ApiModelProperty("银行信息ID")
+ private Long bankId;
+
+ @ApiModelProperty("开户银行")
+ private String bankName;
+
+ @ApiModelProperty("账户名称")
+ private String accountName;
+
+ @ApiModelProperty("账号")
+ private String accountNumber;
+
+ @ApiModelProperty("备注")
+ private String remark;
+
+ @ApiModelProperty("是否对公")
+ private Boolean businessFlag;
+
+ @ApiModelProperty("企业ID")
+ private Long enterpriseId;
+
+ @ApiModelProperty("企业名称")
+ private String enterpriseName;
+
+ @ApiModelProperty("禁用状态")
+ private Boolean disabledFlag;
+
+ @ApiModelProperty("创建人ID")
+ private Long createUserId;
+
+ @ApiModelProperty("创建人名称")
+ private String createUserName;
+
+ @ApiModelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("更新时间")
+ private LocalDateTime updateTime;
+}
diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java
new file mode 100644
index 0000000..76eccb4
--- /dev/null
+++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java
@@ -0,0 +1,115 @@
+package net.lab1024.sa.admin.module.business.oa.enterprise;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import net.lab1024.sa.admin.constant.AdminSwaggerTagConst;
+import net.lab1024.sa.admin.module.business.oa.enterprise.domain.form.*;
+import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseEmployeeVO;
+import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseListVO;
+import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseVO;
+import net.lab1024.sa.common.common.annoation.SaAuth;
+import net.lab1024.sa.common.common.domain.PageResult;
+import net.lab1024.sa.common.common.domain.RequestUser;
+import net.lab1024.sa.common.common.domain.ResponseDTO;
+import net.lab1024.sa.common.common.util.SmartRequestUtil;
+import net.lab1024.sa.common.module.support.operatelog.annoation.OperateLog;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 企业
+ *
+ * @Author 1024创新实验室: 开云
+ * @Date 2022/7/28 20:37:15
+ * @Wechat zhuoda1024
+ * @Email lab1024@163.com
+ * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022
+ */
+@Slf4j
+@RestController
+@OperateLog
+//@Api(tags = {AdminSwaggerTagConst.Business.OA_ENTERPRISE})
+public class EnterpriseController {
+
+ @Autowired
+ private EnterpriseService enterpriseService;
+
+ @ApiOperation(value = "分页查询企业模块 @author 开云")
+ @PostMapping("/oa/enterprise/page/query")
+ @SaAuth
+ public ResponseDTO> queryByPage(@RequestBody @Valid EnterpriseQueryForm queryDTO) {
+ return enterpriseService.queryByPage(queryDTO);
+ }
+
+ @ApiOperation(value = "查询企业详情 @author 开云")
+ @GetMapping("/oa/enterprise/get/{enterpriseId}")
+ @SaAuth
+ public ResponseDTO getDetail(@PathVariable Long enterpriseId) {
+ return ResponseDTO.ok(enterpriseService.getDetail(enterpriseId));
+ }
+
+ @ApiOperation(value = "新建企业 @author 开云")
+ @PostMapping("/oa/enterprise/create")
+ @SaAuth
+ public ResponseDTO createEnterprise(@RequestBody @Valid EnterpriseCreateForm createVO) {
+ RequestUser requestUser = SmartRequestUtil.getRequestUser();
+ createVO.setCreateUserId(requestUser.getUserId());
+ createVO.setCreateUserName(requestUser.getUserName());
+ return enterpriseService.createEnterprise(createVO);
+ }
+
+ @ApiOperation(value = "编辑企业 @author 开云")
+ @PostMapping("/oa/enterprise/update")
+ @SaAuth
+ public ResponseDTO updateEnterprise(@RequestBody @Valid EnterpriseUpdateForm updateVO) {
+ return enterpriseService.updateEnterprise(updateVO);
+ }
+
+ @ApiOperation(value = "删除企业 @author 开云")
+ @GetMapping("/oa/enterprise/delete/{enterpriseId}")
+ @SaAuth
+ public ResponseDTO deleteEnterprise(@PathVariable Long enterpriseId) {
+ return enterpriseService.deleteEnterprise(enterpriseId);
+ }
+
+ @ApiOperation(value = "企业列表查询 @author 开云")
+ @GetMapping("/oa/enterprise/query/list")
+ @SaAuth
+ public ResponseDTO> queryList(@RequestParam(value = "type", required = false) Integer type) {
+ return enterpriseService.queryList(type);
+ }
+
+
+ @ApiOperation(value = "企业添加员工 @author 罗伊")
+ @PostMapping("/oa/enterprise/employee/add")
+ @SaAuth
+ public ResponseDTO addEmployee(@RequestBody @Valid EnterpriseEmployeeForm enterpriseEmployeeForm) {
+ return enterpriseService.addEmployee(enterpriseEmployeeForm);
+ }
+
+ @ApiOperation(value = "查询企业全部员工 @author 罗伊")
+ @PostMapping("/oa/enterprise/employee/list")
+ @SaAuth
+ public ResponseDTO> employeeList(@RequestBody @Valid List enterpriseIdList) {
+ return ResponseDTO.ok(enterpriseService.employeeList(enterpriseIdList));
+ }
+
+ @ApiOperation(value = "分页查询企业员工 @author 卓大")
+ @PostMapping("/oa/enterprise/employee/queryPage")
+ @SaAuth
+ public ResponseDTO> queryPageEmployeeList(@RequestBody @Valid EnterpriseEmployeeQueryForm queryForm) {
+ return ResponseDTO.ok(enterpriseService.queryPageEmployeeList(queryForm));
+ }
+
+
+ @ApiOperation(value = "企业删除员工 @author 罗伊")
+ @PostMapping("/oa/enterprise/employee/delete")
+ @SaAuth
+ public ResponseDTO