From 9552df0290118ebea2b840795fe3874be036841c Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期一, 07 四月 2025 09:07:19 +0800
Subject: [PATCH] 代码初始化

---
 server/src/main/java/com/doumee/dao/system/dto/CreateSystemUserDTO.java                                |    2 
 server/src/main/java/com/doumee/config/shiro/ShiroRealm.java                                           |    2 
 server/src/main/java/com/doumee/dao/system/vo/SystemJobListVO.java                                     |    2 
 server/src/main/java/com/doumee/service/system/SystemPermissionService.java                            |    2 
 server/src/main/java/com/doumee/service/system/SystemTraceLogService.java                              |    2 
 .idea/libraries/Maven__com_google_guava_guava_27_0_1_android.xml                                       |   13 
 server/src/main/java/com/doumee/dao/system/model/SystemRole.java                                       |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java          |   28 
 admin/src/api/business/multifile.js                                                                    |   40 
 admin/src/components/system/dict/OperaDictDataWindow.vue                                               |   45 
 server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptor.java                            |    4 
 server/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java               |    2 
 server/src/main/java/com/doumee/core/annotation/trace/Trace.java                                       |    2 
 server/src/main/java/com/doumee/core/job/JobParam.java                                                 |    2 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemUserDTO.java                                 |    2 
 server/src/main/java/com/doumee/core/exception/BusinessException.java                                  |    2 
 server/src/main/java/com/doumee/core/model/LoginUserInfo.java                                          |    2 
 server/src/main/java/com/doumee/service/system/impl/SystemRoleMenuServiceImpl.java                     |    2 
 admin/src/views/business/workorder.vue                                                                 |  266 
 server/src/main/java/com/doumee/service/common/CacheProxy.java                                         |    2 
 server/src/main/java/com/doumee/biz/system/dto/TriggerJobDTO.java                                      |    2 
 server/src/main/java/com/doumee/dao/system/dto/CreateRolePermissionDTO.java                            |    2 
 server/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java                              |    2 
 .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_ui_3_0_3.xml                                 |   13 
 admin/src/filters/index.js                                                                             |    6 
 .idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml                                           |   13 
 server/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java                          |    2 
 .idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml                                    |   13 
 server/src/main/java/com/doumee/core/job/JobContext.java                                               |    2 
 .idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml                                         |   13 
 admin/package.json                                                                                     |    2 
 server/src/main/java/com/doumee/dao/business/vo/CompanyTest.java                                       |    4 
 server/src/main/java/com/doumee/service/system/impl/SystemRoleServiceImpl.java                         |    2 
 admin/src/views/business/category.vue                                                                  |  151 
 admin/src/views/business/member.vue                                                                    |  181 
 admin/src/components/common/UploadImage.vue                                                            |  155 
 .idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml                                       |   13 
 admin/src/api/business/notices.js                                                                      |   40 
 admin/src/components/business/OperaMemberWindow.vue                                                    |  118 
 server/src/main/java/com/doumee/biz/system/SystemJobBiz.java                                           |    2 
 server/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java                     |   12 
 server/src/main/java/com/doumee/service/system/impl/SystemUserRoleServiceImpl.java                     |    2 
 server/src/main/java/com/doumee/dao/business/model/Workorder.java                                      |  201 
 server/src/main/java/com/doumee/service/business/impl/WorkorderLogServiceImpl.java                     |  129 
 .idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml                                 |   13 
 server/src/main/java/com/doumee/config/shiro/ShiroCache.java                                           |    2 
 server/src/main/java/com/doumee/service/business/impl/MultifileServiceImpl.java                        |  125 
 .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_starter_3_0_3.xml                       |   13 
 server/src/main/java/com/doumee/api/system/SystemJobController.java                                    |    2 
 server/src/main/java/com/doumee/job/UpdateQywxTokenJob.java                                            |   33 
 .idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_autoconfigure_2_1_0.xml            |   13 
 server/src/main/java/com/doumee/service/business/NoticesService.java                                   |   97 
 server/src/main/java/com/doumee/core/utils/Monitor.java                                                |    2 
 .idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_10_2.xml             |   13 
 server/src/main/java/com/doumee/dao/system/model/SystemMenu.java                                       |    2 
 server/src/main/java/com/doumee/dao/system/model/SystemRoleMenu.java                                   |    2 
 server/src/main/java/com/doumee/core/annotation/trace/TraceType.java                                   |    2 
 server/src/main/java/com/doumee/dao/system/vo/SystemDictDataListVO.java                                |    2 
 server/src/main/java/com/doumee/service/system/impl/SystemJobServiceImpl.java                          |    2 
 admin/src/components/business/OperaManagersWindow.vue                                                  |   86 
 server/src/main/java/com/doumee/biz/system/SystemMenuBiz.java                                          |    2 
 server/src/main/java/com/doumee/core/utils/HttpsUtil.java                                              |  217 
 server/src/main/java/com/doumee/api/business/MemberController.java                                     |   92 
 server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java                         |    2 
 server/src/main/java/com/doumee/service/business/WorkorderLogService.java                              |   97 
 admin/src/utils/request/index.js                                                                       |    8 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemRoleDTO.java                                 |    2 
 server/src/main/java/com/doumee/core/utils/UserClient.java                                             |    4 
 .idea/libraries/Maven__com_baomidou_mybatis_plus_spring_boot_autoconfigure_3_5_7.xml                   |   13 
 admin/src/plugins/download.js                                                                          |    4 
 server/src/main/java/com/doumee/api/common/CaptchaController.java                                      |    2 
 server/src/main/java/com/doumee/dao/business/model/Notices.java                                        |  130 
 admin/src/components/business/OperaCompanyWindow.vue                                                   |  102 
 server/src/main/java/com/doumee/config/quartz/SnippetScannerConfig.java                                |    2 
 server/src/main/java/com/doumee/job/CommonTestJob.java                                                 |    2 
 server/src/main/java/com/doumee/core/utils/DateHelper.java                                             |    2 
 .idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml                 |   13 
 admin/src/components/common/UploadAvatarImage.vue                                                      |  141 
 admin/src/views/business/multifile.vue                                                                 |  146 
 server/src/main/java/com/doumee/dao/system/model/SystemJob.java                                        |    4 
 server/src/main/java/com/doumee/service/system/impl/SystemJobSnippetServiceImpl.java                   |    2 
 server/src/main/java/com/doumee/api/system/SystemLoginLogController.java                               |    2 
 server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java                           |    2 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobListDTO.java                              |    2 
 .idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml                                |   13 
 server/src/main/java/com/doumee/dao/business/model/Company.java                                        |  116 
 server/src/main/java/com/doumee/service/business/impl/ManagersServiceImpl.java                         |  123 
 server/src/main/resources/mappers/SystemDictDataMapper.xml                                             |    2 
 .idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml                                  |   13 
 server/src/main/java/com/doumee/biz/system/impl/SystemJobTriggerBizImpl.java                           |    2 
 server/src/main/java/com/doumee/service/system/SystemLoginLogService.java                              |    2 
 server/src/main/java/com/doumee/dao/business/model/Member.java                                         |  127 
 server/src/main/java/com/doumee/config/quartz/JobHandler.java                                          |    2 
 server/src/main/java/com/doumee/dao/business/vo/CompanyTree.java                                       |  105 
 server/src/main/java/com/doumee/service/system/impl/SystemJobLogServiceImpl.java                       |    2 
 server/src/main/java/com/doumee/service/system/SystemJobService.java                                   |    2 
 server/src/main/java/com/doumee/dao/system/vo/SystemDictListVO.java                                    |    2 
 server/src/main/java/com/doumee/dao/business/CompanyMemberMapper.java                                  |   12 
 admin/src/components/system/dict/DictDataManagerWindow.vue                                             |   33 
 server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java          |    2 
 server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatAdapter.java                           |    2 
 .idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_starter_2_1_0.xml                  |   13 
 server/src/main/java/com/doumee/dao/business/NoticesMapper.java                                        |   12 
 .idea/encodings.xml                                                                                    |    1 
 server/src/main/java/com/doumee/api/business/CompanyMemberController.java                              |   85 
 .idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml                                   |   13 
 admin/package-lock.json                                                                                |  378 +
 server/src/main/java/com/doumee/job/DistributableTestJob.java                                          |    2 
 admin/src/api/business/category.js                                                                     |   40 
 admin/src/views/business/companyMember.vue                                                             |  181 
 .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_autoconfigure_3_0_3.xml                 |   13 
 server/db/business.workorder_log.permissions.sql                                                       |    6 
 server/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java                                      |    2 
 server/src/main/java/com/doumee/api/system/SystemMonitorController.java                                |    2 
 server/src/main/java/com/doumee/core/utils/monitor/JVM.java                                            |    2 
 admin/src/api/business/member.js                                                                       |   43 
 admin/src/components/common/UploadFile.vue                                                             |  123 
 server/src/main/java/com/doumee/biz/system/impl/SystemJobBizImpl.java                                  |    2 
 .idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_5_7.xml                                        |   13 
 .idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_5_7.xml                                   |   13 
 admin/src/components/common/Tree.vue                                                                   |  154 
 server/src/main/java/com/doumee/biz/system/SystemPermissionBiz.java                                    |    2 
 admin/src/components/common/UploadFileCommon.vue                                                       |  150 
 server/src/main/java/com/doumee/service/system/SystemUserService.java                                  |    2 
 server/src/main/java/com/doumee/biz/system/SystemRoleBiz.java                                          |    2 
 server/src/main/java/com/doumee/dao/system/model/SystemRolePermission.java                             |    2 
 .idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml                                            |   13 
 server/src/main/java/com/doumee/config/shiro/ShiroConfig.java                                          |    2 
 .idea/libraries/Maven__io_swagger_swagger_core_1_5_22.xml                                              |   13 
 server/src/main/java/com/doumee/core/servlet/ServletDuplicateOutputStream.java                         |    2 
 server/src/main/java/com/doumee/core/servlet/ServletDuplicateInputStream.java                          |    2 
 server/src/main/java/com/doumee/dao/system/model/SystemJobSnippet.java                                 |    4 
 admin/src/views/index.vue                                                                              |   18 
 server/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java                         |    2 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDTO.java                                 |    2 
 server/src/main/java/com/doumee/api/business/MultifileController.java                                  |   85 
 server/src/main/java/com/doumee/service/system/SystemLoginService.java                                 |    2 
 server/db/business.multifile.permissions.sql                                                           |    6 
 server/src/main/java/com/doumee/api/system/SystemDictDataController.java                               |    2 
 server/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java                                 |    2 
 admin/src/components/business/OperaNoticesWindow.vue                                                   |  138 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemPermissionDTO.java                           |    2 
 .idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml             |   13 
 server/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java                             |  134 
 server/src/main/java/com/doumee/dao/system/model/SystemDict.java                                       |    2 
 server/src/main/java/com/doumee/service/business/MultifileService.java                                 |   97 
 admin/src/layouts/TableLayout1.vue                                                                     |  175 
 admin/src/api/business/workorder.js                                                                    |   40 
 server/src/main/java/com/doumee/api/system/SystemPermissionController.java                             |    2 
 server/src/main/java/com/doumee/core/utils/monitor/Disk.java                                           |    2 
 .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_annotation_1_4_2_2.xml                   |   13 
 .idea/libraries/Maven__org_mybatis_mybatis_3_5_16.xml                                                  |   13 
 server/src/main/java/com/doumee/api/common/LocalFileAccessController.java                              |    4 
 server/src/main/java/com/doumee/api/business/NoticesController.java                                    |   85 
 server/src/main/java/com/doumee/biz/system/SystemDictBiz.java                                          |    2 
 .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_3_2.xml             |   13 
 server/src/main/java/com/doumee/dao/system/model/SystemPermission.java                                 |    2 
 server/src/main/java/com/doumee/api/system/SystemUserController.java                                   |    2 
 admin/src/components/common/upload.vue                                                                 |  146 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java       |   29 
 server/src/main/java/com/doumee/service/system/SystemJobListService.java                               |    2 
 server/src/main/java/com/doumee/api/system/SystemJobLogController.java                                 |    2 
 .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_3_2.xml                   |   13 
 server/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java                               |    2 
 .idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml                                            |   13 
 server/src/main/java/com/doumee/core/utils/Utils.java                                                  |    2 
 server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java(2)                        |    2 
 admin/src/components/business/OperaWorkorderWindow.vue                                                 |  186 
 server/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java                                      |    2 
 server/src/main/java/com/doumee/service/system/impl/SystemMenuServiceImpl.java                         |    4 
 server/src/main/java/com/doumee/config/mybatis/MyBatisPlusConfig.java                                  |    2 
 server/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java                                    |    2 
 server/src/main/java/com/doumee/service/business/MemberService.java                                    |   99 
 server/src/main/java/com/doumee/api/system/SystemJobSnippetController.java                             |    2 
 server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptor.java                       |    2 
 server/src/main/java/com/doumee/core/model/PageWrap.java                                               |    2 
 .idea/libraries/Maven__com_github_pagehelper_pagehelper_6_1_0.xml                                      |   13 
 server/src/main/java/com/doumee/api/business/WorkorderController.java                                  |   85 
 server/src/main/java/com/doumee/config/cache/RedisConfig.java                                          |    2 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobLogDTO.java                               |    4 
 .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_boot_starter_1_4_2_2.xml                 |   13 
 server/src/main/java/com/doumee/config/quartz/SnippetScanner.java                                      |    2 
 server/src/main/java/com/doumee/service/system/SystemRolePermissionService.java                        |    2 
 server/src/main/java/com/doumee/core/constants/ResponseStatus.java                                     |    2 
 .idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml                                     |   13 
 server/src/main/java/com/doumee/dao/business/model/Category.java                                       |   86 
 server/src/main/java/com/doumee/dao/system/dto/ResetSystemUserPwdDTO.java                              |    2 
 .idea/libraries/Maven__com_github_xiaoymin_knife4j_annotations_3_0_3.xml                               |   13 
 .idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml                                         |   13 
 server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java(1)                        |    2 
 server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java                          |  299 +
 server/db/business.company.permissions.sql                                                             |    6 
 server/src/main/java/com/doumee/LianhelihuaApplication.java                                            |    2 
 .idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml                                      |   13 
 server/src/main/java/com/doumee/core/utils/MyBatisPlus.java                                            |    2 
 server/src/main/java/com/doumee/service/system/SystemDictService.java                                  |    2 
 .idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml                                       |   13 
 server/src/main/java/com/doumee/service/system/SystemJobSnippetService.java                            |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java                                |   27 
 server/src/main/java/com/doumee/core/servlet/ServletRewriteFilter.java                                 |    2 
 server/src/main/java/com/doumee/dao/business/MultifileMapper.java                                      |   12 
 .idea/libraries/Maven__commons_net_commons_net_3_8_0.xml                                               |   13 
 admin/src/api/business/workorderLog.js                                                                 |   40 
 admin/src/components/common/UploadAvatarVideo.vue                                                      |  128 
 server/src/main/java/com/doumee/dao/system/dto/LoginDTO.java                                           |    2 
 .idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_5.xml                                |   13 
 server/src/main/java/com/doumee/core/config/ProjectConfig.java                                         |    2 
 .idea/libraries/Maven__com_baomidou_mybatis_plus_3_5_7.xml                                             |   13 
 server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java                                 |   14 
 server/src/main/java/com/doumee/dao/system/dto/CreateUserRoleDTO.java                                  |    2 
 admin/src/plugins/messagebox.js                                                                        |    9 
 server/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java                                    |    2 
 server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java                         |  126 
 server/src/main/java/com/doumee/core/utils/monitor/Memory.java                                         |    2 
 server/src/main/java/com/doumee/dao/system/vo/SystemRoleListVO.java                                    |    2 
 admin/src/components/business/OperaMultifileWindow.vue                                                 |   90 
 admin/src/components/common/RichEditor.vue                                                             |  318 +
 server/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java                   |    2 
 server/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java                                    |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java            |   32 
 .idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml                                        |   13 
 server/db/business.notices.permissions.sql                                                             |    6 
 server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java                           |  361 +
 server/src/main/java/com/doumee/core/utils/Secure.java                                                 |    2 
 server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java                                   |    2 
 server/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java                              |    2 
 server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java                        |  157 
 admin/src/views/business/managersShe.vue                                                               |   86 
 server/src/main/java/com/doumee/api/business/CategoryController.java                                   |   85 
 server/src/main/java/com/doumee/core/job/BaseJob.java                                                  |    2 
 server/src/main/java/com/doumee/service/system/SystemRoleMenuService.java                              |    2 
 server/src/main/java/com/doumee/dao/system/dto/UpdatePwdDto.java                                       |    2 
 admin/src/views/business/workorderLog.vue                                                              |  166 
 server/src/main/java/com/doumee/api/business/WorkorderLogController.java                               |   85 
 .idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml                                     |   13 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java      |   16 
 server/src/main/java/com/doumee/dao/business/model/CompanyMember.java                                  |   73 
 server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java                                   |    6 
 server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java                           |    2 
 .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_1_4_2_2.xml                              |   13 
 server/src/main/java/com/doumee/core/exception/LockedException.java                                    |    2 
 server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptorConfig.java                 |    2 
 server/src/main/java/com/doumee/dao/system/model/SystemDictData.java                                   |    5 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemTraceLogDTO.java                             |    2 
 server/db/business.managers.permissions.sql                                                            |    6 
 server/src/main/java/com/doumee/dao/common/dto/UpdateSortDTO.java                                      |    2 
 server/src/main/java/com/doumee/core/servlet/ServletDuplicateResponseWrapper.java                      |    2 
 server/src/main/java/com/doumee/dao/business/model/Multifile.java                                      |   81 
 server/src/main/java/com/doumee/service/business/impl/NoticesServiceImpl.java                          |  137 
 server/src/main/java/com/doumee/service/system/impl/SystemLoginLogServiceImpl.java                     |    2 
 server/db/business.member.permissions.sql                                                              |    6 
 server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptorConfig.java                      |    2 
 server/db/business.category.permissions.sql                                                            |    6 
 .idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_2_0.xml                         |   13 
 .idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml                                      |   13 
 server/src/main/java/com/doumee/api/system/SystemDictController.java                                   |    2 
 server/src/main/java/com/doumee/core/servlet/ServletDuplicateRequestWrapper.java                       |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java               |   20 
 admin/src/views/business/company.vue                                                                   |  161 
 server/src/main/java/com/doumee/api/system/SystemController.java                                       |    2 
 server/src/main/java/com/doumee/core/annotation/trace/TraceStatus.java                                 |    8 
 server/src/main/java/com/doumee/service/common/CaptchaService.java                                     |    2 
 server/src/main/java/com/doumee/dao/business/WorkorderMapper.java                                      |   12 
 server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java                               |    6 
 server/src/main/java/com/doumee/core/annotation/pr/PreventRepeat.java                                  |    2 
 server/src/main/java/com/doumee/dao/business/CompanyMapper.java                                        |   13 
 server/src/main/java/com/doumee/api/business/CompanyController.java                                    |  102 
 .idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_2.xml                              |   13 
 server/src/main/java/com/doumee/api/system/SystemMenuController.java                                   |    2 
 .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_core_1_4_2_2.xml                         |   13 
 server/src/main/java/com/doumee/service/system/SystemMenuService.java                                  |    2 
 admin/src/components/business/OperaCategoryWindow.vue                                                  |   94 
 admin/src/components/common/UploadFaceImg.vue                                                          |  206 
 server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java           |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java         |   54 
 admin/src/components/business/OperaWorkorderLogWindow.vue                                              |  106 
 server/src/main/java/com/doumee/service/business/CompanyService.java                                   |  101 
 .idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_5_7.xml                                  |   13 
 admin/src/api/business/managers.js                                                                     |   40 
 server/pom.xml                                                                                         |    5 
 admin/src/views/business/managers.vue                                                                  |  141 
 server/src/main/java/com/doumee/service/system/impl/SystemDictServiceImpl.java                         |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java       |   21 
 .idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_17.xml                           |   13 
 server/src/main/java/com/doumee/api/system/SystemTraceLogController.java                               |    2 
 server/src/main/java/com/doumee/service/system/SystemDictDataService.java                              |    4 
 server/src/main/java/com/doumee/dao/system/model/SystemJobLog.java                                     |    4 
 server/src/main/java/com/doumee/core/exception/UnSafeSessionException.java                             |    2 
 server/src/main/java/com/doumee/service/system/SystemRoleService.java                                  |    2 
 server/src/main/java/com/doumee/dao/business/ManagersMapper.java                                       |   12 
 server/src/main/java/com/doumee/core/utils/Week.java                                                   |   45 
 admin/src/views/business/managersDca.vue                                                               |  141 
 server/src/main/java/com/doumee/biz/system/SystemJobSnippetTriggerBiz.java                             |    2 
 server/src/main/java/com/doumee/api/BaseController.java                                                |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java             |   32 
 server/src/main/java/com/doumee/dao/business/WorkorderLogMapper.java                                   |   12 
 server/src/main/java/com/doumee/dao/system/model/SystemUserRole.java                                   |    2 
 server/src/main/java/com/doumee/core/utils/Server.java                                                 |    2 
 server/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java                           |    2 
 server/src/main/java/com/doumee/core/constants/Constants.java                                          |   87 
 server/src/main/java/com/doumee/dao/system/model/SystemUser.java                                       |    2 
 .idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml                                 |   13 
 server/src/main/java/com/doumee/config/swagger/SwaggerConfig.java                                      |    2 
 server/src/main/java/com/doumee/core/model/PageData.java                                               |    2 
 server/src/main/java/com/doumee/dao/system/dto/CreateRoleMenuDTO.java                                  |    2 
 server/src/main/java/com/doumee/service/system/impl/SystemTraceLogServiceImpl.java                     |    2 
 server/src/main/java/com/doumee/dao/business/CategoryMapper.java                                       |   12 
 server/db/business.workorder.permissions.sql                                                           |    6 
 server/src/main/java/com/doumee/core/utils/DateUtil.java                                               | 3601 +++++++++++++
 server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java                               |    2 
 server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatDefaultHandler.java                    |    4 
 .idea/libraries/Maven__io_swagger_swagger_annotations_1_5_20.xml                                       |   13 
 server/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java                                 |    4 
 server/src/main/java/com/doumee/config/cache/RedisValueDefaultSerializer.java                          |    2 
 server/src/main/java/com/doumee/dao/system/dto/QueryJobDTO.java                                        |    2 
 server/src/main/java/com/doumee/core/utils/ThreadPool.java                                             |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java        |   22 
 server/src/main/java/com/doumee/core/utils/monitor/CPU.java                                            |    2 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java                                    |  173 
 server/src/main/java/com/doumee/dao/business/model/Managers.java                                       |   84 
 server/src/main/java/com/doumee/core/annotation/excel/ExcelDataConverterAdapter.java                   |    2 
 server/src/main/java/com/doumee/config/quartz/JobHandlerWithDisallowConcurrent.java                    |    2 
 server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java                                   |   98 
 server/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java                                    |    2 
 server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java                                       |   10 
 server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java                           |    2 
 .idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml                                 |   13 
 server/src/main/java/com/doumee/biz/system/SystemUserBiz.java                                          |    2 
 server/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java                                    |    2 
 server/src/main/java/com/doumee/service/business/CompanyMemberService.java                             |   97 
 admin/src/api/system/job.js                                                                            |    4 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java     |   25 
 .idea/libraries/Maven__org_mybatis_mybatis_spring_2_1_2.xml                                            |   13 
 server/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java                                  |    4 
 server/src/main/java/com/doumee/job/DistributableTestJobDistributer.java                               |    2 
 admin/src/api/business/company.js                                                                      |   47 
 server/src/main/java/com/doumee/core/utils/Location.java                                               |    4 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDataDTO.java                             |    2 
 .idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml |   13 
 server/src/main/java/com/doumee/dao/business/MemberMapper.java                                         |   13 
 server/src/main/java/com/doumee/core/utils/Http.java                                                   |    2 
 server/src/main/resources/application-dev.yml                                                          |    5 
 server/src/main/java/com/doumee/service/business/WorkorderService.java                                 |   97 
 server/src/main/java/com/doumee/biz/system/dto/TriggerJobSnippetDTO.java                               |    2 
 server/src/main/java/com/doumee/api/system/SystemRoleController.java                                   |    2 
 server/src/main/java/com/doumee/config/quartz/JobInitializer.java                                      |    2 
 admin/src/views/business/notices.vue                                                                   |  206 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java         |   54 
 server/src/main/java/com/doumee/service/system/SystemJobLogService.java                                |    2 
 server/src/main/java/com/doumee/biz/system/SystemJobTriggerBiz.java                                    |    2 
 server/src/main/java/com/doumee/service/system/impl/SystemJobListServiceImpl.java                      |    2 
 server/src/main/java/com/doumee/core/utils/FtpUtil.java                                                |  766 ++
 .idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml                                     |   13 
 .idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_5_7.xml                                |   13 
 .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_3_0_3.xml                                    |   13 
 server/src/main/java/com/doumee/config/exception/GlobalExceptionAdvice.java                            |    2 
 server/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java                                      |   22 
 admin/src/views/business/companyNormal.vue                                                             |  109 
 server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java      |   18 
 /dev/null                                                                                              |    0 
 server/src/main/java/com/doumee/service/system/SystemUserRoleService.java                              |    2 
 .idea/libraries/Maven__com_github_xiaoymin_knife4j_core_3_0_3.xml                                      |   13 
 server/src/main/java/com/doumee/dao/system/dto/QuerySystemLoginLogDTO.java                             |    2 
 .idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_9.xml                                        |   13 
 .idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml                                            |   13 
 server/src/main/java/com/doumee/service/business/ManagersService.java                                  |   97 
 server/src/main/java/com/doumee/service/business/CategoryService.java                                  |   97 
 server/src/main/java/com/doumee/service/business/impl/CompanyMemberServiceImpl.java                    |  122 
 server/src/main/java/com/doumee/api/business/ManagersController.java                                   |   85 
 server/src/main/java/com/doumee/core/job/SchedulerProxy.java                                           |    2 
 370 files changed, 16,251 insertions(+), 296 deletions(-)

diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 2c23a59..3ae23ce 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="Encoding">
-    <file url="file://$PROJECT_DIR$/server/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/server/src/main/resources" charset="UTF-8" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_5_7.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_5_7.xml
new file mode 100644
index 0000000..1312ebe
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_5_7.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.baomidou:mybatis-plus:3.5.7">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus/3.5.7/mybatis-plus-3.5.7.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus/3.5.7/mybatis-plus-3.5.7-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus/3.5.7/mybatis-plus-3.5.7-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_5_7.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_5_7.xml
new file mode 100644
index 0000000..f5650e3
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_5_7.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.baomidou:mybatis-plus-annotation:3.5.7">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-annotation/3.5.7/mybatis-plus-annotation-3.5.7.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-annotation/3.5.7/mybatis-plus-annotation-3.5.7-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-annotation/3.5.7/mybatis-plus-annotation-3.5.7-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_5_7.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_5_7.xml
new file mode 100644
index 0000000..3395d14
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_5_7.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.7">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-boot-starter/3.5.7/mybatis-plus-boot-starter-3.5.7.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-boot-starter/3.5.7/mybatis-plus-boot-starter-3.5.7-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-boot-starter/3.5.7/mybatis-plus-boot-starter-3.5.7-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_5_7.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_5_7.xml
new file mode 100644
index 0000000..0d70dac
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_5_7.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.baomidou:mybatis-plus-core:3.5.7">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-core/3.5.7/mybatis-plus-core-3.5.7.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-core/3.5.7/mybatis-plus-core-3.5.7-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-core/3.5.7/mybatis-plus-core-3.5.7-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_5_7.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_5_7.xml
new file mode 100644
index 0000000..9cbb081
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_5_7.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.baomidou:mybatis-plus-extension:3.5.7">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-extension/3.5.7/mybatis-plus-extension-3.5.7.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-extension/3.5.7/mybatis-plus-extension-3.5.7-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-extension/3.5.7/mybatis-plus-extension-3.5.7-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_spring_boot_autoconfigure_3_5_7.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_spring_boot_autoconfigure_3_5_7.xml
new file mode 100644
index 0000000..b31176d
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_spring_boot_autoconfigure_3_5_7.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.baomidou:mybatis-plus-spring-boot-autoconfigure:3.5.7">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-spring-boot-autoconfigure/3.5.7/mybatis-plus-spring-boot-autoconfigure-3.5.7.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-spring-boot-autoconfigure/3.5.7/mybatis-plus-spring-boot-autoconfigure-3.5.7-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/baomidou/mybatis-plus-spring-boot-autoconfigure/3.5.7/mybatis-plus-spring-boot-autoconfigure-3.5.7-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_10_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_10_2.xml
new file mode 100644
index 0000000..1e06003
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_10_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.10.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.10.2/jackson-dataformat-yaml-2.10.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.10.2/jackson-dataformat-yaml-2.10.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.10.2/jackson-dataformat-yaml-2.10.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_9.xml b/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_9.xml
new file mode 100644
index 0000000..e18ef89
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_9.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.jsqlparser:jsqlparser:4.9">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/jsqlparser/jsqlparser/4.9/jsqlparser-4.9.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/jsqlparser/jsqlparser/4.9/jsqlparser-4.9-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/jsqlparser/jsqlparser/4.9/jsqlparser-4.9-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_pagehelper_pagehelper_6_1_0.xml b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_6_1_0.xml
new file mode 100644
index 0000000..ce0098b
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_6_1_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.pagehelper:pagehelper:6.1.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper/6.1.0/pagehelper-6.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper/6.1.0/pagehelper-6.1.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper/6.1.0/pagehelper-6.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_autoconfigure_2_1_0.xml b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_autoconfigure_2_1_0.xml
new file mode 100644
index 0000000..003369d
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_autoconfigure_2_1_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:2.1.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/2.1.0/pagehelper-spring-boot-autoconfigure-2.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/2.1.0/pagehelper-spring-boot-autoconfigure-2.1.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper-spring-boot-autoconfigure/2.1.0/pagehelper-spring-boot-autoconfigure-2.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_starter_2_1_0.xml b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_starter_2_1_0.xml
new file mode 100644
index 0000000..dfc9dcb
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_starter_2_1_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:2.1.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper-spring-boot-starter/2.1.0/pagehelper-spring-boot-starter-2.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper-spring-boot-starter/2.1.0/pagehelper-spring-boot-starter-2.1.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/pagehelper/pagehelper-spring-boot-starter/2.1.0/pagehelper-spring-boot-starter-2.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_xiaoymin_knife4j_annotations_3_0_3.xml b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_annotations_3_0_3.xml
new file mode 100644
index 0000000..21f68b2
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_annotations_3_0_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.xiaoymin:knife4j-annotations:3.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-annotations/3.0.3/knife4j-annotations-3.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-annotations/3.0.3/knife4j-annotations-3.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-annotations/3.0.3/knife4j-annotations-3.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_xiaoymin_knife4j_core_3_0_3.xml b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_core_3_0_3.xml
new file mode 100644
index 0000000..4c084ac
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_core_3_0_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.xiaoymin:knife4j-core:3.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-core/3.0.3/knife4j-core-3.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-core/3.0.3/knife4j-core-3.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-core/3.0.3/knife4j-core-3.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_3_0_3.xml b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_3_0_3.xml
new file mode 100644
index 0000000..a2412ca
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_3_0_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.xiaoymin:knife4j-spring:3.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring/3.0.3/knife4j-spring-3.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring/3.0.3/knife4j-spring-3.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring/3.0.3/knife4j-spring-3.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_autoconfigure_3_0_3.xml b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_autoconfigure_3_0_3.xml
new file mode 100644
index 0000000..29ed5a3
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_autoconfigure_3_0_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.xiaoymin:knife4j-spring-boot-autoconfigure:3.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-boot-autoconfigure/3.0.3/knife4j-spring-boot-autoconfigure-3.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-boot-autoconfigure/3.0.3/knife4j-spring-boot-autoconfigure-3.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-boot-autoconfigure/3.0.3/knife4j-spring-boot-autoconfigure-3.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_starter_3_0_3.xml b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_starter_3_0_3.xml
new file mode 100644
index 0000000..0092021
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_starter_3_0_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.xiaoymin:knife4j-spring-boot-starter:3.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-boot-starter/3.0.3/knife4j-spring-boot-starter-3.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-boot-starter/3.0.3/knife4j-spring-boot-starter-3.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-boot-starter/3.0.3/knife4j-spring-boot-starter-3.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_ui_3_0_3.xml b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_ui_3_0_3.xml
new file mode 100644
index 0000000..904ecc7
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_ui_3_0_3.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.xiaoymin:knife4j-spring-ui:3.0.3">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-ui/3.0.3/knife4j-spring-ui-3.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-ui/3.0.3/knife4j-spring-ui-3.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/xiaoymin/knife4j-spring-ui/3.0.3/knife4j-spring-ui-3.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_1_4_2_2.xml b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_1_4_2_2.xml
new file mode 100644
index 0000000..a130850
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_1_4_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.yulichang:mybatis-plus-join:1.4.2.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join/1.4.2.2/mybatis-plus-join-1.4.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join/1.4.2.2/mybatis-plus-join-1.4.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join/1.4.2.2/mybatis-plus-join-1.4.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_annotation_1_4_2_2.xml b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_annotation_1_4_2_2.xml
new file mode 100644
index 0000000..57abaa5
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_annotation_1_4_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.yulichang:mybatis-plus-join-annotation:1.4.2.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-annotation/1.4.2.2/mybatis-plus-join-annotation-1.4.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-annotation/1.4.2.2/mybatis-plus-join-annotation-1.4.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-annotation/1.4.2.2/mybatis-plus-join-annotation-1.4.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_boot_starter_1_4_2_2.xml b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_boot_starter_1_4_2_2.xml
new file mode 100644
index 0000000..75ce694
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_boot_starter_1_4_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.yulichang:mybatis-plus-join-boot-starter:1.4.2.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-boot-starter/1.4.2.2/mybatis-plus-join-boot-starter-1.4.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-boot-starter/1.4.2.2/mybatis-plus-join-boot-starter-1.4.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-boot-starter/1.4.2.2/mybatis-plus-join-boot-starter-1.4.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_core_1_4_2_2.xml b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_core_1_4_2_2.xml
new file mode 100644
index 0000000..7dbbd40
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_core_1_4_2_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.yulichang:mybatis-plus-join-core:1.4.2.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-core/1.4.2.2/mybatis-plus-join-core-1.4.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-core/1.4.2.2/mybatis-plus-join-core-1.4.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/github/yulichang/mybatis-plus-join-core/1.4.2.2/mybatis-plus-join-core-1.4.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml
new file mode 100644
index 0000000..b86803f
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.code.findbugs:jsr305:3.0.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_2_0.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_2_0.xml
new file mode 100644
index 0000000..a57a93c
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_2_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.errorprone:error_prone_annotations:2.2.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml
new file mode 100644
index 0000000..484e016
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.guava:failureaccess:1.0.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_guava_guava_27_0_1_android.xml b/.idea/libraries/Maven__com_google_guava_guava_27_0_1_android.xml
new file mode 100644
index 0000000..2450bf3
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_guava_guava_27_0_1_android.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.guava:guava:27.0.1-android">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/guava/27.0.1-android/guava-27.0.1-android.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/guava/27.0.1-android/guava-27.0.1-android-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/guava/27.0.1-android/guava-27.0.1-android-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml
new file mode 100644
index 0000000..beaf677
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml
new file mode 100644
index 0000000..1bbfe98
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.j2objc:j2objc-annotations:1.1">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_net_commons_net_3_8_0.xml b/.idea/libraries/Maven__commons_net_commons_net_3_8_0.xml
new file mode 100644
index 0000000..b1acaa4
--- /dev/null
+++ b/.idea/libraries/Maven__commons_net_commons_net_3_8_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: commons-net:commons-net:3.8.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-net/commons-net/3.8.0/commons-net-3.8.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-net/commons-net/3.8.0/commons-net-3.8.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/commons-net/commons-net/3.8.0/commons-net-3.8.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml b/.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml
new file mode 100644
index 0000000..b78755c
--- /dev/null
+++ b/.idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.github.classgraph:classgraph:4.8.83">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/github/classgraph/classgraph/4.8.83/classgraph-4.8.83-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml
new file mode 100644
index 0000000..0eda6ec
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-bean-validators:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-bean-validators/3.0.0/springfox-bean-validators-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-bean-validators/3.0.0/springfox-bean-validators-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-bean-validators/3.0.0/springfox-bean-validators-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml
new file mode 100644
index 0000000..f7db913
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-boot-starter:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-boot-starter/3.0.0/springfox-boot-starter-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml
new file mode 100644
index 0000000..cc1112e
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-core:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-core/3.0.0/springfox-core-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml
new file mode 100644
index 0000000..9f31b3d
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-data-rest:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-data-rest/3.0.0/springfox-data-rest-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-data-rest/3.0.0/springfox-data-rest-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-data-rest/3.0.0/springfox-data-rest-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml
new file mode 100644
index 0000000..9a61efc
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-oas:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-oas/3.0.0/springfox-oas-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml
new file mode 100644
index 0000000..e3de694
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-schema:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-schema/3.0.0/springfox-schema-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml
new file mode 100644
index 0000000..d19707d
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spi:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spi/3.0.0/springfox-spi-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml
new file mode 100644
index 0000000..cb282a3
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spring-web:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-web/3.0.0/springfox-spring-web-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml
new file mode 100644
index 0000000..d21964b
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spring-webflux:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-webflux/3.0.0/springfox-spring-webflux-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-webflux/3.0.0/springfox-spring-webflux-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-webflux/3.0.0/springfox-spring-webflux-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml
new file mode 100644
index 0000000..5a54f26
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-spring-webmvc:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml
new file mode 100644
index 0000000..40b26d5
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-swagger2:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger2/3.0.0/springfox-swagger2-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml
new file mode 100644
index 0000000..82a6963
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-swagger-common:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger-common/3.0.0/springfox-swagger-common-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger-common/3.0.0/springfox-swagger-common-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger-common/3.0.0/springfox-swagger-common-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml
new file mode 100644
index 0000000..7cabde0
--- /dev/null
+++ b/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.springfox:springfox-swagger-ui:3.0.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/springfox/springfox-swagger-ui/3.0.0/springfox-swagger-ui-3.0.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_5.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_5.xml
new file mode 100644
index 0000000..c86634b
--- /dev/null
+++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_5.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger.core.v3:swagger-annotations:2.1.5">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/core/v3/swagger-annotations/2.1.5/swagger-annotations-2.1.5.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/core/v3/swagger-annotations/2.1.5/swagger-annotations-2.1.5-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/core/v3/swagger-annotations/2.1.5/swagger-annotations-2.1.5-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml b/.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml
new file mode 100644
index 0000000..c9f7996
--- /dev/null
+++ b/.idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger.core.v3:swagger-models:2.1.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/core/v3/swagger-models/2.1.2/swagger-models-2.1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/core/v3/swagger-models/2.1.2/swagger-models-2.1.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/core/v3/swagger-models/2.1.2/swagger-models-2.1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_20.xml b/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_20.xml
new file mode 100644
index 0000000..eedca4d
--- /dev/null
+++ b/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_20.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger:swagger-annotations:1.5.20">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_swagger_swagger_core_1_5_22.xml b/.idea/libraries/Maven__io_swagger_swagger_core_1_5_22.xml
new file mode 100644
index 0000000..0d59fa3
--- /dev/null
+++ b/.idea/libraries/Maven__io_swagger_swagger_core_1_5_22.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger:swagger-core:1.5.22">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-core/1.5.22/swagger-core-1.5.22.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-core/1.5.22/swagger-core-1.5.22-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-core/1.5.22/swagger-core-1.5.22-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml b/.idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml
new file mode 100644
index 0000000..038fac3
--- /dev/null
+++ b/.idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: io.swagger:swagger-models:1.5.20">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-models/1.5.20/swagger-models-1.5.20.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-models/1.5.20/swagger-models-1.5.20-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/io/swagger/swagger-models/1.5.20/swagger-models-1.5.20-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
new file mode 100644
index 0000000..a2de034
--- /dev/null
+++ b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: javax.validation:validation-api:2.0.1.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_2.xml b/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_2.xml
new file mode 100644
index 0000000..2b77c80
--- /dev/null
+++ b/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.checkerframework:checker-compat-qual:2.5.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/checkerframework/checker-compat-qual/2.5.2/checker-compat-qual-2.5.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/checkerframework/checker-compat-qual/2.5.2/checker-compat-qual-2.5.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/checkerframework/checker-compat-qual/2.5.2/checker-compat-qual-2.5.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_17.xml b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_17.xml
new file mode 100644
index 0000000..5d53b68
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_17.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.17">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/codehaus/mojo/animal-sniffer-annotations/1.17/animal-sniffer-annotations-1.17.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/codehaus/mojo/animal-sniffer-annotations/1.17/animal-sniffer-annotations-1.17-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/codehaus/mojo/animal-sniffer-annotations/1.17/animal-sniffer-annotations-1.17-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml b/.idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml
new file mode 100644
index 0000000..00b15a0
--- /dev/null
+++ b/.idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mapstruct:mapstruct:1.3.1.Final">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_3_5_16.xml b/.idea/libraries/Maven__org_mybatis_mybatis_3_5_16.xml
new file mode 100644
index 0000000..695401f
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_mybatis_3_5_16.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mybatis:mybatis:3.5.16">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/mybatis/3.5.16/mybatis-3.5.16.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/mybatis/3.5.16/mybatis-3.5.16-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/mybatis/3.5.16/mybatis-3.5.16-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_1_2.xml b/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_1_2.xml
new file mode 100644
index 0000000..c2a1d42
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_1_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mybatis:mybatis-spring:2.1.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/mybatis-spring/2.1.2/mybatis-spring-2.1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/mybatis-spring/2.1.2/mybatis-spring-2.1.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/mybatis-spring/2.1.2/mybatis-spring-2.1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_3_2.xml b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_3_2.xml
new file mode 100644
index 0000000..6eaf319
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_3_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.3.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.3.2/mybatis-spring-boot-autoconfigure-2.3.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.3.2/mybatis-spring-boot-autoconfigure-2.3.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.3.2/mybatis-spring-boot-autoconfigure-2.3.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_3_2.xml b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_3_2.xml
new file mode 100644
index 0000000..2582b1d
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_3_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.2">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.3.2/mybatis-spring-boot-starter-2.3.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.3.2/mybatis-spring-boot-starter-2.3.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/mybatis/spring/boot/mybatis-spring-boot-starter/2.3.2/mybatis-spring-boot-starter-2.3.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml
new file mode 100644
index 0000000..0580bad
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml
new file mode 100644
index 0000000..03ca042
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$PROJECT_DIR$/../../../maven/repository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/admin/package-lock.json b/admin/package-lock.json
index 4f7c429..6368095 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -1290,6 +1290,11 @@
       "integrity": "sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc=",
       "dev": true
     },
+    "@transloadit/prettier-bytes": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+      "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
+    },
     "@types/anymatch": {
       "version": "1.3.1",
       "resolved": "https://registry.npm.taobao.org/@types/anymatch/download/@types/anymatch-1.3.1.tgz?cache=0&sync_timestamp=1613378060592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fanymatch%2Fdownload%2F%40types%2Fanymatch-1.3.1.tgz",
@@ -1324,6 +1329,11 @@
         "@types/express-serve-static-core": "*",
         "@types/node": "*"
       }
+    },
+    "@types/event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
     },
     "@types/express": {
       "version": "4.17.11",
@@ -1518,6 +1528,53 @@
           "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
           "dev": true
         }
+      }
+    },
+    "@uppy/companion-client": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+      "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+      "requires": {
+        "@uppy/utils": "^4.1.2",
+        "namespace-emitter": "^2.0.1"
+      }
+    },
+    "@uppy/core": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+      "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+      "requires": {
+        "@transloadit/prettier-bytes": "0.0.7",
+        "@uppy/store-default": "^2.1.1",
+        "@uppy/utils": "^4.1.3",
+        "lodash.throttle": "^4.1.1",
+        "mime-match": "^1.0.2",
+        "namespace-emitter": "^2.0.1",
+        "nanoid": "^3.1.25",
+        "preact": "^10.5.13"
+      }
+    },
+    "@uppy/store-default": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+      "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+    },
+    "@uppy/utils": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+      "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+      "requires": {
+        "lodash.throttle": "^4.1.1"
+      }
+    },
+    "@uppy/xhr-upload": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+      "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+      "requires": {
+        "@uppy/companion-client": "^2.2.2",
+        "@uppy/utils": "^4.1.2",
+        "nanoid": "^3.1.25"
       }
     },
     "@vue/babel-helper-vue-jsx-merge-props": {
@@ -1914,6 +1971,88 @@
       "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.3.0.tgz",
       "integrity": "sha1-trQKdiVCnSvXwigd26YB7QXcfxo=",
       "dev": true
+    },
+    "@wangeditor/basic-modules": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+      "requires": {
+        "is-url": "^1.2.4"
+      }
+    },
+    "@wangeditor/code-highlight": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+      "requires": {
+        "prismjs": "^1.23.0"
+      }
+    },
+    "@wangeditor/core": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+      "requires": {
+        "@types/event-emitter": "^0.3.3",
+        "event-emitter": "^0.3.5",
+        "html-void-elements": "^2.0.0",
+        "i18next": "^20.4.0",
+        "scroll-into-view-if-needed": "^2.2.28",
+        "slate-history": "^0.66.0"
+      }
+    },
+    "@wangeditor/editor": {
+      "version": "5.1.23",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+      "requires": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "^1.1.7",
+        "@wangeditor/code-highlight": "^1.0.3",
+        "@wangeditor/core": "^1.1.19",
+        "@wangeditor/list-module": "^1.0.5",
+        "@wangeditor/table-module": "^1.1.4",
+        "@wangeditor/upload-image-module": "^1.0.2",
+        "@wangeditor/video-module": "^1.1.4",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "@wangeditor/editor-for-vue": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
+      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA=="
+    },
+    "@wangeditor/list-module": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
+    },
+    "@wangeditor/table-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
+    },
+    "@wangeditor/upload-image-module": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
+    },
+    "@wangeditor/video-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
     },
     "@webassemblyjs/ast": {
       "version": "1.9.0",
@@ -3707,6 +3846,11 @@
         }
       }
     },
+    "compute-scroll-into-view": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
@@ -4354,6 +4498,15 @@
       "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
       "dev": true
     },
+    "d": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+      "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+      "requires": {
+        "es5-ext": "^0.10.64",
+        "type": "^2.7.2"
+      }
+    },
     "dashdash": {
       "version": "1.14.1",
       "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1601073454623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz",
@@ -4778,6 +4931,14 @@
         }
       }
     },
+    "dom7": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+      "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+      "requires": {
+        "ssr-window": "^3.0.0-alpha.1"
+      }
+    },
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1604239998047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz",
@@ -5045,6 +5206,36 @@
         "is-callable": "^1.1.4",
         "is-date-object": "^1.0.1",
         "is-symbol": "^1.0.2"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.64",
+      "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+      "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+      "requires": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "esniff": "^2.0.1",
+        "next-tick": "^1.1.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+      "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+      "requires": {
+        "d": "^1.0.2",
+        "ext": "^1.7.0"
       }
     },
     "escalade": {
@@ -5564,6 +5755,17 @@
       "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
       "dev": true
     },
+    "esniff": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+      "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+      "requires": {
+        "d": "^1.0.1",
+        "es5-ext": "^0.10.62",
+        "event-emitter": "^0.3.5",
+        "type": "^2.7.2"
+      }
+    },
     "espree": {
       "version": "6.2.1",
       "resolved": "https://registry.npm.taobao.org/espree/download/espree-6.2.1.tgz?cache=0&sync_timestamp=1607143966756&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-6.2.1.tgz",
@@ -5640,6 +5842,15 @@
       "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
       "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
     },
     "event-pubsub": {
       "version": "4.3.0",
@@ -5802,6 +6013,14 @@
           "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=",
           "dev": true
         }
+      }
+    },
+    "ext": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+      "requires": {
+        "type": "^2.7.2"
       }
     },
     "extend": {
@@ -6734,6 +6953,11 @@
       "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
       "dev": true
     },
+    "html-void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+      "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
+    },
     "html-webpack-plugin": {
       "version": "3.2.0",
       "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz?cache=0&sync_timestamp=1615296040860&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-3.2.0.tgz",
@@ -6949,6 +7173,14 @@
       "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=",
       "dev": true
     },
+    "i18next": {
+      "version": "20.6.1",
+      "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+      "requires": {
+        "@babel/runtime": "^7.12.0"
+      }
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184264130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
@@ -6984,6 +7216,11 @@
       "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz",
       "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
       "dev": true
+    },
+    "immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
     },
     "import-cwd": {
       "version": "2.1.0",
@@ -7466,6 +7703,11 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-hotkey": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+    },
     "is-negative-zero": {
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.1.tgz?cache=0&sync_timestamp=1607123080624&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-negative-zero%2Fdownload%2Fis-negative-zero-2.0.1.tgz",
@@ -7605,6 +7847,11 @@
       "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
       "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
       "dev": true
+    },
+    "is-url": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
     },
     "is-utf8": {
       "version": "0.2.1",
@@ -8377,17 +8624,36 @@
       "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz",
       "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
     },
+    "lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+    },
     "lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
-      "dev": true
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
     },
     "lodash.defaultsdeep": {
       "version": "4.6.1",
       "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz",
       "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=",
       "dev": true
+    },
+    "lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
     "lodash.kebabcase": {
       "version": "4.1.1",
@@ -8406,6 +8672,16 @@
       "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
       "dev": true
+    },
+    "lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
     },
     "lodash.transform": {
       "version": "4.6.0",
@@ -8787,6 +9063,14 @@
       "integrity": "sha1-jLMT5Zll08Bc+/iYkVomevRqM1w=",
       "dev": true
     },
+    "mime-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+      "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+      "requires": {
+        "wildcard": "^1.1.0"
+      }
+    },
     "mime-types": {
       "version": "2.1.30",
       "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.30.tgz",
@@ -8984,11 +9268,21 @@
         "thenify-all": "^1.0.0"
       }
     },
+    "namespace-emitter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+      "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+    },
     "nan": {
       "version": "2.14.2",
       "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591684976&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz",
       "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=",
       "dev": true
+    },
+    "nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="
     },
     "nanomatch": {
       "version": "1.2.13",
@@ -9026,6 +9320,11 @@
       "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz?cache=0&sync_timestamp=1594317434347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.2.tgz",
       "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=",
       "dev": true
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
     },
     "nice-try": {
       "version": "1.0.5",
@@ -10558,6 +10857,11 @@
       "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
       "dev": true
     },
+    "preact": {
+      "version": "10.26.4",
+      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.26.4.tgz",
+      "integrity": "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w=="
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
@@ -10586,6 +10890,11 @@
         "lodash": "^4.17.20",
         "renderkid": "^2.0.4"
       }
+    },
+    "prismjs": {
+      "version": "1.30.0",
+      "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz",
+      "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="
     },
     "process": {
       "version": "0.11.10",
@@ -11438,6 +11747,14 @@
         "ajv-keywords": "^3.5.2"
       }
     },
+    "scroll-into-view-if-needed": {
+      "version": "2.2.31",
+      "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+      "requires": {
+        "compute-scroll-into-view": "^1.0.20"
+      }
+    },
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz",
@@ -11730,6 +12047,38 @@
       "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
       "dev": true
     },
+    "slate": {
+      "version": "0.72.8",
+      "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+      "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+      "requires": {
+        "immer": "^9.0.6",
+        "is-plain-object": "^5.0.0",
+        "tiny-warning": "^1.0.3"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
+    "slate-history": {
+      "version": "0.66.0",
+      "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+      "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+      "requires": {
+        "is-plain-object": "^5.0.0"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
     "slice-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz?cache=0&sync_timestamp=1618554953055&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-2.1.0.tgz",
@@ -11748,6 +12097,11 @@
           "dev": true
         }
       }
+    },
+    "snabbdom": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
+      "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q=="
     },
     "snapdragon": {
       "version": "0.8.2",
@@ -12076,6 +12430,11 @@
         "safer-buffer": "^2.0.2",
         "tweetnacl": "~0.14.0"
       }
+    },
+    "ssr-window": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+      "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
     "ssri": {
       "version": "6.0.2",
@@ -12627,6 +12986,11 @@
       "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz",
       "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM="
     },
+    "tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+    },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1588178571895&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz",
@@ -12788,6 +13152,11 @@
       "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1581364203962&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz",
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       "dev": true
+    },
+    "type": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
+      "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
     },
     "type-check": {
       "version": "0.3.2",
@@ -14089,6 +14458,11 @@
         }
       }
     },
+    "wildcard": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+      "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+    },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
diff --git a/admin/package.json b/admin/package.json
index 3ce52a4..7733085 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -11,6 +11,8 @@
   },
   "dependencies": {
     "@riophae/vue-treeselect": "^0.4.0",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "^1.0.2",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
     "crypto-js": "^4.1.1",
diff --git a/admin/src/api/business/category.js b/admin/src/api/business/category.js
new file mode 100644
index 0000000..70202b0
--- /dev/null
+++ b/admin/src/api/business/category.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/category/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/category/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/category/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/category/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/category/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/category/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/company.js b/admin/src/api/business/company.js
new file mode 100644
index 0000000..e4d26dd
--- /dev/null
+++ b/admin/src/api/business/company.js
@@ -0,0 +1,47 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/company/page', data, {
+    trim: true
+  })
+}
+export function treeList (data) {
+  return request.post('/business/company/tree', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/company/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+export function companySync (data) {
+  return request.post('/business/company/syncAll', data)
+}
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/company/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/company/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/company/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/company/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/managers.js b/admin/src/api/business/managers.js
new file mode 100644
index 0000000..237a691
--- /dev/null
+++ b/admin/src/api/business/managers.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/managers/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/managers/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/managers/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/managers/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/managers/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/managers/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/member.js b/admin/src/api/business/member.js
new file mode 100644
index 0000000..ae84cde
--- /dev/null
+++ b/admin/src/api/business/member.js
@@ -0,0 +1,43 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/member/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/member/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/member/create', data)
+}
+export function memberSync (data) {
+  return request.post('/business/member/syncAll', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/member/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/member/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/member/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/multifile.js b/admin/src/api/business/multifile.js
new file mode 100644
index 0000000..1fd3d9d
--- /dev/null
+++ b/admin/src/api/business/multifile.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/multifile/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/multifile/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/multifile/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/multifile/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/multifile/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/multifile/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/notices.js b/admin/src/api/business/notices.js
new file mode 100644
index 0000000..669d5f4
--- /dev/null
+++ b/admin/src/api/business/notices.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/notices/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/notices/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/notices/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/notices/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/notices/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/notices/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/workorder.js b/admin/src/api/business/workorder.js
new file mode 100644
index 0000000..7e78dd2
--- /dev/null
+++ b/admin/src/api/business/workorder.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/workorder/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/workorder/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/workorder/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/workorder/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/workorder/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/workorder/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/workorderLog.js b/admin/src/api/business/workorderLog.js
new file mode 100644
index 0000000..e05a087
--- /dev/null
+++ b/admin/src/api/business/workorderLog.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/workorderLog/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/workorderLog/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/workorderLog/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/workorderLog/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/workorderLog/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/workorderLog/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/system/job.js b/admin/src/api/system/job.js
index a45c36e..24fa35b 100644
--- a/admin/src/api/system/job.js
+++ b/admin/src/api/system/job.js
@@ -14,7 +14,7 @@
 
 // 鍒涘缓
 export function create (data) {
-  return request.twoFA().post('/system/job/create', data)
+  return request.post('/system/job/create', data)
 }
 
 // 淇敼
@@ -43,5 +43,5 @@
 
 // 瑙﹀彂JOB
 export function trigger (data) {
-  return request.twoFA().post('/system/job/trigger', data)
+  return request.post('/system/job/trigger', data)
 }
diff --git a/admin/src/assets/images/alipay.jpeg b/admin/src/assets/images/alipay.jpeg
deleted file mode 100644
index 94d78da..0000000
--- a/admin/src/assets/images/alipay.jpeg
+++ /dev/null
Binary files differ
diff --git a/admin/src/assets/images/wxpay.jpeg b/admin/src/assets/images/wxpay.jpeg
deleted file mode 100644
index 5c8fdfc..0000000
--- a/admin/src/assets/images/wxpay.jpeg
+++ /dev/null
Binary files differ
diff --git a/admin/src/components/business/OperaCategoryWindow.vue b/admin/src/components/business/OperaCategoryWindow.vue
new file mode 100644
index 0000000..d119f6d
--- /dev/null
+++ b/admin/src/components/business/OperaCategoryWindow.vue
@@ -0,0 +1,94 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍥炬爣" prop="imgurl">
+        <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュ浘鏍�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨� 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�" prop="parentId">
+        <el-input v-model="form.parentId" placeholder="璇疯緭鍏ョ埗绾х紪鐮侊紙鑷叧鑱旓級" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О璺緞" prop="namePath">
+        <el-input v-model="form.namePath" placeholder="璇疯緭鍏ュ悕绉拌矾寰�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜璺緞" prop="idPath">
+        <el-input v-model="form.idPath" placeholder="璇疯緭鍏ョ紪鐮佽矾寰�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCategoryWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        imgurl: '',
+        type: '',
+        parentId: '',
+        namePath: '',
+        idPath: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaCompanyWindow.vue b/admin/src/components/business/OperaCompanyWindow.vue
new file mode 100644
index 0000000..f4a1a99
--- /dev/null
+++ b/admin/src/components/business/OperaCompanyWindow.vue
@@ -0,0 +1,102 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 1绂佺敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1绂佺敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶村儚" prop="imgurl">
+        <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュご鍍�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炵埗绾х紪鐮侊紙鍏宠仈company)" prop="parentId">
+        <el-input v-model="form.parentId" placeholder="璇疯緭鍏ユ墍灞炵埗绾х紪鐮侊紙鍏宠仈company)" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="浼佸井鏍囪瘑" prop="qwId">
+        <el-input v-model="form.qwId" placeholder="璇疯緭鍏ヤ紒寰爣璇�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍚嶇О璺緞" prop="namePath">
+        <el-input v-model="form.namePath" placeholder="璇疯緭鍏ュ悕绉拌矾寰�" v-trim/>
+      </el-form-item>
+      <el-form-item label="缂栫爜璺緞" prop="idPath">
+        <el-input v-model="form.idPath" placeholder="璇疯緭鍏ョ紪鐮佽矾寰�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCompanyWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        imgurl: '',
+        type: '',
+        parentId: '',
+        code: '',
+        qwId: '',
+        namePath: '',
+        idPath: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/company',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaManagersWindow.vue b/admin/src/components/business/OperaManagersWindow.vue
new file mode 100644
index 0000000..daa5157
--- /dev/null
+++ b/admin/src/components/business/OperaManagersWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" prop="categoryId">
+        <el-input v-model="form.categoryId" placeholder="璇疯緭鍏ユ墍灞炲垎绫荤紪锛堝叧鑱攃ategory)" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨� 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="" prop="column13">
+        <el-input v-model="form.column13" placeholder="璇疯緭鍏�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaManagersWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        categoryId: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: '',
+        memberId: '',
+        column13: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/managers',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaMemberWindow.vue b/admin/src/components/business/OperaMemberWindow.vue
new file mode 100644
index 0000000..fdb0ca5
--- /dev/null
+++ b/admin/src/components/business/OperaMemberWindow.vue
@@ -0,0 +1,118 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="濮撳悕" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 1绂佺敤" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1绂佺敤" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶村儚" prop="imgurl">
+        <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュご鍍�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)" prop="companyId">
+        <el-input v-model="form.companyId" placeholder="璇疯緭鍏ユ墍灞炵粍缁囩紪鐮侊紙鍏宠仈company)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵嬫満鍙�" prop="phone">
+        <el-input v-model="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="閭" prop="email">
+        <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎬у埆 0鐢� 1濂� 2浣嶇疆" prop="sex">
+        <el-input v-model="form.sex" placeholder="璇疯緭鍏ユ�у埆 0鐢� 1濂� 2浣嶇疆" v-trim/>
+      </el-form-item>
+      <el-form-item label="宸ュ彿" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ伐鍙�" v-trim/>
+      </el-form-item>
+      <el-form-item label="浼佸井鏍囪瘑" prop="qwId">
+        <el-input v-model="form.qwId" placeholder="璇疯緭鍏ヤ紒寰爣璇�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璇佷欢鍙�" prop="idcard">
+        <el-input v-model="form.idcard" placeholder="璇疯緭鍏ヨ瘉浠跺彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏈�杩戜笂绾挎椂闂�" prop="lastLoginDate">
+        <el-date-picker v-model="form.lastLoginDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶杩戜笂绾挎椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鐧诲綍娆℃暟" prop="loginCount">
+        <el-input v-model="form.loginCount" placeholder="璇疯緭鍏ョ櫥褰曟鏁�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaMemberWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        imgurl: '',
+        type: '',
+        companyId: '',
+        phone: '',
+        email: '',
+        sex: '',
+        code: '',
+        qwId: '',
+        idcard: '',
+        lastLoginDate: '',
+        loginCount: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/member',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaMultifileWindow.vue b/admin/src/components/business/OperaMultifileWindow.vue
new file mode 100644
index 0000000..5dc4b9a
--- /dev/null
+++ b/admin/src/components/business/OperaMultifileWindow.vue
@@ -0,0 +1,90 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏂囦欢鍚�" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ユ枃浠跺悕" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈瀵硅薄缂栫爜" prop="objId">
+        <el-input v-model="form.objId" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨�0鍥剧墖 1瑙嗛 2鍏朵粬" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊" prop="objType">
+        <el-input v-model="form.objType" placeholder="璇疯緭鍏ュ叧鑱斿璞$被鍨� 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏂囦欢鍦板潃" prop="fileurl">
+        <el-input v-model="form.fileurl" placeholder="璇疯緭鍏ユ枃浠跺湴鍧�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="浼佷笟缂栫爜(鍏宠仈company琛級" prop="companyId">
+        <el-input v-model="form.companyId" placeholder="璇疯緭鍏ヤ紒涓氱紪鐮�(鍏宠仈company琛級" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaMultifileWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        info: '',
+        objId: '',
+        type: '',
+        objType: '',
+        fileurl: '',
+        sortnum: '',
+        companyId: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/multifile',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaNoticesWindow.vue b/admin/src/components/business/OperaNoticesWindow.vue
new file mode 100644
index 0000000..1ee47f5
--- /dev/null
+++ b/admin/src/components/business/OperaNoticesWindow.vue
@@ -0,0 +1,138 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏍囬" prop="title">
+        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ爣棰�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绠�浠�" prop="info">
+        <el-input v-model="form.info" placeholder="璇疯緭鍏ョ畝浠�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍐呭" prop="content">
+        <el-input v-model="form.content" placeholder="璇疯緭鍏ュ唴瀹�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈瀵硅薄缂栫爜" prop="objId">
+        <el-input v-model="form.objId" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈瀵硅薄绫诲瀷 0宸ュ崟" prop="objType">
+        <el-input v-model="form.objType" placeholder="璇疯緭鍏ュ叧鑱斿璞$被鍨� 0宸ュ崟" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈瀵硅薄鍚嶇О" prop="objName">
+        <el-input v-model="form.objName" placeholder="璇疯緭鍏ュ叧鑱斿璞″悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨� 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鍙傛暟1" prop="param1">
+        <el-input v-model="form.param1" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�1" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鍙傛暟2" prop="param2">
+        <el-input v-model="form.param2" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�2" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鍙傛暟3" prop="param3">
+        <el-input v-model="form.param3" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�3" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鍙傛暟4" prop="param4">
+        <el-input v-model="form.param4" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�4" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鍙傛暟5" prop="param5">
+        <el-input v-model="form.param5" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�5" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鐢ㄦ埛濮撳悕" prop="memberName">
+        <el-input v-model="form.memberName" placeholder="璇疯緭鍏ュ叧鑱旂敤鎴峰鍚�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鐢ㄦ埛浼佸井缂栫爜" prop="qwId">
+        <el-input v-model="form.qwId" placeholder="璇疯緭鍏ュ叧鑱旂敤鎴蜂紒寰紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈鐢ㄦ埛缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ュ叧鑱旂敤鎴风紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈浼佷笟缁勭粐缂栫爜(鍏宠仈company锛�" prop="companyId">
+        <el-input v-model="form.companyId" placeholder="璇疯緭鍏ュ叧鑱斾紒涓氱粍缁囩紪鐮�(鍏宠仈company锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0姝e父 1宸插叧闂�" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1宸插叧闂�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁鎶勯�� 0涓嶆槸 1鏄�" prop="sendacopy">
+        <el-input v-model="form.sendacopy" placeholder="璇疯緭鍏ユ槸鍚︽妱閫� 0涓嶆槸 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁宸茶 0鏈 1宸茶" prop="readed">
+        <el-input v-model="form.readed" placeholder="璇疯緭鍏ユ槸鍚﹀凡璇� 0鏈 1宸茶" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaNoticesWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        remark: '',
+        title: '',
+        info: '',
+        content: '',
+        objId: '',
+        objType: '',
+        objName: '',
+        type: '',
+        param1: '',
+        param2: '',
+        param3: '',
+        param4: '',
+        param5: '',
+        memberName: '',
+        qwId: '',
+        memberId: '',
+        companyId: '',
+        status: '',
+        sendacopy: '',
+        readed: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/notices',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaWorkorderLogWindow.vue b/admin/src/components/business/OperaWorkorderLogWindow.vue
new file mode 100644
index 0000000..4bb1f64
--- /dev/null
+++ b/admin/src/components/business/OperaWorkorderLogWindow.vue
@@ -0,0 +1,106 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="宸ュ崟缂栫爜锛堝叧鑱攚orkorder)" prop="workorderId">
+        <el-input v-model="form.workorderId" placeholder="璇疯緭鍏ュ伐鍗曠紪鐮侊紙鍏宠仈workorder)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏍囬" prop="title">
+        <el-input v-model="form.title" placeholder="璇疯緭鍏ユ爣棰�" v-trim/>
+      </el-form-item>
+      <el-form-item label="绠�浠�" prop="content">
+        <el-input v-model="form.content" placeholder="璇疯緭鍏ョ畝浠�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎿嶄綔绫诲瀷 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績" prop="objType">
+        <el-input v-model="form.objType" placeholder="璇疯緭鍏ユ搷浣滅被鍨� 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍏宠仈瀵硅薄缂栫爜" prop="objId">
+        <el-input v-model="form.objId" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎿嶄綔鍓嶅唴瀹�" prop="beforeContent">
+        <el-input v-model="form.beforeContent" placeholder="璇疯緭鍏ユ搷浣滃墠鍐呭" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎿嶄綔鍚庡唴瀹�" prop="afterContent">
+        <el-input v-model="form.afterContent" placeholder="璇疯緭鍏ユ搷浣滃悗鍐呭" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍙傛暟1" prop="param1">
+        <el-input v-model="form.param1" placeholder="璇疯緭鍏ュ弬鏁�1" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍙傛暟2" prop="param2">
+        <el-input v-model="form.param2" placeholder="璇疯緭鍏ュ弬鏁�2" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍙傛暟3" prop="param3">
+        <el-input v-model="form.param3" placeholder="璇疯緭鍏ュ弬鏁�3" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍙傛暟4" prop="param4">
+        <el-input v-model="form.param4" placeholder="璇疯緭鍏ュ弬鏁�4" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaWorkorderLogWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        remark: '',
+        workorderId: '',
+        title: '',
+        content: '',
+        objType: '',
+        objId: '',
+        beforeContent: '',
+        afterContent: '',
+        param1: '',
+        param2: '',
+        param3: '',
+        param4: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/workorderLog',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaWorkorderWindow.vue b/admin/src/components/business/OperaWorkorderWindow.vue
new file mode 100644
index 0000000..d73ade2
--- /dev/null
+++ b/admin/src/components/business/OperaWorkorderWindow.vue
@@ -0,0 +1,186 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" prop="categoryId">
+        <el-input v-model="form.categoryId" placeholder="璇疯緭鍏ユ墍灞炲垎绫荤紪锛堝叧鑱攃ategory)" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鐘舵�� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�" prop="status">
+        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="绫诲瀷 0浣嶇疆璐d换浜� 1鐝暱 2鐗╀笟涓荤 3宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" prop="type">
+        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨� 0浣嶇疆璐d换浜� 1鐝暱 2鐗╀笟涓荤 3宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" v-trim/>
+      </el-form-item>
+      <el-form-item label="涓婃姤浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+        <el-input v-model="form.memberId" placeholder="璇疯緭鍏ヤ笂鎶ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="閮ㄩ棬缂栫爜" prop="companyId">
+        <el-input v-model="form.companyId" placeholder="璇疯緭鍏ラ儴闂ㄧ紪鐮�" v-trim/>
+      </el-form-item>
+      <el-form-item label="涓婃姤鏃堕棿" prop="submitDate">
+        <el-input v-model="form.submitDate" placeholder="璇疯緭鍏ヤ笂鎶ユ椂闂�" v-trim/>
+      </el-form-item>
+      <el-form-item label="SHE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�" prop="memberType">
+        <el-input v-model="form.memberType" placeholder="璇疯緭鍏HE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�" v-trim/>
+      </el-form-item>
+      <el-form-item label="SHE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎" prop="memberQwids">
+        <el-input v-model="form.memberQwids" placeholder="璇疯緭鍏HE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎" v-trim/>
+      </el-form-item>
+      <el-form-item label="SHE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�" prop="memberNames">
+        <el-input v-model="form.memberNames" placeholder="璇疯緭鍏HE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍙戠敓鍦扮偣/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�" prop="localtionId">
+        <el-input v-model="form.localtionId" placeholder="璇疯緭鍏ュ彂鐢熷湴鐐�/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁澶栭儴灏卞尰 0鍚� 1鏄�" prop="outJiuyi">
+        <el-input v-model="form.outJiuyi" placeholder="璇疯緭鍏ユ槸鍚﹀閮ㄥ氨鍖� 0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍖诲姟瀹� 0鍚� 1鏄�" prop="isYiwushi">
+        <el-input v-model="form.isYiwushi" placeholder="璇疯緭鍏ユ槸鍚﹀尰鍔″ 0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍙椾激 0鍚� 1鏄�" prop="isHurted">
+        <el-input v-model="form.isHurted" placeholder="璇疯緭鍏ユ槸鍚﹀彈浼� 0鍚� 1鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁鍜屽伐浣滅浉鍏�" prop="workRelated">
+        <el-input v-model="form.workRelated" placeholder="璇疯緭鍏ユ槸鍚﹀拰宸ヤ綔鐩稿叧" v-trim/>
+      </el-form-item>
+      <el-form-item label="浜嬩欢璇存槑" prop="eventInfo">
+        <el-input v-model="form.eventInfo" placeholder="璇疯緭鍏ヤ簨浠惰鏄�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閭欢閫氱煡浜哄憳缂栫爜闆嗗悎" prop="emialMemberIds">
+        <el-input v-model="form.emialMemberIds" placeholder="璇疯緭鍏ラ偖浠堕�氱煡浜哄憳缂栫爜闆嗗悎" v-trim/>
+      </el-form-item>
+      <el-form-item label="浼佷笟寰俊閫氱煡浜哄憳缂栫爜闆嗗悎" prop="qwnoticeMemberIds">
+        <el-input v-model="form.qwnoticeMemberIds" placeholder="璇疯緭鍏ヤ紒涓氬井淇¢�氱煡浜哄憳缂栫爜闆嗗悎" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍙戠幇鏃堕棿" prop="happenTime">
+        <el-input v-model="form.happenTime" placeholder="璇疯緭鍏ュ彂鐜版椂闂�" v-trim/>
+      </el-form-item>
+      <el-form-item label="椋庨櫓绫诲瀷(鍏宠仈category锛�" prop="typeId">
+        <el-date-picker v-model="form.typeId" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ラ闄╃被鍨�(鍏宠仈category锛�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="椋庨櫓鎻忚堪" prop="riskInfo">
+        <el-input v-model="form.riskInfo" placeholder="璇疯緭鍏ラ闄╂弿杩�" v-trim/>
+      </el-form-item>
+      <el-form-item label="褰撳墠鐗╀笟涓荤缂栫爜锛堝叧鑱攎ember锛�" prop="managerId">
+        <el-input v-model="form.managerId" placeholder="璇疯緭鍏ュ綋鍓嶇墿涓氫富绠$紪鐮侊紙鍏宠仈member锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="褰撳墠澶勭悊浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="dealerId">
+        <el-input v-model="form.dealerId" placeholder="璇疯緭鍏ュ綋鍓嶅鐞嗕汉鍛樼紪鐮侊紙鍏宠仈member)" v-trim/>
+      </el-form-item>
+      <el-form-item label="鍒嗛厤鏃堕棿" prop="dispatchTime">
+        <el-date-picker v-model="form.dispatchTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垎閰嶆椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鍒嗛厤澶囨敞" prop="dispatchInfo">
+        <el-input v-model="form.dispatchInfo" placeholder="璇疯緭鍏ュ垎閰嶅娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶勭悊鏃堕棿" prop="dealTime">
+        <el-date-picker v-model="form.dealTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ鐞嗘椂闂�"></el-date-picker>
+      </el-form-item>
+      <el-form-item label="澶勭悊澶囨敞" prop="dealInfo">
+        <el-input v-model="form.dealInfo" placeholder="璇疯緭鍏ュ鐞嗗娉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="DCA闂缂栫爜" prop="problemId">
+        <el-input v-model="form.problemId" placeholder="璇疯緭鍏CA闂缂栫爜" v-trim/>
+      </el-form-item>
+      <el-form-item label="DCA闂鏁伴噺" prop="problemNum">
+        <el-input v-model="form.problemNum" placeholder="璇疯緭鍏CA闂鏁伴噺" v-trim/>
+      </el-form-item>
+      <el-form-item label="浣嶇疆鍦扮偣璺緞鍚嶇О" prop="locationName">
+        <el-input v-model="form.locationName" placeholder="璇疯緭鍏ヤ綅缃湴鐐硅矾寰勫悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="宸ュ崟鍙�" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ伐鍗曞彿" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaWorkorderWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        categoryId: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: '',
+        memberId: '',
+        companyId: '',
+        submitDate: '',
+        memberType: '',
+        memberQwids: '',
+        memberNames: '',
+        localtionId: '',
+        outJiuyi: '',
+        isYiwushi: '',
+        isHurted: '',
+        workRelated: '',
+        eventInfo: '',
+        emialMemberIds: '',
+        qwnoticeMemberIds: '',
+        happenTime: '',
+        typeId: '',
+        riskInfo: '',
+        managerId: '',
+        dealerId: '',
+        dispatchTime: '',
+        dispatchInfo: '',
+        dealTime: '',
+        dealInfo: '',
+        problemId: '',
+        problemNum: '',
+        locationName: '',
+        code: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/workorder',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/common/RichEditor.vue b/admin/src/components/common/RichEditor.vue
new file mode 100644
index 0000000..91cd904
--- /dev/null
+++ b/admin/src/components/common/RichEditor.vue
@@ -0,0 +1,318 @@
+<template>
+  <div :style="styleEditor">
+    <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" />
+    <Editor style="min-height: 80px; overflow-y: hidden;" v-model="html" :defaultConfig="editorConfig" :mode="mode"
+            @onCreated="onCreated" @onChange="onChange" />
+  </div>
+</template>
+<style src="@wangeditor/editor/dist/css/style.css"></style>
+<script>
+import Vue from 'vue'
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+import { Loading } from 'element-ui'
+let loadingInstance = null
+export default Vue.extend({
+  props: {
+    richData: { // 鐖剁粍浠朵紶閫掔殑鏁版嵁
+      type: String,
+      default: ''
+    },
+    styleEditor: '',
+    readonly: false // 鏄惁鍙互杈撳叆
+  },
+  name: 'RichEditor',
+  components: { Editor, Toolbar },
+  data () {
+    return {
+      editor: null,
+      html: '',
+      toolbarConfig: { // 宸ュ叿鏍忛厤缃�
+        toolbarKeys: this.readonly ? ['fullScreen'] : [ // 鏄剧ず鎸囧畾鐨勮彍鍗曢」
+          'bold', // 绮椾綋
+          'underline', // 涓嬪垝绾�
+          'italic', // 鏂滀綋
+          'through', // 鍒犻櫎绾�
+          'code', // 琛屽唴浠g爜
+          'sub', // 涓嬫爣
+          'sup', // 涓婃爣
+          'clearStyle', // 娓呴櫎鏍煎紡
+          'color', // 瀛椾綋棰滆壊
+          'bgColor', // 鑳屾櫙鑹�
+          'fontSize', // 瀛楀彿
+          'fontFamily', // 瀛椾綋
+          'indent', // 澧炲姞缂╄繘
+          'delIndent', // 鍑忓皯缂╄繘
+          'justifyLeft', // 宸﹀榻�
+          'justifyRight', // 鍙冲榻�
+          'justifyCenter', // 灞呬腑瀵归綈
+          'justifyJustify', // 涓ょ瀵归綈
+          'lineHeight', // 琛岄珮
+          // "viewImageLink", // 鏌ョ湅閾炬帴
+          'divider', // 鍒嗗壊绾�
+          'emotion', // 琛ㄦ儏
+          'insertLink', // 鎻掑叆閾炬帴
+          // "editLink", // 淇敼閾炬帴
+          // "unLink", // 鍙栨秷閾炬帴
+          // "viewLink", // 鏌ョ湅閾炬帴
+          'codeBlock', // 浠g爜鍧�
+          'blockquote', // 寮曠敤
+          'headerSelect', // 鏍囬
+          // "header1", // 鏍囬1
+          // "header2", // 鏍囬2
+          // "header3", // 鏍囬3
+          // "header4", // 鏍囬4
+          // "header5", // 鏍囬5
+          // "todo", // 寰呭姙
+          'redo', // 閲嶅仛
+          'undo', // 鎾ら攢
+          // "enter", // 鍥炶溅
+          // "bulletedList", // 鏃犲簭鍒楄〃
+          // "numberedList", // 鏈夊簭鍒楄〃
+          // "codeSelectLang" // 閫夋嫨璇█
+          // 琛ㄦ牸鍔熻兘鍒嗙粍
+          /* {
+             key: 'table-style', // 蹇呭~锛岃浠� group 寮�澶�
+             title: '琛ㄦ牸', // 蹇呭~
+             // iconSvg: '<svg>....</svg>', // 鍙��
+             menuKeys: [
+               "insertTable", // 鎻掑叆琛ㄦ牸
+               "deleteTable", // 鍒犻櫎琛ㄦ牸
+               "insertTableRow", // 鎻掑叆琛�
+               "deleteTableRow", // 鍒犻櫎琛�
+               "insertTableCol", // 鎻掑叆鍒�
+               "deleteTableCol", // 鍒犻櫎鍒�
+               "tableHeader", // 琛ㄥご
+               "tableFullWidth", // 瀹藉害鑷�傚簲
+             ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+           }, */
+          // 涓婁紶鍥剧墖鍒嗙粍
+          {
+            key: 'img-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '鍥剧墖', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              'uploadImage', // 涓婁紶鍥剧墖
+              'insertImage', // 缃戠粶鍥剧墖
+              'deleteImage', // 鍒犻櫎鍥剧墖
+              'editImage', // 缂栬緫鍥剧墖
+              'imageWidth30', // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮30
+              'imageWidth50', // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮50
+              'imageWidth100' // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮100
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+          },
+          // 瑙嗛鍒嗙粍
+          {
+            key: 'video-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '瑙嗛', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              'insertVideo', // 鎻掑叆缃戠粶瑙嗛
+              'uploadVideo', // 涓婁紶瑙嗛
+              'editVideoSize' // 淇敼瑙嗛灏哄
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+          },
+          'fullScreen' // 鍏ㄥ睆
+        ],
+        excludeKeys: [ // 闅愯棌鎸囧畾鐨勮彍鍗曢」
+          // 'headerSelect',
+          // 'video-style'
+          // 鎺掗櫎鑿滃崟缁勶紝鍐欒彍鍗曠粍 key 鐨勫�煎嵆鍙�
+        ]
+
+      },
+      editorConfig: { // 缂栬緫鍣ㄩ厤缃�
+        placeholder: '璇疯緭鍏ュ唴瀹�...',
+        readOnly: this.readonly, // 鏄惁鍙锛岄粯璁alse
+        autoFocus: false, // 鏄惁鑷姩focus锛岄粯璁や负true
+        scroll: true, // 閰嶇疆缂栬緫鍣ㄦ槸鍚︽敮鎸佹粴鍔紝榛樿涓� true 銆傛敞鎰忥紝姝ゆ椂涓嶈鍥哄畾 editor-container 鐨勯珮搴︼紝璁剧疆涓�涓� min-height 鍗冲彲銆�
+        maxLength: 20000, // 鏈�澶ч檺鍒讹紝閬垮厤鍐呭杩囧鍗¢】
+        MENU_CONF: {
+          // 鍥剧墖涓婁紶
+          uploadImage: {
+            server: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload?folder=richeditor',
+            fieldName: 'file',
+            // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 2M
+            maxFileSize: 10 * 1024 * 1024, // 10M
+            // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 100
+            maxNumberOfFiles: 10,
+            // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['image/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+            allowedFileTypes: ['image/*'],
+            // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
+            meta: {
+            },
+            // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+            metaWithUrl: false,
+            // 鑷畾涔夊鍔� http  header
+            // headers: { Authorization: "Bearer " + getToken() },
+            // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+            withCredentials: true,
+            // 瓒呮椂鏃堕棿锛岄粯璁や负 10 绉�
+            timeout: 10 * 1000, // 10 绉�
+            // 涓婁紶鍓�
+            onBeforeUpload (files) {
+              loadingInstance = Loading.service({
+                lock: true,
+                text: '涓婁紶涓�...',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+              })
+              return files
+            },
+            // 鑷畾涔夋彃鍏ュ浘鐗�
+            customInsert (res, insertFn) {
+              console.log(res)
+              // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊
+              // 鍏堝叧闂瓑寰呯殑Message
+              loadingInstance = Loading.service({
+                lock: true,
+                text: '涓婁紶涓�...',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+              }).close()
+              if (res.code === 200) {
+                // Message.success({
+                //     message: `${res.data.originalName} 涓婁紶鎴愬姛`
+                // });
+              } else {
+                // Message.error({
+                //     message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+                // });
+              }
+              insertFn(res.data.url, res.data.originname, res.data.imgname)
+            },
+
+            // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
+            onSuccess (file, res) {
+              console.log(`${file.originalFilename} 涓婁紶鎴愬姛`, res)
+            },
+            // 鍗曚釜鏂囦欢涓婁紶澶辫触
+            onFailed (file, res) {
+              console.log(`${file.originalFilename} 涓婁紶澶辫触`, res)
+              loadingInstance.close()
+            },
+            // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+            onProgress (progress) {
+              console.log('progress', progress)
+              // progress 鏄� 0-100 鐨勬暟瀛�
+            },
+            // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
+            onError (file, err, res) {
+              loadingInstance.close()
+              console.log(`${file.originalFilename} 涓婁紶鍑洪敊`, err, res)
+            }
+          },
+          // 瑙嗛涓婁紶
+          uploadVideo: {
+            fieldName: 'file',
+            server: process.env.VUE_APP_API_PREFIX + '/public/upload?folder=richeditor',
+            // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 10M
+            maxFileSize: 50 * 1024 * 1024, // 50M
+            // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 5
+            maxNumberOfFiles: 3,
+            // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['video/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+            allowedFileTypes: ['video/*'],
+            // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
+            meta: {
+              // token: 'xxx',
+              // otherKey: 'yyy'
+            },
+            // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+            metaWithUrl: false,
+
+            // 鑷畾涔夊鍔� http  header
+            headers: {
+              // Authorization: "Bearer " + getToken()
+              // otherKey: 'xxx'
+            },
+            // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+            withCredentials: true,
+            // 瓒呮椂鏃堕棿锛岄粯璁や负 30 绉�
+            timeout: 1000 * 1000, // 1000 绉�,
+            // 涓婁紶涔嬪墠瑙﹀彂
+            onBeforeUpload (file) {
+              return file
+            },
+            // 鑷畾涔夋彃鍏ヨ棰�
+            customInsert (res, insertFn) {
+              // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊
+              // 鍏堝叧闂瓑寰呯殑Message
+              // Message.closeAll();
+              if (res.code === 200) {
+                // Message.success({
+                //     message: `${res.data.originalName} 涓婁紶鎴愬姛`
+                // });
+              } else {
+                // Message.error({
+                //     message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+                // });
+              }
+              insertFn(res.data.url, res.data.url)
+            },
+            // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+            onProgress (progress) {
+              console.log(progress)
+              // onProgress(progress) {       // JS 璇硶
+              // progress 鏄� 0-100 鐨勬暟瀛�
+            },
+            // // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
+            // onSuccess(file, res) {
+            //   console.log(`${file.name} 涓婁紶鎴愬姛`, res);
+            //   this.successMsg(file);
+            // },
+            // // 鍗曚釜鏂囦欢涓婁紶澶辫触
+            // onFailed(file, res) {
+            //   console.log(`${file.name} 涓婁紶澶辫触`, res);
+            //   this.errorMsg(file);
+            // },
+            // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
+            onError (file, err, res) {
+              console.log(`${file.name} 涓婁紶鍑洪敊`, err, res)
+              // Notification.error({
+              //     title: '閿欒',
+              //     message: `${file.name} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+              // });
+            }
+          }
+        }
+      },
+      mode: 'default' // or 'simple'
+    }
+  },
+  watch: {
+    richData: function (value) {
+      this.html = value
+    },
+    readonly: function (value) {
+      this.readonly = value
+    },
+    styleEditor: function (value) {
+      this.styleEditor = value
+    }
+  },
+  mounted () {
+    // 闇�瑕佸湪缂栬緫鍣ㄥ垱寤哄畬姣曞悗鍦ㄨ祴鍊�
+    this.$nextTick(() => {
+      this.html = this.richData
+    })
+  },
+  methods: {
+    // 缂栬緫鍣ㄥ垱寤哄畬姣曟椂鐨勫洖璋冨嚱鏁�
+    onCreated (editor) {
+      this.editor = Object.seal(editor) // 涓�瀹氳鐢� Object.seal() 锛屽惁鍒欎細鎶ラ敊
+    },
+    // 缂栬緫鍣ㄥ唴瀹广�侀�夊尯鍙樺寲鏃剁殑鍥炶皟鍑芥暟
+    onChange (editor) {
+      this.$emit('getWangedditor', editor.getHtml())
+      console.log('onChange', editor.getHtml()) // onChange 鏃惰幏鍙栫紪杈戝櫒鏈�鏂板唴瀹�
+    }
+  },
+  beforeDestroy () {
+    // 缂栬緫鍣ㄩ攢姣佹椂鐨勫洖璋冨嚱鏁般�傝皟鐢� editor.destroy() 鍗冲彲閿�姣佺紪杈戝櫒
+    const editor = this.editor
+    if (editor == null) return
+    editor.destroy() // 缁勪欢閿�姣佹椂锛屽強鏃堕攢姣佺紪杈戝櫒
+  }
+})
+</script>
+<style lang="scss">
+</style>>
diff --git a/admin/src/components/common/Tree.vue b/admin/src/components/common/Tree.vue
new file mode 100644
index 0000000..5d6fd7b
--- /dev/null
+++ b/admin/src/components/common/Tree.vue
@@ -0,0 +1,154 @@
+<template>
+    <div class="tree">
+        <div v-for="(item, index) of list" :key="index" @click.stop="clickIten(item)">
+            <div class="tree_item">
+                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item.fsStatus === 1 }" v-show="item.fsStatus === 1 && item.childList.length > 0"></i>
+                <i class="el-icon-caret-right color" v-show="item.childList.length > 0 && (item.fsStatus === 0 || !item.fsStatus)"></i>
+                <div class="tree_item_label long-title-style" :title="item.name" :class="{ 'activeColor': item.fsDate === 1 && item.childList.length === 0 }">{{ item.name }}</div>
+                <!--                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item[defaultProps.status] }" v-show="item[defaultProps.status] && item[defaultProps.children]"></i>-->
+<!--                <i class="el-icon-caret-right color" v-show="item[defaultProps.children] && !item[defaultProps.status]"></i>-->
+<!--                <div class="tree_item_label long-title-style" :title="item[defaultProps.name]" :class="{ 'activeColor': item[defaultProps.status] && !item[defaultProps.children] }">{{ item[defaultProps.name] }}</div>-->
+            </div>
+            <div class="tree_childern" v-show="item.fsStatus === 1">
+                <tree
+                  :list="item.childList"
+                  :defaultProps="defaultProps"
+                  @callback="callback"
+                />
+                 <!-- @callback="callback" -->
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// import Bus from '@/utils/eventBus'
+export default {
+  name: 'tree',
+  props: {
+    list: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    defaultProps: {
+      type: Object,
+      require: false,
+      default: () => {
+        return {
+          name: 'name',
+          status: 'status',
+          children: 'children',
+          id: 'id',
+          erpId: 'erpId'
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      tempItem: {
+        id: null,
+        name: null,
+        erpId: null
+      }
+    }
+  },
+  methods: {
+    // 鐐瑰嚮褰撳墠椤�
+    clickIten (item) {
+      // item[this.defaultProps.status] = !item[this.defaultProps.status]
+      // this.list.forEach(subItem => {
+      //   if ((subItem[this.defaultProps.id] !== item[this.defaultProps.id] && subItem[this.defaultProps.status]) || (this.list.length === 1 && subItem[this.defaultProps.status] === false)) {
+      //     subItem[this.defaultProps.status] = false
+      //     if (subItem[this.defaultProps.children]) {
+      //       this.recursion(subItem[this.defaultProps.children])
+      //     }
+      //   }
+      // })
+      // if (this.tempItem['id'] === item[this.defaultProps.id]) {
+      //   this.tempItem = {
+      //     id: null,
+      //     name: null,
+      //     erpId: null
+      //   }
+      // } else {
+      //   this.tempItem.id = item[this.defaultProps.id]
+      //   this.tempItem.name = item[this.defaultProps.name]
+      //   this.tempItem.erpId = item['erpId']
+      // }
+      // item.fsDate === 0 || !item.fsDate ? item.fsDate = 1 : item.fsDate = 0
+      const fsDate = item.fsDate === 0 || !item.fsDate ? 1 : 0
+      this.list.forEach(i => {
+        i.fsDate = 0
+      })
+      item.fsDate = fsDate
+      if (item.childList.length > 0) {
+        item.fsStatus === 0 || !item.fsStatus ? item.fsStatus = 1 : item.fsStatus = 0
+      }
+      this.$emit('callback', item, item)
+    },
+    // 閫掑綊鏂规硶
+    recursion (children) {
+      children.forEach(item => {
+        item.fsDate = 0
+        if (item.childList.length > 0) {
+          this.recursion(item.childList)
+        }
+        // item[this.defaultProps.status] = false
+        // if (item[this.defaultProps.children]) {
+        //   this.recursion(item[this.defaultProps.children])
+        // }
+      })
+    },
+    callback (data, item) {
+      if (this.tempItem.id === data.id) {
+        this.tempItem = {}
+      } else {
+        this.tempItem.id = data.id
+        this.tempItem.name = data.name
+      }
+      this.$emit('callback', data, item)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.tree {
+    /*width: 100%;*/
+    /*height: auto;*/
+    /*border-radius: 5px;*/
+    /*overflow: hidden;*/
+    /*border: 1px solid #eeeeee;*/
+    /*box-sizing: border-box;*/
+    .tree_childern {
+        margin-left: 20px;
+    }
+    .activeItem {
+        background: #F4F7FC;
+    }
+    .tree_item {
+        display: flex;
+        align-items: center;
+        height: 48px;
+        cursor: pointer;
+        padding-left: 10px;
+        .tree_item_label {
+            font-size: 14px;
+            font-weight: 400;
+            color: #333333;
+            white-space: nowrap;
+        }
+        i {
+            margin-right: 5px;
+        }
+        .color {
+            color: #999999 !important;
+        }
+        .activeColor {
+            color: #305ED5 !important;
+        }
+    }
+}
+</style>
diff --git a/admin/src/components/common/UploadAvatarImage.vue b/admin/src/components/common/UploadAvatarImage.vue
new file mode 100644
index 0000000..dfd5d22
--- /dev/null
+++ b/admin/src/components/common/UploadAvatarImage.vue
@@ -0,0 +1,141 @@
+<template>
+  <div>
+    <el-upload class="avatar-uploader" accept=".png,.jpg,.jpeg" :style="customStyle" :action="uploadImgUrl"
+      :data="uploadData" :show-file-list="false" :on-success="handleAvatarSuccess" :on-error="uploadError"
+      :before-upload="beforeAvatarUpload">
+      <img v-if="file.imgurlfull" style="width: 100%;" :src="file.imgurlfull" :style="customStyle" class="avatar">
+      <div v-else :style="customStyle">
+        <i class="el-icon-plus avatar-uploader-icon"></i>
+        <div class="tips-style">{{ tipsLabel }}</div>
+      </div>
+    </el-upload>
+  </div>
+
+</template>
+
+<script>
+import { Loading } from 'element-ui'
+export default {
+  props: {
+    file: {
+      type: Object,
+      default: () => { }
+    },
+    tipsLabel: '',
+    customStyle: {
+      type: String,
+      default: 'width: 90px; max-height: 90px;'
+    },
+    uploadData: Object
+  },
+  data() {
+    return {
+      loading: null,
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload'
+    }
+  },
+
+  methods: {
+    // 涓婁紶鍥剧墖
+    handleAvatarSuccess(res, file) {
+      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+        this.loading.close()
+      })
+      if (res.code == 200) {
+        let { data } = res
+        this.file.imgurl = data.imgaddr
+        this.file.imgurlfull = data.url
+        this.$message.success('涓婁紶鎴愬姛')
+        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
+      } else {
+        this.$message.error('涓婁紶澶辫触')
+      }
+      this.$emit('uploadEnd')
+    },
+    uploadError() {
+      this.$message.error('涓婁紶澶辫触')
+      this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂�
+        this.loading.close()
+      })
+      this.$emit('uploadEnd')
+    },
+    // // 鎷︽埅
+    beforeAvatarUpload(file) {
+      this.loading = Loading.service({
+        lock: true,
+        text: 'Loading',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      })
+      this.$emit('uploadBegin')
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+$image-width: 90px;
+
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
+
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+
+.avatar-uploader-icon {
+  line-height: 90px;
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-width;
+  text-align: center;
+}
+
+.avatar {
+  width: 90px;
+  max-height: 90px;
+  display: block;
+}
+
+.tips-style {
+  height: 13px;
+  font-size: 13px;
+  font-weight: 400;
+  color: #999999;
+  line-height: 13px;
+}
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card {
+  width: 90px !important;
+  height: 90px !important;
+}
+
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+
+.icon {
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(0%, -85%);
+}
+
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
diff --git a/admin/src/components/common/UploadAvatarVideo.vue b/admin/src/components/common/UploadAvatarVideo.vue
new file mode 100644
index 0000000..c0e43d9
--- /dev/null
+++ b/admin/src/components/common/UploadAvatarVideo.vue
@@ -0,0 +1,128 @@
+<template>
+  <div>
+    <el-upload
+      class="avatar-uploader"
+      accept=".mp4"
+      :style="customStyle"
+      :action="uploadImgUrl"
+      :data="uploadData"
+      :show-file-list="false"
+      :on-success="handleAvatarSuccess"
+      :on-error="uploadError"
+      :before-upload="beforeAvatarUpload">
+      <video v-if="file.videourlfull" :src="file.videourlfull" :style="customStyle" class="avatar" />
+      <div v-else :style="customStyle">
+        <i class="el-icon-plus avatar-uploader-icon"></i>
+        <div class="tips-style">{{ tipsLabel }}</div>
+      </div>
+    </el-upload>
+  </div>
+
+</template>
+
+<script>
+export default {
+  props: {
+    file: {
+      type: Object,
+      default: () => {}
+    },
+    tipsLabel: '',
+    customStyle: {
+      type: String,
+      default: 'width: 90px; height: 90px;'
+    },
+    uploadData: Object
+  },
+  data() {
+    return {
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload'
+    }
+  },
+
+  methods: {
+    // 涓婁紶鍥剧墖
+    handleAvatarSuccess(res, file) {
+      if (res.code == 200) {
+        let { data } = res
+        this.file.videourl = data.imgaddr;
+        this.file.videourlfull = data.url;
+        this.$message.success('涓婁紶鎴愬姛')
+        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
+      } else {
+        this.$message.error('涓婁紶澶辫触')
+      }
+      this.$emit('uploadEnd')
+    },
+    uploadError() {
+      this.$message.apiFailed('涓婁紶澶辫触')
+      this.$emit('uploadEnd')
+    },
+    // // 鎷︽埅
+    beforeAvatarUpload(file) {
+      this.$emit('uploadBegin')
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+$image-width: 100px;
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  width: $image-width;
+  height: $image-width;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  line-height: 90px;
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-width;
+  text-align: center;
+}
+.avatar {
+  width: $image-width;
+  height: $image-width;
+  display: block;
+}
+.tips-style {
+  height: 13px;
+  font-size: 13px;
+  font-weight: 400;
+  color: #999999;
+  line-height: 13px;
+}
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
+
diff --git a/admin/src/components/common/UploadFaceImg.vue b/admin/src/components/common/UploadFaceImg.vue
new file mode 100644
index 0000000..98e2dd1
--- /dev/null
+++ b/admin/src/components/common/UploadFaceImg.vue
@@ -0,0 +1,206 @@
+<template>
+  <div>
+    <el-upload
+        class="avatar-uploader"
+        accept=".png,.jpg,.jpeg"
+        :style="customStyle"
+        action=""
+        :auto-upload="false"
+        :show-file-list="false"
+        :on-change='openUpdateIcon'>
+      <img v-if=" file.imgurlfull" style="width: 100%;" :src="file.imgurlfull" :style="customStyle" class="avatar">
+      <div v-else :style="customStyle">
+        <i class="el-icon-plus avatar-uploader-icon"></i>
+        <div class="tips-style">{{ tipsLabel }}</div>
+      </div>
+    </el-upload>
+    <el-dialog
+        append-to-body
+        :close-on-click-modal="false"
+        title="涓婁紶鍥剧墖"
+        :visible.sync="updateImg"
+        width="1000px"
+        class="icon-dialog-wrapper dialong-com-style">
+      <ImageCropper ref="iconShot" v-if="updateImg" :imgSrc="img" >
+      </ImageCropper>
+      <span slot="footer" class="dialog-footer">
+            <el-button v-if="loading">鍙� 娑�</el-button>
+            <el-button v-else @click="updateImg = false">鍙� 娑�</el-button>
+            <el-button :loading="loading" type="primary" @click="uploadIcon">纭� 瀹�</el-button>
+          </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ImageCropper from '@/components/common/ImageCropper'
+import { upload } from '@/api/system/common'
+export default {
+  components: { ImageCropper },
+  props: {
+    file: {
+      type: Object,
+      default: () => {}
+    },
+    tipsLabel: '',
+    customStyle: {
+      type: String,
+      default: 'width: 90px; height: 90px;'
+    },
+    uploadData: Object
+  },
+  data () {
+    return {
+      loading: false,
+      fileInfo:{},
+      img: null,
+      updateImg: false,
+      imageSrc: null,
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload'
+    }
+  },
+
+  methods: {
+    uploadIcon () {
+      // 鑾峰彇瑁佸壀鍚庣殑鍥剧墖
+      this.$refs.iconShot.getImagecropper().getCropBlob((fileData) => { // 鑾峰彇褰撳墠瑁佸壀濂界殑鏁版嵁
+        // 娉ㄦ鏃剁殑data鏄竴涓狟lob鏁版嵁锛岄儴鍒嗘帴鍙f帴鏀剁殑鏄疐ile杞寲鐨凢ormData鏁版嵁
+        console.log(fileData)
+        const formData = new FormData()
+
+        formData.append('folder', 'member')
+        if(this.uploadData.isFace || this.uploadData.isFace == 0){
+          formData.append('isFace', 0)
+        }
+        formData.append(
+            'file',
+            new File(
+                [fileData], // 灏咮lob绫诲瀷杞寲鎴怓ile绫诲瀷
+                this.fileInfo.name, // 璁剧疆File绫诲瀷鐨勬枃浠跺悕绉�
+                { type: this.fileInfo.type } // 璁剧疆File绫诲瀷鐨勬枃浠剁被鍨�
+            )
+        )
+        this.loading = true
+        upload(formData).then(res => {
+          this.loading = false
+          console.log(res)
+          this.file.imgurl = res.imgaddr
+          this.file.imgurlfull = res.url
+          this.$message.success('涓婁紶鎴愬姛')
+          this.imageSrc = res.url
+          this.updateImg = false
+          this.$emit('uploadSuccess', { imgurl: res.imgaddr, imgurlfull: res.url, name: res.originname })
+          this.$emit('uploadEnd')
+        }, () => {
+          this.loading = false
+        })
+      })
+    },
+
+    // 涓婁紶鍥剧墖
+    openUpdateIcon (file, fileList) {
+      const isJPG = file.raw.type === 'image/jpeg' || file.raw.type === 'image/png'
+      const isLt2M = file.size / 1024 / 1024 < 5
+      if (!isJPG) {
+        this.$message.error('涓婁紶澶村儚鍥剧墖鍙兘鏄� JPG/PNG 鏍煎紡!')
+        return false
+      }
+      if (!isLt2M) {
+        this.$message.error('涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 5MB!')
+        return false
+      }
+      // 涓婁紶鎴愬姛鍚庡皢鍥剧墖鍦板潃璧嬪�肩粰瑁佸壀妗嗘樉绀哄浘鐗�
+      this.$nextTick(async () => {
+        // base64鏂瑰紡
+        // this.option.img = await fileByBase64(file.raw)
+        this.fileInfo.name = file.name
+        this.fileInfo.type = file.type
+        console.log(file, fileList)
+        this.img = URL.createObjectURL(file.raw)
+        // this.loading = false
+        this.updateImg = true
+      })
+    },
+    handleAvatarSuccess (res, file) {
+      if (res.code == 200) {
+        const { data } = res
+        this.file.imgurl = data.imgaddr
+        this.file.imgurlfull = data.url
+        this.$message.success('涓婁紶鎴愬姛')
+        this.imageSrc = data.url
+        this.updateImg = true
+        // this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
+      } else {
+        this.$message.error('涓婁紶澶辫触')
+      }
+      this.$emit('uploadEnd')
+    },
+    uploadError () {
+      this.$message.error('涓婁紶澶辫触')
+      this.$emit('uploadEnd')
+    },
+    // // 鎷︽埅
+    beforeAvatarUpload (file) {
+      this.$emit('uploadBegin')
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+$image-width: 90px;
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  line-height: 90px;
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-width;
+  text-align: center;
+}
+.avatar {
+  width: 100% !important;
+  height: auto !important;
+  display: block;
+}
+.tips-style {
+  height: 13px;
+  font-size: 13px;
+  font-weight: 400;
+  color: #999999;
+  line-height: 13px;
+}
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
diff --git a/admin/src/components/common/UploadFile.vue b/admin/src/components/common/UploadFile.vue
new file mode 100644
index 0000000..7dcad1f
--- /dev/null
+++ b/admin/src/components/common/UploadFile.vue
@@ -0,0 +1,123 @@
+<template>
+  <div>
+    <el-upload
+      class="upload-demo"
+      :accept="uploadData.fileTyp"
+      :action="uploadImgUrl"
+      :limit="1"
+      :on-exceed="handleExceed"
+      :on-success="handleFileSuccess"
+      :on-error="uploadError"
+      :before-upload="beforeFileUpload"
+      :file-list="fileList">
+    <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+    <div slot="tip" class="el-upload__tip">鍙兘涓婁紶{{ uploadData.fileType }}鏂囦欢锛屼笖涓嶈秴杩�5mb</div>
+  </el-upload>
+  </div>
+
+</template>
+
+<script>
+export default {
+  props: {
+    file: {
+      type: Object,
+      default: () => {}
+    },
+    tipsLabel: '',
+    customStyle: {
+      type: String,
+    default: 'width: 190px; height: 190px;'
+    },
+    uploadData: Object
+  },
+  data() {
+    return {
+      fileList:null,
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload?folder='+this.uploadData.folder
+    }
+  },
+
+  methods: {
+    // 涓婁紶鍥剧墖
+    handleExceed(){},
+    handleFileSuccess(res, file) {
+      if (res.code == 200) {
+        let { data } = res
+        // this.fileList = [{name: data.originname, url: data.url }]
+        this.$message.success('涓婁紶鎴愬姛')
+        this.$emit('uploadSuccess', { fileurl: data.imgaddr, fileurlFull: data.url, name: data.originname })
+      } else {
+        this.$message.error('涓婁紶澶辫触')
+      }
+      this.$emit('uploadEnd')
+    },
+    uploadError() {
+      this.$message.error('涓婁紶澶辫触')
+      this.$emit('uploadEnd')
+    },
+    // // 鎷︽埅
+    beforeFileUpload(file) {
+      this.$emit('uploadBegin')
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+$image-width: 100px;
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  width: $image-width;
+  height: $image-width;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  line-height: 90px;
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-width;
+  text-align: center;
+}
+.avatar {
+  width: $image-width;
+  height: $image-width;
+  display: block;
+}
+.tips-style {
+  height: 13px;
+  font-size: 13px;
+  font-weight: 400;
+  color: #999999;
+  line-height: 13px;
+}
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 80% !important;
+  height: 50px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+
+</style>
+
diff --git a/admin/src/components/common/UploadFileCommon.vue b/admin/src/components/common/UploadFileCommon.vue
new file mode 100644
index 0000000..db8be23
--- /dev/null
+++ b/admin/src/components/common/UploadFileCommon.vue
@@ -0,0 +1,150 @@
+<template>
+  <div>
+    <el-upload
+      class="avatar-uploader"
+      :accept="uploadData.fileTyp"
+      :style="customStyle"
+      :action="uploadImgUrl"
+      :file="file1"
+      :data="uploadData"
+      :limit="1"
+      :show-file-list="false"
+      :on-success="handleSuccess"
+      :on-error="uploadError"
+      :before-upload="beforeAvatarUpload">
+      <img v-if="file.fileType==0 && file.fileUrlFull" :src="file.fileUrlFull" style="width: 90px;height: 90px" class="avatar">
+      <video v-if="file.fileType==1 &&file.fileUrlFull" :src="file.fileUrlFull" style="width: 90px;height: 90px" class="avatar" />
+      <span v-if="file.fileType==2 &&file.fileUrlFull"  style="width: 90px;height: 90px" class="avatar" >{{file.fileName}}</span>
+      <div class="desc_data_list_item_img" style="cursor: pointer; background: #8c939d;">
+          <i  class="el-icon-plus"></i>
+      </div>
+    </el-upload>
+  </div>
+
+</template>
+
+<script>
+export default {
+  props: {
+    file: {
+      type: Object,
+      default: () => {}
+    },
+    tipsLabel: '',
+    customStyle: {
+      type: String,
+      default: 'width: 90px; height: 90px;'
+    },
+    uploadData: Object
+  },
+  data() {
+    return {
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload'
+    }
+  },
+
+  methods: {
+    // 涓婁紶鍥剧墖
+    handleSuccess(res, file) {
+      if (res.code == 200) {
+        let { data } = res
+        this.file.fileUrl = data.imgaddr
+        this.file.fileType = data.type
+        this.file.fileName= data.originname
+        this.file.fileUrlFull = data.url
+        this.$message.success('涓婁紶鎴愬姛')
+        this.$emit('uploadSuccess', { fileurl: data.imgaddr, fileUrlFull: data.url, name: data.originname })
+      } else {
+        this.$message.error('涓婁紶澶辫触')
+      }
+      this.$emit('uploadEnd')
+    },
+    uploadError() {
+      this.$message.error('涓婁紶澶辫触')
+      this.$emit('uploadEnd')
+    },
+    // // 鎷︽埅
+    beforeAvatarUpload(file) {
+      this.$emit('uploadBegin')
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.desc_data_list_item_img {
+  flex-shrink: 0;
+  width: 80px;
+  height: 80px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  overflow: hidden;
+  .el-icon-plus {
+    font-size: 26px;
+    color: #ffffff;
+  }
+  img {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+$image-width: 100px;
+.avatar-uploader {
+  width: $image-width;
+  height: $image-width;
+}
+::v-deep .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  width: $image-width;
+  height: $image-width;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  line-height: 90px;
+  font-size: 28px;
+  color: #8c939d;
+  width: $image-width;
+  height: $image-width;
+  text-align: center;
+}
+.avatar {
+  width: $image-width;
+  height: $image-width;
+  display: block;
+}
+.tips-style {
+  height: 13px;
+  font-size: 13px;
+  font-weight: 400;
+  color: #999999;
+  line-height: 13px;
+}
+</style>
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
diff --git a/admin/src/components/common/UploadImage.vue b/admin/src/components/common/UploadImage.vue
new file mode 100644
index 0000000..c0bb2bb
--- /dev/null
+++ b/admin/src/components/common/UploadImage.vue
@@ -0,0 +1,155 @@
+<template>
+  <div>
+    <el-upload
+      :action="uploadImgUrl"
+      :data="uploadData"
+      list-type="picture-card"
+      :file-list="fileList"
+      accept=".jpg,.png"
+      :before-upload="beforeUpload"
+      :on-success="uploadSuccess"
+      :on-error="fail"
+    >
+      <i class="el-icon-plus icon"></i>
+      <div slot="file" slot-scope="{file}">
+        <img
+          class="el-upload-list__item-thumbnail"
+          :src="file.url" alt=""
+          style="width: 100px;height: 100px;"
+        >
+        <span class="el-upload-list__item-actions">
+          <span
+            class="el-upload-list__item-preview"
+            @click="handlePictureCardPreview(file)"
+          >
+            <i class="el-icon-zoom-in"></i>
+          </span>
+          <span
+            class="el-upload-list__item-delete"
+            @click="handleRemove(file)"
+          >
+            <i class="el-icon-delete"></i>
+          </span>
+        </span>
+      </div>
+    </el-upload>
+    <el-image-viewer
+      v-if="showViewer"
+      :on-close="closeViewer"
+      :initialIndex="tempIndex"
+      :url-list="srcList"
+      :z-index="3000"
+    />
+  </div>
+
+</template>
+
+<script>
+import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
+export default {
+  components: {
+    ElImageViewer
+  },
+  props: {
+    fileList: {
+      type: Array,
+      default: () => []
+    },
+    uploadData: Object,
+  },
+  data() {
+    return {
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadLocal',
+
+      realList: [],
+      srcList: [],
+      tempIndex: 0,
+      showViewer: false,
+    }
+  },
+  watch: {
+    fileList: {
+      handler(val) {
+        console.log(val);
+        if (val.length==0) {
+          this.realList = []
+          this.srcList = []
+        }
+      }
+
+    }
+  },
+  methods: {
+    beforeUpload(file) {
+
+      this.$emit('beginUpload')
+      return true
+    },
+     // 涓婁紶鍥剧墖鎴愬姛
+     uploadSuccess (res, file, fileList) {
+      // console.log('this.fileList', this.fileList);
+      // console.log('fileList', fileList);
+      this.$emit('uploadEnd')
+      this.realList = fileList
+      this.srcList.push(res.data.url)
+      // console.log('file', file);
+      if (res.code === 200) {
+        this.fileList.push(
+          {
+            fileurl: res.data.imgaddr,
+            name: res.data.originname,
+            url: res.data.url
+          }
+        )
+      } else {
+        this.$message.error(res.msg || '涓婁紶澶辫触')
+      }
+    },
+    fail (err, file, fileList) {
+      this.$emit('uploadEnd')
+      this.$message.error('涓婁紶澶辫触')
+    },
+    handlePictureCardPreview(file) {
+      // this.tempIndex = this.srcList.findIndex(item => item == file.response.data.url )
+      // console.log(file);
+      this.tempIndex = this.fileList.findIndex(item => item.url == file.url )
+      // console.log( this.tempIndex);
+      this.srcList = this.fileList.map(item => item.url)
+      this.showViewer = true
+    },
+    closeViewer() {
+      this.showViewer = false
+    },
+    handleRemove(file) {
+      console.log(this.fileList);
+      let tempIndex = this.realList.findIndex(item => item.url === file.url)
+      // debugger
+      this.realList.splice(tempIndex, 1)
+      this.fileList.splice(tempIndex, 1)
+      this.srcList.splice(tempIndex, 1)
+
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-upload--picture-card{
+  width: 90px !important;
+  height: 90px !important;
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+.icon {
+  -webkit-transform: translate(-50%,-50%);
+  -ms-transform: translate(-50%,-50%);
+  transform: translate(0%, -85%);
+}
+::v-deep .el-upload-list__item {
+  width: 90px !important;
+  height: 90px !important;
+}
+</style>
+
diff --git a/admin/src/components/common/upload.vue b/admin/src/components/common/upload.vue
new file mode 100644
index 0000000..ccde115
--- /dev/null
+++ b/admin/src/components/common/upload.vue
@@ -0,0 +1,146 @@
+<template>
+    <div class="file">
+        <div class="file_list">
+            <div class="file_list_item" :style="{width: width, height: height}" v-for="(item, index) in list" :key="index">
+                <div class="dele" @click="deleItem(index)">
+                    <i class="el-icon-close"></i>
+                </div>
+                <img :src="item.url" v-if="fileType(item.url) === 'img'" />
+                <video controls autoplay :src="item.url" v-else></video>
+            </div>
+          <div class="file_list_item" :style="{width: width, height: height, cursor: 'pointer'}" @click="$refs.file.click()">
+            <i class="el-icon-plus" style="font-size: 18px;color: #8c939d;text-align: center;margin-top: 10px"></i>
+            <i style="font-size: 12px;color: #8c939d;font-style: normal;text-align: center">{{tips}}</i>
+          </div>
+          <input type="file" ref="file" :accept="accept" @change="getFile" />
+        </div>
+    </div>
+</template>
+
+<script>
+import axios from 'axios'
+export default {
+  props: {
+    width: {
+      type: String,
+      default: '90px'
+    },
+    height: {
+      type: String,
+      default: '90px'
+    },
+    list: {
+      type: Array,
+      default: []
+    },
+    tips: {
+      type: String,
+      default: '0'
+    },
+    accept: {
+      type: String,
+      default: ''
+    },
+    folder: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload'
+    }
+  },
+
+  methods: {
+    fileType (url) {
+      if (url.indexOf('.mp4') !== -1) {
+        return 'video'
+      } else {
+        return 'img'
+      }
+    },
+    getFile (e) {
+      if (e.target && e.target.files.length > 0) {
+        this.$emit('loading')
+        const formdate = new FormData()
+        formdate.append('file', e.target.files[0])
+        formdate.append('folder', this.folder)
+        axios.post(this.uploadImgUrl, formdate)
+          .then(res => {
+            this.$emit('success', res.data.data)
+            console.log(res.data.data)
+          })
+          .catch(e => {
+          })
+          .finally(() => {
+            this.$refs.file.value = null
+          })
+      }
+    },
+    deleItem (index) {
+      this.$emit('dele', index)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .file {
+        /*width: 100%;*/
+        /*height: 90px;*/
+        margin: 10px 0;
+        input {
+            opacity: 0;
+        }
+        .file_list {
+            width: 100%;
+            height: 100%;
+            display: flex;
+            align-items: center;
+            flex-wrap: wrap;
+            .file_list_item {
+                display: flex;
+                flex-direction: column;
+                align-items: center;
+                justify-content: center;
+                overflow: hidden;
+                border-radius: 5px;
+                border: 1px solid #d5d5d5;
+                margin: 5px;
+                position: relative;
+                &:first-child {
+                    margin: 0 !important;
+                }
+                .dele {
+                    position: absolute;
+                    right: 0;
+                    top: 0;
+                    width: 20px;
+                    height: 20px;
+                    background: red;
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                    z-index: 10000;
+                    cursor: pointer;
+                    .el-icon-close {
+                        color: #ffffff;
+                        font-size: 14px;
+                    }
+                }
+                .el-icon-plus {
+                    font-size: 30px;
+                    color: black;
+                }
+                img {
+                    width: 100%;
+                }
+                video {
+                    width: 100%;
+                    height: 100%;
+                }
+            }
+        }
+    }
+</style>
diff --git a/admin/src/components/system/dict/DictDataManagerWindow.vue b/admin/src/components/system/dict/DictDataManagerWindow.vue
index 1182f69..5fb62d7 100644
--- a/admin/src/components/system/dict/DictDataManagerWindow.vue
+++ b/admin/src/components/system/dict/DictDataManagerWindow.vue
@@ -21,8 +21,16 @@
           @selection-change="handleSelectionChange"
         >
           <el-table-column type="selection" width="55"></el-table-column>
-          <el-table-column prop="label" label="鏁版嵁鏍囩" min-width="100px"></el-table-column>
-          <el-table-column prop="code" label="鏁版嵁鍊�" min-width="100px"></el-table-column>
+          <el-table-column prop="remark" label="鏁版嵁璇存槑" min-width="130px"></el-table-column>
+          <el-table-column prop="label" label="鏁版嵁鏍囩" min-width="130px"></el-table-column>
+          <el-table-column prop="code" label="鏁版嵁鍊�" min-width="100px">
+            <template slot-scope="{row}">
+              <div v-if="row.code && row.code.length>20" :title="row.code">
+                <el-button type="text" @click="showCode(row)" >鐐瑰嚮鏌ョ湅</el-button>
+              </div>
+              <div v-else>{{row.code}}</div>
+            </template>
+          </el-table-column>
           <el-table-column prop="disabled" label="鐘舵��" min-width="100px">
             <template slot-scope="{row}">{{row.disabled | disabledText}}</template>
           </el-table-column>
@@ -53,6 +61,21 @@
       </template>
       <!-- 鏂板缓/淇敼 -->
       <OperaDictDataWindow ref="operaDictDataWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
+      <el-dialog
+          class="center-title"
+          title="瀛楀吀鍊�"
+          width="70%"
+          height="70%"
+          text="瀛楀吀鍊�"
+          :visible.sync="visible1"
+          append-to-body
+      >
+        <div class="agree-list"  v-html="agreement">
+        </div>
+        <template  v-slot:footer>
+          <el-button @click="visible1=false">杩斿洖</el-button>
+        </template>
+      </el-dialog>
     </TableLayout>
   </GlobalWindow>
 </template>
@@ -70,6 +93,8 @@
   data () {
     return {
       visible: false,
+      visible1: false,
+      agreement: '',
       searchForm: {
         // 瀛楀吀ID
         dictId: null
@@ -83,6 +108,10 @@
     }
   },
   methods: {
+    showCode(row){
+      this.agreement=row.code
+      this.visible1=true
+    },
     /**
      * 鎵撳紑绐楀彛
      *
diff --git a/admin/src/components/system/dict/OperaDictDataWindow.vue b/admin/src/components/system/dict/OperaDictDataWindow.vue
index e6ce834..3681a95 100644
--- a/admin/src/components/system/dict/OperaDictDataWindow.vue
+++ b/admin/src/components/system/dict/OperaDictDataWindow.vue
@@ -1,16 +1,24 @@
 <template>
   <GlobalWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking.create"
-    @confirm="confirm"
+      :title="title"
+      :visible.sync="visible"
+      :confirm-working="isWorking.create"
+      @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鏁版嵁璇存槑" prop="label" required>
+        <el-input v-model="form.remark" placeholder="璇疯緭鍏ユ暟鎹鏄�" v-trim/>
+      </el-form-item>
       <el-form-item label="鏁版嵁鏍囩" prop="label" required>
-        <el-input v-model="form.label" placeholder="璇疯緭鍏ユ暟鎹爣绛�" v-trim maxlength="50"/>
+        <el-input v-model="form.label" placeholder="璇疯緭鍏ユ暟鎹爣绛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏄惁瀵屾枃鏈�" prop="istext" >
+        <el-switch v-model="form.istext" :active-value="true" :inactive-value="false"/>
+        <span class="status-text">{{form.istext | disabledText1}}</span>
       </el-form-item>
       <el-form-item label="鏁版嵁鍊�" prop="code" required>
-        <el-input v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim maxlength="50"/>
+        <el-input v-if="!form.istext" v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim/>
+        <RichEditor v-else  :richData="form.code" :styleEditor="styleEditor" @getWangedditor="getWangedditor" :readonly="false"/>
       </el-form-item>
       <el-form-item label="鐘舵��" prop="disabled" required class="form-item-status">
         <el-switch v-model="form.disabled" :active-value="false" :inactive-value="true"/>
@@ -23,19 +31,23 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import RichEditor from '@/components/common/RichEditor'
 export default {
   name: 'OperaDictDataWindow',
   extends: BaseOpera,
-  components: { GlobalWindow },
+  components: { GlobalWindow,RichEditor },
   data () {
     return {
       // 琛ㄥ崟鏁版嵁
+      styleEditor:'border: 1px solid #ccc;display: inline-block;',
       form: {
         id: null,
         dictId: null,
         code: '',
         label: '',
-        disabled: false
+        disabled: false,
+        istext: false,
+        remark:''
       },
       // 楠岃瘉瑙勫垯
       rules: {
@@ -49,12 +61,13 @@
     }
   },
   methods: {
+    getWangedditor(val){
+      this.form.code =val
+    },
     /**
-     * 鎵撳紑绐楀彛
-     *
-     * @param title 绐楀彛鏍囬
-     * @param dictId 鎵�灞炲瓧鍏窱D
-     * @param target 琛屽璞★紙浠呯紪杈戦渶璇ュ弬鏁帮級
+     * @title 绐楀彛鏍囬
+     * @dict 鎵�灞炲瓧鍏窱D
+     * @target 缂栬緫鐨勫瓧鍏告暟鎹璞�
      */
     open (title, dictId, target) {
       this.title = title
@@ -65,6 +78,7 @@
           this.$refs.form.resetFields()
           this.form.id = null
           this.form.dictId = dictId
+          this.form.istext=false
         })
         return
       }
@@ -72,6 +86,8 @@
       this.$nextTick(() => {
         for (const key in this.form) {
           this.form[key] = target[key]
+          this.form.dictId = dictId
+          this.form.istext=false
         }
       })
     }
@@ -86,9 +102,6 @@
 
 <style scoped lang="scss">
 .form-item-status {
-  .el-form-item__content > * {
-    width: auto !important;
-  }
   .status-text {
     color: #999;
     margin-left: 6px;
diff --git a/admin/src/filters/index.js b/admin/src/filters/index.js
index 99c0ac2..c5f193c 100644
--- a/admin/src/filters/index.js
+++ b/admin/src/filters/index.js
@@ -22,5 +22,11 @@
     Vue.filter('disabledText', value => {
       return value ? '绂佺敤' : '鍚敤'
     })
+    Vue.filter('disabledText1', (value) => {
+      if (value) {
+        return '鏅�氭枃鏈�'
+      }
+      return '瀵屾枃鏈�'
+    })
   }
 }
diff --git a/admin/src/layouts/TableLayout1.vue b/admin/src/layouts/TableLayout1.vue
new file mode 100644
index 0000000..aaee5ed
--- /dev/null
+++ b/admin/src/layouts/TableLayout1.vue
@@ -0,0 +1,175 @@
+<template>
+    <div class="table-layout">
+        <!-- 澶撮儴 -->
+<!--        <div v-if="withBreadcrumb" class="table-header">
+            <el-breadcrumb separator="/">
+                <el-breadcrumb-item v-for="path in paths" :key="path">{{path}}</el-breadcrumb-item>
+            </el-breadcrumb>
+        </div>-->
+        <Profile :roles="roles" :permissions="permissions">
+            <div style="width: 100%; height: 100%; padding: 0 16px; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between;">
+                <div style="width: 240px; height: 100%; flex-shrink: 0; background: #ffffff;">
+                    <slot name="menu"></slot>
+                </div>
+                <div style="width: calc(100% - 250px); height: 100%">
+                    <!-- 鎼滅储琛ㄥ崟閮ㄥ垎 -->
+                    <div class="table-search-form" style="padding: 0 !important;">
+                        <div class="form-wrap">
+                            <slot name="search-form"></slot>
+                        </div>
+                    </div>
+                    <slot name="space"></slot>
+                    <!-- 鍒楄〃鍜屽垎椤甸儴鍒� -->
+                    <div class="table-content" style="padding: 0 !important;">
+                        <div class="table-wrap">
+                            <slot name="table-wrap"></slot>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </Profile>
+    </div>
+</template>
+
+<script>
+import Profile from '../components/common/Profile'
+export default {
+  name: 'TableLayout1',
+  components: { Profile },
+  props: {
+    // 瑙掕壊
+    roles: {
+      type: Array
+    },
+    // 鏉冮檺
+    permissions: {
+      type: Array
+    },
+    // 鏄惁灞曠ず澶撮儴闈㈠寘灞�
+    withBreadcrumb: {
+      type: Boolean,
+      default: true
+    }
+  },
+  computed: {
+    paths () {
+      return this.$route.meta.paths
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+    @import "@/assets/style/variables.scss";
+    .table-layout {
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        .not-allow-wrap {
+            padding-top: 0;
+        }
+    }
+    // 澶撮儴
+    .table-header {
+        overflow: hidden;
+        padding: 12px 16px;
+        flex-shrink: 0;
+        // 椤甸潰璺緞
+        .el-breadcrumb {
+            .el-breadcrumb__item {
+                .el-breadcrumb__inner {
+                    color: #ABB2BE;
+                    font-size: 12px;
+                }
+                &:last-of-type .el-breadcrumb__inner {
+                    color: #606263;
+                    font-size: 14px;
+                }
+            }
+        }
+    }
+    // 鎼滅储
+    .table-search-form {
+        display: flex;
+        flex-wrap: wrap;
+        /*padding: 0 16px;*/
+        /*box-sizing: border-box;*/
+        .form-wrap {
+            padding: 16px 16px 0 16px;
+            width: 100%;
+            background: #fff;
+            &:empty {
+                padding: 0;
+            }
+        }
+        section {
+            display: inline-block;
+            margin-left: 16px;
+            margin-bottom: 18px;
+        }
+    }
+    // 鍒楄〃鍜屽垎椤�
+    .table-content {
+        /*padding: 0 16px;*/
+        .table-wrap {
+            padding: 16px 16px 60px 16px;
+            background: #fff;
+            // 宸ュ叿鏍�
+            .toolbar {
+                border-bottom: 1px solid #eee;
+                padding-bottom: 10px;
+                li {
+                    display: inline-block;
+                    margin-right: 6px;
+                }
+            }
+            // 琛ㄦ牸
+            .el-table {
+                th {
+                    .cell {
+                        color: #666;
+                    }
+                }
+                // 澶嶉�夋鍒�
+                .el-table-column--selection {
+                    .cell {
+                        text-align: center !important;
+                    }
+                }
+                // 澶氬�煎瓧娈�
+                .table-column-strings {
+                    ul {
+                        li {
+                            display: inline-block;
+                            background: #eee;
+                            border-radius: 3px;
+                            padding: 0 3px;
+                            margin-right: 3px;
+                            margin-bottom: 3px;
+                        }
+                    }
+                }
+                // 鏍戣瑙夎皟鏁�
+                [class*=el-table__row--level] .el-table__expand-icon {
+                    position: relative;
+                    left: -6px;
+                    margin-right: 0;
+                }
+            }
+            // 鍒嗛〉
+            .table-pagination {
+              margin-left: 0px;
+              padding: 16px 0px ;
+              text-align: left;
+              display: block;
+              z-index: 100;
+              width: -webkit-fill-available;
+              /* width: 80%; */
+               position: fixed;
+              bottom: 0px;
+              background-color: white;
+              margin-right: 50px;
+            }
+        }
+    }
+</style>
diff --git a/admin/src/plugins/download.js b/admin/src/plugins/download.js
index f4c5876..b6ee316 100644
--- a/admin/src/plugins/download.js
+++ b/admin/src/plugins/download.js
@@ -16,6 +16,6 @@
     message.error('鏃犳硶涓嬭浇鏂囦欢锛屽彲鑳藉洜涓烘暟鎹鐞嗛敊璇鑷存枃浠跺ぇ灏忎负0B')
     return
   }
-  // 涓嬭浇鎺ュ彛鍦ㄥ搷搴斿ごeva-download-filename涓瓨鏀炬枃浠跺悕绉帮紝鎺ュ彛鐨勮繑鍥炵殑鏂囦欢鍚嶇О闇�閲囩敤url encode鐨勬柟寮忚繘琛岀紪鐮�
-  fileDownload(response.data, decode ? decodeURI(response.headers['eva-download-filename']) : response.headers['eva-download-filename'], mime)
+  // 涓嬭浇鎺ュ彛鍦ㄥ搷搴斿ごdoumee-download-filename涓瓨鏀炬枃浠跺悕绉帮紝鎺ュ彛鐨勮繑鍥炵殑鏂囦欢鍚嶇О闇�閲囩敤url encode鐨勬柟寮忚繘琛岀紪鐮�
+  fileDownload(response.data, decode ? decodeURI(response.headers['doumee-download-filename']) : response.headers['doumee-download-filename'], mime)
 }
diff --git a/admin/src/plugins/messagebox.js b/admin/src/plugins/messagebox.js
index 1d23e9b..f0df75d 100644
--- a/admin/src/plugins/messagebox.js
+++ b/admin/src/plugins/messagebox.js
@@ -58,5 +58,12 @@
       closeOnPressEscape: false,
       type: 'warning'
     })
-  }
+  },
+  actionConfirm (message, title) {
+    return MessageBox.confirm(message, title, {
+      confirmButtonText: '纭',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    })
+  },
 }
diff --git a/admin/src/utils/request/index.js b/admin/src/utils/request/index.js
index 5462e2e..7e24176 100644
--- a/admin/src/utils/request/index.js
+++ b/admin/src/utils/request/index.js
@@ -28,11 +28,11 @@
     config.responseType = 'blob'
   }
   // 璁剧疆鎿嶄綔骞冲彴
-  config.headers['eva-platform'] = `pc-${pkg.version}`
+  config.headers['doumee-platform'] = `pc-${pkg.version}`
   // 璁剧疆璁よ瘉澶�
-  const authToken = Cookies.get('eva-auth-token')
+  const authToken = Cookies.get('doumee-auth-token')
   if (authToken != null) {
-    config.headers['eva-auth-token'] = authToken
+    config.headers['doumee-auth-token'] = authToken
   }
   return config
 }, function (error) {
@@ -46,7 +46,7 @@
     return Promise.reject(new Error('鏈嶅姟鍣ㄧ箒蹇欙紝璇风◢鍚庡啀璇�'))
   }
   // 涓嬭浇鎺ュ彛澶勭悊
-  if (response.headers['eva-opera-type'] === 'download') {
+  if (response.headers['doumee-opera-type'] === 'download') {
     return Promise.resolve(response)
   }
   // 鏈櫥褰�
diff --git a/admin/src/views/business/category.vue b/admin/src/views/business/category.vue
new file mode 100644
index 0000000..53c4b8a
--- /dev/null
+++ b/admin/src/views/business/category.vue
@@ -0,0 +1,151 @@
+<template>
+  <TableLayout :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
+          <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+          <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍥炬爣" prop="imgurl">
+          <el-input v-model="searchForm.imgurl" placeholder="璇疯緭鍏ュ浘鏍�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�" prop="parentId">
+          <el-input v-model="searchForm.parentId" placeholder="璇疯緭鍏ョ埗绾х紪鐮侊紙鑷叧鑱旓級" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍚嶇О璺緞" prop="namePath">
+          <el-input v-model="searchForm.namePath" placeholder="璇疯緭鍏ュ悕绉拌矾寰�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="缂栫爜璺緞" prop="idPath">
+          <el-input v-model="searchForm.idPath" placeholder="璇疯緭鍏ョ紪鐮佽矾寰�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鍒嗙被淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鍚敤 1绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="imgurl" label="鍥炬爣" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" min-width="100px"></el-table-column>
+        <el-table-column prop="parentId" label="鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="namePath" label="鍚嶇О璺緞" min-width="100px"></el-table-column>
+        <el-table-column prop="idPath" label="缂栫爜璺緞" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:category:update', 'business:category:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鍒嗙被淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+export default {
+  name: 'Category',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaCategoryWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        imgurl: '',
+        type: '',
+        parentId: '',
+        namePath: '',
+        idPath: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鍒嗙被淇℃伅琛�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/company.vue b/admin/src/views/business/company.vue
new file mode 100644
index 0000000..88f5379
--- /dev/null
+++ b/admin/src/views/business/company.vue
@@ -0,0 +1,161 @@
+<template>
+  <TableLayout>
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:company:create', 'business:company:sync']">
+        <li><el-button type="primary" v-permissions="['business:company:create']" :loading="loading"  @click="synchronous()">鍏ㄩ噺鍚屾浼佷笟寰俊缁勭粐</el-button></li>
+      </ul>
+      <el-table  v-loading="isWorking.search" :data="list" stripe
+                :tree-props="{ children: 'childList', hasChildren: 'hasChildren' }" row-key="id"
+                @selection-change="handleSelectionChange" default-expand-all>
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="缁勭粐鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="namePath" label="缁勭粐璺緞" min-width="100px"></el-table-column>
+        <el-table-column prop="qwId" label="浼佷笟寰俊鏍囪瘑" min-width="100px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢洿鏂版椂闂�" min-width="100px"></el-table-column>
+      </el-table>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaInternalCompanyWindow ref="OperaInternalCompanyWindow" :list="list" @success="handlePageChange" />
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import {companySync} from '@/api/business/company'
+export default {
+  name: 'internalCompany',
+  extends: BaseTable,
+  components: { TableLayout },
+  data () {
+    return {
+      // 鎼滅储
+      loading: false,
+      sorting: false,
+      searchForm: {
+      },
+      list: [],
+      total: 0
+    }
+  },
+  created () {
+    this.config({
+      module: '浼佷笟淇℃伅琛�',
+      api: '/business/company',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.handlePageChange()
+  },
+  methods: {
+    // 椤电爜鍙樻洿澶勭悊
+    handlePageChange (pageIndex) {
+      this.__checkApi()
+      this.isWorking.search = true
+      this.api.treeList({})
+        .then(data => {
+          this.list = data
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.isWorking.search = false
+        })
+    },
+    // 鍚屾淇℃伅
+    async synchronous () {
+      this.$dialog.actionConfirm(' 鎮ㄧ‘璁ゅ悓姝ュ叏閮ㄤ俊鎭悧锛�', '鎿嶄綔纭鎻愰啋')
+        .then(() => {
+          this.loading = true
+          companySync({})
+            .then(res => {
+              this.$tip.apiSuccess(res || '鍚屾鎴愬姛')
+              this.handlePageChange(1)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
+        })
+        .catch(() => { })
+    },
+    // 鎺掑簭
+    sort (direction) {
+      if (this.sorting) {
+        return
+      }
+      if (this.tableData.selectedRows.length === 0) {
+        this.$tip.warning('璇烽�夋嫨涓�鏉℃暟鎹�')
+        return
+      }
+      if (this.tableData.selectedRows.length > 1) {
+        this.$tip.warning('鎺掑簭鏃朵粎鍏佽閫夋嫨涓�鏉℃暟鎹�')
+        return
+      }
+      const menuId = this.tableData.selectedRows[0].id
+      // 鎵惧埌鑿滃崟鑼冨洿
+      let menuPool
+      for (const rootMenu of this.list) {
+        console.log(this.list)
+        const parent = this.__findParent(menuId, rootMenu)
+        if (parent != null) {
+          menuPool = parent.children
+        }
+      }
+      menuPool = menuPool || this.list
+      const menuIndex = menuPool.findIndex(menu => menu.id === menuId)
+      // 涓婄Щ鏍¢獙
+      if (direction === 'top' && menuIndex === 0) {
+        this.$tip.warning('鑿滃崟宸插埌椤堕儴')
+        return
+      }
+      // 涓嬬Щ鏍¢獙
+      if (direction === 'bottom' && menuIndex === menuPool.length - 1) {
+        this.$tip.warning('鑿滃崟宸插埌搴曢儴')
+        return
+      }
+      this.sorting = true
+      sort({
+        id: this.tableData.selectedRows[0].id,
+        direction
+      })
+        .then(() => {
+          /* if (direction === 'top') {
+               menuPool.splice(menuIndex, 0, menuPool.splice(menuIndex - 1, 1)[0])
+             } else {
+               menuPool.splice(menuIndex, 0, menuPool.splice(menuIndex + 1, 1)[0])
+             } */
+          this.handlePageChange(1)
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.sorting = false
+        })
+    },
+    // 鏌ヨ鐖惰妭鐐�
+    __findParent (id, parent) {
+      if (parent.childList === 0) {
+        return
+      }
+      for (const menu of parent.childList) {
+        if (menu.id === id) {
+          return parent
+        }
+        if (menu.childList.length > 0) {
+          const m = this.__findParent(id, menu)
+          if (m != null) {
+            return m
+          }
+        }
+      }
+      return null
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/companyMember.vue b/admin/src/views/business/companyMember.vue
new file mode 100644
index 0000000..3b135f6
--- /dev/null
+++ b/admin/src/views/business/companyMember.vue
@@ -0,0 +1,181 @@
+<template>
+  <TableLayout1 :permissions="['business:member:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="" prop="keyword">
+          <el-input v-model="searchForm.keyword" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        浼佷笟缁勭粐</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="companyTree" :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:member:create']">
+        <li><el-button type="primary" v-permissions="['business:member:create']" :loading="loading"  @click="synchronous()">鍏ㄩ噺鍚屾浼佷笟寰俊浜哄憳</el-button></li>
+        <li style="float: right">
+          <el-checkbox style="font-size: 12px" label="1" v-model="searchForm.includeChild" key="1"
+            @change="search">鏄惁鍖呭惈涓嬬骇缁勭粐</el-checkbox>
+        </li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column fixed="left" prop="name" label="濮撳悕" min-width="80px">
+          <template slot-scope="{row}">
+            <span>{{ row.name }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+        <el-table-column  prop="sex" label="鎬у埆" min-width="80px">
+          <template slot-scope="{row}">
+            <span v-if="row.sex == '1'">鐢�</span>
+            <span v-else-if="row.sex == '2' ">濂�</span>
+            <span v-else>濂�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="email" label="閭" min-width="100px"></el-table-column>
+        <el-table-column prop="companyName" label="鎵�灞為儴闂�" min-width="150px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/company'
+import { memberSync} from '@/api/business/member'
+export default {
+  name: 'internalMember',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree },
+  data() {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '' ,
+        includeChild: true,
+        keyword: '',
+        companyId: ''
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      companyTree: [],
+      department: []
+    }
+  },
+  created() {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindCompanyTreePage()
+    this.getPositionList()
+  },
+  methods: {
+    // 鑾峰彇缁勭粐鏍�
+    getfindCompanyTreePage() {
+      treeList({})
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            this.companyTree = res
+            this.search()
+            this.department = this.getDepartmentTree(res)
+          }
+        })
+    },
+    getDepartmentTree(tree) {
+      if (tree == null) {
+        return []
+      }
+      return tree.map(item => {
+        const newItem = { ...item }
+        if (newItem) {
+          newItem.children = newItem.childList
+        }
+        if (item.children && item.children.length == 0) {
+          this.$delete(newItem, 'children')
+        } else {
+          newItem.children = this.getDepartmentTree(newItem.children)
+        }
+
+        if (newItem.type === this.searchForm.companyType) {
+          // newItem.disabled =false
+        } else {
+          newItem.disabled = true
+        }
+        return newItem
+      })
+    },
+    // 鍚屾淇℃伅
+    async synchronous() {
+      this.$dialog.actionConfirm('鎮ㄧ‘璁ゅ叏閲忓悓姝ュ唴閮ㄤ汉鍛樹俊鎭悧', '鍚屾浜哄憳鎿嶄綔鎻愮ず锛�')
+        .then(() => {
+          this.loading = true
+          memberSync({})
+            .then(res => {
+              this.$tip.apiSuccess(res || '鍚屾鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
+        })
+        .catch(() => { })
+    },
+    callback(row) {
+      console.log(row)
+      this.searchForm.erpOrgId = row.erpId
+      this.searchForm.companyId = row.id
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/companyNormal.vue b/admin/src/views/business/companyNormal.vue
new file mode 100644
index 0000000..cfe4c7e
--- /dev/null
+++ b/admin/src/views/business/companyNormal.vue
@@ -0,0 +1,109 @@
+<template>
+  <TableLayout :permissions="['business:company:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="閮ㄩ棬浠g爜" prop="code">
+          <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鐮�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浼佸井鏍囪瘑" prop="qwId">
+          <el-input v-model="searchForm.qwId" placeholder="璇疯緭鍏ヤ紒寰爣璇�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍚嶇О" prop="namePath">
+          <el-input v-model="searchForm.namePath" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']">
+        <li><el-button type="primary" @click="$refs.operaCompanyWindow.open('鏂板缓缁勭粐淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:company:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="閮ㄩ棬浠g爜" min-width="100px"></el-table-column>
+        <el-table-column prop="qwId" label="浼佸井鏍囪瘑" min-width="100px"></el-table-column>
+        <el-table-column prop="namePath" label="鍚嶇О璺緞" min-width="100px"></el-table-column>
+        <el-table-column prop="idPath" label="缂栫爜璺緞" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaCompanyWindow.open('缂栬緫缁勭粐淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaCompanyWindow ref="operaCompanyWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaCompanyWindow from '@/components/business/OperaCompanyWindow'
+export default {
+  name: 'Company',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaCompanyWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        imgurl: '',
+        type: '',
+        parentId: '',
+        code: '',
+        qwId: '',
+        namePath: '',
+        idPath: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '缁勭粐淇℃伅琛�',
+      api: '/business/company',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/managers.vue b/admin/src/views/business/managers.vue
new file mode 100644
index 0000000..3c4011c
--- /dev/null
+++ b/admin/src/views/business/managers.vue
@@ -0,0 +1,141 @@
+<template>
+  <TableLayout :permissions="['business:managers:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" prop="categoryId">
+          <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ユ墍灞炲垎绫荤紪锛堝叧鑱攃ategory)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
+          <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+          <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+          <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="" prop="column13">
+          <el-input v-model="searchForm.column13" placeholder="璇疯緭鍏�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:managers:create', 'business:managers:delete']">
+        <li><el-button type="primary" @click="$refs.operaManagersWindow.open('鏂板缓璐d换浜轰俊鎭〃')" icon="el-icon-plus" v-permissions="['business:managers:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="categoryId" label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鍚敤 1绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="浜哄憳缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="column13" label="" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaManagersWindow.open('缂栬緫璐d换浜轰俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:managers:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:managers:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaManagersWindow ref="operaManagersWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaManagersWindow from '@/components/business/OperaManagersWindow'
+export default {
+  name: 'Managers',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaManagersWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        categoryId: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: '',
+        memberId: '',
+        column13: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璐d换浜轰俊鎭〃',
+      api: '/business/managers',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/managersDca.vue b/admin/src/views/business/managersDca.vue
new file mode 100644
index 0000000..3c4011c
--- /dev/null
+++ b/admin/src/views/business/managersDca.vue
@@ -0,0 +1,141 @@
+<template>
+  <TableLayout :permissions="['business:managers:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" prop="categoryId">
+          <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ユ墍灞炲垎绫荤紪锛堝叧鑱攃ategory)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
+          <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+          <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+          <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="" prop="column13">
+          <el-input v-model="searchForm.column13" placeholder="璇疯緭鍏�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:managers:create', 'business:managers:delete']">
+        <li><el-button type="primary" @click="$refs.operaManagersWindow.open('鏂板缓璐d换浜轰俊鎭〃')" icon="el-icon-plus" v-permissions="['business:managers:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="categoryId" label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0鍚敤 1绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷 0DCA璐d换浜�1瀹夊叏椋庨櫓鐗╀笟涓荤 2瀹夊叏椋庨櫓澶勭悊宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="浜哄憳缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="column13" label="" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaManagersWindow.open('缂栬緫璐d换浜轰俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:managers:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:managers:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaManagersWindow ref="operaManagersWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaManagersWindow from '@/components/business/OperaManagersWindow'
+export default {
+  name: 'Managers',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaManagersWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        categoryId: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: '',
+        memberId: '',
+        column13: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璐d换浜轰俊鎭〃',
+      api: '/business/managers',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/managersShe.vue b/admin/src/views/business/managersShe.vue
new file mode 100644
index 0000000..fedbdd7
--- /dev/null
+++ b/admin/src/views/business/managersShe.vue
@@ -0,0 +1,86 @@
+<template>
+  <TableLayout :permissions="['business:managers:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="浜哄憳濮撳悕 " prop="memberName">
+          <el-input v-model="searchForm.memberName" placeholder="璇疯緭鍏ヤ汉鍛樺鍚�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:managers:create', 'business:managers:delete']">
+        <li><el-button type="primary" @click="$refs.operaManagersWindow.open('鏂板缓璐d换浜轰俊鎭〃')" icon="el-icon-plus" v-permissions="['business:managers:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:managers:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="memberName" label="浜哄憳濮撳悕" min-width="100px"></el-table-column>
+        <el-table-column prop="companyName" label="鎵�灞為儴闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:managers:update', 'business:managers:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaManagersWindow.open('缂栬緫璐d换浜轰俊鎭〃', row)" icon="el-icon-edit" v-permissions="['business:managers:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:managers:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaManagersWindow ref="operaManagersWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaManagersWindow from '@/components/business/OperaManagersWindow'
+export default {
+  name: 'Managers',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaManagersWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        memberName: '',
+        type: 0
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璐d换浜轰俊鎭〃',
+      api: '/business/managers',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/member.vue b/admin/src/views/business/member.vue
new file mode 100644
index 0000000..23c6919
--- /dev/null
+++ b/admin/src/views/business/member.vue
@@ -0,0 +1,181 @@
+<template>
+  <TableLayout :permissions="['business:member:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="濮撳悕" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ鍚�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵�� 0姝e父 1绂佺敤" prop="status">
+          <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1绂佺敤" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+          <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶村儚" prop="imgurl">
+          <el-input v-model="searchForm.imgurl" placeholder="璇疯緭鍏ュご鍍�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)" prop="companyId">
+          <el-input v-model="searchForm.companyId" placeholder="璇疯緭鍏ユ墍灞炵粍缁囩紪鐮侊紙鍏宠仈company)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎵嬫満鍙�" prop="phone">
+          <el-input v-model="searchForm.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="閭" prop="email">
+          <el-input v-model="searchForm.email" placeholder="璇疯緭鍏ラ偖绠�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎬у埆 0鐢� 1濂� 2浣嶇疆" prop="sex">
+          <el-input v-model="searchForm.sex" placeholder="璇疯緭鍏ユ�у埆 0鐢� 1濂� 2浣嶇疆" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ彿" prop="code">
+          <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浼佸井鏍囪瘑" prop="qwId">
+          <el-input v-model="searchForm.qwId" placeholder="璇疯緭鍏ヤ紒寰爣璇�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="璇佷欢鍙�" prop="idcard">
+          <el-input v-model="searchForm.idcard" placeholder="璇疯緭鍏ヨ瘉浠跺彿" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏈�杩戜笂绾挎椂闂�" prop="lastLoginDate">
+          <el-date-picker v-model="searchForm.lastLoginDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶杩戜笂绾挎椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鐧诲綍娆℃暟" prop="loginCount">
+          <el-input v-model="searchForm.loginCount" placeholder="璇疯緭鍏ョ櫥褰曟鏁�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+        <li><el-button type="primary" @click="$refs.operaMemberWindow.open('鏂板缓浜哄憳淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0姝e父 1绂佺敤" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="imgurl" label="澶村儚" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷" min-width="100px"></el-table-column>
+        <el-table-column prop="companyId" label="鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)" min-width="100px"></el-table-column>
+        <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="email" label="閭" min-width="100px"></el-table-column>
+        <el-table-column prop="sex" label="鎬у埆 0鐢� 1濂� 2浣嶇疆" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
+        <el-table-column prop="qwId" label="浼佸井鏍囪瘑" min-width="100px"></el-table-column>
+        <el-table-column prop="idcard" label="璇佷欢鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="lastLoginDate" label="鏈�杩戜笂绾挎椂闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="loginCount" label="鐧诲綍娆℃暟" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:member:update', 'business:member:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaMemberWindow.open('缂栬緫浜哄憳淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:member:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaMemberWindow ref="operaMemberWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaMemberWindow from '@/components/business/OperaMemberWindow'
+export default {
+  name: 'Member',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaMemberWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        imgurl: '',
+        type: '',
+        companyId: '',
+        phone: '',
+        email: '',
+        sex: '',
+        code: '',
+        qwId: '',
+        idcard: '',
+        lastLoginDate: '',
+        loginCount: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/multifile.vue b/admin/src/views/business/multifile.vue
new file mode 100644
index 0000000..3de0aed
--- /dev/null
+++ b/admin/src/views/business/multifile.vue
@@ -0,0 +1,146 @@
+<template>
+  <TableLayout :permissions="['business:multifile:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏂囦欢鍚�" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ユ枃浠跺悕" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="info">
+          <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈瀵硅薄缂栫爜" prop="objId">
+          <el-input v-model="searchForm.objId" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨�0鍥剧墖 1瑙嗛 2鍏朵粬" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊" prop="objType">
+          <el-input v-model="searchForm.objType" placeholder="璇疯緭鍏ュ叧鑱斿璞$被鍨� 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏂囦欢鍦板潃" prop="fileurl">
+          <el-input v-model="searchForm.fileurl" placeholder="璇疯緭鍏ユ枃浠跺湴鍧�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+          <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浼佷笟缂栫爜(鍏宠仈company琛級" prop="companyId">
+          <el-input v-model="searchForm.companyId" placeholder="璇疯緭鍏ヤ紒涓氱紪鐮�(鍏宠仈company琛級" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:multifile:create', 'business:multifile:delete']">
+        <li><el-button type="primary" @click="$refs.operaMultifileWindow.open('鏂板缓闄勪欢涓婁紶淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:multifile:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:multifile:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鏂囦欢鍚�" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="objId" label="鍏宠仈瀵硅薄缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬" min-width="100px"></el-table-column>
+        <el-table-column prop="objType" label="鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊" min-width="100px"></el-table-column>
+        <el-table-column prop="fileurl" label="鏂囦欢鍦板潃" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="companyId" label="浼佷笟缂栫爜(鍏宠仈company琛級" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:multifile:update', 'business:multifile:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaMultifileWindow.open('缂栬緫闄勪欢涓婁紶淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:multifile:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:multifile:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaMultifileWindow ref="operaMultifileWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaMultifileWindow from '@/components/business/OperaMultifileWindow'
+export default {
+  name: 'Multifile',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaMultifileWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        name: '',
+        info: '',
+        objId: '',
+        type: '',
+        objType: '',
+        fileurl: '',
+        sortnum: '',
+        companyId: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '闄勪欢涓婁紶淇℃伅琛�',
+      api: '/business/multifile',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/notices.vue b/admin/src/views/business/notices.vue
new file mode 100644
index 0000000..47be0f5
--- /dev/null
+++ b/admin/src/views/business/notices.vue
@@ -0,0 +1,206 @@
+<template>
+  <TableLayout :permissions="['business:notices:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏍囬" prop="title">
+          <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ユ爣棰�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绠�浠�" prop="info">
+          <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ョ畝浠�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍐呭" prop="content">
+          <el-input v-model="searchForm.content" placeholder="璇疯緭鍏ュ唴瀹�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈瀵硅薄缂栫爜" prop="objId">
+          <el-input v-model="searchForm.objId" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈瀵硅薄绫诲瀷 0宸ュ崟" prop="objType">
+          <el-input v-model="searchForm.objType" placeholder="璇疯緭鍏ュ叧鑱斿璞$被鍨� 0宸ュ崟" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈瀵硅薄鍚嶇О" prop="objName">
+          <el-input v-model="searchForm.objName" placeholder="璇疯緭鍏ュ叧鑱斿璞″悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鍙傛暟1" prop="param1">
+          <el-input v-model="searchForm.param1" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�1" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鍙傛暟2" prop="param2">
+          <el-input v-model="searchForm.param2" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�2" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鍙傛暟3" prop="param3">
+          <el-input v-model="searchForm.param3" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�3" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鍙傛暟4" prop="param4">
+          <el-input v-model="searchForm.param4" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�4" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鍙傛暟5" prop="param5">
+          <el-input v-model="searchForm.param5" placeholder="璇疯緭鍏ュ叧鑱斿弬鏁�5" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鐢ㄦ埛濮撳悕" prop="memberName">
+          <el-input v-model="searchForm.memberName" placeholder="璇疯緭鍏ュ叧鑱旂敤鎴峰鍚�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鐢ㄦ埛浼佸井缂栫爜" prop="qwId">
+          <el-input v-model="searchForm.qwId" placeholder="璇疯緭鍏ュ叧鑱旂敤鎴蜂紒寰紪鐮�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈鐢ㄦ埛缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+          <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ュ叧鑱旂敤鎴风紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈浼佷笟缁勭粐缂栫爜(鍏宠仈company锛�" prop="companyId">
+          <el-input v-model="searchForm.companyId" placeholder="璇疯緭鍏ュ叧鑱斾紒涓氱粍缁囩紪鐮�(鍏宠仈company锛�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵�� 0姝e父 1宸插叧闂�" prop="status">
+          <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1宸插叧闂�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁鎶勯�� 0涓嶆槸 1鏄�" prop="sendacopy">
+          <el-input v-model="searchForm.sendacopy" placeholder="璇疯緭鍏ユ槸鍚︽妱閫� 0涓嶆槸 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁宸茶 0鏈 1宸茶" prop="readed">
+          <el-input v-model="searchForm.readed" placeholder="璇疯緭鍏ユ槸鍚﹀凡璇� 0鏈 1宸茶" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:notices:create', 'business:notices:delete']">
+        <li><el-button type="primary" @click="$refs.operaNoticesWindow.open('鏂板缓绯荤粺娑堟伅淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:notices:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:notices:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="title" label="鏍囬" min-width="100px"></el-table-column>
+        <el-table-column prop="info" label="绠�浠�" min-width="100px"></el-table-column>
+        <el-table-column prop="content" label="鍐呭" min-width="100px"></el-table-column>
+        <el-table-column prop="objId" label="鍏宠仈瀵硅薄缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="objType" label="鍏宠仈瀵硅薄绫诲瀷 0宸ュ崟" min-width="100px"></el-table-column>
+        <el-table-column prop="objName" label="鍏宠仈瀵硅薄鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="param1" label="鍏宠仈鍙傛暟1" min-width="100px"></el-table-column>
+        <el-table-column prop="param2" label="鍏宠仈鍙傛暟2" min-width="100px"></el-table-column>
+        <el-table-column prop="param3" label="鍏宠仈鍙傛暟3" min-width="100px"></el-table-column>
+        <el-table-column prop="param4" label="鍏宠仈鍙傛暟4" min-width="100px"></el-table-column>
+        <el-table-column prop="param5" label="鍏宠仈鍙傛暟5" min-width="100px"></el-table-column>
+        <el-table-column prop="memberName" label="鍏宠仈鐢ㄦ埛濮撳悕" min-width="100px"></el-table-column>
+        <el-table-column prop="qwId" label="鍏宠仈鐢ㄦ埛浼佸井缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="鍏宠仈鐢ㄦ埛缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="companyId" label="鍏宠仈浼佷笟缁勭粐缂栫爜(鍏宠仈company锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0姝e父 1宸插叧闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="sendacopy" label="鏄惁鎶勯�� 0涓嶆槸 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="readed" label="鏄惁宸茶 0鏈 1宸茶" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:notices:update', 'business:notices:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaNoticesWindow.open('缂栬緫绯荤粺娑堟伅淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:notices:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:notices:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaNoticesWindow ref="operaNoticesWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaNoticesWindow from '@/components/business/OperaNoticesWindow'
+export default {
+  name: 'Notices',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaNoticesWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        remark: '',
+        title: '',
+        info: '',
+        content: '',
+        objId: '',
+        objType: '',
+        objName: '',
+        type: '',
+        param1: '',
+        param2: '',
+        param3: '',
+        param4: '',
+        param5: '',
+        memberName: '',
+        qwId: '',
+        memberId: '',
+        companyId: '',
+        status: '',
+        sendacopy: '',
+        readed: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '绯荤粺娑堟伅淇℃伅琛�',
+      api: '/business/notices',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/workorder.vue b/admin/src/views/business/workorder.vue
new file mode 100644
index 0000000..6ce723b
--- /dev/null
+++ b/admin/src/views/business/workorder.vue
@@ -0,0 +1,266 @@
+<template>
+  <TableLayout :permissions="['business:workorder:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" prop="categoryId">
+          <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ユ墍灞炲垎绫荤紪锛堝叧鑱攃ategory)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵�� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�" prop="status">
+          <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鐮�" prop="sortnum">
+          <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绫诲瀷 0浣嶇疆璐d换浜� 1鐝暱 2鐗╀笟涓荤 3宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" prop="type">
+          <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0浣嶇疆璐d换浜� 1鐝暱 2鐗╀笟涓荤 3宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="涓婃姤浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="memberId">
+          <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ヤ笂鎶ヤ汉鍛樼紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="閮ㄩ棬缂栫爜" prop="companyId">
+          <el-input v-model="searchForm.companyId" placeholder="璇疯緭鍏ラ儴闂ㄧ紪鐮�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="涓婃姤鏃堕棿" prop="submitDate">
+          <el-input v-model="searchForm.submitDate" placeholder="璇疯緭鍏ヤ笂鎶ユ椂闂�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="SHE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�" prop="memberType">
+          <el-input v-model="searchForm.memberType" placeholder="璇疯緭鍏HE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="SHE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎" prop="memberQwids">
+          <el-input v-model="searchForm.memberQwids" placeholder="璇疯緭鍏HE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="SHE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�" prop="memberNames">
+          <el-input v-model="searchForm.memberNames" placeholder="璇疯緭鍏HE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙戠敓鍦扮偣/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�" prop="localtionId">
+          <el-input v-model="searchForm.localtionId" placeholder="璇疯緭鍏ュ彂鐢熷湴鐐�/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁澶栭儴灏卞尰 0鍚� 1鏄�" prop="outJiuyi">
+          <el-input v-model="searchForm.outJiuyi" placeholder="璇疯緭鍏ユ槸鍚﹀閮ㄥ氨鍖� 0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁鍖诲姟瀹� 0鍚� 1鏄�" prop="isYiwushi">
+          <el-input v-model="searchForm.isYiwushi" placeholder="璇疯緭鍏ユ槸鍚﹀尰鍔″ 0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁鍙椾激 0鍚� 1鏄�" prop="isHurted">
+          <el-input v-model="searchForm.isHurted" placeholder="璇疯緭鍏ユ槸鍚﹀彈浼� 0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏄惁鍜屽伐浣滅浉鍏�" prop="workRelated">
+          <el-input v-model="searchForm.workRelated" placeholder="璇疯緭鍏ユ槸鍚﹀拰宸ヤ綔鐩稿叧" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浜嬩欢璇存槑" prop="eventInfo">
+          <el-input v-model="searchForm.eventInfo" placeholder="璇疯緭鍏ヤ簨浠惰鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="閭欢閫氱煡浜哄憳缂栫爜闆嗗悎" prop="emialMemberIds">
+          <el-input v-model="searchForm.emialMemberIds" placeholder="璇疯緭鍏ラ偖浠堕�氱煡浜哄憳缂栫爜闆嗗悎" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浼佷笟寰俊閫氱煡浜哄憳缂栫爜闆嗗悎" prop="qwnoticeMemberIds">
+          <el-input v-model="searchForm.qwnoticeMemberIds" placeholder="璇疯緭鍏ヤ紒涓氬井淇¢�氱煡浜哄憳缂栫爜闆嗗悎" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙戠幇鏃堕棿" prop="happenTime">
+          <el-input v-model="searchForm.happenTime" placeholder="璇疯緭鍏ュ彂鐜版椂闂�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="椋庨櫓绫诲瀷(鍏宠仈category锛�" prop="typeId">
+          <el-date-picker v-model="searchForm.typeId" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ラ闄╃被鍨�(鍏宠仈category锛�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="椋庨櫓鎻忚堪" prop="riskInfo">
+          <el-input v-model="searchForm.riskInfo" placeholder="璇疯緭鍏ラ闄╂弿杩�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="褰撳墠鐗╀笟涓荤缂栫爜锛堝叧鑱攎ember锛�" prop="managerId">
+          <el-input v-model="searchForm.managerId" placeholder="璇疯緭鍏ュ綋鍓嶇墿涓氫富绠$紪鐮侊紙鍏宠仈member锛�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="褰撳墠澶勭悊浜哄憳缂栫爜锛堝叧鑱攎ember)" prop="dealerId">
+          <el-input v-model="searchForm.dealerId" placeholder="璇疯緭鍏ュ綋鍓嶅鐞嗕汉鍛樼紪鐮侊紙鍏宠仈member)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒嗛厤鏃堕棿" prop="dispatchTime">
+          <el-date-picker v-model="searchForm.dispatchTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垎閰嶆椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鍒嗛厤澶囨敞" prop="dispatchInfo">
+          <el-input v-model="searchForm.dispatchInfo" placeholder="璇疯緭鍏ュ垎閰嶅娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶勭悊鏃堕棿" prop="dealTime">
+          <el-date-picker v-model="searchForm.dealTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ鐞嗘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="澶勭悊澶囨敞" prop="dealInfo">
+          <el-input v-model="searchForm.dealInfo" placeholder="璇疯緭鍏ュ鐞嗗娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="DCA闂缂栫爜" prop="problemId">
+          <el-input v-model="searchForm.problemId" placeholder="璇疯緭鍏CA闂缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="DCA闂鏁伴噺" prop="problemNum">
+          <el-input v-model="searchForm.problemNum" placeholder="璇疯緭鍏CA闂鏁伴噺" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="浣嶇疆鍦扮偣璺緞鍚嶇О" prop="locationName">
+          <el-input v-model="searchForm.locationName" placeholder="璇疯緭鍏ヤ綅缃湴鐐硅矾寰勫悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ崟鍙�" prop="code">
+          <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍗曞彿" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:workorder:create', 'business:workorder:delete']">
+        <li><el-button type="primary" @click="$refs.operaWorkorderWindow.open('鏂板缓宸ュ崟淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:workorder:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:workorder:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="categoryId" label="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵�� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�" min-width="100px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="type" label="绫诲瀷 0浣嶇疆璐d换浜� 1鐝暱 2鐗╀笟涓荤 3宸ョ▼甯� 4SHE璐熻矗浜� 5SHE宸ュ崟閭鎶勯�佷汉" min-width="100px"></el-table-column>
+        <el-table-column prop="memberId" label="涓婃姤浜哄憳缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="companyId" label="閮ㄩ棬缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="submitDate" label="涓婃姤鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="memberType" label="SHE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�" min-width="100px"></el-table-column>
+        <el-table-column prop="memberQwids" label="SHE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎" min-width="100px"></el-table-column>
+        <el-table-column prop="memberNames" label="SHE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�" min-width="100px"></el-table-column>
+        <el-table-column prop="localtionId" label="鍙戠敓鍦扮偣/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="outJiuyi" label="鏄惁澶栭儴灏卞尰 0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="isYiwushi" label="鏄惁鍖诲姟瀹� 0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="isHurted" label="鏄惁鍙椾激 0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="workRelated" label="鏄惁鍜屽伐浣滅浉鍏�" min-width="100px"></el-table-column>
+        <el-table-column prop="eventInfo" label="浜嬩欢璇存槑" min-width="100px"></el-table-column>
+        <el-table-column prop="emialMemberIds" label="閭欢閫氱煡浜哄憳缂栫爜闆嗗悎" min-width="100px"></el-table-column>
+        <el-table-column prop="qwnoticeMemberIds" label="浼佷笟寰俊閫氱煡浜哄憳缂栫爜闆嗗悎" min-width="100px"></el-table-column>
+        <el-table-column prop="happenTime" label="鍙戠幇鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="typeId" label="椋庨櫓绫诲瀷(鍏宠仈category锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="riskInfo" label="椋庨櫓鎻忚堪" min-width="100px"></el-table-column>
+        <el-table-column prop="managerId" label="褰撳墠鐗╀笟涓荤缂栫爜锛堝叧鑱攎ember锛�" min-width="100px"></el-table-column>
+        <el-table-column prop="dealerId" label="褰撳墠澶勭悊浜哄憳缂栫爜锛堝叧鑱攎ember)" min-width="100px"></el-table-column>
+        <el-table-column prop="dispatchTime" label="鍒嗛厤鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="dispatchInfo" label="鍒嗛厤澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="dealTime" label="澶勭悊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="dealInfo" label="澶勭悊澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="problemId" label="DCA闂缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="problemNum" label="DCA闂鏁伴噺" min-width="100px"></el-table-column>
+        <el-table-column prop="locationName" label="浣嶇疆鍦扮偣璺緞鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="宸ュ崟鍙�" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWorkorderWindow.open('缂栬緫宸ュ崟淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:workorder:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:workorder:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWorkorderWindow ref="operaWorkorderWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaWorkorderWindow from '@/components/business/OperaWorkorderWindow'
+export default {
+  name: 'Workorder',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaWorkorderWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        categoryId: '',
+        remark: '',
+        status: '',
+        sortnum: '',
+        type: '',
+        memberId: '',
+        companyId: '',
+        submitDate: '',
+        memberType: '',
+        memberQwids: '',
+        memberNames: '',
+        localtionId: '',
+        outJiuyi: '',
+        isYiwushi: '',
+        isHurted: '',
+        workRelated: '',
+        eventInfo: '',
+        emialMemberIds: '',
+        qwnoticeMemberIds: '',
+        happenTime: '',
+        typeId: '',
+        riskInfo: '',
+        managerId: '',
+        dealerId: '',
+        dispatchTime: '',
+        dispatchInfo: '',
+        dealTime: '',
+        dealInfo: '',
+        problemId: '',
+        problemNum: '',
+        locationName: '',
+        code: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '宸ュ崟淇℃伅琛�',
+      api: '/business/workorder',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/workorderLog.vue b/admin/src/views/business/workorderLog.vue
new file mode 100644
index 0000000..174d1d9
--- /dev/null
+++ b/admin/src/views/business/workorderLog.vue
@@ -0,0 +1,166 @@
+<template>
+  <TableLayout :permissions="['business:workorderlog:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <SearchFormCollapse slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
+          <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
+          <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
+          <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
+          <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
+          <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ崟缂栫爜锛堝叧鑱攚orkorder)" prop="workorderId">
+          <el-input v-model="searchForm.workorderId" placeholder="璇疯緭鍏ュ伐鍗曠紪鐮侊紙鍏宠仈workorder)" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鏍囬" prop="title">
+          <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ユ爣棰�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="绠�浠�" prop="content">
+          <el-input v-model="searchForm.content" placeholder="璇疯緭鍏ョ畝浠�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎿嶄綔绫诲瀷 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績" prop="objType">
+          <el-input v-model="searchForm.objType" placeholder="璇疯緭鍏ユ搷浣滅被鍨� 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍏宠仈瀵硅薄缂栫爜" prop="objId">
+          <el-input v-model="searchForm.objId" placeholder="璇疯緭鍏ュ叧鑱斿璞$紪鐮�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎿嶄綔鍓嶅唴瀹�" prop="beforeContent">
+          <el-input v-model="searchForm.beforeContent" placeholder="璇疯緭鍏ユ搷浣滃墠鍐呭" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鎿嶄綔鍚庡唴瀹�" prop="afterContent">
+          <el-input v-model="searchForm.afterContent" placeholder="璇疯緭鍏ユ搷浣滃悗鍐呭" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟1" prop="param1">
+          <el-input v-model="searchForm.param1" placeholder="璇疯緭鍏ュ弬鏁�1" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟2" prop="param2">
+          <el-input v-model="searchForm.param2" placeholder="璇疯緭鍏ュ弬鏁�2" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟3" prop="param3">
+          <el-input v-model="searchForm.param3" placeholder="璇疯緭鍏ュ弬鏁�3" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟4" prop="param4">
+          <el-input v-model="searchForm.param4" placeholder="璇疯緭鍏ュ弬鏁�4" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:workorderlog:create', 'business:workorderlog:delete']">
+        <li><el-button type="primary" @click="$refs.operaWorkorderLogWindow.open('鏂板缓宸ュ崟鎿嶄綔鍘嗗彶琛�')" icon="el-icon-plus" v-permissions="['business:workorderlog:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:workorderlog:delete']">鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
+        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="workorderId" label="宸ュ崟缂栫爜锛堝叧鑱攚orkorder)" min-width="100px"></el-table-column>
+        <el-table-column prop="title" label="鏍囬" min-width="100px"></el-table-column>
+        <el-table-column prop="content" label="绠�浠�" min-width="100px"></el-table-column>
+        <el-table-column prop="objType" label="鎿嶄綔绫诲瀷 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績" min-width="100px"></el-table-column>
+        <el-table-column prop="objId" label="鍏宠仈瀵硅薄缂栫爜" min-width="100px"></el-table-column>
+        <el-table-column prop="beforeContent" label="鎿嶄綔鍓嶅唴瀹�" min-width="100px"></el-table-column>
+        <el-table-column prop="afterContent" label="鎿嶄綔鍚庡唴瀹�" min-width="100px"></el-table-column>
+        <el-table-column prop="param1" label="鍙傛暟1" min-width="100px"></el-table-column>
+        <el-table-column prop="param2" label="鍙傛暟2" min-width="100px"></el-table-column>
+        <el-table-column prop="param3" label="鍙傛暟3" min-width="100px"></el-table-column>
+        <el-table-column prop="param4" label="鍙傛暟4" min-width="100px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:workorderlog:update', 'business:workorderlog:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWorkorderLogWindow.open('缂栬緫宸ュ崟鎿嶄綔鍘嗗彶琛�', row)" icon="el-icon-edit" v-permissions="['business:workorderlog:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:workorderlog:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWorkorderLogWindow ref="operaWorkorderLogWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaWorkorderLogWindow from '@/components/business/OperaWorkorderLogWindow'
+export default {
+  name: 'WorkorderLog',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaWorkorderLogWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        creator: '',
+        createDate: '',
+        editor: '',
+        editDate: '',
+        isdeleted: '',
+        remark: '',
+        workorderId: '',
+        title: '',
+        content: '',
+        objType: '',
+        objId: '',
+        beforeContent: '',
+        afterContent: '',
+        param1: '',
+        param2: '',
+        param3: '',
+        param4: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '宸ュ崟鎿嶄綔鍘嗗彶琛�',
+      api: '/business/workorderLog',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/index.vue b/admin/src/views/index.vue
index e05c75d..9053e37 100644
--- a/admin/src/views/index.vue
+++ b/admin/src/views/index.vue
@@ -1,24 +1,6 @@
 <template>
   <div class="home">
     <div class="wrap">
-      <h2>娆㈣繋浣跨敤浼婂▋鏋侀�熷紑鍙戞鏋�</h2>
-      <p>鎮ㄤ娇鐢ㄧ殑姝ゅ寮�婧愭鏋舵病鏈変换浣曠増鏉冮棶棰橈紝鍙涔犲彲鍟嗙敤锛岃鏀惧績浣跨敤锛�</p>
-      <p>浼婂▋鑷村姏浜庢墦閫犵畝娲併�佸悎鐞嗐�侀珮鏁堢殑寮�鍙戜綋楠岋紝涓烘鎴戜滑灏嗕笉鏂崌绾э紝鎰熻阿鎮ㄧ殑鏀寔锛�</p>
-      <p style="margin-top: 12px;">
-        <a href="https://gitee.com/coderd-repos/eva" target="_blank">GITEE</a>
-        <a href="https://github.com/coderd-repos/eva" target="_blank">GITHUB</a>
-      </p>
-      <div class="guide">
-        <a href="http://eva.adjustrd.com" target="_blank">鍓嶅線瀹樼綉</a>
-        <a href="http://coderd.adjustrd.com/template/308/default" target="_blank">瀹氬埗鎶�鏈爤</a>
-      </div>
-      <img src="@/assets/images/qq.png">
-      <p>浣犲彲浠ユ壂鐮佸姞鍏ョ兢鑱婁互鑾峰緱鎶�鏈敮鎸�</p>
-      <div class="award">
-        <h4>婵�鍔变綔鑰呭仛寰楁洿濂�</h4>
-        <img src="@/assets/images/alipay.jpeg">
-        <img src="@/assets/images/wxpay.jpeg">
-      </div>
     </div>
   </div>
 </template>
diff --git a/server/db/business.category.permissions.sql b/server/db/business.category.permissions.sql
new file mode 100644
index 0000000..8006d69
--- /dev/null
+++ b/server/db/business.category.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:create', '鏂板缓鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:delete', '鍒犻櫎鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:update', '淇敼鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:query', '鏌ヨ鍒嗙被淇℃伅琛�', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:category:exportExcel', '瀵煎嚭鍒嗙被淇℃伅琛�(Excel)', '鍒嗙被淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.company.permissions.sql b/server/db/business.company.permissions.sql
new file mode 100644
index 0000000..8b23918
--- /dev/null
+++ b/server/db/business.company.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:create', '鏂板缓缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:delete', '鍒犻櫎缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:update', '淇敼缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:query', '鏌ヨ缁勭粐淇℃伅琛�', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:company:exportExcel', '瀵煎嚭缁勭粐淇℃伅琛�(Excel)', '缁勭粐淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.managers.permissions.sql b/server/db/business.managers.permissions.sql
new file mode 100644
index 0000000..71b6973
--- /dev/null
+++ b/server/db/business.managers.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:create', '鏂板缓璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:delete', '鍒犻櫎璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:update', '淇敼璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:query', '鏌ヨ璐d换浜轰俊鎭〃', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:managers:exportExcel', '瀵煎嚭璐d换浜轰俊鎭〃(Excel)', '璐d换浜轰俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.member.permissions.sql b/server/db/business.member.permissions.sql
new file mode 100644
index 0000000..d313669
--- /dev/null
+++ b/server/db/business.member.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:create', '鏂板缓浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:delete', '鍒犻櫎浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:update', '淇敼浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:query', '鏌ヨ浜哄憳淇℃伅琛�', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:member:exportExcel', '瀵煎嚭浜哄憳淇℃伅琛�(Excel)', '浜哄憳淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.multifile.permissions.sql b/server/db/business.multifile.permissions.sql
new file mode 100644
index 0000000..d5e24ef
--- /dev/null
+++ b/server/db/business.multifile.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:create', '鏂板缓闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:delete', '鍒犻櫎闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:update', '淇敼闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:query', '鏌ヨ闄勪欢涓婁紶淇℃伅琛�', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:multifile:exportExcel', '瀵煎嚭闄勪欢涓婁紶淇℃伅琛�(Excel)', '闄勪欢涓婁紶淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.notices.permissions.sql b/server/db/business.notices.permissions.sql
new file mode 100644
index 0000000..cc86518
--- /dev/null
+++ b/server/db/business.notices.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:create', '鏂板缓绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:delete', '鍒犻櫎绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:update', '淇敼绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:query', '鏌ヨ绯荤粺娑堟伅淇℃伅琛�', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:notices:exportExcel', '瀵煎嚭绯荤粺娑堟伅淇℃伅琛�(Excel)', '绯荤粺娑堟伅淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.workorder.permissions.sql b/server/db/business.workorder.permissions.sql
new file mode 100644
index 0000000..5e9c87b
--- /dev/null
+++ b/server/db/business.workorder.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:create', '鏂板缓宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:delete', '鍒犻櫎宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:update', '淇敼宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:query', '鏌ヨ宸ュ崟淇℃伅琛�', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorder:exportExcel', '瀵煎嚭宸ュ崟淇℃伅琛�(Excel)', '宸ュ崟淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/db/business.workorder_log.permissions.sql b/server/db/business.workorder_log.permissions.sql
new file mode 100644
index 0000000..32d5607
--- /dev/null
+++ b/server/db/business.workorder_log.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:create', '鏂板缓宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:delete', '鍒犻櫎宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:update', '淇敼宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:query', '鏌ヨ宸ュ崟鎿嶄綔鍘嗗彶琛�', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:workorderlog:exportExcel', '瀵煎嚭宸ュ崟鎿嶄綔鍘嗗彶琛�(Excel)', '宸ュ崟鎿嶄綔鍘嗗彶琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/pom.xml b/server/pom.xml
index 311aca5..4d9a09e 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -167,6 +167,11 @@
       <artifactId>mybatis-plus-join</artifactId>
       <version>1.4.2.2</version>
     </dependency>
+    <dependency>
+      <groupId>commons-net</groupId>
+      <artifactId>commons-net</artifactId>
+      <version>3.8.0</version>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/server/src/main/java/com/doumee/LianhelihuaApplication.java b/server/src/main/java/com/doumee/LianhelihuaApplication.java
index d7aea66..4348b26 100644
--- a/server/src/main/java/com/doumee/LianhelihuaApplication.java
+++ b/server/src/main/java/com/doumee/LianhelihuaApplication.java
@@ -9,7 +9,7 @@
 
 /**
  * 鍚姩绫�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/api/BaseController.java b/server/src/main/java/com/doumee/api/BaseController.java
index 7c3f504..8d3cfea 100644
--- a/server/src/main/java/com/doumee/api/BaseController.java
+++ b/server/src/main/java/com/doumee/api/BaseController.java
@@ -10,7 +10,7 @@
 
 /**
  * Controller鍩虹被
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/api/business/CategoryController.java b/server/src/main/java/com/doumee/api/business/CategoryController.java
new file mode 100644
index 0000000..f06804a
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/CategoryController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Category;
+import com.doumee.service.business.CategoryService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "鍒嗙被淇℃伅琛�")
+@RestController
+@RequestMapping("/business/category")
+public class CategoryController extends BaseController {
+
+    @Autowired
+    private CategoryService categoryService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:category:create")
+    public ApiResponse create(@RequestBody Category category) {
+        return ApiResponse.success(categoryService.create(category));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:category:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        categoryService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:category:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        categoryService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:category:update")
+    public ApiResponse updateById(@RequestBody Category category) {
+        categoryService.updateById(category);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:category:query")
+    public ApiResponse<PageData<Category>> findPage (@RequestBody PageWrap<Category> pageWrap) {
+        return ApiResponse.success(categoryService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:category:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Category> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Category.class).exportData(categoryService.findPage(pageWrap).getRecords(), "鍒嗙被淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:category:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(categoryService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/CompanyController.java b/server/src/main/java/com/doumee/api/business/CompanyController.java
new file mode 100644
index 0000000..06d07ad
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/CompanyController.java
@@ -0,0 +1,102 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Company;
+import com.doumee.service.business.CompanyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "缁勭粐淇℃伅琛�")
+@RestController
+@RequestMapping("/business/company")
+public class CompanyController extends BaseController {
+
+    @Autowired
+    private CompanyService companyService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:company:create")
+    public ApiResponse create(@RequestBody Company company) {
+        return ApiResponse.success(companyService.create(company));
+    }
+    @PreventRepeat
+    @ApiOperation("鍚屾閮ㄩ棬淇℃伅")
+    @PostMapping("/syncAll")
+    @RequiresPermissions("business:company:create")
+    public ApiResponse syncAll(@RequestBody Company company) {
+        return ApiResponse.success(companyService.syncAll(company));
+    }
+
+    @ApiOperation("缁勭粐鏍戞煡璇�")
+    @PostMapping("/tree")
+    @RequiresPermissions("business:company:query")
+    public ApiResponse<List<Company>> tree (@RequestBody Company company){
+        return ApiResponse.success(companyService.companyTree());
+    }
+
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:company:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        companyService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:company:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        companyService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:company:update")
+    public ApiResponse updateById(@RequestBody Company company) {
+        companyService.updateById(company);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:company:query")
+    public ApiResponse<PageData<Company>> findPage (@RequestBody PageWrap<Company> pageWrap) {
+        return ApiResponse.success(companyService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:company:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Company> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Company.class).exportData(companyService.findPage(pageWrap).getRecords(), "缁勭粐淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:company:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(companyService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/CompanyMemberController.java b/server/src/main/java/com/doumee/api/business/CompanyMemberController.java
new file mode 100644
index 0000000..4bd5e0b
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/CompanyMemberController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.CompanyMember;
+import com.doumee.service.business.CompanyMemberService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/03 16:30
+ */
+@Api(tags = "浜哄憳淇℃伅琛�")
+@RestController
+@RequestMapping("/business/companyMember")
+public class CompanyMemberController extends BaseController {
+
+    @Autowired
+    private CompanyMemberService companyMemberService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:companymember:create")
+    public ApiResponse create(@RequestBody CompanyMember companyMember) {
+        return ApiResponse.success(companyMemberService.create(companyMember));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:companymember:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        companyMemberService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:companymember:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        companyMemberService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:companymember:update")
+    public ApiResponse updateById(@RequestBody CompanyMember companyMember) {
+        companyMemberService.updateById(companyMember);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:companymember:query")
+    public ApiResponse<PageData<CompanyMember>> findPage (@RequestBody PageWrap<CompanyMember> pageWrap) {
+        return ApiResponse.success(companyMemberService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:companymember:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<CompanyMember> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(CompanyMember.class).exportData(companyMemberService.findPage(pageWrap).getRecords(), "浜哄憳淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:companymember:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(companyMemberService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/ManagersController.java b/server/src/main/java/com/doumee/api/business/ManagersController.java
new file mode 100644
index 0000000..0e3170f
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/ManagersController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Managers;
+import com.doumee.service.business.ManagersService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "璐d换浜轰俊鎭〃")
+@RestController
+@RequestMapping("/business/managers")
+public class ManagersController extends BaseController {
+
+    @Autowired
+    private ManagersService managersService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:managers:create")
+    public ApiResponse create(@RequestBody Managers managers) {
+        return ApiResponse.success(managersService.create(managers));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:managers:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        managersService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:managers:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        managersService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:managers:update")
+    public ApiResponse updateById(@RequestBody Managers managers) {
+        managersService.updateById(managers);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:managers:query")
+    public ApiResponse<PageData<Managers>> findPage (@RequestBody PageWrap<Managers> pageWrap) {
+        return ApiResponse.success(managersService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:managers:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Managers> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Managers.class).exportData(managersService.findPage(pageWrap).getRecords(), "璐d换浜轰俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:managers:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(managersService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/MemberController.java b/server/src/main/java/com/doumee/api/business/MemberController.java
new file mode 100644
index 0000000..5d897aa
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/MemberController.java
@@ -0,0 +1,92 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Member;
+import com.doumee.service.business.MemberService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "浜哄憳淇℃伅琛�")
+@RestController
+@RequestMapping("/business/member")
+public class MemberController extends BaseController {
+
+    @Autowired
+    private MemberService memberService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:member:create")
+    public ApiResponse create(@RequestBody Member member) {
+        return ApiResponse.success(memberService.create(member));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:member:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        memberService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:member:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        memberService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鍏ㄩ噺淇℃伅鍚屾")
+    @PostMapping("/syncAll")
+    @RequiresPermissions("business:member:create")
+    public ApiResponse syncAll( ){
+        memberService.syncQwAll();
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:member:update")
+    public ApiResponse updateById(@RequestBody Member member) {
+        memberService.updateById(member);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:member:query")
+    public ApiResponse<PageData<Member>> findPage (@RequestBody PageWrap<Member> pageWrap) {
+        return ApiResponse.success(memberService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:member:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Member> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Member.class).exportData(memberService.findPage(pageWrap).getRecords(), "浜哄憳淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:member:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(memberService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/MultifileController.java b/server/src/main/java/com/doumee/api/business/MultifileController.java
new file mode 100644
index 0000000..0fc4546
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/MultifileController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Multifile;
+import com.doumee.service.business.MultifileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "闄勪欢涓婁紶淇℃伅琛�")
+@RestController
+@RequestMapping("/business/multifile")
+public class MultifileController extends BaseController {
+
+    @Autowired
+    private MultifileService multifileService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:multifile:create")
+    public ApiResponse create(@RequestBody Multifile multifile) {
+        return ApiResponse.success(multifileService.create(multifile));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:multifile:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        multifileService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:multifile:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        multifileService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:multifile:update")
+    public ApiResponse updateById(@RequestBody Multifile multifile) {
+        multifileService.updateById(multifile);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:multifile:query")
+    public ApiResponse<PageData<Multifile>> findPage (@RequestBody PageWrap<Multifile> pageWrap) {
+        return ApiResponse.success(multifileService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:multifile:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Multifile> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Multifile.class).exportData(multifileService.findPage(pageWrap).getRecords(), "闄勪欢涓婁紶淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:multifile:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(multifileService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/NoticesController.java b/server/src/main/java/com/doumee/api/business/NoticesController.java
new file mode 100644
index 0000000..c494e2f
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/NoticesController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Notices;
+import com.doumee.service.business.NoticesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "绯荤粺娑堟伅淇℃伅琛�")
+@RestController
+@RequestMapping("/business/notices")
+public class NoticesController extends BaseController {
+
+    @Autowired
+    private NoticesService noticesService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:notices:create")
+    public ApiResponse create(@RequestBody Notices notices) {
+        return ApiResponse.success(noticesService.create(notices));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:notices:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        noticesService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:notices:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        noticesService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:notices:update")
+    public ApiResponse updateById(@RequestBody Notices notices) {
+        noticesService.updateById(notices);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:notices:query")
+    public ApiResponse<PageData<Notices>> findPage (@RequestBody PageWrap<Notices> pageWrap) {
+        return ApiResponse.success(noticesService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:notices:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Notices> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Notices.class).exportData(noticesService.findPage(pageWrap).getRecords(), "绯荤粺娑堟伅淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:notices:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(noticesService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/WorkorderController.java b/server/src/main/java/com/doumee/api/business/WorkorderController.java
new file mode 100644
index 0000000..5a053ad
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/WorkorderController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Workorder;
+import com.doumee.service.business.WorkorderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "宸ュ崟淇℃伅琛�")
+@RestController
+@RequestMapping("/business/workorder")
+public class WorkorderController extends BaseController {
+
+    @Autowired
+    private WorkorderService workorderService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:workorder:create")
+    public ApiResponse create(@RequestBody Workorder workorder) {
+        return ApiResponse.success(workorderService.create(workorder));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:workorder:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        workorderService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:workorder:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        workorderService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:workorder:update")
+    public ApiResponse updateById(@RequestBody Workorder workorder) {
+        workorderService.updateById(workorder);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:workorder:query")
+    public ApiResponse<PageData<Workorder>> findPage (@RequestBody PageWrap<Workorder> pageWrap) {
+        return ApiResponse.success(workorderService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:workorder:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Workorder> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Workorder.class).exportData(workorderService.findPage(pageWrap).getRecords(), "宸ュ崟淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:workorder:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(workorderService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/business/WorkorderLogController.java b/server/src/main/java/com/doumee/api/business/WorkorderLogController.java
new file mode 100644
index 0000000..ea3c688
--- /dev/null
+++ b/server/src/main/java/com/doumee/api/business/WorkorderLogController.java
@@ -0,0 +1,85 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.WorkorderLog;
+import com.doumee.service.business.WorkorderLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Api(tags = "宸ュ崟鎿嶄綔鍘嗗彶琛�")
+@RestController
+@RequestMapping("/business/workorderLog")
+public class WorkorderLogController extends BaseController {
+
+    @Autowired
+    private WorkorderLogService workorderLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:workorderlog:create")
+    public ApiResponse create(@RequestBody WorkorderLog workorderLog) {
+        return ApiResponse.success(workorderLogService.create(workorderLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:workorderlog:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        workorderLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:workorderlog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        workorderLogService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:workorderlog:update")
+    public ApiResponse updateById(@RequestBody WorkorderLog workorderLog) {
+        workorderLogService.updateById(workorderLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:workorderlog:query")
+    public ApiResponse<PageData<WorkorderLog>> findPage (@RequestBody PageWrap<WorkorderLog> pageWrap) {
+        return ApiResponse.success(workorderLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:workorderlog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<WorkorderLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(WorkorderLog.class).exportData(workorderLogService.findPage(pageWrap).getRecords(), "宸ュ崟鎿嶄綔鍘嗗彶琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:workorderlog:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(workorderLogService.findById(id));
+    }
+}
diff --git a/server/src/main/java/com/doumee/api/common/CaptchaController.java b/server/src/main/java/com/doumee/api/common/CaptchaController.java
index 1f9a94e..db52fe6 100644
--- a/server/src/main/java/com/doumee/api/common/CaptchaController.java
+++ b/server/src/main/java/com/doumee/api/common/CaptchaController.java
@@ -12,7 +12,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "鍥剧墖楠岃瘉鐮佹帴鍙�")
diff --git a/server/src/main/java/com/doumee/api/common/LocalFileAccessController.java b/server/src/main/java/com/doumee/api/common/LocalFileAccessController.java
index 5ffd5ce..d767325 100644
--- a/server/src/main/java/com/doumee/api/common/LocalFileAccessController.java
+++ b/server/src/main/java/com/doumee/api/common/LocalFileAccessController.java
@@ -36,8 +36,8 @@
         String encodeFileName = URLEncoder.encode(StringUtils.isBlank(name) ? file.getName() : name, StandardCharsets.UTF_8.toString());
         response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
         response.setContentType("application/octet-stream");
-        response.setHeader("eva-opera-type", "download");
-        response.setHeader("eva-download-filename", encodeFileName);
+        response.setHeader("doumee-opera-type", "download");
+        response.setHeader("doumee-download-filename", encodeFileName);
         response.getOutputStream().write(os.toByteArray());
     }
 }
diff --git a/server/src/main/java/com/doumee/api/system/SystemController.java b/server/src/main/java/com/doumee/api/system/SystemController.java
index 642ea75..bc0621e 100644
--- a/server/src/main/java/com/doumee/api/system/SystemController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemController.java
@@ -21,7 +21,7 @@
 import javax.servlet.http.HttpServletRequest;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺鍔熻兘")
diff --git a/server/src/main/java/com/doumee/api/system/SystemDictController.java b/server/src/main/java/com/doumee/api/system/SystemDictController.java
index b2dde0a..28f93f1 100644
--- a/server/src/main/java/com/doumee/api/system/SystemDictController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemDictController.java
@@ -22,7 +22,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺瀛楀吀")
diff --git a/server/src/main/java/com/doumee/api/system/SystemDictDataController.java b/server/src/main/java/com/doumee/api/system/SystemDictDataController.java
index 934b3ff..b9f529a 100644
--- a/server/src/main/java/com/doumee/api/system/SystemDictDataController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemDictDataController.java
@@ -23,7 +23,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "瀛楀吀鏁版嵁")
diff --git a/server/src/main/java/com/doumee/api/system/SystemJobController.java b/server/src/main/java/com/doumee/api/system/SystemJobController.java
index 70a4972..dda3e92 100644
--- a/server/src/main/java/com/doumee/api/system/SystemJobController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemJobController.java
@@ -28,7 +28,7 @@
 
 /**
  * 瀹氭椂浠诲姟鍒楄〃鎺ュ彛
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @RestController
diff --git a/server/src/main/java/com/doumee/api/system/SystemJobLogController.java b/server/src/main/java/com/doumee/api/system/SystemJobLogController.java
index 83ce0d9..794977e 100644
--- a/server/src/main/java/com/doumee/api/system/SystemJobLogController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemJobLogController.java
@@ -15,7 +15,7 @@
 import org.springframework.web.bind.annotation.*;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺瀹氭椂浠诲姟鏃ュ織")
diff --git a/server/src/main/java/com/doumee/api/system/SystemJobSnippetController.java b/server/src/main/java/com/doumee/api/system/SystemJobSnippetController.java
index 28e7924..6ca5b3f 100644
--- a/server/src/main/java/com/doumee/api/system/SystemJobSnippetController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemJobSnippetController.java
@@ -24,7 +24,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "瀹氭椂浠诲姟鐗囨")
diff --git a/server/src/main/java/com/doumee/api/system/SystemLoginLogController.java b/server/src/main/java/com/doumee/api/system/SystemLoginLogController.java
index aa1ae10..f9034f5 100644
--- a/server/src/main/java/com/doumee/api/system/SystemLoginLogController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemLoginLogController.java
@@ -17,7 +17,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @RestController
diff --git a/server/src/main/java/com/doumee/api/system/SystemMenuController.java b/server/src/main/java/com/doumee/api/system/SystemMenuController.java
index d151cbb..5ecbdd5 100644
--- a/server/src/main/java/com/doumee/api/system/SystemMenuController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemMenuController.java
@@ -19,7 +19,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺鑿滃崟")
diff --git a/server/src/main/java/com/doumee/api/system/SystemMonitorController.java b/server/src/main/java/com/doumee/api/system/SystemMonitorController.java
index 51e9897..47599f6 100644
--- a/server/src/main/java/com/doumee/api/system/SystemMonitorController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemMonitorController.java
@@ -13,7 +13,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺鐩戝惉")
diff --git a/server/src/main/java/com/doumee/api/system/SystemPermissionController.java b/server/src/main/java/com/doumee/api/system/SystemPermissionController.java
index 3c8dd99..714e74f 100644
--- a/server/src/main/java/com/doumee/api/system/SystemPermissionController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemPermissionController.java
@@ -19,7 +19,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺鏉冮檺")
diff --git a/server/src/main/java/com/doumee/api/system/SystemRoleController.java b/server/src/main/java/com/doumee/api/system/SystemRoleController.java
index 28b63c3..a97571a 100644
--- a/server/src/main/java/com/doumee/api/system/SystemRoleController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemRoleController.java
@@ -24,7 +24,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "绯荤粺瑙掕壊")
diff --git a/server/src/main/java/com/doumee/api/system/SystemTraceLogController.java b/server/src/main/java/com/doumee/api/system/SystemTraceLogController.java
index 5ecfc0f..79ac2d9 100644
--- a/server/src/main/java/com/doumee/api/system/SystemTraceLogController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemTraceLogController.java
@@ -17,7 +17,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "璺熻釜鏃ュ織")
diff --git a/server/src/main/java/com/doumee/api/system/SystemUserController.java b/server/src/main/java/com/doumee/api/system/SystemUserController.java
index d3f289a..10d6929 100644
--- a/server/src/main/java/com/doumee/api/system/SystemUserController.java
+++ b/server/src/main/java/com/doumee/api/system/SystemUserController.java
@@ -25,7 +25,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Api(tags = "鐢ㄦ埛")
diff --git a/server/src/main/java/com/doumee/biz/system/SystemDictBiz.java b/server/src/main/java/com/doumee/biz/system/SystemDictBiz.java
index 0c4b1c1..e4eafd7 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemDictBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemDictBiz.java
@@ -4,7 +4,7 @@
 
 /**
  * 瀛楀吀涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemDictBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java b/server/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
index c3dd5a6..f6039cc 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
@@ -3,9 +3,11 @@
 import com.doumee.dao.common.dto.UpdateSortDTO;
 import com.doumee.dao.system.model.SystemDictData;
 
+import java.util.List;
+
 /**
  * 瀛楀吀鏁版嵁涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemDictDataBiz {
@@ -31,4 +33,22 @@
      * @param dto 璇﹁UpdateSortDTO
      */
     void sort(UpdateSortDTO dto);
+
+    String updateQywxToken();
+
+    void updateByIdNew(SystemDictData systemDictData);
+    SystemDictData queryByCode(String dicCode, String label);
+    String  queryCodeById(Integer id);
+
+    List<SystemDictData> queryListByCode(String dicCode, String label);
+    List<SystemDictData> queryDataByCode(String dicCode, String code);
+
+    /**
+     * 鑾峰彇璺緞鍓嶇紑
+     * @param resourceCode
+     * @param targetCode
+     * @return
+     */
+    String getPreFixPath(String resourceCode, String targetCode);
+    void updateByDicId(List<SystemDictData> list);
 }
diff --git a/server/src/main/java/com/doumee/biz/system/SystemJobBiz.java b/server/src/main/java/com/doumee/biz/system/SystemJobBiz.java
index 4b23d31..38a1772 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemJobBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemJobBiz.java
@@ -4,7 +4,7 @@
 
 /**
  * 瀹氭椂浠诲姟涓氬姟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemJobSnippetTriggerBiz.java b/server/src/main/java/com/doumee/biz/system/SystemJobSnippetTriggerBiz.java
index 8178025..576d4c8 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemJobSnippetTriggerBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemJobSnippetTriggerBiz.java
@@ -4,7 +4,7 @@
 
 /**
  * 鍒嗙墖浠诲姟涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobSnippetTriggerBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemJobTriggerBiz.java b/server/src/main/java/com/doumee/biz/system/SystemJobTriggerBiz.java
index 6de66ba..de26329 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemJobTriggerBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemJobTriggerBiz.java
@@ -4,7 +4,7 @@
 
 /**
  * 瀹氭椂浠诲姟涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobTriggerBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemMenuBiz.java b/server/src/main/java/com/doumee/biz/system/SystemMenuBiz.java
index 1cfd34a..cde59e8 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemMenuBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemMenuBiz.java
@@ -9,7 +9,7 @@
 
 /**
  * 绯荤粺鑿滃崟涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemMenuBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemPermissionBiz.java b/server/src/main/java/com/doumee/biz/system/SystemPermissionBiz.java
index 5c2087c..b0a4553 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemPermissionBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemPermissionBiz.java
@@ -6,7 +6,7 @@
 
 /**
  * 绯荤粺鏉冮檺涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemPermissionBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemRoleBiz.java b/server/src/main/java/com/doumee/biz/system/SystemRoleBiz.java
index 831127f..b22ccfb 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemRoleBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemRoleBiz.java
@@ -8,7 +8,7 @@
 
 /**
  * 瑙掕壊鏉冮檺涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemRoleBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/SystemUserBiz.java b/server/src/main/java/com/doumee/biz/system/SystemUserBiz.java
index aa73f35..10c44ac 100644
--- a/server/src/main/java/com/doumee/biz/system/SystemUserBiz.java
+++ b/server/src/main/java/com/doumee/biz/system/SystemUserBiz.java
@@ -9,7 +9,7 @@
 
 /**
  * 绯荤粺鐢ㄦ埛涓氬姟澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemUserBiz {
diff --git a/server/src/main/java/com/doumee/biz/system/dto/TriggerJobDTO.java b/server/src/main/java/com/doumee/biz/system/dto/TriggerJobDTO.java
index 0ce00ac..7cc4926 100644
--- a/server/src/main/java/com/doumee/biz/system/dto/TriggerJobDTO.java
+++ b/server/src/main/java/com/doumee/biz/system/dto/TriggerJobDTO.java
@@ -9,7 +9,7 @@
 import java.util.Date;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/biz/system/dto/TriggerJobSnippetDTO.java b/server/src/main/java/com/doumee/biz/system/dto/TriggerJobSnippetDTO.java
index 5caf2ef..af982c4 100644
--- a/server/src/main/java/com/doumee/biz/system/dto/TriggerJobSnippetDTO.java
+++ b/server/src/main/java/com/doumee/biz/system/dto/TriggerJobSnippetDTO.java
@@ -7,7 +7,7 @@
 import javax.validation.constraints.NotNull;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java b/server/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
index 923cf81..9bcd9b3 100644
--- a/server/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
+++ b/server/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -1,14 +1,23 @@
 package com.doumee.biz.system.impl;
 
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.qiyeweixin.QywxUtil;
 import com.doumee.dao.common.dto.UpdateSortDTO;
+import com.doumee.dao.system.model.SystemDict;
 import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.service.system.SystemDictDataService;
+import com.doumee.service.system.SystemDictService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 @Service
@@ -16,6 +25,8 @@
 
     @Autowired
     private SystemDictDataService systemDictDataService;
+    @Autowired
+    private SystemDictService systemDictService;
 
     @Override
     public Integer create(SystemDictData systemDictData) {
@@ -38,15 +49,20 @@
 
     @Override
     public void updateById(SystemDictData systemDictData) {
-        SystemDictData queryDto = new SystemDictData();
-        queryDto.setDictId(systemDictData.getDictId());
-        queryDto.setCode(systemDictData.getCode());
-        queryDto.setDeleted(Boolean.FALSE);
-        SystemDictData dictData = systemDictDataService.findOne(queryDto);
-        if (dictData != null && !dictData.getId().equals(systemDictData.getId())) {
-            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鏁版嵁鍊煎凡瀛樺湪");
-        }
         systemDictDataService.updateById(systemDictData);
+    }
+    @Override
+    public     String updateQywxToken(){
+        String corpid = queryByCode(Constants.QYWX,Constants.QYWX_CORPID).getCode();
+        String secret = queryByCode(Constants.QYWX,Constants.QYWX_SECRET).getCode();
+        String token = QywxUtil.getAccessToken(corpid,secret);
+       SystemDictData dictData = queryByCode(Constants.QYWX,Constants.QYWX_TOKEN);
+        if (dictData != null  ) {
+            dictData.setCode(token);
+            dictData.setUpdateTime(new Date());
+            systemDictDataService.updateById(dictData);
+        }
+        return  token;
     }
 
     @Override
@@ -88,4 +104,106 @@
         // 淇敼
         systemDictDataService.updateByIdInBatch(dictDataList);
     }
+
+    @Override
+    public SystemDictData queryByCode(String dicCode, String label){
+        SystemDict queryDto = new SystemDict();
+        queryDto.setCode(dicCode);
+        queryDto.setDeleted(Boolean.FALSE);
+        SystemDict dictData = systemDictService.findOne(queryDto);
+        if (dictData == null) {
+            return  new SystemDictData();
+//            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鏁版嵁鍊间笉瀛樺湪");
+        }
+        SystemDictData data = new SystemDictData();
+        data.setDictId(dictData.getId());
+        data.setLabel(label);
+        data.setDeleted(Boolean.FALSE);
+        data = systemDictDataService.findOne(data);
+        if(data == null){
+            data = new SystemDictData();
+        }
+        return data;
+    }
+    @Override
+    public  String  queryCodeById(Integer id){
+        SystemDictData data =  systemDictDataService.findById(id);
+        if(data != null){
+            return  data.getCode();
+        }
+        return null;
+    }
+
+
+    @Override
+    public List<SystemDictData> queryListByCode(String dicCode, String label){
+        SystemDict queryDto = new SystemDict();
+        queryDto.setCode(dicCode);
+        queryDto.setDeleted(Boolean.FALSE);
+        SystemDict dictData = systemDictService.findOne(queryDto);
+        if (dictData == null) {
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鏁版嵁鍊间笉瀛樺湪");
+        }
+        SystemDictData data = new SystemDictData();
+        data.setDictId(dictData.getId());
+        data.setLabel(label);
+        data.setDeleted(Boolean.FALSE);
+        List<SystemDictData> list= systemDictDataService.findList(data);
+
+        return list;
+    }
+
+    @Override
+    public void updateByIdNew(SystemDictData systemDictData) {
+        systemDictDataService.updateById(systemDictData);
+    }
+
+    @Override
+    public List<SystemDictData> queryDataByCode(String dicCode, String code){
+        SystemDict queryDto = new SystemDict();
+        queryDto.setCode(dicCode);
+        queryDto.setDeleted(Boolean.FALSE);
+        SystemDict dictData = systemDictService.findOne(queryDto);
+        if (dictData == null) {
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鏁版嵁鍊间笉瀛樺湪");
+        }
+        SystemDictData data = new SystemDictData();
+        data.setDictId(dictData.getId());
+        data.setCode(code);
+        data.setDeleted(Boolean.FALSE);
+        List<SystemDictData> list= systemDictDataService.findList(data);
+
+        return list;
+    }
+
+    @Override
+    public void updateByDicId(List<SystemDictData> list) {
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        list.stream().forEach(s->{
+            s.setUpdateTime(new Date());
+            s.setUpdateUser(user.getId());
+            systemDictDataService.updateById(s);
+        });
+
+    }
+
+    @Override
+    public String getPreFixPath(String resourceCode, String targetCode) {
+
+        if (StringUtils.isBlank(resourceCode) || StringUtils.isBlank(targetCode)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"璺緞鍙傛暟涓嶅畬鏁�");
+        }
+        SystemDict queryDto = new SystemDict();
+        queryDto.setCode(Constants.FTP);
+        queryDto.setDeleted(Boolean.FALSE);
+        SystemDict dictData = systemDictService.findOne(queryDto);
+        if (dictData == null) {
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鏁版嵁鍊间笉瀛樺湪");
+        }
+        List<SystemDictData> list = systemDictDataService.findList(dictData.getId(), Arrays.asList(resourceCode, targetCode));
+        String resourcePath = list.stream().filter(s->s.getLabel().equals(resourceCode)).findFirst().map(s->s.getCode()).orElse("");
+        String targetPath = list.stream().filter(s -> s.getLabel().equals(targetCode)).findFirst().map(s -> s.getCode()).orElse("");
+        return resourcePath+targetPath;
+    }
+
 }
diff --git a/server/src/main/java/com/doumee/biz/system/impl/SystemJobBizImpl.java b/server/src/main/java/com/doumee/biz/system/impl/SystemJobBizImpl.java
index e73342c..e785cc6 100644
--- a/server/src/main/java/com/doumee/biz/system/impl/SystemJobBizImpl.java
+++ b/server/src/main/java/com/doumee/biz/system/impl/SystemJobBizImpl.java
@@ -1,6 +1,7 @@
 package com.doumee.biz.system.impl;
 
 import com.doumee.biz.system.SystemJobBiz;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.dao.system.model.SystemJob;
@@ -23,6 +24,7 @@
         queryDto.setDisabled(Boolean.FALSE);
         queryDto.setDeleted(Boolean.FALSE);
         queryDto.setHandler(job.getHandler());
+        job.setStatus(Constants.Job.JobStatus.READY.getCode());
         if (systemJobService.count(queryDto) > 0) {
             throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "宸插瓨鍦ㄤ换鍔″鐞嗗櫒'" + job.getHandler() + "'锛岃鍕块噸澶嶇粦瀹�");
         }
diff --git a/server/src/main/java/com/doumee/biz/system/impl/SystemJobTriggerBizImpl.java b/server/src/main/java/com/doumee/biz/system/impl/SystemJobTriggerBizImpl.java
index 6bfa3a0..6a4f965 100644
--- a/server/src/main/java/com/doumee/biz/system/impl/SystemJobTriggerBizImpl.java
+++ b/server/src/main/java/com/doumee/biz/system/impl/SystemJobTriggerBizImpl.java
@@ -149,7 +149,7 @@
      */
     private void lock (SystemJob job) throws LockedException{
         log(job, "Lock job.");
-        if (job.getStatus().equals(Constants.Job.JobStatus.RUNNING.getCode())) {
+        if (Constants.equalsInteger(job.getStatus(),Constants.Job.JobStatus.RUNNING.getCode())) {
             throw new LockedException("EVA: job is running.");
         }
         SystemJob newJob = new SystemJob();
diff --git a/server/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java b/server/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java
index 61f987c..5c4f44b 100644
--- a/server/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java
+++ b/server/src/main/java/com/doumee/biz/system/impl/SystemMenuBizImpl.java
@@ -167,7 +167,7 @@
     /**
      * 濉厖瀛愯彍鍗�
      *
-     * @author Eva.Caesar Liu
+     * @author  dm
      * @since 2022/02/19 18:03
      */
     private void fillChildren(SystemMenuListVO parent, List<SystemMenuListVO> menus) {
@@ -197,7 +197,7 @@
     /**
      * 濉厖瀛愯彍鍗�
      *
-     * @author Eva.Caesar Liu
+     * @author  dm
      * @since 2022/02/19 18:03
      */
     private void fillChildren(SystemMenuNodeVO parent, List<SystemMenu> menus) {
diff --git a/server/src/main/java/com/doumee/config/cache/RedisConfig.java b/server/src/main/java/com/doumee/config/cache/RedisConfig.java
index da86bb2..de523ca 100644
--- a/server/src/main/java/com/doumee/config/cache/RedisConfig.java
+++ b/server/src/main/java/com/doumee/config/cache/RedisConfig.java
@@ -10,7 +10,7 @@
 
 /**
  * Redis閰嶇疆
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/config/cache/RedisValueDefaultSerializer.java b/server/src/main/java/com/doumee/config/cache/RedisValueDefaultSerializer.java
index a155c9f..b3f13e1 100644
--- a/server/src/main/java/com/doumee/config/cache/RedisValueDefaultSerializer.java
+++ b/server/src/main/java/com/doumee/config/cache/RedisValueDefaultSerializer.java
@@ -12,7 +12,7 @@
 
 /**
  * Redis 鍊煎簭鍒楀寲鍣�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 class RedisValueDefaultSerializer<T> implements RedisSerializer<T> {
diff --git a/server/src/main/java/com/doumee/config/exception/GlobalExceptionAdvice.java b/server/src/main/java/com/doumee/config/exception/GlobalExceptionAdvice.java
index a6cece2..f216846 100644
--- a/server/src/main/java/com/doumee/config/exception/GlobalExceptionAdvice.java
+++ b/server/src/main/java/com/doumee/config/exception/GlobalExceptionAdvice.java
@@ -19,7 +19,7 @@
 
 /**
  * 鍏ㄥ眬寮傚父澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java b/server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java
index 2215e4d..bab3e2e 100644
--- a/server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java
+++ b/server/src/main/java/com/doumee/config/mybatis/DmStdOutImpl.java
@@ -20,27 +20,27 @@
 
     public void error(String s, Throwable e) {
         log.error(s);
-        System.err.println(s);
+//        System.err.println(s);
         e.printStackTrace(System.err);
     }
 
     public void error(String s) {
         log.error(s);
-        System.err.println(s);
+//        System.err.println(s);
     }
 
     public void debug(String s) {
         log.info(s);
-        System.out.println(s);
+//        System.out.println(s);
     }
 
     public void trace(String s) {
         log.trace(s);
-        System.out.println(s);
+//        System.out.println(s);
     }
 
     public void warn(String s) {
         log.warn(s);
-        System.out.println(s);
+//        System.out.println(s);
     }
 }
\ No newline at end of file
diff --git a/server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java b/server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java
index fdba210..ac540c8 100644
--- a/server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java
+++ b/server/src/main/java/com/doumee/config/mybatis/MyBatisInterceptor.java
@@ -18,7 +18,7 @@
  * MyBatis 鎷︽埅鍣�
  * - INSERT璇彞榛樿濉厖鍒涘缓浜哄拰鍒涘缓鏃堕棿瀛楁
  * - UPDATE璇彞榛樿濉厖鏇存柊浜哄拰鏇存柊鏃堕棿瀛楁
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
@@ -81,8 +81,9 @@
         Field operaUserField = ReflectionUtils.findField(target.getClass(), fieldNames[1]);
         if (operaUserField != null) {
             Object operaUser = this.getFieldValue(operaUserField, target);
-            if (operaUser == null) {
-                this.setFieldValue(operaUserField, target, this.getLoginUser().getId());
+            LoginUserInfo user = this.getLoginUser();
+            if (operaUser == null && user!=null) {
+                this.setFieldValue(operaUserField, target, user.getId());
             }
         }
     }
@@ -110,6 +111,11 @@
      * 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
      */
     private LoginUserInfo getLoginUser () {
-        return (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        try {
+                return (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        }catch (Exception e){
+
+        }
+        return null;
     }
 }
diff --git a/server/src/main/java/com/doumee/config/mybatis/MyBatisPlusConfig.java b/server/src/main/java/com/doumee/config/mybatis/MyBatisPlusConfig.java
index 49c1bb3..df51bbe 100644
--- a/server/src/main/java/com/doumee/config/mybatis/MyBatisPlusConfig.java
+++ b/server/src/main/java/com/doumee/config/mybatis/MyBatisPlusConfig.java
@@ -8,7 +8,7 @@
 
 /**
  * MyBatisPlus閰嶇疆
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/config/quartz/JobHandler.java b/server/src/main/java/com/doumee/config/quartz/JobHandler.java
index 29132a3..e150977 100644
--- a/server/src/main/java/com/doumee/config/quartz/JobHandler.java
+++ b/server/src/main/java/com/doumee/config/quartz/JobHandler.java
@@ -11,7 +11,7 @@
 
 /**
  * JOB澶勭悊鍣�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/quartz/JobHandlerWithDisallowConcurrent.java b/server/src/main/java/com/doumee/config/quartz/JobHandlerWithDisallowConcurrent.java
index b407dcd..f85ad47 100644
--- a/server/src/main/java/com/doumee/config/quartz/JobHandlerWithDisallowConcurrent.java
+++ b/server/src/main/java/com/doumee/config/quartz/JobHandlerWithDisallowConcurrent.java
@@ -12,7 +12,7 @@
 
 /**
  * JOB澶勭悊鍣�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/quartz/JobInitializer.java b/server/src/main/java/com/doumee/config/quartz/JobInitializer.java
index f3bd510..0e3e870 100644
--- a/server/src/main/java/com/doumee/config/quartz/JobInitializer.java
+++ b/server/src/main/java/com/doumee/config/quartz/JobInitializer.java
@@ -17,7 +17,7 @@
 
 /**
  * 浠诲姟鍒濆鍖�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/quartz/SnippetScanner.java b/server/src/main/java/com/doumee/config/quartz/SnippetScanner.java
index b327258..c1a61ed 100644
--- a/server/src/main/java/com/doumee/config/quartz/SnippetScanner.java
+++ b/server/src/main/java/com/doumee/config/quartz/SnippetScanner.java
@@ -20,7 +20,7 @@
 /**
  * 鍒嗙墖浠诲姟鎵弿鍣�
  * 璇ュ鐞嗗櫒姣�1绉掓壂鎻廠YSTEM_JOB_SNIPPET琛紝鎵ц杩樻湭鎵ц鐨勫垎鐗囦换鍔�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/quartz/SnippetScannerConfig.java b/server/src/main/java/com/doumee/config/quartz/SnippetScannerConfig.java
index 26a1e34..27fd766 100644
--- a/server/src/main/java/com/doumee/config/quartz/SnippetScannerConfig.java
+++ b/server/src/main/java/com/doumee/config/quartz/SnippetScannerConfig.java
@@ -6,7 +6,7 @@
 
 /**
  * 鍒嗙墖浠诲姟鎵弿鍣ㄩ厤缃�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java b/server/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
index e6682e6..ad18d51 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
@@ -10,7 +10,7 @@
 
 /**
  * Shiro璁よ瘉杩囨护鍣紝澶勭悊鏈璇佹儏鍐电殑鍝嶅簲
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class ShiroAuthFilter extends FormAuthenticationFilter {
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroCache.java b/server/src/main/java/com/doumee/config/shiro/ShiroCache.java
index 61eaa6a..6238ac5 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroCache.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroCache.java
@@ -21,7 +21,7 @@
 
 /**
  * Shiro缂撳瓨
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Scope(value = "prototype")
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java b/server/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
index 916f667..98f1451 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
@@ -13,7 +13,7 @@
 
 /**
  * 鑷畾涔塖hiro CacheManager
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroConfig.java b/server/src/main/java/com/doumee/config/shiro/ShiroConfig.java
index aba2d43..839a4e5 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroConfig.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroConfig.java
@@ -22,7 +22,7 @@
 
 /**
  * Shiro閰嶇疆
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java b/server/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
index 1441025..9f66e68 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
@@ -13,7 +13,7 @@
 
 /**
  * Shiro瀵嗙爜姣斿澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Component
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroRealm.java b/server/src/main/java/com/doumee/config/shiro/ShiroRealm.java
index 3557bd3..f451a1c 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroRealm.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroRealm.java
@@ -23,7 +23,7 @@
 
 /**
  * 鑷畾涔塕ealm锛屽鐞嗚璇佸拰鏉冮檺
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Component
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java b/server/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
index baaef04..39b6075 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
@@ -15,7 +15,7 @@
 
 /**
  * 鑷畾涔塖hiro SessionDAO锛屽皢浼氳瘽淇℃伅瀛樺叆缂撳瓨涓�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java b/server/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
index 42ac640..d0ce8ed 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
@@ -18,13 +18,13 @@
 
 /**
  * 鑷畾涔変細璇濈鐞嗗櫒
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
 public class ShiroSessionManager extends DefaultSessionManager implements WebSessionManager {
 
-    private static final String AUTH_TOKEN = "eva-auth-token";
+    private static final String AUTH_TOKEN = "doumee-auth-token";
 
     @Override
     protected void onStart(Session session, SessionContext context) {
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java b/server/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java
index d126799..e0c3c4d 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java
@@ -10,7 +10,7 @@
 
 /**
  * Session搴忓垪鍖�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class ShiroSessionSerializer implements RedisSerializer<Serializable> {
diff --git a/server/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java b/server/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
index 611f851..139fa96 100644
--- a/server/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
+++ b/server/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
@@ -7,7 +7,7 @@
 
 /**
  * 榛樿Token绠$悊鍣�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Component
diff --git a/server/src/main/java/com/doumee/config/swagger/SwaggerConfig.java b/server/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
index 140a39c..1703ca1 100644
--- a/server/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
+++ b/server/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
@@ -18,7 +18,7 @@
 
 /**
  * Swagger閰嶇疆
- * @author Eva.Caesar Liu
+ * @author  dm
  * @date 2022/03/11 10:24
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java b/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
index 8fd55c6..7751d01 100644
--- a/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
+++ b/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
@@ -12,7 +12,7 @@
 
 /**
  * Swagger鎷︽埅鍣�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @date 2022/04/18 18:12
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java b/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
index f67e9a8..45fb818 100644
--- a/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
+++ b/server/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
@@ -7,7 +7,7 @@
 
 /**
  * Swagger鎷︽埅鍣ㄩ厤缃�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @date 2022/04/18 18:12
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/ExcelDataConverterAdapter.java b/server/src/main/java/com/doumee/core/annotation/excel/ExcelDataConverterAdapter.java
index 8140a08..8d666a4 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/ExcelDataConverterAdapter.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/ExcelDataConverterAdapter.java
@@ -2,7 +2,7 @@
 
 /**
  * Excel鏁版嵁鏍煎紡澶勭悊閫傞厤鍣�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface ExcelDataConverterAdapter {
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java b/server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java
index 955e21a..1a6ac31 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/ExcelExportColumn.java
@@ -7,7 +7,7 @@
 
 /**
  * 鏍囪涓篍xcel瀵煎嚭鍒�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Inherited
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java b/server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
index d9c73ad..dd72cdc 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
@@ -20,7 +20,7 @@
 
 /**
  * Excel瀵煎嚭瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
@@ -111,8 +111,8 @@
             String encodeFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()) + ".xlsx";
             response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
             response.setContentType("application/octet-stream");
-            response.setHeader("eva-opera-type", "download");
-            response.setHeader("eva-download-filename", encodeFileName);
+            response.setHeader("doumee-opera-type", "download");
+            response.setHeader("doumee-download-filename", encodeFileName);
             this.exportData(data, sheetName, response.getOutputStream());
         } catch (IOException e) {
             throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR, e);
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java b/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java
index c897190..75ee333 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportCallback.java
@@ -4,7 +4,7 @@
 
 /**
  * 鏁版嵁瀵煎叆鍥炶皟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface ExcelImportCallback<T> {
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java b/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java
index e4953ac..2f4777c 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/ExcelImportColumn.java
@@ -4,7 +4,7 @@
 
 /**
  * 鏍囪涓篍xcel瀵煎叆鍒�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Inherited
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java b/server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
index 684d1a0..ea4ee4d 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -21,7 +21,7 @@
 
 /**
  * Excel瀵煎叆瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class ExcelImporter<T> {
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java b/server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java
index 58a24b6..107a9d0 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/converter/DoubleToStringConverter.java
@@ -6,7 +6,7 @@
 
 /**
  * 灏忔暟杞瓧绗︿覆
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class DoubleToStringConverter implements ExcelDataConverterAdapter {
diff --git a/server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java b/server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java
index c7643e3..ef0e27b 100644
--- a/server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java
+++ b/server/src/main/java/com/doumee/core/annotation/excel/converter/IntegerToStringConverter.java
@@ -4,7 +4,7 @@
 
 /**
  * 鏁存暟杞瓧绗︿覆
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class IntegerToStringConverter implements ExcelDataConverterAdapter {
diff --git a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeat.java b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeat.java
index 046fc7b..64ecc64 100644
--- a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeat.java
+++ b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeat.java
@@ -4,7 +4,7 @@
 
 /**
  * 闃查噸澶嶆彁浜ゆ敞瑙�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Inherited
diff --git a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatAdapter.java b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatAdapter.java
index 67da204..14c3a76 100644
--- a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatAdapter.java
+++ b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatAdapter.java
@@ -10,7 +10,7 @@
 
 /**
  * 闃查噸澶嶆彁浜ゅ疄鐜版帴鍙�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public abstract class PreventRepeatAdapter {
diff --git a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatDefaultHandler.java b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatDefaultHandler.java
index 11358a8..780998d 100644
--- a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatDefaultHandler.java
+++ b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatDefaultHandler.java
@@ -14,7 +14,7 @@
 
 /**
  * 榛樿闃查噸澶嶆彁浜ゅ疄鐜�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
@@ -43,7 +43,7 @@
     private Map<String, Object> getParameters(HttpServletRequest request) {
         HashMap<String, Object> paramMap = new HashMap<>();
         paramMap.put("REQUEST_URI", request.getRequestURI());
-        paramMap.put("USER_TOKEN", String.valueOf(request.getHeader("eva-auth-token")));
+        paramMap.put("USER_TOKEN", String.valueOf(request.getHeader("doumee-auth-token")));
         paramMap.put("IP", Utils.User_Client.getIP(request));
         return paramMap;
     }
diff --git a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptor.java b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptor.java
index f4af08b..7599f61 100644
--- a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptor.java
+++ b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptor.java
@@ -17,7 +17,7 @@
 
 /**
  * 闃查噸澶嶆彁浜ゅ鐞�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptorConfig.java b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptorConfig.java
index a52396b..862fdb5 100644
--- a/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptorConfig.java
+++ b/server/src/main/java/com/doumee/core/annotation/pr/PreventRepeatInterceptorConfig.java
@@ -7,7 +7,7 @@
 
 /**
  * Swagger鎷︽埅鍣ㄩ厤缃�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/core/annotation/trace/Trace.java b/server/src/main/java/com/doumee/core/annotation/trace/Trace.java
index 133b6df..099b8d2 100644
--- a/server/src/main/java/com/doumee/core/annotation/trace/Trace.java
+++ b/server/src/main/java/com/doumee/core/annotation/trace/Trace.java
@@ -4,7 +4,7 @@
 
 /**
  * 璺熻釜鏃ュ織娉ㄨВ
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Target({ ElementType.METHOD, ElementType.TYPE })
diff --git a/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptor.java b/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptor.java
index fa6d492..b68e4c1 100644
--- a/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptor.java
+++ b/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptor.java
@@ -31,7 +31,7 @@
 
 /**
  * 璺熻釜鏃ュ織澶勭悊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
@@ -142,7 +142,7 @@
         traceLog.setId(Integer.valueOf(traceId.toString()));
         traceLog.setOperaSpendTime(Integer.valueOf("" + (System.currentTimeMillis() - Long.valueOf(traceTime.toString()))));
         // 璁板綍鎿嶄綔鏃ュ織鐘舵��
-        String operaType = response.getHeader("eva-opera-type");
+        String operaType = response.getHeader("doumee-opera-type");
         // - 涓嬭浇鎺ュ彛澶勭悊锛屾棤闇�璁板綍鍝嶅簲鍐呭
         if ("download".equals(operaType)) {
             handleDownloadResponse(traceLog, ex);
diff --git a/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptorConfig.java b/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptorConfig.java
index a0472f7..232243f 100644
--- a/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptorConfig.java
+++ b/server/src/main/java/com/doumee/core/annotation/trace/TraceInterceptorConfig.java
@@ -7,7 +7,7 @@
 
 /**
  * 璺熻釜鎷︽埅鍣ㄩ厤缃�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Configuration
diff --git a/server/src/main/java/com/doumee/core/annotation/trace/TraceStatus.java b/server/src/main/java/com/doumee/core/annotation/trace/TraceStatus.java
index 5722053..b448bd6 100644
--- a/server/src/main/java/com/doumee/core/annotation/trace/TraceStatus.java
+++ b/server/src/main/java/com/doumee/core/annotation/trace/TraceStatus.java
@@ -5,17 +5,17 @@
 
 /**
  * 璺熻釜鐘舵��
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Getter
 @AllArgsConstructor
 public enum TraceStatus {
-    SUCCESS((byte)1, "鎴愬姛"),
-    FAILED((byte)0, "澶辫触"),
+    SUCCESS((int)1, "鎴愬姛"),
+    FAILED((int)0, "澶辫触"),
     ;
 
-    private byte code;
+    private int code;
 
     private String remark;
 }
diff --git a/server/src/main/java/com/doumee/core/annotation/trace/TraceType.java b/server/src/main/java/com/doumee/core/annotation/trace/TraceType.java
index accb7e3..4b2d989 100644
--- a/server/src/main/java/com/doumee/core/annotation/trace/TraceType.java
+++ b/server/src/main/java/com/doumee/core/annotation/trace/TraceType.java
@@ -5,7 +5,7 @@
 
 /**
  * 璺熻釜绫诲瀷
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Getter
diff --git a/server/src/main/java/com/doumee/core/config/ProjectConfig.java b/server/src/main/java/com/doumee/core/config/ProjectConfig.java
index b3ab18a..d078cdb 100644
--- a/server/src/main/java/com/doumee/core/config/ProjectConfig.java
+++ b/server/src/main/java/com/doumee/core/config/ProjectConfig.java
@@ -6,7 +6,7 @@
 
 /**
  * 椤圭洰灞炴�ч厤缃�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/constants/Constants.java b/server/src/main/java/com/doumee/core/constants/Constants.java
index af46337..0196b1c 100644
--- a/server/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/src/main/java/com/doumee/core/constants/Constants.java
@@ -7,10 +7,27 @@
 
 /**
  * 妗嗘灦绾у父閲�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
-public interface Constants {
+public class Constants {
+
+    public static final String FTP ="FTP" ;
+    public static final String FTP_HOST ="FTP_HOST" ;
+    public static final String FTP_PORT ="FTP_PORT" ;
+    public static final String FTP_USERNAME ="FTP_USERNAME" ;
+    public static final String FTP_PWD ="FTP_PWD" ;
+    public static final String FTP_RESOURCE_PATH ="FTP_RESOURCE_PATH" ;
+    public static final String FTP_LOCAL_RESOURCE_PATH ="FTP_LOCAL_RESOURCE_PATH" ;
+    public static final String QYWX_CORPID = "QYWX_CORPID";
+    public static final String QYWX_SECRET = "QYWX_SECRET";
+    public static final String QYWX_TOKEN = "QYWX_TOKEN";
+    public static final String QYWX = "QYWX";
+    public static final  Integer ONE = 1;
+    public static final Integer TWO = 2;
+    public static final Integer ZERO = 0;
+    public static  boolean DEALING_COMPANY_SYNC = false ;
+    public static  boolean DEALING_MEMBER_SYNC = false ;
 
     /**
      * 缂撳瓨Key
@@ -21,7 +38,7 @@
     /**
      * 鎿嶄綔绫诲瀷锛岀敤浜庡仛鎺ュ彛楠岃瘉鍒嗙粍
      */
-    interface OperaType {
+   public interface OperaType {
 
         /**
          * 鍒涘缓
@@ -39,10 +56,32 @@
         interface UpdateStatus {}
     }
 
+
+    public static boolean equalsInteger(Integer a, Integer b) {
+        if (formatIntegerNum(a) == formatIntegerNum(b)) {
+            return true;
+        }
+        return false;
+    }
+
+    public static int formatIntegerNum(Integer d) {
+        if (d == null) {
+            d = 0;
+        }
+        return d.intValue();
+    }
+
+    public static long formatLongNum(Long d) {
+        if (d == null) {
+            d = 0L;
+        }
+        return d.longValue();
+    }
+
     /**
      * Job甯搁噺
      */
-    interface Job {
+    public interface Job {
 
         // jobId鍦↗OB瀹炰緥涓殑瀛樺偍鍙傛暟閿�
         String JOB_DATA_MAP_JOB_ID = "JOB_ID";
@@ -53,11 +92,11 @@
         @Getter
         @AllArgsConstructor
         enum JobStatus {
-            PAUSE((byte) -1, "鏆傚仠"),
-            READY((byte) 0, "宸插噯澶�"),
-            RUNNING((byte) 1, "杩愯涓�"),
+            PAUSE( -1, "鏆傚仠"),
+            READY(  0, "宸插噯澶�"),
+            RUNNING( 1, "杩愯涓�"),
             ;
-            private byte code;
+            private int code;
             private String remark;
         }
 
@@ -67,12 +106,12 @@
         @Getter
         @AllArgsConstructor
         enum SnippetStatus {
-            READY((byte) 0, "宸插噯澶�"),
-            RUNNING((byte) 1, "杩愯涓�"),
-            SUCCESS((byte) 2, "鎵ц鎴愬姛"),
-            FAILED((byte) -2, "鎵ц澶辫触"),
+            READY((int) 0, "宸插噯澶�"),
+            RUNNING((int) 1, "杩愯涓�"),
+            SUCCESS((int) 2, "鎵ц鎴愬姛"),
+            FAILED((int) -2, "鎵ц澶辫触"),
             ;
-            private byte code;
+            private int code;
             private String remark;
         }
 
@@ -82,12 +121,12 @@
         @Getter
         @AllArgsConstructor
         enum LogStatus {
-            FAILED((byte) 0, "鎵ц澶辫触"),
-            SUCCESS((byte) 1, "鎵ц鎴愬姛"),
-            IGNORE((byte) 2, "璺宠繃"),
-            NONE((byte) -1, "鎵ц涓�"),
+            FAILED((int) 0, "鎵ц澶辫触"),
+            SUCCESS((int) 1, "鎵ц鎴愬姛"),
+            IGNORE((int) 2, "璺宠繃"),
+            NONE((int) -1, "鎵ц涓�"),
             ;
-            private byte code;
+            private int code;
             private String remark;
         }
 
@@ -110,13 +149,13 @@
      */
     @Getter
     @AllArgsConstructor
-    enum ExceptionLevel {
-        DANGER((byte)10, "楂�"),
-        WARN((byte)5, "涓�"),
-        LOW((byte)0, "浣�"),
+  public  enum ExceptionLevel {
+        DANGER((int)10, "楂�"),
+        WARN((int)5, "涓�"),
+        LOW((int)0, "浣�"),
         ;
 
-        private byte level;
+        private int level;
 
         private String remark;
     }
@@ -124,7 +163,7 @@
     /**
      * MyBatis鑷姩娉ㄥ叆蹇界暐
      */
-    interface Ignore {
+    public interface Ignore {
         /**
          * 蹇界暐鏃堕棿锛屽綋涓嶉渶瑕佹洿鏂癱reateTime/updateTime鏃讹紝鍙娇鐢ㄨ甯搁噺杩涜濉厖銆�
          */
diff --git a/server/src/main/java/com/doumee/core/constants/ResponseStatus.java b/server/src/main/java/com/doumee/core/constants/ResponseStatus.java
index 653bf32..44287c4 100644
--- a/server/src/main/java/com/doumee/core/constants/ResponseStatus.java
+++ b/server/src/main/java/com/doumee/core/constants/ResponseStatus.java
@@ -5,7 +5,7 @@
 
 /**
  * 鍝嶅簲鐘舵�佸畾涔�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Getter
diff --git a/server/src/main/java/com/doumee/core/exception/BusinessException.java b/server/src/main/java/com/doumee/core/exception/BusinessException.java
index 40be1a7..ef08559 100644
--- a/server/src/main/java/com/doumee/core/exception/BusinessException.java
+++ b/server/src/main/java/com/doumee/core/exception/BusinessException.java
@@ -5,7 +5,7 @@
 
 /**
  * 涓氬姟寮傚父瀵硅薄
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/exception/LockedException.java b/server/src/main/java/com/doumee/core/exception/LockedException.java
index 8d21247..bb39f5b 100644
--- a/server/src/main/java/com/doumee/core/exception/LockedException.java
+++ b/server/src/main/java/com/doumee/core/exception/LockedException.java
@@ -2,7 +2,7 @@
 
 /**
  * 鏁版嵁宸茶閿佸畾寮傚父
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class LockedException extends Exception {
diff --git a/server/src/main/java/com/doumee/core/exception/UnSafeSessionException.java b/server/src/main/java/com/doumee/core/exception/UnSafeSessionException.java
index 6db7142..bbedf6c 100644
--- a/server/src/main/java/com/doumee/core/exception/UnSafeSessionException.java
+++ b/server/src/main/java/com/doumee/core/exception/UnSafeSessionException.java
@@ -2,7 +2,7 @@
 
 /**
  * 涓嶅畨鍏ㄧ殑浼氳瘽寮傚父
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class UnSafeSessionException extends RuntimeException {
diff --git a/server/src/main/java/com/doumee/core/job/BaseJob.java b/server/src/main/java/com/doumee/core/job/BaseJob.java
index 732cf65..0ed7116 100644
--- a/server/src/main/java/com/doumee/core/job/BaseJob.java
+++ b/server/src/main/java/com/doumee/core/job/BaseJob.java
@@ -2,7 +2,7 @@
 
 /**
  * JOB鐖剁被锛屾墍鏈塉OB鍧囩户鎵胯绫�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public abstract class BaseJob {
diff --git a/server/src/main/java/com/doumee/core/job/JobContext.java b/server/src/main/java/com/doumee/core/job/JobContext.java
index 76ef568..f176795 100644
--- a/server/src/main/java/com/doumee/core/job/JobContext.java
+++ b/server/src/main/java/com/doumee/core/job/JobContext.java
@@ -4,7 +4,7 @@
 
 /**
  * 浠诲姟鎵ц涓婁笅鏂�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/job/JobParam.java b/server/src/main/java/com/doumee/core/job/JobParam.java
index 1fd19d0..718e2d2 100644
--- a/server/src/main/java/com/doumee/core/job/JobParam.java
+++ b/server/src/main/java/com/doumee/core/job/JobParam.java
@@ -7,7 +7,7 @@
 
 /**
  * JOB鍏ュ弬
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class JobParam extends HashMap<String, Object> {
diff --git a/server/src/main/java/com/doumee/core/job/SchedulerProxy.java b/server/src/main/java/com/doumee/core/job/SchedulerProxy.java
index 97e0b86..4ecf7a1 100644
--- a/server/src/main/java/com/doumee/core/job/SchedulerProxy.java
+++ b/server/src/main/java/com/doumee/core/job/SchedulerProxy.java
@@ -13,7 +13,7 @@
 
 /**
  * 浠诲姟璋冨害鍣ㄤ唬鐞�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/model/LoginUserInfo.java b/server/src/main/java/com/doumee/core/model/LoginUserInfo.java
index 64ac7f0..7ccba6a 100644
--- a/server/src/main/java/com/doumee/core/model/LoginUserInfo.java
+++ b/server/src/main/java/com/doumee/core/model/LoginUserInfo.java
@@ -14,7 +14,7 @@
 
 /**
  * 鐧诲綍鐢ㄦ埛淇℃伅
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/model/PageData.java b/server/src/main/java/com/doumee/core/model/PageData.java
index eeb6672..da20ae8 100644
--- a/server/src/main/java/com/doumee/core/model/PageData.java
+++ b/server/src/main/java/com/doumee/core/model/PageData.java
@@ -10,7 +10,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/model/PageWrap.java b/server/src/main/java/com/doumee/core/model/PageWrap.java
index df205d5..56a093f 100644
--- a/server/src/main/java/com/doumee/core/model/PageWrap.java
+++ b/server/src/main/java/com/doumee/core/model/PageWrap.java
@@ -10,7 +10,7 @@
 
 /**
  * 鍒嗛〉璇锋眰鍙傛暟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateInputStream.java b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateInputStream.java
index eae3915..1a4bc38 100644
--- a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateInputStream.java
+++ b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateInputStream.java
@@ -7,7 +7,7 @@
 
 /**
  * 鍖呭惈鍓湰鐨勮緭鍏ユ祦
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class ServletDuplicateInputStream extends ServletInputStream {
diff --git a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateOutputStream.java b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateOutputStream.java
index 9487c95..f9cc6ea 100644
--- a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateOutputStream.java
+++ b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateOutputStream.java
@@ -9,7 +9,7 @@
 
 /**
  * 鍖呭惈鍓湰鐨勮緭鍑烘祦
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
  @Data
diff --git a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateRequestWrapper.java b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateRequestWrapper.java
index 9dae047..88a39d8 100644
--- a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateRequestWrapper.java
+++ b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateRequestWrapper.java
@@ -13,7 +13,7 @@
 
 /**
  * 澧炲姞璇锋眰娴佸壇鏈�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Getter
diff --git a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateResponseWrapper.java b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateResponseWrapper.java
index eb6d214..759a487 100644
--- a/server/src/main/java/com/doumee/core/servlet/ServletDuplicateResponseWrapper.java
+++ b/server/src/main/java/com/doumee/core/servlet/ServletDuplicateResponseWrapper.java
@@ -9,7 +9,7 @@
 
 /**
  * 澧炲姞鍝嶅簲娴佸壇鏈�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/servlet/ServletRewriteFilter.java b/server/src/main/java/com/doumee/core/servlet/ServletRewriteFilter.java
index 055ef12..c8abfa9 100644
--- a/server/src/main/java/com/doumee/core/servlet/ServletRewriteFilter.java
+++ b/server/src/main/java/com/doumee/core/servlet/ServletRewriteFilter.java
@@ -10,7 +10,7 @@
 
 /**
  * 浼犻�掕姹傛祦/鍝嶅簲娴佸壇鏈�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Component
diff --git a/server/src/main/java/com/doumee/core/utils/DateHelper.java b/server/src/main/java/com/doumee/core/utils/DateHelper.java
index 864e51c..9084802 100644
--- a/server/src/main/java/com/doumee/core/utils/DateHelper.java
+++ b/server/src/main/java/com/doumee/core/utils/DateHelper.java
@@ -7,7 +7,7 @@
 
 /**
  * 鏃ユ湡宸ュ叿
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public final class DateHelper {
diff --git a/server/src/main/java/com/doumee/core/utils/DateUtil.java b/server/src/main/java/com/doumee/core/utils/DateUtil.java
new file mode 100644
index 0000000..637e297
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -0,0 +1,3601 @@
+package com.doumee.core.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.DateFormatSymbols;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+
+/**
+ * 鏃ユ湡宸ュ叿绫�
+ * @author: jiangping
+ * @date:   2021骞�7鏈�21鏃�09:27:13
+ */
+public class DateUtil {
+
+    static SimpleDateFormat sdfShort = new SimpleDateFormat("yyyyMMdd");
+    static SimpleDateFormat sdfLong = new SimpleDateFormat("yyyy-MM-dd");
+    static SimpleDateFormat sdfLongSlash = new SimpleDateFormat("yyyy/MM/dd");
+    static SimpleDateFormat sdfShortPoint = new SimpleDateFormat("yyyy.MM.dd");
+    static SimpleDateFormat sdfLongCn = new SimpleDateFormat("yyyy骞碝M鏈坉d鏃�");
+    static SimpleDateFormat sdfShortU = new SimpleDateFormat("MMM dd", Locale.ENGLISH);
+    static SimpleDateFormat sdfLongU = new SimpleDateFormat("MMM dd,yyyy", Locale.ENGLISH);
+    static SimpleDateFormat sdfLongTime = new SimpleDateFormat("yyyyMMddHHmmss");
+    static SimpleDateFormat sdfLongTimePlus = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    static SimpleDateFormat sdfLongTimePlusSecond = new SimpleDateFormat("HH:mm:ss");
+    static SimpleDateFormat sdfShortLongTimePlusCn = new SimpleDateFormat("yyyy骞碝M鏈坉d鏃� HH:mm");
+    static SimpleDateFormat sdfShortLongTimePlusCn2 = new SimpleDateFormat("yyyy骞碝M鏈坉d鏃� HH:mm:ss");
+    static SimpleDateFormat sdfLongTimePlusMill = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
+    static SimpleDateFormat sdfMd = new SimpleDateFormat("MM鏈坉d鏃�");
+    static SimpleDateFormat sdfMdHourMinute = new SimpleDateFormat("MM鏈坉d鏃� HH鏃秏m鍒�");
+    private static long DAY_IN_MILLISECOND = 0x5265c00L;
+
+    public DateUtil() {
+    }
+
+    /**
+     * 浼犲叆Data绫诲瀷鏃ユ湡锛岃繑鍥炲瓧绗︿覆绫诲瀷鏃堕棿锛圛SO8601鏍囧噯鏃堕棿锛�
+     * @param date
+     * @return
+     */
+    public static String getISO8601Timestamp(Date date){
+        try {
+            TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+            //TimeZone tz = TimeZone.getTimeZone("GMT-01");
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+'08:00");
+            df.setTimeZone(tz);
+            String nowAsISO = df.format(date);
+            return nowAsISO;
+        }catch (Exception e){
+        }
+        return  null;
+    }
+    /**
+     * 浼犲叆Data绫诲瀷鏃ユ湡锛岃繑鍥炲瓧绗︿覆绫诲瀷鏃堕棿锛圛SO8601鏍囧噯鏃堕棿锛�
+     * @param date
+     * @return
+     */
+    public static String getISO8601Timestamp2(Date date){
+        try {
+            TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+            //TimeZone tz = TimeZone.getTimeZone("GMT-01");
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+'08:00");
+            df.setTimeZone(tz);
+            String nowAsISO = df.format(date);
+            return nowAsISO;
+        }catch (Exception e){
+        }
+        return  null;
+    }
+    public static Date getISO8601DateByStr(String date)  {
+        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+        if(date!=null ){
+            int i = date.indexOf("+");
+            if(i >0){
+                date = date.substring(0,i);
+            }
+        }
+        //TimeZone tz = TimeZone.getTimeZone("GMT-01");2024-10-21T10:40:04+08:00
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
+//        DateFormat df = new SimpleDateFormat("2023-12-08 T 09:25:54.698+08:00");
+        df.setTimeZone(tz);
+        Date nowAsISO = null;
+        try {
+            nowAsISO = df.parse(date);
+        } catch (ParseException e) {
+        }
+        return nowAsISO;
+    }
+    public static Date getISO8601DateByStr2(String date)  {
+        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+        if(date!=null ){
+            int i = date.indexOf("+");
+            if(i >0){
+                date = date.substring(0,i);
+            }
+        }
+        //TimeZone tz = TimeZone.getTimeZone("GMT-01");
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+//        DateFormat df = new SimpleDateFormat("2023-12-08 T 09:25:54.698+08:00");
+        df.setTimeZone(tz);
+        Date nowAsISO = null;
+        try {
+            nowAsISO = df.parse(date);
+        } catch (ParseException e) {
+        }
+        return nowAsISO;
+    }
+
+    public static Date StringToDate2(String DATE) {
+        if(StringUtils.isBlank(DATE)){
+            return null;
+        }
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date dt1 = null;
+        try {
+            dt1 = df.parse(DATE);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return dt1;
+    }
+
+    /**
+     * @author Pablo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format
+     *         Example锛�2008-05-15
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateLong(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfLong.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    public static String getDateLongSlash(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfLongSlash.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * 寰楀嚭涓や釜鏃ユ湡涔嬮棿鐨勯棿闅斿皬鏃�
+     *
+     * @param fromDate
+     *            鏍煎紡涓簓yyy-MM-dd
+     * @param toDate
+     *            鏍煎紡涓簓yyy-MM-dd
+     * @return int
+     */
+    public static long getBetweenHours(Date fromDate, Date toDate) {
+        long m_intervalday = 0;// 鍒濆鍖栨椂闂撮棿闅旂殑鍊间负0
+        // 浣跨敤鐨勬椂闂存牸寮忎负yyyy-MM-dd
+        try {
+            m_intervalday = toDate.getTime() - fromDate.getTime();// 璁$畻鎵�寰椾负寰鏁�
+            m_intervalday = m_intervalday / 1000 / 60 / 60;// 璁$畻鎵�寰楃殑澶╂暟
+
+            return m_intervalday + 1;
+        } catch (Exception e) {
+            return Integer.MIN_VALUE;
+        }
+    }
+
+    /**
+     * @author Pablo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format
+     *         Example锛�2008.03.15
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateShortPoint(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfShortPoint.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    public static int getDateNum(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        try {
+            return calendar.get(Calendar.DAY_OF_MONTH);
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return 0;
+        }
+    }
+
+    /**
+     * @author Pablo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format
+     *         Example锛�2008骞�-05鏈�-15鏃�
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateLongCn(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfLongCn.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * @author vowo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format Example锛�05鏈�-15鏃�
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateMD(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfMd.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * @author Pablo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format
+     *         Example锛�2008骞�-05鏈�-15鏃� 11:05
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateShortLongTimeCn(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfShortLongTimePlusCn.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * @author Pablo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format Example锛欰ug 28,
+     *         2007
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateUS(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfLongU.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * @author Pablo Descrption:取锟矫碉拷前锟斤拷锟斤拷getgetg get Date format Example锛欰ug 28,
+     *         2007
+     * @return String
+     * @throws Exception
+     */
+    public static String getDateUSShort(Date date) {
+        String nowDate = "";
+        try {
+            if (date != null)
+                nowDate = sdfShortU.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            System.out.println("Error at getDate:" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * 绠�鍗曡浆鎹㈡棩鏈熺被鍨嬪埌瀛楃涓茬被鍨嬶紝鏈湴淇℃伅璁句负UK
+     *
+     * @param date
+     * @param format
+     * @return String
+     */
+    public static String getFomartDate(Date date, String format) {
+        try {
+            return new SimpleDateFormat(format, Locale.UK).format(date);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return (date == null) ? new Date().toString() : date.toString();
+        }
+    }
+
+    /**
+     * 鑾峰彇X鏈堜唤涔嬪墠鐨勬湀浠芥暟
+     * @param currentDate
+     * @param month
+     * @return
+     */
+    public static List<String> getBeforMonth(Date currentDate , Integer month) {
+        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
+        SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
+        int currentYear = Integer.parseInt(sdfYear.format(currentDate));
+        int currentMonth = Integer.parseInt(sdfMonth.format(currentDate));
+        List<String> list = new ArrayList<>();
+
+        for (int i = 0; i < month; i++) {
+            int tempYear = currentYear;
+            int tempMonth = currentMonth - i;
+
+            if (tempMonth <= 0) {
+                tempYear--;
+                tempMonth += 12;
+            }
+            list.add(tempYear +"-" + StringUtils.leftPad(Integer.toString(tempMonth),2,"0"));
+        }
+        return list;
+    }
+    /**
+     * 鑾峰彇X鏈堜唤涔嬪墠鐨勬湀浠芥暟
+     * @param currentDate
+     * @param month
+     * @return
+     */
+    public static List<String> getDateListBeforMonth(Date currentDate , Integer month) {
+        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
+        SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
+        int currentYear = Integer.parseInt(sdfYear.format(currentDate));
+        int currentMonth = Integer.parseInt(sdfMonth.format(currentDate));
+        List<String> list = new ArrayList<>();
+
+        for (int i = 0; i < month; i++) {
+            int tempYear = currentYear;
+            int tempMonth = currentMonth - i;
+
+            if (tempMonth <= 0) {
+                tempYear--;
+                tempMonth += 12;
+            }
+            list.add(tempYear +"-" + StringUtils.leftPad(Integer.toString(tempMonth),2,"0"));
+        }
+        return list;
+    }
+
+    public static List<String> getBeforDays(Date currentDate,Integer days){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentDate);
+        Date endDate = currentDate; // 鑾峰彇褰撳墠鏃ユ湡
+        calendar.add(Calendar.DAY_OF_YEAR, -days); // 寰�鍓嶆帹7澶�
+        Date startDate = calendar.getTime(); // 鑾峰彇鎺ㄧ畻鍚庣殑鏃ユ湡
+        List<String> list = new ArrayList<>();
+        while (startDate.before(endDate)) {
+            calendar.add(Calendar.DAY_OF_YEAR, 1); // 鑾峰彇涓嬩竴澶╂棩鏈�
+            startDate = calendar.getTime();
+            list.add(DateUtil.dateToString(startDate,"yyyy-MM-dd"));
+            System.out.println(DateUtil.dateToString(startDate,"yyyy-MM-dd"));
+        }
+        return list;
+    }
+    public static List<Date> getDateListBeforDays(Date currentDate,Integer days){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentDate);
+        Date endDate = currentDate; // 鑾峰彇褰撳墠鏃ユ湡
+        calendar.add(Calendar.DAY_OF_YEAR, -days); // 寰�鍓嶆帹7澶�
+        Date startDate = calendar.getTime(); // 鑾峰彇鎺ㄧ畻鍚庣殑鏃ユ湡
+        List<Date> list = new ArrayList<>();
+        while (startDate.before(endDate)) {
+            calendar.add(Calendar.DAY_OF_YEAR, 1); // 鑾峰彇涓嬩竴澶╂棩鏈�
+            startDate = calendar.getTime();
+            list.add(startDate);
+        }
+        return list;
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡鏃堕棿,鏍煎紡涓�:YYYYMMDDHHMISS
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowLongTime() throws Exception {
+        String nowTime = "";
+        try {
+            java.sql.Date date = null;
+            date = new java.sql.Date(new Date().getTime());
+            nowTime = sdfLongTime.format(date);
+            return nowTime;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡鏃堕棿,鏍煎紡涓�:MM鏈坉d鏃� HH鏃秏m鍒�
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getHourMinute(Date date) throws Exception {
+        String nowTime = "";
+        try {
+            if (date != null) {
+                nowTime = sdfMdHourMinute.format(date);
+            }
+            return nowTime;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:YYYYMMDD
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowShortDate() throws Exception {
+        String nowDate = "";
+        try {
+            java.sql.Date date = null;
+            date = new java.sql.Date(new Date().getTime());
+            nowDate = sdfShort.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:YYYY-MM-DD
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowFormateDate() throws Exception {
+        String nowDate = "";
+        try {
+            java.sql.Date date = null;
+            date = new java.sql.Date(new Date().getTime());
+            nowDate = sdfLong.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:yyyy-MM-dd HH:mm:ss
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowPlusTime()   {
+        String nowDate = "";
+        try {
+            java.sql.Date date = null;
+            date = new java.sql.Date(new Date().getTime());
+            nowDate = sdfLongTimePlus.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:yyyy-MM-dd HH:mm:ss
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getPlusTime(Date date)  {
+        if (date == null)
+            return null;
+        try {
+            String nowDate = sdfLongTimePlus.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:yyyy-MM-dd HH:mm:ss
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getShortTime(Date date) {
+
+        if (date == null)
+            return "";
+        try {
+            String nowDate = sdfLong.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    public static String getShortTimeToNull(Date date) {
+
+        if (date == null)
+            return null;
+        try {
+            String nowDate = sdfLong.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:yyyy-MM-dd HH:mm:ss
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getPlusTime2(Date date) {
+
+        if (date == null)
+            return "";
+        try {
+            String nowDate = sdfLongTimePlus.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡鍒版绉掓瀬,鏍煎紡涓�:yyyyMMddHHmmssSSSS
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowPlusTimeMill() throws Exception {
+        String nowDate = "";
+        try {
+            java.sql.Date date = null;
+            date = new java.sql.Date(new Date().getTime());
+            nowDate = sdfLongTimePlusMill.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * 寰楀埌褰撳墠骞翠唤鍊�:1900
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowYear() throws Exception {
+        String nowYear = "";
+        try {
+            String strTemp = getNowLongTime();
+            nowYear = strTemp.substring(0, 4);
+            return nowYear;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * 寰楀埌褰撳墠鏈堜唤鍊�:12
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowMonth() throws Exception {
+        String nowMonth = "";
+        try {
+            String strTemp = getNowLongTime();
+            nowMonth = strTemp.substring(4, 6);
+            return nowMonth;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * 寰楀埌褰撳墠鏃ユ湡鍊�:30
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowDay() throws Exception {
+        String nowDay = "";
+        try {
+            String strTemp = getNowLongTime();
+            nowDay = strTemp.substring(6, 8);
+            return nowDay;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * 寰楀埌褰撳墠灏忔椂鍊�:23
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getNowHour() throws Exception {
+        String nowHour = "";
+        try {
+            String strTemp = getNowPlusTimeMill();
+            nowHour = strTemp.substring(8, 10);
+            return nowHour;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * 鏍规嵁绉掓暟杩斿洖鏃跺垎绉�
+     *
+     * @param _second
+     *            绉掓暟
+     * @return String
+     * @throws Exception
+     */
+    public static String getTimeBySecond(String _second) throws Exception {
+        String returnTime = "";
+        long longHour = 0;
+        long longMinu = 0;
+        long longSec = 0;
+        try {
+            longSec = Long.parseLong(_second);
+            if (longSec == 0) {
+                returnTime = "0鏃�0鍒�0绉�";
+                return returnTime;
+            }
+            longHour = longSec / 3600; // 鍙栧緱灏忔椂鏁�
+            longSec = longSec % 3600; // 鍙栧緱浣欎笅鐨勭
+            longMinu = longSec / 60; // 鍙栧緱鍒嗘暟
+            longSec = longSec % 60; // 鍙栧緱浣欎笅鐨勭
+            returnTime = longHour + "鏃�" + longMinu + "鍒�" + longSec + "绉�";
+            return returnTime;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+    public static String getTimeStrBySecond(Long seconds)  {
+        String returnTime ="0鏃�0鍒�0绉�";
+        long longHour = 0;
+        long longMinu = 0;
+        long longSec =seconds ==null?0:seconds;
+        try {
+            if (longSec == 0) {
+                returnTime = "0鏃�0鍒�0绉�";
+                return returnTime;
+            }
+            longHour = longSec / 3600; // 鍙栧緱灏忔椂鏁�
+            longSec = longSec % 3600; // 鍙栧緱浣欎笅鐨勭
+            longMinu = longSec / 60; // 鍙栧緱鍒嗘暟
+            longSec = longSec % 60; // 鍙栧緱浣欎笅鐨勭
+            returnTime = longHour + "鏃�" + longMinu + "鍒�" + longSec + "绉�";
+            return returnTime;
+        } catch (Exception e) {
+              e.printStackTrace();
+        }
+        return returnTime;
+    }
+
+    /**
+     * Descrption:鍙栧緱褰撳墠鏃ユ湡,鏍煎紡涓�:yyyy-MM-dd HH:mm:ss
+     *
+     * @return String
+     * @throws Exception
+     */
+    public static String getPlusTimeSecond(Date date) throws Exception {
+        if (date == null)
+            return null;
+        try {
+            String nowDate = sdfLongTimePlusSecond.format(date);
+            return nowDate;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * pablo 鏍规嵁姣鏁拌繑鍥炴椂鍒嗙姣
+     *
+     * @param ms_second
+     *            绉掓暟
+     * @return String
+     * @throws Exception
+     */
+    public static String getTimeBySecond(long ms_second) throws Exception {
+        String returnTime = "";
+        long longHour = 0;
+        long longMinu = 0;
+        long longSec = 0;
+        long longMs = ms_second;
+        try {
+            if (longMs == 0) {
+                returnTime = "0鏃�0鍒�0绉�0姣";
+                return returnTime;
+            }
+            longHour = longMs / 3600000; // 鍙栧緱灏忔椂鏁�
+            longMs = longMs % 3600000; // 鍙栧緱浣欎笅鐨勬绉�
+            longMinu = longMs / 60000; // 鍙栧緱鍒嗘暟
+            longMs = longMs % 60000; // 鍙栧緱浣欎笅鐨勬绉�
+            longSec = longMs / 1000; // 鍙栧緱浣欎笅鐨勭
+            longMs = longMs % 1000; // 鍙栧緱浣欎笅鐨勬绉�
+            returnTime = longHour + "鏃�" + longMinu + "鍒�" + longSec + "绉�" + longMs + "姣";
+            return returnTime;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓殑骞翠唤
+     *
+     * @param date
+     *            鏃ユ湡
+     * @return yyyy鏍煎紡鐨勫勾浠�
+     */
+    public static int convertDateToYear(Date date) {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy", new DateFormatSymbols());
+        return Integer.parseInt(df.format(date));
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓勾鏈堢粍鎴愮殑瀛楃涓�
+     *
+     * @param d
+     *            鏃ユ湡
+     * @return yyyyMM鏍煎紡鐨勫勾鏈堝瓧绗︿覆
+     */
+    public static String convertDateToYearMonth(Date d) {
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMM", new DateFormatSymbols());
+        return df.format(d);
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓勾鏈堟棩缁勬垚鐨勫瓧绗︿覆
+     *
+     * @param d
+     *            鏃ユ湡
+     * @return yyyyMMdd鏍煎紡鐨勫勾鏈堟棩瀛楃涓�
+     */
+    public static String convertDateToYearMonthDay(Date d) {
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd", new DateFormatSymbols());
+        return df.format(d);
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓殑鏈堜唤
+     *
+     * @param d
+     *            鏃ユ湡
+     * @return yyyy鏍煎紡鐨勫勾浠�
+     */
+    public static String convertDateToMonth(Date d) {
+        SimpleDateFormat df = new SimpleDateFormat("MM", new DateFormatSymbols());
+        return df.format(d);
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓殑鏃�
+     *
+     *            鏃ユ湡
+     * @return yyyy鏍煎紡鐨勫勾浠�
+     */
+    public static String convertDateToDay(Date d) {
+        SimpleDateFormat df = new SimpleDateFormat("dd", new DateFormatSymbols());
+        return df.format(d);
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓殑灏忔椂
+     *
+     *            鏃ユ湡
+     * @return HH鏍煎紡鐨勫皬鏃�
+     */
+    public static String convertDateToHour(Date d) {
+        SimpleDateFormat df = new SimpleDateFormat("HH", new DateFormatSymbols());
+        return df.format(d);
+    }
+
+    /**
+     * 寰楀埌鏃ユ湡涓殑鍒嗛挓
+     *
+     * @param d
+     *            鏃ユ湡
+     * @return mm鏍煎紡鐨勫垎閽�
+     */
+    public static String convertDateToMinute(Date d) {
+        SimpleDateFormat df = new SimpleDateFormat("mm", new DateFormatSymbols());
+        return df.format(d);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃ユ湡涓烘棩鏈熷瀷
+     *
+     * @return 褰撳墠鏃ユ湡锛宩ava.util.Date绫诲瀷
+     */
+    public static Date getCurrentDate() {
+        Calendar cal = Calendar.getInstance();
+
+        // String currentDate = null;
+        Date d = cal.getTime();
+
+        return d;
+    }
+
+
+    /**
+     * 鑾峰彇褰撳墠鏃ユ湡涓烘棩鏈熷瀷
+     *
+     * @return 褰撳墠鏃ユ湡锛宩ava.util.Date绫诲瀷
+     */
+    public static Date getCurrentDateDelay() {
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.SECOND, 1);
+        // String currentDate = null;
+        Date d = cal.getTime();
+
+        return d;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠骞存湀鐨勫瓧绗︿覆
+     *
+     * @return 褰撳墠骞存湀锛寉yyyMM鏍煎紡
+     */
+    public static String getCurrentYearMonth() {
+        Calendar cal = Calendar.getInstance();
+        String currentYear = (new Integer(cal.get(Calendar.YEAR))).toString();
+        String currentMonth = null;
+        if (cal.get(Calendar.MONTH) < 9)
+            currentMonth = "0" + (new Integer(cal.get(Calendar.MONTH) + 1)).toString();
+        else
+            currentMonth = (new Integer(cal.get(Calendar.MONTH) + 1)).toString();
+        return (currentYear + currentMonth);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠骞翠负鏁村瀷
+     *
+     * @return 鑾峰彇褰撳墠鏃ユ湡涓殑骞达紝int鍨�
+     */
+    public static int getCurrentYear() {
+        Calendar cal = Calendar.getInstance();
+        int currentYear = cal.get(Calendar.YEAR);
+        return currentYear;
+    }
+
+    /**
+     * 鏂板鐨勬牸寮忓寲鏃堕棿绫�,灏嗘椂闂磋繘琛屾爣鍑嗗寲鏍煎紡,閫傜敤浜庡皢鍓嶅彴浼犲叆鐨勬棩鏈熸牸寮忓寲涓哄疄闄呭彲琛岀殑鏃ユ湡
+     * 濡傚皢20050600鏍煎紡鍖栦负20050601,鎴栧皢20050631鏍煎紡鍖栦负20050630
+     *
+     * @param _dateTime
+     *            浼犲叆鐨勫師鏃堕棿涓�
+     * @param _format
+     *            鏍煎紡绗�,YYYYMMDDHH24MISS,YYYYMMDDHH12MISS
+     * @return String
+     * @throws Exception
+     */
+    public static String formatDateTime(String _dateTime, String _format) throws Exception {
+        String returnValue = "";
+        String formatString = _format.toUpperCase();
+        String strYear = "";
+        String strMonth = "";
+        String strDay = "";
+        String strHour = "";
+        String strMinu = "";
+        String strSec = "";
+        int hourType = 12; // 12灏忔椂鍒�,24灏忔椂鍒�
+        int yearType = 1; // 1涓哄钩骞�,2涓洪棸骞�
+        try {
+            if (formatString.indexOf("YYYY") >= 0) {
+                int tempBeginPlace = formatString.indexOf("YYYY");
+                int temEndPlace = tempBeginPlace + 4;
+                strYear = _dateTime.substring(tempBeginPlace, temEndPlace);
+            }
+            if (formatString.indexOf("MM") >= 0) {
+                int tempBeginPlace = formatString.indexOf("MM");
+                int temEndPlace = tempBeginPlace + 2;
+                strMonth = _dateTime.substring(tempBeginPlace, temEndPlace);
+            }
+            if (formatString.indexOf("DD") >= 0) {
+                int tempBeginPlace = formatString.indexOf("DD");
+                int temEndPlace = tempBeginPlace + 2;
+                strDay = _dateTime.substring(tempBeginPlace, temEndPlace);
+            }
+            if (formatString.indexOf("HH24") >= 0) {
+                int tempBeginPlace = formatString.indexOf("HH24");
+                int temEndPlace = tempBeginPlace + 2;
+                strHour = _dateTime.substring(tempBeginPlace, temEndPlace);
+                formatString = formatString.replaceAll("24", "");
+                // 涓轰簡淇濇寔浣嶆暟涓�鑷�,鍘婚櫎24
+                hourType = 24;
+            } else if (formatString.indexOf("HH12") >= 0) {
+                int tempBeginPlace = formatString.indexOf("HH12");
+                int temEndPlace = tempBeginPlace + 2;
+                strHour = _dateTime.substring(tempBeginPlace, temEndPlace);
+                formatString = formatString.replaceAll("12", "");
+                // 涓轰簡淇濇寔浣嶆暟涓�鑷�,鍘婚櫎12
+                hourType = 12;
+            } else if (formatString.indexOf("HH") >= 0) {
+                int tempBeginPlace = formatString.indexOf("HH");
+                int temEndPlace = tempBeginPlace + 2;
+                strHour = _dateTime.substring(tempBeginPlace, temEndPlace);
+                hourType = 12; // 濡傛灉鏈寚瀹氬皬鏃跺埗,鍒欓粯璁や负12灏忔椂鍒�;
+            }
+            if (formatString.indexOf("MI") >= 0) {
+                int tempBeginPlace = formatString.indexOf("MI");
+                int temEndPlace = tempBeginPlace + 2;
+                strMinu = _dateTime.substring(tempBeginPlace, temEndPlace);
+            }
+            if (formatString.indexOf("SS") >= 0) {
+                int tempBeginPlace = formatString.indexOf("SS");
+                int temEndPlace = tempBeginPlace + 2;
+                strSec = _dateTime.substring(tempBeginPlace, temEndPlace);
+            }
+
+            // 鍒ゆ柇鏄惁鏄棸骞�
+            if (!strYear.equals("")) {
+                int intYear = Integer.parseInt(strYear);
+                // 鑳借4鏁撮櫎锛屼絾涓嶈兘琚�100鏁撮櫎鈶� 鑳借4鏁撮櫎锛屼笖鑳借400
+                if (intYear % 4 == 0) {
+                    if (intYear % 100 != 0) {
+                        yearType = 2;
+                    }
+                }
+                if (intYear % 4 == 0) {
+                    if (intYear % 400 == 0) {
+                        yearType = 2;
+                    }
+                }
+            }
+            // 鏍煎紡鍖栨湀
+            if (!strMonth.equals("")) {
+                int intMonth = Integer.parseInt(strMonth);
+                if (intMonth == 0) {
+                    strMonth = "01";
+                    intMonth = 1;
+                }
+                if (intMonth > 12) {
+                    strMonth = "12";
+                    intMonth = 12;
+                }
+            }
+
+            // 鏍煎紡鍖栨棩
+            if (!strDay.equals("")) {
+                int intDay = Integer.parseInt(strDay);
+                if (intDay == 0) {
+                    strDay = "01";
+                    intDay = 1;
+                }
+                if (intDay > 31) {
+                    strDay = "31";
+                    intDay = 31;
+                }
+                if ((strMonth.equals("01")) || (strMonth.equals("03")) || (strMonth.equals("05"))
+                        || (strMonth.equals("07")) || (strMonth.equals("08")) || (strMonth.equals("10"))
+                        || (strMonth.equals("12"))) {
+                    if (intDay > 31) {
+                        strDay = "31";
+                        intDay = 31;
+                    }
+                }
+                if ((strMonth.equals("02")) || (strMonth.equals("04")) || (strMonth.equals("06"))
+                        || (strMonth.equals("09")) || (strMonth.equals("11"))) {
+                    if (intDay > 30) {
+                        strDay = "30";
+                        intDay = 30;
+                    }
+                    if (strMonth.equals("02")) { // 瀵�2鏈堢殑鐗瑰埆澶勭悊
+                        if (yearType == 2) {
+                            if (intDay > 29) {
+                                strDay = "29";
+                                intDay = 29;
+                            }
+                        } else {
+                            if (intDay > 28) {
+                                strDay = "28";
+                                intDay = 28;
+                            }
+                        }
+                    }
+                }
+
+                // 鏍煎紡鍖栧皬鏃�
+                if (!strHour.equals("")) {
+                    int intHour = Integer.parseInt(strHour);
+                    if (intHour > 24) {
+                        strHour = "24";
+                        intHour = 24;
+                    }
+                    if (hourType == 12) {
+                        if (intHour == 0) {
+                            intHour = 1;
+                            strHour = "01";
+                        }
+                        if (intHour > 12) {
+                            intHour = intHour - 12;
+                            strHour = "0" + intHour;
+                        }
+                    } else {
+                        if (intHour > 23) {
+                            intHour = 23;
+                            strHour = "23";
+                        }
+                    }
+                }
+                // 鏍煎紡鍖栧垎
+                if (!strMinu.equals("")) {
+                    int intMinu = Integer.parseInt(strMinu);
+                    if (intMinu > 59) {
+                        strMinu = "59";
+                        intMinu = 59;
+                    }
+                }
+                // 鏍煎紡鍖栫
+                if (!strSec.equals("")) {
+                    int intSec = Integer.parseInt(strSec);
+                    if (intSec > 59) {
+                        strSec = "59";
+                        intSec = 59;
+                    }
+                }
+            }
+            returnValue = strYear + strMonth + strDay + strHour + strMinu + strSec;
+            return returnValue;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+
+    public static Date StringToDate(String DATE1) {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date dt1 = null;
+        try {
+            dt1 = df.parse(DATE1);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return dt1;
+    }
+
+    /**
+     * 鑾峰彇杈撳叆鏍煎紡鐨勬棩鏈熷瓧绗︿覆锛屽瓧绗︿覆閬靛惊Oracle鏍煎紡
+     *
+     * @param d
+     *            - 鏃ユ湡
+     * @param format
+     *            - 鎸囧畾鏃ユ湡鏍煎紡锛屾牸寮忕殑鍐欐硶涓篛racle鏍煎紡
+     * @return 鎸夋寚瀹氱殑鏃ユ湡鏍煎紡杞崲鍚庣殑鏃ユ湡瀛楃涓�
+     */
+    public static String dateToString(Date d, String format) {
+        if (d == null)
+            return "";
+        Hashtable<Integer, String> h = new Hashtable<Integer, String>();
+        String javaFormat = new String();
+        String s = format.toLowerCase();
+        if (s.indexOf("yyyy") != -1)
+            h.put(new Integer(s.indexOf("yyyy")), "yyyy");
+        else if (s.indexOf("yy") != -1)
+            h.put(new Integer(s.indexOf("yy")), "yy");
+        if (s.indexOf("mm") != -1)
+            h.put(new Integer(s.indexOf("mm")), "MM");
+
+        if (s.indexOf("dd") != -1)
+            h.put(new Integer(s.indexOf("dd")), "dd");
+        if (s.indexOf("hh24") != -1)
+            h.put(new Integer(s.indexOf("hh24")), "HH");
+        if (s.indexOf("mi") != -1)
+            h.put(new Integer(s.indexOf("mi")), "mm");
+        if (s.indexOf("ss") != -1)
+            h.put(new Integer(s.indexOf("ss")), "ss");
+
+        int intStart = 0;
+        while (s.indexOf("-", intStart) != -1) {
+            intStart = s.indexOf("-", intStart);
+            h.put(new Integer(intStart), "-");
+            intStart++;
+        }
+
+        intStart = 0;
+        while (s.indexOf("/", intStart) != -1) {
+            intStart = s.indexOf("/", intStart);
+            h.put(new Integer(intStart), "/");
+            intStart++;
+        }
+
+        intStart = 0;
+        while (s.indexOf(" ", intStart) != -1) {
+            intStart = s.indexOf(" ", intStart);
+            h.put(new Integer(intStart), " ");
+            intStart++;
+        }
+
+        intStart = 0;
+        while (s.indexOf(":", intStart) != -1) {
+            intStart = s.indexOf(":", intStart);
+            h.put(new Integer(intStart), ":");
+            intStart++;
+        }
+
+        if (s.indexOf("骞�") != -1)
+            h.put(new Integer(s.indexOf("骞�")), "骞�");
+        if (s.indexOf("鏈�") != -1)
+            h.put(new Integer(s.indexOf("鏈�")), "鏈�");
+        if (s.indexOf("鏃�") != -1)
+            h.put(new Integer(s.indexOf("鏃�")), "鏃�");
+        if (s.indexOf("鏃�") != -1)
+            h.put(new Integer(s.indexOf("鏃�")), "鏃�");
+        if (s.indexOf("鍒�") != -1)
+            h.put(new Integer(s.indexOf("鍒�")), "鍒�");
+        if (s.indexOf("绉�") != -1)
+            h.put(new Integer(s.indexOf("绉�")), "绉�");
+
+        int i = 0;
+        while (h.size() != 0) {
+            Enumeration<Integer> e = h.keys();
+            int n = 0;
+            while (e.hasMoreElements()) {
+                i = ((Integer) e.nextElement()).intValue();
+                if (i >= n)
+                    n = i;
+            }
+            String temp = (String) h.get(new Integer(n));
+            h.remove(new Integer(n));
+
+            javaFormat = temp + javaFormat;
+        }
+        SimpleDateFormat df = new SimpleDateFormat(javaFormat, new DateFormatSymbols());
+
+        return df.format(d);
+    }
+
+    /**
+     * 鑾峰彇杈撳叆鏍煎紡鐨勬棩鏈熷瓧绗︿覆锛屽瓧绗︿覆閬靛惊Oracle鏍煎紡
+     *
+     * @param d
+     *            - 鏃ユ湡
+     * @param format
+     *            - 鎸囧畾鏃ユ湡鏍煎紡锛屾牸寮忕殑鍐欐硶涓篛racle鏍煎紡
+     * @return 鎸夋寚瀹氱殑鏃ユ湡鏍煎紡杞崲鍚庣殑鏃ユ湡瀛楃涓�
+     */
+    public static String getDate(Date d, String format) {
+        if (d == null)
+            return "";
+        Hashtable<Integer, String> h = new Hashtable<Integer, String>();
+        String javaFormat = new String();
+        String s = format.toLowerCase();
+        if (s.indexOf("yyyy") != -1)
+            h.put(new Integer(s.indexOf("yyyy")), "yyyy");
+        else if (s.indexOf("yy") != -1)
+            h.put(new Integer(s.indexOf("yy")), "yy");
+        if (s.indexOf("mm") != -1)
+            h.put(new Integer(s.indexOf("mm")), "MM");
+
+        if (s.indexOf("dd") != -1)
+            h.put(new Integer(s.indexOf("dd")), "dd");
+        if (s.indexOf("hh24") != -1)
+            h.put(new Integer(s.indexOf("hh24")), "HH");
+        if (s.indexOf("mi") != -1)
+            h.put(new Integer(s.indexOf("mi")), "mm");
+        if (s.indexOf("ss") != -1)
+            h.put(new Integer(s.indexOf("ss")), "ss");
+
+        int intStart = 0;
+        while (s.indexOf("-", intStart) != -1) {
+            intStart = s.indexOf("-", intStart);
+            h.put(new Integer(intStart), "-");
+            intStart++;
+        }
+
+        intStart = 0;
+        while (s.indexOf("/", intStart) != -1) {
+            intStart = s.indexOf("/", intStart);
+            h.put(new Integer(intStart), "/");
+            intStart++;
+        }
+
+        intStart = 0;
+        while (s.indexOf(" ", intStart) != -1) {
+            intStart = s.indexOf(" ", intStart);
+            h.put(new Integer(intStart), " ");
+            intStart++;
+        }
+
+        intStart = 0;
+        while (s.indexOf(":", intStart) != -1) {
+            intStart = s.indexOf(":", intStart);
+            h.put(new Integer(intStart), ":");
+            intStart++;
+        }
+
+        if (s.indexOf("骞�") != -1)
+            h.put(new Integer(s.indexOf("骞�")), "骞�");
+        if (s.indexOf("鏈�") != -1)
+            h.put(new Integer(s.indexOf("鏈�")), "鏈�");
+        if (s.indexOf("鏃�") != -1)
+            h.put(new Integer(s.indexOf("鏃�")), "鏃�");
+        if (s.indexOf("鏃�") != -1)
+            h.put(new Integer(s.indexOf("鏃�")), "鏃�");
+        if (s.indexOf("鍒�") != -1)
+            h.put(new Integer(s.indexOf("鍒�")), "鍒�");
+        if (s.indexOf("绉�") != -1)
+            h.put(new Integer(s.indexOf("绉�")), "绉�");
+
+        int i = 0;
+        while (h.size() != 0) {
+            Enumeration<Integer> e = h.keys();
+            int n = 0;
+            while (e.hasMoreElements()) {
+                i = ((Integer) e.nextElement()).intValue();
+                if (i >= n)
+                    n = i;
+            }
+            String temp = (String) h.get(new Integer(n));
+            h.remove(new Integer(n));
+
+            javaFormat = temp + javaFormat;
+        }
+        SimpleDateFormat df = new SimpleDateFormat(javaFormat, new DateFormatSymbols());
+
+        return df.format(d);
+    }
+
+    /**
+     * 鏍规嵁韬唤璇佸彿鐮佽幏鍙栧勾榫�
+     *
+     * @param id
+     *            韬唤璇佸彿
+     * @throws Exception
+     *             韬唤璇佸彿閿欒鏃跺彂鐢�
+     * @return int - 骞撮緞
+     */
+    public static int getAge(String id) throws Exception {
+        int age = -1;
+        int length = id.length();
+        String birthday = "";
+        if (length == 15) {
+            birthday = id.substring(6, 8);
+            birthday = "19" + birthday;
+        } else if (length == 18) {
+            birthday = id.substring(6, 10);
+        } else {
+            throw new Exception("閿欒鐨勮韩浠借瘉鍙�");
+        }
+        int currentYear = Calendar.getInstance().get(Calendar.YEAR);
+        age = currentYear - (new Integer(birthday)).intValue();
+        return age;
+    }
+
+    /**
+     * 鏍规嵁骞撮緞鑾峰彇鍑虹敓骞翠唤
+     *
+     * @param age
+     *            int 骞撮緞
+     * @return Date - 鍑虹敓骞翠唤
+     */
+    public static java.sql.Date getDateByAge(int age) {
+        Calendar calendar = Calendar.getInstance(Locale.CHINESE);
+        @SuppressWarnings("unused")
+        long current = calendar.getTimeInMillis();
+        calendar.set(calendar.get(Calendar.YEAR) - age, calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
+        return new java.sql.Date((calendar.getTimeInMillis()));
+    }
+
+    /**
+     * 姣旇緝涓や釜鏃ユ湡(骞存湀鍨嬶紝鏍煎紡涓篩YYYMM)涔嬮棿鐩稿樊鏈堜唤
+     *
+     * @param dealMonth
+     *            - 寮�濮嬪勾鏈�
+     * @param alterMonth
+     *            - 缁撴潫骞存湀
+     * @return alterMonth-dealMonth鐩稿樊鐨勬湀鏁�
+     */
+    public static int calBetweenTwoMonth(String dealMonth, String alterMonth) {
+        int length = 0;
+        if ((dealMonth.length() != 6) || (alterMonth.length() != 6)) {
+            // 姣旇緝骞存湀瀛楃涓茬殑闀垮害涓嶆纭�
+            length = -1;
+
+        } else {
+            int dealInt = Integer.parseInt(dealMonth);
+            int alterInt = Integer.parseInt(alterMonth);
+            if (dealInt < alterInt) {
+                // 绗竴涓勾鏈堝彉閲忓簲澶т簬鎴栫瓑浜庣浜屼釜骞存湀鍙橀噺
+                length = -2;
+            } else {
+                int dealYearInt = Integer.parseInt(dealMonth.substring(0, 4));
+                int dealMonthInt = Integer.parseInt(dealMonth.substring(4, 6));
+                int alterYearInt = Integer.parseInt(alterMonth.substring(0, 4));
+                int alterMonthInt = Integer.parseInt(alterMonth.substring(4, 6));
+                length = (dealYearInt - alterYearInt) * 12 + (dealMonthInt - alterMonthInt);
+            }
+        }
+        return length;
+    }
+
+    /**
+     * 寰楀埌X鍒嗛挓鍚庣殑鏃堕棿(鏃堕棿鏍煎紡)
+     *
+     * @param date
+     * @param minute
+     * @return
+     */
+    public static Date getXMinuteAfterDate(Date date, int minute) {
+        if(date ==null){
+            date = new Date();
+        }
+        Calendar now = Calendar.getInstance();
+        now.setTime(date);
+        now.set(Calendar.MINUTE, now.get(Calendar.MINUTE) + minute);
+        return now.getTime();
+    }
+
+    /**
+     * 寰楀埌涓や釜鏃ユ湡涔嬮棿鐩稿樊鐨勫ぉ鏁�
+     *
+     * @param newDate
+     *            澶х殑鏃ユ湡
+     * @param oldDate
+     *            灏忕殑鏃ユ湡
+     * @return newDate-oldDate鐩稿樊鐨勫ぉ鏁�
+     */
+    public static int daysBetweenDates(Date newDate, Date oldDate) {
+        long days = 0;
+        try {
+            long nDay = 0;
+            long oldDay = 0;
+            if (oldDate == null) {
+                oldDay = 0;
+            } else {
+                oldDay = oldDate.getTime();
+            }
+            if (newDate == null) {
+                nDay = 0;
+            } else {
+                nDay = newDate.getTime();
+            }
+            days = (nDay - oldDay) / 1000 / 60 / 60 / 24;
+        } catch (Exception e) {
+            // TODO: handle exception
+        }
+
+        return (int) days;
+    }
+
+    public static int daysBetweenDates11(Date newDate, Date oldDate) {
+        int days = 0;
+        Calendar calo = Calendar.getInstance();
+        Calendar caln = Calendar.getInstance();
+        calo.setTime(oldDate);
+        caln.setTime(newDate);
+        int oday = calo.get(Calendar.DAY_OF_YEAR);
+        int nyear = caln.get(Calendar.YEAR);
+        int oyear = calo.get(Calendar.YEAR);
+        while (nyear > oyear) {
+            calo.set(Calendar.MONTH, 11);
+            calo.set(Calendar.DATE, 31);
+            days = days + calo.get(Calendar.DAY_OF_YEAR);
+            oyear = oyear + 1;
+            calo.set(Calendar.YEAR, oyear);
+        }
+        int nday = caln.get(Calendar.DAY_OF_YEAR);
+        days = days + nday - oday;
+        return days;
+    }
+
+    /**
+     * 鍙栧緱涓庡師鏃ユ湡鐩稿樊涓�瀹氬ぉ鏁扮殑鏃ユ湡锛岃繑鍥濪ate鍨嬫棩鏈�
+     *
+     * @param date
+     *            鍘熸棩鏈�
+     * @param intBetween
+     *            鐩稿樊鐨勫ぉ鏁�
+     * @return date鍔犱笂intBetween澶╁悗鐨勬棩鏈�
+     */
+    public static Date getDateBetween(Date date, int intBetween) {
+        Calendar calo = Calendar.getInstance();
+        calo.setTime(date);
+        calo.add(Calendar.DATE, intBetween);
+        return calo.getTime();
+    }
+
+    /**
+     * 鎸夋寚瀹氭牸寮忓彇寰椾笌鍘熸棩鏈熺浉宸竴瀹氬ぉ鏁扮殑鏃ユ湡锛岃繑鍥濻tring鍨嬫棩鏈�
+     *
+     * @param date
+     *            鍘熸棩鏈�
+     * @param intBetween
+     *            鐩稿樊鐨勬棩鏈�
+     * @param strFromat
+     *            杩斿洖鏃ユ湡鐨勬牸寮�
+     * @return date鍔犱笂intBetween澶╁悗鐨勬棩鏈�
+     */
+    public static String getDateBetween_String(Date date, int intBetween, String strFromat) {
+        Date dateOld = getDateBetween(date, intBetween);
+        return getDate(dateOld, strFromat);
+    }
+
+    /**
+     * 寰楀埌灏嗗勾鏈堝瀷瀛楃涓插鍔�1鏈堝悗鐨勬棩鏈熷瓧绗︿覆
+     *
+     * @param yearMonth
+     *            yyyyMM鏍煎紡
+     * @return yearMonth澧炲姞涓�涓湀鍚庣殑鏃ユ湡锛寉yyyMM鏍煎紡
+     */
+    public static String increaseYearMonth(String yearMonth) {
+        int year = (new Integer(yearMonth.substring(0, 4))).intValue();
+        int month = (new Integer(yearMonth.substring(4, 6))).intValue();
+        month = month + 1;
+        if (month <= 12 && month >= 10)
+        {
+            return yearMonth.substring(0, 4) + (new Integer(month)).toString();
+        }
+        else if (month < 10)
+        {
+            return yearMonth.substring(0, 4) + "0" + (new Integer(month)).toString();
+        }
+        else{
+            // if(month>12)
+            return (new Integer(year + 1)).toString() + "0" + (new Integer(month - 12)).toString();
+        }
+
+    }
+
+    /**
+     * 寰楀埌灏嗗勾鏈堝瀷瀛楃涓插鍔犳寚瀹氭湀鏁板悗鐨勬棩鏈熷瓧绗︿覆
+     *
+     * @param yearMonth
+     *            yyyyMM鏍煎紡鏃ユ湡
+     * @param addMonth
+     *            澧炲姞鎸囧畾鏈堟暟
+     * @return yearMonth 澧炲姞addMonth涓湀鍚庣殑鏃ユ湡锛寉yyyMM鏍煎紡
+     */
+    public static String increaseYearMonth(String yearMonth, int addMonth) {
+        int year = (new Integer(yearMonth.substring(0, 4))).intValue();
+        int month = (new Integer(yearMonth.substring(4, 6))).intValue();
+        month = month + addMonth;
+        year = year + month / 12;
+        month = month % 12;
+        if (month <= 12 && month >= 10)
+            return year + (new Integer(month)).toString();
+        else
+            return year + "0" + (new Integer(month)).toString();
+
+    }
+
+    /**
+     * 寰楀埌灏嗗勾鏈堝瀷瀛楃涓插噺鍘�1鏈堝悗鐨勬棩鏈熷瓧绗︿覆
+     *
+     * @param yearMonth
+     *            - yyyyMM鏍煎紡
+     * @return - yearMonth鍑忓皯涓�涓湀鐨勬棩鏈燂紝yyyyMM鏍煎紡
+     */
+    public static String descreaseYearMonth(String yearMonth) {
+        int year = (new Integer(yearMonth.substring(0, 4))).intValue();
+        int month = (new Integer(yearMonth.substring(4, 6))).intValue();
+        month = month - 1;
+        if (month >= 10)
+        {
+            return yearMonth.substring(0, 4) + (new Integer(month)).toString();
+        }
+        else if (month > 0 && month < 10)
+        {
+            return yearMonth.substring(0, 4) + "0" + (new Integer(month)).toString();
+        }
+        else
+        {
+            // if(month>12)
+            return (new Integer(year - 1)).toString() + (new Integer(month + 12)).toString();
+        }
+
+    }
+
+    /**
+     * 寰楀埌灏嗗勾鏈堝瀷瀛楃涓插噺鍘�1鏈堝悗鐨勬棩鏈熷瓧绗︿覆
+     *
+     * @param yearMonthDay
+     *            - yyyy-MM-dd鏍煎紡
+     * @return - yearMonth鍑忓皯涓�涓湀鐨勬棩鏈燂紝yyyy-MM-dd鏍煎紡
+     */
+    public static String descreaseYearMonth2(String yearMonthDay) {
+        int year = (new Integer(yearMonthDay.substring(0, 4))).intValue();
+        int month = (new Integer(yearMonthDay.substring(5, 7))).intValue();
+        String dd = yearMonthDay.substring(8, 10);
+        month = month - 1;
+        if (month >= 10)
+            return yearMonthDay.substring(0, 4) + "-" + (new Integer(month)).toString() + "-" + dd;
+        else if (month > 0 && month < 10)
+            return yearMonthDay.substring(0, 4) + "0" + "-" + (new Integer(month)).toString() + "-" + dd;
+        else
+            return (new Integer(year - 1)).toString() + "-" + (new Integer(month + 12)).toString() + "-" + dd;
+
+    }
+
+    /**
+     * 姣旇緝涓や釜骞存湀鍨嬫棩鏈熺殑澶у皬锛屾棩鏈熸牸寮忎负yyyyMM 涓や釜瀛椾覆6浣嶏紝鍓�4浠h〃骞达紝鍚�2浠h〃鏈堬紝 <br>
+     * IF 绗竴涓唬琛ㄧ殑鏃堕棿 > 绗簩涓唬琛ㄧ殑鏃堕棿锛岃繑鍥炵湡锛孍LSE 杩斿洖鍋� <br>
+     *
+     * @param s1
+     *            鏃ユ湡1
+     * @param s2
+     *            鏃ユ湡2
+     * @return boolean 濡傛灉s1澶т簬绛変簬s2鍒欒繑鍥炵湡锛屽惁鍒欒繑鍥炲亣
+     */
+    public static boolean yearMonthGreatEqual(String s1, String s2) {
+        String temp1 = s1.substring(0, 4);
+        String temp2 = s2.substring(0, 4);
+        String temp3 = s1.substring(4, 6);
+        String temp4 = s2.substring(4, 6);
+
+        if (Integer.parseInt(temp1) > Integer.parseInt(temp2))
+            return true;
+        else if (Integer.parseInt(temp1) == Integer.parseInt(temp2)) {
+            if (Integer.parseInt(temp3) >= Integer.parseInt(temp4))
+                return true;
+            else
+                return false;
+        } else
+            return false;
+    }
+
+    /**
+     * 姣旇緝涓や釜骞存湀鍨嬫棩鏈熺殑澶у皬锛屾棩鏈熸牸寮忎负yyyyMM 涓や釜瀛椾覆6浣嶏紝鍓�4浠h〃骞达紝鍚�2浠h〃鏈堬紝 <br>
+     * IF 绗竴涓唬琛ㄧ殑鏃堕棿 > 绗簩涓唬琛ㄧ殑鏃堕棿锛岃繑鍥炵湡锛孍LSE 杩斿洖鍋� <br>
+     *
+     * @param s1
+     *            鏃ユ湡1
+     * @param s2
+     *            鏃ユ湡2
+     * @return boolean 濡傛灉s1澶т簬s2鍒欒繑鍥炵湡锛屽惁鍒欒繑鍥炲亣
+     */
+    public static boolean yearMonthGreater(String s1, String s2) {
+        String temp1 = s1.substring(0, 4);
+        String temp2 = s2.substring(0, 4);
+        String temp3 = s1.substring(4, 6);
+        String temp4 = s2.substring(4, 6);
+
+        if (Integer.parseInt(temp1) > Integer.parseInt(temp2))
+            return true;
+        else if (Integer.parseInt(temp1) == Integer.parseInt(temp2)) {
+            if (Integer.parseInt(temp3) > Integer.parseInt(temp4))
+                return true;
+            else
+                return false;
+        } else
+            return false;
+    }
+
+    /**
+     * 灏嗘棩鏈熷瀷鏁版嵁杞崲鎴怬racle瑕佹眰鐨勬爣鍑嗘牸寮忕殑瀛楃涓�
+     *
+     * @param date
+     *            鏃ユ湡
+     * @return 鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getOracleFormatDateStr(Date date) {
+        return getDate(date, "YYYY-MM-DD HH24:MI:SS");
+    }
+
+    /**
+     * 瀛椾覆6浣嶏紝鍓�4浠h〃骞达紝鍚�2浠h〃鏈堬紝 杩斿洖缁欏畾鏃ユ湡涓殑鏈堜唤涓殑鏈�鍚庝竴澶� param term(YYYYMMDD)
+     *
+     * @param term
+     *            - 骞存湀锛屾牸寮忎负yyyyMM
+     * @return String 鎸囧畾骞存湀涓鏈堜唤鐨勫ぉ鏁�
+     */
+    public static String getLastDay(String term) {
+
+        int getYear = Integer.parseInt(term.substring(0, 4));
+        int getMonth = Integer.parseInt(term.substring(4, 6));
+
+        String getLastDay = "";
+
+        if (getMonth == 2) {
+            if (getYear % 4 == 0 && getYear % 100 != 0 || getYear % 400 == 0) {
+                getLastDay = "29";
+            } else {
+                getLastDay = "28";
+            }
+        } else if (getMonth == 4 || getMonth == 6 || getMonth == 9 || getMonth == 11) {
+            getLastDay = "30";
+        } else {
+            getLastDay = "31";
+        }
+        return String.valueOf(getYear) + "骞�" + String.valueOf(getMonth) + "鏈�" + getLastDay + "鏃�";
+    }
+
+    /**
+     * 杩斿洖涓や釜骞存湀(渚嬪锛�200206)涔嬮棿鐩稿樊鐨勬湀鏁帮紝骞存湀鏍煎紡涓簓yyyMM
+     *
+     * @param strDateBegin
+     *            - String
+     * @param strDateEnd
+     *            String
+     * @return String strDateEnd-strDateBegin鐩稿樊鐨勬湀鏁�
+     */
+    public static String getMonthBetween(String strDateBegin, String strDateEnd) {
+        try {
+            int intMonthBegin;
+            int intMonthEnd;
+            String strOut;
+            if (strDateBegin.equals("") || strDateEnd.equals("") || strDateBegin.length() != 6
+                    || strDateEnd.length() != 6)
+            {
+                strOut = "";
+            }
+            else {
+                intMonthBegin = Integer.parseInt(strDateBegin.substring(0, 4)) * 12
+                        + Integer.parseInt(strDateBegin.substring(4, 6));
+                intMonthEnd = Integer.parseInt(strDateEnd.substring(0, 4)) * 12
+                        + Integer.parseInt(strDateEnd.substring(4, 6));
+                strOut = String.valueOf(intMonthBegin - intMonthEnd);
+            }
+            return strOut;
+        } catch (Exception e) {
+            return "0";
+        }
+    }
+
+    /**
+     * 灏唝yyyMMDD鏍煎紡鐨勬棩鏈熻浆鎹负yyyy-MM-DD鏍煎紡鐨勬棩鏈� 杩斿洖甯�'-'鐨勬棩鏈�(渚嬪锛�20020612 杞崲涓� 2002-06-12)
+     *
+     * @param strDate
+     *            String yyyyMMDD鏍煎紡鐨勬棩鏈�
+     * @return String - yyyy-MM-DD鏍煎紡鐨勬棩鏈�
+     */
+    public static String getStrHaveAcross(String strDate) {
+        try {
+            return strDate.substring(0, 4) + "-" + strDate.substring(4, 6) + "-" + strDate.substring(6, 8);
+        } catch (Exception e) {
+            return strDate;
+        }
+    }
+
+    /**
+     * 鍙栧緱褰撳墠鏃ユ湡鐨勪笅涓�涓湀鐨勭涓�澶� add by yaojp 2002-10-08
+     *
+     * @return 褰撳墠鏃ユ湡鐨勪笅涓湀鐨勭涓�澶╋紝鏍煎紡涓簓yyyMMDD
+     */
+    public static String getFirstDayOfNextMonth() {
+        try {
+            return increaseYearMonth(getNowShortDate().substring(0, 6)) + "01";
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    /**
+     * 鍙栧緱褰撳墠鏃ユ湡鐨勪笅涓�涓湀鐨勭涓�澶� add by zhouning 2006-09-13
+     *
+     * @return 褰撳墠鏃ユ湡鐨勪笅涓湀鐨勭涓�澶╋紝鏍煎紡涓簓yyyMMDD
+     */
+    public static String getFirstDayOfThisMonth() {
+        try {
+            return getNowShortDate().substring(0, 6) + "01";
+        } catch (Exception e) {
+            return "";
+        }
+    }
+    public static  List<Date> getThisMonthDateList() {
+        List<Date> dateList = new ArrayList<>();
+        try {
+            Calendar calendar = Calendar.getInstance();
+            int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+            calendar.set(Calendar.HOUR,0);
+            calendar.set(Calendar.MINUTE,0);
+            calendar.set(Calendar.SECOND,0);
+            calendar.set(Calendar.MILLISECOND,0);
+            for (int i = 0; i < daysInMonth; i++) {
+                calendar.set(Calendar.DAY_OF_MONTH,i+1);
+                dateList.add(calendar.getTime());
+            }
+        } catch (Exception e) {
+            return null;
+        }
+        return dateList;
+    }
+    public static  List<Date> getThisYearMonthList() {
+        List<Date> dateList = new ArrayList<>();
+        try {
+            Calendar calendar = Calendar.getInstance();
+            calendar.set(Calendar.DAY_OF_MONTH,1);
+            calendar.set(Calendar.HOUR,0);
+            calendar.set(Calendar.MINUTE,0);
+            calendar.set(Calendar.SECOND,0);
+            calendar.set(Calendar.MILLISECOND,0);
+            for (int i = 0; i < 12; i++) {
+                calendar.set(Calendar.MONTH,i);
+                dateList.add(calendar.getTime());
+            }
+        } catch (Exception e) {
+            return null;
+        }
+        return dateList;
+    }
+    public static Date getFirstThisYearDate() {
+        try {
+            return sdfShort.parse( getNowShortDate().substring(0, 4) + "0101");
+        } catch (Exception e) {
+            return null;
+        }
+    }
+    public static String getFirstDayCurrentMonth() {
+        try {
+            return getDateLong(new Date()).substring(0, 7) + "-01";
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    /**
+     * 灏唝yyyMM鍚勫紡杞崲鎴恲yyy骞碝M鏈堟牸寮�
+     *
+     * @param yearMonth
+     *            骞存湀绫诲瀷鐨勫瓧绗︿覆
+     * @return String
+     */
+    public static String getYearAndMonth(String yearMonth) {
+        if (null == yearMonth)
+            return "";
+        String ym = yearMonth.trim();
+        if (6 != ym.length())
+            return ym;
+        String year = ym.substring(0, 4);
+        String month = ym.substring(4);
+        return new StringBuffer(year).append("骞�").append(month).append("鏈�").toString();
+    }
+    /**
+     * 灏唝yyyMM鍚勫紡杞崲鎴恲yyy骞碝M鏈堟牸寮�
+     *
+     * @param date
+     *            骞存湀绫诲瀷鐨勫瓧绗︿覆
+     * @return String
+     */
+    public static String getYear(Date date) {
+        if (null == date)
+        {
+            return "";
+        }
+
+        String ym = getPlusTime2(date).trim();
+        if (StringUtils.isBlank(ym))
+        {
+            return "";
+        }
+        String year = ym.substring(0, 4);
+        return year;
+    }
+
+    /**
+     * 灏嗚緭鍏ョ殑Integer绫诲瀷鐨勬湀鏁拌浆鍖栨垚"X骞碭鏈�"鏍煎紡鐨勫瓧绗︿覆
+     *
+     * @param month
+     *            Integer
+     * @return String
+     */
+    public static String month2YearMonth(String month) {
+        String yearMonth = "";
+        int smonth = 0;
+        int year = 0;
+        int rmonth = 0;
+
+        if ((null == month) || ("0".equals(month)) || "".equals(month.trim())) {
+            return "0鏈�";
+        }
+
+        smonth = Integer.parseInt(month);
+        year = smonth / 12;
+        rmonth = smonth % 12;
+
+        if (year > 0) {
+            yearMonth = year + "骞�";
+        }
+        if (rmonth > 0) {
+            yearMonth += rmonth + "涓湀";
+        }
+
+        return yearMonth;
+    }
+
+    /**
+     * 灏唝yyyMM鍚勫紡杞崲鎴恲yyy骞碝M鏈堟牸寮�
+     *
+     * @param month
+     *            鏈�
+     * @return 杩斿洖骞存湀鍨嬫牸寮忕殑鏃ユ湡
+     */
+    public static String getYearMonthByMonth(String month) {
+        if (null == month)
+            return null;
+        String ym = month.trim();
+        if (6 != ym.length())
+            return ym;
+        String year = ym.substring(0, 4);
+        @SuppressWarnings("unused")
+        String month1 = ym.substring(4);
+        return new StringBuffer(year).append("骞�").append(month).append("鏈�").toString();
+    }
+
+    /**
+     * 寰楀埌灏哾ate澧炲姞鎸囧畾鏈堟暟鍚庣殑date
+     *
+     * @param date
+     *            鏃ユ湡
+     * @param intBetween
+     *            澧炲姞鐨勬湀浠�
+     * @return date 鍔犱笂intBetween鏈堟暟鍚庣殑鏃ユ湡
+     */
+    public static Date increaseMonth(Date date, int intBetween) {
+        Calendar calo = Calendar.getInstance();
+        calo.setTime(date);
+        calo.add(Calendar.MONTH, intBetween);
+        return calo.getTime();
+    }
+
+    /**
+     * 寰楀埌灏哾ate澧炲姞鎸囧畾澶╂暟鍚庣殑date
+     *
+     * @param date
+     *            鏃ユ湡
+     * @param intBetween
+     *            澧炲姞鐨勫ぉ鏁�
+     * @return date 鍔犱笂intBetween澶╂暟鍚庣殑鏃ユ湡
+     */
+    public static Date increaseDay(Date date, int intBetween) {
+        if (date == null) {
+            return null;
+        }
+        Calendar calo = Calendar.getInstance();
+        calo.setTime(date);
+        calo.add(Calendar.DATE, intBetween);
+        return calo.getTime();
+    }
+
+    /**
+     * 寰楀埌灏哾ate澧炲姞鎸囧畾骞存暟鍚庣殑date
+     *
+     * @param date
+     *            鏃ユ湡
+     * @param intBetween
+     *            澧炲姞鐨勫勾鏁�
+     * @return date鍔犱笂intBetween骞存暟鍚庣殑鏃ユ湡
+     */
+    public static Date increaseYear(Date date, int intBetween) {
+        Calendar calo = Calendar.getInstance();
+        calo.setTime(date);
+        calo.add(Calendar.YEAR, intBetween);
+        return calo.getTime();
+    }
+
+    /**
+     * 姣旇緝涓や釜鏃堕棿鍏堝悗
+     *
+     * @param str1
+     *            浼犲叆鐨勫瓧绗︿覆
+     * @param str2
+     *            浼犲叆鐨勫瓧绗︿覆
+     * @return int negative integer, zero, or a positive integer as str1 is less
+     *         than, equal to, or greater than str2
+     */
+    public static int compareDate(String str1, String str2) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+        Date date1 = null, date2 = null;
+        try {
+            date1 = formatter.parse(str1);
+            date2 = formatter.parse(str2);
+        } catch (ParseException ex) {
+            ex.printStackTrace();
+        }
+        return date1.compareTo(date2);
+    }
+
+    /**
+     * 姣旇緝涓や釜鏃堕棿鍏堝悗
+     *
+     * @param date1
+     *            浼犲叆鐨勫瓧绗︿覆
+     * @param date2
+     *            浼犲叆鐨勫瓧绗︿覆
+     * @return int negative integer, zero, or a positive integer as str1 is less
+     *         than, equal to, or greater than str2
+     */
+    public static int compareDate(Date date1, Date date2) {
+        if (date1 == null && date2 == null) {
+            return 0;
+        }
+        if (date1 == null) {
+            return -1;
+        }
+        if (date2 == null) {
+            return 1;
+        }
+
+        return date2.compareTo(date1);
+    }
+
+    public static int compare_date(Date dt1, Date dt2, Date dtime) {
+        try {
+            if (dtime.compareTo(dt1) >= 0 && dt2.compareTo(dtime) >= 0) {
+                return 1;
+            } else {
+                return -1;
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return 0;
+    }
+
+    public static int compareDate(String str1, Date date2) {
+        Date date1 = getDateByString(str1);
+        return date1.compareTo(date2);
+    }
+
+    public static int compareDate(String format, String str1, Date date2) {
+        Date date1 = null;
+        try {
+            date1 = fromStringToDate(format, str1);
+        } catch (Exception e) {
+            // TODO 鑷姩鐢熸垚 catch 鍧�
+            e.printStackTrace();
+        }
+        return date1.compareTo(date2);
+    }
+
+    /**
+     * 鏍规嵁浼犲叆鐨勬棩鏈熷瓧绗︿覆杞崲鎴愮浉搴旂殑鏃ユ湡瀵硅薄锛屽鏋滃瓧绗︿覆涓虹┖鎴栦笉绗﹀悎鏃ユ湡鏍� 寮忥紝鍒欒繑鍥炲綋鍓嶆椂闂淬��
+     *
+     * @param strDate
+     *            String 鏃ユ湡瀛楃涓�
+     * @return java.sql.Timestamp 鏃ユ湡瀵硅薄
+     */
+    public static Timestamp getDateByString(String strDate) {
+        if (strDate.trim().equals("")) {
+            return new Timestamp(System.currentTimeMillis());
+        }
+        try {
+            strDate = getFormattedDate(strDate, "yyyy-MM-dd HH:mm:ss") + ".000000000";
+            return Timestamp.valueOf(strDate);
+        } catch (Exception ex) {
+            return new Timestamp(System.currentTimeMillis());
+        }
+    }
+
+
+    // /**
+    // * 鏍规嵁鍙傛暟鍚嶇О锛屼粠request瀵硅薄涓彇鍑鸿鍙傛暟锛屽苟鎶婅鍙傛暟杞崲鎴怗B2312缂栫爜鐨勫瓧绗﹂泦銆�
+    // * @param request 璇锋眰瀵硅薄
+    // * @param strParamName 鍙傛暟鍚嶇О
+    // * @return java.sql.Date 杞崲鍚庣殑鍙傛暟鍊�
+    // * */
+    // public static java.sql.Timestamp getDateFromReqParam(HttpServletRequest
+    // request, String strParamName)
+    // {
+    // String strStr =
+    // StringUtil.getNotNullStr(request.getParameter(strParamName));
+    // return getDateByString(strStr);
+    // }
+
+    /**
+     * 寰楀埌褰撳墠鏃ユ湡锛屾牸寮弝yyy-MM-dd銆�
+     *
+     * @return String 鏍煎紡鍖栫殑鏃ユ湡瀛楃涓�
+     */
+    public static String getToday() {
+        Date cDate = new Date();
+        SimpleDateFormat cSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        return cSimpleDateFormat.format(cDate);
+    }
+
+    /**
+     * 寰楀埌褰撳墠鏃ユ湡锛屾牸寮弝yyy-MM-dd銆�
+     *
+     * @return String 鏍煎紡鍖栫殑鏃ユ湡瀛楃涓�
+     */
+    public static String getYesterday() {
+        Date cDate = new Date();
+        cDate.setTime(cDate.getTime() - 24 * 3600 * 1000);
+        SimpleDateFormat cSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        return cSimpleDateFormat.format(cDate);
+    }
+
+    /**
+     * 寰楀埌褰撳墠鏃ユ湡锛屾牸寮弝yyy-MM-dd銆�
+     *
+     * @return String 鏍煎紡鍖栫殑鏃ユ湡瀛楃涓�
+     */
+    public static String getTomorrow() {
+        Date cDate = new Date();
+        cDate.setTime(cDate.getTime() + 24 * 3600 * 1000);
+        SimpleDateFormat cSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        return cSimpleDateFormat.format(cDate);
+    }
+
+    /**
+     * 杩斿洖榛樿鐨勫姛鑳界敓鏁堢殑鏃堕棿锛�1900/01/01銆�
+     *
+     * @return String 榛樿鐨勫疄鏁堟椂闂村瓧绗︿覆
+     */
+    public static String getDefaultValidDate() {
+        return "1900-01-01";
+    }
+
+    /**
+     * 杩斿洖榛樿鐨勫姛鑳藉け鏁堢殑鏃堕棿锛�2099/12/31銆�
+     *
+     * @return String 榛樿鐨勫疄鏁堟椂闂村瓧绗︿覆
+     */
+    public static String getDefaultExpireDate() {
+        return "2099-12-31";
+    }
+
+    /**
+     * 寰楀埌褰撳墠鏃ユ湡鏃堕棿,鏍煎紡涓簓yyy-MM-dd hh:mm:ss.
+     *
+     * @return String
+     */
+    public static String getCurrDateTime() {
+        Timestamp date = new Timestamp(System.currentTimeMillis());
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        return formatter.format(date);
+    }
+
+    /**
+     * 寰楀埌褰撳墠鏃ユ湡鏃堕棿,鏍煎紡涓簓yyy-MM-dd.
+     *
+     * @return String
+     */
+    public static String getCurrDate() {
+        Timestamp date = new Timestamp(System.currentTimeMillis());
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        return formatter.format(date);
+    }
+
+    /**
+     * 寰楀埌鎸囧畾鐨勬棩鏈燂紝濡備竴骞翠笁涓湀闆朵節澶╁悗(浠yyy/MM/dd鏍煎紡鏄剧ず)鍙傛暟涓�("yyyy/MM/dd",1,3,9)
+     *
+     * @param strFormat
+     *            strFormat
+     * @param iYear
+     *            iYear
+     * @param iMonth
+     *            iMonth
+     * @param iDate
+     *            iDate
+     * @return String
+     */
+    public static String getSpecDate(String strFormat, int iYear, int iMonth, int iDate) {
+        Calendar rightNow = Calendar.getInstance();
+        rightNow.set(Calendar.YEAR, rightNow.get(Calendar.YEAR) + iYear);
+        rightNow.set(Calendar.MONTH, rightNow.get(Calendar.MONTH) + iMonth);
+        rightNow.set(Calendar.DATE, rightNow.get(Calendar.DATE) + iDate);
+        SimpleDateFormat df = new SimpleDateFormat(strFormat);
+        return df.format(rightNow.getTime());
+    }
+
+    /**
+     * 瀵硅緭鍏ョ殑鏃ユ湡瀛楃涓茶繘琛岄粯璁ょ殑鏍煎紡yyyy-MM-dd HH:mm:ss杞崲銆�
+     *
+     * @param strDate
+     *            String 闇�瑕佽繘琛屾牸寮忓寲鐨勬棩鏈熷瓧绗︿覆
+     * @return String 缁忚繃鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getDefaultFormattedDate(String strDate) {
+        return getFormattedDate(strDate, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    /**
+     * 瀵硅緭鍏ョ殑鏃ユ湡杩涜榛樿鐨勬牸寮弝yyy-MM-dd HH:mm:ss杞崲銆�
+     *
+     * @param dtDate
+     *            闇�瑕佽繘琛屾牸寮忓寲鐨勬棩鏈�
+     * @return String 缁忚繃鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getDefaultFormattedDate(Timestamp dtDate) {
+        return getFormattedDate(dtDate, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public static Timestamp getNullBirthDay() {
+        return new Timestamp(0);
+    }
+
+    /**
+     * 瀵硅緭鍏ョ殑鏃ユ湡瀛楃涓叉寜鐓ч粯璁ょ殑鏍煎紡yyyy-MM-dd杞崲.
+     *
+     * @param strDate
+     *            String 闇�瑕佽繘琛屾牸寮忓寲鐨勬棩鏈熷瓧绗︿覆
+     * @return String 缁忚繃鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getFormattedDate(String strDate) {
+        return getFormattedDate(strDate, "yyyy-MM-dd");
+    }
+
+    /**
+     * 瀵硅緭鍏ョ殑鏃ユ湡瀛楃涓茶繘琛屾牸寮忓寲,濡傛灉杈撳叆鐨勬槸0000/00/00 00:00:00鍒欒繑鍥炵┖涓�.
+     *
+     * @param strDate
+     *            String 闇�瑕佽繘琛屾牸寮忓寲鐨勬棩鏈熷瓧绗︿覆
+     * @param strFormatTo
+     *            String 瑕佽浆鎹㈢殑鏃ユ湡鏍煎紡
+     * @return String 缁忚繃鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getFormattedDate(String strDate, String strFormatTo) {
+        if (strDate == null || strDate.trim().equals("")) {
+            return "";
+        }
+        strDate = strDate.replace('/', '-');
+        strFormatTo = strFormatTo.replace('/', '-');
+        if (strDate.equals("0000-00-00 00:00:00") || strDate.equals("1800-01-01 00:00:00")) {
+            return "";
+        }
+        String formatStr = strFormatTo; // "yyyyMMdd";
+        if (strDate == null || strDate.trim().equals("")) {
+            return "";
+        }
+        switch (strDate.trim().length()) {
+            case 6:
+                if (strDate.substring(0, 1).equals("0")) {
+                    formatStr = "yyMMdd";
+                } else {
+                    formatStr = "yyyyMM";
+                }
+                break;
+            case 8:
+                formatStr = "yyyyMMdd";
+                break;
+            case 10:
+                if (strDate.indexOf("-") == -1) {
+                    formatStr = "yyyy/MM/dd";
+                } else {
+                    formatStr = "yyyy-MM-dd";
+                }
+                break;
+            case 11:
+                if (strDate.getBytes().length == 14) {
+                    formatStr = "yyyy骞碝M鏈坉d鏃�";
+                } else {
+                    return "";
+                }
+            case 14:
+                formatStr = "yyyyMMddHHmmss";
+                break;
+            case 19:
+                if (strDate.indexOf("-") == -1) {
+                    formatStr = "yyyy/MM/dd HH:mm:ss";
+                } else {
+                    formatStr = "yyyy-MM-dd HH:mm:ss";
+                }
+                break;
+            case 21:
+                if (strDate.indexOf("-") == -1) {
+                    formatStr = "yyyy/MM/dd HH:mm:ss.S";
+                } else {
+                    formatStr = "yyyy-MM-dd HH:mm:ss.S";
+                }
+                break;
+            default:
+                return strDate.trim();
+        }
+        try {
+            SimpleDateFormat formatter = new SimpleDateFormat(formatStr);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(formatter.parse(strDate));
+            formatter = new SimpleDateFormat(strFormatTo);
+            return formatter.format(calendar.getTime());
+        } catch (Exception e) {
+            // Common.printLog("杞崲鏃ユ湡瀛楃涓叉牸寮忔椂鍑洪敊;" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * 瀵硅緭鍏ョ殑鏃ユ湡鎸夌収榛樿鐨勬牸寮弝yyy-MM-dd杞崲.
+     *
+     * @param dtDate
+     *            闇�瑕佽繘琛屾牸寮忓寲鐨勬棩鏈熷瓧绗︿覆
+     * @return String 缁忚繃鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getFormattedDate(Timestamp dtDate) {
+        return getFormattedDate(dtDate, "yyyy-MM-dd");
+    }
+
+    /**
+     * 瀵硅緭鍏ョ殑鏃ユ湡杩涜鏍煎紡鍖�, 濡傛灉杈撳叆鐨勬棩鏈熸槸null鍒欒繑鍥炵┖涓�.
+     *
+     * @param dtDate
+     *            java.sql.Timestamp 闇�瑕佽繘琛屾牸寮忓寲鐨勬棩鏈熷瓧绗︿覆
+     * @param strFormatTo
+     *            String 瑕佽浆鎹㈢殑鏃ユ湡鏍煎紡
+     * @return String 缁忚繃鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+     */
+    public static String getFormattedDate(Timestamp dtDate, String strFormatTo) {
+        if (dtDate == null) {
+            return "";
+        }
+        if (dtDate.equals(new Timestamp(0))) {
+            return "";
+        }
+        strFormatTo = strFormatTo.replace('/', '-');
+        try {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
+            if (Integer.parseInt(formatter.format(dtDate)) < 1900) {
+                return "";
+            } else {
+                formatter = new SimpleDateFormat(strFormatTo);
+                return formatter.format(dtDate);
+            }
+        } catch (Exception e) {
+            // Common.printLog("杞崲鏃ユ湡瀛楃涓叉牸寮忔椂鍑洪敊;" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * 鎶婄鏁拌浆鎹㈡垚hh:mm:ss鏍煎紡
+     *
+     * @param lSecond
+     *            long
+     * @return String
+     */
+    public static String getTimeFormat(long lSecond) {
+        String szTime = new String();
+
+        if (lSecond <= 0) {
+            szTime = "00" + ":" + "00" + ":" + "00";
+        } else {
+            long hour = lSecond / 3600;
+            long minute = (lSecond - hour * 3600) / 60;
+            long second = (lSecond - hour * 3600 - minute * 60);
+
+            if (hour <= 0) {
+                szTime = "00";
+            } else if (hour < 10) {
+                szTime = "0" + String.valueOf(hour);
+            } else {
+                szTime = String.valueOf(hour);
+            }
+            szTime = szTime + ":";
+
+            if (minute <= 0) {
+                szTime = szTime + "00";
+            } else if (minute < 10) {
+                szTime = szTime + "0" + String.valueOf(minute);
+            } else {
+                szTime = szTime + String.valueOf(minute);
+            }
+            szTime = szTime + ":";
+
+            if (second <= 0) {
+                szTime = szTime + "00";
+            } else if (second < 10) {
+                szTime = szTime + "0" + String.valueOf(second);
+            } else {
+                szTime = szTime + String.valueOf(second);
+            }
+        }
+
+        return szTime;
+    }
+
+    public static String getFormattedDateUtil(Date dtDate, String strFormatTo) {
+        if (dtDate == null) {
+            return "";
+        }
+        strFormatTo = strFormatTo.replace('/', '-');
+        try {
+            SimpleDateFormat formatter = new SimpleDateFormat(strFormatTo);
+            return formatter.format(dtDate);
+        } catch (Exception e) {
+            // Common.printLog("杞崲鏃ユ湡瀛楃涓叉牸寮忔椂鍑洪敊;" + e.getMessage());
+            return "";
+        }
+    }
+
+    /**
+     * 寰楀嚭涓や釜鏃ユ湡涔嬮棿鐨勯棿闅斿ぉ鏁�
+     *
+     * @param strFromDate
+     *            鏍煎紡涓簓yyy-MM-dd
+     * @param strToDate
+     *            鏍煎紡涓簓yyy-MM-dd
+     * @return int
+     */
+    public static long getBetweenDays(String strFromDate, String strToDate) {
+        long m_intervalday = 0;// 鍒濆鍖栨椂闂撮棿闅旂殑鍊间负0
+        // 浣跨敤鐨勬椂闂存牸寮忎负yyyy-MM-dd
+        SimpleDateFormat m_simpledateformat = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date fromDate = m_simpledateformat.parse(strFromDate);
+            Date toDate = m_simpledateformat.parse(strToDate);
+            m_intervalday = toDate.getTime() - fromDate.getTime();// 璁$畻鎵�寰椾负寰鏁�
+            m_intervalday = m_intervalday / 1000 / 60 / 60 / 24;// 璁$畻鎵�寰楃殑澶╂暟
+
+            return m_intervalday + 1;
+        } catch (Exception e) {
+            return Integer.MIN_VALUE;
+        }
+    }
+
+    // 鍘烡ateUtil鏂规硶
+    private static DateUtil instance = null;
+
+    private static final Locale local = Locale.ENGLISH;
+
+    public static synchronized DateUtil getInstance() {
+        if (instance == null) {
+            instance = new DateUtil();
+        }
+        return instance;
+    }
+
+    public static final long millisInDay = 86400000;
+
+    // some static date formats
+    private static SimpleDateFormat[] mDateFormats = loadDateFormats();
+
+    private static final SimpleDateFormat mFormat8chars = new SimpleDateFormat("yyyyMMdd");
+
+    private static final SimpleDateFormat mFormatIso8601Day = new SimpleDateFormat("yyyy-MM-dd");
+
+    private static final SimpleDateFormat mFormatIso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
+
+    // http://www.w3.org/Protocols/rfc822/Overview.html#z28
+    private static final SimpleDateFormat mFormatRfc822 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
+
+    private static final SimpleDateFormat mFormatTradeEasy = new SimpleDateFormat("MM/dd/yyyy HH:mm");
+
+    private static final SimpleDateFormat mFormatTradeEasyMMddyyyy = new SimpleDateFormat("MM/dd/yyyy");
+
+    // add by huyanzhi
+    private static final SimpleDateFormat mFormatTradeEasyProduct = new SimpleDateFormat("dd/MM/yyyy");
+    // end
+
+    private static final SimpleDateFormat mFormatExpire = new SimpleDateFormat("MMMM dd, yyyy", local);
+
+    private static SimpleDateFormat[] loadDateFormats() {
+        SimpleDateFormat[] temp = {
+                // new SimpleDateFormat("MM/dd/yyyy hh:mm:ss.SSS a"),
+                new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy"),
+                // standard Date.toString() results
+                new SimpleDateFormat("M/d/yy hh:mm:ss"), new SimpleDateFormat("M/d/yyyy hh:mm:ss"),
+                new SimpleDateFormat("M/d/yy hh:mm a"), new SimpleDateFormat("M/d/yyyy hh:mm a"),
+                new SimpleDateFormat("M/d/yy HH:mm"), new SimpleDateFormat("M/d/yyyy HH:mm"),
+                new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"), new SimpleDateFormat("yy-MM-dd HH:mm:ss.SSS"),
+                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"),
+                // standard Timestamp.toString() results
+                new SimpleDateFormat("M-d-yy HH:mm"), new SimpleDateFormat("M-d-yyyy HH:mm"),
+                new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS"), new SimpleDateFormat("M/d/yy"),
+                new SimpleDateFormat("M/d/yyyy"), new SimpleDateFormat("M-d-yy"), new SimpleDateFormat("M-d-yyyy"),
+                new SimpleDateFormat("MMMM d, yyyyy"), new SimpleDateFormat("MMM d, yyyyy") };
+
+        return temp;
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Gets the array of SimpleDateFormats that DateUtil knows about.
+     **/
+    private static SimpleDateFormat[] getFormats() {
+        return mDateFormats;
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns a Date set to the last possible millisecond of the day, just
+     * before midnight. If a null day is passed in, a new Date is created.
+     * midnight (00m 00h 00s)
+     */
+    public static Date getEndOfDay(Date day) {
+        return getEndOfDay(day, Calendar.getInstance());
+    }
+
+    public static Date getEndOfDay(Date day, Calendar cal) {
+        if (day == null)
+            day = new Date();
+        cal.setTime(day);
+        cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
+        cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
+        cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
+        return cal.getTime();
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns a Date set to the first possible millisecond of the day, just
+     * after midnight. If a null day is passed in, a new Date is created.
+     * midnight (00m 00h 00s)
+     */
+    public static Date getStartOfDay(Date day) {
+        return getStartOfDay(day, Calendar.getInstance());
+    }
+
+    /**
+     * Returns a Date set to the first possible millisecond of the day, just
+     * after midnight. If a null day is passed in, a new Date is created.
+     * midnight (00m 00h 00s)
+     */
+    public static Date getStartOfDay(Date day, Calendar cal) {
+        if (day == null)
+            day = new Date();
+        cal.setTime(day);
+        cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY));
+        cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
+        cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
+        return cal.getTime();
+    }
+
+    /**
+     * Returns a Date set just to Noon, to the closest possible millisecond of
+     * the day. If a null day is passed in, a new Date is created. nnoon (00m
+     * 12h 00s)
+     */
+    public static Date getNoonOfDay(Date day, Calendar cal) {
+        if (day == null)
+        {
+            day = new Date();
+        }
+        cal.setTime(day);
+        cal.set(Calendar.HOUR_OF_DAY, 12);
+        cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
+        cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
+        return cal.getTime();
+    }
+
+    /**
+     * 鏍规嵁浼犲叆鐨勬棩鏈熷瓧绗︿覆杞崲鎴愮浉搴旂殑鏃ユ湡瀵硅薄锛屽鏋滃瓧绗︿覆涓虹┖鎴栦笉绗﹀悎鏃ユ湡鏍� 寮忥紝鍒欒繑鍥炲綋鍓嶆椂闂淬��
+     *
+     * @param strDate
+     *            String 鏃ユ湡瀛楃涓�
+     * @return java.util.Date 鏃ユ湡瀵硅薄
+     */
+    public static Date getDateFromString(String strDate) {
+        if (StringUtils.isEmpty(strDate)) {
+            return new Date(System.currentTimeMillis());
+        }
+        try {
+            return sdfLongTimePlus.parse(strDate);
+        } catch (Exception ex) {
+            return new Timestamp(System.currentTimeMillis());
+        }
+    }
+    public static Date getDateFromString2(String strDate) {
+        if (StringUtils.isEmpty(strDate)) {
+          return  null;
+        }
+        try {
+            return sdfLongTimePlus.parse(strDate);
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+
+
+    // -----------------------------------------------------------------------
+    public static Date parseFromFormats(String aValue) {
+        if (StringUtils.isEmpty(aValue))
+            return null;
+
+        // get DateUtil's formats
+        SimpleDateFormat formats[] = DateUtil.getFormats();
+        if (formats == null)
+            return null;
+
+        // iterate over the array and parse
+        Date myDate = null;
+        for (int i = 0; i < formats.length; i++) {
+            try {
+                myDate = DateUtil.parse(aValue, formats[i]);
+                // if (myDate instanceof Date)
+                return myDate;
+            } catch (Exception e) {
+                // do nothing because we want to try the next
+                // format if current one fails
+            }
+        }
+        // haven't returned so couldn't parse
+        return null;
+    }
+
+    // -----------------------------------------------------------------------
+    public static Timestamp parseTimestampFromFormats(String aValue) {
+        if (StringUtils.isEmpty(aValue))
+        {
+            return null;
+        }
+
+        // call the regular Date formatter
+        Date myDate = DateUtil.parseFromFormats(aValue);
+        if (myDate != null)
+        {
+            return new Timestamp(myDate.getTime());
+        }
+        return null;
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns a java.sql.Timestamp equal to the current time
+     **/
+    public static Timestamp now() {
+        return new Timestamp(System.currentTimeMillis());
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns a string the represents the passed-in date parsed according to
+     * the passed-in format. Returns an empty string if the date or the format
+     * is null.
+     **/
+    public static String format(Date aDate, SimpleDateFormat aFormat) {
+        if (aDate == null || aFormat == null) {
+            return "";
+        }
+        synchronized (aFormat) {
+            return aFormat.format(aDate);
+        }
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Tries to take the passed-in String and format it as a date string in the
+     * the passed-in format.
+     **/
+    public static String formatDateString(String aString, SimpleDateFormat aFormat) {
+        if (StringUtils.isEmpty(aString) || aFormat == null)
+            return "";
+        try {
+            Timestamp aDate = parseTimestampFromFormats(aString);
+            if (aDate != null) {
+                return DateUtil.format(aDate, aFormat);
+            }
+        } catch (Exception e) {
+            // Could not parse aString.
+        }
+        return "";
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns a Date using the passed-in string and format. Returns null if the
+     * string is null or empty or if the format is null. The string must match
+     * the format.
+     **/
+    public static Date parse(String aValue, SimpleDateFormat aFormat) throws ParseException {
+        if (StringUtils.isEmpty(aValue) || aFormat == null) {
+            return null;
+        }
+
+        return aFormat.parse(aValue);
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns true if endDate is after startDate or if startDate equals endDate
+     * or if they are the same date. Returns false if either value is null.
+     **/
+    public static boolean isValidDateRange(Date startDate, Date endDate) {
+        return isValidDateRange(startDate, endDate, true);
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns true if endDate is after startDate or if startDate equals
+     * endDate. Returns false if either value is null. If equalOK, returns true
+     * if the dates are equal.
+     **/
+    public static boolean isValidDateRange(Date startDate, Date endDate, boolean equalOK) {
+        // false if either value is null
+        if (startDate == null || endDate == null) {
+            return false;
+        }
+
+        if (equalOK) {
+            // true if they are equal
+            if (startDate.equals(endDate)) {
+                return true;
+            }
+        }
+
+        // true if endDate after startDate
+        if (endDate.after(startDate)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    // -----------------------------------------------------------------------
+    // returns full timestamp format
+    public static SimpleDateFormat defaultTimestampFormat() {
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns minimal date format
+    public static SimpleDateFormat get8charDateFormat() {
+        return DateUtil.mFormat8chars;
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns minimal date format
+    public static SimpleDateFormat defaultDateFormat() {
+        return DateUtil.friendlyDateFormat(true);
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method
+    public static String defaultTimestamp(Date date) {
+        return DateUtil.format(date, DateUtil.defaultTimestampFormat());
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method
+    public static String defaultDate(Date date) {
+        return DateUtil.format(date, DateUtil.defaultDateFormat());
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns long friendly timestamp format
+    public static SimpleDateFormat friendlyTimestampFormat() {
+        return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns long friendly formatted timestamp
+    public static String friendlyTimestamp(Date date) {
+        return DateUtil.format(date, DateUtil.friendlyTimestampFormat());
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns long friendly formatted timestamp
+    public static String format8chars(Date date) {
+        return DateUtil.format(date, mFormat8chars);
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns long friendly formatted timestamp
+    public static String formatIso8601Day(Date date) {
+        return DateUtil.format(date, mFormatIso8601Day);
+    }
+
+    public static String formatIso8601Day(Timestamp timestamp) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(timestamp.getTime());
+        return DateUtil.format(calendar.getTime(), mFormatIso8601Day);
+    }
+
+    public static String formatTradeEasy(Date date) {
+        return DateUtil.format(date, mFormatTradeEasy);
+    }
+
+    // add by huyanzhi
+    public static String formatTradeEasyProduct(Date date) {
+        return DateUtil.format(date, mFormatTradeEasyProduct);
+    }
+
+    //
+
+    public static String formatFormatTradeEasyMMddyyyy(Date date) {
+        return DateUtil.format(date, mFormatTradeEasyMMddyyyy);
+    }
+
+    public static String formatTradeEasy(Timestamp timestamp) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(timestamp.getTime());
+        return DateUtil.format(calendar.getTime(), mFormatTradeEasy);
+    }
+
+    // -----------------------------------------------------------------------
+    public static String formatRfc822(Date date) {
+        return DateUtil.format(date, mFormatRfc822);
+    }
+
+    public static String formatExpire(Date date) {
+        return DateUtil.format(date, mFormatExpire);
+    }
+
+    // -----------------------------------------------------------------------
+    // This is a hack, but it seems to work
+    public static String formatIso8601(Date date) {
+        if (date == null)
+            return "";
+
+        // Add a colon 2 chars before the end of the string
+        // to make it a valid ISO-8601 date.
+
+        String str = DateUtil.format(date, mFormatIso8601);
+        StringBuffer sb = new StringBuffer();
+        sb.append(str.substring(0, str.length() - 2));
+        sb.append(":");
+        sb.append(str.substring(str.length() - 2));
+        return sb.toString();
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method returns minimal date format
+    public static SimpleDateFormat minimalDateFormat() {
+        return DateUtil.friendlyDateFormat(true);
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method using minimal date format
+    public static String minimalDate(Date date) {
+        return DateUtil.format(date, DateUtil.minimalDateFormat());
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method that returns friendly data format
+    // using full month, day, year digits.
+    public static SimpleDateFormat fullDateFormat() {
+        return DateUtil.friendlyDateFormat(false);
+    }
+
+    // -----------------------------------------------------------------------
+    public static String fullDate(Date date) {
+        return DateUtil.format(date, DateUtil.fullDateFormat());
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Returns a "friendly" date format.
+     *
+     * @param minimalFormat
+     *            Should the date format allow single digits.
+     **/
+    public static SimpleDateFormat friendlyDateFormat(boolean minimalFormat) {
+        if (minimalFormat) {
+            return new SimpleDateFormat("d.M.yy");
+        }
+
+        return new SimpleDateFormat("dd.MM.yyyy");
+    }
+
+    // -----------------------------------------------------------------------
+    /**
+     * Format the date using the "friendly" date format.
+     */
+    public static String friendlyDate(Date date, boolean minimalFormat) {
+        return DateUtil.format(date, DateUtil.friendlyDateFormat(minimalFormat));
+    }
+
+    // -----------------------------------------------------------------------
+    // convenience method
+    public static String friendlyDate(Date date) {
+        return DateUtil.format(date, DateUtil.friendlyDateFormat(true));
+    }
+
+    public static Date parseFormatIso8601Date(String date) throws Exception {
+        Date returnDate = null;
+        try {
+            returnDate = mFormatIso8601Day.parse(date);
+        } catch (Exception e) {
+            throw e;
+        }
+        return returnDate;
+    }
+
+    // add by huyanzhi
+    @SuppressWarnings("deprecation")
+    public static String addDate(String date, String type, int into) throws Exception {
+        String Sdate = "";
+        try {
+            GregorianCalendar grc = new GregorianCalendar();
+            grc.setTime(new Date(date));
+            if (type.equals("D")) {
+                grc.add(GregorianCalendar.DATE, into);
+            } else if (type.equals("M")) {
+                grc.add(GregorianCalendar.MONTH, into);
+            } else if (type.equals("Y")) {
+                grc.add(GregorianCalendar.YEAR, into);
+            }
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+            Sdate = new String(formatter.format(grc.getTime()));
+        } catch (Exception e) {
+            throw e;
+        }
+        return Sdate;
+    }
+
+    @SuppressWarnings("deprecation")
+    public static String addDate(String date, String into) throws Exception {
+        String Sdate = "";
+        try {
+            date = date.replaceAll("-", "/");
+            date = date.substring(0, date.length() - 2);
+            GregorianCalendar grc = new GregorianCalendar();
+            grc.setTime(new Date(date));
+            grc.add(GregorianCalendar.DATE, Integer.parseInt(into));
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+            Sdate = new String(formatter.format(grc.getTime()));
+        } catch (Exception e) {
+            throw e;
+        }
+        return Sdate;
+    }
+
+    public static String formatDate(Date date, String pattern) {
+        if (date == null) {
+            return null;
+        }
+        if (pattern == null || pattern.equals("") || pattern.equals("null")) {
+            pattern = "yyyy-MM-dd";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        return sdf.format(date);
+    }
+
+    //
+
+    @SuppressWarnings("deprecation")
+    public static String addValidateDate(String date, String into) throws Exception {
+        String Sdate = "";
+        try {
+            date = date.replaceAll("-", "/");
+            date = date.substring(0, date.length() - 2);
+            GregorianCalendar grc = new GregorianCalendar();
+            grc.setTime(new Date(date));
+            grc.add(GregorianCalendar.DATE, Integer.parseInt(into));
+            Sdate = new String(mFormatExpire.format(grc.getTime()));
+        } catch (Exception e) {
+            throw e;
+        }
+        return Sdate;
+    }
+
+    public static String addDayToStringDate(String formate, String strDate, String days) {
+        String stringDate = null;
+        try {
+            Date date = fromStringToDate(formate, strDate);
+            long now = date.getTime() + (long) Integer.parseInt(days) * DAY_IN_MILLISECOND;
+
+            stringDate = getFomartDate(new Date(now), formate);
+
+        } catch (Exception e) {
+
+            e.printStackTrace();
+        }
+
+        return stringDate;
+    }
+
+    public static Date addDayToStringDate2(String formate, String strDate, String days) {
+        Date date = null;
+        try {
+            date = fromStringToDate(formate, strDate);
+            long now = date.getTime() + (long) Integer.parseInt(days) * DAY_IN_MILLISECOND;
+
+            date = new Date(now);
+        } catch (Exception e) {
+
+            e.printStackTrace();
+        }
+
+        return date;
+    }
+
+    public static Date dateDayAdd(Date date, int days) {
+        long now = date.getTime() + (long) days * DAY_IN_MILLISECOND;
+        return new Date(now);
+    }
+
+    /**
+     *
+     * 瀛楃涓插舰寮忚浆鍖栦负Date绫诲瀷 String绫诲瀷鎸夌収format鏍煎紡杞负Date绫诲瀷
+     **/
+    public static Date fromStringToDate(String format, String dateTime)  {
+        Date date = null;
+        try {
+
+            SimpleDateFormat sdf = new SimpleDateFormat(format);
+            date = sdf.parse(dateTime);
+        }catch (Exception e){
+
+        }
+
+        return date;
+    }
+
+    /**
+     *
+     * 瀛楃涓插舰寮忚浆鍖栦负Date绫诲瀷 String绫诲瀷鎸夌収format鏍煎紡杞负Date绫诲瀷
+     **/
+    public static Date fromStringToDate(Date date) throws ParseException {
+        return sdfLongTimePlus.parse(sdfLongTimePlus.format(date));
+    }
+
+    public static void main(String[] args) {
+        try {
+//            Date date = getISO8601DateByStr("2024-04-15T07:46:36.014+08:00");
+//            Date date1 = getISO8601DateByStr("2024-06-14T08:46:36.014+08:00");
+//            System.out.println(DateUtil.afterMinutesDate(-5));
+
+
+            System.out.println(getPlusTime2(DateUtil.addMonthToDate(new Date(),-1)));
+//            System.out.println(DateUtil.getBeforMonthStr(new Date(),12));
+
+//            List<Date> list =getThisMonthDateList();
+//            for(Date d :list){
+//                System.out.println(getPlusTime2(d));
+//            }
+//            List<Date> list1 =getThisYearMonthList();
+//            for(Date d :list1){
+//                System.out.println(getPlusTime2(d));
+//            }
+
+//            Date startTime = DateUtil.StringToDate("2024-05-01 08:00:00" ,"yyyy-MM-dd HH:mm:ss");
+//            Date endTime = DateUtil.StringToDate("2024-05-01 17:00:00" ,"yyyy-MM-dd HH:mm:ss");
+//            Long intervalTime = 35L;
+//
+//
+//            DateUtil.checkDateInterval( startTime.toInstant()
+//                    .atZone(ZoneId.systemDefault())
+//                    .toLocalDateTime(), endTime.toInstant()
+//                    .atZone(ZoneId.systemDefault())
+//                    .toLocalDateTime(),intervalTime);
+
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     * <br>
+     * <b>鍔熻兘锛�</b>杩斿洖鏃跺垎绉�:HHmmss<br>
+     * <b>浣滆�咃細</b>www.doumee.com<br>
+     * <b>鏃ユ湡锛�</b> Aug 26, 2013 <br>
+     *
+     * @param date
+     * @return
+     */
+    public static Integer getTimeFormatIntger(Date date) {
+        if (date == null) {
+            return 0;
+        }
+        String strTemp = DateUtil.getFomartDate(date, "yyyyMMddHHmmss");
+        String nowTime = strTemp.substring(8, 14);
+        return Integer.valueOf(nowTime);
+    }
+
+    public static String getNowDayStr(Date date) {
+        if (date == null) {
+            return "";
+        }
+
+        Calendar c = Calendar.getInstance();
+        int i = c.get(Calendar.DAY_OF_WEEK);
+        System.out.println(i);
+        // String strTemp = DateUtil.getFomartDate(date, "yyyyMMddHHmmss");
+        // String nowTime = strTemp.substring(8,14);
+        return "";
+    }
+
+    /**
+     * @param format
+     *            鏃ユ湡鏍煎紡
+     * @return String
+     * @author zhangyong
+     * @return String
+     */
+    public static String toDayToStr(String format) {
+        try {
+            Date now = new Date();
+            return DateToStr(now, format) + " " + getWeekOfDate(now);
+        } catch (Exception e) {
+            System.out.println("Date 杞� String 绫诲瀷澶辫触: " + e);
+            return null;
+        }
+    }
+
+    /**
+     * @param date
+     * @param format
+     *            鏃ユ湡鏍煎紡
+     * @return String
+     * @author zhangyong
+     * @return String
+     */
+    public static String DateToStr(Date date, String format) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat(format);
+            return sdf.format(date);
+        } catch (Exception e) {
+            System.out.println("Date 杞� String 绫诲瀷澶辫触: " + e);
+            return null;
+        }
+    }
+
+    /**
+     * @author zhangyong
+     * @return DATE 鍨嬪姞鍏蜂綋鐨勫ぉ鏁�
+     *
+     * @param date
+     *            date, int days
+     */
+    public static Date dateAddDays(Date date, int days) {
+        long now = date.getTime() + (long) days * DAY_IN_MILLISECOND;
+        return new Date(now);
+    }
+
+    /**
+     * @return 灏咲ATE 杞崲鎴愬瓧绗︽�ф棩鏈熸牸寮�
+     * @author zhangyong
+     * @param date
+     *            date,String fFormatStr eg:yyyy-MM-dd HH:mm:ss
+     */
+    public static String dateTypeToString(Date date, String fFormatStr) {
+        // yyyy-MM-dd HH:mm:ss
+        SimpleDateFormat dateformat = new SimpleDateFormat(fFormatStr);
+        String strDate = dateformat.format(date);
+        return strDate;
+    }
+
+    /**
+     * @param fFormatStr
+     *            -MM-dd
+     * @author zhangyong
+     * @鑾峰彇褰撳墠鐨勭郴缁熸椂闂达紝骞舵寜鐓у浐瀹氱殑鏍煎紡鍒濆璇�
+     */
+    public static String getStringOfNowDate(String fFormatStr) {
+        String nowDateString = dateTypeToString(new Date(), fFormatStr);
+        return nowDateString;
+    }
+
+    /**
+     * @ author zhangyong @ 鑾峰彇褰撴湀鐨勭涓�澶╋紝2009-05-01
+     */
+    public static String getStringOfFirstDayInMonth() {
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        String temp = sdf.format(date);
+        String firstDayInMoth = "";
+        firstDayInMoth = temp + "-01";
+
+        return firstDayInMoth;
+
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃ユ湡鏄槦鏈熷嚑<br>
+     *
+     * @param dt
+     * @return 褰撳墠鏃ユ湡鏄槦鏈熷嚑
+     */
+    public static String getWeekOfDate(Date dt) {
+        String[] weekDays = { "鏄熸湡鏃�", "鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�" };
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(dt);
+
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
+        if (w < 0)
+        {
+            w = 0;
+        }
+
+        return weekDays[w];
+    }
+
+    /**
+     * 鑾峰彇鏄熸湡鏁�
+     *
+     * @param dt
+     * @return
+     */
+    public static int getWeekNumOfDate(Date dt) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(dt);
+
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
+        if (w <= 0)
+            w = 7;
+
+        return w;
+    }
+
+    public static Long twoDaysBetween(Date beginDate, Date endDate) throws ParseException {
+        long minute = (endDate.getTime() - beginDate.getTime()) / (60 * 1000);
+        return minute;
+    }
+
+    /**
+     * 鍙栦袱鏈堜互鍓嶇殑1濂�
+     *
+     * @return
+     */
+    public static Date initDateByTwoMonthAgo() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.add(Calendar.MONTH, -2);// 鏈堜唤鍑�1
+        return calendar.getTime();
+    }
+
+    /**
+     * 鏌愭椂闂村鍔犳寚瀹氬ぉ鏁板悗鐨勬棩鏈�
+     *
+     * @return
+     */
+    public static Date addDaysToDate(Date date, int days) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DATE, days);//
+        return calendar.getTime();
+    }
+    public static Date addMonthToDate(Date date, int month) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.MONTH, month);//
+        return calendar.getTime();
+    }
+    public static Date addYearToDate(Date date, int year) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.YEAR, year);//
+        return calendar.getTime();
+    }
+
+    public static String afterDateToStr(Integer days){
+        Date date = new Date();
+        Long l = date.getTime()+1000*60*60*24*days;
+        date.setTime(l);
+        return DateToStr(date, "yyyyMMdd");
+    }
+
+    public static String afterDateHourToStr(Integer hour){
+        Date date = new Date();
+        Long l = date.getTime()+1000*60*60*hour;
+        date.setTime(l);
+        return DateToStr(date, "yyyyMMdd");
+    }
+
+    public static String beforeDateToStr(Integer days){
+        Date date = new Date();
+        Long l = date.getTime()-1000*60*60*24*days;
+        date.setTime(l);
+        return DateToStr(date, "yyyyMMdd");
+    }
+
+    public static String getLongDate(Date date) {
+        return DateToString(date, "yyyyMMddHHmmss");
+    }
+
+    public static String DateToString(Date date, String dateStyle) {
+        String dateString = null;
+        if (dateStyle != null) {
+            dateString = DateToStringDtl(date, dateStyle);
+        }
+        return dateString;
+    }
+
+    public static String DateToStringDtl(Date date, String parttern) {
+        String dateString = null;
+        if (date != null) {
+            try {
+                dateString = getDateFormat(parttern).format(date);
+            } catch (Exception e) {
+            }
+        }
+        return dateString;
+    }
+
+    /**
+     * 鑾峰彇SimpleDateFormat
+     *
+     * @param parttern 鏃ユ湡鏍煎紡
+     * @return SimpleDateFormat瀵硅薄
+     * @throws RuntimeException 寮傚父锛氶潪娉曟棩鏈熸牸寮�
+     */
+    private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
+        return new SimpleDateFormat(parttern);
+    }
+
+
+    /**
+     * X 鍒嗛挓鍚庢椂闂�
+     * @param minutes
+     * @return
+     */
+    public static Date afterMinutesDate(Integer minutes){
+        Date date = new Date();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.MINUTE,minutes);
+        return cal.getTime();
+    }
+
+    /**
+     * X 鍒嗛挓鍚庢椂闂�
+     * @param minutes
+     * @return
+     */
+    public static Date afterMinutesDate(Date date,Integer minutes){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.MINUTE,minutes);
+        return cal.getTime();
+    }
+
+    /**
+     * LocalDateTime to date
+     * @param now
+     * @return
+     */
+    public static LocalDateTime toDateLocalDateTime(Date now){
+        return LocalDateTime.ofInstant(now.toInstant(),ZoneId.systemDefault());
+    }
+
+
+    /**
+     * LocalDateTime to date
+     * @param localDateTime
+     * @return
+     */
+    public static Date toDate(LocalDateTime localDateTime){
+        Date from = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+        return from;
+    }
+
+    /**
+     * h鑾峰彇鏈懆鏄熸湡涓�
+     *
+     * @return
+     */
+    public static LocalDateTime getMonday(){
+        LocalDate date = LocalDateTime.of(LocalDate.now(), LocalTime.MIN).with(DayOfWeek.MONDAY).toLocalDate();
+        LocalDateTime dateTime = date.atTime(0, 0, 0);
+        return dateTime;
+    }
+
+    /**
+     * 鑾峰彇鏈懆鏄熸湡澶�
+     *
+     * @return
+     */
+    public static LocalDateTime getSunday(){
+        LocalDate date = LocalDateTime.of(LocalDate.now(), LocalTime.MIN).with(DayOfWeek.SUNDAY).toLocalDate();
+        LocalDateTime dateTime = date.atTime(23, 59, 59);
+        return dateTime;
+    }
+
+    /**
+     * 鑾峰彇鏈堢涓�
+     *
+     * @return
+     */
+    public static LocalDateTime getMonthFirst(){
+        LocalDateTime firstDayOfMonth = LocalDateTime.of(LocalDate.from(LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth())), LocalTime.MIN);
+        return firstDayOfMonth;
+    }
+
+    /**
+     * 鑾峰彇鏈堟渶鍚庝竴澶�
+     *
+     * @return
+     */
+    public static LocalDateTime getMonthLast(){
+        LocalDateTime lastDayOfMonth = LocalDateTime.of(LocalDate.from(LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth())), LocalTime.of(23, 59, 59));
+        return lastDayOfMonth;
+    }
+
+    public static Date StringToDate(String date, String parttern) {
+        Date myDate = null;
+        if (date != null) {
+            try {
+                myDate = getDateFormat(parttern).parse(date);
+            } catch (Exception e) {
+            }
+        }
+        return myDate;
+    }
+
+    public static List<String> getDayByMonth(String yearMonth){
+        List<String> data = new ArrayList<>();
+        try {
+            Calendar c = Calendar.getInstance();
+            c.setTime(DateUtil.StringToDate(yearMonth+"-01" ,"yyyy-MM-dd"));
+            // 鑾峰彇鏈湀鐨勬�诲ぉ鏁�
+            int dayCount = c.getActualMaximum(Calendar.DAY_OF_MONTH);
+            // 瀹氫箟鏃堕棿鏍煎紡
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            // 寮�濮嬫棩鏈熶负褰撳墠骞存湀鎷兼帴1鍙�
+            Date startDate = sdf.parse(yearMonth + "-01");
+            // 缁撴潫鏃ユ湡涓哄綋鍓嶅勾鏈堟嫾鎺ヨ鏈堟渶澶уぉ鏁�
+            Date endDate = sdf.parse(yearMonth + "-" + dayCount);
+            // 璁剧疆calendar鐨勫紑濮嬫棩鏈�
+            c.setTime(startDate);
+            // 褰撳墠鏃堕棿灏忎簬绛変簬璁惧畾鐨勭粨鏉熸椂闂�
+            while(c.getTime().compareTo(endDate) <= 0){
+                String time = sdf.format(c.getTime());
+                data.add(time);
+                // 褰撳墠鏃ユ湡鍔�1
+                c.add(Calendar.DATE, 1);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+
+    public static Week getWeek(Date date) {
+        Week week = null;
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+        switch (weekNumber) {
+            case 0:
+                week = Week.SUNDAY;
+                break;
+            case 1:
+                week = Week.MONDAY;
+                break;
+            case 2:
+                week = Week.TUESDAY;
+                break;
+            case 3:
+                week = Week.WEDNESDAY;
+                break;
+            case 4:
+                week = Week.THURSDAY;
+                break;
+            case 5:
+                week = Week.FRIDAY;
+                break;
+            case 6:
+                week = Week.SATURDAY;
+                break;
+        }
+        return week;
+    }
+
+    /**
+     * 鏃堕棿杞箟甯︽椂鍖�   鍏ュ弬鏍煎紡      2022-09-13T00:53:03.000+00:00
+     * @param timeEscape
+     * @return
+     * @throws ParseException
+     */
+    public static String timeEscape(String timeEscape) throws ParseException {
+        SimpleDateFormat startDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US);
+        SimpleDateFormat startDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String time = startDateFormat1.format(startDateFormat.parse(timeEscape));
+        System.out.println(time);
+        return time;
+    }
+
+
+
+    public static List<LocalDateTime> checkDateInterval(LocalDateTime localStartTime,LocalDateTime localEndTime,Long interval){
+        List<LocalDateTime> segments = new ArrayList<>();
+        LocalDateTime current = localStartTime;
+        while (current.isBefore(localEndTime)) {
+            segments.add(current);
+            current = current.plus(interval, ChronoUnit.MINUTES);
+        }
+        return segments;
+
+    }
+
+    /**
+     * 鑾峰彇X澶╁悗鐨勬棩鏈�
+     * @param date
+     * @param beforDays 鏄庡ぉ -1  鏄ㄥぉ 1
+     * @return
+     */
+    public static String getBeforDay(Date date,Integer beforDays){
+        ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());
+        // 杞崲涓簀ava.time.LocalDate,璁$畻x澶╃殑鏃ユ湡
+        LocalDate dateBeforeDay = zonedDateTime.toLocalDate().minusDays(beforDays);
+        return dateBeforeDay.toString();
+    }
+
+
+    /**
+     * 鑾峰彇X澶╁悗鐨勬棩鏈�
+     * @param date
+     * @param beforMonths 涓嬫湀 -1  涓婃湀 1
+     * @return
+     */
+    public static String getBeforMonthStr(Date date,Integer beforMonths){
+        ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());
+        // 杞崲涓簀ava.time.LocalDate,璁$畻x澶╃殑鏃ユ湡
+        LocalDate dateBeforeDay = zonedDateTime.toLocalDate().minusMonths(beforMonths);
+        return dateBeforeDay.toString();
+    }
+
+
+    /**
+     * 鑾峰彇X骞村悗鐨勬棩鏈�
+     * @param date
+     * @param beforMonths 涓嬪勾 -1  涓婂勾 1
+     * @return
+     */
+    public static String getBeforYear(Date date,Integer beforMonths){
+        ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());
+        // 杞崲涓簀ava.time.LocalDate,璁$畻x澶╃殑鏃ユ湡
+        LocalDate dateBeforeDay = zonedDateTime.toLocalDate().minusYears(beforMonths);
+        return dateBeforeDay.toString();
+    }
+
+
+
+    // 鑾峰彇鏈懆鐨勫紑濮嬫椂闂�
+    public static Date getBeginDayOfWeek(int addYears) {
+        Date date = new Date();
+        if (date == null) {
+            return null;
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.YEAR,getNowYearNum()+addYears);
+        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
+        if (dayofweek == 1) {
+            dayofweek += 7;
+        }
+        cal.add(Calendar.DATE, 2 - dayofweek);
+        return getDayStartTime(cal.getTime());
+    }
+
+    // 鑾峰彇鏈懆鐨勭粨鏉熸椂闂�
+    public static Date getEndDayOfWeek(int addYears) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(getBeginDayOfWeek(addYears));
+        cal.add(Calendar.DAY_OF_WEEK, 6);
+        Date weekEndSta = cal.getTime();
+        return getDayEndTime(weekEndSta);
+    }
+
+    // 鑾峰彇涓婂懆鐨勫紑濮嬫椂闂�
+    public static Date getBeginDayOfLastWeek() {
+        Date date = new Date();
+        if (date == null) {
+            return null;
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.YEAR,getNowYearNum());
+        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
+        if (dayofweek == 1) {
+            dayofweek += 7;
+        }
+        cal.add(Calendar.DATE, 2 - dayofweek - 7);
+        return getDayStartTime(cal.getTime());
+    }
+
+    // 鑾峰彇涓婂懆鐨勭粨鏉熸椂闂�
+    public static Date getEndDayOfLastWeek() {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(getBeginDayOfLastWeek());
+        cal.add(Calendar.DAY_OF_WEEK, 6);
+        Date weekEndSta = cal.getTime();
+        return getDayEndTime(weekEndSta);
+    }
+
+    // 鑾峰彇鏈湀鐨勫紑濮嬫椂闂�
+    public static Date getBeginDayOfMonth(int addYears) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(getNowYearNum()+addYears, getNowMonthNum() - 1, 1);
+        return getDayStartTime(calendar.getTime());
+    }
+
+    // 鑾峰彇鏈湀鐨勭粨鏉熸椂闂�
+    public static Date getEndDayOfMonth(int addYears) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(getNowYearNum()+addYears, getNowMonthNum() - 1, 1);
+        int day = calendar.getActualMaximum(5);
+        calendar.set(getNowYearNum()+addYears, getNowMonthNum() - 1, day);
+        return getDayEndTime(calendar.getTime());
+    }
+
+    // 鑾峰彇涓婃湀鐨勫紑濮嬫椂闂�
+    public static Date getBeginDayOfLastMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(getNowYearNum(), getNowMonthNum() - 2, 1);
+        return getDayStartTime(calendar.getTime());
+    }
+
+    // 鑾峰彇涓婃湀鐨勭粨鏉熸椂闂�
+    public static Date getEndDayOfLastMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(getNowYearNum(), getNowMonthNum() - 2, 1);
+        int day = calendar.getActualMaximum(5);
+        calendar.set(getNowYearNum(), getNowMonthNum() - 2, day);
+        return getDayEndTime(calendar.getTime());
+    }
+
+    // 鑾峰彇鏈勾鐨勫紑濮嬫椂闂�
+    public static Date getBeginDayOfYear(int addYears) {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, getNowYearNum()+addYears);
+        cal.set(Calendar.MONTH, Calendar.JANUARY);
+        cal.set(Calendar.DATE, 1);
+        return getDayStartTime(cal.getTime());
+    }
+
+    // 鑾峰彇鏈勾鐨勭粨鏉熸椂闂�
+    public static Date getEndDayOfYear(int addYears){
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, getNowYearNum()+addYears);
+        cal.set(Calendar.MONTH, Calendar.DECEMBER);
+        cal.set(Calendar.DATE, 31);
+        return getDayEndTime(cal.getTime());
+    }
+
+    // 鑾峰彇褰撳ぉ鐨勫紑濮嬫椂闂�
+    public static Date getDayBegin() {
+        Calendar cal = new GregorianCalendar();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
+
+    // 鑾峰彇褰撳ぉ鐨勭粨鏉熸椂闂�
+    public static Date getDayEnd() {
+        Calendar cal = new GregorianCalendar();
+        cal.set(Calendar.HOUR_OF_DAY, 23);
+        cal.set(Calendar.MINUTE, 59);
+        cal.set(Calendar.SECOND, 59);
+        return cal.getTime();
+    }
+
+
+    // 鑾峰彇鏌愪釜鏃ユ湡鐨勫紑濮嬫椂闂�
+    public static Timestamp getDayStartTime(Date d) {
+        Calendar calendar = Calendar.getInstance();
+        if (null != d)
+            calendar.setTime(d);
+        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
+                calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        return new Timestamp(calendar.getTimeInMillis());
+    }
+
+    // 鑾峰彇鏌愪釜鏃ユ湡鐨勭粨鏉熸椂闂�
+    public static Timestamp getDayEndTime(Date d) {
+        Calendar calendar = Calendar.getInstance();
+        if (null != d)
+            calendar.setTime(d);
+        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
+                calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        return new Timestamp(calendar.getTimeInMillis());
+    }
+
+
+    // 鑾峰彇浠婂勾鏄摢涓�骞�
+    public static Integer getNowYearNum() {
+        Date date = new Date();
+        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
+        gc.setTime(date);
+        return Integer.valueOf(gc.get(1));
+    }
+
+    // 鑾峰彇鏈湀鏄摢涓�鏈�
+    public static int getNowMonthNum() {
+        Date date = new Date();
+        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
+        gc.setTime(date);
+        return gc.get(2) + 1;
+    }
+}
\ No newline at end of file
diff --git a/server/src/main/java/com/doumee/core/utils/FtpUtil.java b/server/src/main/java/com/doumee/core/utils/FtpUtil.java
new file mode 100644
index 0000000..b58fd38
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/FtpUtil.java
@@ -0,0 +1,766 @@
+package com.doumee.core.utils;
+
+import com.doumee.core.constants.Constants;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.net.PrintCommandListener;
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPFile;
+import org.apache.commons.net.ftp.FTPReply;
+//import org.apache.http.client.methods.CloseableHttpResponse;
+//import org.apache.http.client.methods.HttpGet;
+//import org.apache.http.impl.client.CloseableHttpClient;
+//import org.apache.http.impl.client.HttpClientBuilder;
+//import org.apache.http.util.EntityUtils;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
+import java.util.UUID;
+
+/** */
+/**
+ * 鏀寔鏂偣缁紶鐨凢TP瀹炵敤绫�
+ *
+ * @author BenZhou http://www.bt285.cn
+ * @version 0.1 瀹炵幇鍩烘湰鏂偣涓婁紶涓嬭浇
+ * @version 0.2 瀹炵幇涓婁紶涓嬭浇杩涘害姹囨姤
+ * @version 0.3 瀹炵幇涓枃鐩綍鍒涘缓鍙婁腑鏂囨枃浠跺垱寤猴紝娣诲姞瀵逛簬涓枃鐨勬敮鎸�
+ */
+@Slf4j
+public class FtpUtil {
+	public FTPClient ftpClient = new FTPClient();
+	public static String hostname;
+	public static int port;
+	public static String username;
+	public static  String password;
+
+	public FtpUtil() {
+		// 璁剧疆灏嗚繃绋嬩腑浣跨敤鍒扮殑鍛戒护杈撳嚭鍒版帶鍒跺彴
+		this.ftpClient.addProtocolCommandListener(new PrintCommandListener(
+				new PrintWriter(System.out)));
+	}
+
+	public FtpUtil(String hostname, int port, String username, String password)
+			throws IOException {
+		// 璁剧疆灏嗚繃绋嬩腑浣跨敤鍒扮殑鍛戒护杈撳嚭鍒版帶鍒跺彴
+		FtpUtil.hostname =hostname;
+		FtpUtil.port =port;
+		FtpUtil.username =username;
+		FtpUtil.password =password;
+		connect();
+	}
+	/**
+	 * 鍒濆鍖杅tp鏈嶅姟鍣�
+	 */
+	public boolean connect() {
+		boolean flag = false;
+		try {
+			System.out.println("connecting...ftp鏈嶅姟鍣�:"+this.hostname+":"+this.port);
+			ftpClient.setRemoteVerificationEnabled(false);
+			ftpClient.connect(hostname, port); //杩炴帴ftp鏈嶅姟鍣�
+			ftpClient.login(username, password); //鐧诲綍ftp鏈嶅姟鍣�
+//            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
+//            	LOCAL_CHARSET = "UTF-8";
+//			}
+			ftpClient.setControlEncoding("GBK");
+			ftpClient.enterLocalPassiveMode();
+			int replyCode = ftpClient.getReplyCode(); //鏄惁鎴愬姛鐧诲綍鏈嶅姟鍣�
+			if(!FTPReply.isPositiveCompletion(replyCode)){
+				log.error("connect failed...ftp鏈嶅姟鍣�:"+this.hostname+":"+this.port+"杩斿洖鐮侊細"+replyCode);
+			}else {
+				flag = true;
+				log.info("connect successful...ftp鏈嶅姟鍣�:"+this.hostname+":"+this.port+"杩斿洖鐮侊細"+replyCode);
+			}
+		}catch (MalformedURLException e) {
+			e.printStackTrace();
+			log.error("connect exception...ftp鏈嶅姟鍣�:"+this.hostname+":"+this.port+	e.getMessage());
+		}catch (IOException e) {
+			e.printStackTrace();
+			log.error("connect exception...ftp鏈嶅姟鍣�:"+this.hostname+":"+this.port+	e.getMessage());
+		}
+		return flag;
+	}
+
+	/** */
+	/**
+	 * 杩炴帴鍒癋TP鏈嶅姟鍣�
+	 *
+	 *            瀵嗙爜
+	 * @return 鏄惁杩炴帴鎴愬姛
+	 * @throws IOException
+	 */
+	public boolean connect2() throws IOException {
+		ftpClient.connect(hostname, port);
+		ftpClient.setControlEncoding("GBK");
+		if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
+			if (ftpClient.login(username, password)) {
+				return true;
+			}
+		}
+		disconnect();
+		return false;
+	}
+
+	/** */
+	/**
+	 * 浠嶧TP鏈嶅姟鍣ㄤ笂涓嬭浇鏂囦欢,鏀寔鏂偣缁紶锛屼笂浼犵櫨鍒嗘瘮姹囨姤
+	 *
+	 * @param remote
+	 *            杩滅▼鏂囦欢璺緞
+	 * @param local
+	 *            鏈湴鏂囦欢璺緞
+	 * @return 涓婁紶鐨勭姸鎬�
+	 * @throws IOException
+	 */
+	public String download(String remote, String local) throws IOException {
+		// 璁剧疆琚姩妯″紡
+		ftpClient.enterLocalPassiveMode();
+		// 璁剧疆浠ヤ簩杩涘埗鏂瑰紡浼犺緭
+		ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+
+		String result;
+
+		// 妫�鏌ヨ繙绋嬫枃浠舵槸鍚﹀瓨鍦�
+		FTPFile[] files = ftpClient.listFiles(new String(
+				remote.getBytes("GBK"), "iso-8859-1"));
+		if (files.length != 1) {
+			// System.out.println("杩滅▼鏂囦欢涓嶅瓨鍦�");
+			return "杩滅▼鏂囦欢涓嶅瓨鍦�";
+		}
+
+		long lRemoteSize = files[0].getSize();
+		File f = new File(local);
+		// 鏈湴瀛樺湪鏂囦欢锛岃繘琛屾柇鐐逛笅杞�
+		if (f.exists()) {
+			long localSize = f.length();
+			// 鍒ゆ柇鏈湴鏂囦欢澶у皬鏄惁澶т簬杩滅▼鏂囦欢澶у皬
+			if (localSize >= lRemoteSize) {
+				// System.out.println("鏈湴鏂囦欢澶т簬杩滅▼鏂囦欢锛屼笅杞戒腑姝�");
+				// return "鏈湴鏂囦欢澶т簬杩滅▼鏂囦欢锛屼笅杞戒腑姝�";
+			}
+
+			// 杩涜鏂偣缁紶锛屽苟璁板綍鐘舵��
+			FileOutputStream out = new FileOutputStream(f, true);
+			ftpClient.setRestartOffset(localSize);
+			InputStream in = ftpClient.retrieveFileStream(new String(remote
+					.getBytes("GBK"), "iso-8859-1"));
+			byte[] bytes = new byte[1024];
+			long step = lRemoteSize / 100;
+			long process = localSize / step;
+			int c;
+			while ((c = in.read(bytes)) != -1) {
+				out.write(bytes, 0, c);
+				localSize += c;
+				long nowProcess = localSize / step;
+				if (nowProcess > process) {
+					process = nowProcess;
+					if (process % 10 == 0)
+						System.out.println("涓嬭浇杩涘害锛�" + process);
+					// TODO 鏇存柊鏂囦欢涓嬭浇杩涘害,鍊煎瓨鏀惧湪process鍙橀噺涓�
+				}
+			}
+			in.close();
+			out.close();
+			boolean isDo = ftpClient.completePendingCommand();
+			if (isDo) {
+				result = "300";
+				// result = DownloadStatus.Download_From_Break_Success;
+			} else {
+				result = "400";
+				// result = DownloadStatus.Download_From_Break_Failed;
+			}
+		} else {
+			OutputStream out = new FileOutputStream(f);
+			InputStream in = ftpClient.retrieveFileStream(new String(remote
+					.getBytes("GBK"), "iso-8859-1"));
+			byte[] bytes = new byte[1024];
+			long step = lRemoteSize / 100;
+			long process = 0;
+			long localSize = 0L;
+			int c;
+			while ((c = in.read(bytes)) != -1) {
+				out.write(bytes, 0, c);
+				localSize += c;
+				long nowProcess = localSize / step;
+				if (nowProcess > process) {
+					process = nowProcess;
+					if (process % 10 == 0)
+						System.out.println("涓嬭浇杩涘害锛�" + process);
+					// TODO 鏇存柊鏂囦欢涓嬭浇杩涘害,鍊煎瓨鏀惧湪process鍙橀噺涓�
+				}
+			}
+			in.close();
+			out.close();
+			boolean upNewStatus = ftpClient.completePendingCommand();
+			if (upNewStatus) {
+				result = "500";
+				// result = DownloadStatus.Download_New_Success;
+			} else {
+				// result = DownloadStatus.Download_New_Failed;
+				result = "600";
+			}
+		}
+		return result;
+	}
+
+	/** */
+	/**
+	 * 涓婁紶鏂囦欢鍒癋TP鏈嶅姟鍣紝鏀寔鏂偣缁紶
+	 *
+	 * @param local
+	 *            鏈湴鏂囦欢鍚嶇О锛岀粷瀵硅矾寰�
+	 * @param remote
+	 *            杩滅▼鏂囦欢璺緞锛屼娇鐢�/home/directory1/subdirectory/file.ext鎴栨槸
+	 *            http://www.guihua.org /subdirectory/file.ext
+	 *            鎸夌収Linux涓婄殑璺緞鎸囧畾鏂瑰紡锛屾敮鎸佸绾х洰褰曞祵濂楋紝鏀寔閫掑綊鍒涘缓涓嶅瓨鍦ㄧ殑鐩綍缁撴瀯
+	 * @return 涓婁紶缁撴灉
+	 * @throws IOException
+	 */
+	public String upload(String local, String remote) throws IOException {
+		// 璁剧疆PassiveMode浼犺緭
+		ftpClient.enterLocalPassiveMode();
+
+		// 璁剧疆浠ヤ簩杩涘埗娴佺殑鏂瑰紡浼犺緭
+		ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+		ftpClient.setControlEncoding("GBK");
+		String result;
+		// 瀵硅繙绋嬬洰褰曠殑澶勭悊
+		String remoteFileName = remote;
+		if (remote.contains(File.separator)) {
+			remoteFileName = remote.substring(remote.lastIndexOf(File.separator) + 1);
+			// 鍒涘缓鏈嶅姟鍣ㄨ繙绋嬬洰褰曠粨鏋勶紝鍒涘缓澶辫触鐩存帴杩斿洖
+			if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
+				return "2";
+			}
+		}
+
+ 	// 妫�鏌ヨ繙绋嬫槸鍚﹀瓨鍦ㄦ枃浠�
+		FTPFile[] files = ftpClient.listFiles(new String(remoteFileName
+				.getBytes("GBK"), "iso-8859-1"));
+		if (files.length == 1) {
+			long remoteSize = files[0].getSize();
+			File f = new File(local);
+			long localSize = f.length();
+			if (remoteSize == localSize) {
+				return "700";
+				// return UploadStatus.File_Exits;
+			} else if (remoteSize > localSize) {
+				return "800";
+				// return UploadStatus.Remote_Bigger_Local;
+			}
+
+			// 灏濊瘯绉诲姩鏂囦欢鍐呰鍙栨寚閽�,瀹炵幇鏂偣缁紶
+			result = uploadFile(remoteFileName, f, ftpClient, remoteSize);
+
+			// 濡傛灉鏂偣缁紶娌℃湁鎴愬姛锛屽垯鍒犻櫎鏈嶅姟鍣ㄤ笂鏂囦欢锛岄噸鏂颁笂浼�
+			if (StringUtils.equals(result, "1")) {
+				if (!ftpClient.deleteFile(remoteFileName)) {
+					return "1";
+				}
+				result = uploadFile(remoteFileName, f, ftpClient, 0);
+			}
+		} else {
+			result = uploadFile(remoteFileName, new File(local), ftpClient, 0);
+		}
+		return result;
+	}
+	public boolean uploadInputstream(InputStream inputStream, String remote)  {
+		// 璁剧疆PassiveMode浼犺緭
+		Date d1 = new Date();
+		log.error("涓婁紶鏂囦欢鎴愬姛=============寮�濮�========="+DateUtil.getPlusTime2(d1));
+		try {
+			ftpClient.enterLocalPassiveMode();
+			// 璁剧疆浠ヤ簩杩涘埗娴佺殑鏂瑰紡浼犺緭
+			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+			ftpClient.setControlEncoding("GBK");
+			// 瀵硅繙绋嬬洰褰曠殑澶勭悊
+			String remoteFileName = remote;
+			if (remote.contains("/")) {
+				remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);
+				// 鍒涘缓鏈嶅姟鍣ㄨ繙绋嬬洰褰曠粨鏋勶紝鍒涘缓澶辫触鐩存帴杩斿洖
+				if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
+					log.error("鍒涘缓ftp鐩綍澶辫触======================="+remote);
+					return false;
+				}
+			}
+			boolean result = ftpClient.storeFile(remoteFileName, inputStream);
+			inputStream.close();
+			ftpClient.logout();
+			if(result){
+				log.info("涓婁紶鏂囦欢鎴愬姛======================"+remote);
+			}else{
+				log.error("涓婁紶鏂囦欢澶辫触======================="+remote);
+			}
+			Date d2= new Date();
+			log.error("涓婁紶鏂囦欢鎴愬姛=============缁撴潫========="+DateUtil.getPlusTime2(d2) +"鑰楁椂姣锛�"+( (d2.getTime()-d1.getTime())  ));
+			return result;
+		}catch (Exception e){
+			e.printStackTrace();
+			log.error("涓婁紶鏂囦欢澶辫触======================="+remote);
+		}
+		return false;
+	}
+
+	public boolean uploadInputstreamBatch(InputStream inputStream, String remote, Boolean close , Integer index )  {
+		// 璁剧疆PassiveMode浼犺緭
+		try {
+			ftpClient.enterLocalPassiveMode();
+			// 璁剧疆浠ヤ簩杩涘埗娴佺殑鏂瑰紡浼犺緭
+			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+			ftpClient.setControlEncoding("GBK");
+			// 瀵硅繙绋嬬洰褰曠殑澶勭悊
+			String remoteFileName = remote;
+			if (remote.contains("/")) {
+				remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);
+				// 鍒涘缓鏈嶅姟鍣ㄨ繙绋嬬洰褰曠粨鏋勶紝鍒涘缓澶辫触鐩存帴杩斿洖
+				if (Constants.equalsInteger(index,Constants.ONE) && StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
+					log.error("鍒涘缓ftp鐩綍澶辫触======================="+remote);
+					return false;
+				}
+			}
+			boolean result = ftpClient.storeFile(remoteFileName, inputStream);
+			inputStream.close();
+			if(close){
+				ftpClient.logout();
+			}
+			if(result){
+				log.info("涓婁紶鏂囦欢鎴愬姛======================"+remote);
+			}else{
+				log.error("涓婁紶鏂囦欢澶辫触======================="+remote);
+			}
+			return result;
+		}catch (Exception e){
+			e.printStackTrace();
+			log.error("涓婁紶鏂囦欢澶辫触======================="+remote);
+		}
+		return false;
+	}
+
+	public int getNumFromStr(String str,char searchstr) {
+		int count = 0;
+		char[] charArray = str.toCharArray();
+		for (char param : charArray) {
+			if (param == searchstr) {
+				count++;
+			}
+		}
+		return count;
+	}
+	/** */
+	/**
+	 * 涓婁紶鏂囦欢鍒癋TP鏈嶅姟鍣紝鏀寔鏂偣缁紶
+	 *
+	 * @param localFile
+	 *            鏈湴鏂囦欢娴�
+	 * @param remote
+	 *            杩滅▼鏂囦欢璺緞锛屼娇鐢�/home/directory1/subdirectory/file.ext鎴栨槸
+	 *            http://www.guihua.org /subdirectory/file.ext
+	 *            鎸夌収Linux涓婄殑璺緞鎸囧畾鏂瑰紡锛屾敮鎸佸绾х洰褰曞祵濂楋紝鏀寔閫掑綊鍒涘缓涓嶅瓨鍦ㄧ殑鐩綍缁撴瀯
+	 * @return 涓婁紶缁撴灉
+	 * @throws IOException
+	 */
+	public String uploadFile(File localFile, String remote) throws IOException {
+		// 璁剧疆PassiveMode浼犺緭
+		ftpClient.enterLocalPassiveMode();
+		// 璁剧疆浠ヤ簩杩涘埗娴佺殑鏂瑰紡浼犺緭
+		ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+		ftpClient.setControlEncoding("GBK");
+		String result;
+		// 瀵硅繙绋嬬洰褰曠殑澶勭悊
+		String remoteFileName = remote ;
+		 if (remote.contains("/")) {
+			remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);
+			// 鍒涘缓鏈嶅姟鍣ㄨ繙绋嬬洰褰曠粨鏋勶紝鍒涘缓澶辫触鐩存帴杩斿洖
+			if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
+				return "2";
+			}
+		}
+
+		// 妫�鏌ヨ繙绋嬫槸鍚﹀瓨鍦ㄦ枃浠�
+		FTPFile[] files = ftpClient.listFiles(new String(remoteFileName
+				.getBytes("GBK"), "iso-8859-1"));
+		if (files.length == 1) {
+			long remoteSize = files[0].getSize();
+
+			long localSize = localFile.length();
+			if (remoteSize == localSize) {
+				return "700";
+				// return UploadStatus.File_Exits;
+			} else if (remoteSize > localSize) {
+				return "800";
+				// return UploadStatus.Remote_Bigger_Local;
+			}
+
+			// 灏濊瘯绉诲姩鏂囦欢鍐呰鍙栨寚閽�,瀹炵幇鏂偣缁紶
+			result = uploadFile(remoteFileName, localFile, ftpClient,
+					remoteSize);
+
+			// 濡傛灉鏂偣缁紶娌℃湁鎴愬姛锛屽垯鍒犻櫎鏈嶅姟鍣ㄤ笂鏂囦欢锛岄噸鏂颁笂浼�
+			if (StringUtils.equals(result, "1")) {
+				if (!ftpClient.deleteFile(remoteFileName)) {
+					return "1";
+				}
+				result = uploadFile(remoteFileName, localFile, ftpClient, 0);
+			}
+			// if (result == UploadStatus.Upload_From_Break_Failed) {
+			// if (!ftpClient.deleteFile(remoteFileName)) {
+			// return UploadStatus.Delete_Remote_Faild;
+			// }
+			// result = uploadFile(remoteFileName, f, ftpClient, 0);
+			// }
+		} else {
+			result = uploadFile(remoteFileName, localFile, ftpClient, 0);
+		}
+
+		return result;
+	}
+
+	/** */
+	/**
+	 * 鏂紑涓庤繙绋嬫湇鍔″櫒鐨勮繛鎺�
+	 *
+	 * @throws IOException
+	 */
+	public void disconnect() throws IOException {
+		if (ftpClient.isConnected()) {
+			ftpClient.disconnect();
+		}
+	}
+
+	/** */
+	/**
+	 * 閫掑綊鍒涘缓杩滅▼鏈嶅姟鍣ㄧ洰褰�
+	 *
+	 * @param remote
+	 *            杩滅▼鏈嶅姟鍣ㄦ枃浠剁粷瀵硅矾寰�
+	 * @param ftpClient
+	 *            FTPClient瀵硅薄
+	 * @return 鐩綍鍒涘缓鏄惁鎴愬姛
+	 * @throws IOException
+	 */
+	public String CreateDirecroty(String remote, FTPClient ftpClient)
+			throws IOException {
+		String status = "1";
+		// UploadStatus status = UploadStatus.Create_Directory_Success;
+		String directory = remote.substring(0, remote.lastIndexOf("/") + 1);
+		if (!directory.equalsIgnoreCase("/")
+				&& !ftpClient.changeWorkingDirectory(new String(directory
+				.getBytes("GBK"), "iso-8859-1"))) {
+			// 濡傛灉杩滅▼鐩綍涓嶅瓨鍦紝鍒欓�掑綊鍒涘缓杩滅▼鏈嶅姟鍣ㄧ洰褰�
+			int start = 0;
+			int end = 0;
+			if (directory.startsWith("/")) {
+				start = 1;
+			} else {
+				start = 0;
+			}
+			end = directory
+					.indexOf("/", start);
+			while (true) {
+				String subDirectory = new String(remote.substring(start, end)
+						.getBytes("GBK"), "iso-8859-1");
+				if (!ftpClient.changeWorkingDirectory(subDirectory)) {
+					if (ftpClient.makeDirectory(subDirectory)) {
+						ftpClient.changeWorkingDirectory(subDirectory);
+					} else {
+						System.out.println("鍒涘缓鐩綍澶辫触");
+						return "2";
+						// return UploadStatus.Create_Directory_Fail;
+					}
+				}
+
+				start = end + 1;
+				end = directory.indexOf("/",
+						start);
+
+				// 妫�鏌ユ墍鏈夌洰褰曟槸鍚﹀垱寤哄畬姣�
+				if (end <= start) {
+					break;
+				}
+			}
+		}
+		return status;
+	}
+
+	/**
+	 * 涓婁紶鏂囦欢鍒版湇鍔″櫒,鏂颁笂浼犲拰鏂偣缁紶
+	 *
+	 * @param remoteFile
+	 *            杩滅▼鏂囦欢鍚嶏紝鍦ㄤ笂浼犱箣鍓嶅凡缁忓皢鏈嶅姟鍣ㄥ伐浣滅洰褰曞仛浜嗘敼鍙�
+	 * @param localFile
+	 *            鏈湴鏂囦欢File鍙ユ焺锛岀粷瀵硅矾寰�
+	 *            闇�瑕佹樉绀虹殑澶勭悊杩涘害姝ヨ繘鍊�
+	 * @param ftpClient
+	 *            FTPClient寮曠敤
+	 * @return
+	 * @throws IOException
+	 */
+	public String uploadFile(String remoteFile, File localFile,
+			FTPClient ftpClient, long remoteSize) throws IOException {
+		String status;
+		// 鏄剧ず杩涘害鐨勪笂浼�
+		long step = localFile.length() / 100;
+		step=step ==0?1:step;
+		long process = 0;
+		long localreadbytes = 0L;
+//		System.out.println(remoteFile +"-------------------------"+localFile.getPath().toString());
+		RandomAccessFile raf = new RandomAccessFile(localFile, "r");
+		OutputStream out = ftpClient.appendFileStream(new String(remoteFile
+				.getBytes("GBK"), "iso-8859-1"));
+		// 鏂偣缁紶
+		if (remoteSize > 0) {
+			ftpClient.setRestartOffset(remoteSize);
+			process = remoteSize / step;
+			raf.seek(remoteSize);
+			localreadbytes = remoteSize;
+		}
+		byte[] bytes = new byte[1024];
+		int c;
+		while ((c = raf.read(bytes)) != -1) {
+			out.write(bytes, 0, c);
+			localreadbytes += c;
+			if (localreadbytes / step != process) {
+				process = localreadbytes / step;
+				System.out.println("涓婁紶杩涘害:" + process);
+				// TODO 姹囨姤涓婁紶鐘舵��
+			}
+		}
+		out.flush();
+		raf.close();
+		out.close();
+		boolean result = ftpClient.completePendingCommand();
+		if (remoteSize > 0) {
+			status = result ? "0" : "1";
+			// status = result ? UploadStatus.Upload_From_Break_Success
+			// : UploadStatus.Upload_From_Break_Failed;
+		} else {
+			status = result ? "0" : "1";
+			// status = result ? UploadStatus.Upload_New_File_Success
+			// : UploadStatus.Upload_New_File_Failed;
+		}
+		return status;
+	}
+
+	public byte[] getOnlineInputsteam(String urlStr){
+		try {
+			// 鍥剧墖鐨� URL
+			URL url = new URL(urlStr);
+			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+			connection.setRequestMethod("GET");
+			connection.setDoInput(true);
+			connection.connect();
+			// 鑾峰彇杈撳叆娴侊紝鐢ㄤ簬璇诲彇鏁版嵁
+			InputStream inputStream = connection.getInputStream();
+			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+			byte[] buffer = new byte[4096]; // 缂撳啿鍖哄ぇ灏忥紝鍙互鏍规嵁闇�瑕佽皟鏁�
+			int bytesRead;
+			while ((bytesRead = inputStream.read(buffer)) != -1) {
+				outputStream.write(buffer, 0, bytesRead);
+			}
+			outputStream.close();
+			inputStream.close();
+			connection.disconnect();
+
+			// 鑾峰彇瀛楄妭鏁扮粍
+			byte[] imageBytes = outputStream.toByteArray();
+			System.out.println("Image size: " + imageBytes.length + " bytes");
+			return imageBytes;
+		} catch (Exception e) {
+			log.error("鑾峰彇鍥剧墖寮傚父:{}",e.getMessage());
+		}
+		return  null;
+	}
+	public boolean uploadOnlineFile(String url,String ftpPath, String fileName) throws Exception
+	{
+		byte[] buf = getOnlineInputsteam(url);
+		if(buf == null){
+			return  false;
+		}
+		try
+		{
+			ftpClient.enterLocalPassiveMode();// 寮�鍚鍔ㄦā寮�
+			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
+			CreateDirecroty( ftpPath,ftpClient);
+			String printWorkingDirectory = ftpClient.printWorkingDirectory();
+			System.out.println("鑾峰彇褰撳墠鐩綍:" + printWorkingDirectory);
+			boolean flag = ftpClient.storeFile(new String(fileName.getBytes("GBK"), "iso-8859-1"), new ByteArrayInputStream(buf));
+			// 閫氳繃鍙戦�� QUIT 鍛戒护娉ㄩ攢 FTP 鏈嶅姟鍣�
+			ftpClient.logout();
+			return  flag;
+		}
+		catch (Exception e)
+		{
+			e.printStackTrace();
+		}
+		finally
+		{
+			if (ftpClient.isConnected()){
+					ftpClient.disconnect();
+			}
+
+		}
+		return false;
+	}
+
+	/**
+	 * 鍒犻櫎涓�涓枃浠�
+	 */
+	public boolean deleteFile(String filename) {
+		boolean flag = true;
+		try {
+
+			flag = ftpClient.deleteFile(filename);
+			if (flag) {
+				System.out.println("鍒犻櫎鏂囦欢鎴愬姛锛�");
+			} else {
+				System.out.println("鍒犻櫎鏂囦欢澶辫触锛�");
+			}
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+		}
+		return flag;
+	}
+
+	public static void main(String[] args) throws Exception {
+		try {
+			FtpUtil ftpUtil = new FtpUtil("175.27.187.84", 21, "ftpuser","doumee168" );
+			ftpUtil.uploadOnlineFile("https://profile-avatar.csdnimg.cn/default.jpg!1", "test"+"/", UUID.randomUUID().toString()+"test.jpg");
+			/*FtpUtil myFtp = new FtpUtil("106.15.54.228", 21, "ftptlg",
+					"tlg168.com");
+			System.out.println(myFtp.upload("D:\\devices.sql", "/1111/devices.sql"));
+
+			// myFtp.ftpClient.makeDirectory(new String("鐢佃鍓�".getBytes("GBK"),
+			// "iso-8859-1"));
+			// myFtp.ftpClient.changeWorkingDirectory(new String("鐢佃鍓�"
+			// .getBytes("GBK"), "iso-8859-1"));
+			// myFtp.ftpClient.makeDirectory(new String("璧拌タ鍙�".getBytes("GBK"),
+			// "iso-8859-1"));
+			// System.out.println(myFtp.upload("http://www.5a520.cn /yw.flv",
+			// "/yw.flv", 5));
+			// System.out.println(myFtp.upload("http://www.5a520.cn /璧拌タ鍙�24.mp4",
+			// "/澶璧拌タ鍙�/鏂版氮缃�/璧拌タ鍙�24.mp4"));
+			*//**
+			 * t.connect("pengtu", "61.191.61.226", 2122, "yangnet",
+			 * "yanglong@doumee.com"); File file = new File(
+			 * "D:\\lib/commons-net-3.3-bin/commons-net-3.3/NOTICE.txt");
+			 *
+			 *
+			 *//*
+
+			System.out.println(myFtp.download("/1/2/NOTICE.txt", "D:\\鍝�.txt"));
+
+			myFtp.deleteFile("/1/2/NOTICE.txt");
+			myFtp.disconnect();
+
+			System.out.println("java鐗堟湰鍙凤細" + System.getProperty("java.version")); // java鐗堟湰鍙�
+			System.out
+					.println("Java鎻愪緵鍟嗗悕绉帮細" + System.getProperty("java.vendor")); // Java鎻愪緵鍟嗗悕绉�
+			System.out.println("Java鎻愪緵鍟嗙綉绔欙細"
+					+ System.getProperty("java.vendor.url")); // Java鎻愪緵鍟嗙綉绔�
+			System.out.println("jre鐩綍锛�" + System.getProperty("java.home")); // Java锛屽摝锛屽簲璇ユ槸jre鐩綍
+			System.out.println("Java铏氭嫙鏈鸿鑼冪増鏈彿锛�"
+					+ System.getProperty("java.vm.specification.version")); // Java铏氭嫙鏈鸿鑼冪増鏈彿
+			System.out.println("Java铏氭嫙鏈鸿鑼冩彁渚涘晢锛�"
+					+ System.getProperty("java.vm.specification.vendor")); // Java铏氭嫙鏈鸿鑼冩彁渚涘晢
+			System.out.println("Java铏氭嫙鏈鸿鑼冨悕绉帮細"
+					+ System.getProperty("java.vm.specification.name")); // Java铏氭嫙鏈鸿鑼冨悕绉�
+			System.out.println("Java铏氭嫙鏈虹増鏈彿锛�"
+					+ System.getProperty("java.vm.version")); // Java铏氭嫙鏈虹増鏈彿
+			System.out.println("Java铏氭嫙鏈烘彁渚涘晢锛�"
+					+ System.getProperty("java.vm.vendor")); // Java铏氭嫙鏈烘彁渚涘晢
+			System.out.println("Java铏氭嫙鏈哄悕绉帮細"
+					+ System.getProperty("java.vm.name")); // Java铏氭嫙鏈哄悕绉�
+			System.out.println("Java瑙勮寖鐗堟湰鍙凤細"
+					+ System.getProperty("java.specification.version")); // Java瑙勮寖鐗堟湰鍙�
+			System.out.println("Java瑙勮寖鎻愪緵鍟嗭細"
+					+ System.getProperty("java.specification.vendor")); // Java瑙勮寖鎻愪緵鍟�
+			System.out.println("Java瑙勮寖鍚嶇О锛�"
+					+ System.getProperty("java.specification.name")); // Java瑙勮寖鍚嶇О
+			System.out.println("Java绫荤増鏈彿锛�"
+					+ System.getProperty("java.class.version")); // Java绫荤増鏈彿
+			System.out.println("Java绫昏矾寰勶細"
+					+ System.getProperty("java.class.path")); // Java绫昏矾寰�
+			System.out.println("Java lib璺緞锛�"
+					+ System.getProperty("java.library.path")); // Java lib璺緞
+			System.out.println("Java杈撳叆杈撳嚭涓存椂璺緞锛�"
+					+ System.getProperty("java.io.tmpdir")); // Java杈撳叆杈撳嚭涓存椂璺緞
+			System.out
+					.println("Java缂栬瘧鍣細" + System.getProperty("java.compiler")); // Java缂栬瘧鍣�
+			System.out.println("Java鎵ц璺緞锛�"
+					+ System.getProperty("java.ext.dirs")); // Java鎵ц璺緞
+			System.out.println("鎿嶄綔绯荤粺鍚嶇О锛�" + System.getProperty("os.name")); // 鎿嶄綔绯荤粺鍚嶇О
+			System.out.println("鎿嶄綔绯荤粺鐨勬灦鏋勶細" + System.getProperty("os.arch")); // 鎿嶄綔绯荤粺鐨勬灦鏋�
+			System.out.println("鎿嶄綔绯荤粺鐗堟湰鍙凤細" + System.getProperty("os.version")); // 鎿嶄綔绯荤粺鐗堟湰鍙�
+			System.out.println("鏂囦欢鍒嗛殧绗︼細" + System.getProperty("file.separator")); // 鏂囦欢鍒嗛殧绗�
+			System.out.println("璺緞鍒嗛殧绗︼細" + System.getProperty("path.separator")); // 璺緞鍒嗛殧绗�
+			System.out.println("鐩寸嚎鍒嗛殧绗︼細" + System.getProperty("line.separator")); // 鐩寸嚎鍒嗛殧绗�
+			System.out.println("鎿嶄綔绯荤粺鐢ㄦ埛鍚嶏細" + System.getProperty("user.name")); // 鐢ㄦ埛鍚�
+			System.out.println("鎿嶄綔绯荤粺鐢ㄦ埛鐨勪富鐩綍锛�" + System.getProperty("user.home")); // 鐢ㄦ埛鐨勪富鐩綍
+			System.out.println("褰撳墠绋嬪簭鎵�鍦ㄧ洰褰曪細" + System.getProperty("user.dir")); // 褰撳墠绋嬪簭鎵�鍦ㄧ洰褰�*/
+
+		} catch (IOException e) {
+			System.out.println("杩炴帴FTP鍑洪敊锛�" + e.getMessage());
+		}
+	}
+
+	/***
+	 * @涓婁紶鏂囦欢澶�
+	 * @param localDirectory
+	 *            褰撳湴鏂囦欢澶�
+	 * @param remoteDirectoryPath
+	 *            Ftp 鏈嶅姟鍣ㄨ矾寰� 浠ョ洰褰旻ile.separator缁撴潫
+	 * */
+	public boolean uploadDirectory(String localDirectory,
+			String remoteDirectoryPath) throws Exception {
+		File src = new File(localDirectory);
+		try {
+			remoteDirectoryPath =  remoteDirectoryPath  + "/";
+			boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath);
+		}catch (IOException e) {
+			e.printStackTrace();
+			log.info(remoteDirectoryPath + "鐩綍鍒涘缓澶辫触");
+			return false;
+		}
+		File[] allFile = src.listFiles();
+		for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
+			File f =allFile[currentFile];
+			String srcName=	f.getPath().toString();
+			String tPath = remoteDirectoryPath+f.getName();
+			if (!f.isDirectory()) {
+
+				int dNum = getNumFromStr(tPath,"/".toCharArray()[0]);
+				uploadFile(f, tPath);
+				if(dNum -2>=0){
+					for (int i = 0; i < dNum-1; i++) {
+						this.ftpClient.changeToParentDirectory();
+					}
+				}
+			}else{
+				uploadDirectory(srcName,
+						tPath+"/");
+			}
+		}
+		return true;
+	}
+	/***
+	 * @涓婁紶鏂囦欢澶�
+	 * @param pathName
+	 *             鏂囦欢澶�
+	 * */
+	public boolean delDirectory(String pathName ) throws Exception {
+		try {
+			this.ftpClient.changeWorkingDirectory( pathName.substring(0, pathName.lastIndexOf("/")) );
+			ftpClient.removeDirectory(pathName);
+		}catch (IOException e) {
+			e.printStackTrace();
+			log.info(pathName + "鐩綍鍒犻櫎澶辫触");
+			return  false;
+		}
+
+		return true;
+	}
+}
diff --git a/server/src/main/java/com/doumee/core/utils/Http.java b/server/src/main/java/com/doumee/core/utils/Http.java
index 7921a79..dfadcdc 100644
--- a/server/src/main/java/com/doumee/core/utils/Http.java
+++ b/server/src/main/java/com/doumee/core/utils/Http.java
@@ -15,7 +15,7 @@
 
 /**
  * Http宸ュ叿绫�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/utils/HttpsUtil.java b/server/src/main/java/com/doumee/core/utils/HttpsUtil.java
new file mode 100644
index 0000000..2692602
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -0,0 +1,217 @@
+package com.doumee.core.utils;
+
+import javax.net.ssl.*;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class HttpsUtil {
+
+    public static String get(String url,boolean ignoreSSL) {
+        return connection(url, "GET", null, null,ignoreSSL);
+    }
+
+    public static String post(String url, String data, String contentType, boolean ignoreSSL) {
+        return connection(url, "POST", data, contentType, ignoreSSL);
+    }
+    public static String postJson(String url, String data) {
+        if(url.startsWith("https://")){
+            return connection(url, "POST", data, "application/json", true);
+        }else{
+            return connectionHttp(url, "POST", data, "application/json");
+        }
+    }
+
+    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
+        HttpsURLConnection connection = null;
+        try {
+            URL _url = new URL(url);
+            connection = (HttpsURLConnection) _url.openConnection();
+            connection.setRequestMethod(method);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            if(contentType != null){
+                connection.setRequestProperty("Content-Type", contentType);
+            }
+
+            if(ignoreSSL){
+                //淇′换鎵�鏈塻sl璇佷功鍜屼富鏈�
+                TrustManager[] trustManagers = {new HttpsTrustManager()};
+                SSLContext context = SSLContext.getInstance("TLS");
+                context.init(null, trustManagers, new SecureRandom());
+                connection.setSSLSocketFactory(context.getSocketFactory());
+                connection.setHostnameVerifier(new HostnameVerifier() {
+                    @Override
+                    public boolean verify(String hostname, SSLSession session) {
+                        return true;
+                    }
+                });
+            }
+
+
+            connection.connect();
+
+            if(data != null){
+                OutputStream outputStream = connection.getOutputStream();
+                outputStream.write(data.getBytes("utf-8"));
+                outputStream.close();
+            }
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpsURLConnection.HTTP_OK) {
+                InputStream is = connection.getInputStream();
+                byte[] b = new byte[4096];
+                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
+                int len;
+                while ((len = is.read(b)) != -1) {
+                    baos.write(b, 0, len);
+                }
+                is.close();
+                return baos.toString("utf-8");
+            }
+            return connection.getResponseMessage();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(connection != null){
+                connection.disconnect();
+            }
+        }
+        return null;
+    }
+    public static InputStream connectionInputsteam(String url,String method,String data,String contentType ){
+        HttpURLConnection connection = null;
+        try {
+            URL _url = new URL(url);
+            connection = (HttpURLConnection) _url.openConnection();
+            connection.setRequestMethod(method);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            if(contentType != null){
+                connection.setRequestProperty("Content-Type", contentType);
+            }
+            connection.connect();
+            if(data != null){
+                OutputStream outputStream = connection.getOutputStream();
+                outputStream.write(data.getBytes("utf-8"));
+                outputStream.close();
+            }
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpsURLConnection.HTTP_OK) {
+               return  connection.getInputStream();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(connection != null){
+                connection.disconnect();
+            }
+        }
+        return null;
+    }
+    public static String connectionHttp(String url,String method,String data,String contentType ){
+        HttpURLConnection connection = null;
+        try {
+            URL _url = new URL(url);
+            connection = (HttpURLConnection) _url.openConnection();
+            connection.setRequestMethod(method);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            if(contentType != null){
+                connection.setRequestProperty("Content-Type", contentType);
+            }
+
+            connection.connect();
+
+            if(data != null){
+                OutputStream outputStream = connection.getOutputStream();
+                outputStream.write(data.getBytes("utf-8"));
+                outputStream.close();
+            }
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpsURLConnection.HTTP_OK) {
+                InputStream is = connection.getInputStream();
+                byte[] b = new byte[4096];
+                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
+                int len;
+                while ((len = is.read(b)) != -1) {
+                    baos.write(b, 0, len);
+                }
+                is.close();
+                return baos.toString("utf-8");
+            }
+            return connection.getResponseMessage();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(connection != null){
+                connection.disconnect();
+            }
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+        //灞�閮ㄤ俊浠绘墍鏈夎瘉涔﹀拰涓绘満
+        String result = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do",true);
+        System.out.println(result);
+
+        //澶栭儴淇′换鎵�鏈夎瘉涔﹀拰涓绘満
+        HttpsTrustManager.allowAllSSL();
+        String response = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do", false);
+        System.out.println(result);
+
+    }
+}
+
+class HttpsTrustManager implements X509TrustManager {
+
+    private static TrustManager[] trustManagers = {new HttpsTrustManager()};
+
+    @Override
+    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static void allowAllSSL() {
+        try {
+            SSLContext context = SSLContext.getInstance("TLS");
+            context.init(null, trustManagers, new SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
+            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
+                @Override
+                public boolean verify(String hostname, SSLSession session) {
+                    return true;
+                }
+            });
+        } catch (NoSuchAlgorithmException | KeyManagementException e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/server/src/main/java/com/doumee/core/utils/Location.java b/server/src/main/java/com/doumee/core/utils/Location.java
index bb5dae8..2f5ad8c 100644
--- a/server/src/main/java/com/doumee/core/utils/Location.java
+++ b/server/src/main/java/com/doumee/core/utils/Location.java
@@ -8,8 +8,8 @@
 
 /**
  * 鍦板尯宸ュ叿绫�
- * 绗笁鏂规湇鍔★細http://whois.pconline.com.cn/
- * @author Eva.Caesar Liu
+ *
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/utils/Monitor.java b/server/src/main/java/com/doumee/core/utils/Monitor.java
index f7c5013..eadf53d 100644
--- a/server/src/main/java/com/doumee/core/utils/Monitor.java
+++ b/server/src/main/java/com/doumee/core/utils/Monitor.java
@@ -22,7 +22,7 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/utils/MyBatisPlus.java b/server/src/main/java/com/doumee/core/utils/MyBatisPlus.java
index a676c8f..f1b79cc 100644
--- a/server/src/main/java/com/doumee/core/utils/MyBatisPlus.java
+++ b/server/src/main/java/com/doumee/core/utils/MyBatisPlus.java
@@ -4,7 +4,7 @@
 
 /**
  * Mybatis Plus Wrapper宸ュ叿绫�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class MyBatisPlus {
diff --git a/server/src/main/java/com/doumee/core/utils/Secure.java b/server/src/main/java/com/doumee/core/utils/Secure.java
index 667a10a..03a1e45 100644
--- a/server/src/main/java/com/doumee/core/utils/Secure.java
+++ b/server/src/main/java/com/doumee/core/utils/Secure.java
@@ -11,7 +11,7 @@
 
 /**
  * 瀹夊叏澶勭悊宸ュ叿绫�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/utils/Server.java b/server/src/main/java/com/doumee/core/utils/Server.java
index dd946f7..7ee8509 100644
--- a/server/src/main/java/com/doumee/core/utils/Server.java
+++ b/server/src/main/java/com/doumee/core/utils/Server.java
@@ -9,7 +9,7 @@
 
 /**
  * 鏈嶅姟绔伐鍏风被
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/core/utils/ThreadPool.java b/server/src/main/java/com/doumee/core/utils/ThreadPool.java
index edad41a..c50ff85 100644
--- a/server/src/main/java/com/doumee/core/utils/ThreadPool.java
+++ b/server/src/main/java/com/doumee/core/utils/ThreadPool.java
@@ -4,7 +4,7 @@
 
 /**
  * 绾跨▼姹犲鐞�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class ThreadPool {
diff --git a/server/src/main/java/com/doumee/core/utils/UserClient.java b/server/src/main/java/com/doumee/core/utils/UserClient.java
index 56ffd22..1084c3c 100644
--- a/server/src/main/java/com/doumee/core/utils/UserClient.java
+++ b/server/src/main/java/com/doumee/core/utils/UserClient.java
@@ -6,7 +6,7 @@
 
 /**
  * 璇锋眰宸ュ叿绫�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public class UserClient {
@@ -121,6 +121,6 @@
      * @return String
      */
     public String getPlatform (HttpServletRequest request) {
-        return request.getHeader("eva-platform") == null ? "UNKNOWN" : request.getHeader("eva-platform");
+        return request.getHeader("doumee-platform") == null ? "UNKNOWN" : request.getHeader("doumee-platform");
     }
 }
diff --git a/server/src/main/java/com/doumee/core/utils/Utils.java b/server/src/main/java/com/doumee/core/utils/Utils.java
index d7c1ab3..0115c2e 100644
--- a/server/src/main/java/com/doumee/core/utils/Utils.java
+++ b/server/src/main/java/com/doumee/core/utils/Utils.java
@@ -5,7 +5,7 @@
 
 /**
  * 宸ュ叿鍖�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Component
diff --git a/server/src/main/java/com/doumee/core/utils/Week.java b/server/src/main/java/com/doumee/core/utils/Week.java
new file mode 100644
index 0000000..5a9c5f2
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/Week.java
@@ -0,0 +1,45 @@
+package com.doumee.core.utils;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/5/6 10:59
+ */
+public enum Week {
+    MONDAY("鏄熸湡涓�", "Monday", "涓�", 1),
+    TUESDAY("鏄熸湡浜�", "Tuesday", "浜�", 2),
+    WEDNESDAY("鏄熸湡涓�", "Wednesday", "涓�", 3),
+    THURSDAY("鏄熸湡鍥�", "Thursday", "鍥�", 4),
+    FRIDAY("鏄熸湡浜�", "Friday", "浜�", 5),
+    SATURDAY("鏄熸湡鍏�", "Saturday", "鍏�", 6),
+    SUNDAY("鏄熸湡鏃�", "Sunday", "鏃�", 7);
+
+    String name_cn;
+    String name_en;
+    String name_enShort;
+    int number;
+
+    Week(String name_cn, String name_en, String name_enShort, int number) {
+        this.name_cn = name_cn;
+        this.name_en = name_en;
+        this.name_enShort = name_enShort;
+        this.number = number;
+    }
+
+    public String getChineseName() {
+        return name_cn;
+    }
+
+    public String getName() {
+        return name_en;
+    }
+
+    public String getShortName() {
+        return name_enShort;
+    }
+
+    public int getNumber() {
+        return number;
+    }
+}
diff --git a/server/src/main/java/com/doumee/core/utils/monitor/CPU.java b/server/src/main/java/com/doumee/core/utils/monitor/CPU.java
index 3e08a61..558b25b 100644
--- a/server/src/main/java/com/doumee/core/utils/monitor/CPU.java
+++ b/server/src/main/java/com/doumee/core/utils/monitor/CPU.java
@@ -8,7 +8,7 @@
 
 /**
  * CPU淇℃伅
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/utils/monitor/Disk.java b/server/src/main/java/com/doumee/core/utils/monitor/Disk.java
index 8e897c9..91b06c0 100644
--- a/server/src/main/java/com/doumee/core/utils/monitor/Disk.java
+++ b/server/src/main/java/com/doumee/core/utils/monitor/Disk.java
@@ -8,7 +8,7 @@
 
 /**
  * 纾佺洏淇℃伅
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/utils/monitor/JVM.java b/server/src/main/java/com/doumee/core/utils/monitor/JVM.java
index 890c283..5fae5f6 100644
--- a/server/src/main/java/com/doumee/core/utils/monitor/JVM.java
+++ b/server/src/main/java/com/doumee/core/utils/monitor/JVM.java
@@ -8,7 +8,7 @@
 import java.util.Date;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/utils/monitor/Memory.java b/server/src/main/java/com/doumee/core/utils/monitor/Memory.java
index bb1ac07..2ef73ce 100644
--- a/server/src/main/java/com/doumee/core/utils/monitor/Memory.java
+++ b/server/src/main/java/com/doumee/core/utils/monitor/Memory.java
@@ -7,7 +7,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
new file mode 100644
index 0000000..0017fe0
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
@@ -0,0 +1,27 @@
+package com.doumee.core.utils.qiyeweixin;
+
+public class QywxConstant {
+	public final static String MSGCORPSECRET = "WXvaZzwN9A3F-oGTHKY03Rxbl1niz1P_3odjwBdRs8g";//浼佷笟寰俊 娑堟伅鎺ㄩ�丼ECRET
+	public final static String SCHEDULESECRET = "kDucV45wtQaWjRRZoIlvxbBrLp3khHFouJhsDywBe0I";//浼佷笟寰俊 鏃ョ▼SECRET
+	public final static String DOUMIGUANJIA = "1000002";//浼佷笟寰俊 SECRET
+	public final static String PARENTID = "1";//椤剁骇閮ㄩ棬缂栫爜
+	public final static String PASSWORD = "123456";//榛樿瀵嗙爜
+	public final static String CORPID = "wweea8f71b54e3b835";
+	public final static String DMSECRET = "mfmGJpvqj1WNPTwo0Cue42uibhUd5W6_iSWpF39XZQ0";//瀹㈢瀹跺簲鐢� SECRET
+	public final static String CORPSECRET = "8gl5ndGr824OHZ90CkZdcIewUKHoyk13XN4hfxBS_io";
+	public final static String ACCESS_TOKEN = "aOpknXCW7KBBwgGAPuacwfhJRcT1PeIg-IroZicxWamj0JayKJ0rKw2sNXGzpQzK8AMDeDrEJC_kTvPPWTgtefDNLtfsdHS7IpXqBV1P8znLG1EmsYPNgvn78dsQd5bBomLl_qPpOob9hUUsSJJKcEmxXldCNEYVBhKmYnQ4yY8WE8i4xp7aLmm-hRql0AzhzaNhUA7nAzNN5BsgSgbXMA";
+	//鑾峰彇accesstoken,corpid=浼佷笟ID,corpsecret=搴旂敤鐨勫嚟璇佸瘑閽�
+    public final static String[] GET_ACCESS_TOKEN = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${secret}","鑾峰彇浼佷笟寰俊accesstoken"};
+	//鑾峰彇閮ㄩ棬淇℃伅,閮ㄩ棬id銆傝幏鍙栨寚瀹氶儴闂ㄥ強鍏朵笅鐨勫瓙閮ㄩ棬锛堜互鍙婂強瀛愰儴闂ㄧ殑瀛愰儴闂ㄧ瓑绛夛紝閫掑綊锛夈�� 濡傛灉涓嶅~锛岄粯璁よ幏鍙栧叏閲忕粍缁囨灦鏋�
+    public final static String[]  GET_DEPARTMENT_LIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=${accesstoken}&id=${id}","鑾峰彇閮ㄩ棬淇℃伅"};
+    public final static String[]  GET_DEPARTMENT_SIMPLELIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/department/simplelist?access_token=${accesstoken}&id=${id}","鑾峰彇閮ㄩ棬淇℃伅"};
+    public final static String[]  GET_DEPARTMENT_INFO = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/department/get?access_token=${accesstoken}&id=${id}","鑾峰彇鍗曚釜閮ㄩ棬璇︽儏"};
+	//鑾峰彇閮ㄩ棬鎴愬憳,access_token=璋冪敤鎺ュ彛鍑瘉,department_id=鑾峰彇鐨勯儴闂╥d,fetch_child=	鏄惁閫掑綊鑾峰彇瀛愰儴闂ㄤ笅闈㈢殑鎴愬憳锛�1-閫掑綊鑾峰彇锛�0-鍙幏鍙栨湰閮ㄩ棬
+    public final static String[]  GET_DEPARTMENT_SIMPLE_LIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=${accesstoken}&department_id=${departmentId}","鑾峰彇閮ㄩ棬鎴愬憳"};
+    public final static String[]  GET_DEPARTMENT_USER_LIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=${accesstoken}&department_id=${departmentId}","鑾峰彇閮ㄩ棬鎴愬憳"};
+	//鑾峰彇鎴愬憳璇︽儏,access_token=璋冪敤鎺ュ彛鍑瘉,userid=鎴愬憳UserID
+    public final static String[]  GET_USER_DETAIL =new String[]{ "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=${accesstoken}&userid=${id}","鑾峰彇鎴愬憳璇︽儏"};
+	//鍙戦�佸簲鐢ㄦ秷鎭�,access_token=璋冪敤鎺ュ彛鍑瘉  POST璇锋眰锛�
+	public final static String[]  SEND_MSG =new String[]{ "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accesstoken}","鍙戠敓鎺ㄩ�佹秷鎭�"};
+
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
new file mode 100644
index 0000000..18bd4b9
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
@@ -0,0 +1,173 @@
+package com.doumee.core.utils.qiyeweixin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.core.utils.qiyeweixin.model.request.QywxSendMsgRequest;
+import com.doumee.core.utils.qiyeweixin.model.response.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Component
+@Slf4j
+public class QywxUtil {
+    private static JSONObject json = new JSONObject();
+
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    private static QywxUtil qyUtil;
+
+    @PostConstruct
+    private void init() {
+        qyUtil = this;
+        systemDictDataBiz = qyUtil.systemDictDataBiz;
+    }
+
+
+    public static String create(Map<String, Object> map, String url, String token) throws IOException {
+        //  String token = getToken(QY_Constant.CORPID, QY_Constant.SCHEDULESECRET);
+        String postData = createPostData(map);
+        String response = HttpsUtil.post(url + token, postData,  "application/json", false);
+        System.out.println("鑾峰彇鍒扮殑token======>" + token);
+        System.out.println("璇锋眰鏁版嵁======>" + postData);
+        System.out.println("鍙戦�佸井淇$殑鍝嶅簲鏁版嵁======>" + response);
+        return response;
+    }
+
+    private static String createPostData(Map<String, Object> map) {
+        System.out.println("杩涘叆createPostData鏂规硶-------------------------");
+        return JSONObject.toJSONString(map);
+    }
+
+
+    public static String getAccessToken(String corpId, String corpSecret)  {
+        String[] interfaceUrl = QywxConstant.GET_ACCESS_TOKEN;
+        String url = interfaceUrl[0].replace("${corpid}",corpId).replace("${secret}",corpSecret);
+        QywxBaseResponse response = sendHttpRequest(url,interfaceUrl[1],"",new TypeReference<QywxBaseResponse<String>>(){});
+        if(response.getErrcode()!=null && response.getErrcode() ==0){
+            return response.getAccess_token();
+        }
+        return null;
+    }
+    public static List<QywxDepartInfoResponse> getDepartmentAll(String token)   {
+        String[] interfaceUrl = QywxConstant.GET_DEPARTMENT_LIST;
+        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${id}","");
+        QywxBaseResponse<List<QywxDepartInfoResponse>> response = sendHttpRequest(url,interfaceUrl[1],"",new TypeReference<QywxBaseResponse<List<QywxDepartInfoResponse>>>(){});
+        if(response.getErrcode()!=null && response.getErrcode() ==0){
+            return response.getData();
+        }
+        return null;
+    }
+    public static QywxDepartInfoResponse getDepartmentInfo(String token,String departid)  {
+        String[] interfaceUrl = QywxConstant.GET_DEPARTMENT_INFO;
+        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${id}",departid);
+        QywxBaseResponse<QywxDepartInfoResponse> response = sendHttpRequest(url,interfaceUrl[1],""
+                ,new TypeReference< QywxBaseResponse<QywxDepartInfoResponse>>(){});
+        if(response.getErrcode()!=null && response.getErrcode() ==0){
+            return response.getData();
+        }
+        return null;
+    }
+    public static QywxSendMsgResponse sendMsg(String token, QywxSendMsgRequest param)  {
+        String[] interfaceUrl = QywxConstant.SEND_MSG;
+        String url = interfaceUrl[0].replace("${accesstoken}",token);
+        QywxSendMsgResponse response = sendHttpRequestSingle(url,interfaceUrl[1],JSONObject.toJSONString(param)
+                ,new TypeReference<QywxSendMsgResponse>(){});
+        if(response.getErrcode()!=null && response.getErrcode() ==0){
+            return response;
+        }
+        return null;
+    }
+    public static List<QywxUserListResponse> getUserList(String token,String depatId)   {
+        try {
+            String[] interfaceUrl = QywxConstant.GET_DEPARTMENT_USER_LIST;
+            String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${departmentId}",depatId);
+            QywxBaseResponse<List<QywxUserListResponse>> response = sendHttpRequest(url,interfaceUrl[1],"",new TypeReference<QywxBaseResponse<List<QywxUserListResponse>>>(){});
+            if(response.getErrcode()!=null && response.getErrcode() ==0){
+                return response.getData();
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+    public static QywxUserInfoResponse getUserInfo(String token,String id)  {
+        String[] interfaceUrl = QywxConstant.GET_USER_DETAIL;
+        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${id}",id);
+        QywxUserInfoResponse response = sendHttpRequestSingle(url,interfaceUrl[1],""
+                ,new TypeReference<QywxUserInfoResponse>(){});
+        if(response.getErrcode()!=null && response.getErrcode() ==0){
+            return response;
+        }
+        return null;
+    }
+
+    /**
+     * 鍙戣捣wms鎺ュ彛璇锋眰
+     * @param url
+     * @param name
+     * @param param
+     * @param typeReference
+     * @return
+     * @param <T>
+     */
+    public static   <T> QywxBaseResponse<T> sendHttpRequest(String url, String name, String param, TypeReference<QywxBaseResponse<T>> typeReference){
+        log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
+        if ( StringUtils.isNotBlank(url)) {
+            String res = null;
+            try {
+                Map<String,String> headers = new HashMap<>();
+                res = HttpsUtil.postJson(url,param);
+                QywxBaseResponse result = JSONObject.parseObject(res, typeReference.getType());
+                logResult(result,name);
+                return  result;
+            }catch (Exception e){
+                e.printStackTrace();
+                log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
+            }
+        }
+        return  null;
+    }
+    public static  <T extends QywxBaseSingleResponse>  T sendHttpRequestSingle(String url, String name, String param, TypeReference<T> typeReference){
+        log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
+        if ( StringUtils.isNotBlank(url)) {
+            String res = null;
+            try {
+                Map<String,String> headers = new HashMap<>();
+                res = HttpsUtil.postJson(url,param);
+                T result = JSONObject.parseObject(res, typeReference.getType());
+//                logResult(result,name);
+                return  result;
+            }catch (Exception e){
+                e.printStackTrace();
+                log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
+            }
+        }
+        return  null;
+    }
+    private static void logResult(QywxBaseResponse res,String name) {
+        if( res.getErrcode() !=null && res.getErrcode().equals(0)){
+            log.info("銆愪紒涓氬井淇℃帴鍙o細"+name+"銆�================鎴愬姛====\n"+ JSONObject.toJSONString(res));
+        }else{
+            log.error("銆愪紒涓氬井淇℃帴鍙o細"+name+"銆�================澶辫触====锛歕n"+  JSONObject.toJSONString(res));
+        }
+    }
+}
+
+
+
+
+
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java
new file mode 100644
index 0000000..a689d33
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java
@@ -0,0 +1,20 @@
+package com.doumee.core.utils.qiyeweixin.model.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("wms璇锋眰鍏叡鍙傛暟")
+public class QywxBaseRequest<T> {
+
+    @ApiModelProperty(value = "data"  )
+    private List<T> data;
+    private List<Integer> jobIdList;
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java
new file mode 100644
index 0000000..05e9597
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java
@@ -0,0 +1,32 @@
+package com.doumee.core.utils.qiyeweixin.model.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鏂囦欢鍗$墖娑堟伅璇锋眰鍙傛暟")
+public class QywxSendMsgRequest {
+    @ApiModelProperty(value = "鎴愬憳ID鍒楄〃锛堟秷鎭帴鏀惰�咃紝澶氫釜鎺ユ敹鑰呯敤鈥榺鈥欏垎闅旓紝鏈�澶氭敮鎸�1000涓級銆傜壒娈婃儏鍐碉細鎸囧畾涓篅all锛屽垯鍚戝叧娉ㄨ浼佷笟搴旂敤鐨勫叏閮ㄦ垚鍛樺彂閫�")
+    private String touser;//
+    @ApiModelProperty(value = "閮ㄩ棬ID鍒楄〃锛屽涓帴鏀惰�呯敤鈥榺鈥欏垎闅旓紝鏈�澶氭敮鎸�100涓�傚綋touser涓篅all鏃跺拷鐣ユ湰鍙傛暟 ")
+    private String toparty;//
+    @ApiModelProperty(value = "鏍囩ID鍒楄〃锛屽涓帴鏀惰�呯敤鈥榺鈥欏垎闅旓紝鏈�澶氭敮鎸�100涓�傚綋touser涓篅all鏃跺拷鐣ユ湰鍙傛暟")
+    private String totag;//
+    @ApiModelProperty(value = "娑堟伅绫诲瀷锛屾鏃跺浐瀹氫负锛歵extcard")
+    private String msgtype;//
+    @ApiModelProperty(value = "浼佷笟搴旂敤鐨刬d锛屾暣鍨嬨�備紒涓氬唴閮ㄥ紑鍙戯紝鍙湪搴旂敤鐨勮缃〉闈㈡煡鐪嬶紱绗笁鏂规湇鍔″晢锛屽彲閫氳繃鎺ュ彛 鑾峰彇浼佷笟鎺堟潈淇℃伅 鑾峰彇璇ュ弬鏁板��")
+    private String agentid;//
+    @ApiModelProperty(value = "鏂囨湰鍗$墖娑堟伅瀵硅薄")
+    private QywxTextCardMsgRequest textcard;//
+    @ApiModelProperty(value = "琛ㄧず鏄惁寮�鍚痠d杞瘧锛�0琛ㄧず鍚︼紝1琛ㄧず鏄紝榛樿0")
+    private String enable_id_trans;//
+    @ApiModelProperty(value = "琛ㄧず鏄惁寮�鍚噸澶嶆秷鎭鏌ワ紝0琛ㄧず鍚︼紝1琛ㄧず鏄紝榛樿0")
+    private String enable_duplicate_check;//
+    @ApiModelProperty(value = "琛ㄧず鏄惁閲嶅娑堟伅妫�鏌ョ殑鏃堕棿闂撮殧锛岄粯璁�1800s锛屾渶澶т笉瓒呰繃4灏忔椂")
+    private String duplicate_check_interval;//
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java
new file mode 100644
index 0000000..8171fd9
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java
@@ -0,0 +1,22 @@
+package com.doumee.core.utils.qiyeweixin.model.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鏂囦欢鍗$墖娑堟伅璇锋眰鍙傛暟")
+public class QywxTextCardMsgRequest {
+    @ApiModelProperty(value = "鏍囬锛屼笉瓒呰繃128涓瓧绗︼紝瓒呰繃浼氳嚜鍔ㄦ埅鏂紙鏀寔id杞瘧锛�")
+    private String title;//
+    @ApiModelProperty(value = "鎻忚堪锛屼笉瓒呰繃512涓瓧绗︼紝瓒呰繃浼氳嚜鍔ㄦ埅鏂紙鏀寔id杞瘧锛�")
+    private String description;//
+    @ApiModelProperty(value = "鐐瑰嚮鍚庤烦杞殑閾炬帴銆傛渶闀�2048瀛楄妭锛岃纭繚鍖呭惈浜嗗崗璁ご(http/https)")
+    private String url;//
+    @ApiModelProperty(value = "鎸夐挳鏂囧瓧銆� 榛樿涓衡�滆鎯呪�濓紝 涓嶈秴杩�4涓枃瀛楋紝瓒呰繃鑷姩鎴柇銆�")
+    private String btntxt;//
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
new file mode 100644
index 0000000..95f5464
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
@@ -0,0 +1,32 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鎺ュ彛澶勭悊杩斿洖鍙傛暟")
+public class QywxBaseResponse<T> {
+    public static final String CODE_SUCCESS = "1";
+    @ApiModelProperty(value = "杩斿洖鍙傛暟"  )
+    @JSONField(name="records",alternateNames = {"department","userlist","userFavoriteList","userBehaviorList","customerFavoritesList"})
+    private T data;
+    @ApiModelProperty(value = "鍑洪敊杩斿洖鐮侊紝涓�0琛ㄧず鎴愬姛锛岄潪0琛ㄧず璋冪敤澶辫触")
+    private Integer errcode;
+
+    @ApiModelProperty(value = "杩斿洖鐮佹彁绀鸿")
+    private String errmsg;
+    @ApiModelProperty(value = "鑾峰彇鍒扮殑鍑瘉锛屾渶闀夸负512瀛楄妭")
+    private String access_token;
+
+    @ApiModelProperty(value = "鍑瘉鐨勬湁鏁堟椂闂�")
+    private Long expires_in;
+
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java
new file mode 100644
index 0000000..b5654d7
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java
@@ -0,0 +1,21 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鎺ュ彛澶勭悊杩斿洖鍙傛暟(鐙珛绫诲瀷锛�")
+public class QywxBaseSingleResponse {
+    @ApiModelProperty(value = "鍑洪敊杩斿洖鐮侊紝涓�0琛ㄧず鎴愬姛锛岄潪0琛ㄧず璋冪敤澶辫触")
+    private Integer errcode;
+
+    @ApiModelProperty(value = "杩斿洖鐮佹彁绀鸿")
+    private boolean errmsg;
+
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java
new file mode 100644
index 0000000..345c235
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java
@@ -0,0 +1,29 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊閮ㄩ棬鍒楄〃杩斿洖鍙傛暟")
+public class QywxDepartInfoResponse {
+    @ApiModelProperty(value = "鍒涘缓鐨勯儴闂╥d")
+    private String id;
+    @ApiModelProperty(value = "閮ㄩ棬鍚嶇О锛屼唬寮�鍙戣嚜寤哄簲鐢ㄩ渶瑕佺鐞嗗憳鎺堟潈鎵嶈繑鍥烇紱姝ゅ瓧娈典粠2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖name锛岃繑鍥炵殑name瀛楁浣跨敤id浠f浛锛屽悗缁涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇锛屾湭杩斿洖鍚嶇О鐨勬儏鍐甸渶瑕侀�氳繃閫氳褰曞睍绀虹粍浠舵潵灞曠ず閮ㄩ棬鍚嶇О")
+    private String name;
+    @ApiModelProperty(value = "鑻辨枃鍚嶇О锛屾瀛楁浠�2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖璇ュ瓧娈�")
+    private String name_en;
+    @ApiModelProperty(value = "閮ㄩ棬璐熻矗浜虹殑UserID锛涚涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇")
+    private List<String> department_leader;
+    @ApiModelProperty(value = "鐖堕儴闂╥d銆傛牴閮ㄩ棬涓�1")
+    private String parentid;
+    @ApiModelProperty(value = "鍦ㄧ埗閮ㄩ棬涓殑娆″簭鍊笺�俹rder鍊煎ぇ鐨勬帓搴忛潬鍓嶃�傚�艰寖鍥存槸[0, 2^32)")
+    private String order;
+
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java
new file mode 100644
index 0000000..ac450fe
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java
@@ -0,0 +1,28 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鐢ㄦ埛璇︽儏杩斿洖鍙傛暟")
+public class QywxSendMsgResponse extends QywxBaseSingleResponse {
+    @ApiModelProperty(value = "涓嶅悎娉曠殑userid锛屼笉鍖哄垎澶у皬鍐欙紝缁熶竴杞负灏忓啓")
+    private String invaliduser;
+    @ApiModelProperty(value = "涓嶅悎娉曠殑partyid")
+    private String invalidparty;
+    @ApiModelProperty(value = "涓嶅悎娉曠殑鏍囩id")
+    private String invalidtag;
+    @ApiModelProperty(value = "娌℃湁鍩虹鎺ュ彛璁稿彲")
+    private String unlicenseduser;
+    @ApiModelProperty(value = "娑堟伅id锛岀敤浜庢挙鍥炲簲鐢ㄦ秷鎭�")
+    private String msgid;
+    @ApiModelProperty(value = "浠呮秷鎭被鍨嬩负鈥滄寜閽氦浜掑瀷鈥濓紝鈥滄姇绁ㄩ�夋嫨鍨嬧�濆拰鈥滃椤归�夋嫨鍨嬧�濈殑妯℃澘鍗$墖娑堟伅杩斿洖锛屽簲鐢ㄥ彲浣跨敤response_code璋冪敤鏇存柊妯$増鍗$墖娑堟伅鎺ュ彛锛�72灏忔椂鍐呮湁鏁堬紝涓斿彧鑳戒娇鐢ㄤ竴娆�")
+    private String response_code;
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java
new file mode 100644
index 0000000..eb88955
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java
@@ -0,0 +1,25 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鐢ㄦ埛鎵╁睍瀛楁杩斿洖鍙傛暟")
+public class QywxUserAttrInfoResponse {
+    @ApiModelProperty(value = "鎴愬憳UserID銆傚搴旂鐞嗙鐨勮处鍙�")
+    private String type;//: 0,
+    @ApiModelProperty(value = "鏂囨湰鍚嶇О")
+    private String name;//: 0,
+    @ApiModelProperty(value = "鏂囨湰鍊�")
+    private String value;//: 0,
+    @ApiModelProperty(value = "鏂囨湰")
+    private QywxUserAttrValResponse text;
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java
new file mode 100644
index 0000000..666465d
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java
@@ -0,0 +1,16 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鐢ㄦ埛鎵╁睍瀛楁value杩斿洖鍙傛暟")
+public class QywxUserAttrValResponse {
+    @ApiModelProperty(value = "value")
+    private String value;//: 0,
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java
new file mode 100644
index 0000000..b232926
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java
@@ -0,0 +1,18 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鐢ㄦ埛鎵╁睍瀛楁杩斿洖鍙傛暟")
+public class QywxUserExtAttrResponse {
+    @ApiModelProperty(value = "鎵╁睍瀛楁闆嗗悎")
+    private List<QywxUserAttrInfoResponse> attrs;
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java
new file mode 100644
index 0000000..45fe549
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java
@@ -0,0 +1,54 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鐢ㄦ埛璇︽儏杩斿洖鍙傛暟")
+public class QywxUserInfoResponse extends QywxBaseSingleResponse {
+    @ApiModelProperty(value = "鎴愬憳UserID銆傚搴旂鐞嗙鐨勮处鍙�")
+    private String userid;
+    @ApiModelProperty(value = "鎴愬憳鍚嶇О锛屼唬寮�鍙戣嚜寤哄簲鐢ㄩ渶瑕佺鐞嗗憳鎺堟潈鎵嶈繑鍥烇紱姝ゅ瓧娈典粠2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛屽悗缁涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇锛屾湭杩斿洖鍚嶇О鐨勬儏鍐甸渶瑕侀�氳繃閫氳褰曞睍绀虹粍浠舵潵灞曠ず鍚嶅瓧")
+    private String name;
+    @ApiModelProperty(value = "鎴愬憳鎵�灞為儴闂ㄥ垪琛ㄣ�傚垪琛ㄩ」涓洪儴闂↖D锛�32浣嶆暣鍨�")
+    private List<String> department;
+    @ApiModelProperty(value = "閮ㄩ棬鍐呯殑鎺掑簭鍊硷紝榛樿涓�0")
+    private List<String> order;
+    @ApiModelProperty(value = "鍏ㄥ眬鍞竴銆傚浜庡悓涓�涓湇鍔″晢锛屼笉鍚屽簲鐢ㄨ幏鍙栧埌浼佷笟鍐呭悓涓�涓垚鍛樼殑open_userid鏄浉鍚岀殑锛屾渶澶�64涓瓧鑺傘�備粎绗笁鏂瑰簲鐢ㄥ彲鑾峰彇")
+    private String open_userid;
+    @ApiModelProperty(value = "鎵嬫満鍙风爜")
+    private String mobile;
+    @ApiModelProperty(value = "鑱屽姟淇℃伅")
+    private String position;
+    @ApiModelProperty(value = "鎬у埆銆�0琛ㄧず鏈畾涔夛紝1琛ㄧず鐢锋�э紝2琛ㄧず濂虫�с��")
+    private Integer gender;
+    @ApiModelProperty(value = "婵�娲荤姸鎬�: 1=宸叉縺娲伙紝2=宸茬鐢紝4=鏈縺娲伙紝5=閫�鍑轰紒涓氥��")
+    private Integer status;
+    @ApiModelProperty(value = "閭")
+    private String email;
+    @ApiModelProperty(value = "鍛樺伐涓汉浜岀淮鐮侊紝鎵弿鍙坊鍔犱负澶栭儴鑱旂郴浜�(娉ㄦ剰杩斿洖鐨勬槸涓�涓猽rl锛屽彲鍦ㄦ祻瑙堝櫒涓婃墦寮�璇rl浠ュ睍绀轰簩缁寸爜)")
+    private String qr_code;
+    @ApiModelProperty(value = "浼佷笟閭")
+    private String biz_mail;
+    @ApiModelProperty(value = "琛ㄧず鍦ㄦ墍鍦ㄧ殑閮ㄩ棬鍐呮槸鍚︿负閮ㄩ棬璐熻矗浜恒��0-鍚︼紱1-鏄�傛槸涓�涓垪琛紝鏁伴噺蹇呴』涓巇epartment涓�鑷淬��")
+    private List<String> is_leader_in_dept;
+    @ApiModelProperty(value = "鐩村睘涓婄骇UserID")
+    private List<String> direct_leader;
+    @ApiModelProperty(value = "鍍弖rl")
+    private String avatar;
+    @ApiModelProperty(value = "澶村儚缂╃暐鍥緐rl")
+    private String thumb_avatar;
+    @ApiModelProperty(value = "搴ф満")
+    private String telephone;
+    @ApiModelProperty(value = "鍒悕")
+    private String alias;
+    @ApiModelProperty(value = "鎵╁睍灞炴��")
+    private QywxUserExtAttrResponse extattr;
+}
diff --git a/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java
new file mode 100644
index 0000000..34ed301
--- /dev/null
+++ b/server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java
@@ -0,0 +1,54 @@
+package com.doumee.core.utils.qiyeweixin.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浼佷笟寰俊鐢ㄦ埛鍒楄〃杩斿洖鍙傛暟")
+public class QywxUserListResponse {
+    @ApiModelProperty(value = "鎴愬憳UserID銆傚搴旂鐞嗙鐨勮处鍙�")
+    private String userid;
+    @ApiModelProperty(value = "鎴愬憳鍚嶇О锛屼唬寮�鍙戣嚜寤哄簲鐢ㄩ渶瑕佺鐞嗗憳鎺堟潈鎵嶈繑鍥烇紱姝ゅ瓧娈典粠2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛屽悗缁涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇锛屾湭杩斿洖鍚嶇О鐨勬儏鍐甸渶瑕侀�氳繃閫氳褰曞睍绀虹粍浠舵潵灞曠ず鍚嶅瓧")
+    private String name;
+    @ApiModelProperty(value = "鎴愬憳鎵�灞為儴闂ㄥ垪琛ㄣ�傚垪琛ㄩ」涓洪儴闂↖D锛�32浣嶆暣鍨�")
+    private List<String> department;
+    @ApiModelProperty(value = "閮ㄩ棬鍐呯殑鎺掑簭鍊硷紝榛樿涓�0")
+    private List<String> order;
+    @ApiModelProperty(value = "鍏ㄥ眬鍞竴銆傚浜庡悓涓�涓湇鍔″晢锛屼笉鍚屽簲鐢ㄨ幏鍙栧埌浼佷笟鍐呭悓涓�涓垚鍛樼殑open_userid鏄浉鍚岀殑锛屾渶澶�64涓瓧鑺傘�備粎绗笁鏂瑰簲鐢ㄥ彲鑾峰彇")
+    private String open_userid;
+    @ApiModelProperty(value = "鎵嬫満鍙风爜")
+    private String mobile;
+    @ApiModelProperty(value = "鑱屽姟淇℃伅")
+    private String position;
+    @ApiModelProperty(value = "鎬у埆銆�0琛ㄧず鏈畾涔夛紝1琛ㄧず鐢锋�э紝2琛ㄧず濂虫�с��")
+    private Integer gender;
+    @ApiModelProperty(value = "婵�娲荤姸鎬�: 1=宸叉縺娲伙紝2=宸茬鐢紝4=鏈縺娲伙紝5=閫�鍑轰紒涓氥��")
+    private Integer status;
+    @ApiModelProperty(value = "閭")
+    private String email;
+    @ApiModelProperty(value = "鍛樺伐涓汉浜岀淮鐮侊紝鎵弿鍙坊鍔犱负澶栭儴鑱旂郴浜�(娉ㄦ剰杩斿洖鐨勬槸涓�涓猽rl锛屽彲鍦ㄦ祻瑙堝櫒涓婃墦寮�璇rl浠ュ睍绀轰簩缁寸爜)")
+    private String qr_code;
+    @ApiModelProperty(value = "浼佷笟閭")
+    private String biz_mail;
+    @ApiModelProperty(value = "琛ㄧず鍦ㄦ墍鍦ㄧ殑閮ㄩ棬鍐呮槸鍚︿负閮ㄩ棬璐熻矗浜恒��0-鍚︼紱1-鏄�傛槸涓�涓垪琛紝鏁伴噺蹇呴』涓巇epartment涓�鑷淬��")
+    private List<Integer> is_leader_in_dept;
+    @ApiModelProperty(value = "鐩村睘涓婄骇UserID")
+    private List<String> direct_leader;
+    @ApiModelProperty(value = "鍍弖rl")
+    private String avatar;
+    @ApiModelProperty(value = "澶村儚缂╃暐鍥緐rl")
+    private String thumb_avatar;
+    @ApiModelProperty(value = "搴ф満")
+    private String telephone;
+    @ApiModelProperty(value = "鍒悕")
+    private String alias;
+    @ApiModelProperty(value = "鎵╁睍灞炴��")
+    private QywxUserExtAttrResponse extattr;
+}
diff --git a/server/src/main/java/com/doumee/dao/business/CategoryMapper.java b/server/src/main/java/com/doumee/dao/business/CategoryMapper.java
new file mode 100644
index 0000000..824f9b1
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/CategoryMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Category;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface CategoryMapper extends BaseMapper<Category> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/CompanyMapper.java b/server/src/main/java/com/doumee/dao/business/CompanyMapper.java
new file mode 100644
index 0000000..6c3f080
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/CompanyMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Company;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface CompanyMapper extends MPJBaseMapper<Company> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/CompanyMemberMapper.java b/server/src/main/java/com/doumee/dao/business/CompanyMemberMapper.java
new file mode 100644
index 0000000..4a669e7
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/CompanyMemberMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.CompanyMember;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/03 16:30
+ */
+public interface CompanyMemberMapper extends BaseMapper<CompanyMember> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/ManagersMapper.java b/server/src/main/java/com/doumee/dao/business/ManagersMapper.java
new file mode 100644
index 0000000..54dc238
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/ManagersMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Managers;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface ManagersMapper extends BaseMapper<Managers> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/MemberMapper.java b/server/src/main/java/com/doumee/dao/business/MemberMapper.java
new file mode 100644
index 0000000..0d83fcf
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/MemberMapper.java
@@ -0,0 +1,13 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Member;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface MemberMapper extends MPJBaseMapper<Member> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/MultifileMapper.java b/server/src/main/java/com/doumee/dao/business/MultifileMapper.java
new file mode 100644
index 0000000..6f67762
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/MultifileMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Multifile;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface MultifileMapper extends BaseMapper<Multifile> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/NoticesMapper.java b/server/src/main/java/com/doumee/dao/business/NoticesMapper.java
new file mode 100644
index 0000000..a6293ab
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/NoticesMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Notices;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface NoticesMapper extends BaseMapper<Notices> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/WorkorderLogMapper.java b/server/src/main/java/com/doumee/dao/business/WorkorderLogMapper.java
new file mode 100644
index 0000000..ea8c650
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/WorkorderLogMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.WorkorderLog;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface WorkorderLogMapper extends BaseMapper<WorkorderLog> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/WorkorderMapper.java b/server/src/main/java/com/doumee/dao/business/WorkorderMapper.java
new file mode 100644
index 0000000..dfa4e4f
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/WorkorderMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Workorder;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface WorkorderMapper extends BaseMapper<Workorder> {
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Category.java b/server/src/main/java/com/doumee/dao/business/model/Category.java
new file mode 100644
index 0000000..eab4464
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Category.java
@@ -0,0 +1,86 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("鍒嗙被淇℃伅琛�")
+@TableName("`category`")
+public class Category {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelExportColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelExportColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelExportColumn(name="鍥炬爣")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣", example = "1")
+    @ExcelExportColumn(name="绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣")
+    private Integer type;
+
+    @ApiModelProperty(value = "鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�", example = "1")
+    @ExcelExportColumn(name="鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "鍚嶇О璺緞")
+    @ExcelExportColumn(name="鍚嶇О璺緞")
+    private String namePath;
+
+    @ApiModelProperty(value = "缂栫爜璺緞")
+    @ExcelExportColumn(name="缂栫爜璺緞")
+    private String idPath;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Company.java b/server/src/main/java/com/doumee/dao/business/model/Company.java
new file mode 100644
index 0000000..0eb4d26
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Company.java
@@ -0,0 +1,116 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 缁勭粐淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("缁勭粐淇℃伅琛�")
+@TableName("`company`")
+public class Company {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelExportColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1绂佺敤", example = "1")
+    @ExcelExportColumn(name="鐘舵�� 0姝e父 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "澶村儚")
+    @ExcelExportColumn(name="澶村儚")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷", example = "1")
+    @ExcelExportColumn(name="绫诲瀷")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎵�灞炵埗绾х紪鐮侊紙鍏宠仈company)", example = "1")
+    @ExcelExportColumn(name="鎵�灞炵埗绾х紪鐮侊紙鍏宠仈company)")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "缂栫爜")
+    @ExcelExportColumn(name="缂栫爜")
+    private String code;
+
+    @ApiModelProperty(value = "浼佸井鏍囪瘑")
+    @ExcelExportColumn(name="浼佸井鏍囪瘑")
+    private String qwId;
+
+    @ApiModelProperty(value = "鍚嶇О璺緞")
+    @ExcelExportColumn(name="鍚嶇О璺緞")
+    private String namePath;
+
+    @ApiModelProperty(value = "缂栫爜璺緞")
+    @ExcelExportColumn(name="缂栫爜璺緞")
+    private String idPath;
+    @ApiModelProperty(value = "浼佷笟寰俊鎵�灞炵埗绾х紪鐮侊紙鍏宠仈company)", example = "1")
+    @ExcelExportColumn(name="浼佷笟寰俊鎵�灞炵埗绾х紪鐮侊紙鍏宠仈company)")
+    private String qwParentId;
+
+
+    @TableField(exist = false)
+    private List<Company> childList;
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕瀛�")
+    @TableField(exist = false)
+    private String editorName;
+    @ApiModelProperty(value = "涓婄骇缁勭粐鍚嶇О")
+    @TableField(exist = false)
+    private String parentName;
+    @ApiModelProperty(value = "鐖剁骇閮ㄩ棬绾у埆璺緞", example = "1")
+    @TableField(exist = false)
+    private String parentCompanyPath;
+
+    @ApiModelProperty(value = "鏄惁涓洪儴闂ㄨ礋璐d汉0-鍚︼紱1-鏄�", example = "1")
+    @TableField(exist = false)
+    private Integer isLeader;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/CompanyMember.java b/server/src/main/java/com/doumee/dao/business/model/CompanyMember.java
new file mode 100644
index 0000000..dae2886
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/CompanyMember.java
@@ -0,0 +1,73 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 浜哄憳淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/03 16:30
+ */
+@Data
+@ApiModel("浜哄憳淇℃伅琛�")
+@TableName("`company_member`")
+public class CompanyMember {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)", example = "1")
+    @ExcelExportColumn(name="鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)")
+    private Integer companyId;
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮佽矾寰� ", example = "1")
+    @ExcelExportColumn(name="鎵�灞炵粍缁囩紪鐮佽矾寰� ")
+    private String companyIdPath;
+
+    @ApiModelProperty(value = "浜哄憳缂栫爜锛堝叧鑱攎ember", example = "1")
+    @ExcelExportColumn(name="浜哄憳缂栫爜锛堝叧鑱攎ember")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "鏄惁涓洪儴闂ㄨ礋璐d汉0-鍚︼紱1-鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁涓洪儴闂ㄨ礋璐d汉0-鍚︼紱1-鏄�")
+    private Integer isLeader;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Managers.java b/server/src/main/java/com/doumee/dao/business/model/Managers.java
new file mode 100644
index 0000000..1b1ca8a
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Managers.java
@@ -0,0 +1,84 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 璐d换浜轰俊鎭〃
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("璐d换浜轰俊鎭〃")
+@TableName("`managers`")
+public class Managers {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)")
+    @ExcelExportColumn(name="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)")
+    private String categoryId;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤", example = "1")
+    @ExcelExportColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "绫诲瀷 0SHE璐熻矗浜� 1DCA鎵嬪姩鎶勯�佷汉鍛� 2DCA鏉冮檺浜哄憳", example = "1")
+    @ExcelExportColumn(name="绫诲瀷 0SHE璐熻矗浜� 1DCA鎵嬪姩鎶勯�佷汉鍛� 2DCA鏉冮檺浜哄憳")
+    private Integer type;
+
+    @ApiModelProperty(value = "浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelExportColumn(name="浜哄憳缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+    @ApiModelProperty(value = "缁勭粐鍚嶇О")
+    @TableField(exist = false)
+    private String companyName;
+    @ApiModelProperty(value = "鏈�鍚庢搷浣滀汉")
+    @TableField(exist = false)
+    private String editorName;
+    @ApiModelProperty(value = "鍛樺伐濮撳悕")
+    @TableField(exist = false)
+    private String memberName;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Member.java b/server/src/main/java/com/doumee/dao/business/model/Member.java
new file mode 100644
index 0000000..b2e6cc3
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Member.java
@@ -0,0 +1,127 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("浜哄憳淇℃伅琛�")
+@TableName("`member`")
+public class Member {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelExportColumn(name="濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1绂佺敤", example = "1")
+    @ExcelExportColumn(name="鐘舵�� 0姝e父 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "澶村儚")
+    @ExcelExportColumn(name="澶村儚")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷", example = "1")
+    @ExcelExportColumn(name="绫诲瀷")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)", example = "1")
+    @ExcelExportColumn(name="鎵�灞炵粍缁囩紪鐮侊紙鍏宠仈company)")
+    private String companyId;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelExportColumn(name="鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "閭")
+    @ExcelExportColumn(name="閭")
+    private String email;
+
+    @ApiModelProperty(value = "鎬у埆 0鐢� 1濂� 2浣嶇疆", example = "1")
+    @ExcelExportColumn(name="鎬у埆 0鐢� 1濂� 2浣嶇疆")
+    private Integer sex;
+
+    @ApiModelProperty(value = "宸ュ彿")
+    @ExcelExportColumn(name="宸ュ彿")
+    private String code;
+
+    @ApiModelProperty(value = "浼佸井鏍囪瘑")
+    @ExcelExportColumn(name="浼佸井鏍囪瘑")
+    private String qwId;
+
+    @ApiModelProperty(value = "璇佷欢鍙�")
+    @ExcelExportColumn(name="璇佷欢鍙�")
+    private String idcard;
+
+    @ApiModelProperty(value = "鏈�杩戜笂绾挎椂闂�")
+    @ExcelExportColumn(name="鏈�杩戜笂绾挎椂闂�")
+    private Date lastLoginDate;
+
+    @ApiModelProperty(value = "鐧诲綍娆℃暟", example = "1")
+    @ExcelExportColumn(name="鐧诲綍娆℃暟")
+    private Integer loginCount;
+
+    @ApiModelProperty(value = "鏄惁鍖呭惈涓嬬骇缁勭粐鐢ㄦ埛")
+    @TableField(exist = false)
+    private Boolean includeChild;
+    @ApiModelProperty(value = "缁勭粐鍚嶇О")
+    private String companyName;
+    @ApiModelProperty(value = "鏈�鍚庢搷浣滀汉")
+    @TableField(exist = false)
+    private String editorName;
+    @ApiModelProperty(value = "濮撳悕/鎵嬫満鍙�/宸ュ彿")
+    @TableField(exist = false)
+    private String keyword;
+    @ApiModelProperty(value = "鐢ㄦ埛鎵�灞炵粍缁囬泦鍚�")
+    @TableField(exist = false)
+    private List<Company> companyList;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Multifile.java b/server/src/main/java/com/doumee/dao/business/model/Multifile.java
new file mode 100644
index 0000000..a42383f
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -0,0 +1,81 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 闄勪欢涓婁紶淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("闄勪欢涓婁紶淇℃伅琛�")
+@TableName("`multifile`")
+public class Multifile {
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鏂囦欢鍚�")
+    @ExcelExportColumn(name="鏂囦欢鍚�")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String info;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜", example = "1")
+    @ExcelExportColumn(name="鍏宠仈瀵硅薄缂栫爜")
+    private Integer objId;
+
+    @ApiModelProperty(value = "绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬", example = "1")
+    @ExcelExportColumn(name="绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬")
+    private Integer type;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊", example = "1")
+    @ExcelExportColumn(name="鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1瀹夊叏椋庨櫓涓婃姤 2瀹夊叏椋庨櫓澶勭悊 3瀹夊叏椋庨櫓鍒嗛厤鐗╀笟涓荤 4瀹夊叏椋庨櫓鍒嗛厤澶勭悊浜� 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊")
+    private Integer objType;
+
+    @ApiModelProperty(value = "鏂囦欢鍦板潃")
+    @ExcelExportColumn(name="鏂囦欢鍦板潃")
+    private String fileurl;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "浼佷笟缂栫爜(鍏宠仈company琛級", example = "1")
+    @ExcelExportColumn(name="浼佷笟缂栫爜(鍏宠仈company琛級")
+    private Integer companyId;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Notices.java b/server/src/main/java/com/doumee/dao/business/model/Notices.java
new file mode 100644
index 0000000..a2ecc6c
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Notices.java
@@ -0,0 +1,130 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 绯荤粺娑堟伅淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("绯荤粺娑堟伅淇℃伅琛�")
+@TableName("`notices`")
+public class Notices {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鏍囬")
+    @ExcelExportColumn(name="鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "绠�浠�")
+    @ExcelExportColumn(name="绠�浠�")
+    private String info;
+
+    @ApiModelProperty(value = "鍐呭")
+    @ExcelExportColumn(name="鍐呭")
+    private String content;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜", example = "1")
+    @ExcelExportColumn(name="鍏宠仈瀵硅薄缂栫爜")
+    private Integer objId;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0宸ュ崟")
+    @ExcelExportColumn(name="鍏宠仈瀵硅薄绫诲瀷 0宸ュ崟")
+    private String objType;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄鍚嶇О")
+    @ExcelExportColumn(name="鍏宠仈瀵硅薄鍚嶇О")
+    private String objName;
+
+    @ApiModelProperty(value = "绫诲瀷 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�")
+    @ExcelExportColumn(name="绫诲瀷 0宸ュ崟涓婃姤 1宸ュ崟鍒嗛厤鐗╀笟涓荤 2SHE宸ュ崟鎶勯��  3宸ュ崟澶勭悊鍌績 4宸ュ崟鍒嗛厤澶勭悊浜�")
+    private String type;
+
+    @ApiModelProperty(value = "鍏宠仈鍙傛暟1")
+    @ExcelExportColumn(name="鍏宠仈鍙傛暟1")
+    private String param1;
+
+    @ApiModelProperty(value = "鍏宠仈鍙傛暟2")
+    @ExcelExportColumn(name="鍏宠仈鍙傛暟2")
+    private String param2;
+
+    @ApiModelProperty(value = "鍏宠仈鍙傛暟3")
+    @ExcelExportColumn(name="鍏宠仈鍙傛暟3")
+    private String param3;
+
+    @ApiModelProperty(value = "鍏宠仈鍙傛暟4")
+    @ExcelExportColumn(name="鍏宠仈鍙傛暟4")
+    private String param4;
+
+    @ApiModelProperty(value = "鍏宠仈鍙傛暟5")
+    @ExcelExportColumn(name="鍏宠仈鍙傛暟5")
+    private String param5;
+
+    @ApiModelProperty(value = "鍏宠仈鐢ㄦ埛濮撳悕")
+    @ExcelExportColumn(name="鍏宠仈鐢ㄦ埛濮撳悕")
+    private String memberName;
+
+    @ApiModelProperty(value = "鍏宠仈鐢ㄦ埛浼佸井缂栫爜")
+    @ExcelExportColumn(name="鍏宠仈鐢ㄦ埛浼佸井缂栫爜")
+    private String qwId;
+
+    @ApiModelProperty(value = "鍏宠仈鐢ㄦ埛缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelExportColumn(name="鍏宠仈鐢ㄦ埛缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "鍏宠仈浼佷笟缁勭粐缂栫爜(鍏宠仈company锛�", example = "1")
+    @ExcelExportColumn(name="鍏宠仈浼佷笟缁勭粐缂栫爜(鍏宠仈company锛�")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1宸插叧闂�", example = "1")
+    @ExcelExportColumn(name="鐘舵�� 0姝e父 1宸插叧闂�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鏄惁鎶勯�� 0涓嶆槸 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鎶勯�� 0涓嶆槸 1鏄�")
+    private Integer sendacopy;
+
+    @ApiModelProperty(value = "鏄惁宸茶 0鏈 1宸茶", example = "1")
+    @ExcelExportColumn(name="鏄惁宸茶 0鏈 1宸茶")
+    private Integer readed;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/Workorder.java b/server/src/main/java/com/doumee/dao/business/model/Workorder.java
new file mode 100644
index 0000000..391ffe7
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/Workorder.java
@@ -0,0 +1,201 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 宸ュ崟淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("宸ュ崟淇℃伅琛�")
+@TableName("`workorder`")
+public class Workorder {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)")
+    @ExcelExportColumn(name="鎵�灞炲垎绫荤紪锛堝叧鑱攃ategory)")
+    private String categoryId;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�", example = "1")
+    @ExcelExportColumn(name="鐘舵�� 0寰呯‘璁�/寰呭垵瀹� 1寰呭垎閰�/寰呯粓瀹� 2寰呭鐞�  3 宸叉挙鍥� 4宸插鐞�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelExportColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "绫诲瀷 0SHE浜嬩欢 1DCA浜嬩欢鎻愪氦璁板綍 2DCA宸ュ崟 3璺岀粖婊戜簨浠�", example = "1")
+    @ExcelExportColumn(name="绫诲瀷 0SHE浜嬩欢 1DCA浜嬩欢鎻愪氦璁板綍 2DCA宸ュ崟 3璺岀粖婊戜簨浠�")
+    private Integer type;
+
+    @ApiModelProperty(value = "涓婃姤浜哄憳缂栫爜锛堝叧鑱攎ember)", example = "1")
+    @ExcelExportColumn(name="涓婃姤浜哄憳缂栫爜锛堝叧鑱攎ember)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "閮ㄩ棬缂栫爜", example = "1")
+    @ExcelExportColumn(name="閮ㄩ棬缂栫爜")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "涓婃姤鏃堕棿", example = "1")
+    @ExcelExportColumn(name="涓婃姤鏃堕棿")
+    private Integer submitDate;
+
+    @ApiModelProperty(value = "SHE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�", example = "1")
+    @ExcelExportColumn(name="SHE娑夊強浜哄憳绫诲瀷 0鏈汉 1鍚屼簨 2渚涘簲鍟�")
+    private Integer memberType;
+
+    @ApiModelProperty(value = "SHE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎")
+    @ExcelExportColumn(name="SHE娑夊強浜哄憳浼佷笟缂栫爜闆嗗悎")
+    private String memberQwids;
+
+    @ApiModelProperty(value = "SHE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�")
+    @ExcelExportColumn(name="SHE娑夊強浜哄憳渚涘簲鍟嗛泦鍚�")
+    private String memberNames;
+
+    @ApiModelProperty(value = "鍙戠敓鍦扮偣/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�", example = "1")
+    @ExcelExportColumn(name="鍙戠敓鍦扮偣/浣嶇疆缂栫爜锛堝叧鑱攃ategory锛�")
+    private Integer localtionId;
+
+    @ApiModelProperty(value = "鏄惁澶栭儴灏卞尰 0鍚� 1鏄�")
+    @ExcelExportColumn(name="鏄惁澶栭儴灏卞尰 0鍚� 1鏄�")
+    private String outJiuyi;
+
+    @ApiModelProperty(value = "鏄惁鍖诲姟瀹� 0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍖诲姟瀹� 0鍚� 1鏄�")
+    private Integer isYiwushi;
+
+    @ApiModelProperty(value = "鏄惁鍙椾激 0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍙椾激 0鍚� 1鏄�")
+    private Integer isHurted;
+
+    @ApiModelProperty(value = "鏄惁鍜屽伐浣滅浉鍏�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍜屽伐浣滅浉鍏�")
+    private Integer workRelated;
+
+    @ApiModelProperty(value = "浜嬩欢璇存槑", example = "1")
+    @ExcelExportColumn(name="浜嬩欢璇存槑")
+    private Integer eventInfo;
+
+    @ApiModelProperty(value = "閭欢閫氱煡浜哄憳缂栫爜闆嗗悎")
+    @ExcelExportColumn(name="閭欢閫氱煡浜哄憳缂栫爜闆嗗悎")
+    private String emialMemberIds;
+
+    @ApiModelProperty(value = "浼佷笟寰俊閫氱煡浜哄憳缂栫爜闆嗗悎")
+    @ExcelExportColumn(name="浼佷笟寰俊閫氱煡浜哄憳缂栫爜闆嗗悎")
+    private String qwnoticeMemberIds;
+
+    @ApiModelProperty(value = "鍙戠幇鏃堕棿")
+    @ExcelExportColumn(name="鍙戠幇鏃堕棿")
+    private String happenTime;
+
+    @ApiModelProperty(value = "椋庨櫓绫诲瀷(鍏宠仈category锛�")
+    @ExcelExportColumn(name="椋庨櫓绫诲瀷(鍏宠仈category锛�")
+
+    private Date typeId;
+
+    @ApiModelProperty(value = "椋庨櫓鎻忚堪", example = "1")
+    @ExcelExportColumn(name="椋庨櫓鎻忚堪")
+    private Integer riskInfo;
+
+    @ApiModelProperty(value = "褰撳墠鐗╀笟涓荤浼佷笟寰俊缂栫爜", example = "1")
+    @ExcelExportColumn(name="褰撳墠鐗╀笟涓荤浼佷笟寰俊缂栫爜")
+    private Integer managerId;
+
+    @ApiModelProperty(value = "褰撳墠澶勭悊浜哄憳浼佷笟寰俊缂栫爜", example = "1")
+    @ExcelExportColumn(name="褰撳墠澶勭悊浜哄憳浼佷笟寰俊缂栫爜")
+    private Integer dealerId;
+
+    @ApiModelProperty(value = "鍒嗛厤鏃堕棿")
+    @ExcelExportColumn(name="鍒嗛厤鏃堕棿")
+
+    private Date dispatchTime;
+
+    @ApiModelProperty(value = "鍒嗛厤澶囨敞")
+    @ExcelExportColumn(name="鍒嗛厤澶囨敞")
+    private String dispatchInfo;
+
+    @ApiModelProperty(value = "澶勭悊鏃堕棿")
+    @ExcelExportColumn(name="澶勭悊鏃堕棿")
+
+    private Date dealTime;
+
+    @ApiModelProperty(value = "澶勭悊澶囨敞")
+    @ExcelExportColumn(name="澶勭悊澶囨敞")
+    private String dealInfo;
+
+    @ApiModelProperty(value = "DCA闂鏍囬")
+    @ExcelExportColumn(name="DCA闂鏍囬")
+    private String problemTitle;
+
+    @ApiModelProperty(value = "DCA闂缂栫爜(鍏宠仈category锛�", example = "1")
+    @ExcelExportColumn(name="DCA闂缂栫爜(鍏宠仈category锛�")
+    private Integer problemId;
+
+    @ApiModelProperty(value = "DCA闂鎻忚堪")
+    @ExcelExportColumn(name="DCA闂鎻忚堪")
+    private String problemInfo;
+
+    @ApiModelProperty(value = "浣嶇疆鍦扮偣璺緞鍚嶇О")
+    @ExcelExportColumn(name="浣嶇疆鍦扮偣璺緞鍚嶇О")
+    private String locationName;
+
+    @ApiModelProperty(value = "宸ュ崟鍙�")
+    @ExcelExportColumn(name="宸ュ崟鍙�")
+    private String code;
+
+    @ApiModelProperty(value = "DCA绗﹀悎鏁伴噺", example = "1")
+    @ExcelExportColumn(name="DCA绗﹀悎鏁伴噺")
+    private Integer dcaYesNum;
+
+    @ApiModelProperty(value = "DCA涓嶇鍚堟暟閲�", example = "1")
+    @ExcelExportColumn(name="DCA涓嶇鍚堟暟閲�")
+    private Integer dcaNoNum;
+
+    @ApiModelProperty(value = "DCA鎻愪氦璁板綍缂栫爜锛堣嚜鍏宠仈锛�", example = "1")
+    @ExcelExportColumn(name="DCA鎻愪氦璁板綍缂栫爜锛堣嚜鍏宠仈锛�")
+    private Integer dcaRecordId;
+
+    @ApiModelProperty(value = "DCA宸ュ崟鎶勯�佷汉鍛樹紒涓氬井淇$紪鐮侀泦鍚�(澶氫釜鑻辨枃閫楀彿闅斿紑锛�")
+    @ExcelExportColumn(name="DCA宸ュ崟鎶勯�佷汉鍛樹紒涓氬井淇$紪鐮侀泦鍚�(澶氫釜鑻辨枃閫楀彿闅斿紑锛�")
+    private String dcaCsIds;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java b/server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java
new file mode 100644
index 0000000..3fedd14
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java
@@ -0,0 +1,98 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelExportColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 宸ュ崟鎿嶄綔鍘嗗彶琛�
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Data
+@ApiModel("宸ュ崟鎿嶄綔鍘嗗彶琛�")
+@TableName("`workorder_log`")
+public class WorkorderLog {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelExportColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelExportColumn(name="鍒涘缓鏃堕棿")
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelExportColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelExportColumn(name="鏇存柊鏃堕棿")
+
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelExportColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelExportColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "宸ュ崟缂栫爜锛堝叧鑱攚orkorder)", example = "1")
+    @ExcelExportColumn(name="宸ュ崟缂栫爜锛堝叧鑱攚orkorder)")
+    private Integer workorderId;
+
+    @ApiModelProperty(value = "鏍囬")
+    @ExcelExportColumn(name="鏍囬")
+    private String title;
+
+    @ApiModelProperty(value = "绠�浠�")
+    @ExcelExportColumn(name="绠�浠�")
+    private String content;
+
+    @ApiModelProperty(value = "鎿嶄綔绫诲瀷 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績", example = "1")
+    @ExcelExportColumn(name="鎿嶄綔绫诲瀷 0浠诲姟涓婃姤 1浠诲姟纭 2浠诲姟鍒嗛厤鐗╀笟涓荤 3浠诲姟鍏抽棴 4浠诲姟鍒嗛厤澶勭悊浜� 5浠诲姟鍌績")
+    private Integer objType;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜")
+    @ExcelExportColumn(name="鍏宠仈瀵硅薄缂栫爜")
+    private String objId;
+
+    @ApiModelProperty(value = "鎿嶄綔鍓嶅唴瀹�")
+    @ExcelExportColumn(name="鎿嶄綔鍓嶅唴瀹�")
+    private String beforeContent;
+
+    @ApiModelProperty(value = "鎿嶄綔鍚庡唴瀹�")
+    @ExcelExportColumn(name="鎿嶄綔鍚庡唴瀹�")
+    private String afterContent;
+
+    @ApiModelProperty(value = "鍙傛暟1")
+    @ExcelExportColumn(name="鍙傛暟1")
+    private String param1;
+
+    @ApiModelProperty(value = "鍙傛暟2")
+    @ExcelExportColumn(name="鍙傛暟2")
+    private String param2;
+
+    @ApiModelProperty(value = "鍙傛暟3")
+    @ExcelExportColumn(name="鍙傛暟3")
+    private String param3;
+
+    @ApiModelProperty(value = "鍙傛暟4")
+    @ExcelExportColumn(name="鍙傛暟4")
+    private String param4;
+
+}
diff --git a/server/src/main/java/com/doumee/dao/business/vo/CompanyTest.java b/server/src/main/java/com/doumee/dao/business/vo/CompanyTest.java
new file mode 100644
index 0000000..3e300fa
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/vo/CompanyTest.java
@@ -0,0 +1,4 @@
+package com.doumee.dao.business.vo;
+
+public class CompanyTest {
+}
diff --git a/server/src/main/java/com/doumee/dao/business/vo/CompanyTree.java b/server/src/main/java/com/doumee/dao/business/vo/CompanyTree.java
new file mode 100644
index 0000000..b961eb4
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/vo/CompanyTree.java
@@ -0,0 +1,105 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.dao.business.model.Company;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/7/13 10:40
+ */
+public class CompanyTree {
+
+    // 淇濆瓨鍙備笌鏋勫缓鏍戝舰鐨勬墍鏈夋暟鎹紙閫氬父鏁版嵁搴撴煡璇㈢粨鏋滐級
+    public List<Company> nodeList = new ArrayList<>();
+
+    public Integer origin = 0; //0鑷缓 1浼佸井
+
+
+    /**
+     *  鏋勯�犳柟娉�
+     *  @param nodeList 灏嗘暟鎹泦鍚堣祴鍊肩粰nodeList锛屽嵆鎵�鏈夋暟鎹綔涓烘墍鏈夎妭鐐广��
+     */
+    public CompanyTree(List<Company> nodeList, Integer origin){
+        this.nodeList = nodeList;
+        this.origin = origin;
+    }
+
+
+    /**
+     *   鑾峰彇闇�鏋勫缓鐨勬墍鏈夋牴鑺傜偣锛堥《绾ц妭鐐癸級 "0"
+     *   @return 鎵�鏈夋牴鑺傜偣List闆嗗悎
+     */
+    public List<Company> getRootNode(){
+        // 淇濆瓨鎵�鏈夋牴鑺傜偣锛堟墍鏈夋牴鑺傜偣鐨勬暟鎹級
+        List<Company> rootNodeList = new ArrayList<>();
+        // treeNode锛氭煡璇㈠嚭鐨勬瘡涓�鏉℃暟鎹紙鑺傜偣锛�
+        for (Company treeNode : nodeList){
+            // 鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘牴鑺傜偣锛屾澶勬敞鎰忥細鑻arentId绫诲瀷鏄疭tring锛屽垯瑕侀噰鐢╡quals()鏂规硶鍒ゆ柇銆�
+            if(origin== 1){
+                if (StringUtils.isBlank(treeNode.getQwParentId()) || StringUtils.equals(treeNode.getQwId(),"1")) {
+                    // 鏄紝娣诲姞
+                    rootNodeList.add(treeNode);
+                }
+            }else {
+                if (Objects.isNull(treeNode.getParentId())) {
+                    // 鏄紝娣诲姞
+                    rootNodeList.add(treeNode);
+                }
+            }
+        }
+        return rootNodeList;
+    }
+
+
+    /**
+     *  鏍规嵁姣忎竴涓《绾ц妭鐐癸紙鏍硅妭鐐癸級杩涜鏋勫缓鏍戝舰缁撴瀯
+     *  @return  鏋勫缓鏁存5鏍�
+     */
+    public List<Company> buildTree(){
+        // treeNodes锛氫繚瀛樹竴涓《绾ц妭鐐规墍鏋勫缓鍑烘潵鐨勫畬鏁存爲褰�
+        List<Company> treeNodes = new ArrayList<Company>();
+        // getRootNode()锛氳幏鍙栨墍鏈夌殑鏍硅妭鐐�
+        for (Company treeRootNode : getRootNode()) {
+            // 灏嗛《绾ц妭鐐硅繘琛屾瀯寤哄瓙鏍�
+            treeRootNode = buildChildTree(treeRootNode);
+            // 瀹屾垚涓�涓《绾ц妭鐐规墍鏋勫缓鐨勬爲褰紝澧炲姞杩涙潵
+            treeNodes.add(treeRootNode);
+        }
+        return treeNodes;
+    }
+
+    /**
+     *  閫掑綊-----鏋勫缓瀛愭爲褰㈢粨鏋�
+     *  @param  pNode 鏍硅妭鐐癸紙椤剁骇鑺傜偣锛�
+     *  @return 鏁存5鏍�
+     */
+    public Company buildChildTree(Company pNode){
+        List<Company> childTree = new ArrayList<Company>();
+        // nodeList锛氭墍鏈夎妭鐐归泦鍚堬紙鎵�鏈夋暟鎹級
+        for (Company treeNode : nodeList) {
+            // 鍒ゆ柇褰撳墠鑺傜偣鐨勭埗鑺傜偣ID鏄惁绛変簬鏍硅妭鐐圭殑ID锛屽嵆褰撳墠鑺傜偣涓哄叾涓嬬殑瀛愯妭鐐�
+            if(origin==1){
+                if (!Objects.isNull(treeNode.getQwParentId())&&treeNode.getQwParentId().equals(pNode.getQwId())) {
+                    // 鍐嶉�掑綊杩涜鍒ゆ柇褰撳墠鑺傜偣鐨勬儏鍐碉紝璋冪敤鑷韩鏂规硶
+                    childTree.add(buildChildTree(treeNode));
+                }
+            } else  {
+                if (!Objects.isNull(treeNode.getParentId())&&treeNode.getParentId().equals(pNode.getId())) {
+                    // 鍐嶉�掑綊杩涜鍒ゆ柇褰撳墠鑺傜偣鐨勬儏鍐碉紝璋冪敤鑷韩鏂规硶
+                    childTree.add(buildChildTree(treeNode));
+                }
+            }
+        }
+        // for寰幆缁撴潫锛屽嵆鑺傜偣涓嬫病鏈変换浣曡妭鐐癸紝鏍戝舰鏋勫缓缁撴潫锛岃缃爲缁撴灉
+        pNode.setChildList(childTree);
+        return pNode;
+    }
+
+
+}
diff --git a/server/src/main/java/com/doumee/dao/common/dto/UpdateSortDTO.java b/server/src/main/java/com/doumee/dao/common/dto/UpdateSortDTO.java
index 7b8f32e..4c67e9d 100644
--- a/server/src/main/java/com/doumee/dao/common/dto/UpdateSortDTO.java
+++ b/server/src/main/java/com/doumee/dao/common/dto/UpdateSortDTO.java
@@ -9,7 +9,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/CreateRoleMenuDTO.java b/server/src/main/java/com/doumee/dao/system/dto/CreateRoleMenuDTO.java
index b6fcfe4..1540c10 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/CreateRoleMenuDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/CreateRoleMenuDTO.java
@@ -9,7 +9,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/CreateRolePermissionDTO.java b/server/src/main/java/com/doumee/dao/system/dto/CreateRolePermissionDTO.java
index 6e11108..39760c5 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/CreateRolePermissionDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/CreateRolePermissionDTO.java
@@ -9,7 +9,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/CreateSystemUserDTO.java b/server/src/main/java/com/doumee/dao/system/dto/CreateSystemUserDTO.java
index 9046b6d..2f907fc 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/CreateSystemUserDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/CreateSystemUserDTO.java
@@ -8,7 +8,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/CreateUserRoleDTO.java b/server/src/main/java/com/doumee/dao/system/dto/CreateUserRoleDTO.java
index 18bf51f..3075cb4 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/CreateUserRoleDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/CreateUserRoleDTO.java
@@ -9,7 +9,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java b/server/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java
index b97da8d..512c323 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/LoginDTO.java b/server/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
index 50e6820..79c341e 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -8,7 +8,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QueryJobDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QueryJobDTO.java
index 11ad471..eb62c95 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QueryJobDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QueryJobDTO.java
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDTO.java
index da75ffa..c0613c8 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDTO.java
@@ -7,7 +7,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDataDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDataDTO.java
index 6657147..0cdded7 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDataDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemDictDataDTO.java
@@ -7,7 +7,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobListDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobListDTO.java
index 6432e1a..2d4c936 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobListDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobListDTO.java
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobLogDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobLogDTO.java
index 1b9ca16..22ffea2 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobLogDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemJobLogDTO.java
@@ -21,7 +21,7 @@
     private String jobDistributeGroup;
 
     @ApiModelProperty(value = "涓氬姟鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+
     private Date businessTime;
 
     @ApiModelProperty(value = "鎵ц浠诲姟鐨勬湇鍔″櫒IP")
@@ -34,6 +34,6 @@
     private Byte status;
 
     @ApiModelProperty(value = "鏃ュ織鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+
     private Date createTime;
 }
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemLoginLogDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemLoginLogDTO.java
index 56782fb..9814aae 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemLoginLogDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemLoginLogDTO.java
@@ -8,7 +8,7 @@
 
 /**
  * 鏌ヨ鐧诲綍鏃ュ織鍙傛暟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemPermissionDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemPermissionDTO.java
index f8c8d31..b3f5951 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemPermissionDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemPermissionDTO.java
@@ -7,7 +7,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemRoleDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemRoleDTO.java
index a9965b6..c60b70a 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemRoleDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemRoleDTO.java
@@ -7,7 +7,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemTraceLogDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemTraceLogDTO.java
index 29ab2ff..1849567 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemTraceLogDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemTraceLogDTO.java
@@ -9,7 +9,7 @@
 
 /**
  * 璺熻釜鏃ュ織鏌ヨ
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemUserDTO.java b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemUserDTO.java
index 10d2acf..0109055 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/QuerySystemUserDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/QuerySystemUserDTO.java
@@ -8,7 +8,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/ResetSystemUserPwdDTO.java b/server/src/main/java/com/doumee/dao/system/dto/ResetSystemUserPwdDTO.java
index ee3e2da..9339737 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/ResetSystemUserPwdDTO.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/ResetSystemUserPwdDTO.java
@@ -9,7 +9,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/dto/UpdatePwdDto.java b/server/src/main/java/com/doumee/dao/system/dto/UpdatePwdDto.java
index 8e45a7a..5ae3e38 100644
--- a/server/src/main/java/com/doumee/dao/system/dto/UpdatePwdDto.java
+++ b/server/src/main/java/com/doumee/dao/system/dto/UpdatePwdDto.java
@@ -9,7 +9,7 @@
 import java.io.Serializable;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemDict.java b/server/src/main/java/com/doumee/dao/system/model/SystemDict.java
index 2c086e0..b42797d 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemDict.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemDict.java
@@ -14,7 +14,7 @@
 
 /**
  * 瀛楀吀
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemDictData.java b/server/src/main/java/com/doumee/dao/system/model/SystemDictData.java
index ce43f35..80a7813 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemDictData.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemDictData.java
@@ -14,7 +14,7 @@
 
 /**
  * 瀛楀吀鏁版嵁
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
@@ -33,6 +33,9 @@
     @ApiModelProperty(value = "鏁版嵁鍊�")
     @NotBlank(message = "鏁版嵁鍊间笉鑳戒负绌�", groups = {Constants.OperaType.Create.class, Constants.OperaType.Update.class})
     private String code;
+    @ApiModelProperty(value = "澶囨敞")
+    @NotBlank(message = "澶囨敞")
+    private String remark;
 
     @ApiModelProperty(value = "鏁版嵁鏍囩")
     @NotBlank(message = "鏁版嵁鏍囩涓嶈兘涓虹┖", groups = {Constants.OperaType.Create.class, Constants.OperaType.Update.class})
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemJob.java b/server/src/main/java/com/doumee/dao/system/model/SystemJob.java
index 8a79e4b..db35aa0 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemJob.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemJob.java
@@ -15,7 +15,7 @@
 
 /**
  * 绯荤粺瀹氭椂浠诲姟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
@@ -68,7 +68,7 @@
     private String allowServerIps;
 
     @ApiModelProperty(value = "鐘舵�侊紙0鍑嗗锛�1杩愯涓級", example = "1")
-    private Byte status;
+    private Integer status;
 
     @ApiModelProperty(value = "閿佺紪鍙�", example = "1")
     private Integer lockNumber;
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemJobLog.java b/server/src/main/java/com/doumee/dao/system/model/SystemJobLog.java
index 164cafc..1e255f1 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemJobLog.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemJobLog.java
@@ -10,7 +10,7 @@
 
 /**
  * 绯荤粺瀹氭椂浠诲姟鏃ュ織
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
@@ -62,7 +62,7 @@
     private String serverIp;
 
     @ApiModelProperty(value = "鐘舵�侊紙0鎵ц澶辫触锛�1鎵ц鎴愬姛锛�2璺宠繃锛�-1鎵ц涓級", example = "1")
-    private Byte status;
+    private Integer status;
 
     @ApiModelProperty(value = "浠诲姟鎵ц涓婁笅鏂�")
     private String context;
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemJobSnippet.java b/server/src/main/java/com/doumee/dao/system/model/SystemJobSnippet.java
index dfdbc65..dc73d5c 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemJobSnippet.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemJobSnippet.java
@@ -11,7 +11,7 @@
 
 /**
  * 瀹氭椂浠诲姟鐗囨
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
@@ -63,7 +63,7 @@
     private String allowServerIps;
 
     @ApiModelProperty(value = "鍒嗙墖鐘舵�侊紙0鍑嗗锛�1杩愯涓紝2宸插畬鎴愶級", example = "1")
-    private Byte status;
+    private Integer status;
 
     @ApiModelProperty(value = "閿佺紪鍙�", example = "1")
     private Integer lockNumber;
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java b/server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java
index 7860fb7..d554baa 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemLoginLog.java
@@ -13,7 +13,7 @@
 
 /**
  * 鐧诲綍鏃ュ織
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemMenu.java b/server/src/main/java/com/doumee/dao/system/model/SystemMenu.java
index 7f70123..ac78b1b 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemMenu.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemMenu.java
@@ -16,7 +16,7 @@
 
 /**
  * 绯荤粺鑿滃崟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemPermission.java b/server/src/main/java/com/doumee/dao/system/model/SystemPermission.java
index 150f48a..7eee52a 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemPermission.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemPermission.java
@@ -14,7 +14,7 @@
 
 /**
  * 绯荤粺鏉冮檺
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemRole.java b/server/src/main/java/com/doumee/dao/system/model/SystemRole.java
index e87be24..9e5a316 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemRole.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemRole.java
@@ -14,7 +14,7 @@
 
 /**
  * 绯荤粺瑙掕壊
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemRoleMenu.java b/server/src/main/java/com/doumee/dao/system/model/SystemRoleMenu.java
index 0cfcc9d..3f01353 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemRoleMenu.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemRoleMenu.java
@@ -11,7 +11,7 @@
 
 /**
  * 瑙掕壊鑿滃崟鍏宠仈
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemRolePermission.java b/server/src/main/java/com/doumee/dao/system/model/SystemRolePermission.java
index b632959..5408e3a 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemRolePermission.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemRolePermission.java
@@ -11,7 +11,7 @@
 
 /**
  * 瑙掕壊鏉冮檺鍏宠仈
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java b/server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java
index 1930d71..bf77f5d 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemTraceLog.java
@@ -12,7 +12,7 @@
 
 /**
  * 璺熻釜鏃ュ織
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
@@ -78,11 +78,11 @@
 
     @ApiModelProperty(value = "鐘舵�侊紙0鎿嶄綔澶辫触锛�1鎿嶄綔鎴愬姛锛�-1鏈緱鍒板鐞嗭級", example = "1")
     @ExcelExportColumn(name="鐘舵��", valueMapping = "0=鎿嶄綔澶辫触;1=鎿嶄綔鎴愬姛;-1=鏈鐞�", width = 4)
-    private Byte status;
+    private Integer status;
 
     @ApiModelProperty(value = "寮傚父绛夌骇")
     @ExcelExportColumn(name="寮傚父绛夌骇", valueMapping = "0=浣�;5=涓�;10=楂�")
-    private Byte exceptionLevel;
+    private Integer exceptionLevel;
 
     @ApiModelProperty(value = "寮傚父淇℃伅")
     @ExcelExportColumn(name="寮傚父淇℃伅", width = 16)
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemUser.java b/server/src/main/java/com/doumee/dao/system/model/SystemUser.java
index e459937..3157800 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemUser.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -17,7 +17,7 @@
 
 /**
  * 绯荤粺鐢ㄦ埛
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/model/SystemUserRole.java b/server/src/main/java/com/doumee/dao/system/model/SystemUserRole.java
index 4d343a4..339b40c 100644
--- a/server/src/main/java/com/doumee/dao/system/model/SystemUserRole.java
+++ b/server/src/main/java/com/doumee/dao/system/model/SystemUserRole.java
@@ -11,7 +11,7 @@
 
 /**
  * 鐢ㄦ埛瑙掕壊鍏宠仈
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemDictDataListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemDictDataListVO.java
index ea9976f..f37a9fa 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemDictDataListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemDictDataListVO.java
@@ -7,7 +7,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemDictListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemDictListVO.java
index afdd7ca..7aaa2da 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemDictListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemDictListVO.java
@@ -7,7 +7,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemJobListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemJobListVO.java
index 6fe2cb6..5d0a124 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemJobListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemJobListVO.java
@@ -8,7 +8,7 @@
 import java.util.Date;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java
index 548d855..cbd9a4f 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemMenuListVO.java
@@ -9,7 +9,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java
index 9e98e30..1c8af1f 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemMenuNodeVO.java
@@ -8,7 +8,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java
index 5b1b8e0..bde8ccb 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java
@@ -9,7 +9,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemRoleListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemRoleListVO.java
index 9b22ebc..7033d46 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemRoleListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemRoleListVO.java
@@ -11,7 +11,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java b/server/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java
index 4cb7a2f..2d45172 100644
--- a/server/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java
+++ b/server/src/main/java/com/doumee/dao/system/vo/SystemUserListVO.java
@@ -9,7 +9,7 @@
 import java.util.List;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/job/CommonTestJob.java b/server/src/main/java/com/doumee/job/CommonTestJob.java
index e8f6705..859efef 100644
--- a/server/src/main/java/com/doumee/job/CommonTestJob.java
+++ b/server/src/main/java/com/doumee/job/CommonTestJob.java
@@ -8,7 +8,7 @@
 
 /**
  * 鏅�氱殑瀹氭椂浠诲姟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/job/DistributableTestJob.java b/server/src/main/java/com/doumee/job/DistributableTestJob.java
index c1c7709..3414b64 100644
--- a/server/src/main/java/com/doumee/job/DistributableTestJob.java
+++ b/server/src/main/java/com/doumee/job/DistributableTestJob.java
@@ -12,7 +12,7 @@
 
 /**
  * 鑷姩鍒嗗彂鐨勫畾鏃朵换鍔�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/job/DistributableTestJobDistributer.java b/server/src/main/java/com/doumee/job/DistributableTestJobDistributer.java
index f3cca47..03f5a23 100644
--- a/server/src/main/java/com/doumee/job/DistributableTestJobDistributer.java
+++ b/server/src/main/java/com/doumee/job/DistributableTestJobDistributer.java
@@ -11,7 +11,7 @@
 
 /**
  * DistributableTestJob鐨勫垎鍙戝櫒
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Component("distributableTestJobDistributer")
diff --git a/server/src/main/java/com/doumee/job/UpdateQywxTokenJob.java b/server/src/main/java/com/doumee/job/UpdateQywxTokenJob.java
new file mode 100644
index 0000000..55042bc
--- /dev/null
+++ b/server/src/main/java/com/doumee/job/UpdateQywxTokenJob.java
@@ -0,0 +1,33 @@
+package com.doumee.job;
+
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.job.BaseJob;
+import com.doumee.core.job.JobContext;
+import com.doumee.core.job.JobParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鏇存柊浼佷笟寰俊鑷缓搴旂敤token
+ * @author  dm
+ * @since 2025/03/31 16:44
+ */
+@Slf4j
+@Component("updateQywxTokenJob")
+public class UpdateQywxTokenJob extends BaseJob {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Override
+    public JobContext execute(JobParam param) {
+        JobContext jobContext = new JobContext();
+        try {
+            String token = systemDictDataBiz.updateQywxToken();
+            jobContext.setContext("鏇存柊浼佷笟寰俊鑷缓搴旂敤token"+token);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return jobContext;
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/CategoryService.java b/server/src/main/java/com/doumee/service/business/CategoryService.java
new file mode 100644
index 0000000..bc36c83
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/CategoryService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Category;
+import java.util.List;
+
+/**
+ * 鍒嗙被淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface CategoryService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param category 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Category category);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param category 瀹炰綋瀵硅薄
+     */
+    void delete(Category category);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param category 瀹炰綋瀵硅薄
+     */
+    void updateById(Category category);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param categorys 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Category> categorys);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Category
+     */
+    Category findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param category 瀹炰綋瀵硅薄
+     * @return Category
+     */
+    Category findOne(Category category);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param category 瀹炰綋瀵硅薄
+     * @return List<Category>
+     */
+    List<Category> findList(Category category);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Category>
+     */
+    PageData<Category> findPage(PageWrap<Category> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param category 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Category category);
+}
diff --git a/server/src/main/java/com/doumee/service/business/CompanyMemberService.java b/server/src/main/java/com/doumee/service/business/CompanyMemberService.java
new file mode 100644
index 0000000..cfc1028
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/CompanyMemberService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.CompanyMember;
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/03 16:30
+ */
+public interface CompanyMemberService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param companyMember 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(CompanyMember companyMember);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param companyMember 瀹炰綋瀵硅薄
+     */
+    void delete(CompanyMember companyMember);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param companyMember 瀹炰綋瀵硅薄
+     */
+    void updateById(CompanyMember companyMember);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param companyMembers 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<CompanyMember> companyMembers);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return CompanyMember
+     */
+    CompanyMember findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param companyMember 瀹炰綋瀵硅薄
+     * @return CompanyMember
+     */
+    CompanyMember findOne(CompanyMember companyMember);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param companyMember 瀹炰綋瀵硅薄
+     * @return List<CompanyMember>
+     */
+    List<CompanyMember> findList(CompanyMember companyMember);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<CompanyMember>
+     */
+    PageData<CompanyMember> findPage(PageWrap<CompanyMember> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param companyMember 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(CompanyMember companyMember);
+}
diff --git a/server/src/main/java/com/doumee/service/business/CompanyService.java b/server/src/main/java/com/doumee/service/business/CompanyService.java
new file mode 100644
index 0000000..03b98e9
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/CompanyService.java
@@ -0,0 +1,101 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Company;
+import java.util.List;
+
+/**
+ * 缁勭粐淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface CompanyService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param company 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Company company);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param company 瀹炰綋瀵硅薄
+     */
+    void delete(Company company);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param company 瀹炰綋瀵硅薄
+     */
+    void updateById(Company company);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param companys 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Company> companys);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Company
+     */
+    Company findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return Company
+     */
+    Company findOne(Company company);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return List<Company>
+     */
+    List<Company> findList(Company company);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Company>
+     */
+    PageData<Company> findPage(PageWrap<Company> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Company company);
+
+    int syncAll(Company company);
+
+    List<Company> companyTree();
+}
diff --git a/server/src/main/java/com/doumee/service/business/ManagersService.java b/server/src/main/java/com/doumee/service/business/ManagersService.java
new file mode 100644
index 0000000..73a1feb
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/ManagersService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Managers;
+import java.util.List;
+
+/**
+ * 璐d换浜轰俊鎭〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface ManagersService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param managers 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Managers managers);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param managers 瀹炰綋瀵硅薄
+     */
+    void delete(Managers managers);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param managers 瀹炰綋瀵硅薄
+     */
+    void updateById(Managers managers);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param managerss 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Managers> managerss);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Managers
+     */
+    Managers findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param managers 瀹炰綋瀵硅薄
+     * @return Managers
+     */
+    Managers findOne(Managers managers);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param managers 瀹炰綋瀵硅薄
+     * @return List<Managers>
+     */
+    List<Managers> findList(Managers managers);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Managers>
+     */
+    PageData<Managers> findPage(PageWrap<Managers> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param managers 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Managers managers);
+}
diff --git a/server/src/main/java/com/doumee/service/business/MemberService.java b/server/src/main/java/com/doumee/service/business/MemberService.java
new file mode 100644
index 0000000..1473fd5
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/MemberService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Member;
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface MemberService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param member 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Member member);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param member 瀹炰綋瀵硅薄
+     */
+    void delete(Member member);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param member 瀹炰綋瀵硅薄
+     */
+    void updateById(Member member);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param members 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Member> members);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Member
+     */
+    Member findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return Member
+     */
+    Member findOne(Member member);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return List<Member>
+     */
+    List<Member> findList(Member member);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Member>
+     */
+    PageData<Member> findPage(PageWrap<Member> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Member member);
+
+    void syncQwAll();
+}
diff --git a/server/src/main/java/com/doumee/service/business/MultifileService.java b/server/src/main/java/com/doumee/service/business/MultifileService.java
new file mode 100644
index 0000000..764f1eb
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/MultifileService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Multifile;
+import java.util.List;
+
+/**
+ * 闄勪欢涓婁紶淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface MultifileService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param multifile 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Multifile multifile);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param multifile 瀹炰綋瀵硅薄
+     */
+    void delete(Multifile multifile);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param multifile 瀹炰綋瀵硅薄
+     */
+    void updateById(Multifile multifile);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param multifiles 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Multifile> multifiles);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Multifile
+     */
+    Multifile findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param multifile 瀹炰綋瀵硅薄
+     * @return Multifile
+     */
+    Multifile findOne(Multifile multifile);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param multifile 瀹炰綋瀵硅薄
+     * @return List<Multifile>
+     */
+    List<Multifile> findList(Multifile multifile);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Multifile>
+     */
+    PageData<Multifile> findPage(PageWrap<Multifile> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param multifile 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Multifile multifile);
+}
diff --git a/server/src/main/java/com/doumee/service/business/NoticesService.java b/server/src/main/java/com/doumee/service/business/NoticesService.java
new file mode 100644
index 0000000..c6d1ae2
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/NoticesService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Notices;
+import java.util.List;
+
+/**
+ * 绯荤粺娑堟伅淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface NoticesService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param notices 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Notices notices);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param notices 瀹炰綋瀵硅薄
+     */
+    void delete(Notices notices);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param notices 瀹炰綋瀵硅薄
+     */
+    void updateById(Notices notices);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param noticess 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Notices> noticess);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Notices
+     */
+    Notices findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param notices 瀹炰綋瀵硅薄
+     * @return Notices
+     */
+    Notices findOne(Notices notices);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param notices 瀹炰綋瀵硅薄
+     * @return List<Notices>
+     */
+    List<Notices> findList(Notices notices);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Notices>
+     */
+    PageData<Notices> findPage(PageWrap<Notices> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param notices 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Notices notices);
+}
diff --git a/server/src/main/java/com/doumee/service/business/WorkorderLogService.java b/server/src/main/java/com/doumee/service/business/WorkorderLogService.java
new file mode 100644
index 0000000..a5d33ca
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/WorkorderLogService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.WorkorderLog;
+import java.util.List;
+
+/**
+ * 宸ュ崟鎿嶄綔鍘嗗彶琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface WorkorderLogService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param workorderLog 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(WorkorderLog workorderLog);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param workorderLog 瀹炰綋瀵硅薄
+     */
+    void delete(WorkorderLog workorderLog);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param workorderLog 瀹炰綋瀵硅薄
+     */
+    void updateById(WorkorderLog workorderLog);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param workorderLogs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<WorkorderLog> workorderLogs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return WorkorderLog
+     */
+    WorkorderLog findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param workorderLog 瀹炰綋瀵硅薄
+     * @return WorkorderLog
+     */
+    WorkorderLog findOne(WorkorderLog workorderLog);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param workorderLog 瀹炰綋瀵硅薄
+     * @return List<WorkorderLog>
+     */
+    List<WorkorderLog> findList(WorkorderLog workorderLog);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<WorkorderLog>
+     */
+    PageData<WorkorderLog> findPage(PageWrap<WorkorderLog> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param workorderLog 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(WorkorderLog workorderLog);
+}
diff --git a/server/src/main/java/com/doumee/service/business/WorkorderService.java b/server/src/main/java/com/doumee/service/business/WorkorderService.java
new file mode 100644
index 0000000..da2921d
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/WorkorderService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Workorder;
+import java.util.List;
+
+/**
+ * 宸ュ崟淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+public interface WorkorderService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param workorder 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Workorder workorder);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param workorder 瀹炰綋瀵硅薄
+     */
+    void delete(Workorder workorder);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param workorder 瀹炰綋瀵硅薄
+     */
+    void updateById(Workorder workorder);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param workorders 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Workorder> workorders);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Workorder
+     */
+    Workorder findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param workorder 瀹炰綋瀵硅薄
+     * @return Workorder
+     */
+    Workorder findOne(Workorder workorder);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param workorder 瀹炰綋瀵硅薄
+     * @return List<Workorder>
+     */
+    List<Workorder> findList(Workorder workorder);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Workorder>
+     */
+    PageData<Workorder> findPage(PageWrap<Workorder> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param workorder 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Workorder workorder);
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
new file mode 100644
index 0000000..9dbee6a
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -0,0 +1,126 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.model.Category;
+import com.doumee.service.business.CategoryService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 鍒嗙被淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class CategoryServiceImpl implements CategoryService {
+
+    @Autowired
+    private CategoryMapper categoryMapper;
+
+    @Override
+    public Integer create(Category category) {
+        categoryMapper.insert(category);
+        return category.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        categoryMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Category category) {
+        UpdateWrapper<Category> deleteWrapper = new UpdateWrapper<>(category);
+        categoryMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        categoryMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Category category) {
+        categoryMapper.updateById(category);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Category> categorys) {
+        if (CollectionUtils.isEmpty(categorys)) {
+            return;
+        }
+        for (Category category: categorys) {
+            this.updateById(category);
+        }
+    }
+
+    @Override
+    public Category findById(Integer id) {
+        return categoryMapper.selectById(id);
+    }
+
+    @Override
+    public Category findOne(Category category) {
+        QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
+        return categoryMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Category> findList(Category category) {
+        QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
+        return categoryMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Category> findPage(PageWrap<Category> pageWrap) {
+        IPage<Category> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Category::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Category::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Category::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Category::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Category::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Category::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Category::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Category::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getName() != null, Category::getName, pageWrap.getModel().getName())
+                .eq(pageWrap.getModel().getRemark() != null, Category::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getStatus() != null, Category::getStatus, pageWrap.getModel().getStatus())
+                .eq(pageWrap.getModel().getSortnum() != null, Category::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getImgurl() != null, Category::getImgurl, pageWrap.getModel().getImgurl())
+                .eq(pageWrap.getModel().getType() != null, Category::getType, pageWrap.getModel().getType())
+                .eq(pageWrap.getModel().getParentId() != null, Category::getParentId, pageWrap.getModel().getParentId())
+                .eq(pageWrap.getModel().getNamePath() != null, Category::getNamePath, pageWrap.getModel().getNamePath())
+                .eq(pageWrap.getModel().getIdPath() != null, Category::getIdPath, pageWrap.getModel().getIdPath())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(categoryMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Category category) {
+        QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
+        return categoryMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/CompanyMemberServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/CompanyMemberServiceImpl.java
new file mode 100644
index 0000000..19729a2
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/CompanyMemberServiceImpl.java
@@ -0,0 +1,122 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.CompanyMemberMapper;
+import com.doumee.dao.business.model.CompanyMember;
+import com.doumee.service.business.CompanyMemberService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/03 16:30
+ */
+@Service
+public class CompanyMemberServiceImpl implements CompanyMemberService {
+
+    @Autowired
+    private CompanyMemberMapper companyMemberMapper;
+
+    @Override
+    public Integer create(CompanyMember companyMember) {
+        companyMemberMapper.insert(companyMember);
+        return companyMember.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        companyMemberMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(CompanyMember companyMember) {
+        UpdateWrapper<CompanyMember> deleteWrapper = new UpdateWrapper<>(companyMember);
+        companyMemberMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        companyMemberMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(CompanyMember companyMember) {
+        companyMemberMapper.updateById(companyMember);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<CompanyMember> companyMembers) {
+        if (CollectionUtils.isEmpty(companyMembers)) {
+            return;
+        }
+        for (CompanyMember companyMember: companyMembers) {
+            this.updateById(companyMember);
+        }
+    }
+
+    @Override
+    public CompanyMember findById(Integer id) {
+        return companyMemberMapper.selectById(id);
+    }
+
+    @Override
+    public CompanyMember findOne(CompanyMember companyMember) {
+        QueryWrapper<CompanyMember> wrapper = new QueryWrapper<>(companyMember);
+        return companyMemberMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<CompanyMember> findList(CompanyMember companyMember) {
+        QueryWrapper<CompanyMember> wrapper = new QueryWrapper<>(companyMember);
+        return companyMemberMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<CompanyMember> findPage(PageWrap<CompanyMember> pageWrap) {
+        IPage<CompanyMember> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<CompanyMember> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, CompanyMember::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, CompanyMember::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, CompanyMember::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, CompanyMember::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, CompanyMember::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, CompanyMember::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, CompanyMember::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, CompanyMember::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getRemark() != null, CompanyMember::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getSortnum() != null, CompanyMember::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getCompanyId() != null, CompanyMember::getCompanyId, pageWrap.getModel().getCompanyId())
+                .eq(pageWrap.getModel().getMemberId() != null, CompanyMember::getMemberId, pageWrap.getModel().getMemberId())
+                .eq(pageWrap.getModel().getIsLeader() != null, CompanyMember::getIsLeader, pageWrap.getModel().getIsLeader())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(companyMemberMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(CompanyMember companyMember) {
+        QueryWrapper<CompanyMember> wrapper = new QueryWrapper<>(companyMember);
+        return companyMemberMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
new file mode 100644
index 0000000..2403aa7
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -0,0 +1,299 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.qiyeweixin.QywxUtil;
+import com.doumee.core.utils.qiyeweixin.model.response.QywxDepartInfoResponse;
+import com.doumee.dao.business.CompanyMapper;
+import com.doumee.dao.business.model.Company;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.vo.CompanyTree;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.CompanyService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 缁勭粐淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    public Integer create(Company company) {
+        companyMapper.insert(company);
+        return company.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        companyMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Company company) {
+        UpdateWrapper<Company> deleteWrapper = new UpdateWrapper<>(company);
+        companyMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        companyMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Company company) {
+        companyMapper.updateById(company);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Company> companys) {
+        if (CollectionUtils.isEmpty(companys)) {
+            return;
+        }
+        for (Company company: companys) {
+            this.updateById(company);
+        }
+    }
+
+    @Override
+    public Company findById(Integer id) {
+        return companyMapper.selectById(id);
+    }
+
+    @Override
+    public Company findOne(Company company) {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
+        return companyMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Company> findList(Company company) {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
+        return companyMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Company> findPage(PageWrap<Company> pageWrap) {
+        IPage<Company> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Company> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Company::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Company::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Company::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Company::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Company::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Company::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Company::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Company::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getName() != null, Company::getName, pageWrap.getModel().getName())
+                .eq(pageWrap.getModel().getRemark() != null, Company::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getStatus() != null, Company::getStatus, pageWrap.getModel().getStatus())
+                .eq(pageWrap.getModel().getSortnum() != null, Company::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getImgurl() != null, Company::getImgurl, pageWrap.getModel().getImgurl())
+                .eq(pageWrap.getModel().getType() != null, Company::getType, pageWrap.getModel().getType())
+                .eq(pageWrap.getModel().getParentId() != null, Company::getParentId, pageWrap.getModel().getParentId())
+                .eq(pageWrap.getModel().getCode() != null, Company::getCode, pageWrap.getModel().getCode())
+                .eq(pageWrap.getModel().getQwId() != null, Company::getQwId, pageWrap.getModel().getQwId())
+                .eq(pageWrap.getModel().getNamePath() != null, Company::getNamePath, pageWrap.getModel().getNamePath())
+                .eq(pageWrap.getModel().getIdPath() != null, Company::getIdPath, pageWrap.getModel().getIdPath())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(companyMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Company company) {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
+        return companyMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public List<Company> companyTree( ) {
+        MPJLambdaWrapper<Company> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Company.class);
+        queryWrapper.selectAs(SystemUser::getRealname,Company::getEditorName);
+        queryWrapper.select("t1.name",Company::getParentName);
+        queryWrapper.select("t1.name_path",Company::getParentCompanyPath);
+        queryWrapper.leftJoin(Company.class,Company::getId,Company::getParentId);
+        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Company::getEditor);
+        queryWrapper.eq(Company::getIsdeleted,Constants.ZERO);
+        queryWrapper.orderByAsc( "t.code");
+        List<Company> companyList = companyMapper.selectJoinList(Company.class,queryWrapper);
+        CompanyTree treeBuild = new CompanyTree(companyList, 0);
+        companyList = treeBuild.buildTree();
+        return companyList;
+    }
+
+    @Override
+    public int syncAll(Company company) {
+        if(Constants.DEALING_COMPANY_SYNC){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍚屾浠诲姟姝e湪杩涜锛岃绋嶅悗鍒锋柊椤甸潰閲嶈瘯锛�");
+        }
+        Constants.DEALING_COMPANY_SYNC =true;
+        try {
+            LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            Date date = new Date();
+            List<QywxDepartInfoResponse>  list =  QywxUtil.getDepartmentAll(systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode());
+            if(list == null || list.size() ==0){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈悓姝ュ埌浠讳綍缁勭粐淇℃伅锛�");
+            }
+            Company param = new Company();
+            param.setIsdeleted(Constants.ZERO);
+            param.setType(Constants.ZERO);
+            List<Company>  nowAllList = new ArrayList<>();
+            List<Company>  companyList = findList(param);
+            List<Company>  newList = new ArrayList<>();
+            List<Company>  updateList = new ArrayList<>();
+            List<Integer>  deletedIds = new ArrayList<>();
+            for (QywxDepartInfoResponse model : list){
+                Company cm = getCompanyDataFromListById(model.getId(),companyList);
+                if(cm !=null){
+                    //鏇存柊
+                    cm.setEditor(user.getId());
+                    cm.setEditDate(date);
+                    cm.setQwParentId(model.getParentid());
+                    cm.setQwId(model.getId());
+                    cm.setName(model.getName());
+                    cm.setStatus(Constants.ZERO);
+                    cm.setType(Constants.ZERO);
+                    cm.setCode(model.getOrder());
+                    updateList.add(cm);
+                }else{
+                    //鏂板
+                    cm = new Company();
+                    cm.setCreator(user.getId());
+                    cm.setCreateDate(date);
+                    cm.setEditor(user.getId());
+                    cm.setEditDate(date);
+                    cm.setQwParentId(model.getParentid());
+                    cm.setQwId(model.getId());
+                    cm.setName(model.getName());
+                    cm.setStatus(Constants.ZERO);
+                    cm.setIsdeleted(Constants.ZERO);
+                    cm.setType(Constants.ZERO);
+                    cm.setCode(model.getOrder());
+                    newList.add(cm);
+                }
+            }
+            //鏌ヨ宸插垹闄ょ殑鏁版嵁
+            for(Company c : companyList){
+                if(getQwDataFromListById(c.getQwId(),list) ==null){
+                    deletedIds.add(c.getId());
+                }
+            }
+            if(deletedIds.size()>0){//娓呯┖宸插垹闄ょ殑
+                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
+                        .in(Company::getId,deletedIds)
+                        .set(Company::getIsdeleted,Constants.ONE)
+                        .set(Company::getEditDate,date)
+                        .set(Company::getQwParentId,null)
+                        .set(Company::getQwId,null)
+                        .set(Company::getEditor,user.getId())
+                );
+            }
+            companyMapper.insert(newList);//鎻掑叆鏂版暟鎹�
+            for(Company c : updateList){//鏇存柊鍘熸湁鏁版嵁
+                companyMapper.updateById(c);
+            }
+            nowAllList.addAll(newList);
+            nowAllList.addAll(updateList);
+            dealTreePathInfo(nowAllList);
+        }catch (BusinessException e){
+            throw  e;
+        }catch (Exception e){
+            e.printStackTrace();
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鍚屾鏁版嵁澶辫触~");
+        }finally {
+            Constants.DEALING_COMPANY_SYNC =false;
+        }
+
+        return  1;
+
+    }
+
+    private QywxDepartInfoResponse getQwDataFromListById(String qwId, List<QywxDepartInfoResponse> list) {
+        for(QywxDepartInfoResponse model : list){
+            if(StringUtils.equals(model.getId(),qwId)){
+                return model;
+            }
+        }
+        return  null;
+    }
+    private Company getCompanyDataFromListById(String qwid, List<Company> list) {
+        for(Company model : list){
+            if(StringUtils.equals(model.getQwId(),qwid)){
+                return model;
+            }
+        }
+        return  null;
+    }
+
+    private void dealTreePathInfo(List<Company> allHkList) {
+        List<Company> tree  = new CompanyTree(allHkList,1).buildTree();
+        if(tree!=null || tree.size()>0){
+            for(Company t : tree){
+                t.setIdPath(t.getId()+"/");
+                t.setNamePath(t.getName());
+                companyMapper.updateById(t);
+                dealChildParentId(t,t.getChildList());
+            }
+        }
+    }
+
+    private void dealChildParentId(Company t, List<Company> childList) {
+        if(childList ==null || childList.size()==0){
+            return;
+        }
+        for(Company c : childList){
+            c.setParentId(t.getId());
+            c.setIdPath(t.getIdPath()+c.getId()+"/");
+            c.setNamePath(t.getNamePath()+"/"+c.getName());
+            companyMapper.updateById(c);
+            if(t.getChildList()!=null || t.getChildList().size()==0){
+                //閫掑綊澶勭悊瀛愰泦
+                dealChildParentId(c,c.getChildList());
+            }
+        }
+    }
+
+
+
+
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/ManagersServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/ManagersServiceImpl.java
new file mode 100644
index 0000000..6d4430c
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/ManagersServiceImpl.java
@@ -0,0 +1,123 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.ManagersMapper;
+import com.doumee.dao.business.model.Managers;
+import com.doumee.service.business.ManagersService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 璐d换浜轰俊鎭〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class ManagersServiceImpl implements ManagersService {
+
+    @Autowired
+    private ManagersMapper managersMapper;
+
+    @Override
+    public Integer create(Managers managers) {
+        managersMapper.insert(managers);
+        return managers.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        managersMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Managers managers) {
+        UpdateWrapper<Managers> deleteWrapper = new UpdateWrapper<>(managers);
+        managersMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        managersMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Managers managers) {
+        managersMapper.updateById(managers);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Managers> managerss) {
+        if (CollectionUtils.isEmpty(managerss)) {
+            return;
+        }
+        for (Managers managers: managerss) {
+            this.updateById(managers);
+        }
+    }
+
+    @Override
+    public Managers findById(Integer id) {
+        return managersMapper.selectById(id);
+    }
+
+    @Override
+    public Managers findOne(Managers managers) {
+        QueryWrapper<Managers> wrapper = new QueryWrapper<>(managers);
+        return managersMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Managers> findList(Managers managers) {
+        QueryWrapper<Managers> wrapper = new QueryWrapper<>(managers);
+        return managersMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Managers> findPage(PageWrap<Managers> pageWrap) {
+        IPage<Managers> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Managers> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Managers::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Managers::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Managers::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Managers::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Managers::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Managers::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Managers::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Managers::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getCategoryId() != null, Managers::getCategoryId, pageWrap.getModel().getCategoryId())
+                .eq(pageWrap.getModel().getRemark() != null, Managers::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getStatus() != null, Managers::getStatus, pageWrap.getModel().getStatus())
+                .eq(pageWrap.getModel().getSortnum() != null, Managers::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getType() != null, Managers::getType, pageWrap.getModel().getType())
+                .eq(pageWrap.getModel().getMemberId() != null, Managers::getMemberId, pageWrap.getModel().getMemberId())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(managersMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Managers managers) {
+        QueryWrapper<Managers> wrapper = new QueryWrapper<>(managers);
+        return managersMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
new file mode 100644
index 0000000..306647d
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -0,0 +1,361 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.qiyeweixin.QywxUtil;
+import com.doumee.core.utils.qiyeweixin.model.response.QywxDepartInfoResponse;
+import com.doumee.core.utils.qiyeweixin.model.response.QywxUserAttrInfoResponse;
+import com.doumee.core.utils.qiyeweixin.model.response.QywxUserExtAttrResponse;
+import com.doumee.core.utils.qiyeweixin.model.response.QywxUserListResponse;
+import com.doumee.dao.business.CompanyMapper;
+import com.doumee.dao.business.CompanyMemberMapper;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.model.Company;
+import com.doumee.dao.business.model.CompanyMember;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.MemberService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class MemberServiceImpl implements MemberService {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private MemberMapper memberMapper;
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private CompanyMemberMapper companyMemberMapper;
+
+    @Override
+    public Integer create(Member member) {
+        memberMapper.insert(member);
+        return member.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        memberMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Member member) {
+        UpdateWrapper<Member> deleteWrapper = new UpdateWrapper<>(member);
+        memberMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        memberMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Member member) {
+        memberMapper.updateById(member);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Member> members) {
+        if (CollectionUtils.isEmpty(members)) {
+            return;
+        }
+        for (Member member: members) {
+            this.updateById(member);
+        }
+    }
+
+    @Override
+    public Member findById(Integer id) {
+        return memberMapper.selectById(id);
+    }
+
+    @Override
+    public Member findOne(Member member) {
+        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
+        return memberMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Member> findList(Member member) {
+        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
+        return memberMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Member> findPage(PageWrap<Member> pageWrap) {
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper. selectAll(Member.class)
+                .selectAs(SystemUser::getUsername,Member::getEditorName)
+                .leftJoin(SystemUser.class,SystemUser::getId,Member::getEditor)
+                .eq(pageWrap.getModel().getId() != null, Member::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Member::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Member::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Member::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Member::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Member::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Member::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Member::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getName() != null, Member::getName, pageWrap.getModel().getName())
+                .eq(pageWrap.getModel().getRemark() != null, Member::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getStatus() != null, Member::getStatus, pageWrap.getModel().getStatus())
+                .eq(pageWrap.getModel().getSortnum() != null, Member::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getImgurl() != null, Member::getImgurl, pageWrap.getModel().getImgurl())
+                .eq(pageWrap.getModel().getType() != null, Member::getType, pageWrap.getModel().getType())
+//                .eq(pageWrap.getModel().getCompanyId() != null, Member::getCompanyId, pageWrap.getModel().getCompanyId())
+                .eq(pageWrap.getModel().getPhone() != null, Member::getPhone, pageWrap.getModel().getPhone())
+                .eq(pageWrap.getModel().getEmail() != null, Member::getEmail, pageWrap.getModel().getEmail())
+                .eq(pageWrap.getModel().getSex() != null, Member::getSex, pageWrap.getModel().getSex())
+                .eq(pageWrap.getModel().getCode() != null, Member::getCode, pageWrap.getModel().getCode())
+                .eq(pageWrap.getModel().getQwId() != null, Member::getQwId, pageWrap.getModel().getQwId())
+                .eq(pageWrap.getModel().getIdcard() != null, Member::getIdcard, pageWrap.getModel().getIdcard())
+                .ge(pageWrap.getModel().getLastLoginDate() != null, Member::getLastLoginDate, Utils.Date.getStart(pageWrap.getModel().getLastLoginDate()))
+                .le(pageWrap.getModel().getLastLoginDate() != null, Member::getLastLoginDate, Utils.Date.getEnd(pageWrap.getModel().getLastLoginDate()))
+                .eq(pageWrap.getModel().getLoginCount() != null, Member::getLoginCount, pageWrap.getModel().getLoginCount())
+        ;
+        if (pageWrap.getModel().getKeyword() != null) {
+            queryWrapper.and( ms->ms.like(Member::getName,pageWrap.getModel().getKeyword())
+                    .or().like(Member::getPhone,pageWrap.getModel().getKeyword()));
+        }
+        if(pageWrap.getModel().getIncludeChild()!=null &&pageWrap.getModel().getIncludeChild() ){
+            if(pageWrap.getModel().getCompanyId() !=null){
+                //濡傛灉鍖呭惈涓嬬骇缁勭粐
+                Company company = companyMapper.selectById(pageWrap.getModel().getCompanyId());//鏌ヨ缁勭粐淇℃伅
+                queryWrapper.exists("select (cm.id) from company_member cm where cm.company_id_path like '"+company.getIdPath()+"%'  and cm.member_id=t.id");
+//                queryWrapper.likeRight(Company::getIdPath,company.getIdPath());
+            }
+        }else{
+            //涓嶅寘鍚笅绾х粍缁�
+            queryWrapper.exists("select (cm.id) from company_member cm where cm.company_id='"+pageWrap.getModel().getCompanyId()+"'  and cm.member_id=t.id");
+        }
+        queryWrapper.orderByAsc(Member::getCreateDate);
+        return PageData.from(memberMapper.selectJoinPage(page,Member.class, queryWrapper));
+    }
+
+    @Override
+    public long count(Member member) {
+        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
+        return memberMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public  void syncQwAll(){
+        if(Constants.DEALING_MEMBER_SYNC){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍚屾浠诲姟姝e湪杩涜锛岃绋嶅悗鍒锋柊椤甸潰閲嶈瘯锛�");
+        }
+        Constants.DEALING_MEMBER_SYNC =true;
+        try {
+            Company param = new Company();
+            param.setIsdeleted(Constants.ZERO);
+            param.setType(Constants.ZERO);
+            //鏌ヨ鍏ㄩ儴缁勭粐淇℃伅
+            List<Company>  companyList = companyMapper.selectList(new QueryWrapper<>(param));
+            if(companyList==null || companyList.size() ==0){
+                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝缁勭粐淇℃伅涓虹┖锛屾棤娉曞悓姝ヤ汉鍛樹俊鎭紝璇峰墠寰�缁勭粐绠$悊鍏堝悓姝ョ粍缁囦俊鎭紒");
+            }
+            LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            Date date = new Date();
+            List<QywxUserListResponse>  list = new ArrayList<>();
+            for(Company c : companyList){
+                List<QywxUserListResponse> tList =   QywxUtil.getUserList(systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode(),c.getQwId());
+                if(tList!=null){
+                    list.addAll(tList);
+                }
+            }
+            if(list == null || list.size() ==0){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈悓姝ュ埌浠讳綍缁勭粐淇℃伅锛�");
+            }
+            List<Member>  memberList = memberMapper.selectList(new LambdaQueryWrapper<Member>().eq(Member::getIsdeleted,Constants.ZERO));
+            List<Member>  newList = new ArrayList<>();
+            List<Member>  updateList = new ArrayList<>();
+            List<Member>  nowAllList = new ArrayList<>();
+            List<CompanyMember>  companyMembers = new ArrayList<>();
+            List<Integer>  deletedIds = new ArrayList<>();
+            for (QywxUserListResponse model : list){
+                if(getMemberDataFromListById(model.getUserid(),nowAllList) !=null){
+                    //濡傛灉宸茬粡澶勭悊杩囷紝涓嶆坊鍔犻噸澶嶆暟鎹�
+                   continue;
+                }
+                Member cm = getMemberDataFromListById(model.getUserid(),memberList);
+                List<Company> qycom = getCompanyIdFromList(model,companyList);
+                String comIds = "",comNames = "";
+                String phone = getQyPhoneByExtralAttr(model.getExtattr());
+                if(cm !=null){
+                    //鏇存柊
+                    updateList.add(cm);
+                }else{
+                    //鏂板
+                    cm = new Member();
+                    cm.setCreator(user.getId());
+                    cm.setCreateDate(date);
+                    newList.add(cm);
+                }
+                if(qycom.size()>0){
+                    for(Company c : qycom){
+                        if(StringUtils.isNotBlank(comIds)){
+                            comIds += ",";
+                        }
+                        comIds += c.getId();
+                        if(StringUtils.isNotBlank(comNames)){
+                            comNames += ",";
+                        }
+                        comNames += c.getName();
+                    }
+                }
+                cm.setCompanyList(qycom);
+                cm.setEditor(user.getId());
+                cm.setEditDate(date);
+                cm.setPhone(phone);
+                cm.setCode(phone);
+                cm.setName(model.getName());
+                cm.setStatus(Constants.ZERO);
+                cm.setIsdeleted(Constants.ZERO);
+                cm.setType(Constants.ZERO);
+                cm.setCompanyId(comIds);
+                cm.setCompanyName(comNames);
+                cm.setSex(model.getGender());
+                cm.setEmail(model.getEmail());
+                cm.setQwId(model.getUserid());
+                nowAllList.add(cm);
+            }
+            //鏌ヨ宸插垹闄ょ殑鏁版嵁
+            for(Member c : memberList){
+                if(getQwDataFromListById(c.getQwId(),list) ==null){
+                    deletedIds.add(c.getId());
+                }
+            }
+            if(deletedIds.size()>0){//娓呯┖宸插垹闄ょ殑
+                memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+                        .in(Member::getId,deletedIds)
+                        .set(Member::getIsdeleted,Constants.ONE)
+                        .set(Member::getEditDate,date)
+                        .set(Member::getQwId,null)
+                        .set(Member::getEditor,user.getId())
+                );
+            }
+            if(newList.size()>0){
+                memberMapper.insert(newList);//鎻掑叆鏂版暟鎹�
+            }
+            for(Member c : updateList){//鏇存柊鍘熸湁鏁版嵁
+                memberMapper.updateById(c);
+            }
+            for(Member member : nowAllList){
+                if(member.getCompanyList()!=null &&member.getCompanyList().size()>0){
+                    for(Company c : member.getCompanyList()){
+                        CompanyMember companyMember = new CompanyMember();
+                        companyMember.setCreator(user.getId());
+                        companyMember.setCreateDate(date);
+                        companyMember.setEditor(user.getId());
+                        companyMember.setEditDate(date);
+                        companyMember.setIsdeleted(Constants.ZERO);
+                        companyMember.setMemberId(member.getId());
+                        companyMember.setCompanyId(c.getId());
+                        companyMember.setIsLeader(c.getIsLeader());
+                        companyMember.setCompanyIdPath(c.getIdPath());
+                        companyMembers.add(companyMember);//鍛樺伐缁勭粐鍏宠仈鍏崇郴
+                    }
+                }
+            }
+            companyMemberMapper.delete(new UpdateWrapper<>());//娓呯┖鎵�鏈夌殑
+            if(companyMembers.size()>0){
+                companyMemberMapper.insert(companyMembers);//閲嶆柊鎻掑叆鏂扮邯褰�
+            }
+        }catch (BusinessException e){
+            throw  e;
+        }catch (Exception e){
+            e.printStackTrace();
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鍚屾鏁版嵁澶辫触~");
+        }finally {
+            Constants.DEALING_MEMBER_SYNC =false;
+        }
+
+    }
+
+    private String getQyPhoneByExtralAttr(QywxUserExtAttrResponse extattr) {
+        if(extattr!=null && extattr.getAttrs()!=null && extattr.getAttrs().size()>0){
+            for(QywxUserAttrInfoResponse attr : extattr.getAttrs()){
+                if(attr== null){
+                    continue;
+                }
+                if(StringUtils.equals(attr.getName(),"鍛樺伐鍙�")){
+                    return attr.getValue();
+//                    return attr.getText()!=null?attr.getText().getValue():null;
+                }
+            }
+        }
+        return  null;
+    }
+
+    private List<Company> getCompanyIdFromList(QywxUserListResponse model, List<Company> companyList) {
+        List<String> department = model.getDepartment();
+        List<Company> list = new ArrayList<>();
+        if(department == null || department.size()==0){
+            return null;
+        }
+        for (int i = 0; i < department.size(); i++) {
+             String id = department.get(i);
+            for(Company c : companyList){
+                if(StringUtils.equals(c.getQwId(),id)){
+                     if(model.getIs_leader_in_dept()!=null && model.getIs_leader_in_dept().size()>i){
+                         c.setIsLeader(model.getIs_leader_in_dept().get(i));
+                     }
+                     list.add(c);
+                }
+            }
+        }
+        return list;
+    }
+
+    private QywxUserListResponse getQwDataFromListById(String qwId, List<QywxUserListResponse> list) {
+        for(QywxUserListResponse model : list){
+            if(StringUtils.equals(model.getUserid(),qwId)){
+                return model;
+            }
+        }
+        return  null;
+    }
+    private Member getMemberDataFromListById(String qwid, List<Member> list) {
+        for(Member model : list){
+            if(StringUtils.equals(model.getQwId(),qwid)){
+                return model;
+            }
+        }
+        return  null;
+    }
+
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/MultifileServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/MultifileServiceImpl.java
new file mode 100644
index 0000000..5f0d231
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/MultifileServiceImpl.java
@@ -0,0 +1,125 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.MultifileMapper;
+import com.doumee.dao.business.model.Multifile;
+import com.doumee.service.business.MultifileService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 闄勪欢涓婁紶淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class MultifileServiceImpl implements MultifileService {
+
+    @Autowired
+    private MultifileMapper multifileMapper;
+
+    @Override
+    public Integer create(Multifile multifile) {
+        multifileMapper.insert(multifile);
+        return multifile.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        multifileMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Multifile multifile) {
+        UpdateWrapper<Multifile> deleteWrapper = new UpdateWrapper<>(multifile);
+        multifileMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        multifileMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Multifile multifile) {
+        multifileMapper.updateById(multifile);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Multifile> multifiles) {
+        if (CollectionUtils.isEmpty(multifiles)) {
+            return;
+        }
+        for (Multifile multifile: multifiles) {
+            this.updateById(multifile);
+        }
+    }
+
+    @Override
+    public Multifile findById(Integer id) {
+        return multifileMapper.selectById(id);
+    }
+
+    @Override
+    public Multifile findOne(Multifile multifile) {
+        QueryWrapper<Multifile> wrapper = new QueryWrapper<>(multifile);
+        return multifileMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Multifile> findList(Multifile multifile) {
+        QueryWrapper<Multifile> wrapper = new QueryWrapper<>(multifile);
+        return multifileMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Multifile> findPage(PageWrap<Multifile> pageWrap) {
+        IPage<Multifile> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Multifile> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Multifile::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Multifile::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Multifile::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Multifile::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Multifile::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Multifile::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Multifile::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Multifile::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getName() != null, Multifile::getName, pageWrap.getModel().getName())
+                .eq(pageWrap.getModel().getInfo() != null, Multifile::getInfo, pageWrap.getModel().getInfo())
+                .eq(pageWrap.getModel().getObjId() != null, Multifile::getObjId, pageWrap.getModel().getObjId())
+                .eq(pageWrap.getModel().getType() != null, Multifile::getType, pageWrap.getModel().getType())
+                .eq(pageWrap.getModel().getObjType() != null, Multifile::getObjType, pageWrap.getModel().getObjType())
+                .eq(pageWrap.getModel().getFileurl() != null, Multifile::getFileurl, pageWrap.getModel().getFileurl())
+                .eq(pageWrap.getModel().getSortnum() != null, Multifile::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getCompanyId() != null, Multifile::getCompanyId, pageWrap.getModel().getCompanyId())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(multifileMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Multifile multifile) {
+        QueryWrapper<Multifile> wrapper = new QueryWrapper<>(multifile);
+        return multifileMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/NoticesServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/NoticesServiceImpl.java
new file mode 100644
index 0000000..5a391ef
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/NoticesServiceImpl.java
@@ -0,0 +1,137 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.NoticesMapper;
+import com.doumee.dao.business.model.Notices;
+import com.doumee.service.business.NoticesService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 绯荤粺娑堟伅淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class NoticesServiceImpl implements NoticesService {
+
+    @Autowired
+    private NoticesMapper noticesMapper;
+
+    @Override
+    public Integer create(Notices notices) {
+        noticesMapper.insert(notices);
+        return notices.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        noticesMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Notices notices) {
+        UpdateWrapper<Notices> deleteWrapper = new UpdateWrapper<>(notices);
+        noticesMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        noticesMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Notices notices) {
+        noticesMapper.updateById(notices);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Notices> noticess) {
+        if (CollectionUtils.isEmpty(noticess)) {
+            return;
+        }
+        for (Notices notices: noticess) {
+            this.updateById(notices);
+        }
+    }
+
+    @Override
+    public Notices findById(Integer id) {
+        return noticesMapper.selectById(id);
+    }
+
+    @Override
+    public Notices findOne(Notices notices) {
+        QueryWrapper<Notices> wrapper = new QueryWrapper<>(notices);
+        return noticesMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Notices> findList(Notices notices) {
+        QueryWrapper<Notices> wrapper = new QueryWrapper<>(notices);
+        return noticesMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Notices> findPage(PageWrap<Notices> pageWrap) {
+        IPage<Notices> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Notices> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Notices::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Notices::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Notices::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Notices::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Notices::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Notices::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Notices::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Notices::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getRemark() != null, Notices::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getTitle() != null, Notices::getTitle, pageWrap.getModel().getTitle())
+                .eq(pageWrap.getModel().getInfo() != null, Notices::getInfo, pageWrap.getModel().getInfo())
+                .eq(pageWrap.getModel().getContent() != null, Notices::getContent, pageWrap.getModel().getContent())
+                .eq(pageWrap.getModel().getObjId() != null, Notices::getObjId, pageWrap.getModel().getObjId())
+                .eq(pageWrap.getModel().getObjType() != null, Notices::getObjType, pageWrap.getModel().getObjType())
+                .eq(pageWrap.getModel().getObjName() != null, Notices::getObjName, pageWrap.getModel().getObjName())
+                .eq(pageWrap.getModel().getType() != null, Notices::getType, pageWrap.getModel().getType())
+                .eq(pageWrap.getModel().getParam1() != null, Notices::getParam1, pageWrap.getModel().getParam1())
+                .eq(pageWrap.getModel().getParam2() != null, Notices::getParam2, pageWrap.getModel().getParam2())
+                .eq(pageWrap.getModel().getParam3() != null, Notices::getParam3, pageWrap.getModel().getParam3())
+                .eq(pageWrap.getModel().getParam4() != null, Notices::getParam4, pageWrap.getModel().getParam4())
+                .eq(pageWrap.getModel().getParam5() != null, Notices::getParam5, pageWrap.getModel().getParam5())
+                .eq(pageWrap.getModel().getMemberName() != null, Notices::getMemberName, pageWrap.getModel().getMemberName())
+                .eq(pageWrap.getModel().getQwId() != null, Notices::getQwId, pageWrap.getModel().getQwId())
+                .eq(pageWrap.getModel().getMemberId() != null, Notices::getMemberId, pageWrap.getModel().getMemberId())
+                .eq(pageWrap.getModel().getCompanyId() != null, Notices::getCompanyId, pageWrap.getModel().getCompanyId())
+                .eq(pageWrap.getModel().getStatus() != null, Notices::getStatus, pageWrap.getModel().getStatus())
+                .eq(pageWrap.getModel().getSendacopy() != null, Notices::getSendacopy, pageWrap.getModel().getSendacopy())
+                .eq(pageWrap.getModel().getReaded() != null, Notices::getReaded, pageWrap.getModel().getReaded())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(noticesMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Notices notices) {
+        QueryWrapper<Notices> wrapper = new QueryWrapper<>(notices);
+        return noticesMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/WorkorderLogServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/WorkorderLogServiceImpl.java
new file mode 100644
index 0000000..93e0b63
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/WorkorderLogServiceImpl.java
@@ -0,0 +1,129 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.WorkorderLogMapper;
+import com.doumee.dao.business.model.WorkorderLog;
+import com.doumee.service.business.WorkorderLogService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 宸ュ崟鎿嶄綔鍘嗗彶琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class WorkorderLogServiceImpl implements WorkorderLogService {
+
+    @Autowired
+    private WorkorderLogMapper workorderLogMapper;
+
+    @Override
+    public Integer create(WorkorderLog workorderLog) {
+        workorderLogMapper.insert(workorderLog);
+        return workorderLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        workorderLogMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(WorkorderLog workorderLog) {
+        UpdateWrapper<WorkorderLog> deleteWrapper = new UpdateWrapper<>(workorderLog);
+        workorderLogMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        workorderLogMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(WorkorderLog workorderLog) {
+        workorderLogMapper.updateById(workorderLog);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<WorkorderLog> workorderLogs) {
+        if (CollectionUtils.isEmpty(workorderLogs)) {
+            return;
+        }
+        for (WorkorderLog workorderLog: workorderLogs) {
+            this.updateById(workorderLog);
+        }
+    }
+
+    @Override
+    public WorkorderLog findById(Integer id) {
+        return workorderLogMapper.selectById(id);
+    }
+
+    @Override
+    public WorkorderLog findOne(WorkorderLog workorderLog) {
+        QueryWrapper<WorkorderLog> wrapper = new QueryWrapper<>(workorderLog);
+        return workorderLogMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<WorkorderLog> findList(WorkorderLog workorderLog) {
+        QueryWrapper<WorkorderLog> wrapper = new QueryWrapper<>(workorderLog);
+        return workorderLogMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<WorkorderLog> findPage(PageWrap<WorkorderLog> pageWrap) {
+        IPage<WorkorderLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<WorkorderLog> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, WorkorderLog::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, WorkorderLog::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, WorkorderLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, WorkorderLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, WorkorderLog::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, WorkorderLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, WorkorderLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, WorkorderLog::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getRemark() != null, WorkorderLog::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getWorkorderId() != null, WorkorderLog::getWorkorderId, pageWrap.getModel().getWorkorderId())
+                .eq(pageWrap.getModel().getTitle() != null, WorkorderLog::getTitle, pageWrap.getModel().getTitle())
+                .eq(pageWrap.getModel().getContent() != null, WorkorderLog::getContent, pageWrap.getModel().getContent())
+                .eq(pageWrap.getModel().getObjType() != null, WorkorderLog::getObjType, pageWrap.getModel().getObjType())
+                .eq(pageWrap.getModel().getObjId() != null, WorkorderLog::getObjId, pageWrap.getModel().getObjId())
+                .eq(pageWrap.getModel().getBeforeContent() != null, WorkorderLog::getBeforeContent, pageWrap.getModel().getBeforeContent())
+                .eq(pageWrap.getModel().getAfterContent() != null, WorkorderLog::getAfterContent, pageWrap.getModel().getAfterContent())
+                .eq(pageWrap.getModel().getParam1() != null, WorkorderLog::getParam1, pageWrap.getModel().getParam1())
+                .eq(pageWrap.getModel().getParam2() != null, WorkorderLog::getParam2, pageWrap.getModel().getParam2())
+                .eq(pageWrap.getModel().getParam3() != null, WorkorderLog::getParam3, pageWrap.getModel().getParam3())
+                .eq(pageWrap.getModel().getParam4() != null, WorkorderLog::getParam4, pageWrap.getModel().getParam4())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(workorderLogMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(WorkorderLog workorderLog) {
+        QueryWrapper<WorkorderLog> wrapper = new QueryWrapper<>(workorderLog);
+        return workorderLogMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
new file mode 100644
index 0000000..3d531b2
--- /dev/null
+++ b/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
@@ -0,0 +1,157 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.WorkorderMapper;
+import com.doumee.dao.business.model.Workorder;
+import com.doumee.service.business.WorkorderService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 宸ュ崟淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2025/04/02 17:49
+ */
+@Service
+public class WorkorderServiceImpl implements WorkorderService {
+
+    @Autowired
+    private WorkorderMapper workorderMapper;
+
+    @Override
+    public Integer create(Workorder workorder) {
+        workorderMapper.insert(workorder);
+        return workorder.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        workorderMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Workorder workorder) {
+        UpdateWrapper<Workorder> deleteWrapper = new UpdateWrapper<>(workorder);
+        workorderMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        workorderMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Workorder workorder) {
+        workorderMapper.updateById(workorder);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Workorder> workorders) {
+        if (CollectionUtils.isEmpty(workorders)) {
+            return;
+        }
+        for (Workorder workorder: workorders) {
+            this.updateById(workorder);
+        }
+    }
+
+    @Override
+    public Workorder findById(Integer id) {
+        return workorderMapper.selectById(id);
+    }
+
+    @Override
+    public Workorder findOne(Workorder workorder) {
+        QueryWrapper<Workorder> wrapper = new QueryWrapper<>(workorder);
+        return workorderMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Workorder> findList(Workorder workorder) {
+        QueryWrapper<Workorder> wrapper = new QueryWrapper<>(workorder);
+        return workorderMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Workorder> findPage(PageWrap<Workorder> pageWrap) {
+        IPage<Workorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Workorder> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Workorder::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Workorder::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Workorder::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Workorder::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Workorder::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Workorder::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Workorder::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Workorder::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getCategoryId() != null, Workorder::getCategoryId, pageWrap.getModel().getCategoryId())
+                .eq(pageWrap.getModel().getRemark() != null, Workorder::getRemark, pageWrap.getModel().getRemark())
+                .eq(pageWrap.getModel().getStatus() != null, Workorder::getStatus, pageWrap.getModel().getStatus())
+                .eq(pageWrap.getModel().getSortnum() != null, Workorder::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getType() != null, Workorder::getType, pageWrap.getModel().getType())
+                .eq(pageWrap.getModel().getMemberId() != null, Workorder::getMemberId, pageWrap.getModel().getMemberId())
+                .eq(pageWrap.getModel().getCompanyId() != null, Workorder::getCompanyId, pageWrap.getModel().getCompanyId())
+                .eq(pageWrap.getModel().getSubmitDate() != null, Workorder::getSubmitDate, pageWrap.getModel().getSubmitDate())
+                .eq(pageWrap.getModel().getMemberType() != null, Workorder::getMemberType, pageWrap.getModel().getMemberType())
+                .eq(pageWrap.getModel().getMemberQwids() != null, Workorder::getMemberQwids, pageWrap.getModel().getMemberQwids())
+                .eq(pageWrap.getModel().getMemberNames() != null, Workorder::getMemberNames, pageWrap.getModel().getMemberNames())
+                .eq(pageWrap.getModel().getLocaltionId() != null, Workorder::getLocaltionId, pageWrap.getModel().getLocaltionId())
+                .eq(pageWrap.getModel().getOutJiuyi() != null, Workorder::getOutJiuyi, pageWrap.getModel().getOutJiuyi())
+                .eq(pageWrap.getModel().getIsYiwushi() != null, Workorder::getIsYiwushi, pageWrap.getModel().getIsYiwushi())
+                .eq(pageWrap.getModel().getIsHurted() != null, Workorder::getIsHurted, pageWrap.getModel().getIsHurted())
+                .eq(pageWrap.getModel().getWorkRelated() != null, Workorder::getWorkRelated, pageWrap.getModel().getWorkRelated())
+                .eq(pageWrap.getModel().getEventInfo() != null, Workorder::getEventInfo, pageWrap.getModel().getEventInfo())
+                .eq(pageWrap.getModel().getEmialMemberIds() != null, Workorder::getEmialMemberIds, pageWrap.getModel().getEmialMemberIds())
+                .eq(pageWrap.getModel().getQwnoticeMemberIds() != null, Workorder::getQwnoticeMemberIds, pageWrap.getModel().getQwnoticeMemberIds())
+                .eq(pageWrap.getModel().getHappenTime() != null, Workorder::getHappenTime, pageWrap.getModel().getHappenTime())
+                .ge(pageWrap.getModel().getTypeId() != null, Workorder::getTypeId, Utils.Date.getStart(pageWrap.getModel().getTypeId()))
+                .le(pageWrap.getModel().getTypeId() != null, Workorder::getTypeId, Utils.Date.getEnd(pageWrap.getModel().getTypeId()))
+                .eq(pageWrap.getModel().getRiskInfo() != null, Workorder::getRiskInfo, pageWrap.getModel().getRiskInfo())
+                .eq(pageWrap.getModel().getManagerId() != null, Workorder::getManagerId, pageWrap.getModel().getManagerId())
+                .eq(pageWrap.getModel().getDealerId() != null, Workorder::getDealerId, pageWrap.getModel().getDealerId())
+                .ge(pageWrap.getModel().getDispatchTime() != null, Workorder::getDispatchTime, Utils.Date.getStart(pageWrap.getModel().getDispatchTime()))
+                .le(pageWrap.getModel().getDispatchTime() != null, Workorder::getDispatchTime, Utils.Date.getEnd(pageWrap.getModel().getDispatchTime()))
+                .eq(pageWrap.getModel().getDispatchInfo() != null, Workorder::getDispatchInfo, pageWrap.getModel().getDispatchInfo())
+                .ge(pageWrap.getModel().getDealTime() != null, Workorder::getDealTime, Utils.Date.getStart(pageWrap.getModel().getDealTime()))
+                .le(pageWrap.getModel().getDealTime() != null, Workorder::getDealTime, Utils.Date.getEnd(pageWrap.getModel().getDealTime()))
+                .eq(pageWrap.getModel().getDealInfo() != null, Workorder::getDealInfo, pageWrap.getModel().getDealInfo())
+                .eq(pageWrap.getModel().getProblemTitle() != null, Workorder::getProblemTitle, pageWrap.getModel().getProblemTitle())
+                .eq(pageWrap.getModel().getProblemId() != null, Workorder::getProblemId, pageWrap.getModel().getProblemId())
+                .eq(pageWrap.getModel().getProblemInfo() != null, Workorder::getProblemInfo, pageWrap.getModel().getProblemInfo())
+                .eq(pageWrap.getModel().getLocationName() != null, Workorder::getLocationName, pageWrap.getModel().getLocationName())
+                .eq(pageWrap.getModel().getCode() != null, Workorder::getCode, pageWrap.getModel().getCode())
+                .eq(pageWrap.getModel().getDcaYesNum() != null, Workorder::getDcaYesNum, pageWrap.getModel().getDcaYesNum())
+                .eq(pageWrap.getModel().getDcaNoNum() != null, Workorder::getDcaNoNum, pageWrap.getModel().getDcaNoNum())
+                .eq(pageWrap.getModel().getDcaRecordId() != null, Workorder::getDcaRecordId, pageWrap.getModel().getDcaRecordId())
+                .eq(pageWrap.getModel().getDcaCsIds() != null, Workorder::getDcaCsIds, pageWrap.getModel().getDcaCsIds())
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(workorderMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Workorder workorder) {
+        QueryWrapper<Workorder> wrapper = new QueryWrapper<>(workorder);
+        return workorderMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/src/main/java/com/doumee/service/common/CacheProxy.java b/server/src/main/java/com/doumee/service/common/CacheProxy.java
index 1d0d31d..44fe0a9 100644
--- a/server/src/main/java/com/doumee/service/common/CacheProxy.java
+++ b/server/src/main/java/com/doumee/service/common/CacheProxy.java
@@ -12,7 +12,7 @@
 
 /**
  * 缂撳瓨浠g悊绫伙紝渚夸簬缂撳瓨鍙樻洿
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Slf4j
diff --git a/server/src/main/java/com/doumee/service/common/CaptchaService.java b/server/src/main/java/com/doumee/service/common/CaptchaService.java
index d3a182f..df4c868 100644
--- a/server/src/main/java/com/doumee/service/common/CaptchaService.java
+++ b/server/src/main/java/com/doumee/service/common/CaptchaService.java
@@ -22,7 +22,7 @@
 
 /**
  * 鍥剧墖楠岃瘉鐮�
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java b/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java
index ecf998f..7fda776 100644
--- a/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java
+++ b/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git "a/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0501\051" "b/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0501\051"
index ecf998f..7fda776 100644
--- "a/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0501\051"
+++ "b/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0501\051"
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git "a/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0502\051" "b/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0502\051"
index ecf998f..7fda776 100644
--- "a/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0502\051"
+++ "b/server/src/main/java/com/doumee/service/common/dto/DownloadLocalFileDTO.java\0502\051"
@@ -5,7 +5,7 @@
 import lombok.Data;
 
 /**
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Data
diff --git a/server/src/main/java/com/doumee/service/system/SystemDictDataService.java b/server/src/main/java/com/doumee/service/system/SystemDictDataService.java
index 7145eae..60b7446 100644
--- a/server/src/main/java/com/doumee/service/system/SystemDictDataService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemDictDataService.java
@@ -10,7 +10,7 @@
 
 /**
  * 瀛楀吀鏁版嵁Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemDictDataService {
@@ -66,7 +66,7 @@
      * @return SystemDictData
      */
     SystemDictData findOne(SystemDictData systemDictData);
-
+    List<SystemDictData> findList(Integer dicId, List<String> codes);
     /**
      * 鏉′欢鏌ヨ
      *
diff --git a/server/src/main/java/com/doumee/service/system/SystemDictService.java b/server/src/main/java/com/doumee/service/system/SystemDictService.java
index 2601aa0..e8091a9 100644
--- a/server/src/main/java/com/doumee/service/system/SystemDictService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemDictService.java
@@ -10,7 +10,7 @@
 
 /**
  * 瀛楀吀Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemDictService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemJobListService.java b/server/src/main/java/com/doumee/service/system/SystemJobListService.java
index ef85d78..6a2725d 100644
--- a/server/src/main/java/com/doumee/service/system/SystemJobListService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemJobListService.java
@@ -7,7 +7,7 @@
 
 /**
  * 瀹氭椂浠诲姟鍒楄〃Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobListService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemJobLogService.java b/server/src/main/java/com/doumee/service/system/SystemJobLogService.java
index 414a76f..b61ce7b 100644
--- a/server/src/main/java/com/doumee/service/system/SystemJobLogService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemJobLogService.java
@@ -8,7 +8,7 @@
 
 /**
  * 绯荤粺瀹氭椂浠诲姟鏃ュ織Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobLogService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemJobService.java b/server/src/main/java/com/doumee/service/system/SystemJobService.java
index 7f8d99d..fe1d606 100644
--- a/server/src/main/java/com/doumee/service/system/SystemJobService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemJobService.java
@@ -5,7 +5,7 @@
 
 /**
  * 绯荤粺瀹氭椂浠诲姟Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemJobSnippetService.java b/server/src/main/java/com/doumee/service/system/SystemJobSnippetService.java
index 2399507..c3b1a59 100644
--- a/server/src/main/java/com/doumee/service/system/SystemJobSnippetService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemJobSnippetService.java
@@ -7,7 +7,7 @@
 
 /**
  * 瀹氭椂浠诲姟鐗囨Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemJobSnippetService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemLoginLogService.java b/server/src/main/java/com/doumee/service/system/SystemLoginLogService.java
index 2b4ca3e..3634d9f 100644
--- a/server/src/main/java/com/doumee/service/system/SystemLoginLogService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemLoginLogService.java
@@ -8,7 +8,7 @@
 
 /**
  * 鐧诲綍鏃ュ織Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemLoginLogService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemLoginService.java b/server/src/main/java/com/doumee/service/system/SystemLoginService.java
index 10c8f25..57572c6 100644
--- a/server/src/main/java/com/doumee/service/system/SystemLoginService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemLoginService.java
@@ -6,7 +6,7 @@
 
 /**
  * 绯荤粺鐧诲綍
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemLoginService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemMenuService.java b/server/src/main/java/com/doumee/service/system/SystemMenuService.java
index 1ef47e6..d8afc8e 100644
--- a/server/src/main/java/com/doumee/service/system/SystemMenuService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemMenuService.java
@@ -7,7 +7,7 @@
 
 /**
  * 绯荤粺鑿滃崟Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemMenuService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemPermissionService.java b/server/src/main/java/com/doumee/service/system/SystemPermissionService.java
index d9e6396..2649ec1 100644
--- a/server/src/main/java/com/doumee/service/system/SystemPermissionService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemPermissionService.java
@@ -8,7 +8,7 @@
 
 /**
  * 绯荤粺鏉冮檺Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemPermissionService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemRoleMenuService.java b/server/src/main/java/com/doumee/service/system/SystemRoleMenuService.java
index 5a407e3..4dcc627 100644
--- a/server/src/main/java/com/doumee/service/system/SystemRoleMenuService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemRoleMenuService.java
@@ -7,7 +7,7 @@
 
 /**
  * 瑙掕壊鑿滃崟鍏宠仈Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemRoleMenuService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemRolePermissionService.java b/server/src/main/java/com/doumee/service/system/SystemRolePermissionService.java
index 5b92cde..3e7a152 100644
--- a/server/src/main/java/com/doumee/service/system/SystemRolePermissionService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemRolePermissionService.java
@@ -7,7 +7,7 @@
 
 /**
  * 瑙掕壊鏉冮檺鍏宠仈Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemRolePermissionService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemRoleService.java b/server/src/main/java/com/doumee/service/system/SystemRoleService.java
index 5b05cb6..e3510e3 100644
--- a/server/src/main/java/com/doumee/service/system/SystemRoleService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemRoleService.java
@@ -10,7 +10,7 @@
 
 /**
  * 绯荤粺瑙掕壊Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemRoleService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemTraceLogService.java b/server/src/main/java/com/doumee/service/system/SystemTraceLogService.java
index d956e68..463aada 100644
--- a/server/src/main/java/com/doumee/service/system/SystemTraceLogService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemTraceLogService.java
@@ -8,7 +8,7 @@
 
 /**
  * 璺熻釜鏃ュ織Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemTraceLogService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemUserRoleService.java b/server/src/main/java/com/doumee/service/system/SystemUserRoleService.java
index fd9f848..ad47e20 100644
--- a/server/src/main/java/com/doumee/service/system/SystemUserRoleService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemUserRoleService.java
@@ -7,7 +7,7 @@
 
 /**
  * 鐢ㄦ埛瑙掕壊鍏宠仈Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemUserRoleService {
diff --git a/server/src/main/java/com/doumee/service/system/SystemUserService.java b/server/src/main/java/com/doumee/service/system/SystemUserService.java
index c6a384b..a8a6043 100644
--- a/server/src/main/java/com/doumee/service/system/SystemUserService.java
+++ b/server/src/main/java/com/doumee/service/system/SystemUserService.java
@@ -10,7 +10,7 @@
 
 /**
  * 绯荤粺鐢ㄦ埛Service瀹氫箟
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 public interface SystemUserService {
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java
index fbd1725..255eb9d 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemDictDataServiceImpl.java
@@ -21,10 +21,11 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 瀛楀吀鏁版嵁Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
@@ -92,6 +93,15 @@
     }
 
     @Override
+    public List<SystemDictData> findList(Integer dicId,List<String> codes) {
+        QueryWrapper<SystemDictData> wrapper = new QueryWrapper<>();
+        wrapper.lambda()
+                .eq(Objects.nonNull(dicId),SystemDictData::getDictId,dicId)
+                .in(SystemDictData::getLabel,codes);
+        return systemDictDataMapper.selectList(wrapper);
+    }
+
+    @Override
     public List<SystemDictData> findByDictCode(String dictCode) {
         SystemDict queryDto = new SystemDict();
         queryDto.setCode(dictCode);
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemDictServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemDictServiceImpl.java
index 50ccbcd..d0e044f 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemDictServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemDictServiceImpl.java
@@ -20,7 +20,7 @@
 
 /**
  * 瀛楀吀Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemJobListServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemJobListServiceImpl.java
index 41fe8ae..79e6b7b 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemJobListServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemJobListServiceImpl.java
@@ -15,7 +15,7 @@
 
 /**
  * 瀹氭椂浠诲姟鍒楄〃Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemJobLogServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemJobLogServiceImpl.java
index 19fc537..a711265 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemJobLogServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemJobLogServiceImpl.java
@@ -19,7 +19,7 @@
 
 /**
  * 绯荤粺瀹氭椂浠诲姟鏃ュ織Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemJobServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemJobServiceImpl.java
index 9d28ca6..757c4fa 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemJobServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemJobServiceImpl.java
@@ -13,7 +13,7 @@
 
 /**
  * 绯荤粺瀹氭椂浠诲姟Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemJobSnippetServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemJobSnippetServiceImpl.java
index d9b5e19..147b498 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemJobSnippetServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemJobSnippetServiceImpl.java
@@ -19,7 +19,7 @@
 
 /**
  * 瀹氭椂浠诲姟鐗囨Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemLoginLogServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemLoginLogServiceImpl.java
index c490389..65c7fda 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemLoginLogServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemLoginLogServiceImpl.java
@@ -22,7 +22,7 @@
 
 /**
  * 鐧诲綍鏃ュ織Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemMenuServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemMenuServiceImpl.java
index 4b179ee..5261033 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemMenuServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemMenuServiceImpl.java
@@ -18,7 +18,7 @@
 
 /**
  * 绯荤粺鑿滃崟Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
@@ -122,7 +122,7 @@
 
     /**
      * 鑾峰彇瀛愰儴闂↖D
-     * @author Eva.Caesar Liu
+     * @author  dm
      * @date 2025/03/31 16:44
      */
     private void fillChildren(List<Integer> pool, List<Integer> parentIds) {
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java
index d60c351..91b4755 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java
@@ -21,7 +21,7 @@
 /**
  * 绯荤粺鏉冮檺Service瀹炵幇
  *
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemRoleMenuServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemRoleMenuServiceImpl.java
index 16df862..b680326 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemRoleMenuServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemRoleMenuServiceImpl.java
@@ -20,7 +20,7 @@
 
 /**
  * 瑙掕壊鑿滃崟鍏宠仈Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java
index 3cef416..eaf02bc 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemRolePermissionServiceImpl.java
@@ -20,7 +20,7 @@
 
 /**
  * 瑙掕壊鏉冮檺鍏宠仈Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemRoleServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemRoleServiceImpl.java
index 9b663ff..80b2517 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemRoleServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemRoleServiceImpl.java
@@ -22,7 +22,7 @@
 
 /**
  * 绯荤粺瑙掕壊Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemTraceLogServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemTraceLogServiceImpl.java
index e69a15a..435a9ba 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemTraceLogServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemTraceLogServiceImpl.java
@@ -19,7 +19,7 @@
 
 /**
  * 璺熻釜鏃ュ織Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemUserRoleServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemUserRoleServiceImpl.java
index 8354658..872723f 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemUserRoleServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemUserRoleServiceImpl.java
@@ -20,7 +20,7 @@
 
 /**
  * 鐢ㄦ埛瑙掕壊鍏宠仈Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java b/server/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
index e028241..a341b0a 100644
--- a/server/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
@@ -21,7 +21,7 @@
 
 /**
  * 绯荤粺鐢ㄦ埛Service瀹炵幇
- * @author Eva.Caesar Liu
+ * @author  dm
  * @since 2025/03/31 16:44
  */
 @Service
diff --git a/server/src/main/resources/application-dev.yml b/server/src/main/resources/application-dev.yml
index 6742412..e60b0b3 100644
--- a/server/src/main/resources/application-dev.yml
+++ b/server/src/main/resources/application-dev.yml
@@ -39,8 +39,3 @@
     enable: true
     username: admin
     password: 111111
-
-qyweixin:
-  corpid:
-  secret:
-  agentid:
\ No newline at end of file
diff --git a/server/src/main/resources/mappers/SystemDictDataMapper.xml b/server/src/main/resources/mappers/SystemDictDataMapper.xml
index 6de601b..2a63d6c 100644
--- a/server/src/main/resources/mappers/SystemDictDataMapper.xml
+++ b/server/src/main/resources/mappers/SystemDictDataMapper.xml
@@ -16,7 +16,7 @@
   </resultMap>
   <select id="selectManageList" parameterType="com.doumee.dao.system.dto.QuerySystemDictDataDTO" resultMap="SystemDictDataListVO">
     SELECT
-      dict_data.`ID`, dict_data.`DICT_ID`, dict_data.`CODE`, dict_data.`LABEL`, dict_data.`SORT`, dict_data.`DISABLED`, dict_data.`CREATE_TIME`, dict_data.`UPDATE_TIME`, dict_data.`CREATE_USER`, dict_data.`UPDATE_USER`,
+    dict_data.`ID`, dict_data.`remark`, dict_data.`DICT_ID`, dict_data.`CODE`, dict_data.`LABEL`, dict_data.`SORT`, dict_data.`DISABLED`, dict_data.`CREATE_TIME`, dict_data.`UPDATE_TIME`, dict_data.`CREATE_USER`, dict_data.`UPDATE_USER`,
       create_user.ID CREATE_USER_ID, create_user.`USERNAME` CREATE_USER_NAME,
       update_user.ID UPDETE_USER_ID, update_user.`USERNAME` UPDATE_USER_NAME
     FROM SYSTEM_DICT_DATA dict_data

--
Gitblit v1.9.3