From 764d883b5ea3bdc06abbec548b6df0511e567978 Mon Sep 17 00:00:00 2001
From: linwe <872216996@qq.com>
Date: Tue, 03 Sep 2024 09:46:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/binlog' into binlog

---
 src/main/java/org/springblade/modules/property/vo/ExpenseDetails.java                            |   32 
 src/main/java/org/springblade/modules/backblast/vo/BackblastPubPersonVO.java                     |   79 
 src/main/java/org/springblade/modules/sms/service/impl/SmsRecordServiceImpl.java                 |   50 
 src/main/java/org/springblade/modules/pay/service/impl/RefundInfoServiceImpl.java                |  118 
 src/main/java/org/springblade/modules/counties/vo/CountiesVO.java                                |   35 
 src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.java                            |   44 
 src/main/java/org/springblade/modules/backblast/wrapper/BackblastWarnHanRecWrapper.java          |   50 
 src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.java                      |   60 
 src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.xml              |  315 
 src/main/java/org/springblade/common/cache/SysCache.java                                         |  168 
 src/main/java/org/springblade/modules/house/excel/ExportHouseholdExcel.java                      |  237 
 src/main/java/org/springblade/modules/report/entity/ReportEntity.java                            |  157 
 src/main/java/org/springblade/es/test/ElasticSearchExample.java                                  |   96 
 src/main/java/org/springblade/modules/report/dto/ReportDbDTO.java                                |   34 
 src/main/java/org/springblade/modules/nursingCheckIn/service/INursingCheckInService.java         |   43 
 src/main/java/org/springblade/modules/pay/dto/OrderInfoDTO.java                                  |   34 
 src/main/java/org/springblade/modules/sms/service/ISmsSendService.java                           |   47 
 src/main/java/org/springblade/common/utils/ParseMail.java                                        |  253 
 src/main/java/org/springblade/modules/eCallEventTwo/vo/ECallEventTwoVO.java                      |   49 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderDone.java                      |   50 
 src/main/java/org/springblade/common/config/BladeScopeDataConfig.java                            |   20 
 src/main/java/org/springblade/common/config/SmsConfig.java                                       |   25 
 src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.xml               |  378 
 src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.java              |   59 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderParamDTO.java                     |   42 
 src/main/java/org/springblade/common/enums/wxpay/WxNotifyType.java                               |   41 
 src/main/java/org/springblade/modules/system/vo/RegionParamVO.java                               |    2 
 src/main/java/org/springblade/common/utils/HttpUtils.java                                        |   39 
 src/main/java/org/springblade/modules/disputeRecord/wrapper/DisputeRecordWrapper.java            |   50 
 src/main/java/org/springblade/common/utils/HttpClientUtils.java                                  |  597 +
 src/main/java/org/springblade/es/controller/EsController.java                                    |   84 
 src/main/java/org/springblade/common/handle/BladeScopeModelHandlerMaster.java                    |   78 
 src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java |  157 
 src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java                             |   54 
 src/main/java/org/springblade/modules/threeColorTask/vo/CustomTaskVO.java                        |   34 
 src/main/java/org/springblade/modules/house/excel/ImportTenantHouseholdExcel.java                |   90 
 src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java                        |   50 
 src/main/java/org/springblade/modules/report/mapper/ReportMapper.xml                             |   15 
 src/main/java/org/springblade/flow/core/entity/BladeFlow.java                                    |   23 
 src/main/java/org/springblade/modules/report/mapper/ReportMapper.java                            |   43 
 src/main/java/org/springblade/modules/system/service/ILogService.java                            |    6 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderCheckDTO.java                     |   47 
 src/main/java/org/springblade/modules/system/mapper/DictBizMapper.xml                            |    4 
 src/main/java/org/springblade/modules/email/vo/EmailTemplateVO.java                              |   35 
 src/main/resources/application.yml                                                               |   49 
 src/main/java/org/springblade/modules/report/service/impl/ReportServiceImpl.java                 |   43 
 src/main/java/org/springblade/modules/place/excel/ImportPlaceExcel.java                          |  124 
 src/main/java/org/springblade/modules/smsTask/vo/SmsTaskVO.java                                  |   35 
 src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordExcel.java                |  150 
 src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.xml                           |   15 
 src/main/java/org/springblade/modules/pay/entity/WeChatMiniAuthorizeVo.java                      |   39 
 src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java         |   72 
 src/main/java/org/springblade/modules/system/service/IMenuService.java                           |    2 
 src/main/java/org/springblade/modules/system/controller/TenantController.java                    |    4 
 src/main/java/org/springblade/modules/test4j/util/Test4jUtil.java                                |   85 
 src/main/java/org/springblade/modules/task/vo/TaskNoFraudReportingVO.java                        |  108 
 src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.xml             |  169 
 src/main/java/org/springblade/common/interceptor/DataSyncInterceptor.java                        |  245 
 src/main/java/org/springblade/modules/email/service/IEmailTemplateService.java                   |   60 
 src/main/java/org/springblade/modules/place/excel/ImportPractitionerExcel.java                   |   95 
 src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.xml                     |   27 
 src/main/java/org/springblade/modules/pay/dto/RefundInfoDTO.java                                 |   34 
 src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.java                  |   45 
 src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.xml                           |   64 
 src/main/java/org/springblade/modules/report/vo/ReportDbVO.java                                  |   34 
 src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.xml               |   76 
 src/main/java/org/springblade/modules/disputeRecord/dto/DisputeRecordDTO.java                    |   34 
 src/main/java/org/springblade/common/config/WxMiniConfig.java                                    |   21 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcHandle.java                         |  123 
 src/main/java/org/springblade/common/utils/sms/AlipaySignature.java                              |  607 +
 src/main/java/org/springblade/modules/sms/wrapper/SmsRecordWrapper.java                          |   51 
 src/main/java/org/springblade/modules/wechat/service/WechatService.java                          |   12 
 src/main/java/org/springblade/common/utils/ThreadPoolUtil.java                                   |   40 
 src/main/java/org/springblade/modules/issueClazz/vo/IssueClazzVO.java                            |   93 
 src/main/java/org/springblade/modules/police/entity/PoliceAlarmRecordsEntity.java                |  155 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderResp.java                      |   36 
 src/main/java/org/springblade/modules/system/service/impl/LogServiceImpl.java                    |  103 
 src/main/java/org/springblade/modules/nursingCheckIn/service/impl/NursingCheckInServiceImpl.java |   43 
 src/main/java/sql/report.menu.sql                                                                |   10 
 src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java                   |  522 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderSupervise.java                 |  155 
 src/main/java/org/springblade/modules/property/dto/PropertyChargeRecordDTO.java                  |   18 
 src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java                       |  787 +
 src/main/java/org/springblade/modules/report/service/impl/ReportDbServiceImpl.java               |   42 
 src/main/java/org/springblade/modules/pay/service/impl/PaymentInfoServiceImpl.java               |   88 
 src/main/java/sql/reportdb.menu.sql                                                              |   10 
 src/main/java/org/springblade/modules/counties/controller/CountiesController.java                |  129 
 src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java                                |   34 
 src/main/java/org/springblade/common/utils/SpinLockUtil.java                                     |   55 
 src/main/java/org/springblade/modules/auth/granter/PasswordTokenGranter.java                     |   17 
 src/main/java/org/springblade/modules/system/entity/TreeNodeTwo.java                             |   12 
 src/main/java/org/springblade/common/utils/sms/AlipayConstants.java                              |   97 
 src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml                           |   68 
 src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.java                          |   43 
 src/main/java/org/springblade/common/utils/SmsUtils.java                                         |  127 
 src/main/java/org/springblade/modules/system/controller/DeptController.java                      |   22 
 src/main/java/org/springblade/xxljob/cron/CronExpression.java                                    | 1402 ++
 src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.java                      |   67 
 src/main/java/org/springblade/modules/category/excel/CategoryImporter.java                       |   39 
 src/main/java/org/springblade/xxljob/util/CookieUtil.java                                        |   98 
 src/main/java/org/springblade/modules/backblast/vo/BackblastPubRecordVO.java                     |  102 
 src/main/java/org/springblade/modules/place/excel/ExportPlaceExcel.java                          |  130 
 src/main/java/org/springblade/modules/smsTask/entity/SmsTaskEntity.java                          |   99 
 src/main/java/org/springblade/modules/system/entity/Dept.java                                    |    4 
 src/test/resources/application.yml                                                               |   10 
 src/main/java/org/springblade/modules/pay/dto/PaymentInfoDTO.java                                |   34 
 src/main/java/org/springblade/modules/task/excel/TaskNoExplosionExcel.java                       |   71 
 src/main/java/org/springblade/modules/pay/controller/PaymentInfoController.java                  |  125 
 src/main/java/org/springblade/modules/disputeRecord/vo/DisputeRecordVO.java                      |   79 
 src/main/java/org/springblade/modules/disputeRecord/entity/DisputeRecordEntity.java              |  164 
 src/main/java/org/springblade/modules/smsTask/wrapper/SmsTaskWrapper.java                        |   50 
 src/main/java/org/springblade/common/param/ToObject.java                                         |   18 
 src/main/java/org/springblade/modules/issueClazz/entity/IssueClazzEntity.java                    |   53 
 src/main/java/org/springblade/modules/police/vo/PolicTrajectoryPointVO.java                      |   36 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/ECallEventTwoDTO.java                    |   34 
 src/main/java/org/springblade/modules/issueClazz/dto/IssueClazzDTO.java                          |   48 
 src/main/java/org/springblade/modules/disputeRecord/service/impl/DisputeRecordServiceImpl.java   |  255 
 src/main/java/org/springblade/modules/smsTask/service/impl/SmsTaskServiceImpl.java               |   76 
 src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubPersonServiceImpl.java  |   57 
 src/main/java/org/springblade/modules/task/dto/TaskNoFraudReportingDTO.java                      |   34 
 src/main/java/org/springblade/flow/engine/controller/FlowManagerController.java                  |    2 
 src/main/java/org/springblade/modules/backblast/service/impl/BackblastWarnHanRecServiceImpl.java |   80 
 src/main/java/org/springblade/modules/police/vo/PoliceAlarmRecordsVO.java                        |   68 
 src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubRecordServiceImpl.java  |  239 
 src/main/java/org/springblade/modules/system/controller/UserController.java                      |   77 
 src/main/java/org/springblade/modules/task/service/ITaskNoFraudReportingService.java             |   53 
 src/main/java/org/springblade/modules/backblast/controller/BackblastPubPersonController.java     |  145 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/ECallEventTwoEntity.java              |  300 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcDispatchDTO.java                       |   32 
 src/main/java/org/springblade/modules/pay/entity/PaymentInfoEntity.java                          |   95 
 src/main/java/org/springblade/modules/pay/wrapper/OrderInfoWrapper.java                          |   51 
 src/main/java/org/springblade/modules/task/wrapper/TaskSchoolEvenWrapper.java                    |   51 
 src/main/java/org/springblade/modules/threeColorTask/wrapper/CustomTaskWrapper.java              |   50 
 src/main/java/org/springblade/modules/police/controller/PolicTrajectoryPointController.java      |  125 
 src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubRecordWrapper.java           |   50 
 src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml                             |  126 
 src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.java                    |   44 
 src/main/java/org/springblade/modules/wechat/controller/WechatController.java                    |   33 
 src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.xml                     |  599 +
 src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.java                |   84 
 src/main/java/org/springblade/modules/system/service/IRoleService.java                           |    8 
 src/main/java/org/springblade/common/utils/NodeTreeUtil.java                                     |   21 
 src/main/java/org/springblade/modules/article/entity/ArticleBrowseEntity.java                    |   66 
 src/main/java/org/springblade/xxljob/jobhandler/DataHandleJob.java                               |   59 
 src/main/java/org/springblade/modules/email/wrapper/EmailTemplateWrapper.java                    |   50 
 src/main/java/org/springblade/modules/task/entity/TaskSchoolEvenEntity.java                      |  137 
 src/main/java/org/springblade/modules/wechat/service/impl/WechatServiceImpl.java                 |   60 
 src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.xml                   |   41 
 src/main/java/org/springblade/common/utils/UtilRandom.java                                       |    7 
 src/main/java/org/springblade/modules/auth/utils/TokenUtil.java                                  |    2 
 src/main/java/org/springblade/modules/sms/entity/SmsRecordEntity.java                            |   92 
 src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.xml              |   57 
 src/main/java/org/springblade/modules/backblast/entity/BackblastPubRecordEntity.java             |  131 
 src/main/java/org/springblade/modules/email/controller/EmailTemplateController.java              |  126 
 src/main/java/org/springblade/modules/discuss/excel/holdExcel.java                               |   73 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderReview.java                    |  150 
 src/main/java/org/springblade/common/node/TreeIntegerNode.java                                   |    6 
 src/main/java/org/springblade/modules/counties/dto/CountiesDTO.java                              |   53 
 src/main/java/org/springblade/common/enums/wxpay/WxTradeState.java                               |   34 
 src/main/java/org/springblade/modules/threeColorTask/service/ICustomTaskService.java             |   74 
 src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.java            |   43 
 src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java                  |  139 
 src/main/java/org/springblade/common/utils/RoleUtil.java                                         |   31 
 src/main/java/org/springblade/modules/email/entity/EmailTemplateEntity.java                      |   79 
 src/main/java/org/springblade/modules/issueClazz/service/IIssueClazzService.java                 |   46 
 src/main/java/org/springblade/modules/smsTask/dto/SmsTaskDTO.java                                |   34 
 src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java                   |   25 
 src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.java             |   69 
 src/main/java/org/springblade/modules/pay/wrapper/PaymentInfoWrapper.java                        |   51 
 src/main/java/org/springblade/modules/report/wrapper/ReportDbWrapper.java                        |   50 
 src/main/java/org/springblade/modules/sms/service/ISmsRecordService.java                         |   42 
 src/main/java/org/springblade/modules/smsTask/service/ISmsTaskService.java                       |   71 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderReviewDTO.java                    |   47 
 src/main/java/org/springblade/modules/system/service/IDeptService.java                           |    9 
 src/main/java/org/springblade/modules/article/service/IArticleBrowseService.java                 |   26 
 src/main/java/org/springblade/modules/task/controller/TaskSchoolEvenController.java              |  144 
 src/main/java/org/springblade/modules/pay/vo/PaymentInfoVO.java                                  |   34 
 src/main/java/org/springblade/common/param/GridSet.java                                          |   98 
 src/main/java/org/springblade/modules/system/mapper/UserMapper.xml                               |  110 
 src/main/java/org/springblade/modules/email/service/impl/EmailTemplateServiceImpl.java           |   71 
 src/main/java/org/springblade/common/cache/CacheNames.java                                       |    5 
 src/main/java/org/springblade/modules/police/dto/PolicTrajectoryPointDTO.java                    |   34 
 src/main/java/org/springblade/modules/article/entity/ArticleIntegralEntity.java                  |   77 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrder.java                          |  392 
 src/main/java/org/springblade/common/config/MyBatisPlusConfig.java                               |   15 
 src/main/java/org/springblade/common/utils/sms/StreamUtil.java                                   |  135 
 src/main/java/org/springblade/modules/pay/service/impl/OrderInfoServiceImpl.java                 |  207 
 src/main/java/org/springblade/modules/system/service/impl/LogUsualServiceImpl.java               |    7 
 src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.java                           |   60 
 src/main/java/org/springblade/common/enums/OrderStatus.java                                      |   49 
 src/main/java/org/springblade/flow/engine/controller/FlowModelController.java                    |    2 
 src/main/java/org/springblade/modules/pay/vo/RefundInfoVO.java                                   |   34 
 src/main/java/org/springblade/modules/resource/utils/ImageUtil.java                              |  171 
 src/main/java/org/springblade/modules/system/entity/LogApiExt.java                               |   19 
 src/main/java/org/springblade/xxljob/jobhandler/SynchronizationEhjb.java                         |   53 
 src/main/java/org/springblade/modules/backblast/service/IBackblastPubPersonService.java          |   47 
 src/main/java/org/springblade/modules/system/mapper/LogApiMapper.xml                             |   42 
 src/main/java/org/springblade/modules/report/controller/ReportDbController.java                  |  125 
 src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcCallEventTwoServiceImpl.java  |  144 
 src/main/java/org/springblade/modules/task/service/TaskHandle.java                               |    7 
 src/main/java/org/springblade/modules/system/controller/LogApiController.java                    |   19 
 src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.xml                            |   71 
 src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.java                            |   60 
 src/main/java/org/springblade/common/constant/CommonConstant.java                                |   11 
 src/main/java/org/springblade/modules/article/controller/ArticleBrowseController.java            |  106 
 src/main/java/org/springblade/modules/nursingCheckIn/entity/NursingCheckInEntity.java            |  110 
 src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java                         |   62 
 src/main/java/org/springblade/modules/backblast/controller/BackblastPubRecordController.java     |  177 
 src/main/java/org/springblade/es/service/ElasticsearchIndexInitializer.java                      |   33 
 src/main/java/org/springblade/modules/backblast/excel/BackblastPubRecordExcel.java               |   93 
 src/main/java/org/springblade/modules/police/service/impl/PoliceAlarmRecordsServiceImpl.java     |   81 
 src/main/java/org/springblade/common/utils/sms/StringUtils.java                                  |  171 
 src/main/java/org/springblade/modules/pay/entity/RefundInfoEntity.java                           |  102 
 src/main/java/org/springblade/modules/category/excel/CategoryExcel.java                          |   45 
 src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java                                  |   34 
 src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.java                |   51 
 src/main/java/org/springblade/modules/nursingCheckIn/wrapper/NursingCheckInWrapper.java          |   50 
 src/main/java/org/springblade/common/interceptor/CorsInterceptor.java                            |   32 
 src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java                       |   59 
 src/main/java/org/springblade/modules/task/controller/TaskNoFraudReportingController.java        |  189 
 src/main/resources/log/logback-test.xml                                                          |   20 
 src/main/java/org/springblade/modules/task/dto/TaskResidencePermitApplyDTO.java                  |   34 
 src/main/java/org/springblade/modules/system/service/impl/LogErrorServiceImpl.java               |    7 
 src/main/java/org/springblade/modules/eCallEventTwo/controller/ECallEventTwoController.java      |  212 
 src/main/java/org/springblade/modules/system/node/DeptUserTreeNode.java                          |    2 
 src/main/java/org/springblade/modules/backblast/controller/BackblastWarnHanRecController.java    |  158 
 src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java                          |  115 
 src/main/java/org/springblade/modules/police/controller/PoliceAlarmRecordsController.java        |  137 
 src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java                          |   60 
 src/main/java/org/springblade/modules/pay/wrapper/RefundInfoWrapper.java                         |   51 
 src/main/java/org/springblade/common/constant/EsTableConstant.java                               |   69 
 src/main/java/org/springblade/modules/police/service/impl/PolicTrajectoryPointServiceImpl.java   |   42 
 src/main/java/org/springblade/modules/system/controller/RegionController.java                    |    9 
 src/main/java/org/springblade/modules/task/entity/TaskNoFraudReportingEntity.java                |  194 
 src/main/java/org/springblade/modules/counties/entity/CountiesEntity.java                        |   59 
 src/main/java/org/springblade/common/config/WebConfig.java                                       |   22 
 src/main/java/org/springblade/modules/report/entity/ReportDbEntity.java                          |  149 
 src/main/java/org/springblade/common/enums/wxpay/WxApiType.java                                  |   65 
 src/main/java/org/springblade/modules/sms/controller/SmsRecordController.java                    |  125 
 src/main/java/org/springblade/modules/sms/controller/SmsSendController.java                      |  118 
 src/main/java/org/springblade/modules/system/service/IUserService.java                           |   30 
 src/main/java/org/springblade/modules/system/mapper/RegionMapper.java                            |   29 
 src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubPersonWrapper.java           |   34 
 src/main/java/org/springblade/modules/backblast/vo/BackblastWarnHanRecVO.java                    |   82 
 src/main/java/org/springblade/modules/task/service/impl/TaskSchoolEvenServiceImpl.java           |   80 
 src/main/java/org/springblade/modules/task/service/ITaskSchoolEvenService.java                   |   63 
 src/main/java/org/springblade/modules/article/vo/ArticleBrowseVO.java                            |   35 
 src/main/java/org/springblade/modules/pay/controller/RefundInfoController.java                   |  125 
 src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.xml                 |  105 
 src/main/java/org/springblade/modules/system/controller/DictBizController.java                   |    4 
 src/main/java/org/springblade/common/enums/PayType.java                                          |   24 
 src/main/java/org/springblade/xxljob/util/LocalCacheUtil.java                                    |  134 
 src/main/java/org/springblade/modules/sms/dto/SmsRecordDTO.java                                  |   34 
 src/main/java/org/springblade/common/config/ThreadPoolConfig.java                                |   33 
 src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml             |  201 
 src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.java                    |   98 
 src/main/java/org/springblade/modules/backblast/dto/BackblastPubRecordDTO.java                   |   34 
 src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java                 |  148 
 src/main/java/org/springblade/common/exception/CustomException.java                              |   18 
 src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.xml                     |   34 
 src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.java             |   62 
 src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.java                          |    5 
 src/main/java/org/springblade/modules/system/entity/User.java                                    |   17 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDTO.java                          |   64 
 src/main/java/org/springblade/modules/police/service/IPoliceAlarmRecordsService.java             |   45 
 src/main/java/org/springblade/common/utils/WordToPdfUtils.java                                   |   34 
 src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.java             |   39 
 src/main/java/org/springblade/modules/pay/entity/OrderInfoEntity.java                            |  100 
 src/main/java/org/springblade/modules/system/controller/LogUsualController.java                  |    4 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderRespDTO.java                      |   47 
 src/main/java/org/springblade/modules/article/service/impl/ArticleBrowseServiceImpl.java         |   26 
 src/main/java/org/springblade/modules/report/service/IReportDbService.java                       |   42 
 src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcOrderServiceImpl.java         |  326 
 src/main/java/org/springblade/modules/report/vo/ReportVO.java                                    |   35 
 src/main/java/org/springblade/es/vo/EsParam.java                                                 |   37 
 src/main/java/org/springblade/modules/police/entity/PolicTrajectoryPointEntity.java              |   95 
 src/main/java/org/springblade/common/utils/sms/ReplyContent.java                                 |   63 
 src/main/java/org/springblade/modules/task/service/impl/SelfExaminationTaskHandler.java          |   84 
 src/main/java/org/springblade/modules/system/mapper/DeptMapper.java                              |   13 
 src/main/java/org/springblade/modules/system/service/ILogUsualService.java                       |    4 
 src/main/java/org/springblade/common/utils/sms/StatusReport.java                                 |   91 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderSuperviseDTO.java                 |   47 
 src/main/java/org/springblade/modules/system/excel/PoliceUserExcel.java                          |   14 
 src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java               |   69 
 src/main/java/org/springblade/es/config/ElasticsearchConfig.java                                 |   24 
 src/main/java/org/springblade/common/utils/sms/AlipayApiException.java                           |   49 
 src/main/java/org/springblade/modules/issueClazz/service/impl/IssueClazzServiceImpl.java         |   51 
 src/main/java/org/springblade/flow/engine/controller/FlowFollowController.java                   |    2 
 src/main/java/org/springblade/modules/report/controller/ReportController.java                    |  126 
 src/main/java/org/springblade/common/utils/WeiXinSecurityUtil.java                               |  321 
 src/main/java/org/springblade/es/config/ElasticsearchInitializer.java                            |   24 
 src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.xml                           |   99 
 src/main/java/org/springblade/modules/backblast/service/IBackblastPubRecordService.java          |   66 
 src/main/java/org/springblade/modules/counties/wrapper/CountiesWrapper.java                      |   50 
 src/main/java/org/springblade/common/config/WxPayConfig.java                                     |  188 
 src/main/java/org/springblade/modules/eCallEventTwo/wrapper/ECallEventTwoWrapper.java            |   50 
 src/main/java/org/springblade/modules/task/wrapper/TaskResidencePermitApplyWrapper.java          |   50 
 src/main/java/org/springblade/modules/pay/service/IRefundInfoService.java                        |   46 
 src/main/java/org/springblade/modules/threeColorTask/dto/CustomTaskDTO.java                      |   34 
 src/main/java/org/springblade/modules/article/service/impl/ArticleIntegralServiceImpl.java       |   29 
 src/main/java/org/springblade/modules/article/vo/ArticleIntegralVO.java                          |   61 
 src/main/java/org/springblade/common/utils/AuthUtils.java                                        |   55 
 src/main/java/org/springblade/modules/threeColorTask/entity/CustomTaskEntity.java                |  127 
 src/main/java/org/springblade/modules/sms/vo/SmsRecordVO.java                                    |   34 
 src/main/java/org/springblade/modules/task/entity/TaskResidencePermitApplyEntity.java            |  162 
 src/main/java/org/springblade/modules/system/vo/UserVO.java                                      |    7 
 src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.java                          |    4 
 src/main/java/org/springblade/modules/report/wrapper/ReportWrapper.java                          |   50 
 src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.xml                 |  492 
 src/main/java/org/springblade/modules/pay/service/IPaymentInfoService.java                       |   45 
 src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.xml                       |  232 
 src/main/java/org/springblade/modules/email/dto/EmailTemplateDTO.java                            |   34 
 src/main/java/org/springblade/modules/task/wrapper/TaskNoFraudReportingWrapper.java              |   50 
 src/main/java/org/springblade/modules/house/excel/ExportHouseTenantExcel.java                    |   93 
 src/main/java/org/springblade/modules/counties/service/ICountiesService.java                     |   43 
 src/main/java/org/springblade/modules/threeColorTask/controller/CustomTaskController.java        |  125 
 src/main/java/org/springblade/modules/system/mapper/RoleMapper.java                              |    8 
 src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.xml                           |    5 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderCheck.java                     |   60 
 src/main/java/org/springblade/modules/system/mapper/UserMapper.java                              |   19 
 src/main/java/org/springblade/modules/threeColorTask/service/impl/CustomTaskServiceImpl.java     |  137 
 src/main/java/org/springblade/modules/eCallEventTwo/service/EcOrderService.java                  |   90 
 src/main/java/org/springblade/modules/system/service/ILogErrorService.java                       |    4 
 src/main/java/org/springblade/modules/disputeRecord/controller/DisputeRecordController.java      |  212 
 src/main/java/org/springblade/modules/house/vo/AddHouseholdVO.java                               |   11 
 src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.xml                             |   79 
 src/main/java/org/yaml/snakeyaml/representer/Representer.java                                    |  198 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDoneDTO.java                      |   47 
 src/main/java/org/springblade/es/service/ElasticsearchSearchService.java                         |   29 
 src/main/java/org/springblade/modules/task/controller/TaskResidencePermitApplyController.java    |  159 
 src/main/java/org/springblade/modules/police/wrapper/PoliceAlarmRecordsWrapper.java              |   50 
 src/main/java/org/springblade/modules/system/mapper/LogApiMapper.java                            |   20 
 src/main/java/com/xxl/job/core/enums/taskHandlerEnum.java                                        |   35 
 src/main/java/org/springblade/modules/house/excel/HouseTenantExcel.java                          |   86 
 src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.java                          |   59 
 src/main/java/org/springblade/modules/system/service/IRegionService.java                         |   29 
 src/main/java/org/springblade/modules/system/service/impl/LogApiServiceImpl.java                 |   22 
 src/main/java/org/springblade/common/constant/DictConstant.java                                  |    8 
 src/main/java/org/springblade/xxljob/util/JacksonUtil.java                                       |   93 
 src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.java                    |   43 
 src/main/java/org/springblade/modules/smsTask/controller/SmsTaskController.java                  |  126 
 src/main/java/org/springblade/modules/pay/service/IOrderInfoService.java                         |   59 
 src/main/java/org/springblade/modules/auth/endpoint/BladeTokenEndPoint.java                      |   17 
 src/main/java/org/springblade/modules/eCallEventTwo/entity/EcDispatch.java                       |  261 
 src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.xml                 |  198 
 src/main/java/org/springblade/modules/nursingCheckIn/controller/NursingCheckInController.java    |  126 
 src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.xml              |  284 
 src/main/java/org/springblade/modules/report/dto/ReportDTO.java                                  |   34 
 src/main/java/org/springblade/modules/nursingCheckIn/vo/NursingCheckInVO.java                    |   42 
 src/main/java/org/springblade/modules/task/service/impl/TaskNoFraudReportingServiceImpl.java     |  222 
 src/main/java/org/springblade/modules/article/controller/ArticleIntegralController.java          |  107 
 src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.java              |   66 
 src/main/java/org/springblade/modules/eCallEventTwo/dto/EcHandleDTO.java                         |   48 
 src/main/java/org/springblade/common/utils/sms/PerfectSend.java                                  |   91 
 src/main/java/org/springblade/es/service/ElasticsearchIndexService.java                          |   37 
 src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java            |   53 
 src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml                               |   33 
 src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordImporter.java             |   23 
 src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml                               |   90 
 src/main/java/org/springblade/modules/police/wrapper/PolicTrajectoryPointWrapper.java            |   50 
 src/main/java/org/springblade/modules/task/vo/TaskSchoolEvenVO.java                              |   61 
 src/main/java/org/springblade/modules/doorplateAddress/excel/ImportDoorplateExcel.java           |  272 
 src/main/java/org/springblade/modules/police/service/IPolicTrajectoryPointService.java           |   42 
 src/main/java/org/springblade/modules/task/dto/TaskSchoolEvenDTO.java                            |  130 
 src/main/java/org/springblade/modules/disputeRecord/service/IDisputeRecordService.java           |   61 
 src/main/java/org/springblade/modules/system/controller/MenuController.java                      |   15 
 src/main/java/org/springblade/modules/backblast/service/IBackblastWarnHanRecService.java         |   56 
 src/main/java/org/springblade/modules/system/controller/LogErrorController.java                  |    4 
 src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.java                |   61 
 src/main/java/org/springblade/modules/police/dto/PoliceAlarmRecordsDTO.java                      |   18 
 src/main/java/org/springblade/modules/issueClazz/controller/IssueClazzController.java            |  140 
 src/main/java/org/springblade/modules/backblast/entity/BackblastPubPersonEntity.java             |   86 
 src/main/java/org/springblade/modules/auth/granter/CaptchaTokenGranter.java                      |    5 
 src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.xml                           |    5 
 src/main/java/org/springblade/modules/article/service/IArticleIntegralService.java               |   26 
 src/main/java/org/springblade/common/enums/wxpay/WxRefundStatus.java                             |   34 
 src/main/java/org/springblade/common/node/TreeStringNode.java                                    |    9 
 src/main/java/org/springblade/common/utils/WechatPay2ValidatorForRequest.java                    |  114 
 src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.xml                         |   15 
 src/main/java/org/springblade/modules/task/vo/TaskResidencePermitApplyVO.java                    |   70 
 src/main/java/org/springblade/modules/grid/excel/GridPatrolRecordExcel.java                      |   71 
 src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.xml             |   78 
 src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.java            |   54 
 src/main/java/org/springblade/modules/place/excel/PractitionerExcel.java                         |  106 
 src/main/java/org/springblade/modules/eCallEventTwo/service/IECallEventTwoService.java           |   62 
 src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.xml                       |   66 
 src/main/java/org/springblade/modules/pay/controller/OrderInfoController.java                    |  135 
 src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.java                          |   63 
 src/test/java/org/springblade/test/BladeTest.java                                                |   59 
 src/main/java/org/springblade/modules/task/service/impl/VisitingTaskHandler.java                 |   57 
 src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.xml                             |   15 
 src/main/java/org/springblade/common/launch/LauncherServiceImpl.java                             |    2 
 src/main/java/org/springblade/modules/backblast/entity/BackblastWarnHanRecEntity.java            |  106 
 src/main/java/org/springblade/modules/pay/vo/OrderInfoVO.java                                    |   34 
 src/main/java/org/springblade/modules/report/service/IReportService.java                         |   43 
 src/main/java/org/springblade/modules/counties/service/impl/CountiesServiceImpl.java             |   43 
 src/main/java/org/springblade/modules/test4j/Test4jController.java                               |   64 
 src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.java                        |   43 
 src/main/java/org/springblade/common/utils/ImageUtils.java                                       |   39 
 src/main/java/org/springblade/modules/disputeRecord/excel/ExportDisputeRecordExcel.java          |  158 
 src/main/java/org/springblade/modules/backblast/dto/BackblastWarnHanRecDTO.java                  |   34 
 src/main/java/org/springblade/common/utils/SQLParseUtils.java                                    |   41 
 src/main/java/org/springblade/modules/system/service/ILogApiService.java                         |   17 
 src/main/java/org/springblade/modules/nursingCheckIn/dto/NursingCheckInDTO.java                  |   34 
 src/main/java/org/springblade/modules/issueClazz/wrapper/IssueClazzWrapper.java                  |   50 
 405 files changed, 33,225 insertions(+), 211 deletions(-)

diff --git a/src/main/java/com/xxl/job/core/enums/taskHandlerEnum.java b/src/main/java/com/xxl/job/core/enums/taskHandlerEnum.java
new file mode 100644
index 0000000..b02d09d
--- /dev/null
+++ b/src/main/java/com/xxl/job/core/enums/taskHandlerEnum.java
@@ -0,0 +1,35 @@
+package com.xxl.job.core.enums;
+
+/**
+ *
+ */
+public enum taskHandlerEnum {
+	VISITING_TASK("0", "VisitingTaskHandler"),
+	SELFEXAMINATION_TASK("1", "SelfExaminationTaskHandler");
+	final String code;
+
+	final String name;
+
+	public String getCode() {
+		return code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	taskHandlerEnum(String code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+
+	public static String getNameByCode(String code) {
+		taskHandlerEnum[] payHandlerEnums = values();
+		for (taskHandlerEnum payHandlerEnum : payHandlerEnums) {
+			if (payHandlerEnum.getCode().equals(code)) {
+				return payHandlerEnum.getName();
+			}
+		}
+		return null;
+	}
+}
diff --git a/src/main/java/org/springblade/common/cache/CacheNames.java b/src/main/java/org/springblade/common/cache/CacheNames.java
index 11b5e3e..9087966 100644
--- a/src/main/java/org/springblade/common/cache/CacheNames.java
+++ b/src/main/java/org/springblade/common/cache/CacheNames.java
@@ -58,4 +58,9 @@
 	 */
 	String USER_FAIL_KEY = "blade:user::blade:fail:";
 
+	/**
+	 *
+	 */
+	String ARTICLE_KEY = "blade:article:";
+
 }
diff --git a/src/main/java/org/springblade/common/cache/SysCache.java b/src/main/java/org/springblade/common/cache/SysCache.java
index 190da4b..792babf 100644
--- a/src/main/java/org/springblade/common/cache/SysCache.java
+++ b/src/main/java/org/springblade/common/cache/SysCache.java
@@ -1,19 +1,3 @@
-/*
- *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions are met:
- *
- *  Redistributions of source code must retain the above copyright notice,
- *  this list of conditions and the following disclaimer.
- *  Redistributions in binary form must reproduce the above copyright
- *  notice, this list of conditions and the following disclaimer in the
- *  documentation and/or other materials provided with the distribution.
- *  Neither the name of the dreamlu.net developer nor the names of its
- *  contributors may be used to endorse or promote products derived from
- *  this software without specific prior written permission.
- *  Author: Chill 庄骞 (smallchill@163.com)
- */
 package org.springblade.common.cache;
 
 import org.apache.logging.log4j.util.Strings;
@@ -29,6 +13,7 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static org.springblade.common.cache.CacheNames.ARTICLE_KEY;
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 
 /**
@@ -334,7 +319,7 @@
 	 *
 	 * @return regionCode
 	 */
-	public static List<String> getRegionChildCodesByDeptId(String deptId) {
+	public static List<String> getRegionChildCodesByDeptId(String deptId,String communityCode) {
 		//多个部门按逗号分割
 		List<String> deptIdList = Arrays.asList(deptId.split(","));
 
@@ -345,7 +330,7 @@
 			// 查询对应的区域编号code
 			Dept dept = deptService.getById(id);
 			if (null!=dept && !Strings.isBlank(dept.getRegionCode()) && !AuthUtil.isAdministrator()){
-				list = getRegionChildCodes(dept.getRegionCode());
+				list = getRegionChildCodes(dept.getRegionCode(),communityCode);
 				//行政区划不为空添加进集合
 				if (list.size()>0){
 					allRegionList.addAll(list);
@@ -359,18 +344,107 @@
 	}
 
 	/**
+	 * 获取民警(公安)下级所有区域code
+	 *
+	 * @return regionCode
+	 */
+	public static List<String> getPoliceRegionChildCodesByDeptId(String deptId,String communityCode) {
+		List<String> regionCodeList = new ArrayList<>();
+		if (!Strings.isBlank(deptId)) {
+			//多个部门按逗号分割
+			List<String> deptIdList = Arrays.asList(deptId.split(","));
+
+			//所有行政区划code
+			List<String> allRegionList = new ArrayList<>();
+			deptIdList.forEach(id -> {
+				List<String> list = new ArrayList<>();
+				// 查询对应的区域编号code
+				Dept dept = deptService.getById(id);
+				// 只取公安的
+				if (dept.getDeptNature() == 1) {
+					if (null != dept && !Strings.isBlank(dept.getRegionCode()) && !AuthUtil.isAdministrator()) {
+						list = getPoliceRegionChildCodes(dept.getRegionCode(),communityCode);
+						//行政区划不为空添加进集合
+						if (list.size() > 0) {
+							allRegionList.addAll(list);
+						}
+					}
+				}
+			});
+			// 去重
+			regionCodeList = allRegionList.stream().distinct().collect(Collectors.toList());
+		}
+		return regionCodeList;
+	}
+
+
+	/**
+	 * 查询综治网格/公安相关的网格,社区编号集合
+	 * @param deptId
+	 * @param communityCode
+	 * @param roleName
+	 * @return
+	 */
+	public static List<String> getGridRegionChildCodesByDeptId(String deptId, String communityCode,String roleName) {
+		List<String> regionCodeList = new ArrayList<>();
+		if (!Strings.isBlank(deptId)) {
+			//多个部门按逗号分割
+			List<String> deptIdList = Arrays.asList(deptId.split(","));
+			List<String> finalRegionCodeList = regionCodeList;
+			String key = AuthUtil.getUserId().toString();
+			if (!Strings.isBlank(roleName)){
+				key = key + ":" + roleName;
+			}
+			String finalKey = key;
+			deptIdList.forEach(id -> {
+				List<String> list = new ArrayList<>();
+				// 查询对应的区域编号code
+				Dept dept = deptService.getById(id);
+				if (null != dept) {
+					if ((roleName.equals("mj") && dept.getDeptNature() == 1) ||
+						((roleName.equals("wgy") || roleName.equals("wzcj")) && dept.getDeptNature() == 2)) {
+						if (!AuthUtil.isAdministrator()) {
+							if (dept.getRegionCode() == null) {
+								return;
+							}
+							list = CacheUtil.get(SYS_CACHE, REGION_CHILDCODES_CODE, finalKey, List.class);
+							if (list == null || list.size() == 0) {
+								list = new ArrayList<>();
+								List<Region> deptChild = getGridRegionChild(dept.getRegionCode(), communityCode, roleName);
+								if (deptChild != null) {
+									List<String> collect = deptChild.stream().map(Region::getCode).collect(Collectors.toList());
+									list.addAll(collect);
+								}
+							}
+							//行政区划不为空添加进集合
+							if (list.size() > 0) {
+								finalRegionCodeList.addAll(list);
+							}
+						}
+					}
+				}
+			});
+			// 去重
+			regionCodeList = finalRegionCodeList.stream().distinct().collect(Collectors.toList());
+			CacheUtil.put(SYS_CACHE, REGION_CHILDCODES_CODE, key, regionCodeList);
+		}
+		return regionCodeList;
+	}
+
+
+	/**
 	 * 获取下级所有区域code
 	 *
 	 * @return regionCode
 	 */
-	public static List<String> getRegionChildCodes(String regionCode) {
+	public static List<String> getRegionChildCodes(String regionCode,String communityCode) {
 		if (regionCode == null) {
 			return null;
 		}
 		List<String> regionCodeList = CacheUtil.get(SYS_CACHE, REGION_CHILDCODES_CODE, regionCode, List.class);
 		if (regionCodeList == null || regionCodeList.size()==0) {
 			regionCodeList = new ArrayList<>();
-			List<Region> deptChild = getRegionChild(regionCode);
+			List<Region> deptChild = getRegionChild(regionCode,communityCode);
 			if (deptChild != null) {
 				List<String> collect = deptChild.stream().map(Region::getCode).collect(Collectors.toList());
 				regionCodeList.addAll(collect);
@@ -382,11 +456,61 @@
 	}
 
 	/**
+	 * 获取公安下级所有区域code
+	 *
+	 * @return regionCode
+	 */
+	public static List<String> getPoliceRegionChildCodes(String regionCode,String communityCode) {
+		if (regionCode == null) {
+			return null;
+		}
+		List<String> regionCodeList = CacheUtil.get(SYS_CACHE, REGION_CHILDCODES_CODE, regionCode, List.class);
+		if (regionCodeList == null || regionCodeList.size()==0) {
+			regionCodeList = new ArrayList<>();
+			List<Region> deptChild = getPoliceRegionChild(regionCode,communityCode);
+			if (deptChild != null) {
+				List<String> collect = deptChild.stream().map(Region::getCode).collect(Collectors.toList());
+				regionCodeList.addAll(collect);
+			}
+			regionCodeList.add(regionCode);
+			CacheUtil.put(SYS_CACHE, REGION_CHILDCODES_CODE, regionCode, regionCodeList);
+		}
+		return regionCodeList;
+	}
+
+	/**
+	 * 获取综治下级区域
+	 * @param regionCode
+	 * @return
+	 */
+	private static List<Region> getGridRegionChild(String regionCode, String communityCode,String roleName) {
+		return CacheUtil.get(SYS_CACHE, REGION_CHILD_CODE, regionCode, () -> regionService.getGridRegionChild(regionCode,communityCode,roleName));
+	}
+
+	/**
+	 * 获取民警下级区域
+	 * @param regionCode
+	 * @return
+	 */
+	private static List<Region> getPoliceRegionChild(String regionCode,String communityCode) {
+		return CacheUtil.get(SYS_CACHE, REGION_CHILD_CODE, regionCode, () -> regionService.getPoliceRegionChild(regionCode,communityCode));
+	}
+
+	/**
 	 * 获取下级区域
 	 * @param regionCode
 	 * @return
 	 */
-	private static List<Region> getRegionChild(String regionCode) {
-		return CacheUtil.get(SYS_CACHE, REGION_CHILD_CODE, regionCode, () -> regionService.getRegionChild(regionCode));
+	private static List<Region> getRegionChild(String regionCode,String communityCode) {
+		return CacheUtil.get(SYS_CACHE, REGION_CHILD_CODE, regionCode, () -> regionService.getRegionChild(regionCode,communityCode));
+	}
+
+	/**
+	 * 查询当前文章范围对应的社区编号字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+	public static String getAllCommunityNameListString(String articleRange,String id) {
+		return CacheUtil.get(ARTICLE_KEY, "id", id ,() -> regionService.getAllCommunityNameListString(articleRange));
 	}
 }
diff --git a/src/main/java/org/springblade/common/config/BladeScopeDataConfig.java b/src/main/java/org/springblade/common/config/BladeScopeDataConfig.java
new file mode 100644
index 0000000..749aaf1
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/BladeScopeDataConfig.java
@@ -0,0 +1,20 @@
+package org.springblade.common.config;
+
+import org.springblade.common.handle.BladeScopeModelHandlerMaster;
+import org.springblade.core.datascope.handler.ScopeModelHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+@Configuration(proxyBeanMethods = false)
+public class BladeScopeDataConfig {
+
+	@Autowired
+	private JdbcTemplate jdbcTemplate;
+
+	@Bean
+	public ScopeModelHandler scopeModelHandler(){
+		return new BladeScopeModelHandlerMaster(jdbcTemplate);
+	}
+}
diff --git a/src/main/java/org/springblade/common/config/MyBatisPlusConfig.java b/src/main/java/org/springblade/common/config/MyBatisPlusConfig.java
new file mode 100644
index 0000000..56906b2
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/MyBatisPlusConfig.java
@@ -0,0 +1,15 @@
+package org.springblade.common.config;
+
+import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
+import org.springblade.common.interceptor.DataSyncInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MyBatisPlusConfig {
+
+	@Bean
+	public DataSyncInterceptor dataSyncInterceptor() {
+		return new DataSyncInterceptor();
+	}
+}
diff --git a/src/main/java/org/springblade/common/config/SmsConfig.java b/src/main/java/org/springblade/common/config/SmsConfig.java
new file mode 100644
index 0000000..a9135b4
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/SmsConfig.java
@@ -0,0 +1,25 @@
+package org.springblade.common.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+//@ConfigurationProperties(prefix = "sms") //读取sms节点
+@Data
+public class SmsConfig {
+	@Value("${sms.url}")
+	private String smsUrl;
+	// 平台提供的appId 仅供测试使用
+	@Value("${sms.appId}")
+	private String smsAppId;
+	// 平台提供的私钥 仅供测试使用
+	@Value("${sms.privateKey}")
+	private String smsPrivateKey;
+	@Value("${sms.sopCreateBy}")
+	private String sopCreateBy;
+
+
+}
diff --git a/src/main/java/org/springblade/common/config/ThreadPoolConfig.java b/src/main/java/org/springblade/common/config/ThreadPoolConfig.java
new file mode 100644
index 0000000..7bf7b8d
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/ThreadPoolConfig.java
@@ -0,0 +1,33 @@
+package org.springblade.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+public class ThreadPoolConfig {
+
+	@Bean(name = "customThreadPool")
+	public ThreadPoolTaskExecutor customThreadPool() {
+		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+		// 核心线程数
+		executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
+		// executor.setCorePoolSize(10);
+		// 最大线程数
+		executor.setMaxPoolSize(40);
+		// 队列大小
+		executor.setQueueCapacity(600);
+		// 线程空闲时间(秒)
+		executor.setKeepAliveSeconds(60);
+		// 线程名称前缀
+		executor.setThreadNamePrefix("CustomThreadPool-");
+		// 设置拒绝策略
+		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+		// 初始化线程池
+		executor.initialize();
+		return executor;
+	}
+}
+
diff --git a/src/main/java/org/springblade/common/config/WebConfig.java b/src/main/java/org/springblade/common/config/WebConfig.java
new file mode 100644
index 0000000..a8f7314
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/WebConfig.java
@@ -0,0 +1,22 @@
+package org.springblade.common.config;
+
+
+import org.springblade.common.interceptor.CorsInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+	@Autowired
+	private CorsInterceptor corsInterceptor;
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		//跨域拦截器需放在最上面
+		registry.addInterceptor(corsInterceptor);
+
+	}
+}
diff --git a/src/main/java/org/springblade/common/config/WxMiniConfig.java b/src/main/java/org/springblade/common/config/WxMiniConfig.java
new file mode 100644
index 0000000..9972e29
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/WxMiniConfig.java
@@ -0,0 +1,21 @@
+package org.springblade.common.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "wxmini") //读取wxmini节点
+@Data //使用set方法将wxpay节点中的值填充到当前类的属性中
+@Slf4j
+public class WxMiniConfig {
+
+	// appid
+	private String appid;
+
+	// 小程序appSecret key
+	private String secret;
+
+	private String jscode2sessionUrl;
+}
diff --git a/src/main/java/org/springblade/common/config/WxPayConfig.java b/src/main/java/org/springblade/common/config/WxPayConfig.java
new file mode 100644
index 0000000..c55037b
--- /dev/null
+++ b/src/main/java/org/springblade/common/config/WxPayConfig.java
@@ -0,0 +1,188 @@
+package org.springblade.common.config;
+
+import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
+import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
+import com.wechat.pay.contrib.apache.httpclient.auth.ScheduledUpdateCertificatesVerifier;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
+import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import java.io.FileInputStream;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+
+
+@Configuration
+@ConfigurationProperties(prefix = "wxpay") //读取wxpay节点
+@Data //使用set方法将wxpay节点中的值填充到当前类的属性中
+@Slf4j
+public class WxPayConfig {
+
+	// 商户号
+	private String mchId;
+
+	// 商户API证书序列号
+	private String mchSerialNo;
+
+	// 商户私钥文件
+	private String privateKeyPath;
+
+	private String privateCertPath;
+
+	// APIv3密钥
+	private String apiV3Key;
+
+	// APPID
+	private String appid;
+
+	// 微信服务器地址
+	private String domain;
+
+	// 接收结果通知地址
+	private String notifyDomain;
+
+	// APIv2密钥
+	private String partnerKey;
+
+	/**
+	 * 获取商户的私钥文件
+	 *
+	 * @param filename
+	 * @return
+	 */
+	private PrivateKey getPrivateKey(String filename) {
+
+		try {
+			// FileInputStream fileInputStream = new FileInputStream(filename);
+			// log.info("文件内容:" + fileInputStream);
+			return PemUtil.loadPrivateKey(getFileInputStream(filename));
+		} catch (Exception e) {
+			log.info("私钥文件不存在", e);
+			throw new RuntimeException("私钥文件不存在", e);
+		}
+	}
+
+
+	/**
+	 * 获取商户的文件
+	 *
+	 * @param filename
+	 * @return
+	 */
+	public static FileInputStream getFileInputStream(String filename) {
+
+		try {
+			FileInputStream fileInputStream = new FileInputStream(filename);
+			return fileInputStream;
+		} catch (Exception e) {
+			log.info("读取文件不存在", e);
+			throw new RuntimeException("读取文件不存在", e);
+		}
+	}
+
+	/**
+	 * 获取商户的文件
+	 *
+	 * @return
+	 */
+	// @Bean
+	// public KeyStore keyStore() {
+	// 	try {
+	// 		InputStream certStream = WxPayConfig.class.getClassLoader().getResourceAsStream(privateCertPath);
+	// 		KeyStore ks = KeyStore.getInstance("PKCS12");
+	// 		ks.load(certStream, mchId.toCharArray());
+	// 		return ks;
+	// 	} catch (Exception e) {
+	// 		log.info("读取文件不存在", e);
+	// 		throw new RuntimeException("读取文件不存在", e);
+	// 	}
+	// }
+
+
+	/**
+	 * 获取签名验证器
+	 *
+	 * @return
+	 */
+//	@Bean
+	public ScheduledUpdateCertificatesVerifier getVerifier() {
+
+		log.info("获取签名验证器");
+
+		//获取商户私钥
+		PrivateKey privateKey = getPrivateKey(privateKeyPath);
+
+		//私钥签名对象
+		PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
+
+		//身份认证对象
+		WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
+
+		// 使用定时更新的签名验证器,不需要传入证书
+		ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(
+			wechatPay2Credentials,
+			apiV3Key.getBytes(StandardCharsets.UTF_8));
+
+		return verifier;
+	}
+
+
+	/**
+	 * 获取http请求对象
+	 *
+	 * @param verifier
+	 * @return
+	 */
+//	@Bean(name = "wxPayClient")
+	public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) {
+
+		log.info("获取httpClient");
+
+		//获取商户私钥
+		PrivateKey privateKey = getPrivateKey(privateKeyPath);
+
+		WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
+			.withMerchant(mchId, mchSerialNo, privateKey)
+			.withValidator(new WechatPay2Validator(verifier));
+		// ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient
+
+		// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
+		CloseableHttpClient httpClient = builder.build();
+
+		return httpClient;
+	}
+
+	/**
+	 * 获取HttpClient,无需进行应答签名验证,跳过验签的流程
+	 */
+//	@Bean(name = "wxPayNoSignClient")
+	public CloseableHttpClient getWxPayNoSignClient() {
+
+		//获取商户私钥
+		PrivateKey privateKey = getPrivateKey(privateKeyPath);
+
+		//用于构造HttpClient
+		WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
+			//设置商户信息
+			.withMerchant(mchId, mchSerialNo, privateKey)
+			//无需进行签名验证、通过withValidator((response) -> true)实现
+			.withValidator((response) -> true);
+
+		// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
+		CloseableHttpClient httpClient = builder.build();
+
+		log.info("== getWxPayNoSignClient END ==");
+
+		return httpClient;
+	}
+
+
+}
+
diff --git a/src/main/java/org/springblade/common/constant/CommonConstant.java b/src/main/java/org/springblade/common/constant/CommonConstant.java
index 3042382..bb3dbf6 100644
--- a/src/main/java/org/springblade/common/constant/CommonConstant.java
+++ b/src/main/java/org/springblade/common/constant/CommonConstant.java
@@ -28,7 +28,7 @@
 	/**
 	 * app name
 	 */
-	String APPLICATION_NAME = AppConstant.APPLICATION_NAME_PREFIX + "api";
+	String APPLICATION_NAME = "jczz-" + "api";
 
 	/**
 	 * sword 系统名
@@ -86,13 +86,22 @@
 
 	Integer NUMBER_TWO = 2;
 
+	Integer NUMBER_FIVE = 5;
+
 	Integer NUMBER_THREE = 3;
 
 	Integer NUMBER_FOUR = 4;
 
 	Integer NUMBER_EIGHT = 8;
 
+	Integer NUMBER_SEVEN = 7;
+	Integer NUMBER_SIX = 6;
+
 	String RESIDENT = "居民";
 
+	int REPORT_TYPE_SECONDHAND_TRADE = 5; // 二手车
+	int REPORT_TYPE_FIRE_INSPECTION = 2; // 自查
+	int REPORT_TYPE_NO_FRAUD = 6; // 无诈
+
 
 }
diff --git a/src/main/java/org/springblade/common/constant/DictConstant.java b/src/main/java/org/springblade/common/constant/DictConstant.java
index 40b0522..4aecb19 100644
--- a/src/main/java/org/springblade/common/constant/DictConstant.java
+++ b/src/main/java/org/springblade/common/constant/DictConstant.java
@@ -45,7 +45,7 @@
 
 	String USED_CAR= "二手车交易";
 
-	String BAIL_PENDING_TRIAL= "取保候审";
+	String BAIL_PENDING_TRIAL= "取保监居";
 
 	String SMALL_DOORPLATE= "小门牌";
 
@@ -57,4 +57,10 @@
 
 	String FIRE_SELF_CHECK_NOTICE = "消防自查";
 
+	String FIRE_SCHOOL_CHECK_NOTICE = "校园安全检查";
+
+	String NO_FRAUD_REPORTING = "无诈宣传";
+
+	String RESIDENCE_PERMIT_APPLICATION = "居住证申请";
+
 }
diff --git a/src/main/java/org/springblade/common/constant/EsTableConstant.java b/src/main/java/org/springblade/common/constant/EsTableConstant.java
new file mode 100644
index 0000000..0c8ebf9
--- /dev/null
+++ b/src/main/java/org/springblade/common/constant/EsTableConstant.java
@@ -0,0 +1,69 @@
+package org.springblade.common.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * es 表对应的属性常量
+ * @author zhongrj
+ * @since 2024-04-08
+ */
+public class EsTableConstant {
+
+
+	/**
+	 * 1. 通知
+	 */
+	public static List<String> articleList = new ArrayList<String>()
+	{{
+		add("tableId");
+		add("tableName");
+		add("title");
+		add("type");
+		add("content");
+		add("articleType");
+		add("articleRange");
+	}};
+
+
+	/**
+	 * 2. 场所
+	 */
+	public static List<String> placeList = new ArrayList<String>()
+	{{
+		add("tableId");
+		add("tableName");
+		add("placeName");
+		add("principal");
+		add("principalPhone");
+		add("principalIdCard");
+		add("location");
+	}};
+
+
+	/**
+	 * 3. 房屋
+	 */
+	public static List<String> houseList = new ArrayList<String>()
+	{{
+		add("tableId");
+		add("tableName");
+		add("houseName");
+	}};
+
+
+	/**
+	 * 4. 住户
+	 */
+	public static List<String> householdList = new ArrayList<String>()
+	{{
+		add("tableId");
+		add("tableName");
+		add("name");
+		add("idCard");
+		add("phoneNumber");
+		add("address");
+	}};
+
+
+}
diff --git a/src/main/java/org/springblade/common/enums/OrderStatus.java b/src/main/java/org/springblade/common/enums/OrderStatus.java
new file mode 100644
index 0000000..538c938
--- /dev/null
+++ b/src/main/java/org/springblade/common/enums/OrderStatus.java
@@ -0,0 +1,49 @@
+package org.springblade.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum OrderStatus {
+    /**
+     * 未支付
+     */
+    NOTPAY("未支付"),
+
+
+    /**
+     * 支付成功
+     */
+    SUCCESS("支付成功"),
+
+    /**
+     * 已关闭
+     */
+    CLOSED("超时已关闭"),
+
+    /**
+     * 已取消
+     */
+    CANCEL("用户已取消"),
+
+    /**
+     * 退款中
+     */
+    REFUND_PROCESSING("退款中"),
+
+    /**
+     * 已退款
+     */
+    REFUND_SUCCESS("已退款"),
+
+    /**
+     * 退款异常
+     */
+    REFUND_ABNORMAL("退款异常");
+
+    /**
+     * 类型
+     */
+    private final String type;
+}
diff --git a/src/main/java/org/springblade/common/enums/PayType.java b/src/main/java/org/springblade/common/enums/PayType.java
new file mode 100644
index 0000000..9066612
--- /dev/null
+++ b/src/main/java/org/springblade/common/enums/PayType.java
@@ -0,0 +1,24 @@
+package org.springblade.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum PayType {
+    /**
+     * 微信
+     */
+    WXPAY("微信"),
+
+
+    /**
+     * 支付宝
+     */
+    ALIPAY("支付宝");
+
+    /**
+     * 类型
+     */
+    private final String type;
+}
diff --git a/src/main/java/org/springblade/common/enums/wxpay/WxApiType.java b/src/main/java/org/springblade/common/enums/wxpay/WxApiType.java
new file mode 100644
index 0000000..4f2d7bc
--- /dev/null
+++ b/src/main/java/org/springblade/common/enums/wxpay/WxApiType.java
@@ -0,0 +1,65 @@
+package org.springblade.common.enums.wxpay;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum WxApiType {
+
+	/**
+	 * Native下单
+	 */
+	NATIVE_PAY("/v3/pay/transactions/native"),
+
+	/**
+	 * Native下单
+	 */
+	NATIVE_PAY_V2("/pay/unifiedorder"),
+
+	/**
+	 * JSAPI下单
+	 */
+	JSAPI_PAY("/v3/pay/transactions/jsapi"),
+
+	/**
+	 * sendredpack 发送红包
+	 */
+	SENDREDPACK_PAY("/mmpaymkttransfers/sendredpack"),
+
+	/**
+	 * 查询订单
+	 */
+	ORDER_QUERY_BY_NO("/v3/pay/transactions/out-trade-no/%s"),
+
+	/**
+	 * 关闭订单
+	 */
+	CLOSE_ORDER_BY_NO("/v3/pay/transactions/out-trade-no/%s/close"),
+
+	/**
+	 * 申请退款
+	 */
+	DOMESTIC_REFUNDS("/v3/refund/domestic/refunds"),
+
+	/**
+	 * 查询单笔退款
+	 */
+	DOMESTIC_REFUNDS_QUERY("/v3/refund/domestic/refunds/%s"),
+
+	/**
+	 * 申请交易账单
+	 */
+	TRADE_BILLS("/v3/bill/tradebill"),
+
+	/**
+	 * 申请资金账单
+	 */
+	FUND_FLOW_BILLS("/v3/bill/fundflowbill");
+
+
+	/**
+	 * 类型
+	 */
+	private final String type;
+}
diff --git a/src/main/java/org/springblade/common/enums/wxpay/WxNotifyType.java b/src/main/java/org/springblade/common/enums/wxpay/WxNotifyType.java
new file mode 100644
index 0000000..2eed92e
--- /dev/null
+++ b/src/main/java/org/springblade/common/enums/wxpay/WxNotifyType.java
@@ -0,0 +1,41 @@
+package org.springblade.common.enums.wxpay;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum WxNotifyType {
+
+	/**
+	 * 支付通知
+	 */
+	NATIVE_NOTIFY("/wxPay/native/notify"),
+
+	/**
+	 * 支付通知
+	 */
+	NATIVE_NOTIFY_V2("/wxPayV2/native/notify"),
+
+
+	/**
+	 * 退款结果通知
+	 */
+	REFUND_NOTIFY("/wxPay/refunds/notify"),
+
+	/**
+	 * 添加分账接收方API
+	 */
+	RECEIVERS_ADD("/v3/profitsharing/receivers/add"),
+
+	/**
+	 * 创建分账订单API
+	 *
+	 */
+	PROFITSHARING_ORDERS("/v3/profitsharing/orders");
+
+	/**
+	 * 类型
+	 */
+	private final String type;
+}
diff --git a/src/main/java/org/springblade/common/enums/wxpay/WxRefundStatus.java b/src/main/java/org/springblade/common/enums/wxpay/WxRefundStatus.java
new file mode 100644
index 0000000..6be0b51
--- /dev/null
+++ b/src/main/java/org/springblade/common/enums/wxpay/WxRefundStatus.java
@@ -0,0 +1,34 @@
+package org.springblade.common.enums.wxpay;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum WxRefundStatus {
+
+    /**
+     * 退款成功
+     */
+    SUCCESS("SUCCESS"),
+
+    /**
+     * 退款关闭
+     */
+    CLOSED("CLOSED"),
+
+    /**
+     * 退款处理中
+     */
+    PROCESSING("PROCESSING"),
+
+    /**
+     * 退款异常
+     */
+    ABNORMAL("ABNORMAL");
+
+    /**
+     * 类型
+     */
+    private final String type;
+}
diff --git a/src/main/java/org/springblade/common/enums/wxpay/WxTradeState.java b/src/main/java/org/springblade/common/enums/wxpay/WxTradeState.java
new file mode 100644
index 0000000..22d5b62
--- /dev/null
+++ b/src/main/java/org/springblade/common/enums/wxpay/WxTradeState.java
@@ -0,0 +1,34 @@
+package org.springblade.common.enums.wxpay;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum WxTradeState {
+
+    /**
+     * 支付成功
+     */
+    SUCCESS("SUCCESS"),
+
+    /**
+     * 未支付
+     */
+    NOTPAY("NOTPAY"),
+
+    /**
+     * 已关闭
+     */
+    CLOSED("CLOSED"),
+
+    /**
+     * 转入退款
+     */
+    REFUND("REFUND");
+
+    /**
+     * 类型
+     */
+    private final String type;
+}
diff --git a/src/main/java/org/springblade/common/exception/CustomException.java b/src/main/java/org/springblade/common/exception/CustomException.java
new file mode 100644
index 0000000..5537719
--- /dev/null
+++ b/src/main/java/org/springblade/common/exception/CustomException.java
@@ -0,0 +1,18 @@
+package org.springblade.common.exception;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+
+@Slf4j
+@RestControllerAdvice
+public class CustomException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    public CustomException() {}
+
+    public CustomException(String message) {
+        super(message);
+    }
+}
diff --git a/src/main/java/org/springblade/common/handle/BladeScopeModelHandlerMaster.java b/src/main/java/org/springblade/common/handle/BladeScopeModelHandlerMaster.java
new file mode 100644
index 0000000..ebd4edc
--- /dev/null
+++ b/src/main/java/org/springblade/common/handle/BladeScopeModelHandlerMaster.java
@@ -0,0 +1,78 @@
+package org.springblade.common.handle;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.datascope.constant.DataScopeConstant;
+import org.springblade.core.datascope.handler.ScopeModelHandler;
+import org.springblade.core.datascope.model.DataScopeModel;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@DS("master")
+@RequiredArgsConstructor
+public class BladeScopeModelHandlerMaster implements ScopeModelHandler {
+	private static final String SCOPE_CACHE_CODE = "dataScope:code:";
+	private static final String SCOPE_CACHE_CLASS = "dataScope:class:";
+	private static final String DEPT_CACHE_ANCESTORS = "dept:ancestors:";
+	private static final DataScopeModel SEARCHED_DATA_SCOPE_MODEL;
+	private final JdbcTemplate jdbcTemplate;
+
+	public DataScopeModel getDataScopeByMapper(String mapperId, String roleId) {
+		List<Object> args = new ArrayList(Collections.singletonList(mapperId));
+		List<Long> roleIds = Func.toLongList(roleId);
+		args.addAll(roleIds);
+		DataScopeModel dataScope = (DataScopeModel) CacheUtil.get("blade:sys", "dataScope:class:", mapperId + ":" + roleId, DataScopeModel.class, Boolean.FALSE);
+		if (dataScope == null || !dataScope.getSearched()) {
+			List<DataScopeModel> list = this.jdbcTemplate.query(DataScopeConstant.dataByMapper(roleIds.size()), args.toArray(), new BeanPropertyRowMapper(DataScopeModel.class));
+			if (CollectionUtil.isNotEmpty(list)) {
+				dataScope = (DataScopeModel)list.iterator().next();
+				dataScope.setSearched(Boolean.TRUE);
+			} else {
+				dataScope = SEARCHED_DATA_SCOPE_MODEL;
+			}
+
+			CacheUtil.put("blade:sys", "dataScope:class:", mapperId + ":" + roleId, dataScope, Boolean.FALSE);
+		}
+
+		return StringUtil.isNotBlank(dataScope.getResourceCode()) ? dataScope : null;
+	}
+
+	public DataScopeModel getDataScopeByCode(String code) {
+		DataScopeModel dataScope = (DataScopeModel)CacheUtil.get("blade:sys", "dataScope:code:", code, DataScopeModel.class, Boolean.FALSE);
+		if (dataScope == null || !dataScope.getSearched()) {
+			List<DataScopeModel> list = this.jdbcTemplate.query("select resource_code, scope_column, scope_field, scope_type, scope_value from blade_scope_data where resource_code = ?", new Object[]{code}, new BeanPropertyRowMapper(DataScopeModel.class));
+			if (CollectionUtil.isNotEmpty(list)) {
+				dataScope = (DataScopeModel)list.iterator().next();
+				dataScope.setSearched(Boolean.TRUE);
+			} else {
+				dataScope = SEARCHED_DATA_SCOPE_MODEL;
+			}
+
+			CacheUtil.put("blade:sys", "dataScope:code:", code, dataScope, Boolean.FALSE);
+		}
+
+		return StringUtil.isNotBlank(dataScope.getResourceCode()) ? dataScope : null;
+	}
+
+	public List<Long> getDeptAncestors(Long deptId) {
+		List ancestors = (List)CacheUtil.get("blade:sys", "dept:ancestors:", deptId, List.class);
+		if (CollectionUtil.isEmpty(ancestors)) {
+			ancestors = this.jdbcTemplate.queryForList("select id from blade_dept where ancestors like concat(concat('%', ?),'%') and is_deleted = 0", new Object[]{deptId}, Long.class);
+			CacheUtil.put("blade:sys", "dept:ancestors:", deptId, ancestors);
+		}
+
+		return ancestors;
+	}
+
+	static {
+		SEARCHED_DATA_SCOPE_MODEL = new DataScopeModel(Boolean.TRUE);
+	}
+}
diff --git a/src/main/java/org/springblade/common/interceptor/CorsInterceptor.java b/src/main/java/org/springblade/common/interceptor/CorsInterceptor.java
new file mode 100644
index 0000000..fde8fd3
--- /dev/null
+++ b/src/main/java/org/springblade/common/interceptor/CorsInterceptor.java
@@ -0,0 +1,32 @@
+package org.springblade.common.interceptor;
+
+
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class CorsInterceptor implements HandlerInterceptor {
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+		response.setHeader("Access-Control-Allow-Origin", "*");
+		response.setHeader("Access-Control-Allow-Credentials", "true");
+		response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
+		response.setHeader("Access-Control-Max-Age", "86400");
+		response.setHeader("Access-Control-Allow-Headers", "*");
+
+		// 如果是OPTIONS则结束请求
+		if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
+			response.setStatus(HttpStatus.NO_CONTENT.value());
+			return false;
+		}
+
+		return true;
+	}
+
+}
diff --git a/src/main/java/org/springblade/common/interceptor/DataSyncInterceptor.java b/src/main/java/org/springblade/common/interceptor/DataSyncInterceptor.java
new file mode 100644
index 0000000..a8588b5
--- /dev/null
+++ b/src/main/java/org/springblade/common/interceptor/DataSyncInterceptor.java
@@ -0,0 +1,245 @@
+package org.springblade.common.interceptor;
+
+import org.apache.ibatis.binding.MapperMethod;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.*;
+import org.apache.logging.log4j.util.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.constant.EsTableConstant;
+import org.springblade.common.utils.SQLParseUtils;
+import org.springblade.es.service.ElasticsearchDocumentService;
+import org.springblade.es.vo.EsParam;
+import org.springblade.modules.article.entity.Article;
+import org.springblade.modules.house.entity.HouseEntity;
+import org.springblade.modules.house.entity.HouseholdEntity;
+import org.springblade.modules.place.entity.PlaceEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Properties;
+
+@Component
+@Intercepts({
+	@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
+})
+public class DataSyncInterceptor implements Interceptor {
+
+	private static final Logger logger = LoggerFactory.getLogger(DataSyncInterceptor.class);
+	@Lazy
+	@Autowired
+	private ElasticsearchDocumentService elasticsearchDocumentService;
+
+	@Value("${elasticsearch.indexName}")
+	private String indexName;
+
+	/**
+	 * 拦截器在sql执行成功后同步到es,
+	 * 如果同步失败抛出异常,保证数据一致性
+	 *
+	 * @param invocation
+	 * @return
+	 * @throws Throwable
+	 */
+	@Override
+	public Object intercept(Invocation invocation) throws Throwable {
+		// 获取StatementHandler,进行自定义处理
+//		StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
+
+		Object res = invocation.proceed();
+		System.out.println("res = " + res);
+
+		Object[] args = invocation.getArgs();
+		MappedStatement ms = (MappedStatement) args[0];
+		if (args.length >= 2) {
+			//参数
+			Object parameter = invocation.getArgs()[1];
+			BoundSql boundSql = ms.getBoundSql(parameter);
+			//sql
+			String sql = boundSql.getSql();
+			sql = sql.replaceAll("\n", "");
+			//获取表名
+			String tableName = SQLParseUtils.getTableName(sql);
+			String sqlType = SQLParseUtils.parseSQLType(sql);
+			if (!Strings.isBlank(tableName)) {
+				if (tableName.equals("jczz_article") ||
+					tableName.equals("jczz_house") ||
+					tableName.equals("jczz_household") ||
+					tableName.equals("jczz_place"))
+					syncDataAfterUpdate(tableName, sqlType, invocation.getArgs()[1]);
+			}
+		}
+		return res;
+	}
+
+
+	/**
+	 * 数据同步
+	 *
+	 * @param tableName
+	 * @param sqlType
+	 * @param parameter
+	 */
+	private void syncDataAfterUpdate(String tableName, String sqlType, Object parameter) {
+		EsParam esParam = new EsParam();
+		esParam.setIndexName(indexName);
+		esParam.setTableName(tableName);
+		// 判断操作类型
+		if (sqlType.equals("INSERT")) {
+			//insert 可用直接拦截到实体类
+			if (tableName.equals("jczz_article")) {
+				Article entity = (Article) parameter;
+				elasticsearchDocumentService.addArticle(esParam, entity);
+			}
+			if (tableName.equals("jczz_place")) {
+				PlaceEntity entity = (PlaceEntity) parameter;
+				elasticsearchDocumentService.addPlace(esParam, entity);
+			}
+			if (tableName.equals("jczz_house")) {
+				HouseEntity entity = (HouseEntity) parameter;
+				elasticsearchDocumentService.addHouse(esParam, entity);
+			}
+			if (tableName.equals("jczz_household")) {
+				HouseholdEntity entity = (HouseholdEntity) parameter;
+				elasticsearchDocumentService.addHousehold(esParam, entity);
+			}
+		}
+		if (sqlType.equals("UPDATE")) {
+			//update 方法需要特殊处理
+			if (tableName.equals("jczz_article")) {
+				try {
+					Article entity = (Article) ((MapperMethod.ParamMap) parameter).get("param1");
+					if (entity != null && entity.getId() != null) {
+						esParam.setTableId(entity.getId().toString());
+						elasticsearchDocumentService.update(esParam, entity, EsTableConstant.articleList);
+					}
+				} catch (Exception e) {
+					logger.error("jczz_article 更新失败!", e);
+				}
+			}
+			if (tableName.equals("jczz_place")) {
+				PlaceEntity entity = new PlaceEntity();
+				PlaceEntity placeEntity = new PlaceEntity();
+				if (parameter instanceof MapperMethod.ParamMap) {
+					placeEntity = (PlaceEntity) ((MapperMethod.ParamMap) parameter).get("param1");
+					if (placeEntity != null && null != placeEntity.getId()) {
+						setPlaceInfo(entity, placeEntity);
+						esParam.setTableId(entity.getId().toString());
+						elasticsearchDocumentService.update(esParam, entity, EsTableConstant.placeList);
+					}
+				} else {
+					placeEntity = (PlaceEntity) parameter;
+					// 删除
+					esParam.setTableId(placeEntity.getId().toString());
+					elasticsearchDocumentService.removeByQuery(esParam);
+				}
+			}
+			if (tableName.equals("jczz_house")) {
+				HouseEntity houseEntity = new HouseEntity();
+				HouseEntity entity = new HouseEntity();
+				if (parameter instanceof MapperMethod.ParamMap) {
+					entity = (HouseEntity) ((MapperMethod.ParamMap) parameter).get("param1");
+					if (entity != null && entity.getId() != null) {
+						setHouseInfo(houseEntity, entity);
+						esParam.setTableId(entity.getId().toString());
+						elasticsearchDocumentService.update(esParam, entity, EsTableConstant.houseList);
+					}
+				} else {
+					entity = (HouseEntity) parameter;
+					// 删除
+					esParam.setTableId(entity.getId().toString());
+					elasticsearchDocumentService.removeByQuery(esParam);
+				}
+			}
+			if (tableName.equals("jczz_household")) {
+				HouseholdEntity householdEntity = new HouseholdEntity();
+				HouseholdEntity entity = new HouseholdEntity();
+				if (parameter instanceof MapperMethod.ParamMap) {
+					try {
+						entity = (HouseholdEntity) ((MapperMethod.ParamMap) parameter).get("param1");
+						if (entity != null && entity.getId() != null) {
+							setHouseholdInfo(householdEntity, entity);
+							esParam.setTableId(entity.getId().toString());
+							elasticsearchDocumentService.update(esParam, entity, EsTableConstant.householdList);
+						}
+					} catch (Exception e) {
+						entity = (HouseholdEntity) ((MapperMethod.ParamMap) parameter).get("et");
+						if (entity != null && entity.getId() != null) {
+							setHouseholdInfo(householdEntity, entity);
+							esParam.setTableId(entity.getId().toString());
+							elasticsearchDocumentService.update(esParam, entity, EsTableConstant.householdList);
+						}
+					}
+				} else {
+					entity = (HouseholdEntity) parameter;
+					// 删除
+					esParam.setTableId(entity.getId().toString());
+					elasticsearchDocumentService.removeByQuery(esParam);
+				}
+			}
+		}
+		// 删除处理
+		if (sqlType.equals("DELETE")) {
+			if (parameter instanceof MapperMethod.ParamMap) {
+				List<Long> list = (List<Long>) ((MapperMethod.ParamMap) parameter).get("param1");
+				esParam.setTableId(list.get(0).toString());
+				elasticsearchDocumentService.removeByQuery(esParam);
+			}
+		}
+	}
+
+	/**
+	 * 场所值复制
+	 *
+	 * @param entity
+	 * @param placeEntity
+	 */
+	private void setPlaceInfo(PlaceEntity entity, PlaceEntity placeEntity) {
+		entity.setId(placeEntity.getId());
+		entity.setPlaceName(placeEntity.getPlaceName());
+		entity.setPrincipal(placeEntity.getPrincipal());
+		entity.setPrincipalPhone(placeEntity.getPrincipalPhone());
+		entity.setPrincipalIdCard(placeEntity.getPrincipalIdCard());
+		entity.setLocation(placeEntity.getLocation());
+	}
+
+	/**
+	 * 房屋值复制
+	 *
+	 * @param entity
+	 * @param houseEntity
+	 */
+	private void setHouseInfo(HouseEntity entity, HouseEntity houseEntity) {
+		entity.setId(houseEntity.getId());
+		entity.setHouseName(houseEntity.getHouseName());
+	}
+
+	/**
+	 * 住户值复制
+	 *
+	 * @param entity
+	 * @param householdEntity
+	 */
+	private void setHouseholdInfo(HouseholdEntity entity, HouseholdEntity householdEntity) {
+		entity.setId(householdEntity.getId());
+		entity.setName(householdEntity.getName());
+		entity.setPhoneNumber(householdEntity.getPhoneNumber());
+		entity.setIdCard(householdEntity.getIdCard());
+		entity.setCurrentAddress(householdEntity.getCurrentAddress());
+	}
+
+
+	@Override
+	public Object plugin(Object target) {
+		return Plugin.wrap(target, this);
+	}
+
+	@Override
+	public void setProperties(Properties properties) {
+	}
+}
diff --git a/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java b/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
index cbf415b..1652b56 100644
--- a/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
+++ b/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
@@ -36,7 +36,7 @@
 	public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
 		Properties props = System.getProperties();
 		PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));
-		PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "false");
+		PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true");
 		// 开启elk日志
 		//PropsUtil.setProperty(props, "blade.log.elk.destination", LauncherConstant.elkAddr(profile));
 	}
diff --git a/src/main/java/org/springblade/common/node/TreeIntegerNode.java b/src/main/java/org/springblade/common/node/TreeIntegerNode.java
index f95b3de..ace10c7 100644
--- a/src/main/java/org/springblade/common/node/TreeIntegerNode.java
+++ b/src/main/java/org/springblade/common/node/TreeIntegerNode.java
@@ -26,6 +26,12 @@
 	private Integer id;
 
 	/**
+	 * 主键ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Integer ids;
+
+	/**
 	 * 名称
 	 */
 	private String name;
diff --git a/src/main/java/org/springblade/common/node/TreeStringNode.java b/src/main/java/org/springblade/common/node/TreeStringNode.java
index 3836ffb..998e793 100644
--- a/src/main/java/org/springblade/common/node/TreeStringNode.java
+++ b/src/main/java/org/springblade/common/node/TreeStringNode.java
@@ -38,6 +38,11 @@
 	private String aoiCode;
 
 	/**
+	 * 社区编码
+	 */
+	private String neiCode;
+
+	/**
 	 * 门牌类型
 	 */
 	private String doorplateType;
@@ -94,4 +99,8 @@
 	 */
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private Boolean hasChildren;
+	/**
+	 * 无诈类型
+	 */
+	private Integer noExplosionCategory;
 }
diff --git a/src/main/java/org/springblade/common/param/GridSet.java b/src/main/java/org/springblade/common/param/GridSet.java
new file mode 100644
index 0000000..61e81a7
--- /dev/null
+++ b/src/main/java/org/springblade/common/param/GridSet.java
@@ -0,0 +1,98 @@
+package org.springblade.common.param;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springblade.common.cache.SysCache;
+import org.springblade.common.utils.AuthUtils;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.modules.grid.entity.GridEntity;
+import org.springblade.modules.grid.service.IGridService;
+import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
+import org.springblade.modules.police.service.IPoliceAffairsGridService;
+import org.springblade.modules.system.service.IRegionService;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GridSet<T> {
+
+
+	/**
+	 * 获取警格网格的信息
+	 * @param clazz 类对象
+	 * @param t 对象数据
+	 * @param lngKey 经度属性key
+	 * @param latKey 纬度属性key
+	 * @param gridCodeKey 网格属性key
+	 * @param jwGirdCodeKey 警格属性key
+	 * @param <U>
+	 * @return
+	 */
+	public <U> GridSet 	invoke(Class<U> clazz, T t,String lngKey,String latKey,String gridCodeKey,String jwGirdCodeKey) {
+		//获取传入对象信息
+		U u = clazz.cast(t);
+		try {
+			Field lngField = null;
+			Field latField = null;
+			try {
+				lngField = u.getClass().getDeclaredField(lngKey);
+				latField = u.getClass().getDeclaredField(latKey);
+			} catch (NoSuchFieldException e) {
+				lngField = u.getClass().getSuperclass().getDeclaredField(lngKey);
+				latField = u.getClass().getSuperclass().getDeclaredField(latKey);
+			}
+			// 获取点信息
+			lngField.setAccessible(true);
+			latField.setAccessible(true);
+			String lng = lngField.get(t).toString();
+			String lat = latField.get(t).toString();
+			if (!Strings.isBlank(lng)) {
+				// 拼接点
+				String point = "'POINT(" + lng +" " + lat + ")'";
+				// 判断是否分析网格
+				if (!Strings.isBlank(gridCodeKey)) {
+					// 根据位置设置网格,警格编号
+					IGridService gridService = SpringUtils.getBean(IGridService.class);
+					Field gridCodeField = null;
+					try {
+						gridCodeField = u.getClass().getDeclaredField(gridCodeKey);
+					} catch (NoSuchFieldException e) {
+						gridCodeField = u.getClass().getSuperclass().getDeclaredField(gridCodeKey);
+					}
+					//点坐标解析网格
+					List<GridEntity> gridEntityList = gridService.spatialAnalysis(point);
+					if (gridEntityList.size() > 0) {
+						GridEntity gridEntity = gridEntityList.get(0);
+						gridCodeField.setAccessible(true);
+						gridCodeField.set(t, gridEntity.getGridCode());
+					}
+				}
+				// 判断是否分析警格
+				if (!Strings.isBlank(jwGirdCodeKey)) {
+					IPoliceAffairsGridService policeAffairsGridService = SpringUtils.getBean(IPoliceAffairsGridService.class);
+					Field jwGridCodeField = null;
+					try {
+						jwGridCodeField = u.getClass().getDeclaredField(jwGirdCodeKey);
+					} catch (NoSuchFieldException e) {
+						jwGridCodeField = u.getClass().getSuperclass().getDeclaredField(jwGirdCodeKey);
+					}
+					//点坐标解析警格
+					List<PoliceAffairsGridEntity> policeAffairsGridEntityList = policeAffairsGridService.spatialAnalysis(point);
+					if (policeAffairsGridEntityList.size() > 0) {
+						PoliceAffairsGridEntity policeAffairsGridEntity = policeAffairsGridEntityList.get(0);
+						jwGridCodeField.setAccessible(true);
+						jwGridCodeField.set(t, policeAffairsGridEntity.getJwGridCode());
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return this;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/common/param/ToObject.java b/src/main/java/org/springblade/common/param/ToObject.java
new file mode 100644
index 0000000..fccd2b6
--- /dev/null
+++ b/src/main/java/org/springblade/common/param/ToObject.java
@@ -0,0 +1,18 @@
+package org.springblade.common.param;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ToObject {
+
+	public static Map<String,Object> toMap(String... val){
+		Map<String, Object> map = new HashMap<>();
+		for (String value : val) {
+			String[] split = value.split(":");
+			map.put(split[0],split[1]);
+		}
+		return map;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/common/utils/AuthUtils.java b/src/main/java/org/springblade/common/utils/AuthUtils.java
new file mode 100644
index 0000000..d84cd85
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/AuthUtils.java
@@ -0,0 +1,55 @@
+package org.springblade.common.utils;
+
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.StringUtil;
+
+public class AuthUtils extends AuthUtil {
+
+	/**
+	 * 是否为公安管理员
+	 * @return
+	 */
+	public static boolean isGaAdmin() {
+		return StringUtil.containsAny(getUserRole(), new CharSequence[]{"gagly"});
+	}
+
+	/**
+	 * 是否为民警
+	 * @return
+	 */
+	public static boolean isMj(String roleName) {
+		return StringUtil.containsAny(roleName, new CharSequence[]{"mj"});
+	}
+
+	/**
+	 * 是否居民
+	 * @return
+	 */
+	public static boolean isInhabitant(String roleName) {
+		return StringUtil.containsAny(roleName, new CharSequence[]{"inhabitant"});
+	}
+
+	/**
+	 * 是否管理员角色
+	 * @return
+	 */
+	public static boolean isAdmin(String roleName) {
+		return StringUtil.containsAny(roleName, new CharSequence[]{"admin"});
+	}
+
+	/**
+	 * 街道、社区
+	 * @return
+	 */
+	public static boolean isJd(String roleName) {
+		return StringUtil.containsAny(roleName, new CharSequence[]{"jdgly","sqgly"});
+	}
+
+	/**
+	 * 是否超级或者管理员角色
+	 * @return
+	 */
+	public static boolean isAdministratorOrAdmin(String roleName) {
+		return isAdministrator() || isAdmin(roleName);
+	}
+}
diff --git a/src/main/java/org/springblade/common/utils/HttpClientUtils.java b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
new file mode 100644
index 0000000..8e27f08
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/HttpClientUtils.java
@@ -0,0 +1,597 @@
+package org.springblade.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.*;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+import sun.misc.BASE64Encoder;
+
+import javax.net.ssl.SSLContext;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.*;
+
+
+public class HttpClientUtils {
+	/**
+	 * 执行有参GET请求
+	 *
+	 * @param url
+	 * @param params
+	 * @return
+	 */
+	public static String doGet(String url, Map<String, String> params) {
+
+//获取httpclient客户端
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+
+		String resultString = "";
+
+		CloseableHttpResponse response = null;
+
+		try {
+			URIBuilder builder = new URIBuilder(url);
+
+			if (null != params) {
+				for (String key : params.keySet()) {
+					builder.setParameter(key, params.get(key));
+				}
+			}
+
+			HttpGet get = new HttpGet(builder.build());
+
+			response = httpclient.execute(get);
+
+			System.out.println(response.getStatusLine());
+
+			if (200 == response.getStatusLine().getStatusCode()) {
+				HttpEntity entity = response.getEntity();
+				resultString = EntityUtils.toString(entity, "utf-8");
+			}
+
+		} catch (Exception e) {
+
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return resultString;
+	}
+
+	/**
+	 * 执行有参GET请求,带请求头
+	 *
+	 * @param url       请求url
+	 * @param params    参数
+	 * @param key       请求头Key
+	 * @param secretKey 秘钥
+	 * @return
+	 */
+	public static String doGetHeader(String url, String key, String secretKey, Map<String, String> params) {
+
+//获取httpclient客户端
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+
+		String resultString = "";
+
+		CloseableHttpResponse response = null;
+
+		try {
+			URIBuilder builder = new URIBuilder(url);
+
+			if (null != params) {
+				for (String keys : params.keySet()) {
+					builder.addParameter(keys, params.get(keys));
+//builder.setParameter(keys, params.get(keys));
+				}
+			}
+
+			HttpGet httpGet = new HttpGet(builder.build());
+
+//设置请求头
+			httpGet.addHeader(key, secretKey);
+// 传输的类型
+			httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
+//执行Http请求调用
+			response = httpclient.execute(httpGet);
+//判断是否请求成功返回
+			if (200 == response.getStatusLine().getStatusCode()) {
+				HttpEntity entity = response.getEntity();
+				resultString = EntityUtils.toString(entity, "utf-8");
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return resultString;
+	}
+
+	/**
+	 * 执行有参GET请求,带请求头,接收图片流
+	 *
+	 * @param url       请求url
+	 * @param params    参数
+	 * @param key       请求头Key
+	 * @param secretKey 秘钥
+	 * @return
+	 */
+	public static String doGetHeaderPictureBase64(String url, String key, String secretKey, Map<String, String> params) {
+
+//获取httpclient客户端
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+		String resultString = "";
+		CloseableHttpResponse response = null;
+		try {
+			URIBuilder builder = new URIBuilder(url);
+			if (null != params) {
+				for (String keys : params.keySet()) {
+					builder.addParameter(keys, params.get(keys));
+				}
+			}
+			HttpGet httpGet = new HttpGet(builder.build());
+//设置请求头
+			httpGet.addHeader(key, secretKey);
+// 传输的类型
+			httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");
+//执行Http请求调用
+			response = httpclient.execute(httpGet);
+// 将返回的图片或者文件转化成字节数组的形式
+			byte[] data = EntityUtils.toByteArray(response.getEntity());
+			BASE64Encoder encoder = new BASE64Encoder();
+//String imageBase64 = "data:image/png;base64," + encoder.encodeBuffer(data).trim();
+			return encoder.encodeBuffer(data).trim().replaceAll("\n", "").replaceAll("\r", "").replaceAll(" ", "");//删除 \r\n
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return resultString;
+	}
+
+	/**
+	 * 执行无参GET请求
+	 *
+	 * @param url
+	 * @return
+	 */
+	public static String doGet(String url) {
+		return doGet(url, null);
+	}
+
+	/**
+	 * 执行有参POST请求
+	 *
+	 * @param url
+	 * @param params
+	 * @return
+	 */
+	public static String doPost(String url, Map<String, String> params) {
+/**
+ * 在4.0及以上httpclient版本中,post需要指定重定向的策略,如果不指定则按默认的重定向策略。
+ *
+ * 获取httpclient客户端
+ */
+		CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
+
+		String resultString = "";
+
+		CloseableHttpResponse response = null;
+
+		try {
+
+
+			HttpPost post = new HttpPost(url);
+
+			List<NameValuePair> paramaters = new ArrayList<>();
+
+			if (null != params) {
+				for (String key : params.keySet()) {
+					paramaters.add(new BasicNameValuePair(key, params.get(key)));
+				}
+// 构造一个form表单式的实体
+				UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(paramaters);
+// 将请求实体设置到httpPost对象中
+				post.setEntity(formEntity);
+			}
+
+
+/**
+ * HTTP/1.1 403 Forbidden
+ *   原因:
+ *      有些网站,设置了反爬虫机制
+ *   解决的办法:
+ *      设置请求头,伪装浏览器
+ */
+			post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+
+			response = httpclient.execute(post);
+
+			System.out.println(response.getStatusLine());
+
+			if (200 == response.getStatusLine().getStatusCode()) {
+				HttpEntity entity = response.getEntity();
+				resultString = EntityUtils.toString(entity, "utf-8");
+			}
+
+		} catch (Exception e) {
+
+			e.printStackTrace();
+		} finally {
+			if (null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (null != httpclient) {
+				try {
+					httpclient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return resultString;
+	}
+
+	public static String doPost(String url) {
+		return doPost(url, null);
+	}
+
+
+	public static void main(String[] args) {
+
+		Map<String, String> params = new HashMap<>();
+		params.put("scope", "project");
+		params.put("q", "数据库");
+//
+//    System.out.println(doGet("http://www.baidu.com/s",params));
+
+		/**
+		 * 有一部分网站,禁止爬虫技术访问网站。
+		 *
+		 * 解决方案:
+		 *    伪装浏览器
+		 *    post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+		 */
+		System.out.println(doPost("http://www.oschina.net/search", params));
+	}
+
+	/**
+	 * post 请求 header 带 秘钥
+	 *
+	 * @param url
+	 * @param appKey
+	 * @param appKeyValue
+	 * @param map
+	 * @return
+	 */
+	public static String httpPost(String url, String appKey, String appKeyValue, Map<String, String> map) {
+// 返回body
+		String body = null;
+// 获取连接客户端工具
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		CloseableHttpResponse httpResponse = null;
+// 2、创建一个HttpPost请求
+		HttpPost post = new HttpPost(url);
+// 5、设置header信息
+		/**header中通用属性*/
+//        post.setHeader("Accept", "*/*");
+//        post.setHeader("Accept-Encoding", "gzip, deflate");
+//        post.setHeader("Cache-Control", "no-cache");
+//        post.setHeader("Connection", "keep-alive");
+		post.setHeader("Content-Type", "application/json;charset=UTF-8");
+/**业务参数*/
+		post.setHeader(appKey, appKeyValue);
+// 设置参数
+		if (map != null) {
+			try {
+				StringEntity entity1 = new StringEntity(JSON.toJSONString(map), "UTF-8");
+				entity1.setContentEncoding("UTF-8");
+				entity1.setContentType("json/form-data");
+				post.setEntity(entity1);
+
+// 7、执行post请求操作,并拿到结果
+				httpResponse = httpClient.execute(post);
+// 获取结果实体
+				HttpEntity entity = httpResponse.getEntity();
+				if (entity != null) {
+// 按指定编码转换结果实体为String类型
+					body = EntityUtils.toString(entity, "UTF-8");
+				}
+				try {
+					httpResponse.close();
+					httpClient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return body;
+	}
+
+	public static SSLContext createIgnoreVerifySSL() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
+
+		SSLContext sc = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+
+			public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+				return true;
+			}
+
+		}).build();
+
+		return sc;
+	}
+
+	//适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
+	public static String postParams(String url, String appKey, Map<String, String> map) {
+		SSLContext sslcontext = null;
+		try {
+			sslcontext = createIgnoreVerifySSL();
+		} catch (KeyManagementException e) {
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		} catch (KeyStoreException e) {
+			e.printStackTrace();
+		}
+// 设置协议http和https对应的处理socket链接工厂的对象
+		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+			.register("http", PlainConnectionSocketFactory.INSTANCE)
+			.register("https", new SSLConnectionSocketFactory(sslcontext))
+			.build();
+		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+
+//创建自定义的httpclient对象
+		CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
+		HttpPost post = new HttpPost(url);
+		post.setHeader("appKey", appKey);
+		CloseableHttpResponse res = null;
+		try {
+			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			Set<String> keySet = map.keySet();
+			for (String key : keySet) {
+				nvps.add(new BasicNameValuePair(key, map.get(key)));
+			}
+			post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+			res = client.execute(post);
+			HttpEntity entity = res.getEntity();
+			return EntityUtils.toString(entity, "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				res.close();
+				client.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return "";
+	}
+
+
+	//适用于post请求并传送form-data数据(同样适用于post的Raw类型的application-json格式)
+	public static String postParams(String url, Map<String, Object> map) {
+		SSLContext sslcontext = null;
+		try {
+			sslcontext = createIgnoreVerifySSL();
+		} catch (KeyManagementException e) {
+			e.printStackTrace();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		} catch (KeyStoreException e) {
+			e.printStackTrace();
+		}
+// 设置协议http和https对应的处理socket链接工厂的对象
+		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+			.register("http", PlainConnectionSocketFactory.INSTANCE)
+			.register("https", new SSLConnectionSocketFactory(sslcontext))
+			.build();
+		PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+
+//创建自定义的httpclient对象
+		CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
+		HttpPost post = new HttpPost(url);
+//		post.setHeader(appKey, appKeyValue);
+		CloseableHttpResponse res = null;
+		try {
+			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+			Set<String> keySet = map.keySet();
+			for (String key : keySet) {
+				nvps.add(new BasicNameValuePair(key, map.get(key).toString()));
+			}
+			post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+			res = client.execute(post);
+			HttpEntity entity = res.getEntity();
+			return EntityUtils.toString(entity, "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				res.close();
+				client.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 向指定 URL 发送POST方法的请求
+	 *
+	 * @param url    发送请求的 URL
+	 * @param params 请求的参数集合
+	 * @return 远程资源的响应结果
+	 */
+	@SuppressWarnings("unused")
+	public static String sendPost(String url, Map<String, String> params) {
+		OutputStreamWriter out = null;
+		BufferedReader in = null;
+		StringBuilder result = new StringBuilder();
+		try {
+			URL realUrl = new URL(url);
+			HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
+// 发送POST请求必须设置如下两行
+			conn.setDoOutput(true);
+			conn.setDoInput(true);
+// POST方法
+			conn.setRequestMethod("POST");
+// 设置通用的请求属性
+			conn.setRequestProperty("accept", "*/*");
+			conn.setRequestProperty("connection", "Keep-Alive");
+			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+			conn.connect();
+// 获取URLConnection对象对应的输出流
+			out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
+// 发送请求参数
+			if (params != null) {
+				StringBuilder param = new StringBuilder();
+				for (Map.Entry<String, String> entry : params.entrySet()) {
+					if (param.length() > 0) {
+						param.append("&");
+					}
+					param.append(entry.getKey());
+					param.append("=");
+					param.append(entry.getValue());
+// System.out.println(entry.getKey()+":"+entry.getValue());
+				}
+// System.out.println("param:"+param.toString());
+				out.write(param.toString());
+			}
+// flush输出流的缓冲
+			out.flush();
+// 定义BufferedReader输入流来读取URL的响应
+			in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+			String line;
+			while ((line = in.readLine()) != null) {
+				result.append(line);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+// 使用finally块来关闭输出流、输入流
+		finally {
+			try {
+				if (out != null) {
+					out.close();
+				}
+				if (in != null) {
+					in.close();
+				}
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+		}
+		return result.toString();
+	}
+
+
+	/**
+	 * json  body
+	 *
+	 * @param url
+	 * @param json
+	 * @return
+	 * @throws IOException
+	 */
+	public static String httpPostWithjson(String url, String json) throws IOException {
+		String result = "";
+		HttpPost httpPost = new HttpPost(url);
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		try {
+			BasicResponseHandler handler = new BasicResponseHandler();
+			//解决中文乱码问题
+			StringEntity entity = new StringEntity(json, "utf-8");
+			entity.setContentEncoding("UTF-8");
+			entity.setContentType("application/json");
+			httpPost.setEntity(entity);
+			result = httpClient.execute(httpPost, handler);
+			return result;
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				httpClient.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return result;
+	}
+}
+
+
diff --git a/src/main/java/org/springblade/common/utils/HttpUtils.java b/src/main/java/org/springblade/common/utils/HttpUtils.java
new file mode 100644
index 0000000..e1fde41
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/HttpUtils.java
@@ -0,0 +1,39 @@
+package org.springblade.common.utils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+
+
+public class HttpUtils {
+
+    /**
+     * 将通知参数转化为字符串
+     * @param request
+     * @return
+     */
+    public static String readData(HttpServletRequest request) {
+        BufferedReader br = null;
+        try {
+            StringBuilder result = new StringBuilder();
+            br = request.getReader();
+            for (String line; (line = br.readLine()) != null; ) {
+                if (result.length() > 0) {
+                    result.append("\n");
+                }
+                result.append(line);
+            }
+            return result.toString();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/springblade/common/utils/ImageUtils.java b/src/main/java/org/springblade/common/utils/ImageUtils.java
index 0fcf2c4..a0af0b6 100644
--- a/src/main/java/org/springblade/common/utils/ImageUtils.java
+++ b/src/main/java/org/springblade/common/utils/ImageUtils.java
@@ -8,6 +8,7 @@
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
@@ -16,6 +17,44 @@
 
 public class ImageUtils {
 
+	/**
+	 * 几种常见的图片格式
+	 */
+	public static String IMAGE_TYPE_GIF = "gif";// 图形交换格式
+	public static String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组
+	public static String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组
+	public static String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式
+	public static String IMAGE_TYPE_PNG = "png";// 可移植网络图形
+	public static String IMAGE_TYPE_PSD = "psd";// Photoshop的专用格式Photoshop
+
+
+	/**
+	 * 程序入口:用于测试
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		// -图像类型转换:
+		ImageUtils.convert("D:/IMG_20180811_222034.png", "jpg", "D:/test.jpg");//测试OK
+	}
+
+	/**
+	 * 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG
+	 * @param srcImageFile 源图像地址
+	 * @param formatName 包含格式非正式名称的 String:如JPG、JPEG、GIF等
+	 * @param destImageFile 目标图像地址
+	 */
+	public static void convert(String srcImageFile, String formatName, String destImageFile) {
+		try {
+			File f = new File(srcImageFile);
+			f.canRead();
+			f.canWrite();
+			BufferedImage src = ImageIO.read(f);
+			ImageIO.write(src, formatName, new File(destImageFile));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
 
 
 	public static String getBase64ByImgUrl(String url){
diff --git a/src/main/java/org/springblade/common/utils/NodeTreeUtil.java b/src/main/java/org/springblade/common/utils/NodeTreeUtil.java
index a1d824e..5e40a9c 100644
--- a/src/main/java/org/springblade/common/utils/NodeTreeUtil.java
+++ b/src/main/java/org/springblade/common/utils/NodeTreeUtil.java
@@ -6,10 +6,8 @@
 import org.springblade.core.tool.node.TreeNode;
 import org.springblade.modules.system.node.DeptUserTreeNode;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * node tree 工具类
@@ -110,6 +108,10 @@
 
 	/**
 	 * map 转 tree 组织机构(父子id不会重复的情况,数据查询来自同一个表)
+	 *
+	 * 把部门用户树遍历一遍,每个值,查询他的parentId在不在用户部门树中。如果存在,就把这个加在下级
+	 * 最后最上级的parentId肯定不在用户部门树中,把最上级的加到新树里。返回新树
+	 *
 	 * @param treeMap
 	 * @return
 	 */
@@ -117,18 +119,25 @@
 		List<DeptUserTreeNode> tree = new ArrayList<>();
 		if (treeMap.size() > 1) {
 			treeMap.forEach((id, treeNode) -> {
+				//是否有下级
 				if (!treeNode.getHasChildren()){
-					// 判断是否有绑定多个部门
+					// 多个部门拆分
 					List<String> asList = Arrays.asList(treeNode.getParentId().split(","));
+					//有多部门
 					if (asList.size()>1){
 						for (String parentId : asList) {
+							//用户部门树中存在该部门
 							if (treeMap.containsKey(parentId)) {
+
+								//把该对象放在该部门下
 								treeMap.get(parentId).getChildren().add(treeNode);
 							} else {
+								//不存在该部门,在新的树中加入
 								tree.add(treeNode);
 							}
 						}
 					}else {
+
 						if (treeMap.containsKey(treeNode.getParentId())) {
 							DeptUserTreeNode deptUserTreeNode =treeMap.get(treeNode.getParentId());
 							deptUserTreeNode.getChildren().add(treeNode);
@@ -137,6 +146,7 @@
 						}
 					}
 				}else {
+					//有下级
 					if (treeMap.containsKey(treeNode.getParentId())) {
 						treeMap.get(treeNode.getParentId()).getChildren().add(treeNode);
 					} else {
@@ -145,6 +155,7 @@
 				}
 			});
 		}
+
 		return tree;
 	}
 }
diff --git a/src/main/java/org/springblade/common/utils/ParseMail.java b/src/main/java/org/springblade/common/utils/ParseMail.java
new file mode 100644
index 0000000..db2d2b5
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/ParseMail.java
@@ -0,0 +1,253 @@
+package org.springblade.common.utils;
+
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.internet.MimeUtility;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class ParseMail {
+	/**
+	 * 删除邮件
+	 *
+	 * @param messages 要解析的邮件列表
+	 */
+	public static void deleteMessage(Message... messages) throws MessagingException, IOException {
+		if (messages == null || messages.length < 1)
+			throw new MessagingException("未找到要解析的邮件!");
+
+		// 解析所有邮件
+		for (int i = 0, count = messages.length; i < count; i++) {
+
+			/**
+			 *   邮件删除
+			 */
+			Message message = messages[i];
+			String subject = message.getSubject();
+			// set the DELETE flag to true
+			message.setFlag(Flags.Flag.DELETED, true);
+			System.out.println("Marked DELETE for message: " + subject);
+
+
+		}
+	}
+
+	/**
+	 * 获得邮件主题
+	 *
+	 * @param msg 邮件内容
+	 * @return 解码后的邮件主题
+	 */
+	public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {
+		return MimeUtility.decodeText(msg.getSubject());
+	}
+
+	/**
+	 * 获得邮件发件人
+	 *
+	 * @param msg 邮件内容
+	 * @return 姓名 <Email地址>
+	 * @throws MessagingException
+	 * @throws UnsupportedEncodingException
+	 */
+	public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
+		String from = "";
+		Address[] froms = msg.getFrom();
+		if (froms.length < 1)
+			throw new MessagingException("没有发件人!");
+
+		InternetAddress address = (InternetAddress) froms[0];
+		String person = address.getPersonal();
+		if (person != null) {
+			person = MimeUtility.decodeText(person) + " ";
+		} else {
+			person = "";
+		}
+		from = person + "<" + address.getAddress() + ">";
+
+		return from;
+	}
+
+	/**
+	 * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
+	 * <p>Message.RecipientType.TO  收件人</p>
+	 * <p>Message.RecipientType.CC  抄送</p>
+	 * <p>Message.RecipientType.BCC 密送</p>
+	 *
+	 * @param msg  邮件内容
+	 * @param type 收件人类型
+	 * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
+	 * @throws MessagingException
+	 */
+	public static String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {
+		StringBuffer receiveAddress = new StringBuffer();
+		Address[] addresss = null;
+		if (type == null) {
+			addresss = msg.getAllRecipients();
+		} else {
+			addresss = msg.getRecipients(type);
+		}
+
+		if (addresss == null || addresss.length < 1)
+			return null;
+		for (Address address : addresss) {
+			InternetAddress internetAddress = (InternetAddress) address;
+			receiveAddress.append(internetAddress.toUnicodeString()).append(",");
+		}
+
+		receiveAddress.deleteCharAt(receiveAddress.length() - 1); //删除最后一个逗号
+
+		return receiveAddress.toString();
+	}
+
+	/**
+	 * 获得邮件发送时间
+	 *
+	 * @param msg 邮件内容
+	 * @return yyyy年mm月dd日 星期X HH:mm
+	 * @throws MessagingException
+	 */
+	public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
+		Date receivedDate = msg.getSentDate();
+		if (receivedDate == null)
+			return "";
+
+		if (pattern == null || "".equals(pattern))
+			pattern = "yyyy/MM/dd HH:mm ";
+
+		return new SimpleDateFormat(pattern).format(receivedDate);
+	}
+
+	/**
+	 * 判断邮件中是否包含附件
+	 *
+	 * @return 邮件中存在附件返回true,不存在返回false
+	 * @throws MessagingException
+	 * @throws IOException
+	 */
+	public static boolean isContainAttachment(Part part) throws MessagingException, IOException {
+		boolean flag = false;
+		if (part.isMimeType("multipart/*")) {
+			MimeMultipart multipart = (MimeMultipart) part.getContent();
+			int partCount = multipart.getCount();
+			for (int i = 0; i < partCount; i++) {
+				BodyPart bodyPart = multipart.getBodyPart(i);
+				String disp = bodyPart.getDisposition();
+				if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
+					flag = true;
+				} else if (bodyPart.isMimeType("multipart/*")) {
+					flag = isContainAttachment(bodyPart);
+				} else {
+					String contentType = bodyPart.getContentType();
+					if (contentType.indexOf("application") != -1) {
+						flag = true;
+					}
+
+					if (contentType.indexOf("name") != -1) {
+						flag = true;
+					}
+				}
+
+				if (flag) break;
+			}
+		} else if (part.isMimeType("message/rfc822")) {
+			flag = isContainAttachment((Part) part.getContent());
+		}
+		return flag;
+	}
+
+	/**
+	 * 判断邮件是否已读
+	 *
+	 * @param msg 邮件内容
+	 * @return 如果邮件已读返回true, 否则返回false
+	 * @throws MessagingException
+	 */
+	public static boolean isSeen(MimeMessage msg) throws MessagingException {
+		return msg.getFlags().contains(Flags.Flag.SEEN);
+	}
+
+	/**
+	 * 判断邮件是否需要阅读回执
+	 *
+	 * @param msg 邮件内容
+	 * @return 需要回执返回true, 否则返回false
+	 * @throws MessagingException
+	 */
+	public static boolean isReplySign(MimeMessage msg) throws MessagingException {
+		boolean replySign = false;
+		String[] headers = msg.getHeader("Disposition-Notification-To");
+		if (headers != null)
+			replySign = true;
+		return replySign;
+	}
+
+	/**
+	 * 获得邮件的优先级
+	 *
+	 * @param msg 邮件内容
+	 * @return 1(High):紧急  3:普通(Normal)  5:低(Low)
+	 * @throws MessagingException
+	 */
+	public static String getPriority(MimeMessage msg) throws MessagingException {
+		String priority = "普通";
+		String[] headers = msg.getHeader("X-Priority");
+		if (headers != null) {
+			String headerPriority = headers[0];
+			if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
+				priority = "紧急";
+			else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
+				priority = "低";
+			else
+				priority = "普通";
+		}
+		return priority;
+	}
+
+
+
+	public static String getTextMultipart(Part part) throws Exception{
+		if(part.isMimeType("text/html")){
+			String content = (String) part.getContent();
+			return content;
+		}else if(part.isMimeType("text/plain")){
+			String content = (String) part.getContent();
+			return content;
+		}
+		return "";
+	}
+
+	/**
+	 * 获得邮件文本内容
+	 *
+	 * @param part    邮件体
+	 * @param content 存储邮件文本内容的字符串
+	 * @throws MessagingException
+	 * @throws IOException
+	 */
+	public static void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
+		// 如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
+		boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
+		if (part.isMimeType("text/*") && !isContainTextAttach) {
+			content.append(part.getContent().toString());
+		} else if (part.isMimeType("message/rfc822")) {
+			getMailTextContent((Part) part.getContent(), content);
+		} else if (part.isMimeType("multipart/*")) {
+			Object mpart = part.getContent();
+			if (mpart instanceof Multipart) {
+				Multipart multipart = (Multipart) part.getContent();
+				int partCount = multipart.getCount();
+				for (int i = 0; i < partCount; i++) {
+					BodyPart bodyPart = multipart.getBodyPart(i);
+					getMailTextContent(bodyPart, content);
+				}
+			}
+		}
+	}
+}
+
diff --git a/src/main/java/org/springblade/common/utils/RoleUtil.java b/src/main/java/org/springblade/common/utils/RoleUtil.java
new file mode 100644
index 0000000..49964e8
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/RoleUtil.java
@@ -0,0 +1,31 @@
+package org.springblade.common.utils;
+
+import java.util.UUID;
+
+public class RoleUtil {
+
+
+	/**
+	 * 判断是否物业人员
+	 *
+	 * @return
+	 */
+	public static boolean isProperty(String userRole) {
+		if (userRole.contains("wygly") || userRole.contains("wyxmjl") || userRole.contains("wyfwry")) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * 判断是否网格人员
+	 *
+	 * @return
+	 */
+	public static boolean isWgy(String userRole) {
+		if (userRole.contains("wgy")) {
+			return true;
+		}
+		return false;
+	}
+}
diff --git a/src/main/java/org/springblade/common/utils/SQLParseUtils.java b/src/main/java/org/springblade/common/utils/SQLParseUtils.java
new file mode 100644
index 0000000..d8e934d
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/SQLParseUtils.java
@@ -0,0 +1,41 @@
+package org.springblade.common.utils;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+public class SQLParseUtils {
+
+	public static String parseSQLType(String sql){
+		if (sql==null){
+			return null;
+		}
+		String type = sql.split(" ")[0];
+		if (type.equalsIgnoreCase("INSERT")){
+			return "INSERT";
+		} else if (type.equalsIgnoreCase("UPDATE")) {
+			return "UPDATE";
+		} else if (type.equalsIgnoreCase("DELETE")) {
+			return "DELETE";
+		}else {
+			return null;
+		}
+	}
+
+	public static String getTableName(String sql) {
+
+		String tableName = null;
+		// 正则表达式匹配 INSERT、UPDATE 和 DELETE 语句
+		String regex = "(?i)(?:INSERT\\s+INTO|UPDATE|DELETE\\s+FROM)\\s+(\\w+)";
+		Pattern pattern = Pattern.compile(regex);
+		Matcher matcher = pattern.matcher(sql.trim());
+		if (matcher.find()) {
+			tableName = matcher.group(1);
+		}
+		return tableName;
+	}
+	public static void main(String[] args) {
+		String tableName = getTableName("INSERT INTO orders (customer_id, product_id, quantity) VALUES (789, 123, 5)");
+		System.out.println(tableName);
+	}
+
+}
+
diff --git a/src/main/java/org/springblade/common/utils/SmsUtils.java b/src/main/java/org/springblade/common/utils/SmsUtils.java
new file mode 100644
index 0000000..288aae1
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/SmsUtils.java
@@ -0,0 +1,127 @@
+package org.springblade.common.utils;
+
+import liquibase.repackaged.org.apache.commons.lang3.text.StrSubstitutor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SmsUtils {
+
+	private static Logger logger = LoggerFactory.getLogger(SmsUtils.class);
+
+	public static String buildRequestXMLString(String id, String pwd, String serviceid, String phone, String content) {
+		StringBuffer sb = new StringBuffer();
+
+		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
+			.append("<svc_init ver=\"2.0.0\">")
+			.append("<sms ver=\"2.0.0\">")
+			.append("<client>")
+			.append("<id>").append(id).append("</id>")
+			.append("<pwd>").append(pwd).append("</pwd>")
+			.append("<serviceid>").append(serviceid).append("</serviceid>")
+			.append("</client>")
+			.append("<sms_info>")
+			.append("<phone>").append(phone).append("</phone>")
+			.append("<content>").append(content).append("</content>")
+			.append("</sms_info>")
+			.append("</sms>")
+			.append(" </svc_init>");
+
+		logger.info("buildRequestXMLString:" + sb.toString());
+		return sb.toString();
+	}
+
+	public static String postXMLSendSMSRequest(String servletUrl, String content) {
+		String result = null;
+
+		BufferedReader br = null;
+		OutputStreamWriter out = null;
+		HttpURLConnection con = null;
+
+		try {
+			URL url = new URL(servletUrl);
+
+			con = (HttpURLConnection) url.openConnection();
+			con.setDoOutput(true);
+			con.setRequestMethod("POST");
+
+			out = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
+
+			out.write(content);
+
+			out.flush();
+
+			br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
+
+			String line = null;
+
+			StringBuilder sb = new StringBuilder();
+
+			while ((line = br.readLine()) != null) {
+				sb.append(line);
+			}
+
+			result = sb.toString();
+
+			System.out.println(result);
+			logger.info("postXMLSendSMSRequest:" + result);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (br != null) {
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+
+			if (out != null) {
+				try {
+					out.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+
+			if (con != null) {
+				con.disconnect();
+				con = null;
+			}
+		}
+
+		return result;
+	}
+
+
+	public static void send(String phone, Map<String, String> content) {
+
+		StrSubstitutor strSubstitutor = new StrSubstitutor(content);
+		String url3 = "【上饶基层自治】您正在验证投票操作,验证码:${code}。如非本人操作,则密码可能已泄露,建议立即修改密码或联系客服。";
+		String context3 = strSubstitutor.replace(url3);
+		String MAS_ID = "182";
+		String PASSWORD = "bYcLgYwXOZspDzEnaGsNHAGUykKEiexknHY9H98xVTQ8Zbeya8bexQ==";
+		String reqXML = buildRequestXMLString(MAS_ID, PASSWORD, "", phone, context3);
+		postXMLSendSMSRequest("http://218.204.110.232:8080/emc/HttpSendSMSService", reqXML);
+	}
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		//下面的MAS_ID、PASSWORD仅供测试使用,正式使用由移动公司分配
+		String MAS_ID = "182";
+		String PASSWORD = "bYcLgYwXOZspDzEnaGsNHAGUykKEiexknHY9H98xVTQ8Zbeya8bexQ==";
+		String reqXML = buildRequestXMLString(MAS_ID, PASSWORD, "", "18720768376", "测试短信");
+		postXMLSendSMSRequest("http://218.204.110.232:8080/emc/HttpSendSMSService", reqXML);
+	}
+}
+
diff --git a/src/main/java/org/springblade/common/utils/SpinLockUtil.java b/src/main/java/org/springblade/common/utils/SpinLockUtil.java
new file mode 100644
index 0000000..b627c96
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/SpinLockUtil.java
@@ -0,0 +1,55 @@
+package org.springblade.common.utils;
+
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.LockSupport;
+
+@Component
+public class SpinLockUtil {
+	@Autowired
+	private BladeRedis bladeRedis;
+
+	private static final String LOCK_PREFIX = "thread-safe-lock:";
+	private static final Long DEFAULT_LOCK_TIMEOUT = 6L; // 默认锁超时时间,单位:秒
+
+
+	/**
+	 * 尝试获取锁,如果获取失败则自旋等待。
+	 *
+	 * @param lockKey 锁的键
+	 * @return 是否成功获取锁
+	 */
+	public boolean tryLock(String lockKey) {
+		String threadId = Thread.currentThread().getName() + Thread.currentThread().getId(); // 使用线程名和ID作为标识
+		long startTime = System.currentTimeMillis();
+		while (System.currentTimeMillis() - startTime < DEFAULT_LOCK_TIMEOUT * 1000) {
+			if (bladeRedis.getRedisTemplate().opsForValue().setIfAbsent(LOCK_PREFIX + lockKey, threadId,
+				DEFAULT_LOCK_TIMEOUT, TimeUnit.SECONDS)) {
+				return true;
+			}
+			// 短暂休眠,避免高并发下的CPU过度消耗
+			LockSupport.parkNanos(100_000_000L); // 使用LockSupport进行更细粒度的暂停,单位为纳秒
+		}
+		return false;
+	}
+
+	/**
+	 * 释放锁,只有加锁的线程才能解锁
+	 *
+	 * @param lockKey 锁的键
+	 * @return 是否成功释放锁
+	 */
+	public boolean unlock(String lockKey) {
+		String threadId = Thread.currentThread().getName() + Thread.currentThread().getId();
+		String currentValue = (String) bladeRedis.getRedisTemplate().opsForValue().get(LOCK_PREFIX + lockKey);
+		if (threadId.equals(currentValue)) {
+			bladeRedis.getRedisTemplate().delete(LOCK_PREFIX + lockKey);
+			return true;
+		}
+		return false; // 如果不是当前线程持有的锁,则返回false,不进行解锁操作
+	}
+
+}
diff --git a/src/main/java/org/springblade/common/utils/ThreadPoolUtil.java b/src/main/java/org/springblade/common/utils/ThreadPoolUtil.java
new file mode 100644
index 0000000..24700aa
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/ThreadPoolUtil.java
@@ -0,0 +1,40 @@
+package org.springblade.common.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+
+@Component
+public class ThreadPoolUtil {
+
+	// 指定Ben名称注入
+	@Qualifier("customThreadPool")
+	@Autowired
+	private ThreadPoolTaskExecutor executor;
+
+	// @Autowired
+	// public ThreadPoolUtil(ThreadPoolTaskExecutor executor) {
+	// 	this.executor = executor;
+	// }
+
+	/**
+	 * 提交一个Runnable任务到线程池执行
+	 * @param task 要执行的任务
+	 */
+	public void execute(Runnable task) {
+		executor.execute(task);
+	}
+
+	/**
+	 * 提交一个Callable任务到线程池执行,并返回Future对象用于获取结果
+	 * @param task 要执行的任务
+	 * @return Future对象
+	 */
+	public <T> Future<T> submit(Callable<T> task) {
+		return executor.submit(task);
+	}
+}
diff --git a/src/main/java/org/springblade/common/utils/UtilRandom.java b/src/main/java/org/springblade/common/utils/UtilRandom.java
new file mode 100644
index 0000000..ced5efe
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/UtilRandom.java
@@ -0,0 +1,7 @@
+package org.springblade.common.utils;
+
+public class UtilRandom {
+	public static Integer randomCount(Integer start, Integer end) {
+		return (int) (Math.random() * (end - start + 1) + start);
+	}
+}
diff --git a/src/main/java/org/springblade/common/utils/WechatPay2ValidatorForRequest.java b/src/main/java/org/springblade/common/utils/WechatPay2ValidatorForRequest.java
new file mode 100644
index 0000000..ee2210f
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/WechatPay2ValidatorForRequest.java
@@ -0,0 +1,114 @@
+package org.springblade.common.utils;
+
+
+import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.time.DateTimeException;
+import java.time.Duration;
+import java.time.Instant;
+
+import static com.wechat.pay.contrib.apache.httpclient.constant.WechatPayHttpHeaders.*;
+
+/**
+ * @author xy-peng
+ */
+public class WechatPay2ValidatorForRequest {
+
+    protected static final Logger log = LoggerFactory.getLogger(WechatPay2ValidatorForRequest.class);
+    /**
+     * 应答超时时间,单位为分钟
+     */
+    protected static final long RESPONSE_EXPIRED_MINUTES = 5;
+    protected final Verifier verifier;
+    protected final String requestId;
+    protected final String body;
+
+
+    public WechatPay2ValidatorForRequest(Verifier verifier, String requestId, String body) {
+        this.verifier = verifier;
+        this.requestId = requestId;
+        this.body = body;
+    }
+
+    protected static IllegalArgumentException parameterError(String message, Object... args) {
+        message = String.format(message, args);
+        return new IllegalArgumentException("parameter error: " + message);
+    }
+
+    protected static IllegalArgumentException verifyFail(String message, Object... args) {
+        message = String.format(message, args);
+        return new IllegalArgumentException("signature verify fail: " + message);
+    }
+
+    public final boolean validate(HttpServletRequest request) throws IOException {
+        try {
+            //处理请求参数
+            validateParameters(request);
+
+            //构造验签名串
+            String message = buildMessage(request);
+
+            String serial = request.getHeader(WECHAT_PAY_SERIAL);
+            String signature = request.getHeader(WECHAT_PAY_SIGNATURE);
+
+            //验签
+            if (!verifier.verify(serial, message.getBytes(StandardCharsets.UTF_8), signature)) {
+                throw verifyFail("serial=[%s] message=[%s] sign=[%s], request-id=[%s]",
+                        serial, message, signature, requestId);
+            }
+        } catch (IllegalArgumentException e) {
+            log.warn(e.getMessage());
+            return false;
+        }
+
+        return true;
+    }
+
+    protected final void validateParameters(HttpServletRequest request) {
+
+        // NOTE: ensure HEADER_WECHAT_PAY_TIMESTAMP at last
+        String[] headers = {WECHAT_PAY_SERIAL, WECHAT_PAY_SIGNATURE, WECHAT_PAY_NONCE, WECHAT_PAY_TIMESTAMP};
+
+        String header = null;
+        for (String headerName : headers) {
+            header = request.getHeader(headerName);
+            if (header == null) {
+                throw parameterError("empty [%s], request-id=[%s]", headerName, requestId);
+            }
+        }
+
+        //判断请求是否过期
+        String timestampStr = header;
+        try {
+            Instant responseTime = Instant.ofEpochSecond(Long.parseLong(timestampStr));
+            // 拒绝过期请求
+            if (Duration.between(responseTime, Instant.now()).abs().toMinutes() >= RESPONSE_EXPIRED_MINUTES) {
+                throw parameterError("timestamp=[%s] expires, request-id=[%s]", timestampStr, requestId);
+            }
+        } catch (DateTimeException | NumberFormatException e) {
+            throw parameterError("invalid timestamp=[%s], request-id=[%s]", timestampStr, requestId);
+        }
+    }
+
+    protected final String buildMessage(HttpServletRequest request) throws IOException {
+        String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);
+        String nonce = request.getHeader(WECHAT_PAY_NONCE);
+        return timestamp + "\n"
+                + nonce + "\n"
+                + body + "\n";
+    }
+
+    protected final String getResponseBody(CloseableHttpResponse response) throws IOException {
+        HttpEntity entity = response.getEntity();
+        return (entity != null && entity.isRepeatable()) ? EntityUtils.toString(entity) : "";
+    }
+
+}
diff --git a/src/main/java/org/springblade/common/utils/WeiXinSecurityUtil.java b/src/main/java/org/springblade/common/utils/WeiXinSecurityUtil.java
new file mode 100644
index 0000000..675d02a
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/WeiXinSecurityUtil.java
@@ -0,0 +1,321 @@
+package org.springblade.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.io.FileUtils;
+import java.awt.image.BufferedImage;
+import javax.imageio.ImageIO;
+import net.coobird.thumbnailator.Thumbnails;
+
+/**
+ * 微信安全检验工具类
+ */
+public class WeiXinSecurityUtil {
+	private static Integer IMG_WIDTH = 750;
+	private static Integer IMG_HEIGHT = 1334;
+	/**
+	 * 图片检测接口
+	 */
+	private static String IMG_SEC_URL = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=";
+
+	//获取wxAccessToken
+	private static String WX_GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
+
+	private static String WX_APP_ID = "wx41aa8a5d2e565a05";
+	private static String WX_SECRET = "e0e9218ac368cd4ca620ff4c7030f468";
+
+	/**
+	 * 恶意图片过滤-校验图片是否含有违法违规内容
+	 * MultipartFile multipartFile, String accessToken
+	 * @param multipartFile
+	 * @return
+	 */
+	public static String checkImg(MultipartFile multipartFile){
+		String result = "";
+		//压缩图片
+		InputStream inputStream = compressImage(multipartFile);
+		// 校验api url
+		String url = IMG_SEC_URL + getWxAccessToken();
+		// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的
+		HttpClient httpclient = HttpClients.createDefault();
+		//创建一个post请求
+		HttpPost request = new HttpPost(url);
+		//设置响应头   ( application/octet-stream:二进制流,不知道下载文件类型)
+		request.addHeader("Content-Type", "application/octet-stream");
+		try {
+			//创建一个byte数组,和输入的文件的大小一样
+			byte[] byt = new byte[inputStream.available()];
+			//从输入流中读取全部,并将其存储在缓冲区数组byt 中。
+			inputStream.read(byt);
+			//定制提交内容
+			request.setEntity(new ByteArrayEntity(byt, ContentType.create("image/jpg")));
+			//由客户端执行(发送)请求,执行校验
+			HttpResponse response = httpclient.execute(request);
+			// 从响应模型中获取响应实体
+			HttpEntity entity = response.getEntity();
+			result = EntityUtils.toString(entity, "UTF-8");// 转成string
+			//打印校验结果
+			System.out.println("result:" + result);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if(inputStream != null){
+				try {
+					inputStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		// 响应返回结果
+		return result;
+	}
+
+
+
+	/**
+	 * 图片过滤检测
+	 * @param file 图片文件
+	 * @return
+	 */
+	public String checkPic(MultipartFile file) {
+		String access_token = "";
+		String result = "";
+		//自己写一个定时任务或其他方式 获取AccessToken
+		try {
+			access_token = getWxAccessToken();
+			String url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + access_token;
+			result = uploadFile(url, file);
+			System.out.println("图片检测结果 = " + result);
+		} catch (Exception e) {
+			System.out.println("----------------调用腾讯内容过滤系统出错------------------" + e.getMessage());
+		}
+		// 返回
+		return result;
+	}
+
+	/**
+	 * 上传二进制文件
+	 * @param graphurl 接口地址
+	 * @param file 图片文件
+	 * @return
+	 */
+	public static String uploadFile(String graphurl,MultipartFile file) {
+		String line = null;//接口返回的结果
+		try {
+			// 换行符
+			final String newLine = "\r\n";
+			final String boundaryPrefix = "--";
+			// 定义数据分隔线
+			String BOUNDARY = "========7d4a6d158c9";
+			// 服务器的域名
+			URL url = new URL(graphurl);
+			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+			// 设置为POST情
+			conn.setRequestMethod("POST");
+			// 发送POST请求必须设置如下两行
+			conn.setDoOutput(true);
+			conn.setDoInput(true);
+			conn.setUseCaches(false);
+			// 设置请求头参数
+			conn.setRequestProperty("connection", "Keep-Alive");
+			conn.setRequestProperty("Charsert", "UTF-8");
+			conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
+			conn.setRequestProperty("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1");
+			OutputStream out = new DataOutputStream(conn.getOutputStream());
+
+			// 上传文件
+			StringBuilder sb = new StringBuilder();
+			sb.append(boundaryPrefix);
+			sb.append(BOUNDARY);
+			sb.append(newLine);
+			// 文件参数,photo参数名可以随意修改
+			sb.append("Content-Disposition: form-data;name=\"image\";filename=\""
+				+ "https://api.weixin.qq.com" + "\"" + newLine);
+			sb.append("Content-Type:application/octet-stream");
+			// 参数头设置完以后需要两个换行,然后才是参数内容
+			sb.append(newLine);
+			sb.append(newLine);
+
+			// 将参数头的数据写入到输出流中
+			out.write(sb.toString().getBytes());
+
+			// 读取文件数据
+			out.write(file.getBytes());
+			// 最后添加换行
+			out.write(newLine.getBytes());
+
+			// 定义最后数据分隔线,即--加上BOUNDARY再加上--。
+			byte[] end_data = (newLine + boundaryPrefix + BOUNDARY
+				+ boundaryPrefix + newLine).getBytes();
+			// 写上结尾标识
+			out.write(end_data);
+			out.flush();
+			out.close();
+			// 定义BufferedReader输入流来读取URL的响应
+			BufferedReader reader = new BufferedReader(new InputStreamReader(
+				conn.getInputStream()));
+			while ((line = reader.readLine()) != null) {
+				return line;
+			}
+		} catch (Exception e) {
+			System.out.println("发送POST请求出现异常!" + e);
+		}
+		return line;
+	}
+
+	/**
+	 * 上传二进制文件
+	 * @param apiurl 接口地址
+	 * @param file 图片文件
+	 * @return
+	 */
+	public static String uploadFile(String apiurl, byte[] file) {
+		//接口返回的结果
+		String line = null;
+		try {
+			// 换行符
+			final String newLine = "\r\n";
+			final String boundaryPrefix = "--";
+			// 定义数据分隔线
+			String BOUNDARY = "========7d4a6d158c9";
+			// 服务器的域名
+			URL url = new URL(apiurl);
+			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+			// 设置为POST情
+			conn.setRequestMethod("POST");
+			// 发送POST请求必须设置如下两行
+			conn.setDoOutput(true);
+			conn.setDoInput(true);
+			conn.setUseCaches(false);
+			// 设置请求头参数
+			conn.setRequestProperty("connection", "Keep-Alive");
+			conn.setRequestProperty("Charsert", "UTF-8");
+			conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
+			conn.setRequestProperty("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f31) NetType/WIFI Language/zh_CN");
+			OutputStream out = new DataOutputStream(conn.getOutputStream());
+
+			// 上传文件
+			StringBuilder sb = new StringBuilder();
+			sb.append(boundaryPrefix);
+			sb.append(BOUNDARY);
+			sb.append(newLine);
+			// 文件参数,photo参数名可以随意修改
+			sb.append("Content-Disposition: form-data;name=\"image\";filename=\""
+				+ "https://api.weixin.qq.com" + "\"" + newLine);
+			sb.append("Content-Type:application/octet-stream");
+			// 参数头设置完以后需要两个换行,然后才是参数内容
+			sb.append(newLine);
+			sb.append(newLine);
+
+			// 将参数头的数据写入到输出流中
+			out.write(sb.toString().getBytes());
+
+			// 读取文件数据
+			out.write(file);
+			// 最后添加换行
+			out.write(newLine.getBytes());
+
+			// 定义最后数据分隔线,即--加上BOUNDARY再加上--。
+			byte[] end_data = (newLine + boundaryPrefix + BOUNDARY
+				+ boundaryPrefix + newLine).getBytes();
+			// 写上结尾标识
+			out.write(end_data);
+			out.flush();
+			out.close();
+			// 定义BufferedReader输入流来读取URL的响应
+			BufferedReader reader = new BufferedReader(new InputStreamReader(
+				conn.getInputStream()));
+			while ((line = reader.readLine()) != null) {
+				return line;
+			}
+		} catch (Exception e) {
+			System.out.println("发送POST请求出现异常!" + e);
+		}
+		return line;
+	}
+
+	/**
+	 * 获取 WxAccessToken
+	 * @return
+	 */
+	public static String getWxAccessToken() {
+		//参数
+		Map<String, String> params = new HashMap<>();
+		params.put("grant_type", "client_credential");
+		params.put("appid", WX_APP_ID);
+		params.put("secret", WX_SECRET);
+		String result = HttpClientUtils.doGet(WX_GET_ACCESS_TOKEN, params);
+		JSONObject jsonObject = JSON.parseObject(result);
+		String accessToken = jsonObject.getString("access_token");
+		return accessToken;
+	}
+
+
+
+	/**
+	 * 压缩图片
+	 * @param multipartFile
+	 */
+	public static InputStream compressImage(MultipartFile multipartFile){
+		//*************对不是jpg格式的图片转换成jpg格式***************
+		//获取文件名后缀,判断其格式
+		int begin = multipartFile.getOriginalFilename().lastIndexOf(".");
+		int last = multipartFile.getOriginalFilename().length();
+		//获得文件后缀名
+		String houzuiFileName = multipartFile.getOriginalFilename().substring(begin, last);
+		//创建临时文件
+		File tempFile = new File(multipartFile.getOriginalFilename());
+		//写入临时File文件 tempFile,将multipartFile转换成File
+		try {
+			//import org.apache.commons.io.FileUtils;
+			FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), tempFile);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		//如果文件不是jpg格式,转换其格式
+		if (!"jpg".equalsIgnoreCase(houzuiFileName)){
+			//ImageUtils是一个工具类,下面给出
+			//将png格式转换成jpg,输出到tempFile
+			//测试OK
+			ImageUtils.convert(multipartFile.getOriginalFilename(), "jpg", tempFile.getAbsolutePath());
+			//*************对不是jpg格式的图片转换成jpg格式***************
+		}
+		try {
+			//压缩图片
+			BufferedImage bufferedImage = Thumbnails.of(tempFile)
+				.size(740, 1330)//指定压缩之后的图片尺寸
+				.outputQuality(0.8f)//图片压缩质量
+				.asBufferedImage();
+			ByteArrayOutputStream os = new ByteArrayOutputStream();
+			ImageIO.write(bufferedImage, "jpg", os);
+			InputStream inputStream = new ByteArrayInputStream(os.toByteArray());
+//            System.out.println(inputStream);
+			return inputStream;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}finally {
+//             会在本地产生临时文件,用完后需要删除
+			if (tempFile.exists()) {
+				tempFile.delete();
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/src/main/java/org/springblade/common/utils/WordToPdfUtils.java b/src/main/java/org/springblade/common/utils/WordToPdfUtils.java
new file mode 100644
index 0000000..7b23f8c
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/WordToPdfUtils.java
@@ -0,0 +1,34 @@
+package org.springblade.common.utils;
+
+public class WordToPdfUtils {
+	// https://srgdjczzxtpt.com:2080/gminio/jczz/upload/20240710/ade086b8d725a08631b62d812a63f6da.docx
+
+	public static String wordToPdf(String fileName, String pdfPath) throws Exception {
+		// 判断入参是否有空
+		if (fileName == null || pdfPath == null) {
+			throw new Exception("入参不能为空");
+		}
+		// 判断文件后缀名是否doc,ppt,xls
+		if (fileName.endsWith(".doc") || fileName.endsWith(".docx")) {
+			// 获取文件流
+			// URL url = new URL(pdfPath);
+			// HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+			// connection.setRequestProperty("User-Agent", "Mozilla/5.0");
+			// // 获取文件名
+			// String orFileName = fileName.substring(0, fileName.lastIndexOf("."));
+			// InputStream inputStream = connection.getInputStream();
+			// long timeMillis = System.currentTimeMillis();
+			// // String filePathPdf = "/data/app/jczz/pdf/" + orFileName + "_" + timeMillis + ".pdf";
+			// String filePathPdf = "D:\\公司\\" + orFileName + "_" + timeMillis + ".pdf";
+			// com.aspose.words.Document doc = new com.aspose.words.Document(inputStream);
+			// doc.save(filePathPdf, com.aspose.words.SaveFormat.PDF);
+			return "";
+		} else {
+			throw new Exception("文件格式不正确");
+		}
+	}
+
+	public static void main(String[] args) throws Exception {
+		wordToPdf(" 测试.docx", "https://srgdjczzxtpt.com:2080/gminio/jczz/upload/20240710/ade086b8d725a08631b62d812a63f6da.docx");
+	}
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/AlipayApiException.java b/src/main/java/org/springblade/common/utils/sms/AlipayApiException.java
new file mode 100644
index 0000000..646ce63
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/AlipayApiException.java
@@ -0,0 +1,49 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+
+/**
+ *
+ * @author runzhi
+ */
+public class AlipayApiException extends Exception {
+
+    private static final long serialVersionUID = -238091758285157331L;
+
+    private String            errCode;
+    private String            errMsg;
+
+    public AlipayApiException() {
+        super();
+    }
+
+    public AlipayApiException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public AlipayApiException(String message) {
+        super(message);
+    }
+
+    public AlipayApiException(Throwable cause) {
+        super(cause);
+    }
+
+    public AlipayApiException(String errCode, String errMsg) {
+        super(errCode + ":" + errMsg);
+        this.errCode = errCode;
+        this.errMsg = errMsg;
+    }
+
+    public String getErrCode() {
+        return this.errCode;
+    }
+
+    public String getErrMsg() {
+        return this.errMsg;
+    }
+
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/AlipayConstants.java b/src/main/java/org/springblade/common/utils/sms/AlipayConstants.java
new file mode 100644
index 0000000..1bfbde3
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/AlipayConstants.java
@@ -0,0 +1,97 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+/**
+ *
+ * @author runzhi
+ */
+public class AlipayConstants {
+
+    public static final String SIGN_TYPE                      = "sign_type";
+
+    public static final String SIGN_TYPE_RSA                  = "RSA";
+
+    /**
+     * sha256WithRsa 算法请求类型
+     */
+    public static final String SIGN_TYPE_RSA2                 = "RSA2";
+
+    public static final String SIGN_ALGORITHMS                = "SHA1WithRSA";
+
+    public static final String SIGN_SHA256RSA_ALGORITHMS      = "SHA256WithRSA";
+
+    public static final String ENCRYPT_TYPE_AES               = "AES";
+
+    public static final String APP_ID                         = "app_id";
+
+    public static final String FORMAT                         = "format";
+
+    public static final String METHOD                         = "method";
+
+    public static final String TIMESTAMP                      = "timestamp";
+
+    public static final String VERSION                        = "version";
+
+    public static final String SIGN                           = "sign";
+
+    public static final String ALIPAY_SDK                     = "alipay_sdk";
+
+    public static final String ACCESS_TOKEN                   = "auth_token";
+
+    public static final String APP_AUTH_TOKEN                 = "app_auth_token";
+
+    public static final String TERMINAL_TYPE                  = "terminal_type";
+
+    public static final String TERMINAL_INFO                  = "terminal_info";
+
+    public static final String CHARSET                        = "charset";
+
+    public static final String NOTIFY_URL                     = "notify_url";
+
+    public static final String RETURN_URL                     = "return_url";
+
+    public static final String ENCRYPT_TYPE                   = "encrypt_type";
+
+    //-----===-------///
+
+    public static final String BIZ_CONTENT_KEY                = "biz_content";
+
+    /** 默认时间格式 **/
+    public static final String DATE_TIME_FORMAT               = "yyyy-MM-dd HH:mm:ss";
+
+    /**  Date默认时区 **/
+    public static final String DATE_TIMEZONE                  = "GMT+8";
+
+    /** UTF-8字符集 **/
+    public static final String CHARSET_UTF8                   = "UTF-8";
+
+    /** GBK字符集 **/
+    public static final String CHARSET_GBK                    = "GBK";
+
+    /** JSON 应格式 */
+    public static final String FORMAT_JSON                    = "json";
+
+    /** XML 应格式 */
+    public static final String FORMAT_XML                     = "xml";
+
+    /** SDK版本号 */
+    public static final String SDK_VERSION                    = "alipay-sdk-java-3.6.0.ALL";
+
+    public static final String PROD_CODE                      = "prod_code";
+
+    /** 老版本失败节点 */
+    public static final String ERROR_RESPONSE                 = "error_response";
+
+    /** 新版本节点后缀 */
+    public static final String RESPONSE_SUFFIX                = "_response";
+
+    /** 加密后XML返回报文的节点名字 */
+    public static final String RESPONSE_XML_ENCRYPT_NODE_NAME = "response_encrypted";
+
+    /** 批量请求id **/
+    public static final String BATCH_REQUEST_ID               = "batch_request_id";
+
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/AlipaySignature.java b/src/main/java/org/springblade/common/utils/sms/AlipaySignature.java
new file mode 100644
index 0000000..d4f2de2
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/AlipaySignature.java
@@ -0,0 +1,607 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import java.io.*;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author runzhi
+ */
+public class AlipaySignature {
+
+    /** RSA最大加密明文大小  */
+    private static final int MAX_ENCRYPT_BLOCK = 117;
+
+    /** RSA最大解密密文大小   */
+    private static final int MAX_DECRYPT_BLOCK = 128;
+
+
+
+    /**
+     *
+     * @param sortedParams
+     * @return
+     */
+    public static String getSignContent(Map<String, String> sortedParams) {
+        StringBuffer content = new StringBuffer();
+        List<String> keys = new ArrayList<String>(sortedParams.keySet());
+        Collections.sort(keys);
+        int index = 0;
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = sortedParams.get(key);
+            if (StringUtils.areNotEmpty(key, value)) {
+                content.append((index == 0 ? "" : "&") + key + "=" + value);
+                index++;
+            }
+        }
+        return content.toString();
+    }
+
+    /**
+     *  rsa内容签名
+     *
+     * @param content
+     * @param privateKey
+     * @param charset
+     * @return
+     * @throws AlipayApiException
+     */
+    public static String rsaSign(String content, String privateKey, String charset,
+                                 String signType) throws AlipayApiException {
+
+        if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) {
+
+            return rsaSign(content, privateKey, charset);
+        } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) {
+
+            return rsa256Sign(content, privateKey, charset);
+        } else {
+
+            throw new AlipayApiException("Sign Type is Not Support : signType=" + signType);
+        }
+
+    }
+
+    /**
+     * sha256WithRsa 加签
+     *
+     * @param content
+     * @param privateKey
+     * @param charset
+     * @return
+     * @throws AlipayApiException
+     */
+    public static String rsa256Sign(String content, String privateKey,
+                                    String charset) throws AlipayApiException {
+
+        try {
+            PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA,
+                new ByteArrayInputStream(privateKey.getBytes()));
+
+            java.security.Signature signature = java.security.Signature
+                .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS);
+
+            signature.initSign(priKey);
+
+            if (StringUtils.isEmpty(charset)) {
+                signature.update(content.getBytes());
+            } else {
+                signature.update(content.getBytes(charset));
+            }
+
+            byte[] signed = signature.sign();
+
+            return new String(Base64.encodeBase64(signed));
+        } catch (Exception e) {
+            throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e);
+        }
+
+    }
+
+    /**
+     * sha1WithRsa 加签
+     *
+     * @param content
+     * @param privateKey
+     * @param charset
+     * @return
+     * @throws AlipayApiException
+     */
+    public static String rsaSign(String content, String privateKey,
+                                 String charset) throws AlipayApiException {
+        try {
+            PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA,
+                new ByteArrayInputStream(privateKey.getBytes()));
+
+            java.security.Signature signature = java.security.Signature
+                .getInstance(AlipayConstants.SIGN_ALGORITHMS);
+
+            signature.initSign(priKey);
+
+            if (StringUtils.isEmpty(charset)) {
+                signature.update(content.getBytes());
+            } else {
+                signature.update(content.getBytes(charset));
+            }
+
+            byte[] signed = signature.sign();
+
+            return new String(Base64.encodeBase64(signed));
+        } catch (InvalidKeySpecException ie) {
+            throw new AlipayApiException("RSA私钥格式不正确,请检查是否正确配置了PKCS8格式的私钥", ie);
+        } catch (Exception e) {
+            throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e);
+        }
+    }
+
+    public static String rsaSign(Map<String, String> params, String privateKey,
+                                 String charset) throws AlipayApiException {
+        String signContent = getSignContent(params);
+
+        return rsaSign(signContent, privateKey, charset);
+
+    }
+
+    public static PrivateKey getPrivateKeyFromPKCS8(String algorithm,
+                                                    InputStream ins) throws Exception {
+        if (ins == null || StringUtils.isEmpty(algorithm)) {
+            return null;
+        }
+
+        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+        byte[] encodedKey = StreamUtil.readText(ins).getBytes();
+
+        encodedKey = Base64.decodeBase64(encodedKey);
+
+        return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
+    }
+
+    public static String getSignCheckContentV1(Map<String, String> params) {
+        if (params == null) {
+            return null;
+        }
+
+        params.remove("sign");
+        params.remove("sign_type");
+
+        StringBuffer content = new StringBuffer();
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            content.append((i == 0 ? "" : "&") + key + "=" + value);
+        }
+
+        return content.toString();
+    }
+
+    public static String getSignCheckContentV2(Map<String, String> params) {
+        if (params == null) {
+            return null;
+        }
+
+        params.remove("sign");
+
+        StringBuffer content = new StringBuffer();
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            content.append((i == 0 ? "" : "&") + key + "=" + value);
+        }
+
+        return content.toString();
+    }
+
+    public static boolean rsaCheckV1(Map<String, String> params, String publicKey,
+                                     String charset) throws AlipayApiException {
+        String sign = params.get("sign");
+        String content = getSignCheckContentV1(params);
+
+        return rsaCheckContent(content, sign, publicKey, charset);
+    }
+
+    public static boolean rsaCheckV1(Map<String, String> params, String publicKey,
+            String charset,String signType) throws AlipayApiException {
+		String sign = params.get("sign");
+		String content = getSignCheckContentV1(params);
+
+		return rsaCheck(content, sign, publicKey, charset,signType);
+    }
+
+    public static boolean rsaCheckV2(Map<String, String> params, String publicKey,
+                                     String charset) throws AlipayApiException {
+        String sign = params.get("sign");
+        String content = getSignCheckContentV2(params);
+
+        return rsaCheckContent(content, sign, publicKey, charset);
+    }
+
+    public static boolean rsaCheckV2(Map<String, String> params, String publicKey,
+            String charset,String signType) throws AlipayApiException {
+		String sign = params.get("sign");
+		String content = getSignCheckContentV2(params);
+
+		return rsaCheck(content, sign, publicKey, charset,signType);
+	}
+
+    public static boolean rsaCheck(String content, String sign, String publicKey, String charset,
+                                   String signType) throws AlipayApiException {
+
+        if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) {
+
+            return rsaCheckContent(content, sign, publicKey, charset);
+
+        } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) {
+
+            return rsa256CheckContent(content, sign, publicKey, charset);
+
+        } else {
+
+            throw new AlipayApiException("Sign Type is Not Support : signType=" + signType);
+        }
+
+    }
+
+    public static boolean rsa256CheckContent(String content, String sign, String publicKey,
+                                             String charset) throws AlipayApiException {
+        try {
+            PublicKey pubKey = getPublicKeyFromX509("RSA",
+                new ByteArrayInputStream(publicKey.getBytes()));
+
+            java.security.Signature signature = java.security.Signature
+                .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS);
+
+            signature.initVerify(pubKey);
+
+            if (StringUtils.isEmpty(charset)) {
+                signature.update(content.getBytes());
+            } else {
+                signature.update(content.getBytes(charset));
+            }
+
+            return signature.verify(Base64.decodeBase64(sign.getBytes()));
+        } catch (Exception e) {
+            throw new AlipayApiException(
+                "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e);
+        }
+    }
+
+    public static boolean rsaCheckContent(String content, String sign, String publicKey,
+                                          String charset) throws AlipayApiException {
+        try {
+            PublicKey pubKey = getPublicKeyFromX509("RSA",
+                new ByteArrayInputStream(publicKey.getBytes()));
+
+            java.security.Signature signature = java.security.Signature
+                .getInstance(AlipayConstants.SIGN_ALGORITHMS);
+
+            signature.initVerify(pubKey);
+
+            if (StringUtils.isEmpty(charset)) {
+                signature.update(content.getBytes());
+            } else {
+                signature.update(content.getBytes(charset));
+            }
+
+            return signature.verify(Base64.decodeBase64(sign.getBytes()));
+        } catch (Exception e) {
+            throw new AlipayApiException(
+                "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e);
+        }
+    }
+
+    public static PublicKey getPublicKeyFromX509(String algorithm,
+                                                 InputStream ins) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+        StringWriter writer = new StringWriter();
+        StreamUtil.io(new InputStreamReader(ins), writer);
+
+        byte[] encodedKey = writer.toString().getBytes();
+
+        encodedKey = Base64.decodeBase64(encodedKey);
+
+        return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
+    }
+
+    /**
+     * 验签并解密
+     * <p>
+     * <b>目前适用于公众号</b><br>
+     * params参数示例:
+     * <br>{
+     *    <br>biz_content=M0qGiGz+8kIpxe8aF4geWJdBn0aBTuJRQItLHo9R7o5JGhpic/MIUjvXo2BLB++BbkSq2OsJCEQFDZ0zK5AJYwvBgeRX30gvEj6eXqXRt16/IkB9HzAccEqKmRHrZJ7PjQWE0KfvDAHsJqFIeMvEYk1Zei2QkwSQPlso7K0oheo/iT+HYE8aTATnkqD/ByD9iNDtGg38pCa2xnnns63abKsKoV8h0DfHWgPH62urGY7Pye3r9FCOXA2Ykm8X4/Bl1bWFN/PFCEJHWe/HXj8KJKjWMO6ttsoV0xRGfeyUO8agu6t587Dl5ux5zD/s8Lbg5QXygaOwo3Fz1G8EqmGhi4+soEIQb8DBYanQOS3X+m46tVqBGMw8Oe+hsyIMpsjwF4HaPKMr37zpW3fe7xOMuimbZ0wq53YP/jhQv6XWodjT3mL0H5ACqcsSn727B5ztquzCPiwrqyjUHjJQQefFTzOse8snaWNQTUsQS7aLsHq0FveGpSBYORyA90qPdiTjXIkVP7mAiYiAIWW9pCEC7F3XtViKTZ8FRMM9ySicfuAlf3jtap6v2KPMtQv70X+hlmzO/IXB6W0Ep8DovkF5rB4r/BJYJLw/6AS0LZM9w5JfnAZhfGM2rKzpfNsgpOgEZS1WleG4I2hoQC0nxg9IcP0Hs+nWIPkEUcYNaiXqeBc=,
+     *    <br>sign=rlqgA8O+RzHBVYLyHmrbODVSANWPXf3pSrr82OCO/bm3upZiXSYrX5fZr6UBmG6BZRAydEyTIguEW6VRuAKjnaO/sOiR9BsSrOdXbD5Rhos/Xt7/mGUWbTOt/F+3W0/XLuDNmuYg1yIC/6hzkg44kgtdSTsQbOC9gWM7ayB4J4c=,
+     *    sign_type=RSA,
+     *    <br>charset=UTF-8
+     * <br>}
+     * </p>
+     * @param params
+     * @param alipayPublicKey 支付宝公钥
+     * @param cusPrivateKey   商户私钥
+     * @param isCheckSign     是否验签
+     * @param isDecrypt       是否解密
+     * @return 解密后明文,验签失败则异常抛出
+     * @throws AlipayApiException
+     */
+    public static String checkSignAndDecrypt(Map<String, String> params, String alipayPublicKey,
+                                             String cusPrivateKey, boolean isCheckSign,
+                                             boolean isDecrypt) throws AlipayApiException {
+        String charset = params.get("charset");
+        String bizContent = params.get("biz_content");
+        if (isCheckSign) {
+            if (!rsaCheckV2(params, alipayPublicKey, charset)) {
+                throw new AlipayApiException("rsaCheck failure:rsaParams=" + params);
+            }
+        }
+
+        if (isDecrypt) {
+            return rsaDecrypt(bizContent, cusPrivateKey, charset);
+        }
+
+        return bizContent;
+    }
+
+    /**
+     * 验签并解密
+     * <p>
+     * <b>目前适用于公众号</b><br>
+     * params参数示例:
+     * <br>{
+     *    <br>biz_content=M0qGiGz+8kIpxe8aF4geWJdBn0aBTuJRQItLHo9R7o5JGhpic/MIUjvXo2BLB++BbkSq2OsJCEQFDZ0zK5AJYwvBgeRX30gvEj6eXqXRt16/IkB9HzAccEqKmRHrZJ7PjQWE0KfvDAHsJqFIeMvEYk1Zei2QkwSQPlso7K0oheo/iT+HYE8aTATnkqD/ByD9iNDtGg38pCa2xnnns63abKsKoV8h0DfHWgPH62urGY7Pye3r9FCOXA2Ykm8X4/Bl1bWFN/PFCEJHWe/HXj8KJKjWMO6ttsoV0xRGfeyUO8agu6t587Dl5ux5zD/s8Lbg5QXygaOwo3Fz1G8EqmGhi4+soEIQb8DBYanQOS3X+m46tVqBGMw8Oe+hsyIMpsjwF4HaPKMr37zpW3fe7xOMuimbZ0wq53YP/jhQv6XWodjT3mL0H5ACqcsSn727B5ztquzCPiwrqyjUHjJQQefFTzOse8snaWNQTUsQS7aLsHq0FveGpSBYORyA90qPdiTjXIkVP7mAiYiAIWW9pCEC7F3XtViKTZ8FRMM9ySicfuAlf3jtap6v2KPMtQv70X+hlmzO/IXB6W0Ep8DovkF5rB4r/BJYJLw/6AS0LZM9w5JfnAZhfGM2rKzpfNsgpOgEZS1WleG4I2hoQC0nxg9IcP0Hs+nWIPkEUcYNaiXqeBc=,
+     *    <br>sign=rlqgA8O+RzHBVYLyHmrbODVSANWPXf3pSrr82OCO/bm3upZiXSYrX5fZr6UBmG6BZRAydEyTIguEW6VRuAKjnaO/sOiR9BsSrOdXbD5Rhos/Xt7/mGUWbTOt/F+3W0/XLuDNmuYg1yIC/6hzkg44kgtdSTsQbOC9gWM7ayB4J4c=,
+     *    sign_type=RSA,
+     *    <br>charset=UTF-8
+     * <br>}
+     * </p>
+     * @param params
+     * @param alipayPublicKey 支付宝公钥
+     * @param cusPrivateKey   商户私钥
+     * @param isCheckSign     是否验签
+     * @param isDecrypt       是否解密
+     * @return 解密后明文,验签失败则异常抛出
+     * @throws AlipayApiException
+     */
+    public static String checkSignAndDecrypt(Map<String, String> params, String alipayPublicKey,
+                                             String cusPrivateKey, boolean isCheckSign,
+                                             boolean isDecrypt, String signType) throws AlipayApiException {
+        String charset = params.get("charset");
+        String bizContent = params.get("biz_content");
+        if (isCheckSign) {
+            if (!rsaCheckV2(params, alipayPublicKey, charset,signType)) {
+                throw new AlipayApiException("rsaCheck failure:rsaParams=" + params);
+            }
+        }
+
+        if (isDecrypt) {
+            return rsaDecrypt(bizContent, cusPrivateKey, charset);
+        }
+
+        return bizContent;
+    }
+
+    /**
+     * 加密并签名<br>
+     * <b>目前适用于公众号</b>
+     * @param bizContent      待加密、签名内容
+     * @param alipayPublicKey 支付宝公钥
+     * @param cusPrivateKey   商户私钥
+     * @param charset         字符集,如UTF-8, GBK, GB2312
+     * @param isEncrypt       是否加密,true-加密  false-不加密
+     * @param isSign          是否签名,true-签名  false-不签名
+     * @return 加密、签名后xml内容字符串
+     * <p>
+     * 返回示例:
+     * <alipay>
+     *  <response>密文</response>
+     *  <encryption_type>RSA</encryption_type>
+     *  <sign>sign</sign>
+     *  <sign_type>RSA</sign_type>
+     * </alipay>
+     * </p>
+     * @throws AlipayApiException
+     */
+    public static String encryptAndSign(String bizContent, String alipayPublicKey,
+                                        String cusPrivateKey, String charset, boolean isEncrypt,
+                                        boolean isSign) throws AlipayApiException {
+        StringBuilder sb = new StringBuilder();
+        if (StringUtils.isEmpty(charset)) {
+            charset = AlipayConstants.CHARSET_GBK;
+        }
+        sb.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>");
+        if (isEncrypt) {// 加密
+            sb.append("<alipay>");
+            String encrypted = rsaEncrypt(bizContent, alipayPublicKey, charset);
+            sb.append("<response>" + encrypted + "</response>");
+            sb.append("<encryption_type>RSA</encryption_type>");
+            if (isSign) {
+                String sign = rsaSign(encrypted, cusPrivateKey, charset);
+                sb.append("<sign>" + sign + "</sign>");
+                sb.append("<sign_type>RSA</sign_type>");
+            }
+            sb.append("</alipay>");
+        } else if (isSign) {// 不加密,但需要签名
+            sb.append("<alipay>");
+            sb.append("<response>" + bizContent + "</response>");
+            String sign = rsaSign(bizContent, cusPrivateKey, charset);
+            sb.append("<sign>" + sign + "</sign>");
+            sb.append("<sign_type>RSA</sign_type>");
+            sb.append("</alipay>");
+        } else {// 不加密,不加签
+            sb.append(bizContent);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 加密并签名<br>
+     * <b>目前适用于公众号</b>
+     * @param bizContent      待加密、签名内容
+     * @param alipayPublicKey 支付宝公钥
+     * @param cusPrivateKey   商户私钥
+     * @param charset         字符集,如UTF-8, GBK, GB2312
+     * @param isEncrypt       是否加密,true-加密  false-不加密
+     * @param isSign          是否签名,true-签名  false-不签名
+     * @return 加密、签名后xml内容字符串
+     * <p>
+     * 返回示例:
+     * <alipay>
+     *  <response>密文</response>
+     *  <encryption_type>RSA</encryption_type>
+     *  <sign>sign</sign>
+     *  <sign_type>RSA</sign_type>
+     * </alipay>
+     * </p>
+     * @throws AlipayApiException
+     */
+    public static String encryptAndSign(String bizContent, String alipayPublicKey,
+                                        String cusPrivateKey, String charset, boolean isEncrypt,
+                                        boolean isSign,String signType) throws AlipayApiException {
+        StringBuilder sb = new StringBuilder();
+        if (StringUtils.isEmpty(charset)) {
+            charset = AlipayConstants.CHARSET_GBK;
+        }
+        sb.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>");
+        if (isEncrypt) {// 加密
+            sb.append("<alipay>");
+            String encrypted = rsaEncrypt(bizContent, alipayPublicKey, charset);
+            sb.append("<response>" + encrypted + "</response>");
+            sb.append("<encryption_type>RSA</encryption_type>");
+            if (isSign) {
+                String sign = rsaSign(encrypted, cusPrivateKey, charset, signType);
+                sb.append("<sign>" + sign + "</sign>");
+                sb.append("<sign_type>");
+                sb.append(signType);
+                sb.append("</sign_type>");
+            }
+            sb.append("</alipay>");
+        } else if (isSign) {// 不加密,但需要签名
+            sb.append("<alipay>");
+            sb.append("<response>" + bizContent + "</response>");
+            String sign = rsaSign(bizContent, cusPrivateKey, charset, signType);
+            sb.append("<sign>" + sign + "</sign>");
+            sb.append("<sign_type>");
+            sb.append(signType);
+            sb.append("</sign_type>");
+            sb.append("</alipay>");
+        } else {// 不加密,不加签
+            sb.append(bizContent);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param content   待加密内容
+     * @param publicKey 公钥
+     * @param charset   字符集,如UTF-8, GBK, GB2312
+     * @return 密文内容
+     * @throws AlipayApiException
+     */
+    public static String rsaEncrypt(String content, String publicKey,
+                                    String charset) throws AlipayApiException {
+        try {
+            PublicKey pubKey = getPublicKeyFromX509(AlipayConstants.SIGN_TYPE_RSA,
+                new ByteArrayInputStream(publicKey.getBytes()));
+            Cipher cipher = Cipher.getInstance(AlipayConstants.SIGN_TYPE_RSA);
+            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+            byte[] data = StringUtils.isEmpty(charset) ? content.getBytes()
+                : content.getBytes(charset);
+            int inputLen = data.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段加密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * MAX_ENCRYPT_BLOCK;
+            }
+            byte[] encryptedData = Base64.encodeBase64(out.toByteArray());
+            out.close();
+
+            return StringUtils.isEmpty(charset) ? new String(encryptedData)
+                : new String(encryptedData, charset);
+        } catch (Exception e) {
+            throw new AlipayApiException("EncryptContent = " + content + ",charset = " + charset,
+                e);
+        }
+    }
+
+    /**
+     * 私钥解密
+     *
+     * @param content    待解密内容
+     * @param privateKey 私钥
+     * @param charset    字符集,如UTF-8, GBK, GB2312
+     * @return 明文内容
+     * @throws AlipayApiException
+     */
+    public static String rsaDecrypt(String content, String privateKey,
+                                    String charset) throws AlipayApiException {
+        try {
+            PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA,
+                new ByteArrayInputStream(privateKey.getBytes()));
+            Cipher cipher = Cipher.getInstance(AlipayConstants.SIGN_TYPE_RSA);
+            cipher.init(Cipher.DECRYPT_MODE, priKey);
+            byte[] encryptedData = StringUtils.isEmpty(charset)
+                ? Base64.decodeBase64(content.getBytes())
+                : Base64.decodeBase64(content.getBytes(charset));
+            int inputLen = encryptedData.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段解密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+                    cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * MAX_DECRYPT_BLOCK;
+            }
+            byte[] decryptedData = out.toByteArray();
+            out.close();
+
+            return StringUtils.isEmpty(charset) ? new String(decryptedData)
+                : new String(decryptedData, charset);
+        } catch (Exception e) {
+            throw new AlipayApiException("EncodeContent = " + content + ",charset = " + charset, e);
+        }
+    }
+
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/PerfectSend.java b/src/main/java/org/springblade/common/utils/sms/PerfectSend.java
new file mode 100644
index 0000000..fc975c6
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/PerfectSend.java
@@ -0,0 +1,91 @@
+package org.springblade.common.utils.sms;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 完美发送任务对象 perfect_send
+ *
+ * @author chen
+ * @date 2021-06-23
+ */
+public class PerfectSend
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 通知时间间隔 */
+    private String timeInterval;
+
+    /** 通知次数 */
+    private int sendNum;
+
+    /** 通知内容 */
+    private String sendContent;
+
+    /** 发送用户 */
+    private String phones;
+
+    /** 优先级 */
+    private Integer priority;
+
+    /** 创建者 */
+    private String createBy;
+
+    public String getTimeInterval() {
+        return timeInterval;
+    }
+
+    public void setTimeInterval(String timeInterval) {
+        this.timeInterval = timeInterval;
+    }
+
+    public int getSendNum() {
+        return sendNum;
+    }
+
+    public void setSendNum(int sendNum) {
+        this.sendNum = sendNum;
+    }
+
+    public String getSendContent() {
+        return sendContent;
+    }
+
+    public void setSendContent(String sendContent) {
+        this.sendContent = sendContent;
+    }
+
+    public String getPhones() {
+        return phones;
+    }
+
+    public void setPhones(String phones) {
+        this.phones = phones;
+    }
+
+    public Integer getPriority() {
+        return priority;
+    }
+
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("timeInterval", getTimeInterval())
+            .append("sendNum", getSendNum())
+            .append("sendContent", getSendContent())
+            .append("createBy", getCreateBy())
+            .toString();
+    }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/ReplyContent.java b/src/main/java/org/springblade/common/utils/sms/ReplyContent.java
new file mode 100644
index 0000000..51a4ffd
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/ReplyContent.java
@@ -0,0 +1,63 @@
+package org.springblade.common.utils.sms;
+
+import java.util.Date;
+
+/**
+ * 回复内容对象 reply_content
+ *
+ * @author chen
+ * @date 2021-06-24
+ */
+public class ReplyContent {
+    /**
+     * 发送号码
+     */
+    private String sendPhones;
+
+    /**
+     * 上行记录时间-起始
+     */
+    private String createTimeStart;
+
+    /**
+     * 上行记录时间-结束
+     */
+    private String createTimeEnd;
+
+    /**
+     * 创建者
+     */
+    private String sopCreateBy;
+
+    public String getSendPhones() {
+        return sendPhones;
+    }
+
+    public void setSendPhones(String sendPhones) {
+        this.sendPhones = sendPhones;
+    }
+
+    public String getCreateTimeStart() {
+        return createTimeStart;
+    }
+
+    public void setCreateTimeStart(String createTimeStart) {
+        this.createTimeStart = createTimeStart;
+    }
+
+    public String getCreateTimeEnd() {
+        return createTimeEnd;
+    }
+
+    public void setCreateTimeEnd(String createTimeEnd) {
+        this.createTimeEnd = createTimeEnd;
+    }
+
+    public String getSopCreateBy() {
+        return sopCreateBy;
+    }
+
+    public void setSopCreateBy(String sopCreateBy) {
+        this.sopCreateBy = sopCreateBy;
+    }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/StatusReport.java b/src/main/java/org/springblade/common/utils/sms/StatusReport.java
new file mode 100644
index 0000000..88890da
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/StatusReport.java
@@ -0,0 +1,91 @@
+package org.springblade.common.utils.sms;
+
+import java.util.Date;
+
+/**
+ * 状态报告对象 status_report
+ *
+ * @author chen
+ * @date 2021-06-24
+ */
+public class StatusReport
+{
+
+    /**
+     * 接收号码
+     */
+    private String phones;
+
+    /**
+     * 发送类型(0相同内容,1不同内容,2完美发送)
+     */
+    private int type;
+
+    /**
+     * 发送时间-起始
+     */
+    private String sendTimeStart;
+
+    /**
+     * 发送时间-结束
+     */
+    private String sendTimeEnd;
+
+    /**
+     * 发送类型
+     */
+    private int parentType;
+
+    /**
+     * 创建者
+     */
+    private String sopCreateBy;
+
+    public String getPhones() {
+        return phones;
+    }
+
+    public void setPhones(String phones) {
+        this.phones = phones;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String getSendTimeStart() {
+        return sendTimeStart;
+    }
+
+    public void setSendTimeStart(String sendTimeStart) {
+        this.sendTimeStart = sendTimeStart;
+    }
+
+    public String getSendTimeEnd() {
+        return sendTimeEnd;
+    }
+
+    public void setSendTimeEnd(String sendTimeEnd) {
+        this.sendTimeEnd = sendTimeEnd;
+    }
+
+    public int getParentType() {
+        return parentType;
+    }
+
+    public void setParentType(int parentType) {
+        this.parentType = parentType;
+    }
+
+    public String getSopCreateBy() {
+        return sopCreateBy;
+    }
+
+    public void setSopCreateBy(String sopCreateBy) {
+        this.sopCreateBy = sopCreateBy;
+    }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/StreamUtil.java b/src/main/java/org/springblade/common/utils/sms/StreamUtil.java
new file mode 100644
index 0000000..2ac0521
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/StreamUtil.java
@@ -0,0 +1,135 @@
+/**
+ * Alipay.com Inc.
+ * Copyright (c) 2004-2012 All Rights Reserved.
+ */
+package org.springblade.common.utils.sms;
+
+import java.io.*;
+
+/**
+ *
+ * @author runzhi
+ */
+public class StreamUtil {
+    private StreamUtil(){}
+
+    private static final int DEFAULT_BUFFER_SIZE = 8192;
+
+    public static void io(InputStream in, OutputStream out) throws IOException {
+        io(in, out, -1);
+    }
+
+    public static void io(InputStream in, OutputStream out, int bufferSize) throws IOException {
+        if (bufferSize == -1) {
+            bufferSize = DEFAULT_BUFFER_SIZE;
+        }
+
+        byte[] buffer = new byte[bufferSize];
+        int amount;
+
+        while ((amount = in.read(buffer)) >= 0) {
+            out.write(buffer, 0, amount);
+        }
+    }
+
+    public static void io(Reader in, Writer out) throws IOException {
+        io(in, out, -1);
+    }
+
+    public static void io(Reader in, Writer out, int bufferSize) throws IOException {
+        if (bufferSize == -1) {
+            bufferSize = DEFAULT_BUFFER_SIZE >> 1;
+        }
+
+        char[] buffer = new char[bufferSize];
+        int amount;
+
+        while ((amount = in.read(buffer)) >= 0) {
+            out.write(buffer, 0, amount);
+        }
+    }
+
+    public static OutputStream synchronizedOutputStream(OutputStream out) {
+        return new SynchronizedOutputStream(out);
+    }
+
+    public static OutputStream synchronizedOutputStream(OutputStream out, Object lock) {
+        return new SynchronizedOutputStream(out, lock);
+    }
+
+    public static String readText(InputStream in) throws IOException {
+        return readText(in, null, -1);
+    }
+
+    public static String readText(InputStream in, String encoding) throws IOException {
+        return readText(in, encoding, -1);
+    }
+
+    public static String readText(InputStream in, String encoding, int bufferSize)
+                                                                                  throws IOException {
+        Reader reader = (encoding == null) ? new InputStreamReader(in) : new InputStreamReader(in,
+            encoding);
+
+        return readText(reader, bufferSize);
+    }
+
+    public static String readText(Reader reader) throws IOException {
+        return readText(reader, -1);
+    }
+
+    public static String readText(Reader reader, int bufferSize) throws IOException {
+        StringWriter writer = new StringWriter();
+
+        io(reader, writer, bufferSize);
+        return writer.toString();
+    }
+
+    private static class SynchronizedOutputStream extends OutputStream {
+        private OutputStream out;
+        private Object       lock;
+
+        SynchronizedOutputStream(OutputStream out) {
+            this(out, out);
+        }
+
+        SynchronizedOutputStream(OutputStream out, Object lock) {
+            this.out = out;
+            this.lock = lock;
+        }
+
+        @Override
+        public void write(int datum) throws IOException {
+            synchronized (lock) {
+                out.write(datum);
+            }
+        }
+
+        @Override
+        public void write(byte[] data) throws IOException {
+            synchronized (lock) {
+                out.write(data);
+            }
+        }
+
+        @Override
+        public void write(byte[] data, int offset, int length) throws IOException {
+            synchronized (lock) {
+                out.write(data, offset, length);
+            }
+        }
+
+        @Override
+        public void flush() throws IOException {
+            synchronized (lock) {
+                out.flush();
+            }
+        }
+
+        @Override
+        public void close() throws IOException {
+            synchronized (lock) {
+                out.close();
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/springblade/common/utils/sms/StringUtils.java b/src/main/java/org/springblade/common/utils/sms/StringUtils.java
new file mode 100644
index 0000000..b36ff9a
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/sms/StringUtils.java
@@ -0,0 +1,171 @@
+package org.springblade.common.utils.sms;
+
+/**
+ * 字符串工具类。
+ *
+ * @author carver.gu
+ * @since 1.0, Sep 12, 2009
+ */
+public abstract class StringUtils {
+
+	private StringUtils() {}
+
+	/**
+	 * 检查指定的字符串是否为空。
+	 * <ul>
+	 * <li>SysUtils.isEmpty(null) = true</li>
+	 * <li>SysUtils.isEmpty("") = true</li>
+	 * <li>SysUtils.isEmpty("   ") = true</li>
+	 * <li>SysUtils.isEmpty("abc") = false</li>
+	 * </ul>
+	 *
+	 * @param value 待检查的字符串
+	 * @return true/false
+	 */
+	public static boolean isEmpty(String value) {
+		int strLen;
+		if (value == null || (strLen = value.length()) == 0) {
+			return true;
+		}
+		for (int i = 0; i < strLen; i++) {
+			if ((Character.isWhitespace(value.charAt(i)) == false)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 检查对象是否为数字型字符串,包含负数开头的。
+	 */
+	public static boolean isNumeric(Object obj) {
+		if (obj == null) {
+			return false;
+		}
+		char[] chars = obj.toString().toCharArray();
+		int length = chars.length;
+		if(length < 1) {
+            return false;
+        }
+
+		int i = 0;
+		if(length > 1 && chars[0] == '-') {
+            i = 1;
+        }
+
+		for (; i < length; i++) {
+			if (!Character.isDigit(chars[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 检查指定的字符串列表是否不为空。
+	 */
+	public static boolean areNotEmpty(String... values) {
+		boolean result = true;
+		if (values == null || values.length == 0) {
+			result = false;
+		} else {
+			for (String value : values) {
+				result &= !isEmpty(value);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 把通用字符编码的字符串转化为汉字编码。
+	 */
+	public static String unicodeToChinese(String unicode) {
+		StringBuilder out = new StringBuilder();
+		if (!isEmpty(unicode)) {
+			for (int i = 0; i < unicode.length(); i++) {
+				out.append(unicode.charAt(i));
+			}
+		}
+		return out.toString();
+	}
+
+	/**
+	 * 过滤不可见字符
+	 */
+	public static String stripNonValidXMLCharacters(String input) {
+		if (input == null || ("".equals(input))) {
+            return "";
+        }
+		StringBuilder out = new StringBuilder();
+		char current;
+		for (int i = 0; i < input.length(); i++) {
+			current = input.charAt(i);
+			if ((current == 0x9) || (current == 0xA) || (current == 0xD)
+					|| ((current >= 0x20) && (current <= 0xD7FF))
+					|| ((current >= 0xE000) && (current <= 0xFFFD))
+					|| ((current >= 0x10000) && (current <= 0x10FFFF))) {
+                out.append(current);
+            }
+		}
+		return out.toString();
+	}
+
+	public static String leftPad(String str, int size, char padChar) {
+		if (str == null) {
+			return null;
+		} else {
+			int pads = size - str.length();
+			if (pads <= 0) {
+				return str;
+			} else {
+				return pads > 8192 ? leftPad(str, size, String.valueOf(padChar)) : padding(pads, padChar).concat(str);
+			}
+		}
+	}
+
+	public static String leftPad(String str, int size, String padStr) {
+		if (str == null) {
+			return null;
+		} else {
+			if (isEmpty(padStr)) {
+				padStr = " ";
+			}
+
+			int padLen = padStr.length();
+			int strLen = str.length();
+			int pads = size - strLen;
+			if (pads <= 0) {
+				return str;
+			} else if (padLen == 1 && pads <= 8192) {
+				return leftPad(str, size, padStr.charAt(0));
+			} else if (pads == padLen) {
+				return padStr.concat(str);
+			} else if (pads < padLen) {
+				return padStr.substring(0, pads).concat(str);
+			} else {
+				char[] padding = new char[pads];
+				char[] padChars = padStr.toCharArray();
+
+				for(int i = 0; i < pads; ++i) {
+					padding[i] = padChars[i % padLen];
+				}
+
+				return (new String(padding)).concat(str);
+			}
+		}
+	}
+
+	private static String padding(int repeat, char padChar) throws IndexOutOfBoundsException {
+		if (repeat < 0) {
+			throw new IndexOutOfBoundsException("Cannot pad a negative amount: " + repeat);
+		} else {
+			char[] buf = new char[repeat];
+
+			for(int i = 0; i < buf.length; ++i) {
+				buf[i] = padChar;
+			}
+
+			return new String(buf);
+		}
+	}
+}
diff --git a/src/main/java/org/springblade/es/config/ElasticsearchConfig.java b/src/main/java/org/springblade/es/config/ElasticsearchConfig.java
new file mode 100644
index 0000000..4498f6c
--- /dev/null
+++ b/src/main/java/org/springblade/es/config/ElasticsearchConfig.java
@@ -0,0 +1,24 @@
+package org.springblade.es.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.apache.http.HttpHost;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnProperty(value = "elasticsearch.enabled")
+public class ElasticsearchConfig {
+
+	@Value("${elasticsearch.host}")
+	private String elasticsearchHost;
+
+	@Bean
+	public RestHighLevelClient elasticsearchClient() {
+		RestClientBuilder builder = RestClient.builder(new HttpHost(elasticsearchHost, 9200, "http"));
+		return new RestHighLevelClient(builder);
+	}
+}
diff --git a/src/main/java/org/springblade/es/config/ElasticsearchInitializer.java b/src/main/java/org/springblade/es/config/ElasticsearchInitializer.java
new file mode 100644
index 0000000..7428633
--- /dev/null
+++ b/src/main/java/org/springblade/es/config/ElasticsearchInitializer.java
@@ -0,0 +1,24 @@
+package org.springblade.es.config;
+
+import org.springblade.es.service.ElasticsearchIndexInitializer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+// 暂时关闭
+//@Component
+public class ElasticsearchInitializer implements CommandLineRunner {
+
+	private final ElasticsearchIndexInitializer indexInitializer;
+
+	@Autowired
+	public ElasticsearchInitializer(ElasticsearchIndexInitializer indexInitializer) {
+		this.indexInitializer = indexInitializer;
+	}
+
+	@Override
+	public void run(String... args) {
+		String indexName = "your_index_name";
+		String mappingJson = "{\"properties\":{\"your_field\":{\"type\":\"text\"}}}";
+		indexInitializer.initializeIndex(indexName, mappingJson);
+	}
+}
diff --git a/src/main/java/org/springblade/es/controller/EsController.java b/src/main/java/org/springblade/es/controller/EsController.java
new file mode 100644
index 0000000..7aa4a08
--- /dev/null
+++ b/src/main/java/org/springblade/es/controller/EsController.java
@@ -0,0 +1,84 @@
+package org.springblade.es.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.annotation.PreAuth;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.RoleConstant;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.es.service.ElasticsearchDocumentService;
+import org.springblade.es.vo.EsParam;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * es 全文检索
+ */
+@RestController
+@RequestMapping("/es/es")
+@AllArgsConstructor
+@Api(value = "es 全文检索", tags = "es 全文检索")
+public class EsController {
+
+	private final ElasticsearchDocumentService elasticsearchDocumentService;
+
+	/**
+	 * 查询
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 1)
+	public R page(EsParam esParam, Query query) {
+		return R.data(elasticsearchDocumentService.selectDocumentPage(Condition.getPage(query), esParam));
+	}
+
+	/**
+	 * 初始化
+	 */
+	@GetMapping("/init")
+	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
+	@ApiOperationSupport(order = 2)
+	public R init(EsParam esParam) {
+		return R.status(elasticsearchDocumentService.init(esParam));
+	}
+
+//	/**
+//	 * 新增数据
+//	 */
+//	@GetMapping("/add")
+//	@ApiOperationSupport(order = 3)
+//	public R add(EsParam esParam) {
+//		return R.status(elasticsearchDocumentService.add(esParam,null));
+//	}
+//
+//	/**
+//	 * 修改数据
+//	 */
+//	@GetMapping("/update")
+//	@ApiOperationSupport(order = 4)
+//	public R update(EsParam esParam) {
+//		elasticsearchDocumentService.update(esParam,null,null);
+//		return R.status(true);
+//	}
+
+	/**
+	 * 根据索引删除
+	 */
+	@PostMapping("/removeBatchByIndexNames")
+	@ApiOperationSupport(order = 5)
+	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
+	public R removeBatchByIndexNames(@RequestParam String indexNames) {
+		return R.status(elasticsearchDocumentService.removeBatchByIndexNames(Func.toStrList(indexNames)));
+	}
+
+	/**
+	 * 根据条件删除
+	 */
+	@PostMapping("/removeByQuery")
+	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
+	@ApiOperationSupport(order = 6)
+	public R removeByQuery(EsParam esParam) {
+		return R.status(elasticsearchDocumentService.removeByQuery(esParam));
+	}
+}
diff --git a/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java b/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java
new file mode 100644
index 0000000..7fcfe2d
--- /dev/null
+++ b/src/main/java/org/springblade/es/service/ElasticsearchDocumentService.java
@@ -0,0 +1,787 @@
+package org.springblade.es.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.logging.log4j.util.Strings;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
+import org.elasticsearch.action.bulk.BulkRequest;
+import org.elasticsearch.action.bulk.BulkResponse;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.support.master.AcknowledgedResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.reindex.BulkByScrollResponse;
+import org.elasticsearch.index.reindex.DeleteByQueryRequest;
+import org.elasticsearch.index.reindex.UpdateByQueryRequest;
+import org.elasticsearch.script.Script;
+import org.elasticsearch.script.ScriptType;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springblade.common.cache.SysCache;
+import org.springblade.common.constant.EsTableConstant;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.es.vo.EsParam;
+import org.springblade.modules.article.entity.Article;
+import org.springblade.modules.article.service.ArticleService;
+import org.springblade.modules.doorplateAddress.entity.DoorplateAddressEntity;
+import org.springblade.modules.doorplateAddress.service.IDoorplateAddressService;
+import org.springblade.modules.grid.service.IGridRangeService;
+import org.springblade.modules.house.entity.HouseEntity;
+import org.springblade.modules.house.entity.HouseholdEntity;
+import org.springblade.modules.house.service.IHouseService;
+import org.springblade.modules.house.service.IHouseholdService;
+import org.springblade.modules.house.vo.HouseVO;
+import org.springblade.modules.house.vo.HouseholdVO;
+import org.springblade.modules.place.entity.PlaceEntity;
+import org.springblade.modules.place.service.IPlaceService;
+import org.springblade.modules.place.vo.PlaceVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class ElasticsearchDocumentService<T> {
+
+	@Autowired
+	private RestHighLevelClient client;
+
+	@Autowired
+	private ArticleService articleService;
+
+	@Autowired
+	private IPlaceService placeService;
+
+	@Autowired
+	private IHouseService houseService;
+
+	@Autowired
+	private IHouseholdService householdService;
+
+	@Autowired
+	private IGridRangeService gridRangeService;
+
+	@Autowired
+	private IDoorplateAddressService doorplateAddressService;
+
+	@Value("${elasticsearch.sync}")
+	private boolean elasticsearchSync;
+
+	@Value("${elasticsearch.indexName}")
+	private String indexName;
+
+	/**
+	 * 检查索引是否已存在
+	 *
+	 * @param indexName
+	 * @return
+	 */
+	public boolean isIndexExists(String indexName) {
+		// 检查索引是否已存在
+		GetIndexRequest request = new GetIndexRequest(indexName);
+		try {
+			return client.indices().exists(request, RequestOptions.DEFAULT);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+
+	/**
+	 * 初始化数据
+	 *
+	 * @param esParam
+	 * @return
+	 */
+	public boolean init(EsParam esParam) {
+		if (!Strings.isBlank(esParam.getTableName())) {
+			if (esParam.getTableName().equals("jczz_place")) {
+				// 场所
+				initPlace(esParam);
+			}
+			if (esParam.getTableName().equals("jczz_article")) {
+				// 通知文章
+				initArticle(esParam);
+			}
+			if (esParam.getTableName().equals("jczz_house")) {
+				// 房屋
+				initHouse(esParam);
+			}
+			if (esParam.getTableName().equals("jczz_household")) {
+				// 住户
+				initHousehold(esParam);
+			}
+		}
+		// 返回
+		return true;
+	}
+
+	/**
+	 * 初始化数据
+	 *
+	 * @param esParam
+	 * @return
+	 */
+	public boolean initPlace(EsParam esParam) {
+		// 查询
+		int total = placeService.getAllListTotal();
+		int size = 1000;
+		int num = total / size;
+		for (int i = 1; i <= num + 1; i++) {
+			List<PlaceVO> placeVOList = placeService.getAllList((i - 1) * size, size);
+			// 遍历
+			if (placeVOList.size() > 0) {
+				// 创建批量请求对象
+				BulkRequest bulkRequest = new BulkRequest();
+				for (PlaceVO place : placeVOList) {
+					// 入es库
+					// 初始化Elasticsearch客户端
+					IndexRequest indexRequest = new IndexRequest(esParam.getIndexName());
+					// 不设置id
+					// indexRequest.id("1");
+					indexRequest.source(
+						"tableId", place.getId().toString(),
+						"tableName", "jczz_place",
+						"title", place.getPlaceName(),
+						"name", place.getPrincipal(),
+						"phone", place.getPrincipalPhone(),
+						"idCard", place.getPrincipalIdCard(),
+						"content", place.getLocation(),
+						"communityCode", place.getCommunityCode()
+					);
+					// 加入集合
+					bulkRequest.add(indexRequest);
+				}
+				BulkResponse bulkResponse = null;
+				try {
+					// 执行批量插入
+					bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
+					// 刷新索引,确保文档可搜索
+					client.indices().refresh(new RefreshRequest(esParam.getIndexName()), RequestOptions.DEFAULT);
+				} catch (IOException e) {
+//					e.printStackTrace();
+				}
+//				System.out.println("批量插入结果: " + !bulkResponse.hasFailures());
+			}
+		}
+		// 返回
+		return true;
+	}
+
+	/**
+	 * 初始化公告数据
+	 *
+	 * @param esParam
+	 * @return
+	 */
+	public boolean initArticle(EsParam esParam) {
+		// 查询
+		int total = articleService.getAllListTotal();
+		int size = 10;
+		int num = total / size;
+		for (int i = 1; i <= num + 1; i++) {
+			// 查询
+			List<Article> articleList = articleService.getAllList((i - 1) * size, size);
+			// 遍历
+			if (articleList.size() > 0) {
+				BulkRequest bulkRequest = new BulkRequest();
+				for (Article article : articleList) {
+					// 初始化Elasticsearch客户端
+					IndexRequest indexRequest = new IndexRequest(esParam.getIndexName());
+					String communityNameListString
+						= SysCache.getAllCommunityNameListString(article.getArticleRange(),article.getId().toString());
+					Map<String, Object> map = new HashMap<>(1);
+					map.put("communityCode",communityNameListString);
+					String toString = new JSONObject(map).toString();
+					// 不设置id
+					// indexRequest.id("1");
+					indexRequest.source("tableId", article.getId().toString(),
+						"tableName", "jczz_article",
+						"title", article.getTitle(),
+						"communityCode", toString,
+						"type", null != article.getType() ? article.getType().toString() : "",
+						"content", article.getContent(),
+						"articleType", article.getArticleType());
+					// 加入集合
+					bulkRequest.add(indexRequest);
+				}
+				BulkResponse bulkResponse = null;
+				try {
+					// 执行批量插入
+					bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
+					// 刷新索引,确保文档可搜索
+					client.indices().refresh(new RefreshRequest(esParam.getIndexName()), RequestOptions.DEFAULT);
+				} catch (IOException e) {
+//					e.printStackTrace();
+				}
+//				System.out.println("批量插入结果: " + !bulkResponse.hasFailures());
+			}
+		}
+		// 返回
+		return true;
+	}
+
+	/**
+	 * 初始化住户数据
+	 *
+	 * @param esParam
+	 * @return
+	 */
+	public boolean initHousehold(EsParam esParam) {
+		// 查询
+		int total = householdService.getAllListTotal();
+		int size = 1000;
+		int num = total / size;
+		for (int i = 1; i <= num + 1; i++) {
+			// 查询
+			List<HouseholdVO> householdVOList = householdService.getAllList((i - 1) * size, size);
+			// 遍历
+			if (householdVOList.size() > 0) {
+				BulkRequest bulkRequest = new BulkRequest();
+				for (HouseholdVO household : householdVOList) {
+					// 初始化Elasticsearch客户端
+					IndexRequest indexRequest = new IndexRequest(esParam.getIndexName());
+					// 不设置id
+					// indexRequest.id("1");
+					indexRequest.source(
+						"tableId", household.getId().toString(),
+						"tableName", "jczz_household",
+						"title", household.getName(),
+						"relationship", household.getRelationship(),
+						"name", household.getName(),
+						"phone", household.getPhoneNumber(),
+						"idCard", household.getIdCard(),
+						"content", household.getAddress(),
+						"communityCode", household.getCommunityCode()
+					);
+					// 加入集合
+					bulkRequest.add(indexRequest);
+				}
+				BulkResponse bulkResponse = null;
+				try {
+					// 执行批量插入
+					bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
+					// 刷新索引,确保文档可搜索
+					client.indices().refresh(new RefreshRequest(esParam.getIndexName()), RequestOptions.DEFAULT);
+				} catch (IOException e) {
+//					e.printStackTrace();
+				}
+//				System.out.println("批量插入结果: " + !bulkResponse.hasFailures());
+			}
+		}
+		// 返回
+		return true;
+	}
+
+	/**
+	 * 初始化房屋数据
+	 *
+	 * @param esParam
+	 * @return
+	 */
+	public boolean initHouse(EsParam esParam) {
+		// 查询
+		int total = houseService.getAllListTotal();
+		int size = 1000;
+		int num = total / size;
+		for (int i = 1; i <= num + 1; i++) {
+			// 查询
+			List<HouseVO> houseVOList = houseService.getAllList((i - 1) * size, size);
+			// 遍历
+			if (houseVOList.size() > 0) {
+				BulkRequest bulkRequest = new BulkRequest();
+				for (HouseVO house : houseVOList) {
+					// 初始化Elasticsearch客户端
+					IndexRequest indexRequest = new IndexRequest(esParam.getIndexName());
+					// 不设置id
+					// indexRequest.id("1");
+					indexRequest.source(
+						"tableId", house.getId().toString(),
+						"tableName", "jczz_house",
+						"title", house.getHouseName(),
+						"name", null,
+						"phone", null,
+						"idCard", null,
+						"content", null,
+						"communityCode", house.getCommunityCode()
+					);
+					// 加入集合
+					bulkRequest.add(indexRequest);
+				}
+				BulkResponse bulkResponse = null;
+				try {
+					// 执行批量插入
+					bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
+					// 刷新索引,确保文档可搜索
+					client.indices().refresh(new RefreshRequest(esParam.getIndexName()), RequestOptions.DEFAULT);
+				} catch (IOException e) {
+//					e.printStackTrace();
+				}
+//				System.out.println("批量插入结果: " + !bulkResponse.hasFailures());
+			}
+		}
+		// 返回
+		return true;
+	}
+
+	/**
+	 * 新增公告同步
+	 *
+	 * @param esParam
+	 * @param article
+	 */
+	@Async
+	public void addArticle(EsParam esParam, Article article) {
+		if (elasticsearchSync) {
+			// 查询当前文章范围对应的社区名称字符串集合
+			String communityNameListString = SysCache.getAllCommunityNameListString(article.getArticleRange(),article.getId().toString());
+			Map<String, Object> map = new HashMap<>(1);
+			map.put("communityCode",communityNameListString);
+			String toString = new JSONObject(map).toString();
+			try {
+				indexDocument(esParam.getIndexName(),
+					"tableId", article.getId().toString(),
+					"tableName", "jczz_article",
+					"title", article.getTitle(),
+					"communityCode", toString,
+					"type", null != article.getType() ? article.getType().toString() : "",
+					"content", article.getContent(),
+					"articleType", article.getArticleType()
+				);
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * 新增场所同步
+	 *
+	 * @param esParam
+	 * @param place
+	 */
+	@Async
+	public void addPlace(EsParam esParam, PlaceEntity place) {
+		if (elasticsearchSync) {
+			try {
+				indexDocument(esParam.getIndexName(),
+					"tableId", place.getId().toString(),
+					"tableName", "jczz_place",
+					"title", place.getPlaceName(),
+					"name", place.getPrincipal(),
+					"phone", place.getPrincipalPhone(),
+					"idCard", place.getPrincipalIdCard(),
+					"content", place.getLocation(),
+					"communityCode", placeService.getCommunityCode(place.getId())
+				);
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * 新增房屋同步
+	 *
+	 * @param esParam
+	 * @param house
+	 */
+	@Async
+	public void addHouse(EsParam esParam, HouseEntity house) {
+		if (elasticsearchSync) {
+			try {
+				indexDocument(esParam.getIndexName(),
+					"tableId", house.getId().toString(),
+					"tableName", "jczz_house",
+					"title", house.getHouseName(),
+					"name", null,
+					"phone", null,
+					"idCard", null,
+					"content", null,
+					"communityCode", houseService.getCommunityCode(house.getId())
+				);
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * 新增住户同步
+	 *
+	 * @param esParam
+	 * @param household
+	 */
+	@Async
+	public void addHousehold(EsParam esParam, HouseholdEntity household) {
+		if (elasticsearchSync) {
+			// 如果关系为空,则默认为19
+			if (household.getRelationship() == null) {
+				household.setRelationship(19);
+			}
+			try {
+				indexDocument(esParam.getIndexName(),
+					"tableId", household.getId().toString(),
+					"tableName", "jczz_household",
+					"title", household.getName(),
+					"name", household.getName(),
+					"phone", household.getPhoneNumber(),
+					"idCard", household.getIdCard(),
+					"relationship", household.getRelationship().toString(),
+					"content", getAddress(household),
+					"communityCode", householdService.getCommunityCode(household.getId())
+				);
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * 获取房屋地址
+	 * @param household
+	 * @return
+	 */
+	public String getAddress(HouseholdEntity household) {
+		if (!Strings.isBlank(household.getHouseCode())){
+			// 查询对应的房屋地址
+			QueryWrapper<DoorplateAddressEntity> queryWrapper = new QueryWrapper<>();
+			queryWrapper.eq("address_code",household.getHouseCode());
+			List<DoorplateAddressEntity> list = doorplateAddressService.list(queryWrapper);
+			if (list.size()>0){
+				return list.get(0).getAddressName();
+			}
+			// 房屋查不到的情况
+			if (!Strings.isBlank(household.getCurrentAddress())){
+				return household.getCurrentAddress();
+			}
+		}else {
+			return household.getCurrentAddress();
+		}
+		return null;
+	}
+
+	/**
+	 * 插入数据到es
+	 *
+	 * @param index
+	 * @param values
+	 * @throws IOException
+	 */
+	public void indexDocument(String index, String... values) throws IOException {
+		// 初始化Elasticsearch客户端
+		IndexRequest indexRequest = new IndexRequest(index);
+
+		// 不设置id
+//		indexRequest.id("1");
+		indexRequest.source(values);
+
+		IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
+		// 刷新索引,确保文档可搜索
+		client.indices().refresh(new RefreshRequest(index), RequestOptions.DEFAULT);
+		System.out.println("Indexed document with id: " + indexResponse.getId());
+
+	}
+
+	/**
+	 * 查询数据
+	 *
+	 * @param page
+	 * @param esParam
+	 * @return
+	 */
+	public Object selectDocumentPage(IPage<Object> page, EsParam esParam) {
+		if (Strings.isBlank(esParam.getIndexName())){
+			esParam.setIndexName(indexName);
+		}
+		// 判断索引是否存在
+		if (isIndexExists(esParam.getIndexName())) {
+			// 全文搜索
+			SearchRequest searchRequest = new SearchRequest(esParam.getIndexName());
+			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+			//		searchSourceBuilder.query(QueryBuilders.multiMatchQuery(esParam.getSearchKey(),
+			//			"content",
+			//			"name",
+			//			"title",
+			//			"location",
+			//			"phone",
+			//			"idCard",
+			//			"communityCode")
+			//			.type(MultiMatchQueryBuilder.Type.BEST_FIELDS)
+			//		);
+			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+//			boolQueryBuilder.should(QueryBuilders.matchQuery("content", esParam.getSearchKey()));
+//			boolQueryBuilder.should(QueryBuilders.matchQuery("name", esParam.getSearchKey()));
+			boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("title", esParam.getSearchKey()));
+//			boolQueryBuilder.should(QueryBuilders.matchQuery("location", esParam.getSearchKey()));
+//			boolQueryBuilder.should(QueryBuilders.matchQuery("phone", esParam.getSearchKey()));
+//			boolQueryBuilder.should(QueryBuilders.matchQuery("idCard", esParam.getSearchKey()));
+			if (!Strings.isBlank(esParam.getTableName())) {
+				boolQueryBuilder.must(QueryBuilders.matchQuery("tableName", esParam.getTableName()));
+			}
+			String roleName = SpringUtils.getRequestParam("roleName");
+			String communityCode = SpringUtils.getRequestParam("communityCode");
+			if (!Strings.isBlank(communityCode)) {
+				if (!Strings.isBlank(roleName) && roleName.equals("inhabitant") && !Strings.isBlank(esParam.getHouseCode())){
+					// 居民根据房屋对应的小区过滤
+					boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("communityCode",gridRangeService.getDistrictIdByHouseCode(esParam.getHouseCode())));
+				}else {
+					// 设置查询社区名称,编号有多个,数字类型目前无法匹配到
+					boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("communityCode", communityCode));
+				}
+			}
+			if (!Strings.isBlank(roleName)){
+				if (roleName.equals("wgy") || roleName.equals("mj")){
+					// 不查公告
+					boolQueryBuilder.mustNot(QueryBuilders.matchQuery("tableName", "jczz_article"));
+				}
+				if (roleName.equals("inhabitant")){
+					// 只查公告
+					boolQueryBuilder.must(QueryBuilders.matchQuery("tableName", "jczz_article"));
+				}
+				if (roleName.equals("wzcj")){
+					// 只查场所
+					boolQueryBuilder.must(QueryBuilders.matchQuery("tableName", "jczz_place"));
+				}
+			}
+
+			boolQueryBuilder.minimumShouldMatch(1);
+			searchSourceBuilder.query(boolQueryBuilder);
+
+			int current = (int) page.getCurrent();
+			int size = (int) page.getSize();
+			//设置分页
+			searchSourceBuilder.size(size);
+			searchSourceBuilder.from((current - 1) * size);
+
+			//将搜索资源对象设置到搜索客户端中
+			searchRequest.source(searchSourceBuilder);
+			//查询
+			SearchResponse searchResponse = null;
+			try {
+				searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			//解析搜索返回值
+			SearchHits searchHits = searchResponse.getHits();
+			//查询的总数
+			long count = searchHits.getTotalHits().value;
+			List<Object> list = new ArrayList<>();
+			for (SearchHit hit : searchHits) {
+//				System.out.println("hit.getId() = " + hit.getId());
+				Map<String, Object> result = hit.getSourceAsMap();
+				if (null != result){
+					if (result.get("tableName").toString().equals("jczz_article")){
+						result.put("typeName","通知公告");
+					}
+					if (result.get("tableName").toString().equals("jczz_place")){
+						result.put("typeName","经营场所");
+					}
+					if (result.get("tableName").toString().equals("jczz_house")){
+						result.put("typeName","房屋");
+					}
+					if (result.get("tableName").toString().equals("jczz_household")){
+						result.put("typeName","住户");
+					}
+				}
+				// 文档源数据
+//			String source = hit.getSourceAsString();
+				list.add(result);
+			}
+			page.setRecords(list);
+			page.setTotal(count);
+		}
+		return page;
+	}
+
+	/**
+	 * 根据索引删除
+	 */
+	public boolean removeBatchByIndexNames(List<String> indexNames) {
+		for (String indexName : indexNames) {
+			// 索引存在才删除
+			if (isIndexExists(indexName)) {
+				DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
+				try {
+					// 执行删除索引操作
+					AcknowledgedResponse deleteResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
+
+					// 输出操作结果
+					boolean acknowledged = deleteResponse.isAcknowledged();
+//					System.out.println("索引删除成功: " + acknowledged);
+				} catch (IOException e) {
+//					e.printStackTrace();
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 新增数据--有问题,待调整
+	 */
+	@Async
+	public boolean add(EsParam esParam, T item) {
+		String str = "tableName," + esParam.getTableName() + ",";
+		CommonParamSet commonParamSet =
+			new CommonParamSet().setFieldValue(item.getClass(), item, EsTableConstant.articleList, str);
+		try {
+			indexDocument(esParam.getIndexName(), str);
+		} catch (IOException e) {
+//			e.printStackTrace();
+		}
+		return true;
+	}
+
+
+	/**
+	 * 修改数据
+	 */
+	@Async
+	public void update(EsParam esParam, T item,List<String> columnList) {
+		// 判断索引是否存在
+		if (elasticsearchSync && isIndexExists(esParam.getIndexName())) {
+			// 创建更新请求
+			UpdateByQueryRequest updateRequest = new UpdateByQueryRequest(esParam.getIndexName());
+
+			// 设置查询条件,例如:更新所有字段text包含"old text"的文档
+			updateRequest.setQuery(
+				QueryBuilders.boolQuery()
+					.must(QueryBuilders.matchQuery("tableId", esParam.getTableId()))
+					.must(QueryBuilders.matchQuery("tableName", esParam.getTableName()))
+			);
+
+			Map<String, Object> data = new HashMap<String, Object>();
+			data.put("tableName", esParam.getTableName());
+			if (esParam.getTableName().equals("jczz_article")) {
+				setArticleMap((Article) item, data);
+			}
+			if (esParam.getTableName().equals("jczz_place")) {
+				setPlaceMap((PlaceEntity) item, data);
+			}
+			if (esParam.getTableName().equals("jczz_house")) {
+				setHouseMap((HouseEntity) item, data);
+			}
+			if (esParam.getTableName().equals("jczz_household")) {
+				setHouseholdMap((HouseholdEntity) item, data);
+			}
+			Map<String, Object> param = new HashMap<String, Object>();
+			param.put("data", data);
+
+			// script will read data param value and assign to document source
+			String source = "ctx._source=params.data";
+			Script script = new Script(ScriptType.INLINE, "painless", source, param);
+			updateRequest.setScript(script);
+			// 执行更新操作
+			try {
+				client.updateByQuery(updateRequest, RequestOptions.DEFAULT);
+				// 刷新索引,确保文档可搜索
+				client.indices().refresh(new RefreshRequest(esParam.getIndexName()), RequestOptions.DEFAULT);
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * 设置公告map
+	 * @param item
+	 * @param data
+	 */
+	private void setArticleMap(Article item, Map<String, Object> data) {
+		// 查询当前文章范围对应的社区名称字符串集合
+		String communityNameListString = SysCache.getAllCommunityNameListString(item.getArticleRange(),item.getId().toString());
+		Map<String, Object> map = new HashMap<>(1);
+		map.put("communityCode",communityNameListString);
+		String toString = new JSONObject(map).toString();
+		data.put("tableId",item.getId());
+		data.put("title",item.getTitle());
+		data.put("type",item.getType());
+		data.put("content",item.getContent());
+		data.put("articleType",item.getArticleType());
+		data.put("communityCode",toString);
+	}
+	/**
+	 * 设置场所map
+	 * @param item
+	 * @param data
+	 */
+	private void setPlaceMap(PlaceEntity item, Map<String, Object> data) {
+		data.put("communityCode",placeService.getCommunityCode(item.getId()));
+		data.put("tableId",item.getId());
+		data.put("title",item.getPlaceName());
+		data.put("name",item.getPrincipal());
+		data.put("phone",item.getPrincipalPhone());
+		data.put("idCard",item.getPrincipalIdCard());
+		data.put("content",item.getLocation());
+	}
+	/**
+	 * 设置房屋map
+	 * @param item
+	 * @param data
+	 */
+	private void setHouseMap(HouseEntity item, Map<String, Object> data) {
+		data.put("communityCode",houseService.getCommunityCode(item.getId()));
+		data.put("tableId",item.getId());
+		data.put("title",item.getHouseName());
+	}
+	/**
+	 * 设置住户map
+	 * @param item
+	 * @param data
+	 */
+	private void setHouseholdMap(HouseholdEntity item, Map<String, Object> data) {
+		data.put("communityCode",householdService.getCommunityCode(item.getId()));
+		data.put("tableId",item.getId());
+		data.put("title",item.getName());
+		data.put("relationship",item.getRelationship());
+		data.put("name",item.getName());
+		data.put("phone",item.getPhoneNumber());
+		data.put("idCard",item.getIdCard());
+		data.put("content",getAddress(item));
+	}
+
+	/**
+	 * 删除数据--根据条件
+	 */
+	public boolean removeByQuery(EsParam esParam) {
+		if (elasticsearchSync && isIndexExists(esParam.getIndexName())) {
+			DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(esParam.getIndexName());
+			// 根据多个条件 生成 boolQueryBuilder
+			BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+			if (!Strings.isBlank(esParam.getTableId())){
+				boolQueryBuilder
+					.must(QueryBuilders.matchQuery("tableId", esParam.getTableId()));
+			}
+			if (!Strings.isBlank(esParam.getTableName())) {
+				boolQueryBuilder
+					.must(QueryBuilders.matchQuery("tableName", esParam.getTableName()));
+			}
+			deleteByQueryRequest.setQuery(boolQueryBuilder);
+			try {
+				BulkByScrollResponse bulkResponse =
+					client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
+		}
+		return true;
+	}
+}
diff --git a/src/main/java/org/springblade/es/service/ElasticsearchIndexInitializer.java b/src/main/java/org/springblade/es/service/ElasticsearchIndexInitializer.java
new file mode 100644
index 0000000..dc3b490
--- /dev/null
+++ b/src/main/java/org/springblade/es/service/ElasticsearchIndexInitializer.java
@@ -0,0 +1,33 @@
+package org.springblade.es.service;
+
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.CreateIndexRequest;
+import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.xcontent.XContentType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ElasticsearchIndexInitializer {
+
+	@Autowired
+	private RestHighLevelClient client;
+
+	public void initializeIndex(String indexName, String mappingJson) {
+		try {
+			// 检查索引是否已存在
+			GetIndexRequest request = new GetIndexRequest(indexName);
+			boolean indexExists = client.indices().exists(request, RequestOptions.DEFAULT);
+
+			// 如果索引不存在,则创建索引并设置映射
+			if (!indexExists) {
+				CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
+				createIndexRequest.mapping(mappingJson, XContentType.JSON);
+				client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/src/main/java/org/springblade/es/service/ElasticsearchIndexService.java b/src/main/java/org/springblade/es/service/ElasticsearchIndexService.java
new file mode 100644
index 0000000..1ab0b3f
--- /dev/null
+++ b/src/main/java/org/springblade/es/service/ElasticsearchIndexService.java
@@ -0,0 +1,37 @@
+package org.springblade.es.service;
+
+import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
+import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.xcontent.XContentBuilder;
+import org.elasticsearch.xcontent.json.JsonXContent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+
+@Service
+public class ElasticsearchIndexService {
+
+	@Autowired
+	private RestHighLevelClient client;
+
+	public void createIndex() throws IOException {
+		CreateIndexRequest request = new CreateIndexRequest("your_index");
+
+		XContentBuilder builder = JsonXContent.contentBuilder()
+			.startObject()
+			.startObject("properties")
+			.startObject("field1").field("type", "text").endObject()
+			.startObject("field2").field("type", "text").endObject()
+			// ... 定义其他字段
+			.endObject()
+			.endObject();
+
+		request.mapping("_doc", builder);
+		CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
+		boolean acknowledged = createIndexResponse.isAcknowledged();
+		System.out.println(acknowledged);
+	}
+}
diff --git a/src/main/java/org/springblade/es/service/ElasticsearchSearchService.java b/src/main/java/org/springblade/es/service/ElasticsearchSearchService.java
new file mode 100644
index 0000000..63a0ec2
--- /dev/null
+++ b/src/main/java/org/springblade/es/service/ElasticsearchSearchService.java
@@ -0,0 +1,29 @@
+package org.springblade.es.service;
+
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+
+@Service
+public class ElasticsearchSearchService {
+
+	@Autowired
+	private RestHighLevelClient client;
+
+	public SearchResponse search(String index, String query) throws IOException {
+		SearchRequest searchRequest = new SearchRequest(index);
+		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+		searchSourceBuilder.query(QueryBuilders.matchQuery("field1", query)); // 搜索field1字段
+		searchSourceBuilder.query(QueryBuilders.matchQuery("field2", query)); // 搜索field2字段
+		searchRequest.source(searchSourceBuilder);
+
+		return client.search(searchRequest, RequestOptions.DEFAULT);
+	}
+}
diff --git a/src/main/java/org/springblade/es/test/ElasticSearchExample.java b/src/main/java/org/springblade/es/test/ElasticSearchExample.java
new file mode 100644
index 0000000..7919835
--- /dev/null
+++ b/src/main/java/org/springblade/es/test/ElasticSearchExample.java
@@ -0,0 +1,96 @@
+package org.springblade.es.test;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpHost;
+import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class ElasticSearchExample {
+
+	public static void main(String[] args) throws IOException {
+		// 初始化Elasticsearch客户端
+		RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
+		RestHighLevelClient client = new RestHighLevelClient(builder);
+
+		// 索引用户数据
+		IndexRequest userIndexRequest = new IndexRequest("users_articles");
+		userIndexRequest.source("name", "John Doe", "type", "user");
+		IndexResponse userIndexResponse = client.index(userIndexRequest, RequestOptions.DEFAULT);
+
+		// 索引文章数据
+		IndexRequest articleIndexRequest = new IndexRequest("users_articles");
+		articleIndexRequest.source("title", "Elasticsearch Introduction", "type", "article");
+		IndexResponse articleIndexResponse = client.index(articleIndexRequest, RequestOptions.DEFAULT);
+
+		// 刷新索引,确保文档可搜索
+		client.indices().refresh(new RefreshRequest("users_articles"), RequestOptions.DEFAULT);
+
+		// 全文搜索
+		SearchRequest searchRequest = new SearchRequest("users_articles");
+		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+		searchSourceBuilder.query(QueryBuilders.multiMatchQuery("Elasticsearch", "name", "title"));
+
+		//设置分页
+		searchSourceBuilder.size(10);
+		searchSourceBuilder.from(0);
+
+		//将搜索资源对象设置到搜索客户端中
+		searchRequest.source(searchSourceBuilder);
+		//查询
+		SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+		//解析搜索返回值
+		SearchHits searchHits = searchResponse.getHits();
+		//查询的总数
+		long count = searchHits.getTotalHits().value;
+
+		for (SearchHit hit : searchHits) {
+			Map<String, Object> result = hit.getSourceAsMap();
+			// 根据类型处理结果
+			String type = (String) result.get("type");
+			if ("user".equals(type)) {
+				// 处理用户名
+				String name = (String) result.get("name");
+				System.out.println("User: " + name);
+			} else if ("article".equals(type)) {
+				// 处理文章标题
+				String title = (String) result.get("title");
+				System.out.println("Article: " + title);
+			}
+		}
+
+		// 关闭客户端
+		client.close();
+	}
+
+	/**
+	 * 设置高亮
+	 * @param keywords
+	 * @param info
+	 * @return
+	 */
+	public static String setHighLight(String keywords, String info) {
+		if (StringUtils.isBlank(keywords)|| StringUtils.isBlank(info)) {
+			return info;
+		}
+		String[] keywordArray = keywords.split(" ");
+		String newInfo = info;
+		for (String keyword : keywordArray) {
+			newInfo = newInfo.replace(keyword, "<em style=\"color:red\">" + keyword + "</em>");
+		}
+		return newInfo;
+	}
+}
diff --git a/src/main/java/org/springblade/es/vo/EsParam.java b/src/main/java/org/springblade/es/vo/EsParam.java
new file mode 100644
index 0000000..daa4f81
--- /dev/null
+++ b/src/main/java/org/springblade/es/vo/EsParam.java
@@ -0,0 +1,37 @@
+package org.springblade.es.vo;
+
+import lombok.Data;
+
+@Data
+public class EsParam {
+
+	/**
+	 * 索引名称
+	 */
+	private String indexName;
+
+	/**
+	 * 表名称
+	 */
+	private String tableName;
+
+	/**
+	 * searchKey
+	 */
+	private String searchKey;
+
+	/**
+	 * 表id
+	 */
+	private String tableId;
+
+	/**
+	 * 社区编号
+	 */
+	private String communityCode;
+
+	/**
+	 * 地址编码
+	 */
+	private String houseCode;
+}
diff --git a/src/main/java/org/springblade/flow/core/entity/BladeFlow.java b/src/main/java/org/springblade/flow/core/entity/BladeFlow.java
index fcc57ec..9cd880f 100644
--- a/src/main/java/org/springblade/flow/core/entity/BladeFlow.java
+++ b/src/main/java/org/springblade/flow/core/entity/BladeFlow.java
@@ -16,6 +16,7 @@
  */
 package org.springblade.flow.core.entity;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.flow.core.constant.ProcessConstant;
@@ -36,8 +37,25 @@
 	// 小区id
 	private String districtId;
 
+	// 小区名称
+	private String districtName;
+
 	// 时间名称
 	private String name;
+
+	/**
+	 * 开始时间
+	 */
+	@ApiModelProperty(value = "开始时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date startTimes;
+
+	/**
+	 * 结束时间
+	 */
+	@ApiModelProperty(value = "结束时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date endTimes;
 
 	/**
 	 * 联系人姓名
@@ -69,6 +87,7 @@
 	/**
 	 * 任务执行人名称
 	 */
+	@ApiModelProperty(value = "任务执行人名称")
 	private String assigneeName;
 	/**
 	 * 流程分类
@@ -81,6 +100,7 @@
 	/**
 	 * 创建时间
 	 */
+	@ApiModelProperty(value = "创建时间")
 	private Date createTime;
 	/**
 	 * 结束时间
@@ -145,10 +165,12 @@
 	/**
 	 * 历史活动流程
 	 */
+	@ApiModelProperty(value = "历史活动流程")
 	private String historyActivityName;
 	/**
 	 * 历史活动耗时
 	 */
+	@ApiModelProperty(value = "历史活动耗时")
 	private String historyActivityDurationTime;
 	/**
 	 * 业务绑定Table
@@ -165,6 +187,7 @@
 	/**
 	 * 任务意见
 	 */
+	@ApiModelProperty(value = "任务意见")
 	private String comment;
 	/**
 	 * 是否通过
diff --git a/src/main/java/org/springblade/flow/engine/controller/FlowFollowController.java b/src/main/java/org/springblade/flow/engine/controller/FlowFollowController.java
index 63a5b6d..ed49eb3 100644
--- a/src/main/java/org/springblade/flow/engine/controller/FlowFollowController.java
+++ b/src/main/java/org/springblade/flow/engine/controller/FlowFollowController.java
@@ -42,7 +42,7 @@
 @RestController
 @RequestMapping(AppConstant.APPLICATION_FLOW_NAME + "/follow")
 @AllArgsConstructor
-@PreAuth("hasAnyRole('administrator', 'admin','jdgly','sqgly')")
+//@PreAuth("hasAnyRole('administrator', 'admin','jdgly','sqgly')")
 @ApiIgnore
 public class FlowFollowController {
 
diff --git a/src/main/java/org/springblade/flow/engine/controller/FlowManagerController.java b/src/main/java/org/springblade/flow/engine/controller/FlowManagerController.java
index 0b3297d..46f5a55 100644
--- a/src/main/java/org/springblade/flow/engine/controller/FlowManagerController.java
+++ b/src/main/java/org/springblade/flow/engine/controller/FlowManagerController.java
@@ -51,7 +51,7 @@
 @RequestMapping(AppConstant.APPLICATION_FLOW_NAME + "/manager")
 @AllArgsConstructor
 @Api(value = "流程管理接口", tags = "流程管理接口")
-@PreAuth("hasAnyRole('administrator', 'admin','jdgly','sqgly')")
+//@PreAuth("hasAnyRole('administrator', 'admin','jdgly','sqgly')")
 @ApiIgnore
 public class FlowManagerController {
 
diff --git a/src/main/java/org/springblade/flow/engine/controller/FlowModelController.java b/src/main/java/org/springblade/flow/engine/controller/FlowModelController.java
index 9188da9..372cbf2 100644
--- a/src/main/java/org/springblade/flow/engine/controller/FlowModelController.java
+++ b/src/main/java/org/springblade/flow/engine/controller/FlowModelController.java
@@ -47,7 +47,7 @@
 @RestController
 @RequestMapping(AppConstant.APPLICATION_FLOW_NAME + "/model")
 @AllArgsConstructor
-@PreAuth("hasAnyRole('administrator', 'admin','jdgly','sqgly')")
+//@PreAuth("hasAnyRole('administrator', 'admin','jdgly','sqgly')")
 @ApiIgnore
 public class FlowModelController {
 
diff --git a/src/main/java/org/springblade/modules/article/controller/ArticleBrowseController.java b/src/main/java/org/springblade/modules/article/controller/ArticleBrowseController.java
new file mode 100644
index 0000000..3daf05a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/controller/ArticleBrowseController.java
@@ -0,0 +1,106 @@
+package org.springblade.modules.article.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.article.entity.ArticleBrowseEntity;
+import org.springblade.modules.article.vo.ArticleBrowseVO;
+import org.springblade.modules.article.service.IArticleBrowseService;
+
+/**
+ * 文章浏览记录表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-articleBrowse/articleBrowse")
+@Api(value = "文章浏览记录表", tags = "文章浏览记录表接口")
+public class ArticleBrowseController{
+
+	private final IArticleBrowseService articleBrowseService;
+
+	/**
+	 * 文章浏览记录表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入articleBrowse")
+	public R detail(ArticleBrowseEntity articleBrowse) {
+		ArticleBrowseEntity detail = articleBrowseService.getOne(Condition.getQueryWrapper(articleBrowse));
+		return R.data(detail);
+	}
+	/**
+	 * 文章浏览记录表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入articleBrowse")
+	public R list(ArticleBrowseEntity articleBrowse, Query query) {
+		IPage<ArticleBrowseEntity> pages = articleBrowseService.page(Condition.getPage(query), Condition.getQueryWrapper(articleBrowse));
+		return R.data(pages);
+	}
+
+	/**
+	 * 文章浏览记录表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入articleBrowse")
+	public R<IPage<ArticleBrowseVO>> page(ArticleBrowseVO articleBrowse, Query query) {
+		IPage<ArticleBrowseVO> pages = articleBrowseService.selectArticleBrowsePage(Condition.getPage(query), articleBrowse);
+		return R.data(pages);
+	}
+
+	/**
+	 * 文章浏览记录表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入articleBrowse")
+	public R save(@Valid @RequestBody ArticleBrowseEntity articleBrowse) {
+		return R.status(articleBrowseService.save(articleBrowse));
+	}
+
+	/**
+	 * 文章浏览记录表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入articleBrowse")
+	public R update(@Valid @RequestBody ArticleBrowseEntity articleBrowse) {
+		return R.status(articleBrowseService.updateById(articleBrowse));
+	}
+
+	/**
+	 * 文章浏览记录表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入articleBrowse")
+	public R submit(@Valid @RequestBody ArticleBrowseEntity articleBrowse) {
+		return R.status(articleBrowseService.saveOrUpdate(articleBrowse));
+	}
+
+	/**
+	 * 文章浏览记录表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(articleBrowseService.removeByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/controller/ArticleIntegralController.java b/src/main/java/org/springblade/modules/article/controller/ArticleIntegralController.java
new file mode 100644
index 0000000..331ecdc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/controller/ArticleIntegralController.java
@@ -0,0 +1,107 @@
+package org.springblade.modules.article.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.article.entity.ArticleIntegralEntity;
+import org.springblade.modules.article.vo.ArticleIntegralVO;
+import org.springblade.modules.article.service.IArticleIntegralService;
+
+/**
+ * 文章浏览积分表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-articleIntegral/articleIntegral")
+@Api(value = "文章浏览积分表", tags = "文章浏览积分表接口")
+public class ArticleIntegralController{
+
+	private final IArticleIntegralService articleIntegralService;
+
+	/**
+	 * 文章浏览积分表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入articleIntegral")
+	public R detail(ArticleIntegralEntity articleIntegral) {
+		ArticleIntegralEntity detail = articleIntegralService.getOne(Condition.getQueryWrapper(articleIntegral));
+		return R.data(detail);
+	}
+	/**
+	 * 文章浏览积分表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入articleIntegral")
+	public R list(ArticleIntegralEntity articleIntegral, Query query) {
+		IPage<ArticleIntegralEntity> pages = articleIntegralService.page(Condition.getPage(query), Condition.getQueryWrapper(articleIntegral));
+		return R.data(pages);
+	}
+
+	/**
+	 * 文章浏览积分表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入articleIntegral")
+	public R<IPage<ArticleIntegralVO>> page(ArticleIntegralVO articleIntegral, Query query) {
+		IPage<ArticleIntegralVO> pages = articleIntegralService.selectArticleIntegralPage(Condition.getPage(query), articleIntegral);
+		return R.data(pages);
+	}
+
+	/**
+	 * 文章浏览积分表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入articleIntegral")
+	public R save(@Valid @RequestBody ArticleIntegralEntity articleIntegral) {
+		return R.status(articleIntegralService.save(articleIntegral));
+	}
+
+	/**
+	 * 文章浏览积分表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入articleIntegral")
+	public R update(@Valid @RequestBody ArticleIntegralEntity articleIntegral) {
+		return R.status(articleIntegralService.updateById(articleIntegral));
+	}
+
+	/**
+	 * 文章浏览积分表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入articleIntegral")
+	public R submit(@Valid @RequestBody ArticleIntegralEntity articleIntegral) {
+		return R.status(articleIntegralService.saveOrUpdate(articleIntegral));
+	}
+
+	/**
+	 * 文章浏览积分表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(articleIntegralService.removeByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/entity/ArticleBrowseEntity.java b/src/main/java/org/springblade/modules/article/entity/ArticleBrowseEntity.java
new file mode 100644
index 0000000..cfcc1bc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/entity/ArticleBrowseEntity.java
@@ -0,0 +1,66 @@
+package org.springblade.modules.article.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 文章浏览记录表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@TableName("jczz_article_browse")
+@ApiModel(value = "ArticleBrowse对象", description = "文章浏览记录表")
+public class ArticleBrowseEntity implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty("主键id")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 文章id
+	 */
+	@ApiModelProperty(value = "文章id")
+	private Long articleId;
+
+	/**
+	 * 创建人(浏览人用户id)
+	 */
+	@ApiModelProperty(value = "创建人(浏览人用户id)")
+	@TableField(fill = FieldFill.INSERT)
+	private Long createUser;
+
+	/**
+	 * 创建时间
+	 */
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty("创建时间")
+	@TableField(fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/**
+	 * 是否删除 0:否  1:是
+	 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+
+}
diff --git a/src/main/java/org/springblade/modules/article/entity/ArticleIntegralEntity.java b/src/main/java/org/springblade/modules/article/entity/ArticleIntegralEntity.java
new file mode 100644
index 0000000..3ca3277
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/entity/ArticleIntegralEntity.java
@@ -0,0 +1,77 @@
+package org.springblade.modules.article.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 文章浏览积分表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@TableName("jczz_article_integral")
+@ApiModel(value = "ArticleIntegral对象", description = "文章浏览积分表")
+public class ArticleIntegralEntity implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty("主键id")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 文章id
+	 */
+	@ApiModelProperty(value = "文章id")
+	private Long articleId;
+	/**
+	 * 得分
+	 */
+	@ApiModelProperty(value = "得分")
+	private Integer score;
+
+	/**
+	 * 地址编号
+	 */
+	@ApiModelProperty(value = "地址编号")
+	private String houseCode;
+	/**
+	 * 创建人(浏览人用户id)
+	 */
+	@ApiModelProperty(value = "创建人(浏览人用户id)")
+	@TableField(fill = FieldFill.INSERT)
+	private Long createUser;
+
+	/**
+	 * 创建时间
+	 */
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty("创建时间")
+	@TableField(fill = FieldFill.INSERT)
+	private Date createTime;
+
+
+	/**
+	 * 是否删除 0:否  1:是
+	 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+
+}
diff --git a/src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.java b/src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.java
new file mode 100644
index 0000000..fa3fef1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.article.mapper;
+
+import org.springblade.modules.article.entity.ArticleBrowseEntity;
+import org.springblade.modules.article.vo.ArticleBrowseVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 文章浏览记录表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public interface ArticleBrowseMapper extends BaseMapper<ArticleBrowseEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param articleBrowse
+	 * @return
+	 */
+	List<ArticleBrowseVO> selectArticleBrowsePage(IPage page, ArticleBrowseVO articleBrowse);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.xml b/src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.xml
new file mode 100644
index 0000000..cd76676
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/mapper/ArticleBrowseMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.article.mapper.ArticleBrowseMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="articleBrowseResultMap" type="org.springblade.modules.article.vo.ArticleBrowseVO">
+        <result column="id" property="id"/>
+        <result column="article_id" property="articleId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="create_user" property="createUser"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+
+    <select id="selectArticleBrowsePage" resultMap="articleBrowseResultMap">
+        select * from jczz_article_browse
+        <where>
+            <if test="articleBrowse.id != null "> and id = #{articleBrowse.id}</if>
+            <if test="articleBrowse.articleId != null "> and article_id = #{articleBrowse.articleId}</if>
+            <if test="articleBrowse.createTime != null "> and create_time = #{articleBrowse.createTime}</if>
+            <if test="articleBrowse.createUser != null "> and create_user = #{articleBrowse.createUser}</if>
+            <if test="articleBrowse.isDeleted != null "> and is_deleted = #{articleBrowse.isDeleted}</if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.java b/src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.java
new file mode 100644
index 0000000..10fafd5
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.java
@@ -0,0 +1,45 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.article.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.article.entity.ArticleIntegralEntity;
+import org.springblade.modules.article.vo.ArticleIntegralVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 文章浏览积分表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public interface ArticleIntegralMapper extends BaseMapper<ArticleIntegralEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param articleIntegral
+	 * @return
+	 */
+	List<ArticleIntegralVO> selectArticleIntegralPage(IPage page,
+													  @Param("articleIntegral") ArticleIntegralVO articleIntegral);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.xml b/src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.xml
new file mode 100644
index 0000000..48724b9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/mapper/ArticleIntegralMapper.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.article.mapper.ArticleIntegralMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="articleIntegralResultMap" type="org.springblade.modules.article.vo.ArticleIntegralVO">
+        <result column="id" property="id"/>
+        <result column="article_id" property="articleId"/>
+        <result column="score" property="score"/>
+        <result column="create_time" property="createTime"/>
+        <result column="create_user" property="createUser"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <!--自定义分页查询-->
+    <select id="selectArticleIntegralPage" resultMap="articleIntegralResultMap">
+        select
+        jai.*,
+        jh.house_name as address,
+        jh.district_name as aoiName,
+        bu.real_name,
+        bu.phone,
+        bu.avatar
+        from jczz_article_integral jai
+        left join jczz_house jh on jai.house_code = jh.house_code and jh.is_deleted = 0
+        left join blade_user bu on bu.id = jai.create_user and bu.is_deleted = 0
+        where jai.is_deleted = 0
+        <if test="articleIntegral.realName!=null and articleIntegral.realName!=''">
+            and bu.real_name like concat('%',#{articleIntegral.realName},'%')
+        </if>
+        <if test="articleIntegral.phone!=null and articleIntegral.phone!=''">
+            and bu.phone like concat('%',#{articleIntegral.phone},'%')
+        </if>
+        <if test="articleIntegral.articleId!=null">
+            and jai.article_id = #{articleIntegral.articleId}
+        </if>
+        order by jai.create_time desc
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/article/service/IArticleBrowseService.java b/src/main/java/org/springblade/modules/article/service/IArticleBrowseService.java
new file mode 100644
index 0000000..97fb59c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/service/IArticleBrowseService.java
@@ -0,0 +1,26 @@
+package org.springblade.modules.article.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.article.entity.ArticleBrowseEntity;
+import org.springblade.modules.article.vo.ArticleBrowseVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 文章浏览记录表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public interface IArticleBrowseService extends IService<ArticleBrowseEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param articleBrowse
+	 * @return
+	 */
+	IPage<ArticleBrowseVO> selectArticleBrowsePage(IPage<ArticleBrowseVO> page, ArticleBrowseVO articleBrowse);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/service/IArticleIntegralService.java b/src/main/java/org/springblade/modules/article/service/IArticleIntegralService.java
new file mode 100644
index 0000000..482758b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/service/IArticleIntegralService.java
@@ -0,0 +1,26 @@
+package org.springblade.modules.article.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.article.entity.ArticleIntegralEntity;
+import org.springblade.modules.article.vo.ArticleIntegralVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 文章浏览积分表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public interface IArticleIntegralService extends IService<ArticleIntegralEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param articleIntegral
+	 * @return
+	 */
+	IPage<ArticleIntegralVO> selectArticleIntegralPage(IPage<ArticleIntegralVO> page, ArticleIntegralVO articleIntegral);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/service/impl/ArticleBrowseServiceImpl.java b/src/main/java/org/springblade/modules/article/service/impl/ArticleBrowseServiceImpl.java
new file mode 100644
index 0000000..afa31ed
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/service/impl/ArticleBrowseServiceImpl.java
@@ -0,0 +1,26 @@
+package org.springblade.modules.article.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.article.entity.ArticleBrowseEntity;
+import org.springblade.modules.article.vo.ArticleBrowseVO;
+import org.springblade.modules.article.mapper.ArticleBrowseMapper;
+import org.springblade.modules.article.service.IArticleBrowseService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 文章浏览记录表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Service
+public class ArticleBrowseServiceImpl extends ServiceImpl<ArticleBrowseMapper, ArticleBrowseEntity> implements IArticleBrowseService {
+
+	@Override
+	public IPage<ArticleBrowseVO> selectArticleBrowsePage(IPage<ArticleBrowseVO> page, ArticleBrowseVO articleBrowse) {
+		return page.setRecords(baseMapper.selectArticleBrowsePage(page, articleBrowse));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/service/impl/ArticleIntegralServiceImpl.java b/src/main/java/org/springblade/modules/article/service/impl/ArticleIntegralServiceImpl.java
new file mode 100644
index 0000000..5e9a136
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/service/impl/ArticleIntegralServiceImpl.java
@@ -0,0 +1,29 @@
+package org.springblade.modules.article.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.article.entity.ArticleIntegralEntity;
+import org.springblade.modules.article.vo.ArticleIntegralVO;
+import org.springblade.modules.article.mapper.ArticleIntegralMapper;
+import org.springblade.modules.article.service.IArticleIntegralService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 文章浏览积分表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Service
+public class ArticleIntegralServiceImpl extends ServiceImpl<ArticleIntegralMapper, ArticleIntegralEntity> implements IArticleIntegralService {
+
+	@Override
+	public IPage<ArticleIntegralVO> selectArticleIntegralPage(IPage<ArticleIntegralVO> page, ArticleIntegralVO articleIntegral) {
+		List<ArticleIntegralVO> articleIntegralVOS = baseMapper.selectArticleIntegralPage(page, articleIntegral);
+		return page.setRecords(articleIntegralVOS);
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/article/vo/ArticleBrowseVO.java b/src/main/java/org/springblade/modules/article/vo/ArticleBrowseVO.java
new file mode 100644
index 0000000..10d512a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/vo/ArticleBrowseVO.java
@@ -0,0 +1,35 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.article.vo;
+
+import org.springblade.modules.article.entity.ArticleBrowseEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 文章浏览记录表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ArticleBrowseVO extends ArticleBrowseEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/article/vo/ArticleIntegralVO.java b/src/main/java/org/springblade/modules/article/vo/ArticleIntegralVO.java
new file mode 100644
index 0000000..ced337f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/article/vo/ArticleIntegralVO.java
@@ -0,0 +1,61 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.article.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import org.springblade.modules.article.entity.ArticleIntegralEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 文章浏览积分表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ArticleIntegralVO extends ArticleIntegralEntity {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 姓名
+	 */
+	@ApiModelProperty(value = "姓名")
+	private String realName;
+
+	/**
+	 * 电话
+	 */
+	@ApiModelProperty(value = "电话")
+	private String phone;
+
+	/**
+	 * 地址
+	 */
+	@ApiModelProperty(value = "地址")
+	private String address;
+
+	/**
+	 * 小区名称
+	 */
+	@ApiModelProperty(value = "小区名称")
+	private String aoiName;
+
+}
diff --git a/src/main/java/org/springblade/modules/auth/endpoint/BladeTokenEndPoint.java b/src/main/java/org/springblade/modules/auth/endpoint/BladeTokenEndPoint.java
index 560b066..015133d 100644
--- a/src/main/java/org/springblade/modules/auth/endpoint/BladeTokenEndPoint.java
+++ b/src/main/java/org/springblade/modules/auth/endpoint/BladeTokenEndPoint.java
@@ -66,6 +66,16 @@
 	private final BladeRedis bladeRedis;
 	private final JwtProperties jwtProperties;
 
+	/**
+	 *
+	 * @param tenantId
+	 * @param username
+	 * @param password
+	 * @param deptId
+	 * @param roleId
+	 * @param type 登录类型  2:pc  3: app
+	 * @return
+	 */
 	@ApiLog("登录用户验证")
 	@PostMapping("/oauth/token")
 	@ApiOperation(value = "获取认证令牌", notes = "传入租户ID:tenantId,账号:account,密码:password")
@@ -73,7 +83,8 @@
 					@ApiParam(value = "账号", required = true) @RequestParam(required = false) String username,
 					@ApiParam(value = "密码", required = true) @RequestParam(required = false) String password,
 					@ApiIgnore @RequestHeader(name = TokenUtil.DEPT_HEADER_KEY, required = false) String deptId,
-					@ApiIgnore @RequestHeader(name = TokenUtil.ROLE_HEADER_KEY, required = false) String roleId) {
+					@ApiIgnore @RequestHeader(name = TokenUtil.ROLE_HEADER_KEY, required = false) String roleId,
+					@ApiParam(value = "登录类型", required = false) @RequestParam(required = false,defaultValue = "3") Integer loginType) {
 
 		Kv authInfo = Kv.create();
 
@@ -89,7 +100,9 @@
 			.set("grantType", grantType)
 			.set("refreshToken", refreshToken)
 			.set("userType", userType)
-			.set("deptId", deptId).set("roleId", roleId);
+			.set("deptId", deptId)
+			.set("loginType",loginType)
+			.set("roleId", roleId);
 
 		ITokenGranter granter = TokenGranterBuilder.getGranter(grantType);
 		UserInfo userInfo = granter.grant(tokenParameter);
diff --git a/src/main/java/org/springblade/modules/auth/granter/CaptchaTokenGranter.java b/src/main/java/org/springblade/modules/auth/granter/CaptchaTokenGranter.java
index d4ab053..d899f36 100644
--- a/src/main/java/org/springblade/modules/auth/granter/CaptchaTokenGranter.java
+++ b/src/main/java/org/springblade/modules/auth/granter/CaptchaTokenGranter.java
@@ -17,6 +17,8 @@
 package org.springblade.modules.auth.granter;
 
 import lombok.AllArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springblade.common.cache.CacheNames;
 import org.springblade.common.cache.ParamCache;
 import org.springblade.core.log.exception.ServiceException;
@@ -48,6 +50,8 @@
 @Component
 @AllArgsConstructor
 public class CaptchaTokenGranter implements ITokenGranter {
+
+	protected static final Logger logger = LoggerFactory.getLogger(CaptchaTokenGranter.class);
 
 	public static final String GRANT_TYPE = "captcha";
 	public static final Integer FAIL_COUNT = 5;
@@ -83,6 +87,7 @@
 		int cnt = Func.toInt(bladeRedis.get(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username)), 0);
 		int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), FAIL_COUNT);
 		if (cnt >= failCount) {
+			logger.error("用户名或密码错误,用户账号:{},用户名:{},错误次数:{}",tenantId, username, cnt);
 			throw new ServiceException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
 		}
 
diff --git a/src/main/java/org/springblade/modules/auth/granter/PasswordTokenGranter.java b/src/main/java/org/springblade/modules/auth/granter/PasswordTokenGranter.java
index b8cc88e..4ba934b 100644
--- a/src/main/java/org/springblade/modules/auth/granter/PasswordTokenGranter.java
+++ b/src/main/java/org/springblade/modules/auth/granter/PasswordTokenGranter.java
@@ -17,6 +17,8 @@
 package org.springblade.modules.auth.granter;
 
 import lombok.AllArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springblade.common.cache.CacheNames;
 import org.springblade.common.cache.ParamCache;
 import org.springblade.core.log.exception.ServiceException;
@@ -48,6 +50,8 @@
 @AllArgsConstructor
 public class PasswordTokenGranter implements ITokenGranter {
 
+	protected static final Logger logger = LoggerFactory.getLogger(CaptchaTokenGranter.class);
+
 	public static final String GRANT_TYPE = "password";
 	public static final Integer FAIL_COUNT = 5;
 	public static final String FAIL_COUNT_VALUE = "account.failCount";
@@ -68,11 +72,14 @@
 		String tenantId = tokenParameter.getArgs().getStr("tenantId");
 		String username = tokenParameter.getArgs().getStr("username");
 		String password = tokenParameter.getArgs().getStr("password");
+		// 获取登录类型 2:pc 3:app
+		String type = tokenParameter.getArgs().getStr("loginType");
 
 		// 判断登录是否锁定
 		int cnt = Func.toInt(bladeRedis.get(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, username)), 0);
 		int failCount = Func.toInt(ParamCache.getValue(FAIL_COUNT_VALUE), FAIL_COUNT);
 		if (cnt >= failCount) {
+			logger.error("用户名或密码错误,用户账号:{},用户名:{},错误次数:{}",tenantId, username, cnt);
 			throw new ServiceException(TokenUtil.USER_HAS_TOO_MANY_FAILS);
 		}
 
@@ -83,16 +90,8 @@
 			if (TokenUtil.judgeTenant(tenant)) {
 				throw new ServiceException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);
 			}
-			// 获取用户类型
-			String userType = tokenParameter.getArgs().getStr("userType");
 			// 根据不同用户类型调用对应的接口返回数据,用户可自行拓展
-			if (userType.equals(UserEnum.WEB.getName())) {
-				userInfo = userService.userInfo(tenantId, username, DigestUtil.hex(password), UserEnum.WEB);
-			} else if (userType.equals(UserEnum.APP.getName())) {
-				userInfo = userService.userInfo(tenantId, username, DigestUtil.hex(password), UserEnum.APP);
-			} else {
-				userInfo = userService.userInfo(tenantId, username, DigestUtil.hex(password), UserEnum.OTHER);
-			}
+			userInfo = userService.userInfo(tenantId, username, DigestUtil.hex(password), Integer.parseInt(type));
 		}
 		if (userInfo == null || userInfo.getUser() == null) {
 			// 增加错误锁定次数
diff --git a/src/main/java/org/springblade/modules/auth/utils/TokenUtil.java b/src/main/java/org/springblade/modules/auth/utils/TokenUtil.java
index 9d995a6..ae59964 100644
--- a/src/main/java/org/springblade/modules/auth/utils/TokenUtil.java
+++ b/src/main/java/org/springblade/modules/auth/utils/TokenUtil.java
@@ -100,6 +100,7 @@
 		param.put(TokenConstant.DETAIL, userInfo.getDetail());
 		param.put(TokenConstant.REAL_NAME, user.getRealName());
 		param.put("phone", user.getPhone());
+		param.put("status", user.getStatus());
 
 		//拼装accessToken
 		try {
@@ -122,6 +123,7 @@
 				.set(TokenConstant.EXPIRES_IN, accessToken.getExpire())
 				.set(TokenConstant.DETAIL, userInfo.getDetail())
 				.set("phone", user.getPhone())
+				.set("status", user.getStatus())
 				.set(TokenConstant.REAL_NAME, user.getRealName())
 				.set(TokenConstant.LICENSE, TokenConstant.LICENSE_NAME);
 		} catch (Exception ex) {
diff --git a/src/main/java/org/springblade/modules/backblast/controller/BackblastPubPersonController.java b/src/main/java/org/springblade/modules/backblast/controller/BackblastPubPersonController.java
new file mode 100644
index 0000000..b45b2dc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/controller/BackblastPubPersonController.java
@@ -0,0 +1,145 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.service.IBackblastPubPersonService;
+import org.springblade.modules.backblast.vo.BackblastPubPersonVO;
+import org.springblade.modules.backblast.wrapper.BackblastPubPersonWrapper;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 反诈宣传对象表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-backblastPubPerson/backblastPubPerson")
+@Api(value = "反诈宣传对象表", tags = "反诈宣传对象表接口")
+public class BackblastPubPersonController {
+
+	private final IBackblastPubPersonService backblastPubPersonService;
+	private final BladeLogger bladeLogger;
+
+	/**
+	 * 反诈宣传对象表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入backblastPubPerson")
+	public R detail(BackblastPubPersonEntity backblastPubPerson) {
+		BackblastPubPersonEntity detail = backblastPubPersonService.getOne(Condition.getQueryWrapper(backblastPubPerson));
+		return R.data(detail);
+	}
+	/**
+	 * 反诈宣传对象表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入backblastPubPerson")
+	public R<IPage<BackblastPubPersonVO>> list(BackblastPubPersonEntity backblastPubPerson, Query query) {
+		IPage<BackblastPubPersonEntity> pages = backblastPubPersonService.page(Condition.getPage(query), Condition.getQueryWrapper(backblastPubPerson));
+		return R.data(BackblastPubPersonWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 反诈宣传对象表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiLog("反诈宣传对象表 自定义分页")
+	@ApiOperation(value = "分页", notes = "传入backblastPubPerson")
+	public R<IPage<BackblastPubPersonVO>> page(BackblastPubPersonVO backblastPubPerson, Query query) {
+		bladeLogger.info("反诈宣传对象表 自定义分页", JsonUtil.toJson(backblastPubPerson));
+		IPage<BackblastPubPersonVO> pages = backblastPubPersonService.selectBackblastPubPersonPage(Condition.getPage(query), backblastPubPerson);
+		return R.data(pages);
+	}
+
+	/**
+	 * 反诈宣传对象表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入backblastPubPerson")
+	public R save(@Valid @RequestBody BackblastPubPersonEntity backblastPubPerson) {
+		return R.status(backblastPubPersonService.save(backblastPubPerson));
+	}
+
+	/**
+	 * 反诈宣传对象表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入backblastPubPerson")
+	public R update(@Valid @RequestBody BackblastPubPersonEntity backblastPubPerson) {
+		return R.status(backblastPubPersonService.updateById(backblastPubPerson));
+	}
+
+	/**
+	 * 反诈宣传对象表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入backblastPubPerson")
+	public R submit(@Valid @RequestBody BackblastPubPersonEntity backblastPubPerson) {
+		return R.status(backblastPubPersonService.saveOrUpdate(backblastPubPerson));
+	}
+
+	/**
+	 * 反诈宣传对象表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiLog("反诈宣传对象表 删除")
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		bladeLogger.info("反诈宣传对象表 删除", JsonUtil.toJson(ids));
+		return R.status(backblastPubPersonService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 反诈宣传对象表 自定义详情
+	 * @param backblastPubPerson
+	 * @return
+	 */
+	@GetMapping("/getDetail")
+	@ApiOperationSupport(order = 9)
+	@ApiLog("反诈宣传对象表 自定义详情")
+	@ApiOperation(value = "详情", notes = "传入backblastPubPerson")
+	public R getDetail(BackblastPubPersonVO backblastPubPerson) {
+		bladeLogger.info("反诈宣传对象表 自定义详情", JsonUtil.toJson(backblastPubPerson));
+		BackblastPubPersonVO detail = backblastPubPersonService.getDetail(backblastPubPerson);
+		return R.data(detail);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/backblast/controller/BackblastPubRecordController.java b/src/main/java/org/springblade/modules/backblast/controller/BackblastPubRecordController.java
new file mode 100644
index 0000000..9056f8e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/controller/BackblastPubRecordController.java
@@ -0,0 +1,177 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.backblast.excel.BackblastPubRecordExcel;
+import org.springblade.modules.house.excel.HouseRentalExcel;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.modules.backblast.vo.BackblastPubRecordVO;
+import org.springblade.modules.backblast.wrapper.BackblastPubRecordWrapper;
+import org.springblade.modules.backblast.service.IBackblastPubRecordService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.List;
+
+/**
+ * 反炸宣传记录表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-backblastPubRecord/backblastPubRecord")
+@Api(value = "反炸宣传记录表", tags = "反炸宣传记录表接口")
+public class BackblastPubRecordController{
+
+	private final IBackblastPubRecordService backblastPubRecordService;
+	private final BladeLogger bladeLogger;
+
+	/**
+	 * 反炸宣传记录表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入backblastPubRecord")
+	public R detail(BackblastPubRecordEntity backblastPubRecord) {
+		BackblastPubRecordEntity detail = backblastPubRecordService.getOne(Condition.getQueryWrapper(backblastPubRecord));
+		return R.data(detail);
+	}
+	/**
+	 * 反炸宣传记录表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入backblastPubRecord")
+	public R<IPage<BackblastPubRecordVO>> list(BackblastPubRecordEntity backblastPubRecord, Query query) {
+		IPage<BackblastPubRecordEntity> pages = backblastPubRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(backblastPubRecord));
+		return R.data(BackblastPubRecordWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 反炸宣传记录表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiLog("反炸宣传记录表 自定义分页")
+	@ApiOperation(value = "分页", notes = "传入backblastPubRecord")
+	public R<IPage<BackblastPubRecordVO>> page(BackblastPubRecordVO backblastPubRecord, Query query) {
+		bladeLogger.info("反炸宣传记录表 自定义分页", JsonUtil.toJson(backblastPubRecord));
+		IPage<BackblastPubRecordVO> pages = backblastPubRecordService.selectBackblastPubRecordPage(Condition.getPage(query), backblastPubRecord);
+		return R.data(pages);
+	}
+
+	/**
+	 * 反炸宣传记录表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入backblastPubRecord")
+	public R save(@Valid @RequestBody BackblastPubRecordEntity backblastPubRecord) {
+		return R.status(backblastPubRecordService.save(backblastPubRecord));
+	}
+
+	/**
+	 * 反炸宣传记录表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入backblastPubRecord")
+	public R update(@Valid @RequestBody BackblastPubRecordEntity backblastPubRecord) {
+		return R.status(backblastPubRecordService.updateById(backblastPubRecord));
+	}
+
+	/**
+	 * 反炸宣传记录表 自定义新增/修改
+	 */
+	@PostMapping("/addOrUpdate")
+	@ApiOperationSupport(order = 8)
+	@ApiLog("反炸宣传记录表 自定义新增/修改")
+	@ApiOperation(value = "自定义新增/修改", notes = "传入backblastPubRecord")
+	public R addOrUpdate(@Valid @RequestBody BackblastPubRecordVO backblastPubRecord) {
+		bladeLogger.info("反炸宣传记录表 自定义新增/修改", JsonUtil.toJson(backblastPubRecord));
+		return R.status(backblastPubRecordService.addOrUpdateBackblastPubRecordEntity(backblastPubRecord));
+	}
+
+	/**
+	 * 反炸宣传记录表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入backblastPubRecord")
+	public R submit(@Valid @RequestBody BackblastPubRecordEntity backblastPubRecord) {
+		return R.status(backblastPubRecordService.saveOrUpdate(backblastPubRecord));
+	}
+
+	/**
+	 * 反炸宣传记录表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiLog("反炸宣传记录表 删除")
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		bladeLogger.info("反炸宣传记录表 删除", JsonUtil.toJson(ids));
+		return R.status(backblastPubRecordService.removeBackblastPubByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 反炸宣传记录表 自定义详情
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	@GetMapping("/getDetail")
+	@ApiOperationSupport(order = 9)
+	@ApiLog("反炸宣传记录表 自定义详情")
+	@ApiOperation(value = "详情", notes = "传入backblastPubRecord")
+	public R getDetail(BackblastPubRecordVO backblastPubRecord) {
+		bladeLogger.info("反炸宣传记录表 自定义详情", JsonUtil.toJson(backblastPubRecord));
+		BackblastPubRecordVO detail = backblastPubRecordService.getDetail(backblastPubRecord);
+		return R.data(detail);
+	}
+
+
+	@GetMapping("/export")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "导出", notes = "")
+	public void export(BackblastPubRecordVO backblastPubRecord, HttpServletResponse response) {
+		List<BackblastPubRecordExcel> list = backblastPubRecordService.export(backblastPubRecord);
+		ExcelUtil.export(response, "入户宣传" + DateUtil.time(), "入户宣传数据表", list, BackblastPubRecordExcel.class);
+
+	}
+}
diff --git a/src/main/java/org/springblade/modules/backblast/controller/BackblastWarnHanRecController.java b/src/main/java/org/springblade/modules/backblast/controller/BackblastWarnHanRecController.java
new file mode 100644
index 0000000..effd7c1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/controller/BackblastWarnHanRecController.java
@@ -0,0 +1,158 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.modules.backblast.vo.BackblastWarnHanRecVO;
+import org.springblade.modules.backblast.wrapper.BackblastWarnHanRecWrapper;
+import org.springblade.modules.backblast.service.IBackblastWarnHanRecService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 反炸预警处置记录表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-backblastWarnHanRec/backblastWarnHanRec")
+@Api(value = "反炸预警处置记录表", tags = "反炸预警处置记录表接口")
+public class BackblastWarnHanRecController{
+
+	private final IBackblastWarnHanRecService backblastWarnHanRecService;
+	private final BladeLogger bladeLogger;
+
+	/**
+	 * 反炸预警处置记录表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入backblastWarnHanRec")
+	public R detail(BackblastWarnHanRecEntity backblastWarnHanRec) {
+		BackblastWarnHanRecEntity detail = backblastWarnHanRecService.getOne(Condition.getQueryWrapper(backblastWarnHanRec));
+		return R.data(detail);
+	}
+	/**
+	 * 反炸预警处置记录表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入backblastWarnHanRec")
+	public R<IPage<BackblastWarnHanRecVO>> list(BackblastWarnHanRecEntity backblastWarnHanRec, Query query) {
+		IPage<BackblastWarnHanRecEntity> pages = backblastWarnHanRecService.page(Condition.getPage(query), Condition.getQueryWrapper(backblastWarnHanRec));
+		return R.data(BackblastWarnHanRecWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 反炸预警处置记录表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiLog("反炸预警处置记录表 自定义分页")
+	@ApiOperation(value = "分页", notes = "传入backblastWarnHanRec")
+	public R<IPage<BackblastWarnHanRecVO>> page(BackblastWarnHanRecVO backblastWarnHanRec, Query query) {
+		bladeLogger.info("反炸预警处置记录表 自定义分页", JsonUtil.toJson(backblastWarnHanRec));
+		IPage<BackblastWarnHanRecVO> pages = backblastWarnHanRecService.selectBackblastWarnHanRecPage(Condition.getPage(query), backblastWarnHanRec);
+		return R.data(pages);
+	}
+
+	/**
+	 * 反炸预警处置记录表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入backblastWarnHanRec")
+	public R save(@Valid @RequestBody BackblastWarnHanRecEntity backblastWarnHanRec) {
+		return R.status(backblastWarnHanRecService.save(backblastWarnHanRec));
+	}
+
+	/**
+	 * 反炸预警处置记录表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入backblastWarnHanRec")
+	public R update(@Valid @RequestBody BackblastWarnHanRecEntity backblastWarnHanRec) {
+		return R.status(backblastWarnHanRecService.updateById(backblastWarnHanRec));
+	}
+
+	/**
+	 * 反炸预警处置记录表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入backblastWarnHanRec")
+	public R submit(@Valid @RequestBody BackblastWarnHanRecEntity backblastWarnHanRec) {
+		return R.status(backblastWarnHanRecService.saveOrUpdate(backblastWarnHanRec));
+	}
+
+	/**
+	 * 反炸预警处置记录表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiLog("反炸预警处置记录表 删除")
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		bladeLogger.info("反炸预警处置记录表 删除", JsonUtil.toJson(ids));
+		return R.status(backblastWarnHanRecService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 反炸预警处置记录表 自定义新增或修改
+	 */
+	@PostMapping("/saveOrUpdate")
+	@ApiOperationSupport(order = 8)
+	@ApiLog("反炸预警处置记录表 自定义新增或修改")
+	@ApiOperation(value = "自定义新增或修改", notes = "传入backblastWarnHanRec")
+	public R saveOrUpdate(@Valid @RequestBody BackblastWarnHanRecEntity backblastWarnHanRec) {
+		bladeLogger.info("反炸预警处置记录表 自定义新增或修改", JsonUtil.toJson(backblastWarnHanRec));
+		return R.status(backblastWarnHanRecService.saveOrUpdateBackblastWarnHanRecEntity(backblastWarnHanRec));
+	}
+
+
+	/**
+	 * 反炸预警处置记录表 自定义详情
+	 */
+	@GetMapping("/getDetail")
+	@ApiOperationSupport(order = 9)
+	@ApiLog("反炸预警处置记录表 自定义详情")
+	@ApiOperation(value = "详情", notes = "传入backblastWarnHanRec")
+	public R getDetail(BackblastWarnHanRecVO backblastWarnHanRec) {
+		bladeLogger.info("反炸预警处置记录表 自定义详情", JsonUtil.toJson(backblastWarnHanRec));
+		BackblastWarnHanRecVO detail = backblastWarnHanRecService.getDetail(backblastWarnHanRec);
+		return R.data(detail);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/backblast/dto/BackblastPubRecordDTO.java b/src/main/java/org/springblade/modules/backblast/dto/BackblastPubRecordDTO.java
new file mode 100644
index 0000000..44dd62e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/dto/BackblastPubRecordDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.dto;
+
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 反炸宣传记录表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BackblastPubRecordDTO extends BackblastPubRecordEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/dto/BackblastWarnHanRecDTO.java b/src/main/java/org/springblade/modules/backblast/dto/BackblastWarnHanRecDTO.java
new file mode 100644
index 0000000..b1367af
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/dto/BackblastWarnHanRecDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.dto;
+
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 反炸预警处置记录表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BackblastWarnHanRecDTO extends BackblastWarnHanRecEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/entity/BackblastPubPersonEntity.java b/src/main/java/org/springblade/modules/backblast/entity/BackblastPubPersonEntity.java
new file mode 100644
index 0000000..445e452
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/entity/BackblastPubPersonEntity.java
@@ -0,0 +1,86 @@
+package org.springblade.modules.backblast.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 反诈宣传宣防对象表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@TableName("jczz_backblast_pub_person")
+@ApiModel(value = "BackblastPubPerson对象", description = "反诈宣传宣防对象表")
+public class BackblastPubPersonEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/** 主键id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 反诈宣传ID
+	 */
+	@ApiModelProperty(value = "反诈宣传ID")
+	private Long backblastPubRecordId;
+	/**
+	 * 姓名
+	 */
+	@ApiModelProperty(value = "姓名")
+	private String name;
+	/**
+	 * 电话
+	 */
+	@ApiModelProperty(value = "电话")
+	private String telephone;
+	/**
+	 * 身份证
+	 */
+	@ApiModelProperty(value = "身份证")
+	private String idCard;
+	/**
+	 * 居住地址
+	 */
+	@ApiModelProperty(value = "居住地址")
+	private String address;
+	/**
+	 * 职业
+	 */
+	@ApiModelProperty(value = "职业")
+	private String occupation;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新人 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField("update_user")
+	private Long updateUser;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 是否删除 0:否  1:是 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+}
diff --git a/src/main/java/org/springblade/modules/backblast/entity/BackblastPubRecordEntity.java b/src/main/java/org/springblade/modules/backblast/entity/BackblastPubRecordEntity.java
new file mode 100644
index 0000000..39dbbe8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/entity/BackblastPubRecordEntity.java
@@ -0,0 +1,131 @@
+package org.springblade.modules.backblast.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 反炸宣传记录表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@TableName("jczz_backblast_pub_record")
+@ApiModel(value = "BackblastPubRecord对象", description = "反炸宣传记录表")
+public class BackblastPubRecordEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/** 主键id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 房屋编码
+	 */
+	@ApiModelProperty(value = "房屋编码")
+	private String houseCode;
+	/**
+	 * 记录民警姓名
+	 */
+	@ApiModelProperty(value = "宣传记录民警姓名")
+	private String policeman;
+	/**
+	 * 记录民警电话
+	 */
+	@ApiModelProperty(value = "宣传记录民警电话")
+	private String policemanPhone;
+	/**
+	 * 宣传内容
+	 */
+	@ApiModelProperty(value = "宣传内容")
+	private String pubContent;
+	/**
+	 * 宣传现场照片
+	 */
+	@ApiModelProperty(value = "宣传现场照片")
+	private String pubUrls;
+	/**
+	 * 网格编号
+	 */
+	@ApiModelProperty(value = "网格编号")
+	private String gridCode;
+	/**
+	 * 警务网格编号
+	 */
+	@ApiModelProperty(value = "警务网格编号")
+	private String jwGridCode;
+	/**
+	 * 经度
+	 */
+	@ApiModelProperty(value = "经度")
+	private String lng;
+	/**
+	 * 纬度
+	 */
+	@ApiModelProperty(value = "纬度")
+	private String lat;
+	/**
+	 * 地址
+	 */
+	@ApiModelProperty(value = "地址")
+	private String address;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField(value = "create_user",fill = FieldFill.INSERT)
+	private Long createUser;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新人 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField(value = "update_user",fill = FieldFill.UPDATE)
+	private Long updateUser;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 是否删除 0:否  1:是 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+
+	/** 是否下载国家反诈app  1:是  2:否 */
+	@ApiModelProperty(value = "是否下载国家反诈app  1:是  2:否", example = "")
+	private Integer isFzApp;
+
+	/** 是否打开预警功能 1:是  2:否 */
+	@ApiModelProperty(value = "是否打开预警功能 1:是  2:否", example = "")
+	private Integer isOpenAlarm;
+
+	/** 是否接受过其他反诈宣防内容 */
+	@ApiModelProperty(value = "是否接受过其他反诈宣防内容", example = "")
+	private Integer isOther;
+
+	/** 其他防诈内容 */
+	@ApiModelProperty(value = "其他防诈内容", example = "")
+	private String otherId;
+
+	@ApiModelProperty(value = "是否接受过其他反诈宣防内容", example = "")
+	@TableField("backblast_pub_flag")
+	private String backblastPubFlag;
+
+	@ApiModelProperty(value = "备注", example = "")
+	@TableField("remark")
+	private String remark;
+}
diff --git a/src/main/java/org/springblade/modules/backblast/entity/BackblastWarnHanRecEntity.java b/src/main/java/org/springblade/modules/backblast/entity/BackblastWarnHanRecEntity.java
new file mode 100644
index 0000000..38f8519
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/entity/BackblastWarnHanRecEntity.java
@@ -0,0 +1,106 @@
+package org.springblade.modules.backblast.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 反炸预警处置记录表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@TableName("jczz_backblast_warn_han_rec")
+@ApiModel(value = "BackblastWarnHanRec对象", description = "反炸预警处置记录表")
+public class BackblastWarnHanRecEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/** 主键id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+	/**
+	 * 房屋编码
+	 */
+	@ApiModelProperty(value = "房屋编码")
+	private String houseCode;
+	/**
+	 * 记录民警姓名
+	 */
+	@ApiModelProperty(value = "记录民警姓名")
+	private String policeman;
+	/**
+	 * 记录民警电话
+	 */
+	@ApiModelProperty(value = "记录民警电话")
+	private String policemanPhone;
+	/**
+	 * 记录内容
+	 */
+	@ApiModelProperty(value = "记录内容")
+	private String recContent;
+	/**
+	 * 现场照片
+	 */
+	@ApiModelProperty(value = "现场照片")
+	private String sceUrls;
+	/**
+	 * 网格编号
+	 */
+	@ApiModelProperty(value = "网格编号")
+	private String gridCode;
+	/**
+	 * 警务网格编号
+	 */
+	@ApiModelProperty(value = "警务网格编号")
+	private String jwGridCode;
+	/**
+	 * 经度
+	 */
+	@ApiModelProperty(value = "经度")
+	private String lng;
+	/**
+	 * 纬度
+	 */
+	@ApiModelProperty(value = "纬度")
+	private String lat;
+	/**
+	 * 地址
+	 */
+	@ApiModelProperty(value = "地址")
+	private String address;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField(value = "create_user",fill = FieldFill.INSERT)
+	private Long createUser;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新人 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField(value = "update_user",fill = FieldFill.UPDATE)
+	private Long updateUser;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 是否删除 0:否  1:是 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	// @TableLogic
+	private Integer isDeleted;
+}
diff --git a/src/main/java/org/springblade/modules/backblast/excel/BackblastPubRecordExcel.java b/src/main/java/org/springblade/modules/backblast/excel/BackblastPubRecordExcel.java
new file mode 100644
index 0000000..61760a9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/excel/BackblastPubRecordExcel.java
@@ -0,0 +1,93 @@
+package org.springblade.modules.backblast.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.util.Date;
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class BackblastPubRecordExcel {
+
+
+
+	@ExcelProperty(value = "街道名称")
+	private String townName;
+
+
+	@ExcelProperty(value = "社区名称")
+	private String communityName;
+
+
+	@ExcelProperty(value = "派出所名称")
+	private String pcsName;
+
+
+	@ExcelProperty(value = "机构名称")
+	private String deptName;
+
+
+	@ExcelProperty(value = "小区名称")
+	private String aoiName;
+
+
+	@ExcelProperty(value = "房屋名称")
+	private String houseName;
+
+	@ExcelProperty(value = "宣传记录民警姓名")
+	private String policeman;
+
+	@ExcelProperty(value = "宣传记录民警电话")
+	private String policemanPhone;
+
+	@ExcelProperty(value = "宣传内容")
+	private String pubContent;
+
+	// @ExcelProperty(value = "宣传现场照片")
+	// private String pubUrls;
+
+	// @ExcelProperty(value = "网格编号")
+	// private String gridCode;
+
+	// @ExcelProperty(value = "警务网格编号")
+	// private String jwGridCode;
+
+	@ExcelProperty(value = "经度")
+	private String lng;
+
+	@ExcelProperty(value = "纬度")
+	private String lat;
+
+	@ExcelProperty(value = "地址")
+	private String address;
+
+	@ExcelProperty(value = "创建时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date createTime;
+
+	// @ExcelProperty(value = "是否下载国家反诈app  1:是  2:否")
+	@ExcelProperty(value = "是否下载国家反诈app", converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "isFlag")
+	@ExcelDictItem(type = "isFlag")
+	private String isFzApp;
+
+	// @ExcelProperty(value = "是否打开预警功能 1:是  2:否")
+	@ExcelProperty(value = "是否打开预警功能", converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "isFlag")
+	@ExcelDictItemLabel(type = "isFlag")
+	private String isOpenAlarm;
+
+	@ExcelProperty(value = "是否接受过其他反诈宣防内容")
+	private Integer isOther;
+
+	@ExcelProperty(value = "其他防诈内容")
+	private String otherId;
+}
diff --git a/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.java b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.java
new file mode 100644
index 0000000..419804f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.java
@@ -0,0 +1,39 @@
+package org.springblade.modules.backblast.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.vo.BackblastPubPersonVO;
+
+import java.util.List;
+
+/**
+ * 反炸宣传对象表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-03
+ */
+public interface BackblastPubPersonMapper extends BaseMapper<BackblastPubPersonEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param backblastPubPerson
+	 * @return
+	 */
+	List<BackblastPubPersonVO> selectBackblastPubPersonPage(IPage page,
+															@Param("backblastPubPerson") BackblastPubPersonVO backblastPubPerson,
+															@Param("isAdministrator") Integer isAdministrator,
+															@Param("regionChildCodesList") List<String> regionChildCodesList,
+															@Param("gridCodeList") List<String> gridCodeList);
+
+
+	/**
+	 * 反炸宣传对象表 自定义详情
+	 * @param backblastPubPerson
+	 * @return
+	 */
+	BackblastPubPersonVO getDetail(@Param("backblastPubPerson") BackblastPubPersonVO backblastPubPerson);
+}
diff --git a/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.xml b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.xml
new file mode 100644
index 0000000..cc4c4db
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubPersonMapper.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.backblast.mapper.BackblastPubPersonMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="backblastPubPersonResultMap" type="org.springblade.modules.backblast.vo.BackblastPubPersonVO">
+    </resultMap>
+
+    <!--自定义分页列表查询-->
+    <select id="selectBackblastPubPersonPage" resultMap="backblastPubPersonResultMap">
+        select
+        jbpp.*
+        from jczz_backblast_pub_person jbpp
+        where jbpp.is_deleted = 0
+        <if test="backblastPubPerson.address != null and backblastPubPerson.address != ''">
+            and jbpp.address like concat('%',#{backblastPubPerson.address},'%')
+        </if>
+        <if test="backblastPubPerson.name != null and backblastPubPerson.name != ''">
+            and jbpp.name like concat('%',#{backblastPubPerson.name},'%')
+        </if>
+        <if test="backblastPubPerson.telephone != null and backblastPubPerson.telephone != ''">
+            and jbpp.telephone like concat('%',#{backblastPubPerson.telephone},'%')
+        </if>
+        <if test="backblastPubPerson.idCard != null and backblastPubPerson.idCard != ''">
+            and jbpp.id_card like concat('%',#{backblastPubPerson.idCard},'%')
+        </if>
+        <if test="backblastPubPerson.startTime != null and backblastPubPerson.startTime != ''">
+            and date_format(jbpp.create_time,'%Y-%m-%d') &gt;= #{backblastPubPerson.startTime}
+        </if>
+        <if test="backblastPubPerson.endTime != null and backblastPubPerson.endTime != ''">
+            and date_format(jbpp.create_time,'%Y-%m-%d') &lt;= #{backblastPubPerson.endTime}
+        </if>
+        <if test="backblastPubPerson.searchKey!=null and backblastPubPerson.searchKey!=''">
+            and CONCAT(
+            ifnull(jbpp.id_card,''),
+            ifnull(jbpp.address,''),
+            ifnull(jbpp.name,''),
+            ifnull(jbpp.telephone,'')
+            ) like CONCAT ('%', #{backblastPubPerson.searchKey},'%')
+        </if>
+        order by jbpp.id desc,jbpp.create_time desc
+    </select>
+
+    <!--反炸宣传对象表 自定义详情-->
+    <select id="getDetail" resultType="org.springblade.modules.backblast.vo.BackblastPubPersonVO">
+        select
+        jbpp.*
+        from jczz_backblast_pub_person jbpp
+        where jbpp.is_deleted = 0
+        <if test="backblastPubPerson.id != null">
+            and jbpp.id = #{backblastPubPerson.id}
+        </if>
+        order by jbpp.id desc,jbpp.create_time desc
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.java b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.java
new file mode 100644
index 0000000..859e2d3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.java
@@ -0,0 +1,62 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.modules.backblast.excel.BackblastPubRecordExcel;
+import org.springblade.modules.backblast.vo.BackblastPubRecordVO;
+
+import java.util.List;
+
+/**
+ * 反炸宣传记录表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public interface BackblastPubRecordMapper extends BaseMapper<BackblastPubRecordEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	List<BackblastPubRecordVO> selectBackblastPubRecordPage(IPage page,
+															@Param("backblastPubRecord") BackblastPubRecordVO backblastPubRecord,
+															@Param("isAdministrator") Integer isAdministrator,
+															@Param("regionChildCodesList") List<String> regionChildCodesList,
+															@Param("gridCodeList") List<String> gridCodeList);
+
+
+	/**
+	 * 反炸宣传记录表 自定义详情
+	 *
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	BackblastPubRecordVO getDetail(@Param("backblastPubRecord") BackblastPubRecordVO backblastPubRecord);
+
+	List<BackblastPubRecordExcel> selectBackblastPubRecordExport(@Param("backblastPubRecord") BackblastPubRecordVO backblastPubRecord,
+																 @Param("isAdministrator") Integer isAdministrator,
+																 @Param("regionChildCodesList") List<String> regionChildCodesList,
+																 @Param("gridCodeList") List<String> gridCodeList);
+}
diff --git a/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.xml b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.xml
new file mode 100644
index 0000000..00925ba
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/mapper/BackblastPubRecordMapper.xml
@@ -0,0 +1,315 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.backblast.mapper.BackblastPubRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="backblastPubRecordResultMap" type="org.springblade.modules.backblast.vo.BackblastPubRecordVO">
+    </resultMap>
+
+    <!--自定义分页列表查询-->
+    <select id="selectBackblastPubRecordPage" resultMap="backblastPubRecordResultMap">
+        select
+        jbpr.*,
+        jg.grid_name,
+        br.town_name AS townName,
+        br.NAME AS communityName,
+        jpag.pcs_name pcsName,
+        jda.aoi_name,
+        CONCAT( IF(jda.building_name,jda.building_name,''), '-', IF(jda.unit_name,jda.unit_name,''), '-', IF(jda.house_name,jda.house_name,'') ) houseName,
+        bd.dept_name
+        from jczz_backblast_pub_record jbpr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jbpr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jbpr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        LEFT JOIN blade_user bu ON bu.id = jbpr.create_user
+        LEFT JOIN blade_dept bd on bd.id = bu.dept_id
+        LEFT JOIN jczz_doorplate_address jda ON jda.address_code = jbpr.house_code
+        where jbpr.is_deleted = 0
+        <if test="backblastPubRecord.townName != null and backblastPubRecord.townName != ''">
+            and br.town_name like concat('%',#{backblastPubRecord.townName},'%')
+        </if>
+        <if test="backblastPubRecord.communityName != null and backblastPubRecord.communityName != ''">
+            and br.name like concat('%',#{backblastPubRecord.communityName},'%')
+        </if>
+        <if test="backblastPubRecord.pcsName != null and backblastPubRecord.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{backblastPubRecord.pcsName},'%')
+        </if>
+        <if test="backblastPubRecord.houseCode != null and backblastPubRecord.houseCode != ''">
+            and jbpr.house_code = #{backblastPubRecord.houseCode}
+        </if>
+        <if test="backblastPubRecord.address != null and backblastPubRecord.address != ''">
+            and jbpr.address like concat('%',#{backblastPubRecord.address},'%')
+        </if>
+          <if test="backblastPubRecord.deptName != null and backblastPubRecord.deptName != ''">
+            and  bd.dept_name like concat('%',#{backblastPubRecord.deptName},'%')
+        </if>
+        <if test="backblastPubRecord.pubContent != null and backblastPubRecord.pubContent != ''">
+            and jbpr.pub_content like concat('%',#{backblastPubRecord.pubContent},'%')
+        </if>
+        <if test="backblastPubRecord.policeman != null and backblastPubRecord.policeman != ''">
+            and jbpr.policeman like concat('%',#{backblastPubRecord.policeman},'%')
+        </if>
+        <if test="backblastPubRecord.createUser != null">
+            and jbpr.create_user = #{backblastPubRecord.createUser}
+        </if>
+        <if test="backblastPubRecord.policemanPhone != null and backblastPubRecord.policemanPhone != ''">
+            and jbpr.policeman_phone like concat('%',#{backblastPubRecord.policemanPhone},'%')
+        </if>
+        <if test="backblastPubRecord.startTime != null and backblastPubRecord.startTime != ''">
+            and date_format(jbpr.create_time,'%Y-%m-%d') &gt;= #{backblastPubRecord.startTime}
+        </if>
+        <if test="backblastPubRecord.endTime != null and backblastPubRecord.endTime != ''">
+            and date_format(jbpr.create_time,'%Y-%m-%d') &lt;= #{backblastPubRecord.endTime}
+        </if>
+        <if test="backblastPubRecord.searchKey!=null and backblastPubRecord.searchKey!=''">
+            and CONCAT(
+            ifnull(jbpr.policeman_phone,''),
+            ifnull(jbpr.address,''),
+            ifnull(jbpr.pub_content,''),
+            ifnull(jbpr.policeman,'')
+            ) like CONCAT ('%', #{backblastPubRecord.searchKey},'%')
+        </if>
+        <if test="isAdministrator==2">
+            <choose>
+                <when test="backblastPubRecord.roleName != null and backblastPubRecord.roleName != ''">
+                    <if test="backblastPubRecord.roleName=='wgy'">
+                        <choose>
+                            <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                and jg.grid_code in
+                                <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jg.grid_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                    <if test="backblastPubRecord.roleName=='mj'">
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jpag.community_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                </when>
+                <otherwise>
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and
+                            (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jpag.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                        <otherwise>
+                            and
+                            (
+                            jg.grid_code in ('') or jpag.community_code in ('')
+                            )
+                        </otherwise>
+                    </choose>
+                </otherwise>
+            </choose>
+        </if>
+        order by jbpr.id desc,jbpr.create_time desc
+    </select>
+
+    <!--详情map-->
+    <resultMap id="detailMap" type="org.springblade.modules.backblast.vo.BackblastPubRecordVO" autoMapping="true">
+        <id property="id" column="id"/>
+        <collection property="backblastPubPersonEntityList" javaType="java.util.List"
+                    ofType="org.springblade.modules.backblast.entity.BackblastPubPersonEntity"
+                    autoMapping="true">
+            <id property="id" column="cid"/>
+            <result property="address" column="caddress"/>
+        </collection>
+    </resultMap>
+
+    <!--反炸宣传记录表 自定义详情-->
+    <select id="getDetail" resultMap="detailMap">
+        select
+        jbpr.*,
+        br.town_name as townName,
+        br.name as communityName,
+        jpag.pcs_name pcsName,
+        jbpp.id as cid,
+        jbpp.name,
+        jbpp.telephone,
+        jbpp.id_card,
+        jbpp.address as caddress,
+        jbpp.occupation
+        from jczz_backblast_pub_record jbpr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jbpr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jbpr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        LEFT JOIN jczz_backblast_pub_person jbpp on jbpp.backblast_pub_record_id = jbpr.id and jbpp.is_deleted = 0
+        where jbpr.is_deleted = 0
+        <if test="backblastPubRecord.id != null">
+            and jbpr.id = #{backblastPubRecord.id}
+        </if>
+        <if test="backblastPubRecord.townName != null and backblastPubRecord.townName != ''">
+            and br.town_name like concat('%',#{backblastPubRecord.townName},'%')
+        </if>
+        <if test="backblastPubRecord.communityName != null and backblastPubRecord.communityName != ''">
+            and br.name like concat('%',#{backblastPubRecord.communityName},'%')
+        </if>
+        <if test="backblastPubRecord.pcsName != null and backblastPubRecord.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{backblastPubRecord.pcsName},'%')
+        </if>
+        <if test="backblastPubRecord.houseCode != null and backblastPubRecord.houseCode != ''">
+            and jbpr.house_code = #{backblastPubRecord.houseCode}
+        </if>
+        <if test="backblastPubRecord.address != null and backblastPubRecord.address != ''">
+            and jbpr.address like concat('%',#{backblastPubRecord.address},'%')
+        </if>
+        <if test="backblastPubRecord.pubContent != null and backblastPubRecord.pubContent != ''">
+            and jbpr.pub_content like concat('%',#{backblastPubRecord.pubContent},'%')
+        </if>
+        <if test="backblastPubRecord.policeman != null and backblastPubRecord.policeman != ''">
+            and jbpr.policeman like concat('%',#{backblastPubRecord.policeman},'%')
+        </if>
+        <if test="backblastPubRecord.policemanPhone != null and backblastPubRecord.policemanPhone != ''">
+            and jbpr.policeman_phone like concat('%',#{backblastPubRecord.policemanPhone},'%')
+        </if>
+        order by jbpr.id desc,jbpr.create_time desc
+    </select>
+
+
+    <select id="selectBackblastPubRecordExport"
+            resultType="org.springblade.modules.backblast.excel.BackblastPubRecordExcel">
+        select
+        jbpr.*,
+        br.town_name AS townName,
+        br.NAME AS communityName,
+        jpag.pcs_name pcsName,
+        jda.aoi_name,
+        CONCAT( IF(jda.building_name,jda.building_name,''), '-', IF(jda.unit_name,jda.unit_name,''), '-', IF(jda.house_name,jda.house_name,'') ) houseName,
+        bd.dept_name
+        from jczz_backblast_pub_record jbpr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jbpr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jbpr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        LEFT JOIN blade_user bu ON bu.id = jbpr.create_user
+        LEFT JOIN blade_dept bd on bd.id = bu.dept_id
+        LEFT JOIN jczz_doorplate_address jda ON jda.address_code = jbpr.house_code
+        where jbpr.is_deleted = 0
+        <if test="backblastPubRecord.townName != null and backblastPubRecord.townName != ''">
+            and br.town_name like concat('%',#{backblastPubRecord.townName},'%')
+        </if>
+        <if test="backblastPubRecord.communityName != null and backblastPubRecord.communityName != ''">
+            and br.name like concat('%',#{backblastPubRecord.communityName},'%')
+        </if>
+        <if test="backblastPubRecord.pcsName != null and backblastPubRecord.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{backblastPubRecord.pcsName},'%')
+        </if>
+        <if test="backblastPubRecord.houseCode != null and backblastPubRecord.houseCode != ''">
+            and jbpr.house_code = #{backblastPubRecord.houseCode}
+        </if>
+        <if test="backblastPubRecord.address != null and backblastPubRecord.address != ''">
+            and jbpr.address like concat('%',#{backblastPubRecord.address},'%')
+        </if>
+        <if test="backblastPubRecord.deptName != null and backblastPubRecord.deptName != ''">
+            and  bd.dept_name like concat('%',#{backblastPubRecord.deptName},'%')
+        </if>
+        <if test="backblastPubRecord.pubContent != null and backblastPubRecord.pubContent != ''">
+            and jbpr.pub_content like concat('%',#{backblastPubRecord.pubContent},'%')
+        </if>
+        <if test="backblastPubRecord.policeman != null and backblastPubRecord.policeman != ''">
+            and jbpr.policeman like concat('%',#{backblastPubRecord.policeman},'%')
+        </if>
+        <if test="backblastPubRecord.createUser != null">
+            and jbpr.create_user = #{backblastPubRecord.createUser}
+        </if>
+        <if test="backblastPubRecord.policemanPhone != null and backblastPubRecord.policemanPhone != ''">
+            and jbpr.policeman_phone like concat('%',#{backblastPubRecord.policemanPhone},'%')
+        </if>
+        <if test="backblastPubRecord.startTime != null and backblastPubRecord.startTime != ''">
+            and date_format(jbpr.create_time,'%Y-%m-%d') &gt;= #{backblastPubRecord.startTime}
+        </if>
+        <if test="backblastPubRecord.endTime != null and backblastPubRecord.endTime != ''">
+            and date_format(jbpr.create_time,'%Y-%m-%d') &lt;= #{backblastPubRecord.endTime}
+        </if>
+        <if test="backblastPubRecord.searchKey!=null and backblastPubRecord.searchKey!=''">
+            and CONCAT(
+            ifnull(jbpr.policeman_phone,''),
+            ifnull(jbpr.address,''),
+            ifnull(jbpr.pub_content,''),
+            ifnull(jbpr.policeman,'')
+            ) like CONCAT ('%', #{backblastPubRecord.searchKey},'%')
+        </if>
+        <if test="isAdministrator==2">
+            <choose>
+                <when test="backblastPubRecord.roleName != null and backblastPubRecord.roleName != ''">
+                    <if test="backblastPubRecord.roleName=='wgy'">
+                        <choose>
+                            <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                and jg.grid_code in
+                                <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jg.grid_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                    <if test="backblastPubRecord.roleName=='mj'">
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jpag.community_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                </when>
+                <otherwise>
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and
+                            (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jpag.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                        <otherwise>
+                            and
+                            (
+                            jg.grid_code in ('') or jpag.community_code in ('')
+                            )
+                        </otherwise>
+                    </choose>
+                </otherwise>
+            </choose>
+        </if>
+        order by jbpr.id desc,jbpr.create_time desc
+
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.java b/src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.java
new file mode 100644
index 0000000..3cfcc7f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.java
@@ -0,0 +1,54 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.modules.backblast.vo.BackblastWarnHanRecVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 反炸预警处置记录表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public interface BackblastWarnHanRecMapper extends BaseMapper<BackblastWarnHanRecEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	List<BackblastWarnHanRecVO> selectBackblastWarnHanRecPage(IPage page,
+															  @Param("backblastWarnHanRec") BackblastWarnHanRecVO backblastWarnHanRec,
+															  @Param("isAdministrator") Integer isAdministrator,
+															  @Param("regionChildCodesList") List<String> regionChildCodesList,
+															  @Param("gridCodeList") List<String> gridCodeList);
+
+
+	/**
+	 * 反炸预警处置记录表 自定义详情
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	BackblastWarnHanRecVO getDetail(@Param("backblastWarnHanRec") BackblastWarnHanRecVO backblastWarnHanRec);
+}
diff --git a/src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.xml b/src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.xml
new file mode 100644
index 0000000..3aef29d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/mapper/BackblastWarnHanRecMapper.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.backblast.mapper.BackblastWarnHanRecMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="backblastWarnHanRecResultMap" type="org.springblade.modules.backblast.vo.BackblastWarnHanRecVO">
+    </resultMap>
+
+    <!--自定义分页列表查询-->
+    <select id="selectBackblastWarnHanRecPage" resultMap="backblastWarnHanRecResultMap">
+        select
+        jbwhr.*,
+        br.town_name as townName,
+        br.name as communityName,
+        jpag.pcs_name pcsName,
+        bd.dept_name
+        from jczz_backblast_warn_han_rec jbwhr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jbwhr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jbwhr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        LEFT JOIN blade_user bu ON bu.id = jbwhr.create_user
+        LEFT JOIN blade_dept bd on bd.id = bu.dept_id
+        where jbwhr.is_deleted = 0
+        <if test="backblastWarnHanRec.townName != null and backblastWarnHanRec.townName != ''">
+            and br.town_name like concat('%',#{backblastWarnHanRec.townName},'%')
+        </if>
+        <if test="backblastWarnHanRec.communityName != null and backblastWarnHanRec.communityName != ''">
+            and jbr.name like concat('%',#{backblastWarnHanRec.communityName},'%')
+        </if>
+        <if test="backblastWarnHanRec.pcsName != null and backblastWarnHanRec.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{backblastWarnHanRec.pcsName},'%')
+        </if>
+        <if test="backblastWarnHanRec.houseCode != null and backblastWarnHanRec.houseCode != ''">
+            and jbwhr.house_code = #{backblastWarnHanRec.houseCode}
+        </if>
+        <if test="backblastWarnHanRec.address != null and backblastWarnHanRec.address != ''">
+            and jbwhr.address like concat('%',#{backblastWarnHanRec.address},'%')
+        </if>
+        <if test="backblastWarnHanRec.recContent != null and backblastWarnHanRec.recContent != ''">
+            and jbwhr.rec_content like concat('%',#{backblastWarnHanRec.recContent},'%')
+        </if>
+        <if test="backblastWarnHanRec.policeman != null and backblastWarnHanRec.policeman != ''">
+            and jbwhr.policeman like concat('%',#{backblastWarnHanRec.policeman},'%')
+        </if>
+        <if test="backblastWarnHanRec.policemanPhone != null and backblastWarnHanRec.policemanPhone != ''">
+            and jbwhr.policeman_phone like concat('%',#{backblastWarnHanRec.policemanPhone},'%')
+        </if>
+        <if test="backblastWarnHanRec.startTime != null and backblastWarnHanRec.startTime != ''">
+            and date_format(jbwhr.create_time,'%Y-%m-%d') &gt;= #{backblastWarnHanRec.startTime}
+        </if>
+        <if test="backblastWarnHanRec.endTime != null and backblastWarnHanRec.endTime != ''">
+            and date_format(jbwhr.create_time,'%Y-%m-%d') &lt;= #{backblastWarnHanRec.endTime}
+        </if>
+        <if test="backblastWarnHanRec.createUser != null">
+            and jbwhr.create_user = #{backblastWarnHanRec.createUser}
+        </if>
+        <if test="backblastWarnHanRec.deptName != null and backblastWarnHanRec.deptName != ''">
+            and  bd.dept_name like concat('%',#{backblastWarnHanRec.deptName},'%')
+        </if>
+        <if test="backblastWarnHanRec.searchKey!=null and backblastWarnHanRec.searchKey!=''">
+            and CONCAT(
+            ifnull(jbwhr.policeman_phone,''),
+            ifnull(jbwhr.address,''),
+            ifnull(jbwhr.rec_content,''),
+            ifnull(jbwhr.policeman,'')
+            ) like CONCAT ('%', #{backblastWarnHanRec.searchKey},'%')
+        </if>
+        <if test="isAdministrator==2">
+            <choose>
+                <when test="backblastWarnHanRec.roleName != null and backblastWarnHanRec.roleName != ''">
+                    <if test="backblastWarnHanRec.roleName=='wgy'">
+                        <choose>
+                            <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                and jg.grid_code in
+                                <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jg.grid_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                    <if test="backblastWarnHanRec.roleName=='mj'">
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jpag.community_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                </when>
+                <otherwise>
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and
+                            (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jpag.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                        <otherwise>
+                            and
+                            (
+                            jg.grid_code in ('') or jpag.community_code in ('')
+                            )
+                        </otherwise>
+                    </choose>
+                </otherwise>
+            </choose>
+        </if>
+        order by jbwhr.id desc,jbwhr.create_time desc
+    </select>
+
+    <!--自定义分页列表查询-->
+    <select id="getDetail" resultType="org.springblade.modules.backblast.vo.BackblastWarnHanRecVO">
+        select
+        jbwhr.*,
+        br.town_name as townName,
+        br.name as communityName,
+        jpag.pcs_name pcsName
+        from jczz_backblast_warn_han_rec jbwhr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jbwhr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jbwhr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        where jbwhr.is_deleted = 0
+        <if test="backblastWarnHanRec.townName != null and backblastWarnHanRec.townName != ''">
+            and br.town_name like concat('%',#{backblastWarnHanRec.townName},'%')
+        </if>
+        <if test="backblastWarnHanRec.communityName != null and backblastWarnHanRec.communityName != ''">
+            and jbr.name like concat('%',#{backblastWarnHanRec.communityName},'%')
+        </if>
+        <if test="backblastWarnHanRec.pcsName != null and backblastWarnHanRec.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{backblastWarnHanRec.pcsName},'%')
+        </if>
+        <if test="backblastWarnHanRec.houseCode != null and backblastWarnHanRec.houseCode != ''">
+            and jbwhr.house_code = #{backblastWarnHanRec.houseCode}
+        </if>
+        <if test="backblastWarnHanRec.id != null">
+            and jbwhr.id = #{backblastWarnHanRec.id}
+        </if>
+        <if test="backblastWarnHanRec.address != null and backblastWarnHanRec.address != ''">
+            and jbwhr.address like concat('%',#{backblastWarnHanRec.address},'%')
+        </if>
+        <if test="backblastWarnHanRec.recContent != null and backblastWarnHanRec.recContent != ''">
+            and jbwhr.rec_content like concat('%',#{backblastWarnHanRec.recContent},'%')
+        </if>
+        <if test="backblastWarnHanRec.policeman != null and backblastWarnHanRec.policeman != ''">
+            and jbwhr.policeman like concat('%',#{backblastWarnHanRec.policeman},'%')
+        </if>
+        <if test="backblastWarnHanRec.policemanPhone != null and backblastWarnHanRec.policemanPhone != ''">
+            and jbwhr.policeman_phone like concat('%',#{backblastWarnHanRec.policemanPhone},'%')
+        </if>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/backblast/service/IBackblastPubPersonService.java b/src/main/java/org/springblade/modules/backblast/service/IBackblastPubPersonService.java
new file mode 100644
index 0000000..eee31c9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/service/IBackblastPubPersonService.java
@@ -0,0 +1,47 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.vo.BackblastPubPersonVO;
+
+/**
+ * 反炸宣传对象表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public interface IBackblastPubPersonService extends IService<BackblastPubPersonEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param BackblastPubPerson
+	 * @return
+	 */
+	IPage<BackblastPubPersonVO> selectBackblastPubPersonPage(IPage<BackblastPubPersonVO> page, BackblastPubPersonVO BackblastPubPerson);
+
+	/**
+	 * 反炸宣传对象表 自定义详情
+	 * @param BackblastPubPerson
+	 * @return
+	 */
+    BackblastPubPersonVO getDetail(BackblastPubPersonVO BackblastPubPerson);
+}
diff --git a/src/main/java/org/springblade/modules/backblast/service/IBackblastPubRecordService.java b/src/main/java/org/springblade/modules/backblast/service/IBackblastPubRecordService.java
new file mode 100644
index 0000000..5599564
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/service/IBackblastPubRecordService.java
@@ -0,0 +1,66 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.modules.backblast.excel.BackblastPubRecordExcel;
+import org.springblade.modules.backblast.vo.BackblastPubRecordVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 反炸宣传记录表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public interface IBackblastPubRecordService extends IService<BackblastPubRecordEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	IPage<BackblastPubRecordVO> selectBackblastPubRecordPage(IPage<BackblastPubRecordVO> page, BackblastPubRecordVO backblastPubRecord);
+
+
+	/**
+	 * 反炸宣传记录表 自定义新增/修改
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	boolean addOrUpdateBackblastPubRecordEntity(BackblastPubRecordVO backblastPubRecord);
+
+	/**
+	 * 反炸宣传记录表 自定义详情
+	 * @param backblastPubRecord
+	 * @return
+	 */
+    BackblastPubRecordVO getDetail(BackblastPubRecordVO backblastPubRecord);
+
+	/**
+	 * 反炸宣传记录表 删除
+	 */
+	boolean removeBackblastPubByIds(List<Long> toLongList);
+
+    List<BackblastPubRecordExcel> export(BackblastPubRecordVO backblastPubRecord);
+}
diff --git a/src/main/java/org/springblade/modules/backblast/service/IBackblastWarnHanRecService.java b/src/main/java/org/springblade/modules/backblast/service/IBackblastWarnHanRecService.java
new file mode 100644
index 0000000..0b2cbcb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/service/IBackblastWarnHanRecService.java
@@ -0,0 +1,56 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.modules.backblast.vo.BackblastWarnHanRecVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 反炸预警处置记录表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public interface IBackblastWarnHanRecService extends IService<BackblastWarnHanRecEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	IPage<BackblastWarnHanRecVO> selectBackblastWarnHanRecPage(IPage<BackblastWarnHanRecVO> page, BackblastWarnHanRecVO backblastWarnHanRec);
+
+
+	/**
+	 * 反炸预警处置记录表 自定义新增或修改
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	boolean saveOrUpdateBackblastWarnHanRecEntity(BackblastWarnHanRecEntity backblastWarnHanRec);
+
+	/**
+	 * 反炸预警处置记录表 自定义详情
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+    BackblastWarnHanRecVO getDetail(BackblastWarnHanRecVO backblastWarnHanRec);
+}
diff --git a/src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubPersonServiceImpl.java b/src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubPersonServiceImpl.java
new file mode 100644
index 0000000..a536e00
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubPersonServiceImpl.java
@@ -0,0 +1,57 @@
+package org.springblade.modules.backblast.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.param.GridSet;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.mapper.BackblastPubPersonMapper;
+import org.springblade.modules.backblast.service.IBackblastPubPersonService;
+import org.springblade.modules.backblast.vo.BackblastPubPersonVO;
+import org.springblade.modules.grid.entity.GridEntity;
+import org.springblade.modules.grid.service.IGridService;
+import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
+import org.springblade.modules.police.service.IPoliceAffairsGridService;
+import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.service.IUserService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 反炸宣传对象表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Service
+public class BackblastPubPersonServiceImpl extends ServiceImpl<BackblastPubPersonMapper, BackblastPubPersonEntity> implements IBackblastPubPersonService {
+
+	/**
+	 * 自定义分页列表查询
+	 * @param page
+	 * @param backblastPubPerson
+	 * @return
+	 */
+	@Override
+	public IPage<BackblastPubPersonVO> selectBackblastPubPersonPage(IPage<BackblastPubPersonVO> page, BackblastPubPersonVO backblastPubPerson) {
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(BackblastPubPersonVO.class, backblastPubPerson);
+		return page.setRecords(baseMapper.selectBackblastPubPersonPage(page,
+			backblastPubPerson,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList()));
+	}
+
+	/**
+	 * 反炸宣传对象表 自定义详情
+	 * @param backblastPubPerson
+	 * @return
+	 */
+	@Override
+	public BackblastPubPersonVO getDetail(BackblastPubPersonVO backblastPubPerson) {
+		return baseMapper.getDetail(backblastPubPerson);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubRecordServiceImpl.java b/src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubRecordServiceImpl.java
new file mode 100644
index 0000000..4e4a7ed
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/service/impl/BackblastPubRecordServiceImpl.java
@@ -0,0 +1,239 @@
+package org.springblade.modules.backblast.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.modules.backblast.excel.BackblastPubRecordExcel;
+import org.springblade.modules.backblast.mapper.BackblastPubRecordMapper;
+import org.springblade.modules.backblast.service.IBackblastPubPersonService;
+import org.springblade.modules.backblast.service.IBackblastPubRecordService;
+import org.springblade.modules.backblast.vo.BackblastPubRecordVO;
+import org.springblade.modules.grid.entity.GridEntity;
+import org.springblade.modules.grid.service.IGridService;
+import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
+import org.springblade.modules.police.service.IPoliceAffairsGridService;
+import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.service.IUserService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 反炸宣传记录表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Service
+public class BackblastPubRecordServiceImpl extends ServiceImpl<BackblastPubRecordMapper, BackblastPubRecordEntity> implements IBackblastPubRecordService {
+
+	/**
+	 * 自定义分页列表查询
+	 * @param page
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	@Override
+	public IPage<BackblastPubRecordVO> selectBackblastPubRecordPage(IPage<BackblastPubRecordVO> page, BackblastPubRecordVO backblastPubRecord) {
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(BackblastPubRecordVO.class, backblastPubRecord);
+		if (!Strings.isBlank(backblastPubRecord.getRoleName())){
+			backblastPubRecord.setCreateUser(AuthUtil.getUserId());
+		}
+		return page.setRecords(baseMapper.selectBackblastPubRecordPage(page,
+			backblastPubRecord,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList()));
+	}
+
+	/**
+	 * 反炸宣传记录表 自定义新增/修改
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean addOrUpdateBackblastPubRecordEntity(BackblastPubRecordVO backblastPubRecord) {
+		backblastPubRecord.setCreateUser(AuthUtil.getUserId());
+		boolean flag = false;
+		// 点落面计算警格,网格,警格
+		setGridInfo(backblastPubRecord);
+		// "otherId":"\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"[1]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""
+		backblastPubRecord.setOtherId(cleanEscapes(backblastPubRecord.getOtherId()));
+		// 设置民警姓名电话(非民警暂时也记录)
+		User user = SpringUtils.getBean(IUserService.class).getById(AuthUtil.getUserId());
+		if (null!=user){
+			backblastPubRecord.setPoliceman(user.getRealName());
+			backblastPubRecord.setPolicemanPhone(user.getPhone());
+		}
+		if (null!=backblastPubRecord.getId()){
+			// 更新
+			flag = updateById(backblastPubRecord);
+		}else {
+			// 新增
+			flag = save(backblastPubRecord);
+		}
+		// 宣防对象操作
+		updateBackblastPubPerson(backblastPubRecord);
+		// 返回
+		return flag;
+	}
+
+	/**
+	 * 清理字符串中的多余转义字符
+	 * @param originalStr 原始字符串
+	 * @return 清理后的字符串
+	 */
+	private static String cleanEscapes(String originalStr) {
+		if (StringUtils.isBlank(originalStr)) {
+			return "";
+		}
+		// 替换多个反斜杠为单个反斜杠
+		String replacedBackslashes = originalStr.replaceAll("\\\\+", "\\\\");
+		// 替换转义的双引号为空
+		String cleanedStr = replacedBackslashes.replaceAll("\\\\\"", "").replaceAll("\"", "");
+
+		return cleanedStr;
+	}
+
+	/**
+	 * 宣防对象操作
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	public void updateBackblastPubPerson(BackblastPubRecordVO backblastPubRecord) {
+		IBackblastPubPersonService backblastPubPersonService = SpringUtil.getBean(IBackblastPubPersonService.class);
+		if (backblastPubRecord.getBackblastPubPersonEntityList().size()>0){
+			// 查询对应已存在的反诈宣传对象
+			QueryWrapper<BackblastPubPersonEntity> wrapper = new QueryWrapper<>();
+			wrapper.eq("backblast_pub_record_id", backblastPubRecord.getId()).eq("is_deleted",0);
+			List<BackblastPubPersonEntity> oldList = backblastPubPersonService.list(wrapper);
+			// 取出反诈宣传对象信息
+			List<BackblastPubPersonEntity> backblastPubPersonEntityList = backblastPubRecord.getBackblastPubPersonEntityList();
+			for (BackblastPubPersonEntity pubPersonEntity : backblastPubPersonEntityList) {
+				pubPersonEntity.setBackblastPubRecordId(backblastPubRecord.getId());
+			}
+			// 申明新增,修改,删除集合
+			List<BackblastPubPersonEntity> newList = new ArrayList<>();
+			List<BackblastPubPersonEntity> addList = new ArrayList<>();
+			List<BackblastPubPersonEntity> updateList = new ArrayList<>();
+			List<BackblastPubPersonEntity> removeList = new ArrayList<>();
+			// 遍历设置数据
+			for (BackblastPubPersonEntity pubPersonEntity : backblastPubPersonEntityList) {
+				if (null == pubPersonEntity.getId()) {
+					// 新增
+					addList.add(pubPersonEntity);
+				} else {
+					newList.add(pubPersonEntity);
+				}
+			}
+			// 遍历去差集,判断是新增还是删除还是更新
+			// 取旧数据和新提交数据差集--删除
+			removeList = oldList.stream().filter(vo -> !newList.stream().map(e ->
+				e.getId()).collect(Collectors.toList()).contains(vo.getId())).collect(Collectors.toList());
+			// 取旧数据和新提交数据交集--更新
+			updateList = newList.stream().filter(vo -> oldList.stream().map(e ->
+				e.getId()).collect(Collectors.toList()).contains(vo.getId())).collect(Collectors.toList());
+
+			// 批量新增
+			if (addList.size() > 0) {
+				backblastPubPersonService.saveBatch(addList);
+			}
+			// 批量修改
+			if (updateList.size() > 0) {
+				backblastPubPersonService.updateBatchById(updateList);
+			}
+			// 批量删除
+			if (removeList.size() > 0) {
+				backblastPubPersonService.removeBatchByIds(removeList);
+			}
+		}else {
+			// 删除所有
+			QueryWrapper<BackblastPubPersonEntity> wrapper = new QueryWrapper<>();
+			wrapper.eq("backblast_pub_record_id", backblastPubRecord.getId());
+			boolean remove = backblastPubPersonService.remove(wrapper);
+		}
+	}
+
+	/**
+	 * 设置警格网格信息
+	 * @param backblastPubRecord
+	 */
+	public void setGridInfo(BackblastPubRecordVO backblastPubRecord) {
+		// 根据位置设置网格,警格编号
+		IGridService gridService = SpringUtils.getBean(IGridService.class);
+		IPoliceAffairsGridService policeAffairsGridService = SpringUtils.getBean(IPoliceAffairsGridService.class);
+		String point = "'POINT(" + backblastPubRecord.getLng() + " " + backblastPubRecord.getLat() + ")'";
+		if(StringUtils.isBlank(backblastPubRecord.getGridCode())){
+			//点坐标解析网格
+			List<GridEntity> gridEntityList = gridService.spatialAnalysis(point);
+			if (gridEntityList.size()>0){
+				GridEntity gridEntity = gridEntityList.get(0);
+				backblastPubRecord.setGridCode(gridEntity.getGridCode());
+			}
+		}
+		//点坐标解析警格
+		List<PoliceAffairsGridEntity> policeAffairsGridEntityList = policeAffairsGridService.spatialAnalysis(point);
+		if (policeAffairsGridEntityList.size()>0){
+			PoliceAffairsGridEntity policeAffairsGridEntity = policeAffairsGridEntityList.get(0);
+			backblastPubRecord.setJwGridCode(policeAffairsGridEntity.getJwGridCode());
+		}
+	}
+
+	/**
+	 * 反炸宣传记录表 自定义详情
+	 * @param backblastPubRecord
+	 * @return
+	 */
+	@Override
+	public BackblastPubRecordVO getDetail(BackblastPubRecordVO backblastPubRecord) {
+		return baseMapper.getDetail(backblastPubRecord);
+	}
+
+	/**
+	 * 反炸宣传记录表 删除
+	 */
+	@Override
+	public boolean removeBackblastPubByIds(List<Long> toLongList) {
+		// 先删除对应的宣传记录
+		boolean flag = removeByIds(toLongList);
+		// 再删除对应的宣传对象信息
+		if (flag){
+			IBackblastPubPersonService backblastPubPersonService = SpringUtil.getBean(IBackblastPubPersonService.class);
+				// 删除所有
+				QueryWrapper<BackblastPubPersonEntity> wrapper = new QueryWrapper<>();
+				wrapper.in("backblast_pub_record_id", toLongList);
+				backblastPubPersonService.remove(wrapper);
+			// for (Long id : toLongList) {
+			// 	// 删除所有
+			// 	QueryWrapper<BackblastPubPersonEntity> wrapper = new QueryWrapper<>();
+			// 	wrapper.eq("backblast_pub_record_id", id);
+			// 	backblastPubPersonService.remove(wrapper);
+			// }
+		}
+		return flag;
+	}
+
+	@Override
+	public List<BackblastPubRecordExcel> export(BackblastPubRecordVO backblastPubRecord) {
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(BackblastPubRecordVO.class, backblastPubRecord);
+		if (!Strings.isBlank(backblastPubRecord.getRoleName())){
+			backblastPubRecord.setCreateUser(AuthUtil.getUserId());
+		}
+		return baseMapper.selectBackblastPubRecordExport(backblastPubRecord,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList());
+	}
+}
diff --git a/src/main/java/org/springblade/modules/backblast/service/impl/BackblastWarnHanRecServiceImpl.java b/src/main/java/org/springblade/modules/backblast/service/impl/BackblastWarnHanRecServiceImpl.java
new file mode 100644
index 0000000..e67f039
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/service/impl/BackblastWarnHanRecServiceImpl.java
@@ -0,0 +1,80 @@
+package org.springblade.modules.backblast.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.logging.log4j.util.Strings;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.param.GridSet;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.modules.backblast.vo.BackblastWarnHanRecVO;
+import org.springblade.modules.backblast.mapper.BackblastWarnHanRecMapper;
+import org.springblade.modules.backblast.service.IBackblastWarnHanRecService;
+import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.service.IUserService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 反炸预警处置记录表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Service
+public class BackblastWarnHanRecServiceImpl extends ServiceImpl<BackblastWarnHanRecMapper, BackblastWarnHanRecEntity> implements IBackblastWarnHanRecService {
+
+	/**
+	 * 自定义分页查询
+	 * @param page
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	@Override
+	public IPage<BackblastWarnHanRecVO> selectBackblastWarnHanRecPage(IPage<BackblastWarnHanRecVO> page, BackblastWarnHanRecVO backblastWarnHanRec) {
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(BackblastWarnHanRecVO.class, backblastWarnHanRec);
+		if (!Strings.isBlank(backblastWarnHanRec.getRoleName())){
+			backblastWarnHanRec.setCreateUser(AuthUtil.getUserId());
+		}
+		return page.setRecords(baseMapper.selectBackblastWarnHanRecPage(page,
+			backblastWarnHanRec,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList()));
+	}
+
+	/**
+	 * 自定义新增/修改
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	@Override
+	public boolean saveOrUpdateBackblastWarnHanRecEntity(BackblastWarnHanRecEntity backblastWarnHanRec) {
+		// 点落面计算警格,网格,警格
+		GridSet invoke = new GridSet().invoke(BackblastWarnHanRecEntity.class, backblastWarnHanRec,
+			"lng", "lat", "gridCode", "jwGridCode");
+		// 设置民警姓名电话(非民警暂时也记录)
+		User user = SpringUtils.getBean(IUserService.class).getById(AuthUtil.getUserId());
+		if (null!=user){
+			backblastWarnHanRec.setPoliceman(user.getRealName());
+			backblastWarnHanRec.setPolicemanPhone(user.getPhone());
+		}
+		if (null!=backblastWarnHanRec.getId()){
+			// 更新
+			return updateById(backblastWarnHanRec);
+		}
+		// 新增
+		return save(backblastWarnHanRec);
+	}
+
+	/**
+	 * 反炸预警处置记录表 自定义详情
+	 * @param backblastWarnHanRec
+	 * @return
+	 */
+	@Override
+	public BackblastWarnHanRecVO getDetail(BackblastWarnHanRecVO backblastWarnHanRec) {
+		return baseMapper.getDetail(backblastWarnHanRec);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/backblast/vo/BackblastPubPersonVO.java b/src/main/java/org/springblade/modules/backblast/vo/BackblastPubPersonVO.java
new file mode 100644
index 0000000..f1157bc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/vo/BackblastPubPersonVO.java
@@ -0,0 +1,79 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+
+/**
+ * 反诈宣传宣防对象表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BackblastPubPersonVO extends BackblastPubPersonEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+
+
+	@ApiModelProperty(value = "角色别名", example = "")
+	private String roleName;
+
+	/**
+	 * 搜索关键字
+	 */
+	@ApiModelProperty(value = "搜索关键字", example = "")
+	private String searchKey;
+
+	/**
+	 * 开始时间
+	 */
+	@ApiModelProperty(value = "开始时间", example = "")
+	private String startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@ApiModelProperty(value = "结束时间", example = "")
+	private String endTime;
+
+	/**
+	 * 乡镇名称
+	 */
+	@ApiModelProperty(value = "乡镇名称", example = "")
+	private String townName;
+
+	/**
+	 * 社区名称
+	 */
+	@ApiModelProperty(value = "社区名称", example = "")
+	private String communityName;
+
+	/**
+	 * 派出所名称
+	 */
+	@ApiModelProperty(value = "派出所名称", example = "")
+	private String pcsName;
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/vo/BackblastPubRecordVO.java b/src/main/java/org/springblade/modules/backblast/vo/BackblastPubRecordVO.java
new file mode 100644
index 0000000..a144c75
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/vo/BackblastPubRecordVO.java
@@ -0,0 +1,102 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.place.entity.PlacePractitionerEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 反炸宣传记录表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BackblastPubRecordVO extends BackblastPubRecordEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+
+
+	@ApiModelProperty(value = "角色别名", example = "")
+	private String roleName;
+
+	/**
+	 * 搜索关键字
+	 */
+	@ApiModelProperty(value = "搜索关键字", example = "")
+	private String searchKey;
+
+	/**
+	 * 开始时间
+	 */
+	@ApiModelProperty(value = "开始时间", example = "")
+	private String startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@ApiModelProperty(value = "结束时间", example = "")
+	private String endTime;
+
+	/**
+	 * 乡镇名称
+	 */
+	@ApiModelProperty(value = "乡镇名称", example = "")
+	private String townName;
+
+	/**
+	 * 社区名称
+	 */
+	@ApiModelProperty(value = "社区名称", example = "")
+	private String communityName;
+
+	/**
+	 * 派出所名称
+	 */
+	@ApiModelProperty(value = "派出所名称", example = "")
+	private String pcsName;
+
+	@ApiModelProperty(value = "机构名称", example = "")
+	private String deptName;
+
+	@ApiModelProperty(value = "小区名称", example = "")
+	private String aoiName;
+
+	@ApiModelProperty(value = "房屋名称", example = "")
+	private String houseName;
+
+	@ApiModelProperty(value = "网格名称", example = "")
+	private String gridName;
+
+	/**
+	 * 反诈宣防对象
+	 */
+	@ApiModelProperty(value = "反诈宣防对象", example = "")
+	private List<BackblastPubPersonEntity> backblastPubPersonEntityList = new ArrayList<>();
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/vo/BackblastWarnHanRecVO.java b/src/main/java/org/springblade/modules/backblast/vo/BackblastWarnHanRecVO.java
new file mode 100644
index 0000000..6925ae7
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/vo/BackblastWarnHanRecVO.java
@@ -0,0 +1,82 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 反炸预警处置记录表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BackblastWarnHanRecVO extends BackblastWarnHanRecEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+
+
+	@ApiModelProperty(value = "角色别名", example = "")
+	private String roleName;
+
+	/**
+	 * 搜索关键字
+	 */
+	@ApiModelProperty(value = "搜索关键字", example = "")
+	private String searchKey;
+
+	/**
+	 * 开始时间
+	 */
+	@ApiModelProperty(value = "开始时间", example = "")
+	private String startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@ApiModelProperty(value = "结束时间", example = "")
+	private String endTime;
+
+	/**
+	 * 乡镇名称
+	 */
+	@ApiModelProperty(value = "乡镇名称", example = "")
+	private String townName;
+
+	/**
+	 * 社区名称
+	 */
+	@ApiModelProperty(value = "社区名称", example = "")
+	private String communityName;
+
+	/**
+	 * 派出所名称
+	 */
+	@ApiModelProperty(value = "派出所名称", example = "")
+	private String pcsName;
+
+	@ApiModelProperty(value = "机构名称", example = "")
+	private String deptName;
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubPersonWrapper.java b/src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubPersonWrapper.java
new file mode 100644
index 0000000..e805f32
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubPersonWrapper.java
@@ -0,0 +1,34 @@
+package org.springblade.modules.backblast.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.backblast.entity.BackblastPubPersonEntity;
+import org.springblade.modules.backblast.vo.BackblastPubPersonVO;
+import java.util.Objects;
+
+/**
+ * 反炸宣传记录表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public class BackblastPubPersonWrapper extends BaseEntityWrapper<BackblastPubPersonEntity, BackblastPubPersonVO>  {
+
+	public static BackblastPubPersonWrapper build() {
+		return new BackblastPubPersonWrapper();
+ 	}
+
+	@Override
+	public BackblastPubPersonVO entityVO(BackblastPubPersonEntity backblastPubRecord) {
+		BackblastPubPersonVO backblastPubRecordVO = Objects.requireNonNull(BeanUtil.copy(backblastPubRecord, BackblastPubPersonVO.class));
+
+		//User createUser = UserCache.getUser(backblastPubRecord.getCreateUser());
+		//User updateUser = UserCache.getUser(backblastPubRecord.getUpdateUser());
+		//backblastPubRecordVO.setCreateUserName(createUser.getName());
+		//backblastPubRecordVO.setUpdateUserName(updateUser.getName());
+
+		return backblastPubRecordVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubRecordWrapper.java b/src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubRecordWrapper.java
new file mode 100644
index 0000000..ab8e442
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/wrapper/BackblastPubRecordWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.backblast.entity.BackblastPubRecordEntity;
+import org.springblade.modules.backblast.vo.BackblastPubRecordVO;
+import java.util.Objects;
+
+/**
+ * 反炸宣传记录表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public class BackblastPubRecordWrapper extends BaseEntityWrapper<BackblastPubRecordEntity, BackblastPubRecordVO>  {
+
+	public static BackblastPubRecordWrapper build() {
+		return new BackblastPubRecordWrapper();
+ 	}
+
+	@Override
+	public BackblastPubRecordVO entityVO(BackblastPubRecordEntity backblastPubRecord) {
+		BackblastPubRecordVO backblastPubRecordVO = Objects.requireNonNull(BeanUtil.copy(backblastPubRecord, BackblastPubRecordVO.class));
+
+		//User createUser = UserCache.getUser(backblastPubRecord.getCreateUser());
+		//User updateUser = UserCache.getUser(backblastPubRecord.getUpdateUser());
+		//backblastPubRecordVO.setCreateUserName(createUser.getName());
+		//backblastPubRecordVO.setUpdateUserName(updateUser.getName());
+
+		return backblastPubRecordVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/backblast/wrapper/BackblastWarnHanRecWrapper.java b/src/main/java/org/springblade/modules/backblast/wrapper/BackblastWarnHanRecWrapper.java
new file mode 100644
index 0000000..4db9875
--- /dev/null
+++ b/src/main/java/org/springblade/modules/backblast/wrapper/BackblastWarnHanRecWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.backblast.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.modules.backblast.vo.BackblastWarnHanRecVO;
+import java.util.Objects;
+
+/**
+ * 反炸预警处置记录表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-15
+ */
+public class BackblastWarnHanRecWrapper extends BaseEntityWrapper<BackblastWarnHanRecEntity, BackblastWarnHanRecVO>  {
+
+	public static BackblastWarnHanRecWrapper build() {
+		return new BackblastWarnHanRecWrapper();
+ 	}
+
+	@Override
+	public BackblastWarnHanRecVO entityVO(BackblastWarnHanRecEntity backblastWarnHanRec) {
+		BackblastWarnHanRecVO backblastWarnHanRecVO = Objects.requireNonNull(BeanUtil.copy(backblastWarnHanRec, BackblastWarnHanRecVO.class));
+
+		//User createUser = UserCache.getUser(backblastWarnHanRec.getCreateUser());
+		//User updateUser = UserCache.getUser(backblastWarnHanRec.getUpdateUser());
+		//backblastWarnHanRecVO.setCreateUserName(createUser.getName());
+		//backblastWarnHanRecVO.setUpdateUserName(updateUser.getName());
+
+		return backblastWarnHanRecVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/category/excel/CategoryExcel.java b/src/main/java/org/springblade/modules/category/excel/CategoryExcel.java
new file mode 100644
index 0000000..3ae127f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/category/excel/CategoryExcel.java
@@ -0,0 +1,45 @@
+package org.springblade.modules.category.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * CategoryExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class CategoryExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/** 标签名称 */
+	@ExcelProperty( "小类")
+	private String categoryName;
+
+	/** 标签编号 */
+	@ExcelProperty( "类别代码")
+	private String categoryNo;
+
+	/** 层级 */
+	@ExcelProperty( "层级")
+	private Integer level;
+
+	/** 提示词分类描述 */
+	@ExcelProperty( "提示词分类描述")
+	private String description;
+
+	/** 备注 */
+	@ExcelProperty( "备注")
+	private String remark;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/category/excel/CategoryImporter.java b/src/main/java/org/springblade/modules/category/excel/CategoryImporter.java
new file mode 100644
index 0000000..5ab894f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/category/excel/CategoryImporter.java
@@ -0,0 +1,39 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.category.excel;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.excel.support.ExcelImporter;
+import org.springblade.modules.category.service.ICategoryService;
+import java.util.List;
+
+/**
+ * 场所标签poi数据导入类
+ *
+ * @author Chill
+ */
+@RequiredArgsConstructor
+public class CategoryImporter implements ExcelImporter<CategoryExcel> {
+
+	private final ICategoryService categoryService;
+	private final Boolean isCovered;
+
+	@Override
+	public void save(List<CategoryExcel> data) {
+		categoryService.importCategory(data, isCovered);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/counties/controller/CountiesController.java b/src/main/java/org/springblade/modules/counties/controller/CountiesController.java
new file mode 100644
index 0000000..2eb7862
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/controller/CountiesController.java
@@ -0,0 +1,129 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.counties.dto.CountiesDTO;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.counties.entity.CountiesEntity;
+import org.springblade.modules.counties.vo.CountiesVO;
+import org.springblade.modules.counties.wrapper.CountiesWrapper;
+import org.springblade.modules.counties.service.ICountiesService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.List;
+
+/**
+ * E呼即办区县 控制器
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-counties/counties")
+@Api(value = "E呼即办区县", tags = "E呼即办区县接口")
+public class CountiesController extends BladeController {
+
+	private final ICountiesService countiesService;
+
+	/**
+	 * E呼即办区县 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入counties")
+	public R<CountiesVO> detail(CountiesEntity counties) {
+		CountiesEntity detail = countiesService.getOne(Condition.getQueryWrapper(counties));
+		return R.data(CountiesWrapper.build().entityVO(detail));
+	}
+	/**
+	 * E呼即办区县 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入counties")
+	public R<List<CountiesVO>> list(CountiesEntity counties, Query query) {
+		List<CountiesEntity> list = countiesService.list();
+		return R.data(CountiesWrapper.build().listVO(list));
+	}
+
+	/**
+	 * E呼即办区县 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入counties")
+	public R<IPage<CountiesVO>> page(CountiesVO counties, Query query) {
+		IPage<CountiesVO> pages = countiesService.selectCountiesPage(Condition.getPage(query), counties);
+		return R.data(pages);
+	}
+
+	/**
+	 * E呼即办区县 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入counties")
+	public R save(@Valid @RequestBody CountiesEntity counties) {
+		return R.status(countiesService.save(counties));
+	}
+
+	/**
+	 * E呼即办区县 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入counties")
+	public R update(@Valid @RequestBody CountiesEntity counties) {
+		return R.status(countiesService.updateById(counties));
+	}
+
+	/**
+	 * E呼即办区县 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入counties")
+	public R submit(@Valid @RequestBody CountiesEntity counties) {
+		return R.status(countiesService.saveOrUpdate(counties));
+	}
+
+	/**
+	 * E呼即办区县 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(countiesService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/counties/dto/CountiesDTO.java b/src/main/java/org/springblade/modules/counties/dto/CountiesDTO.java
new file mode 100644
index 0000000..e276327
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/dto/CountiesDTO.java
@@ -0,0 +1,53 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * E呼即办区县 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Data
+public class CountiesDTO {
+	private static final long serialVersionUID = 1L;
+	@ApiModelProperty(value = "", example = "")
+	@TableField("name")
+	private String name;
+
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "code", type = IdType.ASSIGN_UUID)
+	private String code;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("up_code")
+	private String upCode;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("code6")
+	private String code6;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("code_append")
+	private String codeAppend;
+}
diff --git a/src/main/java/org/springblade/modules/counties/entity/CountiesEntity.java b/src/main/java/org/springblade/modules/counties/entity/CountiesEntity.java
new file mode 100644
index 0000000..724f597
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/entity/CountiesEntity.java
@@ -0,0 +1,59 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+/**
+ * E呼即办区县 实体类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Data
+@TableName("jczz_counties")
+@ApiModel(value = "Counties对象", description = "E呼即办区县")
+public class CountiesEntity  {
+	@ApiModelProperty(value = "", example = "")
+	@TableField("name")
+	private String name;
+
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "code", type = IdType.ASSIGN_UUID)
+	private String code;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("up_code")
+	private String upCode;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("code6")
+	private String code6;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("code_append")
+	private String codeAppend;
+
+}
diff --git a/src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.java b/src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.java
new file mode 100644
index 0000000..f3314d3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.mapper;
+
+import org.springblade.modules.counties.entity.CountiesEntity;
+import org.springblade.modules.counties.vo.CountiesVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * E呼即办区县 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+public interface CountiesMapper extends BaseMapper<CountiesEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param counties
+	 * @return
+	 */
+	List<CountiesVO> selectCountiesPage(IPage page, CountiesVO counties);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.xml b/src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.xml
new file mode 100644
index 0000000..16ceac6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/mapper/CountiesMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.counties.mapper.CountiesMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="countiesResultMap" type="org.springblade.modules.counties.entity.CountiesEntity">
+    </resultMap>
+
+
+    <select id="selectCountiesPage" resultMap="countiesResultMap">
+        select * from jczz_counties
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/counties/service/ICountiesService.java b/src/main/java/org/springblade/modules/counties/service/ICountiesService.java
new file mode 100644
index 0000000..78ea031
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/service/ICountiesService.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.counties.entity.CountiesEntity;
+import org.springblade.modules.counties.vo.CountiesVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * E呼即办区县 服务类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+public interface ICountiesService extends IService<CountiesEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param counties
+	 * @return
+	 */
+	IPage<CountiesVO> selectCountiesPage(IPage<CountiesVO> page, CountiesVO counties);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/counties/service/impl/CountiesServiceImpl.java b/src/main/java/org/springblade/modules/counties/service/impl/CountiesServiceImpl.java
new file mode 100644
index 0000000..f1958f6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/service/impl/CountiesServiceImpl.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.counties.entity.CountiesEntity;
+import org.springblade.modules.counties.vo.CountiesVO;
+import org.springblade.modules.counties.mapper.CountiesMapper;
+import org.springblade.modules.counties.service.ICountiesService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * E呼即办区县 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Service
+public class CountiesServiceImpl extends ServiceImpl<CountiesMapper, CountiesEntity> implements ICountiesService {
+
+	@Override
+	public IPage<CountiesVO> selectCountiesPage(IPage<CountiesVO> page, CountiesVO counties) {
+		return page.setRecords(baseMapper.selectCountiesPage(page, counties));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/counties/vo/CountiesVO.java b/src/main/java/org/springblade/modules/counties/vo/CountiesVO.java
new file mode 100644
index 0000000..c5dab5b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/vo/CountiesVO.java
@@ -0,0 +1,35 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.vo;
+
+import org.springblade.modules.counties.entity.CountiesEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * E呼即办区县 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CountiesVO extends CountiesEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/counties/wrapper/CountiesWrapper.java b/src/main/java/org/springblade/modules/counties/wrapper/CountiesWrapper.java
new file mode 100644
index 0000000..47ee697
--- /dev/null
+++ b/src/main/java/org/springblade/modules/counties/wrapper/CountiesWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.counties.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.counties.entity.CountiesEntity;
+import org.springblade.modules.counties.vo.CountiesVO;
+import java.util.Objects;
+
+/**
+ * E呼即办区县 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+public class CountiesWrapper extends BaseEntityWrapper<CountiesEntity, CountiesVO>  {
+
+	public static CountiesWrapper build() {
+		return new CountiesWrapper();
+ 	}
+
+	@Override
+	public CountiesVO entityVO(CountiesEntity counties) {
+		CountiesVO countiesVO = Objects.requireNonNull(BeanUtil.copy(counties, CountiesVO.class));
+
+		//User createUser = UserCache.getUser(counties.getCreateUser());
+		//User updateUser = UserCache.getUser(counties.getUpdateUser());
+		//countiesVO.setCreateUserName(createUser.getName());
+		//countiesVO.setUpdateUserName(updateUser.getName());
+
+		return countiesVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java b/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java
new file mode 100644
index 0000000..495d2d1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/discuss/excel/UserTopicsExcel.java
@@ -0,0 +1,62 @@
+package org.springblade.modules.discuss.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * HouseExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class UserTopicsExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	@ExcelProperty( "业主姓名")
+	private String name;
+
+	@ExcelProperty( "业主电话")
+	private String phone;
+
+	@ExcelProperty( "地块")
+	private String districtName;
+
+	@ExcelProperty( "栋号")
+	private String building;
+
+	@ExcelProperty( "房号")
+	private String room;
+
+	@ExcelProperty( "地址")
+	private String addressName;
+
+	@ExcelProperty( "面积")
+	private BigDecimal area;
+
+	@ExcelProperty( "候选人")
+	private String optionContent;
+
+	@ExcelProperty(value = "投票时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date createTime;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/discuss/excel/holdExcel.java b/src/main/java/org/springblade/modules/discuss/excel/holdExcel.java
new file mode 100644
index 0000000..b79cf39
--- /dev/null
+++ b/src/main/java/org/springblade/modules/discuss/excel/holdExcel.java
@@ -0,0 +1,73 @@
+package org.springblade.modules.discuss.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * HouseExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class holdExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	@ExcelProperty( "业主姓名")
+	private String name;
+
+	@ExcelProperty( "业主电话")
+	private String phone;
+
+	@ExcelProperty( "地块")
+	private String districtName;
+
+	@ExcelProperty( "栋号")
+	private String building;
+
+	@ExcelProperty( "房号")
+	private String room;
+
+
+	@ExcelProperty( "地址")
+	private String houseName;
+
+//	@ExcelProperty( "小区")
+//	private String aoiName;
+
+	@ExcelProperty( "面积")
+	private BigDecimal area;
+
+	@ExcelProperty( "是否投票")
+	private String voteFlag;
+
+	@ExcelProperty( "管理规约")
+	private String managementRegulations;
+
+	@ExcelProperty( "议事规则")
+	private String rulesOfProcedure;
+
+	@ExcelProperty( "投票项")
+	@ExcelIgnore
+	private String optionContent;
+
+
+	@ExcelProperty(value = "投票时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date createTime;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java b/src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java
new file mode 100644
index 0000000..c6ad98e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/discuss/excel/topicsExcel.java
@@ -0,0 +1,54 @@
+package org.springblade.modules.discuss.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * HouseExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class topicsExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	@ExcelProperty( "姓名")
+	private String name;
+
+	@ExcelProperty( "手机号")
+	private String phone;
+
+	@ExcelProperty( "地址")
+	private String addressName;
+
+	@ExcelProperty( "小区")
+	private String aoiName;
+
+	@ExcelProperty( "面积")
+	private String area;
+
+	@ExcelProperty( "地块")
+	private String remark;
+
+	@ExcelProperty( "投票项")
+	private String optionContent;
+
+
+	@ExcelProperty(value = "创建时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date createTime;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/disputeRecord/controller/DisputeRecordController.java b/src/main/java/org/springblade/modules/disputeRecord/controller/DisputeRecordController.java
new file mode 100644
index 0000000..b97ba65
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/controller/DisputeRecordController.java
@@ -0,0 +1,212 @@
+package org.springblade.modules.disputeRecord.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.disputeRecord.excel.DisputeRecordExcel;
+import org.springblade.modules.disputeRecord.excel.DisputeRecordImporter;
+import org.springblade.modules.disputeRecord.excel.ExportDisputeRecordExcel;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import org.springblade.modules.disputeRecord.vo.DisputeRecordVO;
+import org.springblade.modules.disputeRecord.wrapper.DisputeRecordWrapper;
+import org.springblade.modules.disputeRecord.service.IDisputeRecordService;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 矛盾纠纷记录表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-disputeRecord/disputeRecord")
+@Api(value = "矛盾纠纷记录表", tags = "矛盾纠纷记录表接口")
+public class DisputeRecordController {
+
+	private final IDisputeRecordService disputeRecordService;
+	private final BladeLogger bladeLogger;
+
+	/**
+	 * 矛盾纠纷记录表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入disputeRecord")
+	public R detail(DisputeRecordEntity disputeRecord) {
+		DisputeRecordEntity detail = disputeRecordService.getOne(Condition.getQueryWrapper(disputeRecord));
+		return R.data(detail);
+	}
+	/**
+	 * 矛盾纠纷记录表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入disputeRecord")
+	public R<IPage<DisputeRecordVO>> list(DisputeRecordEntity disputeRecord, Query query) {
+		IPage<DisputeRecordEntity> pages = disputeRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(disputeRecord));
+		return R.data(DisputeRecordWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 矛盾纠纷记录表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入disputeRecord")
+	public R<IPage<DisputeRecordVO>> page(DisputeRecordVO disputeRecord, Query query) {
+		IPage<DisputeRecordVO> pages = disputeRecordService.selectDisputeRecordPage(Condition.getPage(query), disputeRecord);
+		return R.data(pages);
+	}
+
+	/**
+	 * 矛盾纠纷记录表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入disputeRecord")
+	public R save(@Valid @RequestBody DisputeRecordEntity disputeRecord) {
+		return R.status(disputeRecordService.save(disputeRecord));
+	}
+
+	/**
+	 * 矛盾纠纷记录表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入disputeRecord")
+	public R update(@Valid @RequestBody DisputeRecordEntity disputeRecord) {
+		return R.status(disputeRecordService.updateById(disputeRecord));
+	}
+
+	/**
+	 * 矛盾纠纷记录表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入disputeRecord")
+	public R submit(@Valid @RequestBody DisputeRecordEntity disputeRecord) {
+		return R.status(disputeRecordService.saveOrUpdate(disputeRecord));
+	}
+
+	/**
+	 * 矛盾纠纷记录表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(disputeRecordService.removeByIds(Func.toLongList(ids)));
+	}
+
+
+	/**
+	 * 矛盾纠纷记录表 自定义新增或修改
+	 * @param disputeRecord
+	 * @return
+	 */
+	@PostMapping("/saveOrUpdate")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "自定义新增或修改", notes = "传入disputeRecord")
+	public R saveOrUpdate(@Valid @RequestBody DisputeRecordEntity disputeRecord) {
+		return R.status(disputeRecordService.saveOrUpdateDisputeRecord(disputeRecord));
+	}
+
+	/**
+	 * 矛盾纠纷记录表 自定义详情
+	 * @param disputeRecord
+	 * @return
+	 */
+	@GetMapping("/getDetail")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "自定义详情", notes = "传入disputeRecord")
+	public R getDetail(DisputeRecordVO disputeRecord) {
+		return R.data(disputeRecordService.getDetail(disputeRecord));
+	}
+
+	/**
+	 * 导入矛盾纠纷记录表
+	 */
+	@PostMapping("import-disputeRecord")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "批量导入矛盾纠纷记录", notes = "传入excel")
+	public R importDisputeRecord(MultipartFile file, Integer isCovered) {
+		bladeLogger.info("批量导入矛盾纠纷记录", JsonUtil.toJson(isCovered));
+		String result = disputeRecordService.importDisputeRecord(ExcelUtil.read(file, DisputeRecordExcel.class),isCovered==1);
+		return R.data(200, result, null);
+	}
+
+	/**
+	 * 导出矛盾纠纷记录表
+	 */
+	@GetMapping("export-disputeRecord")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "导出矛盾纠纷记录表", notes = "传入disputeRecord")
+	public void exportDisputeRecord(DisputeRecordVO disputeRecord, HttpServletResponse response) {
+		List<ExportDisputeRecordExcel> list = disputeRecordService.exportDisputeRecordList(disputeRecord);
+		ExcelUtil.export(response, "矛盾纠纷记录数据" + DateUtil.time(), "矛盾纠纷记录数据表", list, ExportDisputeRecordExcel.class);
+	}
+
+	/**
+	 * 导出模板
+	 */
+	@GetMapping("/export-template")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "导出模板")
+	public void exportTemplate(HttpServletResponse response) {
+		List<DisputeRecordExcel> list = new ArrayList<>();
+		DisputeRecordExcel disputeRecordExcel = new DisputeRecordExcel();
+		disputeRecordExcel.setAddress("江西省上饶市茅家岭街道***社区****");
+		disputeRecordExcel.setLng("117.12241224");
+		disputeRecordExcel.setLat("28.154412451");
+		disputeRecordExcel.setEventTime("2024-01-01 12:00:00");
+		disputeRecordExcel.setNameOne("张三");
+		disputeRecordExcel.setGenderOne("男");
+		disputeRecordExcel.setPhoneOne("131****1234");
+		disputeRecordExcel.setIdCardOne("360728*********0000");
+		disputeRecordExcel.setNameTwo("李四");
+		disputeRecordExcel.setGenderTwo("女");
+		disputeRecordExcel.setPhoneTwo("132****1234");
+		disputeRecordExcel.setIdCardTwo("360728*********0001");
+		disputeRecordExcel.setDisputeType("2");
+		disputeRecordExcel.setDisputeContent("隔壁半夜放音乐太大声");
+		disputeRecordExcel.setInjuryFlag("否");
+		disputeRecordExcel.setInjuryDesc("");
+		disputeRecordExcel.setAlarmNum(3);
+		disputeRecordExcel.setSource("1");
+		disputeRecordExcel.setHandleResult("未化解");
+		// 加入集合
+		list.add(disputeRecordExcel);
+		// 写入返回
+		ExcelUtil.export(response, "矛盾纠纷记录数据模板", "矛盾纠纷记录数据表", list, DisputeRecordExcel.class);
+	}
+
+
+	/**
+	 * e呼即办数据临时转换到矛盾纠纷
+	 */
+	@GetMapping("/eCallToDis")
+	@ApiOperationSupport(order = 13)
+	public void eCallToDis() {
+		disputeRecordService.eCallToDis();
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/dto/DisputeRecordDTO.java b/src/main/java/org/springblade/modules/disputeRecord/dto/DisputeRecordDTO.java
new file mode 100644
index 0000000..22b68b6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/dto/DisputeRecordDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.disputeRecord.dto;
+
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 矛盾纠纷记录表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DisputeRecordDTO extends DisputeRecordEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/entity/DisputeRecordEntity.java b/src/main/java/org/springblade/modules/disputeRecord/entity/DisputeRecordEntity.java
new file mode 100644
index 0000000..cef0656
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/entity/DisputeRecordEntity.java
@@ -0,0 +1,164 @@
+package org.springblade.modules.disputeRecord.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 矛盾纠纷记录表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@TableName("jczz_dispute_record")
+@ApiModel(value = "DisputeRecord对象", description = "矛盾纠纷记录表")
+public class DisputeRecordEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/** 主键id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 事发地址
+	 */
+	@ApiModelProperty(value = "事发地址")
+	private String address;
+	/**
+	 * 事发经度
+	 */
+	@ApiModelProperty(value = "事发经度")
+	private String lng;
+	/**
+	 * 事发纬度
+	 */
+	@ApiModelProperty(value = "事发纬度")
+	private String lat;
+
+	/** 事发时间 */
+	@ApiModelProperty(value = "事发时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "event_time")
+	private Date eventTime;
+	/**
+	 * 当事人1姓名
+	 */
+	@ApiModelProperty(value = "当事人1姓名")
+	private String nameOne;
+	/**
+	 * 当事人1性别
+	 */
+	@ApiModelProperty(value = "当事人1性别")
+	private Integer genderOne;
+	/**
+	 * 当事人1电话
+	 */
+	@ApiModelProperty(value = "当事人1电话")
+	private String phoneOne;
+	/**
+	 * 当事人1身份证号码
+	 */
+	@ApiModelProperty(value = "当事人1身份证号码")
+	private String idCardOne;
+	/**
+	 * 当事人2姓名
+	 */
+	@ApiModelProperty(value = "当事人2姓名")
+	private String nameTwo;
+	/**
+	 * 当事人2性别
+	 */
+	@ApiModelProperty(value = "当事人2性别")
+	private Integer genderTwo;
+	/**
+	 * 当事人2电话
+	 */
+	@ApiModelProperty(value = "当事人2电话")
+	private String phoneTwo;
+	/**
+	 * 当事人2身份证号码
+	 */
+	@ApiModelProperty(value = "当事人2身份证号码")
+	private String idCardTwo;
+	/**
+	 * 纠纷类型  业务字典:disputeType
+	 */
+	@ApiModelProperty(value = "纠纷类型  业务字典:disputeType")
+	private Integer disputeType;
+	/**
+	 * 纠纷内容
+	 */
+	@ApiModelProperty(value = "纠纷内容")
+	private String disputeContent;
+	/**
+	 * 0:否 1:是   是否受伤
+	 */
+	@ApiModelProperty(value = "0:否 1:是   是否受伤 ")
+	private Integer injuryFlag;
+	/**
+	 * 受伤情况描述
+	 */
+	@ApiModelProperty(value = "受伤情况描述")
+	private String injuryDesc;
+	/**
+	 * 报警次数
+	 */
+	@ApiModelProperty(value = "报警次数")
+	private Integer alarmNum;
+	/**
+	 * 信息来源:1:群众报警  2:e呼即办推送 3:走访发现 业务字典:disputeSource
+	 */
+	@ApiModelProperty(value = "信息来源 业务字典:disputeSource")
+	private Integer source;
+	/**
+	 * 处理结果 1:已化解 2:未化解 3:移送e呼即办
+	 */
+	@ApiModelProperty(value = "处理结果 1:已化解 2:未化解 3:移送e呼即办")
+	private Integer handleResult;
+	/**
+	 * 网格编码
+	 */
+	@ApiModelProperty(value = "网格编码")
+	private String gridCode;
+	/**
+	 * 警务网格编码
+	 */
+	@ApiModelProperty(value = "警务网格编码")
+	private String jwGridCode;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新人 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField("update_user")
+	private Long updateUser;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 是否删除 0:否  1:是 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordExcel.java b/src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordExcel.java
new file mode 100644
index 0000000..bdb35b0
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordExcel.java
@@ -0,0 +1,150 @@
+package org.springblade.modules.disputeRecord.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * DisputeRecordExcel
+ * 矛盾纠纷事件
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class DisputeRecordExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/** 事发地址 */
+	@ExcelProperty( "事发地址")
+	private String address;
+	/**
+	 * 事发经度
+	 */
+	@ExcelProperty( "事发经度")
+	private String lng;
+	/**
+	 * 事发纬度
+	 */
+	@ExcelProperty( "事发纬度")
+	private String lat;
+
+	/**
+	 * 事发时间
+	 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@ExcelProperty( "事发时间")
+	private String eventTime;
+
+	/**
+	 * 当事人1姓名
+	 */
+	@ApiModelProperty(value = "当事人1姓名")
+	@ExcelProperty( "当事人1姓名")
+	private String nameOne;
+	/**
+	 * 当事人1性别
+	 */
+	@ApiModelProperty(value = "当事人1性别")
+	@ExcelProperty( "当事人1性别(男/女)")
+	private String genderOne;
+	/**
+	 * 当事人1电话
+	 */
+	@ApiModelProperty(value = "当事人1电话")
+	@ExcelProperty( "当事人1电话")
+	private String phoneOne;
+	/**
+	 * 当事人1身份证号码
+	 */
+	@ApiModelProperty(value = "当事人1身份证号码")
+	@ExcelProperty( "当事人1身份证号码")
+	private String idCardOne;
+	/**
+	 * 当事人2姓名
+	 */
+	@ApiModelProperty(value = "当事人2姓名")
+	@ExcelProperty( "当事人2姓名")
+	private String nameTwo;
+	/**
+	 * 当事人2性别
+	 */
+	@ApiModelProperty(value = "当事人2性别")
+	@ExcelProperty( "当事人2性别(男/女)")
+	private String genderTwo;
+	/**
+	 * 当事人2电话
+	 */
+	@ApiModelProperty(value = "当事人2电话")
+	@ExcelProperty( "当事人2电话")
+	private String phoneTwo;
+	/**
+	 * 当事人2身份证号码
+	 */
+	@ApiModelProperty(value = "当事人2身份证号码")
+	@ExcelProperty( "当事人2身份证号码")
+	private String idCardTwo;
+
+	/**
+	 * 纠纷类型  业务字典:disputeType
+	 */
+	@ApiModelProperty(value = "纠纷类型  业务字典:disputeType")
+	@ExcelProperty( value = "纠纷类型(家庭婚恋纠纷/邻里纠纷/劳务劳资纠纷/经济纠纷/消防纠纷/医疗纠纷/交通纠纷/其他纠纷)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "disputeType")
+	@ExcelDictItem(type = "disputeType")
+	private String disputeType;
+	/**
+	 * 纠纷内容
+	 */
+	@ApiModelProperty(value = "纠纷内容")
+	@ExcelProperty( "纠纷内容")
+	private String disputeContent;
+	/**
+	 * 0:否 1:是   是否受伤
+	 */
+	@ApiModelProperty(value = "0:否 1:是   是否受伤 ")
+	@ExcelProperty( "是否受伤(是/否)")
+	private String injuryFlag;
+	/**
+	 * 受伤情况描述
+	 */
+	@ApiModelProperty(value = "受伤情况描述")
+	@ExcelProperty( "受伤情况描述")
+	private String injuryDesc;
+	/**
+	 * 报警次数
+	 */
+	@ApiModelProperty(value = "报警次数")
+	@ExcelProperty( "报警次数")
+	private Integer alarmNum;
+	/**
+	 * 信息来源:1:群众报警  2:e呼即办推送 3:走访发现 业务字典:disputeSource
+	 */
+	@ApiModelProperty(value = "信息来源 业务字典:disputeSource")
+	@ExcelProperty( value = "信息来源(群众报警/e呼即办推送/走访发现/)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "disputeSource")
+	@ExcelDictItem(type = "disputeSource")
+	private String source;
+	/**
+	 * 处理结果 1:已化解 2:未化解 3:移送e呼即办
+	 */
+	@ApiModelProperty(value = "处理结果 1:已化解 2:未化解 3:移送e呼即办")
+	@ExcelProperty( value = "处理结果(已化解/未化解/移送e呼即办)")
+	private String handleResult;
+}
+
diff --git a/src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordImporter.java b/src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordImporter.java
new file mode 100644
index 0000000..457b1ff
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/excel/DisputeRecordImporter.java
@@ -0,0 +1,23 @@
+package org.springblade.modules.disputeRecord.excel;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.excel.support.ExcelImporter;
+import org.springblade.modules.disputeRecord.service.IDisputeRecordService;
+import java.util.List;
+
+/**
+ * 矛盾纠纷事件数据导入类
+ *
+ * @author Chill
+ */
+@RequiredArgsConstructor
+public class DisputeRecordImporter implements ExcelImporter<DisputeRecordExcel> {
+
+	private final IDisputeRecordService disputeRecordService;
+	private final Boolean isCovered;
+
+	@Override
+	public void save(List<DisputeRecordExcel> data) {
+		disputeRecordService.importDisputeRecord(data, isCovered);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/excel/ExportDisputeRecordExcel.java b/src/main/java/org/springblade/modules/disputeRecord/excel/ExportDisputeRecordExcel.java
new file mode 100644
index 0000000..1455a29
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/excel/ExportDisputeRecordExcel.java
@@ -0,0 +1,158 @@
+package org.springblade.modules.disputeRecord.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * DisputeRecordExcel
+ * 矛盾纠纷事件
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ExportDisputeRecordExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/** 事发地址 */
+	@ExcelProperty( "事发地址")
+	private String address;
+//	/**
+//	 * 事发经度
+//	 */
+//	@ExcelProperty( "事发经度")
+//	private String lng;
+//	/**
+//	 * 事发纬度
+//	 */
+//	@ExcelProperty( "事发纬度")
+//	private String lat;
+	/**
+     * 事发时间
+	 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@ExcelProperty( "事发时间")
+	private Date eventTime;
+
+	/**
+	 * 纠纷方1姓名
+	 */
+	@ApiModelProperty(value = "纠纷方1姓名")
+	@ExcelProperty( "纠纷方1姓名")
+	private String nameOne;
+	/**
+	 * 当事人1性别
+	 */
+	@ApiModelProperty(value = "当事人1性别")
+	@ExcelProperty( "当事人1性别(男/女)")
+	private String genderOne;
+	/**
+	 * 纠纷方1电话
+	 */
+	@ApiModelProperty(value = "纠纷方1电话")
+	@ExcelProperty( "纠纷方1电话")
+	private String phoneOne;
+	/**
+	 * 纠纷方1身份证号码
+	 */
+	@ApiModelProperty(value = "纠纷方1身份证号码")
+	@ExcelProperty( "纠纷方1身份证号码")
+	private String idCardOne;
+	/**
+	 * 纠纷方2姓名
+	 */
+	@ApiModelProperty(value = "纠纷方2姓名")
+	@ExcelProperty( "纠纷方2姓名")
+	private String nameTwo;
+	/**
+	 * 当事人2性别
+	 */
+	@ApiModelProperty(value = "当事人2性别")
+	@ExcelProperty( "当事人2性别(男/女)")
+	private String genderTwo;
+	/**
+	 * 纠纷方2电话
+	 */
+	@ApiModelProperty(value = "纠纷方2电话")
+	@ExcelProperty( "纠纷方2电话")
+	private String phoneTwo;
+	/**
+	 * 纠纷方2身份证号码
+	 */
+	@ApiModelProperty(value = "纠纷方2身份证号码")
+	@ExcelProperty( "纠纷方2身份证号码")
+	private String idCardTwo;
+
+	/**
+	 * 纠纷类型  业务字典:disputeType
+	 */
+	@ApiModelProperty(value = "纠纷类型  业务字典:disputeType")
+	@ExcelProperty( value = "纠纷类型(家庭婚恋纠纷/邻里纠纷/劳务劳资纠纷/经济纠纷/消防纠纷/医疗纠纷/交通纠纷/其他纠纷)",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "disputeType")
+	private String disputeType;
+	/**
+	 * 纠纷内容
+	 */
+	@ApiModelProperty(value = "纠纷内容")
+	@ExcelProperty( "纠纷内容")
+	private String disputeContent;
+	/**
+	 * 0:否 1:是   是否受伤
+	 */
+	@ApiModelProperty(value = "0:否 1:是   是否受伤 ")
+	@ExcelProperty( "是否受伤(是/否)")
+	private String injuryFlag;
+	/**
+	 * 受伤情况描述
+	 */
+	@ApiModelProperty(value = "受伤情况描述")
+	@ExcelProperty( "受伤情况描述")
+	private String injuryDesc;
+	/**
+	 * 报警次数
+	 */
+	@ApiModelProperty(value = "报警次数")
+	@ExcelProperty( "报警次数")
+	private Integer alarmNum;
+	/**
+	 * 信息来源:1:群众报警  2:e呼即办推送 3:走访发现 业务字典:disputeSource
+	 */
+	@ApiModelProperty(value = "信息来源 业务字典:disputeSource")
+	@ExcelProperty( value = "信息来源(群众报警/e呼即办推送/走访发现/)",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "disputeSource")
+	private String source;
+	/**
+	 * 处理结果 1:已化解 2:未化解 3:移送e呼即办
+	 */
+	@ApiModelProperty(value = "处理结果 1:已化解 2:未化解 3:移送e呼即办")
+	@ExcelProperty( value = "处理结果(已化解/未化解/移送e呼即办)")
+	private String handleResult;
+
+
+	/**
+	 * 乡镇名称
+	 */
+	@ApiModelProperty(value = "乡镇名称", example = "")
+	@ExcelProperty( value = "地区")
+	private String townName;
+
+	/**
+	 * 派出所名称
+	 */
+	@ApiModelProperty(value = "派出所名称", example = "")
+	@ExcelProperty( value = "辖区派出所")
+	private String pcsName;
+}
+
diff --git a/src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.java b/src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.java
new file mode 100644
index 0000000..dfeb3b2
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.java
@@ -0,0 +1,66 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.disputeRecord.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import org.springblade.modules.disputeRecord.excel.DisputeRecordExcel;
+import org.springblade.modules.disputeRecord.excel.ExportDisputeRecordExcel;
+import org.springblade.modules.disputeRecord.vo.DisputeRecordVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 矛盾纠纷记录表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public interface DisputeRecordMapper extends BaseMapper<DisputeRecordEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param disputeRecord
+	 * @return
+	 */
+	List<DisputeRecordVO> selectDisputeRecordPage(IPage page,
+												  @Param("disputeRecord") DisputeRecordVO disputeRecord,
+												  @Param("isAdministrator") Integer isAdministrator,
+												  @Param("regionChildCodesList") List<String> regionChildCodesList,
+												  @Param("gridCodeList") List<String> gridCodeList);
+
+
+	/**
+	 * 矛盾纠纷记录表 自定义详情
+	 * @param disputeRecord
+	 * @return
+	 */
+	DisputeRecordVO getDetail(@Param("disputeRecord") DisputeRecordVO disputeRecord);
+
+	/**
+	 * 导出矛盾纠纷记录表
+	 * @param disputeRecord
+	 * @return
+	 */
+	List<ExportDisputeRecordExcel> exportDisputeRecordList(@Param("disputeRecord") DisputeRecordVO disputeRecord,
+														   @Param("isAdministrator") Integer isAdministrator,
+														   @Param("regionChildCodesList") List<String> regionChildCodesList,
+														   @Param("gridCodeList") List<String> gridCodeList);
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.xml b/src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.xml
new file mode 100644
index 0000000..d1c563b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/mapper/DisputeRecordMapper.xml
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.disputeRecord.mapper.DisputeRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="disputeRecordResultMap" type="org.springblade.modules.disputeRecord.vo.DisputeRecordVO">
+        <result column="id" property="id"/>
+        <result column="address" property="address"/>
+        <result column="lng" property="lng"/>
+        <result column="lat" property="lat"/>
+        <result column="name_one" property="nameOne"/>
+        <result column="phone_one" property="phoneOne"/>
+        <result column="id_card_one" property="idCardOne"/>
+        <result column="name_two" property="nameTwo"/>
+        <result column="phone_two" property="phoneTwo"/>
+        <result column="id_card_two" property="idCardTwo"/>
+        <result column="dispute_type" property="disputeType"/>
+        <result column="dispute_content" property="disputeContent"/>
+        <result column="injury_flag" property="injuryFlag"/>
+        <result column="injury_desc" property="injuryDesc"/>
+        <result column="alarm_num" property="alarmNum"/>
+        <result column="source" property="source"/>
+        <result column="handle_result" property="handleResult"/>
+        <result column="grid_code" property="gridCode"/>
+        <result column="jw_grid_code" property="jwGridCode"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+    <!--自定列表分页查询-->
+    <select id="selectDisputeRecordPage" resultMap="disputeRecordResultMap">
+        select
+        jdr.*,
+        br.town_name as townName,
+        br.name as communityName,
+        jpag.pcs_name pcsName
+        from jczz_dispute_record jdr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jdr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jdr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        where jdr.is_deleted = 0
+        <if test="disputeRecord.disputeType != null">
+            and jdr.dispute_type = #{disputeRecord.disputeType}
+        </if>
+        <if test="disputeRecord.injuryFlag != null">
+            and jdr.injury_flag = #{disputeRecord.injuryFlag}
+        </if>
+        <if test="disputeRecord.source != null">
+            and jdr.source = #{disputeRecord.source}
+        </if>
+        <if test="disputeRecord.townName != null and disputeRecord.townName != ''">
+            and br.town_name like concat('%',#{disputeRecord.townName},'%')
+        </if>
+        <if test="disputeRecord.communityName != null and disputeRecord.communityName != ''">
+            and jbr.name like concat('%',#{disputeRecord.communityName},'%')
+        </if>
+        <if test="disputeRecord.pcsName != null and disputeRecord.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{disputeRecord.pcsName},'%')
+        </if>
+        <if test="disputeRecord.address != null and disputeRecord.address != ''">
+            and jdr.address like concat('%',#{disputeRecord.address},'%')
+        </if>
+        <if test="disputeRecord.disputeContent != null and disputeRecord.disputeContent != ''">
+            and jdr.dispute_content like concat('%',#{disputeRecord.disputeContent},'%')
+        </if>
+        <if test="disputeRecord.nameOne != null and disputeRecord.nameOne != ''">
+            and jdr.name_one like concat('%',#{disputeRecord.nameOne},'%')
+        </if>
+        <if test="disputeRecord.phoneOne != null and disputeRecord.phoneOne != ''">
+            and jdr.phone_one like concat('%',#{disputeRecord.phoneOne},'%')
+        </if>
+        <if test="disputeRecord.idCardOne != null and disputeRecord.idCardOne != ''">
+            and jdr.id_card_one like concat('%',#{disputeRecord.idCardOne},'%')
+        </if>
+        <if test="disputeRecord.nameTwo != null and disputeRecord.nameTwo != ''">
+            and jdr.name_two like concat('%',#{disputeRecord.nameTwo},'%')
+        </if>
+        <if test="disputeRecord.phoneTwo != null and disputeRecord.phoneTwo != ''">
+            and jdr.phone_two like concat('%',#{disputeRecord.phoneOne},'%')
+        </if>
+        <if test="disputeRecord.idCardTwo != null and disputeRecord.idCardTwo != ''">
+            and jdr.id_card_two like concat('%',#{disputeRecord.idCardTwo},'%')
+        </if>
+        <if test="disputeRecord.startTime != null and disputeRecord.startTime != ''">
+            and date_format(jdr.event_time,'%Y-%m-%d') &gt;= #{disputeRecord.startTime}
+        </if>
+        <if test="disputeRecord.endTime != null and disputeRecord.endTime != ''">
+            and date_format(jdr.event_time,'%Y-%m-%d') &lt;= #{disputeRecord.endTime}
+        </if>
+        <if test="disputeRecord.searchKey!=null and disputeRecord.searchKey!=''">
+            and CONCAT(
+            ifnull(jdr.name_one,''),
+            ifnull(jdr.phone_one,''),
+            ifnull(jdr.name_two,''),
+            ifnull(jdr.phone_two,''),
+            ifnull(jdr.address,''),
+            ifnull(jdr.dispute_content,'')
+            ) like CONCAT ('%', #{disputeRecord.searchKey},'%')
+        </if>
+        <if test="isAdministrator==2">
+            <choose>
+                <when test="disputeRecord.roleName != null and disputeRecord.roleName != ''">
+                    <if test="disputeRecord.roleName=='wgy'">
+                        <choose>
+                            <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                and jg.grid_code in
+                                <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jg.grid_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                    <if test="disputeRecord.roleName=='mj'">
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jpag.community_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                </when>
+                <otherwise>
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and
+                            (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jpag.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                        <otherwise>
+                            and
+                            (
+                            jg.grid_code in ('') or jpag.community_code in ('')
+                            )
+                        </otherwise>
+                    </choose>
+                </otherwise>
+            </choose>
+        </if>
+        order by jdr.id desc,jdr.create_time desc
+    </select>
+
+    <!--自定列表分页查询-->
+    <select id="getDetail" resultType="org.springblade.modules.disputeRecord.vo.DisputeRecordVO">
+        select
+        jdr.*,
+        br.town_name as townName,
+        br.name as communityName,
+        jpag.pcs_name pcsName
+        from jczz_dispute_record jdr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jdr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jdr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        where jdr.is_deleted = 0
+        <if test="disputeRecord.id != null">
+            and jdr.id = #{disputeRecord.id}
+        </if>
+        <if test="disputeRecord.disputeType != null">
+            and jdr.dispute_type = #{disputeRecord.disputeType}
+        </if>
+        <if test="disputeRecord.injuryFlag != null">
+            and jdr.injury_flag = #{disputeRecord.injuryFlag}
+        </if>
+        <if test="disputeRecord.source != null">
+            and jdr.source = #{disputeRecord.source}
+        </if>
+        <if test="disputeRecord.handleResult != null">
+            and jdr.handle_result = #{disputeRecord.handleResult}
+        </if>
+        <if test="disputeRecord.townName != null and disputeRecord.townName != ''">
+            and br.town_name like concat('%',#{disputeRecord.townName},'%')
+        </if>
+        <if test="disputeRecord.communityName != null and disputeRecord.communityName != ''">
+            and jbr.name like concat('%',#{disputeRecord.communityName},'%')
+        </if>
+        <if test="disputeRecord.pcsName != null and disputeRecord.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{disputeRecord.pcsName},'%')
+        </if>
+        <if test="disputeRecord.address != null and disputeRecord.address != ''">
+            and jdr.address like concat('%',#{disputeRecord.address},'%')
+        </if>
+        <if test="disputeRecord.disputeContent != null and disputeRecord.disputeContent != ''">
+            and jdr.dispute_content like concat('%',#{disputeRecord.disputeContent},'%')
+        </if>
+        <if test="disputeRecord.nameOne != null and disputeRecord.nameOne != ''">
+            and jdr.name_one like concat('%',#{disputeRecord.nameOne},'%')
+        </if>
+        <if test="disputeRecord.phoneOne != null and disputeRecord.phoneOne != ''">
+            and jdr.phone_one like concat('%',#{disputeRecord.phoneOne},'%')
+        </if>
+        <if test="disputeRecord.idCardOne != null and disputeRecord.idCardOne != ''">
+            and jdr.id_card_one like concat('%',#{disputeRecord.idCardOne},'%')
+        </if>
+        <if test="disputeRecord.nameTwo != null and disputeRecord.nameTwo != ''">
+            and jdr.name_two like concat('%',#{disputeRecord.nameTwo},'%')
+        </if>
+        <if test="disputeRecord.phoneTwo != null and disputeRecord.phoneTwo != ''">
+            and jdr.phone_two like concat('%',#{disputeRecord.phoneOne},'%')
+        </if>
+        <if test="disputeRecord.idCardTwo != null and disputeRecord.idCardTwo != ''">
+            and jdr.id_card_two like concat('%',#{disputeRecord.idCardTwo},'%')
+        </if>
+    </select>
+
+    <!--导出矛盾纠纷记录表-->
+    <select id="exportDisputeRecordList" resultType="org.springblade.modules.disputeRecord.excel.ExportDisputeRecordExcel">
+        select
+        jdr.address,
+        jdr.event_time,
+        jdr.name_one,
+        case when jdr.gender_one =1 then '男'
+        when jdr.gender_one=2 then '女'
+        end as gender_one,
+        jdr.phone_one,
+        jdr.id_card_one,
+        jdr.name_two,
+        case when jdr.gender_two =1 then '男'
+        when jdr.gender_two=2 then '女'
+        end as gender_two,
+        jdr.phone_two,
+        jdr.id_card_two,
+        jdr.dispute_type,
+        jdr.dispute_content,
+        case when jdr.injury_flag=1 then '是'
+        when jdr.injury_flag=0 then '否'
+        end as injury_flag,
+        jdr.injury_desc,
+        jdr.alarm_num,
+        jdr.source,
+        case when jdr.handle_result=1 then '已化解'
+        when jdr.handle_result=2 then '未化解'
+        when jdr.handle_result=3 then '移送e呼即办'
+        end as handle_result,
+        br.town_name as townName,
+        br.name as communityName,
+        jpag.pcs_name pcsName
+        from jczz_dispute_record jdr
+        LEFT JOIN jczz_grid jg on jg.grid_code = jdr.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jdr.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        where jdr.is_deleted = 0
+        <if test="disputeRecord.disputeType != null">
+            and jdr.dispute_type = #{disputeRecord.disputeType}
+        </if>
+        <if test="disputeRecord.injuryFlag != null">
+            and jdr.injury_flag = #{disputeRecord.injuryFlag}
+        </if>
+        <if test="disputeRecord.source != null">
+            and jdr.source = #{disputeRecord.source}
+        </if>
+        <if test="disputeRecord.townName != null and disputeRecord.townName != ''">
+            and br.town_name like concat('%',#{disputeRecord.townName},'%')
+        </if>
+        <if test="disputeRecord.communityName != null and disputeRecord.communityName != ''">
+            and jbr.name like concat('%',#{disputeRecord.communityName},'%')
+        </if>
+        <if test="disputeRecord.pcsName != null and disputeRecord.pcsName != ''">
+            and jpag.pcs_name like concat('%',#{disputeRecord.pcsName},'%')
+        </if>
+        <if test="disputeRecord.address != null and disputeRecord.address != ''">
+            and jdr.address like concat('%',#{disputeRecord.address},'%')
+        </if>
+        <if test="disputeRecord.disputeContent != null and disputeRecord.disputeContent != ''">
+            and jdr.dispute_content like concat('%',#{disputeRecord.disputeContent},'%')
+        </if>
+        <if test="disputeRecord.nameOne != null and disputeRecord.nameOne != ''">
+            and jdr.name_one like concat('%',#{disputeRecord.nameOne},'%')
+        </if>
+        <if test="disputeRecord.phoneOne != null and disputeRecord.phoneOne != ''">
+            and jdr.phone_one like concat('%',#{disputeRecord.phoneOne},'%')
+        </if>
+        <if test="disputeRecord.idCardOne != null and disputeRecord.idCardOne != ''">
+            and jdr.id_card_one like concat('%',#{disputeRecord.idCardOne},'%')
+        </if>
+        <if test="disputeRecord.nameTwo != null and disputeRecord.nameTwo != ''">
+            and jdr.name_two like concat('%',#{disputeRecord.nameTwo},'%')
+        </if>
+        <if test="disputeRecord.phoneTwo != null and disputeRecord.phoneTwo != ''">
+            and jdr.phone_two like concat('%',#{disputeRecord.phoneOne},'%')
+        </if>
+        <if test="disputeRecord.idCardTwo != null and disputeRecord.idCardTwo != ''">
+            and jdr.id_card_two like concat('%',#{disputeRecord.idCardTwo},'%')
+        </if>
+        <if test="disputeRecord.startTime != null and disputeRecord.startTime != ''">
+            and date_format(jdr.event_time,'%Y-%m-%d') &gt;= #{disputeRecord.startTime}
+        </if>
+        <if test="disputeRecord.endTime != null and disputeRecord.endTime != ''">
+            and date_format(jdr.event_time,'%Y-%m-%d') &lt;= #{disputeRecord.endTime}
+        </if>
+        <if test="disputeRecord.searchKey!=null and disputeRecord.searchKey!=''">
+            and CONCAT(
+            ifnull(jdr.name_one,''),
+            ifnull(jdr.phone_one,''),
+            ifnull(jdr.name_two,''),
+            ifnull(jdr.phone_two,''),
+            ifnull(jdr.address,''),
+            ifnull(jdr.dispute_content,'')
+            ) like CONCAT ('%', #{disputeRecord.searchKey},'%')
+        </if>
+        <if test="isAdministrator==2">
+            <choose>
+                <when test="disputeRecord.roleName != null and disputeRecord.roleName != ''">
+                    <if test="disputeRecord.roleName=='wgy'">
+                        <choose>
+                            <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                and jg.grid_code in
+                                <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jg.grid_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                    <if test="disputeRecord.roleName=='mj'">
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                            </when>
+                            <otherwise>
+                                and jpag.community_code in ('')
+                            </otherwise>
+                        </choose>
+                    </if>
+                </when>
+                <otherwise>
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and
+                            (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jpag.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                        <otherwise>
+                            and
+                            (
+                            jg.grid_code in ('') or jpag.community_code in ('')
+                            )
+                        </otherwise>
+                    </choose>
+                </otherwise>
+            </choose>
+        </if>
+        order by jdr.id desc,jdr.create_time desc
+    </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/disputeRecord/service/IDisputeRecordService.java b/src/main/java/org/springblade/modules/disputeRecord/service/IDisputeRecordService.java
new file mode 100644
index 0000000..1428a82
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/service/IDisputeRecordService.java
@@ -0,0 +1,61 @@
+package org.springblade.modules.disputeRecord.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import org.springblade.modules.disputeRecord.excel.DisputeRecordExcel;
+import org.springblade.modules.disputeRecord.excel.ExportDisputeRecordExcel;
+import org.springblade.modules.disputeRecord.vo.DisputeRecordVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 矛盾纠纷记录表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public interface IDisputeRecordService extends IService<DisputeRecordEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param disputeRecord
+	 * @return
+	 */
+	IPage<DisputeRecordVO> selectDisputeRecordPage(IPage<DisputeRecordVO> page, DisputeRecordVO disputeRecord);
+
+
+	/**
+	 * 矛盾纠纷记录表 自定义新增或修改
+	 * @param disputeRecord
+	 * @return
+	 */
+	boolean saveOrUpdateDisputeRecord(DisputeRecordEntity disputeRecord);
+
+	/**
+	 * 矛盾纠纷记录表 自定义详情
+	 * @param disputeRecord
+	 * @return
+	 */
+	DisputeRecordVO getDetail(DisputeRecordVO disputeRecord);
+
+	/**
+	 * 矛盾纠纷事件数据导入类
+	 * @author Chill
+	 */
+	String importDisputeRecord(List<DisputeRecordExcel> data, Boolean isCovered);
+
+	/**
+	 * 导出矛盾纠纷记录表
+	 * @param disputeRecord
+	 * @return
+	 */
+	List<ExportDisputeRecordExcel> exportDisputeRecordList(DisputeRecordVO disputeRecord);
+
+	/**
+	 * e呼即办数据临时转换到矛盾纠纷
+	 */
+    void eCallToDis();
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/service/impl/DisputeRecordServiceImpl.java b/src/main/java/org/springblade/modules/disputeRecord/service/impl/DisputeRecordServiceImpl.java
new file mode 100644
index 0000000..47c54d5
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/service/impl/DisputeRecordServiceImpl.java
@@ -0,0 +1,255 @@
+package org.springblade.modules.disputeRecord.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.logging.log4j.util.Strings;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.param.GridSet;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.backblast.entity.BackblastWarnHanRecEntity;
+import org.springblade.modules.community.dto.CommunityDTO;
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import org.springblade.modules.disputeRecord.excel.DisputeRecordExcel;
+import org.springblade.modules.disputeRecord.excel.ExportDisputeRecordExcel;
+import org.springblade.modules.disputeRecord.vo.DisputeRecordVO;
+import org.springblade.modules.disputeRecord.mapper.DisputeRecordMapper;
+import org.springblade.modules.disputeRecord.service.IDisputeRecordService;
+import org.springblade.modules.system.entity.DictBiz;
+import org.springblade.modules.system.service.IDictBizService;
+import org.springblade.modules.task.entity.ECallEventEntity;
+import org.springblade.modules.task.service.IECallEventService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 矛盾纠纷记录表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Service
+public class DisputeRecordServiceImpl extends ServiceImpl<DisputeRecordMapper, DisputeRecordEntity> implements IDisputeRecordService {
+
+	@Override
+	public IPage<DisputeRecordVO> selectDisputeRecordPage(IPage<DisputeRecordVO> page, DisputeRecordVO disputeRecord) {
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(DisputeRecordVO.class, disputeRecord);
+		return page.setRecords(
+			baseMapper.selectDisputeRecordPage(page,
+			disputeRecord,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList())
+		);
+	}
+
+	/**
+	 * 矛盾纠纷记录表 自定义新增或修改
+	 * @param disputeRecord
+	 * @return
+	 */
+	@Override
+	public boolean saveOrUpdateDisputeRecord(DisputeRecordEntity disputeRecord) {
+		// 点落面计算警格,网格,警格
+		GridSet invoke = new GridSet().invoke(DisputeRecordEntity.class, disputeRecord,
+			"lng", "lat", "gridCode", "jwGridCode");
+		if (null!=disputeRecord.getId()){
+			// 更新
+			return updateById(disputeRecord);
+		}
+		// 新增
+		return save(disputeRecord);
+	}
+
+	/**
+	 * 矛盾纠纷记录表 自定义详情
+	 * @param disputeRecord
+	 * @return
+	 */
+	@Override
+	public DisputeRecordVO getDetail(DisputeRecordVO disputeRecord) {
+		return baseMapper.getDetail(disputeRecord);
+	}
+
+	/**
+	 * 矛盾纠纷事件数据导入类
+	 * @param data
+	 * @param isCovered
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public String importDisputeRecord(List<DisputeRecordExcel> data, Boolean isCovered) {
+		int totalNum = data.size();
+		int importNum = 0;
+		int updateNum = 0;
+		int errorNum = 0;
+		for (DisputeRecordExcel disputeRecordExcel : data) {
+			// 判断地址,时间
+			if (Strings.isBlank(disputeRecordExcel.getAddress())
+			) {
+				errorNum++;
+				continue;
+			}
+			// 获取转换数据对象
+			DisputeRecordEntity disputeRecordEntity
+				= Objects.requireNonNull(BeanUtil.copy(disputeRecordExcel, DisputeRecordEntity.class));
+			//处理经纬度
+			GridSet gridSet
+				= new GridSet<>().invoke(DisputeRecordEntity.class, disputeRecordEntity, "lng", "lat", "gridCode", "jwGridCode");
+			//处理需要转换的数据(字典/非字典)
+			// 纠纷类型
+			if (!Strings.isBlank(disputeRecordExcel.getDisputeType())) {
+				disputeRecordEntity.setDisputeType(Integer.parseInt(disputeRecordExcel.getDisputeType()));
+			}
+			// 信息来源
+			if (!Strings.isBlank(disputeRecordExcel.getSource())) {
+				disputeRecordEntity.setSource(Integer.parseInt(disputeRecordExcel.getSource()));
+			}
+			// 受伤情况 0:否 1:是
+			if (!Strings.isBlank(disputeRecordExcel.getInjuryFlag())) {
+				if (disputeRecordExcel.getInjuryFlag().equals("是")){
+					disputeRecordEntity.setInjuryFlag(1);
+				}
+				if (disputeRecordExcel.getInjuryFlag().equals("否")){
+					disputeRecordEntity.setInjuryFlag(0);
+				}
+			}
+			// 当事人1性别 1:男 2:女
+			if (!Strings.isBlank(disputeRecordExcel.getGenderOne())) {
+				if (disputeRecordExcel.getGenderOne().contains("男")){
+					disputeRecordEntity.setGenderOne(1);
+				}
+				if (disputeRecordExcel.getGenderOne().contains("女")){
+					disputeRecordEntity.setGenderOne(2);
+				}
+			}
+			// 当事人2性别 1:男 2:女
+			if (!Strings.isBlank(disputeRecordExcel.getGenderTwo())) {
+				if (disputeRecordExcel.getGenderTwo().contains("男")){
+					disputeRecordEntity.setGenderTwo(1);
+				}
+				if (disputeRecordExcel.getGenderTwo().contains("女")){
+					disputeRecordEntity.setGenderTwo(2);
+				}
+			}
+			// 处理结果 1:已化解 2:未化解 3:移送e呼即办
+			if (!Strings.isBlank(disputeRecordExcel.getHandleResult())) {
+				if (disputeRecordExcel.getHandleResult().equals("已化解")) {
+					disputeRecordEntity.setHandleResult(1);
+				}
+				if (disputeRecordExcel.getHandleResult().equals("未化解")) {
+					disputeRecordEntity.setHandleResult(2);
+				}
+				if (disputeRecordExcel.getHandleResult().equals("移送e呼即办")) {
+					disputeRecordEntity.setHandleResult(3);
+				}
+			}
+			// 日期处理
+			if (!Strings.isBlank(disputeRecordExcel.getEventTime())) {
+				try {
+					Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(disputeRecordExcel.getEventTime());
+					disputeRecordEntity.setEventTime(date);
+				} catch (ParseException e) {
+					e.printStackTrace();
+				}
+			}
+			// 判断是否重复
+			QueryWrapper<DisputeRecordEntity> queryWrapper = new QueryWrapper<>();
+			queryWrapper.eq("address", disputeRecordExcel.getAddress())
+				.eq("event_time", disputeRecordEntity.getEventTime())
+				.eq("is_deleted", 0);
+			// 查询
+			List<DisputeRecordEntity> list = list(queryWrapper);
+			if (list.size()>0){
+				updateNum++;
+				if (isCovered) {
+					// 更新
+					disputeRecordEntity.setId(list.get(0).getId());
+					// 更新
+					updateById(disputeRecordEntity);
+					importNum++;
+				}
+			}else {
+				// 插入
+				save(disputeRecordEntity);
+				importNum ++;
+			}
+		}
+		StringBuilder builder = new StringBuilder("导入完成!");
+		builder.append("其中本次表格共有 ").append(totalNum).append(" 条数据,")
+			.append("成功导入 ").append(importNum).append(" 条数据。");
+		if (updateNum>0) {
+			builder.append("其中有 ").append(updateNum).append(" 条数据已存在。");
+		}
+		if (errorNum>0){
+			builder.append("共有 ").append(errorNum).append(" 条数据由于无地址信息未导入!");
+		}
+		return builder.toString();
+	}
+
+	/**
+	 * 导出矛盾纠纷记录表
+	 * @param disputeRecord
+	 * @return
+	 */
+	@Override
+	public List<ExportDisputeRecordExcel> exportDisputeRecordList(DisputeRecordVO disputeRecord) {
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(DisputeRecordVO.class, disputeRecord);
+		return baseMapper.exportDisputeRecordList(
+				disputeRecord,
+				commonParamSet.getIsAdministrator(),
+				commonParamSet.getRegionChildCodesList(),
+				commonParamSet.getGridCodeList());
+	}
+
+	/**
+	 * e呼即办数据临时转换到矛盾纠纷
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void eCallToDis() {
+		// 查询所有的e 呼即办数据
+		IECallEventService callEventService = SpringUtils.getBean(IECallEventService.class);
+		IDictBizService dictBizService = SpringUtils.getBean(IDictBizService.class);
+		// 查询所有
+		QueryWrapper<ECallEventEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("is_deleted",0);
+		List<ECallEventEntity> eCallEventEntityList = callEventService.list(queryWrapper);
+		// 遍历处理
+		for (ECallEventEntity eCallEventEntity : eCallEventEntityList) {
+			if (eCallEventEntity.getName().contains("纠纷")) {
+				DisputeRecordEntity disputeRecordEntity = new DisputeRecordEntity();
+				disputeRecordEntity.setAddress(eCallEventEntity.getAddress());
+				disputeRecordEntity.setLng(eCallEventEntity.getLng());
+				disputeRecordEntity.setLat(eCallEventEntity.getLat());
+				disputeRecordEntity.setEventTime(eCallEventEntity.getOccurrenceTime());
+				disputeRecordEntity.setDisputeContent(eCallEventEntity.getRemark());
+				disputeRecordEntity.setAddress(eCallEventEntity.getAddress());
+				// 设置处置结果,暂时放在受伤结果里面
+				disputeRecordEntity.setInjuryDesc(eCallEventEntity.getDisRes());
+				// 设置网格,警格编号
+				GridSet gridSet
+					= new GridSet().invoke(DisputeRecordEntity.class, disputeRecordEntity, "lng", "lat", "gridCode", "jwGridCode");
+				// 纠纷类型转换
+				QueryWrapper<DictBiz> wrapper = new QueryWrapper<>();
+				wrapper.eq("code", "disputeType").eq("is_deleted", 0).eq("dict_value", eCallEventEntity.getName());
+				DictBiz one = dictBizService.getOne(wrapper);
+				if (null!=one){
+					disputeRecordEntity.setDisputeType(Integer.parseInt(one.getDictKey()));
+				}else {
+					// 设置为其他纠纷
+					disputeRecordEntity.setDisputeType(8);
+				}
+				// 保存
+				save(disputeRecordEntity);
+			}
+		}
+	}
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/vo/DisputeRecordVO.java b/src/main/java/org/springblade/modules/disputeRecord/vo/DisputeRecordVO.java
new file mode 100644
index 0000000..7f0cbfe
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/vo/DisputeRecordVO.java
@@ -0,0 +1,79 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.disputeRecord.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 矛盾纠纷记录表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DisputeRecordVO extends DisputeRecordEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+
+
+	@ApiModelProperty(value = "角色别名", example = "")
+	private String roleName;
+
+	/**
+	 * 搜索关键字
+	 */
+	@ApiModelProperty(value = "搜索关键字", example = "")
+	private String searchKey;
+
+	/**
+	 * 开始时间
+	 */
+	@ApiModelProperty(value = "开始时间", example = "")
+	private String startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@ApiModelProperty(value = "结束时间", example = "")
+	private String endTime;
+
+	/**
+	 * 乡镇名称
+	 */
+	@ApiModelProperty(value = "乡镇名称", example = "")
+	private String townName;
+
+	/**
+	 * 社区名称
+	 */
+	@ApiModelProperty(value = "社区名称", example = "")
+	private String communityName;
+
+	/**
+	 * 派出所名称
+	 */
+	@ApiModelProperty(value = "派出所名称", example = "")
+	private String pcsName;
+
+}
diff --git a/src/main/java/org/springblade/modules/disputeRecord/wrapper/DisputeRecordWrapper.java b/src/main/java/org/springblade/modules/disputeRecord/wrapper/DisputeRecordWrapper.java
new file mode 100644
index 0000000..6e26c08
--- /dev/null
+++ b/src/main/java/org/springblade/modules/disputeRecord/wrapper/DisputeRecordWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.disputeRecord.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.disputeRecord.entity.DisputeRecordEntity;
+import org.springblade.modules.disputeRecord.vo.DisputeRecordVO;
+import java.util.Objects;
+
+/**
+ * 矛盾纠纷记录表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-23
+ */
+public class DisputeRecordWrapper extends BaseEntityWrapper<DisputeRecordEntity, DisputeRecordVO>  {
+
+	public static DisputeRecordWrapper build() {
+		return new DisputeRecordWrapper();
+ 	}
+
+	@Override
+	public DisputeRecordVO entityVO(DisputeRecordEntity disputeRecord) {
+		DisputeRecordVO disputeRecordVO = Objects.requireNonNull(BeanUtil.copy(disputeRecord, DisputeRecordVO.class));
+
+		//User createUser = UserCache.getUser(disputeRecord.getCreateUser());
+		//User updateUser = UserCache.getUser(disputeRecord.getUpdateUser());
+		//disputeRecordVO.setCreateUserName(createUser.getName());
+		//disputeRecordVO.setUpdateUserName(updateUser.getName());
+
+		return disputeRecordVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/doorplateAddress/excel/ImportDoorplateExcel.java b/src/main/java/org/springblade/modules/doorplateAddress/excel/ImportDoorplateExcel.java
new file mode 100644
index 0000000..743726e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/doorplateAddress/excel/ImportDoorplateExcel.java
@@ -0,0 +1,272 @@
+package org.springblade.modules.doorplateAddress.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * ImportHouseHoldExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ImportDoorplateExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+
+
+	/**
+	 * 地址名称
+	 */
+	@ExcelProperty(value = "地址名称")
+	private String addressName;
+
+	/**
+	 * 门牌地址编码
+	 */
+	@ExcelProperty(value = "门牌地址编码")
+	private String addressCode;
+
+	/**
+	 * 经度
+	 */
+	@ExcelProperty(value = "经度")
+	private String X;
+	/**
+	 * 纬度
+	 */
+	@ExcelProperty(value = "纬度")
+	private String Y;
+
+	/**
+	 * x84经度
+	 */
+	@ExcelProperty(value = "x84经度")
+	@TableField("x_84")
+	private String x84;
+	/**
+	 * y84纬度
+	 */
+	@ExcelProperty(value = "y84纬度")
+	@TableField("y_84")
+	private String y84;
+	/**
+	 * 行政区编码
+	 */
+	@ExcelProperty(value = "行政区编码")
+	private String regionCode;
+	/**
+	 * 行政区名称
+	 */
+	@ExcelProperty(value = "行政区名称")
+	private String regionName;
+	/**
+	 * 乡镇街道编号
+	 */
+	@ExcelProperty(value = "乡镇街道编号")
+	@TableField("town_street_code")
+	private String townStreetCode;
+	/**
+	 * 乡镇街道名称
+	 */
+	@ExcelProperty(value = "乡镇街道名称")
+	private String townStreetName;
+	/**
+	 * 居委会(社区)编号
+	 */
+	@ExcelProperty(value = "居委会(社区)编号")
+	private String neiCode;
+	/**
+	 * 居委会(社区)名称
+	 */
+	@ExcelProperty(value = "居委会(社区)名称")
+	private String neiName;
+	/**
+	 * 街路巷编码
+	 */
+	@ExcelProperty(value = "街路巷编码")
+	private String streetRuCode;
+	/**
+	 * 街路巷名称
+	 */
+	@ExcelProperty(value = "街路巷名称")
+	private String streetRuName;
+	/**
+	 * 分局代码
+	 */
+	@ExcelProperty(value = "分局代码")
+	private String branchCode;
+	/**
+	 * 分局名称
+	 */
+	@ExcelProperty(value = "分局名称")
+	private String branchName;
+	/**
+	 * 派出所代码
+	 */
+	@ExcelProperty(value = "派出所代码")
+	private String localPoliceStationCode;
+	/**
+	 * 派出所名称
+	 */
+	@ExcelProperty(value = "派出所名称")
+	private String localPoliceStationName;
+	/**
+	 * 警务室代码
+	 */
+	@ExcelProperty(value = "警务室代码")
+	private String policeAffairsCode;
+	/**
+	 * 警务室名称
+	 */
+	@ExcelProperty(value = "警务室名称")
+	private String policeAffairsName;
+	/**
+	 * 单元编码
+	 */
+	@ExcelProperty(value = "单元编码")
+	private String unitCode;
+	/**
+	 * 单元号(名称)
+	 */
+	@ExcelProperty(value = "单元号(名称)")
+	private String unitName;
+	/**
+	 * 楼栋编码
+	 */
+	@ExcelProperty(value = "楼栋编码")
+	private String buildingCode;
+	/**
+	 * 楼栋号(名称)
+	 */
+	@ExcelProperty(value = "楼栋号(名称)")
+	private String buildingName;
+	/**
+	 * 户室号(名称)
+	 */
+	@ExcelProperty(value = "户室号(名称)")
+	private String houseName;
+	/**
+	 * 楼层
+	 */
+	@ExcelProperty(value = "楼层")
+	private String floor;
+	/**
+	 * 小区编码
+	 */
+	@ExcelProperty(value = "小区编码")
+	private String aoiCode;
+	/**
+	 * 小区名称
+	 */
+	@ExcelProperty(value = "小区名称")
+	private String aoiName;
+	/**
+	 * 兴趣点code
+	 */
+	@ExcelProperty(value = "兴趣点code")
+	private String poiCode;
+	/**
+	 * 兴趣点名称
+	 */
+	@ExcelProperty(value = "兴趣点名称")
+	private String poi;
+	/**
+	 * 地址级别
+	 */
+	@ExcelProperty(value = "地址级别")
+	private Integer addressLevel;
+	/**
+	 * 父节点地址编码
+	 */
+	@ExcelProperty(value = "父节点地址编码")
+	private String parentAddressCode;
+	/**
+	 * 采集照片url
+	 */
+	@ExcelProperty(value = "采集照片url")
+	private String gatPicUrl;
+	/**
+	 * 门牌状态
+	 */
+	@ExcelProperty(value = "门牌状态")
+	private String doorplateStatus;
+	/**
+	 * 门牌类型
+	 */
+	@ExcelProperty(value = "门牌类型")
+	private String doorplateType;
+	/**
+	 * 门牌类型编号
+	 */
+	@ExcelProperty(value = "门牌类型编号")
+	private String doorplateTypeCode;
+	/**
+	 * 门牌号
+	 */
+	@ExcelProperty(value = "门牌号")
+	private String doorplateNum;
+	/**
+	 * 门牌名称
+	 */
+	@ExcelProperty(value = "门牌名称")
+	private String doorplateName;
+	/**
+	 * 二维码路径
+	 */
+	@ExcelProperty(value = "二维码路径")
+	private String qrCodePath;
+
+	/**
+	 * 子门牌号
+	 */
+	@ExcelProperty(value = "子门牌号")
+	private String subDoorPlateNo;
+
+	/**
+	 * 大门名称
+	 */
+	@ExcelProperty(value = "大门名称")
+	private String gateName;
+	/**
+	 * 操作类型
+	 */
+	@ExcelProperty(value = "操作类型")
+	private Integer operationType;
+	/**
+	 * 地址类型
+	 */
+	@ExcelProperty(value = "地址类型")
+	private Integer addressType;
+	/**
+	 * 子小区名称
+	 */
+	@ExcelProperty(value = "子小区名称")
+	private String subAoi;
+	/**
+	 * 民警姓名
+	 */
+	@ExcelProperty(value = "民警姓名")
+	private String policeman;
+	/**
+	 * 民警电话
+	 */
+	@ExcelProperty(value = "民警电话")
+	private String policemanPhone;
+	/**
+	 * 警务网格编码
+	 */
+	@ExcelProperty(value = "警务网格编码")
+	private String jwwgCode;
+
+}
+
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/controller/ECallEventTwoController.java b/src/main/java/org/springblade/modules/eCallEventTwo/controller/ECallEventTwoController.java
new file mode 100644
index 0000000..2331292
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/controller/ECallEventTwoController.java
@@ -0,0 +1,212 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.eCallEventTwo.dto.EcOrderDTO;
+import org.springblade.modules.eCallEventTwo.dto.EcOrderParamDTO;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.service.EcOrderService;
+import org.springblade.modules.eCallEventTwo.service.IECallEventTwoService;
+import org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO;
+import org.springblade.modules.eCallEventTwo.wrapper.ECallEventTwoWrapper;
+import org.springblade.modules.task.entity.ECallEventEntity;
+import org.springblade.modules.task.service.IECallEventService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 工单 控制器
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-eCallEventTwo/eCallEventTwo")
+@Api(value = "工单", tags = "工单接口")
+public class ECallEventTwoController extends BladeController {
+
+	private final IECallEventTwoService eCallEventTwoService;
+
+	private final EcOrderService ecOrderService;
+
+	/**
+	 * 工单 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入eCallEventTwo")
+	public R<ECallEventTwoVO> detail(ECallEventTwoEntity eCallEventTwo) {
+		ECallEventTwoEntity detail = eCallEventTwoService.getOne(Condition.getQueryWrapper(eCallEventTwo));
+		return R.data(ECallEventTwoWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 工单 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入eCallEventTwo")
+	public R<IPage<ECallEventTwoVO>> list(ECallEventTwoEntity eCallEventTwo, Query query) {
+		IPage<ECallEventTwoEntity> pages = eCallEventTwoService.page(Condition.getPage(query), Condition.getQueryWrapper(eCallEventTwo));
+		return R.data(ECallEventTwoWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 工单 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入eCallEventTwo")
+	public R<IPage<ECallEventTwoVO>> page(ECallEventTwoVO eCallEventTwo, Query query) {
+		IPage<ECallEventTwoVO> pages = eCallEventTwoService.selectECallEventTwoPage(Condition.getPage(query), eCallEventTwo);
+		return R.data(pages);
+	}
+
+	/**
+	 * 工单 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入eCallEventTwo")
+	public R save(@Valid @RequestBody ECallEventTwoVO eCallEventTwo) {
+		eCallEventTwo.setCreateUserId(AuthUtil.getUserId());
+		return R.status(eCallEventTwoService.saveTwo(eCallEventTwo));
+	}
+
+	/**
+	 * 工单 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入eCallEventTwo")
+	public R update(@Valid @RequestBody ECallEventTwoEntity eCallEventTwo) {
+		return R.status(eCallEventTwoService.updateById(eCallEventTwo));
+	}
+
+	/**
+	 * 工单 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入eCallEventTwo")
+	public R submit(@Valid @RequestBody ECallEventTwoVO eCallEventTwo) {
+		return R.status(eCallEventTwoService.saveTwo(eCallEventTwo));
+	}
+
+	/**
+	 * 工单 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(eCallEventTwoService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+	/**
+	 * 工单 同步
+	 */
+	@GetMapping("/synchronizeData")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "工单 同步")
+	public R synchronizeData() {
+		// 创建居住证发送短信定时任务
+		EcOrderParamDTO ecOrderParamDTO = new EcOrderParamDTO();
+		// 获取当前日期时间
+		// LocalDateTime now = LocalDateTime.now();
+		// 获取前一天的开始时间
+		// LocalDateTime yesterdayStart = now.minus(1, ChronoUnit.DAYS).with(LocalTime.MIN);
+		// 获取前一天的结束时间
+		// LocalDateTime yesterdayEnd = now.minus(1, ChronoUnit.DAYS).with(LocalTime.MAX);
+		// ecOrderParamDTO.setEndTime(yesterdayEnd.format(DateUtil.DATETIME_FORMATTER));
+		// ecOrderParamDTO.setStartTime(yesterdayStart.format(DateUtil.DATETIME_FORMATTER));
+		boolean b = ecOrderService.SynchronizeData(ecOrderParamDTO);
+		return R.status(b);
+	}
+
+
+	/**
+	 * 工单 同步
+	 */
+	@GetMapping("/getCount")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "工单统计")
+	public R getCount( EcOrderParamDTO ecOrderParamDTO, Query query) {
+		IPage<EcOrderDTO> pages = ecOrderService.getCount(Condition.getPage(query),ecOrderParamDTO);
+		return  R.data(pages);
+	}
+
+
+	/**
+	 * 工单 同步
+	 */
+	@GetMapping("/getUnitAssessmentIndicators")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "单位考核指标")
+	public R getUnitAssessmentIndicators( ) {
+		List<Map<String, String>> count = ecOrderService.getUnitAssessmentIndicators();
+		return R.data(count);
+	}
+
+	@GetMapping("/synchronousData")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "E呼基本信息入录同步到新E呼即办")
+	public void synchronousData() {
+		IECallEventService bean = SpringUtils.getBean(IECallEventService.class);
+		List<ECallEventEntity> list = bean.list(Wrappers.<ECallEventEntity>lambdaQuery().eq(ECallEventEntity::getIsDeleted, 0));
+		for (ECallEventEntity eCallEventEntity : list) {
+			long count = eCallEventTwoService.count(Wrappers.<ECallEventTwoEntity>lambdaQuery()
+				.eq(ECallEventTwoEntity::getOrderId, eCallEventEntity.getId()));
+			if (count > 0) {
+				continue;
+			}
+			ECallEventTwoEntity eCallEventTwoEntity = new ECallEventTwoEntity();
+			eCallEventTwoEntity.setLocation(eCallEventEntity.getLocation());
+			eCallEventTwoEntity.setSceneGeoLat(new BigDecimal(eCallEventEntity.getLat()));
+			eCallEventTwoEntity.setSceneGeoLng(new BigDecimal(eCallEventEntity.getLng()));
+			eCallEventTwoEntity.setIssueContent(eCallEventEntity.getRemark());
+			eCallEventTwoEntity.setIssueTitle(eCallEventEntity.getName());
+			eCallEventTwoEntity.setApplicantPhone(eCallEventEntity.getPhone());
+			eCallEventTwoEntity.setApplicantName(eCallEventEntity.getRealName());
+			eCallEventTwoEntity.setCreateTime(eCallEventEntity.getCreateTime());
+			eCallEventTwoEntity.setStatus("3");
+			eCallEventTwoEntity.setIssueOrigin("0");
+			eCallEventTwoEntity.setOrderId(eCallEventEntity.getId());
+			eCallEventTwoService.save(eCallEventTwoEntity);
+		}
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/ECallEventTwoDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/ECallEventTwoDTO.java
new file mode 100644
index 0000000..d664a05
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/ECallEventTwoDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.dto;
+
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 工单 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ECallEventTwoDTO extends ECallEventTwoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcDispatchDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcDispatchDTO.java
new file mode 100644
index 0000000..40ed73b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcDispatchDTO.java
@@ -0,0 +1,32 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcDispatch;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 派发单对象 ec_dispatch
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcDispatchDTO对象")
+@Data
+public class EcDispatchDTO extends EcDispatch {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcHandleDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcHandleDTO.java
new file mode 100644
index 0000000..54ab83b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcHandleDTO.java
@@ -0,0 +1,48 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcHandle;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 办理单对象 ec_handle
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcHandleDTO对象")
+@Data
+public class EcHandleDTO extends EcHandle {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderCheckDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderCheckDTO.java
new file mode 100644
index 0000000..130104c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderCheckDTO.java
@@ -0,0 +1,47 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcOrderCheck;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 回访单对象 ec_order_check
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderCheckDTO对象")
+@Data
+public class EcOrderCheckDTO extends EcOrderCheck {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDTO.java
new file mode 100644
index 0000000..50f83b9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDTO.java
@@ -0,0 +1,64 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcOrder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 工单对象 ec_order
+ *
+ * @author ${context.author}
+ * @date 2024-05-27 16:26:59
+ */
+@ApiModel(value = "EcOrderDTO对象")
+@Data
+public class EcOrderDTO extends EcOrder {
+
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+
+
+	private String orderNumber;
+	private String dispatchRate;
+	private String dispatchNumber;
+	private String handRate;
+	private String checkRate;
+	private String doneRate;
+	private String respRate;
+	private String reviewRate;
+	private String superviseNumber;
+
+	private String orgCode;
+	private String orgName;
+
+
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDoneDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDoneDTO.java
new file mode 100644
index 0000000..b7b5028
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderDoneDTO.java
@@ -0,0 +1,47 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcOrderDone;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 办结单对象 ec_order_done
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderDoneDTO对象")
+@Data
+public class EcOrderDoneDTO extends EcOrderDone {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderParamDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderParamDTO.java
new file mode 100644
index 0000000..496325d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderParamDTO.java
@@ -0,0 +1,42 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+@ApiModel(value = "EcOrderParamDTO参数")
+@Data
+public class EcOrderParamDTO {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private String startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private String endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+
+	@ApiModelProperty(value = "是否主办(1/2)", example = "")
+	private Integer mainFlag;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderRespDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderRespDTO.java
new file mode 100644
index 0000000..2c36bfc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderRespDTO.java
@@ -0,0 +1,47 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcOrderResp;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 答复单对象 ec_order_resp
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderRespDTO对象")
+@Data
+public class EcOrderRespDTO extends EcOrderResp {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderReviewDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderReviewDTO.java
new file mode 100644
index 0000000..e61af2c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderReviewDTO.java
@@ -0,0 +1,47 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcOrderReview;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 核实单对象 ec_order_review
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderReviewDTO对象")
+@Data
+public class EcOrderReviewDTO extends EcOrderReview {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderSuperviseDTO.java b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderSuperviseDTO.java
new file mode 100644
index 0000000..7005bda
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/dto/EcOrderSuperviseDTO.java
@@ -0,0 +1,47 @@
+package org.springblade.modules.eCallEventTwo.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.modules.eCallEventTwo.entity.EcOrderSupervise;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * 督办单对象 ec_order_supervise
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderSuperviseDTO对象")
+@Data
+public class EcOrderSuperviseDTO extends EcOrderSupervise {
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+
+	@ApiModelProperty(value = "调度单位", example = "")
+	private String subjectOrgCode;
+
+	@ApiModelProperty(value = "调度单位名称", example = "")
+	private String subjectOrgName;
+
+	@ApiModelProperty(value = "主办单位", example = "")
+	private String sinkOrgCode;
+
+	@ApiModelProperty(value = "主办单位名称", example = "")
+	private String sinkOrgName;
+
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	private String tagMain;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/ECallEventTwoEntity.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/ECallEventTwoEntity.java
new file mode 100644
index 0000000..c3d5276
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/ECallEventTwoEntity.java
@@ -0,0 +1,300 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 工单 实体类
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+@Data
+@TableName("jczz_e_call_event_two")
+@ApiModel(value = "ECallEventTwo对象", description = "工单")
+public class ECallEventTwoEntity   {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 工单ID
+	 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 工单ID */
+	@ApiModelProperty(value = "orderId", example = "")
+	@TableField(value = "order_id")
+	private Long orderId;
+
+	/** 工单号/话务单号 */
+	@ApiModelProperty(value = "工单号/话务单号", example = "")
+	@TableField("order_code")
+	private String orderCode;
+
+	/** 诉求来源(0热线 1公安110 2微信 3微博) */
+	@ApiModelProperty(value = "诉求来源(0热线 1公安110 2微信 3微博)", example = "")
+	@TableField("issue_origin")
+	private String issueOrigin;
+
+	/** 诉求主题 */
+	@ApiModelProperty(value = "诉求主题", example = "")
+	@TableField("issue_title")
+	private String issueTitle;
+
+	/** 诉求内容 */
+	@ApiModelProperty(value = "诉求内容", example = "")
+	@TableField("issue_content")
+	private String issueContent;
+
+	/** 诉求用户类别(0个人 1企业) */
+	@ApiModelProperty(value = "诉求用户类别(0个人 1企业)", example = "")
+	@TableField("applicant_type")
+	private String applicantType;
+
+	/** 诉求人姓名 */
+	@ApiModelProperty(value = "诉求人姓名", example = "")
+	@TableField("applicant_name")
+	private String applicantName;
+
+	/** 诉求人性别(0男 1女) */
+	@ApiModelProperty(value = "诉求人性别(0男 1女)", example = "")
+	@TableField("applicant_gender")
+	private String applicantGender;
+
+	/** 诉求人住址 */
+	@ApiModelProperty(value = "诉求人住址", example = "")
+	@TableField("applicant_homeaddr")
+	private String applicantHomeaddr;
+
+	/** 现场联系电话 */
+	@ApiModelProperty(value = "现场联系电话", example = "")
+	@TableField("applicant_phone")
+	private String applicantPhone;
+
+	/** 网格 */
+	@ApiModelProperty(value = "网格", example = "")
+	@TableField("applicant_grid")
+	private String applicantGrid;
+
+	/** 诉求人行政区划 */
+	@ApiModelProperty(value = "诉求人行政区划", example = "")
+	@TableField("applicant_district")
+	private String applicantDistrict;
+
+	/** 事发地址 */
+	@ApiModelProperty(value = "事发地址", example = "")
+	@TableField("scene_addr")
+	private String sceneAddr;
+
+	/** 事发地址网格 */
+	@ApiModelProperty(value = "事发地址网格", example = "")
+	@TableField("scene_addr_grid")
+	private String sceneAddrGrid;
+
+	/** 事发所属行政区划 */
+	@ApiModelProperty(value = "事发所属行政区划", example = "")
+	@TableField("scene_district")
+	private String sceneDistrict;
+
+	/** 事发场所 */
+	@ApiModelProperty(value = "事发场所", example = "")
+	@TableField("scene_place")
+	private String scenePlace;
+
+	/** 事发地点-经度 */
+	@ApiModelProperty(value = "事发地点-经度", example = "")
+	@TableField("scene_geo_lat")
+	private BigDecimal sceneGeoLat;
+
+	/** 事发地点-维度 */
+	@ApiModelProperty(value = "事发地点-维度", example = "")
+	@TableField("scene_geo_lng")
+	private BigDecimal sceneGeoLng;
+
+	/** 是否保密 */
+	@ApiModelProperty(value = "是否保密", example = "")
+	@TableField("is_secret")
+	private String isSecret;
+
+	/** 是否重复 */
+	@ApiModelProperty(value = "是否重复", example = "")
+	@TableField("is_repeat")
+	private String isRepeat;
+
+	/** 诉求类别(咨询、投诉、求助、举报、建议) */
+	@ApiModelProperty(value = "诉求类别(咨询、投诉、求助、举报、建议)", example = "")
+	@TableField("issue_type")
+	private String issueType;
+
+	/** 归口类型-多级 */
+	@ApiModelProperty(value = "归口类型-多级", example = "")
+	@TableField("issue_clazz")
+	private String issueClazz;
+
+	/** 紧急程度(一般、即办) */
+	@ApiModelProperty(value = "紧急程度(一般、即办)", example = "")
+	@TableField("issue_level")
+	private String issueLevel;
+
+	/** 办理时限(分钟) */
+	@ApiModelProperty(value = "办理时限(分钟)", example = "")
+	@TableField("deadline")
+	private Integer deadline;
+
+	/** 关联工单ID */
+	@ApiModelProperty(value = "关联工单ID", example = "")
+	@TableField("link_orders")
+	private String linkOrders;
+
+	/** 关联工单号 */
+	@ApiModelProperty(value = "关联工单号", example = "")
+	@TableField("link_orders_code")
+	private String linkOrdersCode;
+
+	/** 知识引用 */
+	@ApiModelProperty(value = "知识引用", example = "")
+	@TableField("wiki_ref")
+	private String wikiRef;
+
+	/** 受理单位 */
+	@ApiModelProperty(value = "受理单位", example = "")
+	@TableField("acpt_org_code")
+	private String acptOrgCode;
+
+	/** 受理单位 */
+	@ApiModelProperty(value = "受理单位", example = "")
+	@TableField("acpt_org_name")
+	private String acptOrgName;
+
+	/** 处办方式 */
+	@ApiModelProperty(value = "处办方式", example = "")
+	@TableField("handle_way")
+	private String handleWay;
+
+	/** 外部处办方式 */
+	@ApiModelProperty(value = "外部处办方式", example = "")
+	@TableField("external_handle_way")
+	private String externalHandleWay;
+
+	/** 直接答复内容 */
+	@ApiModelProperty(value = "直接答复内容", example = "")
+	@TableField("direct_feed")
+	private String directFeed;
+
+	/** 直接答复人员 */
+	@ApiModelProperty(value = "直接答复人员", example = "")
+	@TableField("direct_feed_handler")
+	private String directFeedHandler;
+
+	/** 直接答复时间 */
+	@ApiModelProperty(value = "直接答复时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	@TableField("direct_feed_time")
+	private Date directFeedTime;
+
+	/** 工单附件 */
+	@ApiModelProperty(value = "工单附件", example = "")
+	@TableField("images")
+	private String images;
+
+	/** 工单状态(0受理 1处理中 2已归档) */
+	@ApiModelProperty(value = "工单状态(0受理 1处理中 2已归档)", example = "")
+	@TableField("status")
+	private String status;
+
+	/** 交办标签(N未交办 Y已交办 R已退回) */
+	@ApiModelProperty(value = "交办标签(N未交办 Y已交办 R已退回)", example = "")
+	@TableField("tag_apply")
+	private String tagApply;
+
+	/** 已延期(Y/N) */
+	@ApiModelProperty(value = "已延期(Y/N)", example = "")
+	@TableField("tag_delay")
+	private String tagDelay;
+
+	/** 已反馈(Y/N) */
+	@ApiModelProperty(value = "已反馈(Y/N)", example = "")
+	@TableField("tag_doing")
+	private String tagDoing;
+
+	/** 已答复(Y/N) */
+	@ApiModelProperty(value = "已答复(Y/N)", example = "")
+	@TableField("tag_resp")
+	private String tagResp;
+
+	/** 已办结(Y/N) */
+	@ApiModelProperty(value = "已办结(Y/N)", example = "")
+	@TableField("tag_done")
+	private String tagDone;
+
+	/** 已回访(Y/N) */
+	@ApiModelProperty(value = "已回访(Y/N)", example = "")
+	@TableField("tag_check")
+	private String tagCheck;
+
+	/** 已电话回访(Y/N) */
+	@ApiModelProperty(value = "已电话回访(Y/N)", example = "")
+	@TableField("tag_chk_tel")
+	private String tagChkTel;
+
+	/** 核实/督办(N1/N2) */
+	@ApiModelProperty(value = "核实/督办(N1/N2)", example = "")
+	@TableField("tag_redo")
+	private String tagRedo;
+
+	@ApiModelProperty(value = "定位地址", example = "")
+	@TableField("location")
+	private String location;
+
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user_id")
+	private Long createUserId;
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/**
+	 * 网格编号
+	 */
+	@ApiModelProperty(value = "网格编号")
+	@TableField("grid_code")
+	private String gridCode;
+	/**
+	 * 警务网格编号
+	 */
+	@ApiModelProperty(value = "警务网格编号")
+	@TableField("jw_grid_code")
+	private String jwGridCode;
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcDispatch.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcDispatch.java
new file mode 100644
index 0000000..aeab9aa
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcDispatch.java
@@ -0,0 +1,261 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 派发单对象 ec_dispatch
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcDispatch对象", description = "派发单")
+@Data
+@TableName("ec_dispatch")
+public class EcDispatch implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * 派发ID
+	 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "dispatch_id", type = IdType.AUTO)
+	private Long dispatchId;
+
+	/**
+	 * 工单ID
+	 */
+	@ApiModelProperty(value = "工单ID", example = "")
+	@TableField("order_id")
+	private Long orderId;
+
+	/**
+	 * 派发单号
+	 */
+	@ApiModelProperty(value = "派发单号", example = "")
+	@TableField("dispatch_code")
+	private String dispatchCode;
+
+	/**
+	 * 派发时间
+	 */
+	@ApiModelProperty(value = "派发时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("dispatch_time")
+	private Date dispatchTime;
+
+	/**
+	 * 派发意见
+	 */
+	@ApiModelProperty(value = "派发意见", example = "")
+	@TableField("dispatch_note")
+	private String dispatchNote;
+
+	/**
+	 * 派发附件
+	 */
+	@ApiModelProperty(value = "派发附件", example = "")
+	@TableField("dispatch_images")
+	private String dispatchImages;
+
+	/**
+	 * 派出单位
+	 */
+	@ApiModelProperty(value = "派出单位", example = "")
+	@TableField("subject_org_code")
+	private String subjectOrgCode;
+
+	/**
+	 * 派出单位
+	 */
+	@ApiModelProperty(value = "派出单位", example = "")
+	@TableField("subject_org_name")
+	private String subjectOrgName;
+
+	/**
+	 * 派出人员
+	 */
+	@ApiModelProperty(value = "派出人员", example = "")
+	@TableField("subject_user_name")
+	private String subjectUserName;
+
+	/**
+	 * 派出人员
+	 */
+	@ApiModelProperty(value = "派出人员", example = "")
+	@TableField("subject_user_cnname")
+	private String subjectUserCnname;
+
+	/**
+	 * 派发目标单位
+	 */
+	@ApiModelProperty(value = "派发目标单位", example = "")
+	@TableField("object_org_code")
+	private String objectOrgCode;
+
+	/**
+	 * 派发目标单位
+	 */
+	@ApiModelProperty(value = "派发目标单位", example = "")
+	@TableField("object_org_name")
+	private String objectOrgName;
+
+	/**
+	 * 实际接收单位(含抄送)
+	 */
+	@ApiModelProperty(value = "实际接收单位(含抄送)", example = "")
+	@TableField("sink_org_code")
+	private String sinkOrgCode;
+
+	/**
+	 * 实际接收单位(含抄送)
+	 */
+	@ApiModelProperty(value = "实际接收单位(含抄送)", example = "")
+	@TableField("sink_org_name")
+	private String sinkOrgName;
+
+	/**
+	 * 是否主办(Y/N)
+	 */
+	@ApiModelProperty(value = "是否主办(Y/N)", example = "")
+	@TableField("tag_main")
+	private String tagMain;
+
+	/**
+	 * 是否抄送(Y/N)
+	 */
+	@ApiModelProperty(value = "是否抄送(Y/N)", example = "")
+	@TableField("tag_cc")
+	private String tagCc;
+
+	/**
+	 * 话务送审(Y/N)
+	 */
+	@ApiModelProperty(value = "话务送审(Y/N)", example = "")
+	@TableField("tag_cti")
+	private String tagCti;
+
+	/**
+	 * 联指派发联指(Y/N)
+	 */
+	@ApiModelProperty(value = "联指派发联指(Y/N)", example = "")
+	@TableField("tag_trans")
+	private String tagTrans;
+
+	/**
+	 * 前序派发单
+	 */
+	@ApiModelProperty(value = "前序派发单", example = "")
+	@TableField("up_dispatch_id")
+	private Long upDispatchId;
+
+	/**
+	 * 签收单位
+	 */
+	@ApiModelProperty(value = "签收单位", example = "")
+	@TableField("ack_org_code")
+	private String ackOrgCode;
+
+	/**
+	 * 签收单位
+	 */
+	@ApiModelProperty(value = "签收单位", example = "")
+	@TableField("ack_org_name")
+	private String ackOrgName;
+
+	/**
+	 * 签收人员
+	 */
+	@ApiModelProperty(value = "签收人员", example = "")
+	@TableField("ack_user_name")
+	private String ackUserName;
+
+	/**
+	 * 签收人员
+	 */
+	@ApiModelProperty(value = "签收人员", example = "")
+	@TableField("ack_user_cnname")
+	private String ackUserCnname;
+
+	/**
+	 * 签收时间
+	 */
+	@ApiModelProperty(value = "签收时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("ack_time")
+	private Date ackTime;
+
+	/**
+	 * 退回人员
+	 */
+	@ApiModelProperty(value = "退回人员", example = "")
+	@TableField("reject_user_name")
+	private String rejectUserName;
+
+	/**
+	 * 退回人员
+	 */
+	@ApiModelProperty(value = "退回人员", example = "")
+	@TableField("reject_user_cnname")
+	private String rejectUserCnname;
+
+	/**
+	 * 退回单位
+	 */
+	@ApiModelProperty(value = "退回单位", example = "")
+	@TableField("reject_org_code")
+	private String rejectOrgCode;
+
+	/**
+	 * 退回单位
+	 */
+	@ApiModelProperty(value = "退回单位", example = "")
+	@TableField("reject_org_name")
+	private String rejectOrgName;
+
+	/**
+	 * 退回时间
+	 */
+	@ApiModelProperty(value = "退回时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("reject_time")
+	private Date rejectTime;
+
+	/**
+	 * 退回意见
+	 */
+	@ApiModelProperty(value = "退回意见", example = "")
+	@TableField("reject_note")
+	private String rejectNote;
+
+	/**
+	 * 退回附件
+	 */
+	@ApiModelProperty(value = "退回附件", example = "")
+	@TableField("reject_images")
+	private String rejectImages;
+
+	/**
+	 * 是否退回(Y/N)
+	 */
+	@ApiModelProperty(value = "是否退回(Y/N)", example = "")
+	@TableField("tag_reject")
+	private String tagReject;
+
+	/**
+	 * 退回类型(0退回 1改派)
+	 */
+	@ApiModelProperty(value = "退回类型(0退回 1改派)", example = "")
+	@TableField("reject_type")
+	private String rejectType;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcHandle.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcHandle.java
new file mode 100644
index 0000000..e9d86d9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcHandle.java
@@ -0,0 +1,123 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 办理单对象 ec_handle
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcHandle对象" , description = "办理单")
+@Data
+@TableName("ec_handle")
+public class EcHandle implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 办理单ID */
+    @ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "handle_id", type = IdType.AUTO)
+    private Long handleId;
+
+    /** 工单ID */
+    @ApiModelProperty(value = "工单ID", example = "")
+	@TableField("order_id")
+    private Long orderId;
+
+    /** 派发单ID */
+    @ApiModelProperty(value = "派发单ID", example = "")
+	@TableField("dispatch_id")
+    private Long dispatchId;
+
+    /** 办理单号 */
+    @ApiModelProperty(value = "办理单号", example = "")
+	@TableField("handle_code")
+    private String handleCode;
+
+    /** 办理单位 */
+    @ApiModelProperty(value = "办理单位", example = "")
+	@TableField("hdl_org_code")
+    private String hdlOrgCode;
+
+    /** 办理单位 */
+    @ApiModelProperty(value = "办理单位", example = "")
+	@TableField("hdl_org_name")
+    private String hdlOrgName;
+
+    /** 到达现场地点 */
+    @ApiModelProperty(value = "到达现场地点", example = "")
+	@TableField("arrive_loc")
+    private String arriveLoc;
+
+    /** 到达现场地点-经度 */
+    @ApiModelProperty(value = "到达现场地点-经度", example = "")
+	@TableField("arrive_loc_lat")
+    private BigDecimal arriveLocLat;
+
+    /** 到达现场地点-维度 */
+    @ApiModelProperty(value = "到达现场地点-维度", example = "")
+	@TableField("arrive_loc_lng")
+    private BigDecimal arriveLocLng;
+
+    /** 到达现场时间 */
+    @ApiModelProperty(value = "到达现场时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("arrive_biz_time")
+    private Date arriveBizTime;
+
+    /** 远程处置时间 */
+    @ApiModelProperty(value = "远程处置时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("remote_hdl_time")
+    private Date remoteHdlTime;
+
+    /** 远程处置说明 */
+    @ApiModelProperty(value = "远程处置说明", example = "")
+	@TableField("remote_hdl_note")
+    private String remoteHdlNote;
+
+    /** 远程处置附件 */
+    @ApiModelProperty(value = "远程处置附件", example = "")
+	@TableField("remote_hdl_images")
+    private String remoteHdlImages;
+
+    /** 未规范处置说明 */
+    @ApiModelProperty(value = "未规范处置说明", example = "")
+	@TableField("nosop_hdl_note")
+    private String nosopHdlNote;
+
+    /** 未规范处置附件 */
+    @ApiModelProperty(value = "未规范处置附件", example = "")
+	@TableField("nosop_hdl_images")
+    private String nosopHdlImages;
+
+    /** 截止日期 */
+    @ApiModelProperty(value = "截止日期", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("limit_time")
+    private Date limitTime;
+
+    /** 延期后截止日期 */
+    @ApiModelProperty(value = "延期后截止日期", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("delay_time")
+    private Date delayTime;
+
+    /** 已反馈(Y/N) */
+    @ApiModelProperty(value = "已反馈(Y/N)", example = "")
+	@TableField("tag_hdl_doing")
+    private String tagHdlDoing;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrder.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrder.java
new file mode 100644
index 0000000..76a51cd
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrder.java
@@ -0,0 +1,392 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 工单对象 ec_order
+ *
+ * @author ${context.author}
+ * @date 2024-05-27 16:26:59
+ */
+@ApiModel(value = "EcOrder对象", description = "工单")
+@Data
+@TableName("ec_order")
+public class EcOrder implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * 工单ID
+	 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "order_id", type = IdType.AUTO)
+	private Long orderId;
+
+	/**
+	 * 工单号/话务单号
+	 */
+	@ApiModelProperty(value = "工单号/话务单号", example = "")
+	@TableField("order_code")
+	private String orderCode;
+
+	/**
+	 * 诉求来源(0热线 1公安110 2微信 3微博)
+	 */
+	@ApiModelProperty(value = "诉求来源(0热线 1公安110 2微信 3微博)", example = "")
+	@TableField("issue_origin")
+	private String issueOrigin;
+
+	/**
+	 * 诉求主题
+	 */
+	@ApiModelProperty(value = "诉求主题", example = "")
+	@TableField("issue_title")
+	private String issueTitle;
+
+	/**
+	 * 诉求内容
+	 */
+	@ApiModelProperty(value = "诉求内容", example = "")
+	@TableField("issue_content")
+	private String issueContent;
+
+	/**
+	 * 诉求用户类别(0个人 1企业)
+	 */
+	@ApiModelProperty(value = "诉求用户类别(0个人 1企业)", example = "")
+	@TableField("applicant_type")
+	private String applicantType;
+
+	/**
+	 * 诉求人姓名
+	 */
+	@ApiModelProperty(value = "诉求人姓名", example = "")
+	@TableField("applicant_name")
+	private String applicantName;
+
+	/**
+	 * 诉求人性别(0男 1女)
+	 */
+	@ApiModelProperty(value = "诉求人性别(0男 1女)", example = "")
+	@TableField("applicant_gender")
+	private String applicantGender;
+
+	/**
+	 * 诉求人住址
+	 */
+	@ApiModelProperty(value = "诉求人住址", example = "")
+	@TableField("applicant_homeaddr")
+	private String applicantHomeaddr;
+
+	/**
+	 * 现场联系电话
+	 */
+	@ApiModelProperty(value = "现场联系电话", example = "")
+	@TableField("applicant_phone")
+	private String applicantPhone;
+
+	/**
+	 * 网格
+	 */
+	@ApiModelProperty(value = "网格", example = "")
+	@TableField("applicant_grid")
+	private String applicantGrid;
+
+	/**
+	 * 诉求人行政区划
+	 */
+	@ApiModelProperty(value = "诉求人行政区划", example = "")
+	@TableField("applicant_district")
+	private String applicantDistrict;
+
+	/**
+	 * 事发地址
+	 */
+	@ApiModelProperty(value = "事发地址", example = "")
+	@TableField("scene_addr")
+	private String sceneAddr;
+
+	/**
+	 * 事发地址网格
+	 */
+	@ApiModelProperty(value = "事发地址网格", example = "")
+	@TableField("scene_addr_grid")
+	private String sceneAddrGrid;
+
+	/**
+	 * 事发所属行政区划
+	 */
+	@ApiModelProperty(value = "事发所属行政区划", example = "")
+	@TableField("scene_district")
+	private String sceneDistrict;
+
+	/**
+	 * 事发场所
+	 */
+	@ApiModelProperty(value = "事发场所", example = "")
+	@TableField("scene_place")
+	private String scenePlace;
+
+	/**
+	 * 事发地点-经度
+	 */
+	@ApiModelProperty(value = "事发地点-经度", example = "")
+	@TableField("scene_geo_lat")
+	private BigDecimal sceneGeoLat;
+
+	/**
+	 * 事发地点-维度
+	 */
+	@ApiModelProperty(value = "事发地点-维度", example = "")
+	@TableField("scene_geo_lng")
+	private BigDecimal sceneGeoLng;
+
+	/**
+	 * 事发地址(App校正)
+	 */
+	@ApiModelProperty(value = "事发地址(App校正)", example = "")
+	@TableField("scene_addr_cor")
+	private String sceneAddrCor;
+
+	/**
+	 * 事发地点-经度(App校正)
+	 */
+	@ApiModelProperty(value = "事发地点-经度(App校正)", example = "")
+	@TableField("scene_geo_lat_cor")
+	private BigDecimal sceneGeoLatCor;
+
+	/**
+	 * 事发地点-维度(App校正)
+	 */
+	@ApiModelProperty(value = "事发地点-维度(App校正)", example = "")
+	@TableField("scene_geo_lng_cor")
+	private BigDecimal sceneGeoLngCor;
+
+	/**
+	 * 是否保密
+	 */
+	@ApiModelProperty(value = "是否保密", example = "")
+	@TableField("is_secret")
+	private String isSecret;
+
+	/**
+	 * 是否重复
+	 */
+	@ApiModelProperty(value = "是否重复", example = "")
+	@TableField("is_repeat")
+	private String isRepeat;
+
+	/**
+	 * 诉求类别(咨询、投诉、求助、举报、建议)
+	 */
+	@ApiModelProperty(value = "诉求类别(咨询、投诉、求助、举报、建议)", example = "")
+	@TableField("issue_type")
+	private String issueType;
+
+	/**
+	 * 归口类型-多级
+	 */
+	@ApiModelProperty(value = "归口类型-多级", example = "")
+	@TableField("issue_clazz")
+	private String issueClazz;
+
+	/**
+	 * 紧急程度(一般、即办)
+	 */
+	@ApiModelProperty(value = "紧急程度(一般、即办)", example = "")
+	@TableField("issue_level")
+	private String issueLevel;
+
+	/**
+	 * 办理时限(分钟)
+	 */
+	@ApiModelProperty(value = "办理时限(分钟)", example = "")
+	@TableField("deadline")
+	private Integer deadline;
+
+	/**
+	 * 关联工单ID
+	 */
+	@ApiModelProperty(value = "关联工单ID", example = "")
+	@TableField("link_orders")
+	private String linkOrders;
+
+	/**
+	 * 关联工单号
+	 */
+	@ApiModelProperty(value = "关联工单号", example = "")
+	@TableField("link_orders_code")
+	private String linkOrdersCode;
+
+	/**
+	 * 知识引用
+	 */
+	@ApiModelProperty(value = "知识引用", example = "")
+	@TableField("wiki_ref")
+	private String wikiRef;
+
+	/**
+	 * 受理单位
+	 */
+	@ApiModelProperty(value = "受理单位", example = "")
+	@TableField("acpt_org_code")
+	private String acptOrgCode;
+
+	/**
+	 * 受理单位
+	 */
+	@ApiModelProperty(value = "受理单位", example = "")
+	@TableField("acpt_org_name")
+	private String acptOrgName;
+
+	/**
+	 * 处办方式
+	 */
+	@ApiModelProperty(value = "处办方式", example = "")
+	@TableField("handle_way")
+	private String handleWay;
+
+	/**
+	 * 外部处办方式
+	 */
+	@ApiModelProperty(value = "外部处办方式", example = "")
+	@TableField("external_handle_way")
+	private String externalHandleWay;
+
+	/**
+	 * 直接答复内容
+	 */
+	@ApiModelProperty(value = "直接答复内容", example = "")
+	@TableField("direct_feed")
+	private String directFeed;
+
+	/**
+	 * 直接答复人员
+	 */
+	@ApiModelProperty(value = "直接答复人员", example = "")
+	@TableField("direct_feed_handler")
+	private String directFeedHandler;
+
+	/**
+	 * 直接答复时间
+	 */
+	@ApiModelProperty(value = "直接答复时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("direct_feed_time")
+	private Date directFeedTime;
+
+	/**
+	 * 工单附件
+	 */
+	@ApiModelProperty(value = "工单附件", example = "")
+	@TableField("images")
+	private String images;
+
+	/**
+	 * 有效工单(Y/N)
+	 */
+	@ApiModelProperty(value = "有效工单(Y/N)", example = "")
+	@TableField("flag_vaild")
+	private String flagVaild;
+
+	/**
+	 * 无效说明
+	 */
+	@ApiModelProperty(value = "无效说明", example = "")
+	@TableField("invalid_note")
+	private String invalidNote;
+
+	/**
+	 * 无效设置时间
+	 */
+	@ApiModelProperty(value = "无效设置时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("invalid_time")
+	private Date invalidTime;
+
+	/**
+	 * 无效设置人员
+	 */
+	@ApiModelProperty(value = "无效设置人员", example = "")
+	@TableField("invalid_user_name")
+	private String invalidUserName;
+
+	/**
+	 * 工单状态(0受理 1处理中 2已归档)
+	 */
+	@ApiModelProperty(value = "工单状态(0受理 1处理中 2已归档)", example = "")
+	@TableField("status")
+	private String status;
+
+	/**
+	 * 交办标签(N未交办 Y已交办 R已退回)
+	 */
+	@ApiModelProperty(value = "交办标签(N未交办 Y已交办 R已退回)", example = "")
+	@TableField("tag_apply")
+	private String tagApply;
+
+	/**
+	 * 已延期(Y/N)
+	 */
+	@ApiModelProperty(value = "已延期(Y/N)", example = "")
+	@TableField("tag_delay")
+	private String tagDelay;
+
+	/**
+	 * 已反馈(Y/N)
+	 */
+	@ApiModelProperty(value = "已反馈(Y/N)", example = "")
+	@TableField("tag_doing")
+	private String tagDoing;
+
+	/**
+	 * 已答复(Y/N)
+	 */
+	@ApiModelProperty(value = "已答复(Y/N)", example = "")
+	@TableField("tag_resp")
+	private String tagResp;
+
+	/**
+	 * 已办结(Y/N)
+	 */
+	@ApiModelProperty(value = "已办结(Y/N)", example = "")
+	@TableField("tag_done")
+	private String tagDone;
+
+	/**
+	 * 已回访(Y/N)
+	 */
+	@ApiModelProperty(value = "已回访(Y/N)", example = "")
+	@TableField("tag_check")
+	private String tagCheck;
+
+	/**
+	 * 已电话回访(Y/N)
+	 */
+	@ApiModelProperty(value = "已电话回访(Y/N)", example = "")
+	@TableField("tag_chk_tel")
+	private String tagChkTel;
+
+	/**
+	 * 核实/督办(N1/N2)
+	 */
+	@ApiModelProperty(value = "核实/督办(N1/N2)", example = "")
+	@TableField("tag_redo")
+	private String tagRedo;
+
+	@ApiModelProperty(value = "导入时间", example = "")
+	@TableField("import_time")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date importTime;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderCheck.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderCheck.java
new file mode 100644
index 0000000..bee2a2b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderCheck.java
@@ -0,0 +1,60 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 回访单对象 ec_order_check
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderCheck对象" , description = "回访单")
+@Data
+@TableName("ec_order_check")
+public class EcOrderCheck implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 工单ID */
+    @ApiModelProperty(value = "主键ID", example = "")
+    @TableId(value = "order_id", type = IdType.ASSIGN_ID)
+    private Long orderId;
+
+    /** 回访单号 */
+    @ApiModelProperty(value = "回访单号", example = "")
+	@TableField("check_code")
+    private String checkCode;
+
+    /** 回访单位 */
+    @ApiModelProperty(value = "回访单位", example = "")
+	@TableField("check_org_code")
+    private String checkOrgCode;
+
+    /** 回访单位 */
+    @ApiModelProperty(value = "回访单位", example = "")
+	@TableField("check_org_name")
+    private String checkOrgName;
+
+    /** 回访时限起点 */
+    @ApiModelProperty(value = "回访时限起点", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("limit_start_time")
+    private Date limitStartTime;
+
+    /** 回访时限终点 */
+    @ApiModelProperty(value = "回访时限终点", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("limit_end_time")
+    private Date limitEndTime;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderDone.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderDone.java
new file mode 100644
index 0000000..88ddea4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderDone.java
@@ -0,0 +1,50 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 办结单对象 ec_order_done
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderDone对象" , description = "办结单")
+@Data
+@TableName("ec_order_done")
+public class EcOrderDone implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 工单ID */
+    @ApiModelProperty(value = "主键ID", example = "")
+    @TableId(value = "order_id", type = IdType.ASSIGN_ID)
+    private Long orderId;
+
+    /** 办结单号 */
+    @ApiModelProperty(value = "办结单号", example = "")
+	@TableField("done_code")
+    private String doneCode;
+
+    /** 首次办结申请时间 */
+    @ApiModelProperty(value = "首次办结申请时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("first_done_apply_time")
+    private Date firstDoneApplyTime;
+
+    /** 首次办结审核通过时间 */
+    @ApiModelProperty(value = "首次办结审核通过时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("first_done_audit_yes_time")
+    private Date firstDoneAuditYesTime;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderResp.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderResp.java
new file mode 100644
index 0000000..45cf28b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderResp.java
@@ -0,0 +1,36 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 答复单对象 ec_order_resp
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderResp对象" , description = "答复单")
+@Data
+@TableName("ec_order_resp")
+public class EcOrderResp implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 工单号 */
+    @ApiModelProperty(value = "主键ID", example = "")
+    @TableId(value = "order_id", type = IdType.ASSIGN_ID)
+    private Long orderId;
+
+    /** 答复单号 */
+    @ApiModelProperty(value = "答复单号", example = "")
+	@TableField("resp_code")
+    private String respCode;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderReview.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderReview.java
new file mode 100644
index 0000000..3ec31b9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderReview.java
@@ -0,0 +1,150 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 核实单对象 ec_order_review
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderReview对象" , description = "核实单")
+@Data
+@TableName("ec_order_review")
+public class EcOrderReview implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+
+    /** 工单ID */
+    @ApiModelProperty(value = "主键ID", example = "")
+    @TableId(value = "order_id", type = IdType.ASSIGN_ID)
+    private Long orderId;
+
+    /** 核实单号 */
+    @ApiModelProperty(value = "核实单号", example = "")
+	@TableField("review_code")
+    private String reviewCode;
+
+    /** 工单号 */
+    @ApiModelProperty(value = "工单号", example = "")
+	@TableField("order_code")
+    private String orderCode;
+
+    /** 关联电话回访流水号 */
+    @ApiModelProperty(value = "关联电话回访流水号", example = "")
+	@TableField("tel_chk_id")
+    private Long telChkId;
+
+    /** 核实时间 */
+    @ApiModelProperty(value = "核实时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("review_time")
+    private Date reviewTime;
+
+    /** 核实人员 */
+    @ApiModelProperty(value = "核实人员", example = "")
+	@TableField("review_user_cnname")
+    private String reviewUserCnname;
+
+    /** 核实人员 */
+    @ApiModelProperty(value = "核实人员", example = "")
+	@TableField("review_user_name")
+    private String reviewUserName;
+
+    /** 核实坐席分机 */
+    @ApiModelProperty(value = "核实坐席分机", example = "")
+	@TableField("review_user_phone")
+    private String reviewUserPhone;
+
+    /** 核实单位 */
+    @ApiModelProperty(value = "核实单位", example = "")
+	@TableField("review_org_code")
+    private String reviewOrgCode;
+
+    /** 核实单位名称 */
+    @ApiModelProperty(value = "核实单位名称", example = "")
+	@TableField("review_org_name")
+    private String reviewOrgName;
+
+    /** 核实诉求人 */
+    @ApiModelProperty(value = "核实诉求人", example = "")
+	@TableField("review_issuer")
+    private String reviewIssuer;
+
+    /** 核实诉求人号码 */
+    @ApiModelProperty(value = "核实诉求人号码", example = "")
+	@TableField("review_issuer_phone")
+    private String reviewIssuerPhone;
+
+    /** 核实内容 */
+    @ApiModelProperty(value = "核实内容", example = "")
+	@TableField("review_note")
+    private String reviewNote;
+
+    /** 核实结果 */
+    @ApiModelProperty(value = "核实结果", example = "")
+	@TableField("review_yesno")
+    private String reviewYesno;
+
+    /** 核实附件 */
+    @ApiModelProperty(value = "核实附件", example = "")
+	@TableField("review_images")
+    private String reviewImages;
+
+    /** 核实录音文件 */
+    @ApiModelProperty(value = "核实录音文件", example = "")
+	@TableField("cti_voice_record_id")
+    private String ctiVoiceRecordId;
+
+    /** 核实录音播放地址 */
+    @ApiModelProperty(value = "核实录音播放地址", example = "")
+	@TableField("cti_voice_record_url")
+    private String ctiVoiceRecordUrl;
+
+    /** 重新办理单位 */
+    @ApiModelProperty(value = "重新办理单位", example = "")
+	@TableField("redo_org_code")
+    private String redoOrgCode;
+
+    /** 重新办理单位 */
+    @ApiModelProperty(value = "重新办理单位", example = "")
+	@TableField("redo_org_name")
+    private String redoOrgName;
+
+    /** 重新办理人员 */
+    @ApiModelProperty(value = "重新办理人员", example = "")
+	@TableField("redo_user_name")
+    private String redoUserName;
+
+    /** 重新办理人员 */
+    @ApiModelProperty(value = "重新办理人员", example = "")
+	@TableField("redo_user_cnname")
+    private String redoUserCnname;
+
+    /** 重新办理时间 */
+    @ApiModelProperty(value = "重新办理时间", example = "")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("redo_time")
+    private Date redoTime;
+
+    /** 重新办理情况 */
+    @ApiModelProperty(value = "重新办理情况", example = "")
+	@TableField("redo_note")
+    private String redoNote;
+
+    /** 重新办理附件 */
+    @ApiModelProperty(value = "重新办理附件", example = "")
+	@TableField("redo_images")
+    private String redoImages;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderSupervise.java b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderSupervise.java
new file mode 100644
index 0000000..d0a5ce9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/entity/EcOrderSupervise.java
@@ -0,0 +1,155 @@
+package org.springblade.modules.eCallEventTwo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 督办单对象 ec_order_supervise
+ *
+ * @author ${context.author}
+ * @date 2024-05-28 14:42:26
+ */
+@ApiModel(value = "EcOrderSupervise对象", description = "督办单")
+@Data
+@TableName("ec_order_supervise")
+public class EcOrderSupervise implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * 工单ID
+	 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "order_id", type = IdType.ASSIGN_ID)
+	private Long orderId;
+
+	/**
+	 * 督办单号
+	 */
+	@ApiModelProperty(value = "督办单号", example = "")
+	@TableField("supervise_code")
+	private String superviseCode;
+
+	/**
+	 * 工单号
+	 */
+	@ApiModelProperty(value = "工单号", example = "")
+	@TableField("order_code")
+	private String orderCode;
+
+	/**
+	 * 关联电话回访流水号
+	 */
+	@ApiModelProperty(value = "关联电话回访流水号", example = "")
+	@TableField("tel_chk_id")
+	private Long telChkId;
+
+	/**
+	 * 督办生成时间
+	 */
+	@ApiModelProperty(value = "督办生成时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("supervise_time")
+	private Date superviseTime;
+
+	/**
+	 * 督办领导
+	 */
+	@ApiModelProperty(value = "督办领导", example = "")
+	@TableField("supervisor_name")
+	private String supervisorName;
+
+	/**
+	 * 督办领导
+	 */
+	@ApiModelProperty(value = "督办领导", example = "")
+	@TableField("supervisor_cnname")
+	private String supervisorCnname;
+
+	/**
+	 * 督办意见
+	 */
+	@ApiModelProperty(value = "督办意见", example = "")
+	@TableField("supervise_note")
+	private String superviseNote;
+
+	/**
+	 * 督办附件
+	 */
+	@ApiModelProperty(value = "督办附件", example = "")
+	@TableField("supervise_images")
+	private String superviseImages;
+
+	/**
+	 * 督办单位
+	 */
+	@ApiModelProperty(value = "督办单位", example = "")
+	@TableField("supervisor_org_code")
+	private String supervisorOrgCode;
+
+	/**
+	 * 督办单位
+	 */
+	@ApiModelProperty(value = "督办单位", example = "")
+	@TableField("supervisor_org_name")
+	private String supervisorOrgName;
+
+	/**
+	 * 重新办理单位
+	 */
+	@ApiModelProperty(value = "重新办理单位", example = "")
+	@TableField("redo_org_code")
+	private String redoOrgCode;
+
+	/**
+	 * 重新办理单位
+	 */
+	@ApiModelProperty(value = "重新办理单位", example = "")
+	@TableField("redo_org_name")
+	private String redoOrgName;
+
+	/**
+	 * 重新办理人员
+	 */
+	@ApiModelProperty(value = "重新办理人员", example = "")
+	@TableField("redo_user_name")
+	private String redoUserName;
+
+	/**
+	 * 重新办理人员
+	 */
+	@ApiModelProperty(value = "重新办理人员", example = "")
+	@TableField("redo_user_cnname")
+	private String redoUserCnname;
+
+	/**
+	 * 重新办理时间
+	 */
+	@ApiModelProperty(value = "重新办理时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("redo_time")
+	private Date redoTime;
+
+	/**
+	 * 重新办理情况
+	 */
+	@ApiModelProperty(value = "重新办理情况", example = "")
+	@TableField("redo_note")
+	private String redoNote;
+
+	/**
+	 * 重新办理附件
+	 */
+	@ApiModelProperty(value = "重新办理附件", example = "")
+	@TableField("redo_images")
+	private String redoImages;
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.java b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.java
new file mode 100644
index 0000000..86c7ff4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.java
@@ -0,0 +1,69 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.eCallEventTwo.dto.ECallEventTwoDTO;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO;
+
+import java.util.List;
+
+/**
+ * 工单 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+@DS("master")
+public interface EcCallEventTwoMapper extends BaseMapper<ECallEventTwoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param eCallEventTwo
+	 * @return
+	 */
+	List<ECallEventTwoVO> selectECallEventTwoPage(IPage page,
+												  @Param("eCallEventTwo") ECallEventTwoVO eCallEventTwo,
+												  @Param("gridCodeList") List<String> gridCodeList,
+												  @Param("regionChildCodesList") List<String> regionChildCodesList,
+												  @Param("isAdministrator") Integer isAdministrator);
+
+
+
+	/**
+	 * 查询工单
+	 *
+	 * @param orderId 工单ID
+	 * @return 工单
+	 */
+	public ECallEventTwoDTO selectECallEventTwoById(Long orderId);
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param eCallEventTwoDTO 工单
+	 * @return 工单集合
+	 */
+	public List<ECallEventTwoDTO> selectECallEventTwoList(ECallEventTwoDTO eCallEventTwoDTO);
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.xml b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.xml
new file mode 100644
index 0000000..e62b436
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcCallEventTwoMapper.xml
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.eCallEventTwo.mapper.EcCallEventTwoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="eCallEventTwoResultMap" type="org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO">
+    </resultMap>
+
+
+    <select id="selectECallEventTwoPage" resultMap="eCallEventTwoResultMap">
+        select jecet.* from jczz_e_call_event_two jecet
+        <where>
+            <if test="eCallEventTwo.orderId != null "> and order_id = #{eCallEventTwo.orderId}</if>
+            <if test="eCallEventTwo.orderCode != null  and eCallEventTwo.orderCode != ''"> and order_code like concat('%',#{eCallEventTwo.orderCode},'%') </if>
+            <if test="eCallEventTwo.issueOrigin != null  and eCallEventTwo.issueOrigin != ''"> and issue_origin = #{eCallEventTwo.issueOrigin}</if>
+            <if test="eCallEventTwo.issueTitle != null  and eCallEventTwo.issueTitle != ''"> and issue_title like concat('%',#{eCallEventTwo.issueTitle},'%') </if>
+            <if test="eCallEventTwo.issueContent != null  and eCallEventTwo.issueContent != ''"> and issue_content = #{eCallEventTwo.issueContent}</if>
+            <if test="eCallEventTwo.applicantType != null  and eCallEventTwo.applicantType != ''"> and applicant_type = #{eCallEventTwo.applicantType}</if>
+            <if test="eCallEventTwo.applicantName != null  and eCallEventTwo.applicantName != ''"> and applicant_name like concat('%',#{eCallEventTwo.applicantName},'%') </if>
+            <if test="eCallEventTwo.applicantGender != null  and eCallEventTwo.applicantGender != ''"> and applicant_gender = #{eCallEventTwo.applicantGender}</if>
+            <if test="eCallEventTwo.applicantHomeaddr != null  and eCallEventTwo.applicantHomeaddr != ''"> and applicant_homeaddr = #{eCallEventTwo.applicantHomeaddr}</if>
+            <if test="eCallEventTwo.applicantPhone != null  and eCallEventTwo.applicantPhone != ''"> and applicant_phone = #{eCallEventTwo.applicantPhone}</if>
+            <if test="eCallEventTwo.applicantGrid != null  and eCallEventTwo.applicantGrid != ''"> and applicant_grid = #{eCallEventTwo.applicantGrid}</if>
+            <if test="eCallEventTwo.applicantDistrict != null  and eCallEventTwo.applicantDistrict != ''"> and applicant_district = #{eCallEventTwo.applicantDistrict}</if>
+            <if test="eCallEventTwo.sceneAddr != null  and eCallEventTwo.sceneAddr != ''"> and scene_addr = #{eCallEventTwo.sceneAddr}</if>
+            <if test="eCallEventTwo.sceneAddrGrid != null  and eCallEventTwo.sceneAddrGrid != ''"> and scene_addr_grid = #{eCallEventTwo.sceneAddrGrid}</if>
+            <if test="eCallEventTwo.sceneDistrict != null  and eCallEventTwo.sceneDistrict != ''"> and scene_district = #{eCallEventTwo.sceneDistrict}</if>
+            <if test="eCallEventTwo.scenePlace != null  and eCallEventTwo.scenePlace != ''"> and scene_place = #{eCallEventTwo.scenePlace}</if>
+            <if test="eCallEventTwo.sceneGeoLat != null "> and scene_geo_lat = #{eCallEventTwo.sceneGeoLat}</if>
+            <if test="eCallEventTwo.sceneGeoLng != null "> and scene_geo_lng = #{eCallEventTwo.sceneGeoLng}</if>
+            <if test="eCallEventTwo.isSecret != null  and eCallEventTwo.isSecret != ''"> and is_secret = #{eCallEventTwo.isSecret}</if>
+            <if test="eCallEventTwo.isRepeat != null  and eCallEventTwo.isRepeat != ''"> and is_repeat = #{eCallEventTwo.isRepeat}</if>
+            <if test="eCallEventTwo.issueType != null  and eCallEventTwo.issueType != ''"> and issue_type = #{eCallEventTwo.issueType}</if>
+            <if test="eCallEventTwo.issueClazz != null  and eCallEventTwo.issueClazz != ''"> and issue_clazz = #{eCallEventTwo.issueClazz}</if>
+            <if test="eCallEventTwo.issueLevel != null  and eCallEventTwo.issueLevel != ''"> and issue_level = #{eCallEventTwo.issueLevel}</if>
+            <if test="eCallEventTwo.deadline != null "> and deadline = #{eCallEventTwo.deadline}</if>
+            <if test="eCallEventTwo.linkOrders != null  and eCallEventTwo.linkOrders != ''"> and link_orders = #{eCallEventTwo.linkOrders}</if>
+            <if test="eCallEventTwo.linkOrdersCode != null  and eCallEventTwo.linkOrdersCode != ''"> and link_orders_code = #{leCallEventTwo.inkOrdersCode}</if>
+            <if test="eCallEventTwo.wikiRef != null  and eCallEventTwo.wikiRef != ''"> and wiki_ref = #{eCallEventTwo.wikiRef}</if>
+            <if test="eCallEventTwo.acptOrgCode != null  and eCallEventTwo.acptOrgCode != ''"> and acpt_org_code = #{eCallEventTwo.acptOrgCode}</if>
+            <if test="eCallEventTwo.acptOrgName != null  and eCallEventTwo.acptOrgName != ''"> and acpt_org_name = #{eCallEventTwo.acptOrgName}</if>
+            <if test="eCallEventTwo.handleWay != null  and eCallEventTwo.handleWay != ''"> and handle_way = #{eCallEventTwo.handleWay}</if>
+            <if test="eCallEventTwo.externalHandleWay != null  and eCallEventTwo.externalHandleWay != ''"> and external_handle_way = #{eCallEventTwo.eCallEventTwo.externalHandleWay}</if>
+            <if test="eCallEventTwo.directFeed != null  and eCallEventTwo.directFeed != ''"> and direct_feed = #{eCallEventTwo.directFeed}</if>
+            <if test="eCallEventTwo.directFeedHandler != null  and eCallEventTwo.directFeedHandler != ''"> and direct_feed_handler = #{eCallEventTwo.directFeedHandler}</if>
+            <if test="eCallEventTwo.directFeedTime != null "> and direct_feed_time = #{eCallEventTwo.directFeedTime}</if>
+            <if test="eCallEventTwo.images != null  and eCallEventTwo.images != ''">and images =
+                #{eCallEventTwo.images}
+            </if>
+            <if test="eCallEventTwo.status != null  and eCallEventTwo.status != ''">and status =
+                #{eCallEventTwo.status}
+            </if>
+            <if test="eCallEventTwo.tagApply != null  and eCallEventTwo.tagApply != ''">and tag_apply =
+                #{eCallEventTwo.tagApply}
+            </if>
+            <if test="eCallEventTwo.tagDelay != null  and eCallEventTwo.tagDelay != ''">and tag_delay =
+                #{eCallEventTwo.tagDelay}
+            </if>
+            <if test="eCallEventTwo.tagDoing != null  and eCallEventTwo.tagDoing != ''">and tag_doing =
+                #{eCallEventTwo.tagDoing}
+            </if>
+            <if test="eCallEventTwo.tagResp != null  and eCallEventTwo.tagResp != ''">and tag_resp =
+                #{eCallEventTwo.tagResp}
+            </if>
+            <if test="eCallEventTwo.tagDone != null  and eCallEventTwo.tagDone != ''">and tag_done =
+                #{eCallEventTwo.tagDone}
+            </if>
+            <if test="eCallEventTwo.tagCheck != null  and eCallEventTwo.tagCheck != ''">and tag_check =
+                #{eCallEventTwo.tagCheck}
+            </if>
+            <if test="eCallEventTwo.tagChkTel != null  and eCallEventTwo.tagChkTel != ''">and tag_chk_tel =
+                #{eCallEventTwo.tagChkTel}
+            </if>
+            <if test="eCallEventTwo.tagRedo != null  and eCallEventTwo.tagRedo != ''">and tag_redo =
+                #{eCallEventTwo.tagRedo}
+            </if>
+            <if test="isAdministrator==2">
+                <choose>
+                    <when test="eCallEventTwo.roleName != null and eCallEventTwo.roleName != ''">
+                        <if test="eCallEventTwo.roleName=='wgy'">
+                            <choose>
+                                <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                    and jecet.grid_code in
+                                    <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jecet.grid_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                        <if test="eCallEventTwo.roleName=='mj'">
+                            <choose>
+                                <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                    and jecet.jw_grid_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                             separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jecet.jw_grid_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                    </when>
+                    <otherwise>
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and
+                                (
+                                jecet.grid_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                )
+                            </when>
+                            <otherwise>
+                                and  ( jecet.grid_code in ('')  )
+                            </otherwise>
+                        </choose>
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        order by order_id desc
+    </select>
+
+
+    <resultMap type="org.springblade.modules.eCallEventTwo.dto.ECallEventTwoDTO" id="ECallEventTwoDTOResult">
+        <result property="orderId"    column="order_id"    />
+        <result property="orderCode"    column="order_code"    />
+        <result property="issueOrigin"    column="issue_origin"    />
+        <result property="issueTitle"    column="issue_title"    />
+        <result property="issueContent"    column="issue_content"    />
+        <result property="applicantType"    column="applicant_type"    />
+        <result property="applicantName"    column="applicant_name"    />
+        <result property="applicantGender"    column="applicant_gender"    />
+        <result property="applicantHomeaddr"    column="applicant_homeaddr"    />
+        <result property="applicantPhone"    column="applicant_phone"    />
+        <result property="applicantGrid"    column="applicant_grid"    />
+        <result property="applicantDistrict"    column="applicant_district"    />
+        <result property="sceneAddr"    column="scene_addr"    />
+        <result property="sceneAddrGrid"    column="scene_addr_grid"    />
+        <result property="sceneDistrict"    column="scene_district"    />
+        <result property="scenePlace"    column="scene_place"    />
+        <result property="sceneGeoLat"    column="scene_geo_lat"    />
+        <result property="sceneGeoLng"    column="scene_geo_lng"    />
+        <result property="isSecret"    column="is_secret"    />
+        <result property="isRepeat"    column="is_repeat"    />
+        <result property="issueType"    column="issue_type"    />
+        <result property="issueClazz"    column="issue_clazz"    />
+        <result property="issueLevel"    column="issue_level"    />
+        <result property="deadline"    column="deadline"    />
+        <result property="linkOrders"    column="link_orders"    />
+        <result property="linkOrdersCode"    column="link_orders_code"    />
+        <result property="wikiRef"    column="wiki_ref"    />
+        <result property="acptOrgCode"    column="acpt_org_code"    />
+        <result property="acptOrgName"    column="acpt_org_name"    />
+        <result property="handleWay"    column="handle_way"    />
+        <result property="externalHandleWay"    column="external_handle_way"    />
+        <result property="directFeed"    column="direct_feed"    />
+        <result property="directFeedHandler"    column="direct_feed_handler"    />
+        <result property="directFeedTime"    column="direct_feed_time"    />
+        <result property="images"    column="images"    />
+        <result property="status"    column="status"    />
+        <result property="tagApply"    column="tag_apply"    />
+        <result property="tagDelay"    column="tag_delay"    />
+        <result property="tagDoing"    column="tag_doing"    />
+        <result property="tagResp"    column="tag_resp"    />
+        <result property="tagDone"    column="tag_done"    />
+        <result property="tagCheck"    column="tag_check"    />
+        <result property="tagChkTel"    column="tag_chk_tel"    />
+        <result property="tagRedo"    column="tag_redo"    />
+    </resultMap>
+
+    <sql id="selectECallEventTwo">
+        select
+            order_id,
+            order_code,
+            issue_origin,
+            issue_title,
+            issue_content,
+            applicant_type,
+            applicant_name,
+            applicant_gender,
+            applicant_homeaddr,
+            applicant_phone,
+            applicant_grid,
+            applicant_district,
+            scene_addr,
+            scene_addr_grid,
+            scene_district,
+            scene_place,
+            scene_geo_lat,
+            scene_geo_lng,
+            is_secret,
+            is_repeat,
+            issue_type,
+            issue_clazz,
+            issue_level,
+            deadline,
+            link_orders,
+            link_orders_code,
+            wiki_ref,
+            acpt_org_code,
+            acpt_org_name,
+            handle_way,
+            external_handle_way,
+            direct_feed,
+            direct_feed_handler,
+            direct_feed_time,
+            images,
+            status,
+            tag_apply,
+            tag_delay,
+            tag_doing,
+            tag_resp,
+            tag_done,
+            tag_check,
+            tag_chk_tel,
+            tag_redo
+        from
+            jczz_e_call_event_two
+    </sql>
+
+    <select id="selectECallEventTwoById" parameterType="long" resultMap="ECallEventTwoDTOResult">
+        <include refid="selectECallEventTwo"/>
+        where
+        order_id = #{orderId}
+    </select>
+
+    <select id="selectECallEventTwoList" parameterType="org.springblade.modules.eCallEventTwo.dto.ECallEventTwoDTO" resultMap="ECallEventTwoDTOResult">
+        <include refid="selectECallEventTwo"/>
+        <where>
+            <if test="orderId != null "> and order_id = #{orderId}</if>
+            <if test="orderCode != null  and orderCode != ''"> and order_code = #{orderCode}</if>
+            <if test="issueOrigin != null  and issueOrigin != ''"> and issue_origin = #{issueOrigin}</if>
+            <if test="issueTitle != null  and issueTitle != ''"> and issue_title = #{issueTitle}</if>
+            <if test="issueContent != null  and issueContent != ''"> and issue_content = #{issueContent}</if>
+            <if test="applicantType != null  and applicantType != ''"> and applicant_type = #{applicantType}</if>
+            <if test="applicantName != null  and applicantName != ''"> and applicant_name = #{applicantName}</if>
+            <if test="applicantGender != null  and applicantGender != ''"> and applicant_gender = #{applicantGender}</if>
+            <if test="applicantHomeaddr != null  and applicantHomeaddr != ''"> and applicant_homeaddr = #{applicantHomeaddr}</if>
+            <if test="applicantPhone != null  and applicantPhone != ''"> and applicant_phone = #{applicantPhone}</if>
+            <if test="applicantGrid != null  and applicantGrid != ''"> and applicant_grid = #{applicantGrid}</if>
+            <if test="applicantDistrict != null  and applicantDistrict != ''"> and applicant_district = #{applicantDistrict}</if>
+            <if test="sceneAddr != null  and sceneAddr != ''"> and scene_addr = #{sceneAddr}</if>
+            <if test="sceneAddrGrid != null  and sceneAddrGrid != ''"> and scene_addr_grid = #{sceneAddrGrid}</if>
+            <if test="sceneDistrict != null  and sceneDistrict != ''"> and scene_district = #{sceneDistrict}</if>
+            <if test="scenePlace != null  and scenePlace != ''"> and scene_place = #{scenePlace}</if>
+            <if test="sceneGeoLat != null "> and scene_geo_lat = #{sceneGeoLat}</if>
+            <if test="sceneGeoLng != null "> and scene_geo_lng = #{sceneGeoLng}</if>
+            <if test="isSecret != null  and isSecret != ''"> and is_secret = #{isSecret}</if>
+            <if test="isRepeat != null  and isRepeat != ''"> and is_repeat = #{isRepeat}</if>
+            <if test="issueType != null  and issueType != ''"> and issue_type = #{issueType}</if>
+            <if test="issueClazz != null  and issueClazz != ''"> and issue_clazz = #{issueClazz}</if>
+            <if test="issueLevel != null  and issueLevel != ''"> and issue_level = #{issueLevel}</if>
+            <if test="deadline != null "> and deadline = #{deadline}</if>
+            <if test="linkOrders != null  and linkOrders != ''"> and link_orders = #{linkOrders}</if>
+            <if test="linkOrdersCode != null  and linkOrdersCode != ''"> and link_orders_code = #{linkOrdersCode}</if>
+            <if test="wikiRef != null  and wikiRef != ''"> and wiki_ref = #{wikiRef}</if>
+            <if test="acptOrgCode != null  and acptOrgCode != ''"> and acpt_org_code = #{acptOrgCode}</if>
+            <if test="acptOrgName != null  and acptOrgName != ''"> and acpt_org_name = #{acptOrgName}</if>
+            <if test="handleWay != null  and handleWay != ''"> and handle_way = #{handleWay}</if>
+            <if test="externalHandleWay != null  and externalHandleWay != ''"> and external_handle_way = #{externalHandleWay}</if>
+            <if test="directFeed != null  and directFeed != ''"> and direct_feed = #{directFeed}</if>
+            <if test="directFeedHandler != null  and directFeedHandler != ''"> and direct_feed_handler = #{directFeedHandler}</if>
+            <if test="directFeedTime != null "> and direct_feed_time = #{directFeedTime}</if>
+            <if test="images != null  and images != ''"> and images = #{images}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="tagApply != null  and tagApply != ''"> and tag_apply = #{tagApply}</if>
+            <if test="tagDelay != null  and tagDelay != ''"> and tag_delay = #{tagDelay}</if>
+            <if test="tagDoing != null  and tagDoing != ''"> and tag_doing = #{tagDoing}</if>
+            <if test="tagResp != null  and tagResp != ''"> and tag_resp = #{tagResp}</if>
+            <if test="tagDone != null  and tagDone != ''"> and tag_done = #{tagDone}</if>
+            <if test="tagCheck != null  and tagCheck != ''"> and tag_check = #{tagCheck}</if>
+            <if test="tagChkTel != null  and tagChkTel != ''"> and tag_chk_tel = #{tagChkTel}</if>
+            <if test="tagRedo != null  and tagRedo != ''"> and tag_redo = #{tagRedo}</if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.java b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.java
new file mode 100644
index 0000000..ba8f26a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.java
@@ -0,0 +1,98 @@
+package org.springblade.modules.eCallEventTwo.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.eCallEventTwo.dto.*;
+import org.springblade.modules.eCallEventTwo.entity.EcOrder;
+
+import java.util.List;
+import java.util.Map;
+
+@DS("slave_1")
+public interface EcOrderMapper extends BaseMapper<EcOrder>{
+		/**
+		 * 查询工单
+		 *
+		 * @param orderId 工单ID
+		 * @return 工单
+		 */
+		public EcOrderDTO selectEcOrderById(Long orderId);
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 工单集合
+	 */
+	public List<EcOrderDTO> selectEcOrderList(EcOrderDTO ecOrderDTO);
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 工单集合
+	 */
+	public int selectEcOrderCount(EcOrderDTO ecOrderDTO);
+
+	/**
+	 * 查询派单
+	 *
+	 * @param ecDispatchDTO 工单ID
+	 * @return 派单
+	 */
+	public int selectEcDispatchCount(EcDispatchDTO ecDispatchDTO);
+
+	/**
+	 * 查询办理单列表
+	 *
+	 * @param ecHandleDTO 办理单
+	 * @return 办理单集合
+	 */
+	public int selectEcHandleCount(EcHandleDTO ecHandleDTO);
+
+	/**
+	 * 查询回访单列表
+	 *
+	 * @param ecOrderCheckDTO 回访单
+	 * @return 回访单集合
+	 */
+	public int selectEcOrderCheckCount(EcOrderCheckDTO ecOrderCheckDTO);
+
+	/**
+	 * 查询办结单列表
+	 *
+	 * @param ecOrderDoneDTO 办结单
+	 * @return 办结单集合
+	 */
+	public int selectEcOrderDoneCount(EcOrderDoneDTO ecOrderDoneDTO);
+
+
+	/**
+	 * 查询答复单列表
+	 *
+	 * @param ecOrderRespDTO 答复单
+	 * @return 答复单集合
+	 */
+	public int selectEcOrderRespCount(EcOrderRespDTO ecOrderRespDTO);
+
+	/**
+	 * 查询核实单列表
+	 *
+	 * @param ecOrderReviewDTO 核实单
+	 * @return 核实单集合
+	 */
+	public int selectEcOrderReviewCount(EcOrderReviewDTO ecOrderReviewDTO);
+
+	/**
+	 * 查询督办单列表
+	 *
+	 * @param ecOrderSuperviseDTO 督办单
+	 * @return 督办单集合
+	 */
+	public int selectEcOrderSuperviseCount(EcOrderSuperviseDTO ecOrderSuperviseDTO);
+
+	List<Map<String, String>> getUnitAssessmentIndicators();
+
+	List<EcOrderDTO> getOrgCode(IPage page, EcOrderParamDTO ecOrderParamDTO);
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.xml b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.xml
new file mode 100644
index 0000000..2077cd3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/mapper/EcOrderMapper.xml
@@ -0,0 +1,599 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.eCallEventTwo.mapper.EcOrderMapper">
+
+    <resultMap type="org.springblade.modules.eCallEventTwo.dto.EcOrderDTO" id="EcOrderDTOResult">
+        <result property="orderId"    column="order_id"    />
+        <result property="orderCode"    column="order_code"    />
+        <result property="issueOrigin"    column="issue_origin"    />
+        <result property="issueTitle"    column="issue_title"    />
+        <result property="issueContent"    column="issue_content"    />
+        <result property="applicantType"    column="applicant_type"    />
+        <result property="applicantName"    column="applicant_name"    />
+        <result property="applicantGender"    column="applicant_gender"    />
+        <result property="applicantHomeaddr"    column="applicant_homeaddr"    />
+        <result property="applicantPhone"    column="applicant_phone"    />
+        <result property="applicantGrid"    column="applicant_grid"    />
+        <result property="applicantDistrict"    column="applicant_district"    />
+        <result property="sceneAddr"    column="scene_addr"    />
+        <result property="sceneAddrGrid"    column="scene_addr_grid"    />
+        <result property="sceneDistrict"    column="scene_district"    />
+        <result property="scenePlace"    column="scene_place"    />
+        <result property="sceneGeoLat"    column="scene_geo_lat"    />
+        <result property="sceneGeoLng"    column="scene_geo_lng"    />
+        <result property="sceneAddrCor"    column="scene_addr_cor"    />
+        <result property="sceneGeoLatCor"    column="scene_geo_lat_cor"    />
+        <result property="sceneGeoLngCor"    column="scene_geo_lng_cor"    />
+        <result property="isSecret"    column="is_secret"    />
+        <result property="isRepeat"    column="is_repeat"    />
+        <result property="issueType"    column="issue_type"    />
+        <result property="issueClazz"    column="issue_clazz"    />
+        <result property="issueLevel"    column="issue_level"    />
+        <result property="deadline"    column="deadline"    />
+        <result property="linkOrders"    column="link_orders"    />
+        <result property="linkOrdersCode"    column="link_orders_code"    />
+        <result property="wikiRef"    column="wiki_ref"    />
+        <result property="acptOrgCode"    column="acpt_org_code"    />
+        <result property="acptOrgName"    column="acpt_org_name"    />
+        <result property="handleWay"    column="handle_way"    />
+        <result property="externalHandleWay"    column="external_handle_way"    />
+        <result property="directFeed"    column="direct_feed"    />
+        <result property="directFeedHandler"    column="direct_feed_handler"    />
+        <result property="directFeedTime"    column="direct_feed_time"    />
+        <result property="images"    column="images"    />
+        <result property="flagVaild"    column="flag_vaild"    />
+        <result property="invalidNote"    column="invalid_note"    />
+        <result property="invalidTime"    column="invalid_time"    />
+        <result property="invalidUserName"    column="invalid_user_name"    />
+        <result property="status"    column="status"    />
+        <result property="tagApply"    column="tag_apply"    />
+        <result property="tagDelay"    column="tag_delay"    />
+        <result property="tagDoing"    column="tag_doing"    />
+        <result property="tagResp"    column="tag_resp"    />
+        <result property="tagDone"    column="tag_done"    />
+        <result property="tagCheck"    column="tag_check"    />
+        <result property="tagChkTel"    column="tag_chk_tel"    />
+        <result property="tagRedo"    column="tag_redo"    />
+    </resultMap>
+
+    <sql id="selectEcOrder">
+    	select
+	        order_id,
+	        order_code,
+	        issue_origin,
+	        issue_title,
+	        issue_content,
+	        applicant_type,
+	        applicant_name,
+	        applicant_gender,
+	        applicant_homeaddr,
+	        applicant_phone,
+	        applicant_grid,
+	        applicant_district,
+	        scene_addr,
+	        scene_addr_grid,
+	        scene_district,
+	        scene_place,
+	        scene_geo_lat,
+	        scene_geo_lng,
+	        scene_addr_cor,
+	        scene_geo_lat_cor,
+	        scene_geo_lng_cor,
+	        is_secret,
+	        is_repeat,
+	        issue_type,
+	        issue_clazz,
+	        issue_level,
+	        deadline,
+	        link_orders,
+	        link_orders_code,
+	        wiki_ref,
+	        acpt_org_code,
+	        acpt_org_name,
+	        handle_way,
+	        external_handle_way,
+	        direct_feed,
+	        direct_feed_handler,
+	        direct_feed_time,
+	        images,
+	        flag_vaild,
+	        invalid_note,
+	        invalid_time,
+	        invalid_user_name,
+	        status,
+	        tag_apply,
+	        tag_delay,
+	        tag_doing,
+	        tag_resp,
+	        tag_done,
+	        tag_check,
+	        tag_chk_tel,
+	        tag_redo
+		from
+        	ec_order
+    </sql>
+
+    <select id="selectEcOrderById" parameterType="long" resultMap="EcOrderDTOResult">
+		<include refid="selectEcOrder"/>
+		where
+        	order_id = #{orderId}
+    </select>
+
+    <select id="selectEcOrderList" parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderDTO" resultMap="EcOrderDTOResult">
+        SELECT
+        *
+        FROM ec_order
+        <where>
+        <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+        </if>
+		<if test="orderId != null "> and order_id = #{orderId}</if>
+		<if test="orderCode != null  and orderCode != ''"> and order_code = #{orderCode}</if>
+		<if test="issueOrigin != null  and issueOrigin != ''"> and issue_origin = #{issueOrigin}</if>
+		<if test="issueTitle != null  and issueTitle != ''"> and issue_title = #{issueTitle}</if>
+		<if test="issueContent != null  and issueContent != ''"> and issue_content = #{issueContent}</if>
+		<if test="applicantType != null  and applicantType != ''"> and applicant_type = #{applicantType}</if>
+		<if test="applicantName != null  and applicantName != ''"> and applicant_name = #{applicantName}</if>
+		<if test="applicantGender != null  and applicantGender != ''"> and applicant_gender = #{applicantGender}</if>
+		<if test="applicantHomeaddr != null  and applicantHomeaddr != ''"> and applicant_homeaddr = #{applicantHomeaddr}</if>
+		<if test="applicantPhone != null  and applicantPhone != ''"> and applicant_phone = #{applicantPhone}</if>
+		<if test="applicantGrid != null  and applicantGrid != ''"> and applicant_grid = #{applicantGrid}</if>
+		<if test="applicantDistrict != null  and applicantDistrict != ''"> and applicant_district = #{applicantDistrict}</if>
+		<if test="sceneAddr != null  and sceneAddr != ''"> and scene_addr = #{sceneAddr}</if>
+            <if test="sceneAddrGrid != null  and sceneAddrGrid != ''">and scene_addr_grid = #{sceneAddrGrid}</if>
+            <if test="sceneDistrict != null  and sceneDistrict != ''">and scene_district = #{sceneDistrict}</if>
+            <if test="scenePlace != null  and scenePlace != ''">and scene_place = #{scenePlace}</if>
+            <if test="sceneGeoLat != null ">and scene_geo_lat = #{sceneGeoLat}</if>
+            <if test="sceneGeoLng != null ">and scene_geo_lng = #{sceneGeoLng}</if>
+            <if test="sceneAddrCor != null  and sceneAddrCor != ''">and scene_addr_cor = #{sceneAddrCor}</if>
+            <if test="sceneGeoLatCor != null ">and scene_geo_lat_cor = #{sceneGeoLatCor}</if>
+            <if test="sceneGeoLngCor != null ">and scene_geo_lng_cor = #{sceneGeoLngCor}</if>
+            <if test="isSecret != null  and isSecret != ''">and is_secret = #{isSecret}</if>
+            <if test="isRepeat != null  and isRepeat != ''">and is_repeat = #{isRepeat}</if>
+            <if test="issueType != null  and issueType != ''">and issue_type = #{issueType}</if>
+            <if test="issueClazz != null  and issueClazz != ''">and issue_clazz = #{issueClazz}</if>
+            <if test="issueLevel != null  and issueLevel != ''">and issue_level = #{issueLevel}</if>
+            <if test="deadline != null ">and deadline = #{deadline}</if>
+            <if test="linkOrders != null  and linkOrders != ''">and link_orders = #{linkOrders}</if>
+            <if test="linkOrdersCode != null  and linkOrdersCode != ''">and link_orders_code = #{linkOrdersCode}</if>
+            <if test="wikiRef != null  and wikiRef != ''">and wiki_ref = #{wikiRef}</if>
+            <if test="acptOrgCode != null  and acptOrgCode != ''">and acpt_org_code = #{acptOrgCode}</if>
+            <if test="acptOrgName != null  and acptOrgName != ''">and acpt_org_name = #{acptOrgName}</if>
+            <if test="handleWay != null  and handleWay != ''">and handle_way = #{handleWay}</if>
+            <if test="externalHandleWay != null  and externalHandleWay != ''">and external_handle_way =
+                #{externalHandleWay}
+            </if>
+            <if test="directFeed != null  and directFeed != ''">and direct_feed = #{directFeed}</if>
+            <if test="directFeedHandler != null  and directFeedHandler != ''">and direct_feed_handler =
+                #{directFeedHandler}
+            </if>
+            <if test="directFeedTime != null ">and direct_feed_time = #{directFeedTime}</if>
+            <if test="images != null  and images != ''">and images = #{images}</if>
+            <if test="flagVaild != null  and flagVaild != ''">and flag_vaild = #{flagVaild}</if>
+            <if test="invalidNote != null  and invalidNote != ''">and invalid_note = #{invalidNote}</if>
+            <if test="invalidTime != null ">and invalid_time = #{invalidTime}</if>
+            <if test="invalidUserName != null  and invalidUserName != ''">and invalid_user_name = #{invalidUserName}
+            </if>
+            <if test="status != null  and status != ''">and status = #{status}</if>
+            <if test="tagApply != null  and tagApply != ''">and tag_apply = #{tagApply}</if>
+            <if test="tagDelay != null  and tagDelay != ''">and tag_delay = #{tagDelay}</if>
+            <if test="tagDoing != null  and tagDoing != ''">and tag_doing = #{tagDoing}</if>
+            <if test="tagResp != null  and tagResp != ''">and tag_resp = #{tagResp}</if>
+            <if test="tagDone != null  and tagDone != ''">and tag_done = #{tagDone}</if>
+            <if test="tagCheck != null  and tagCheck != ''">and tag_check = #{tagCheck}</if>
+            <if test="tagChkTel != null  and tagChkTel != ''">and tag_chk_tel = #{tagChkTel}</if>
+            <if test="tagRedo != null  and tagRedo != ''">and tag_redo = #{tagRedo}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcOrderCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(DISTINCT(eo.order_id))
+        FROM ec_order eo
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+            <if test="orderId != null ">and eo.order_id = #{orderId}</if>
+            <if test="orderCode != null  and orderCode != ''">and eo.order_code = #{orderCode}</if>
+            <if test="issueOrigin != null  and issueOrigin != ''">and eo.issue_origin = #{issueOrigin}</if>
+            <if test="issueTitle != null  and issueTitle != ''">and eo.issue_title = #{issueTitle}</if>
+            <if test="issueContent != null  and issueContent != ''">and eo.issue_content = #{issueContent}</if>
+            <if test="applicantType != null  and applicantType != ''">and eo.applicant_type = #{applicantType}</if>
+            <if test="applicantName != null  and applicantName != ''">and eo.applicant_name = #{applicantName}</if>
+            <if test="applicantGender != null  and applicantGender != ''">and eo.applicant_gender = #{applicantGender}
+            </if>
+            <if test="applicantHomeaddr != null  and applicantHomeaddr != ''">and eo.applicant_homeaddr =
+                #{applicantHomeaddr}
+            </if>
+            <if test="applicantPhone != null  and applicantPhone != ''">and eo.applicant_phone = #{applicantPhone}</if>
+            <if test="applicantGrid != null  and applicantGrid != ''">and eo.applicant_grid = #{applicantGrid}</if>
+            <if test="applicantDistrict != null  and applicantDistrict != ''">and eo.applicant_district =
+                #{applicantDistrict}
+            </if>
+            <if test="sceneAddr != null  and sceneAddr != ''">and eo.scene_addr = #{sceneAddr}</if>
+            <if test="sceneAddrGrid != null  and sceneAddrGrid != ''">and eo.scene_addr_grid = #{sceneAddrGrid}</if>
+            <if test="sceneDistrict != null  and sceneDistrict != ''">and eo.scene_district = #{sceneDistrict}</if>
+            <if test="scenePlace != null  and scenePlace != ''">and eo.scene_place = #{scenePlace}</if>
+            <if test="sceneGeoLat != null ">and eo.scene_geo_lat = #{sceneGeoLat}</if>
+            <if test="sceneGeoLng != null ">and eo.scene_geo_lng = #{sceneGeoLng}</if>
+            <if test="sceneAddrCor != null  and sceneAddrCor != ''">and eo.scene_addr_cor = #{sceneAddrCor}</if>
+            <if test="sceneGeoLatCor != null ">and eo.scene_geo_lat_cor = #{sceneGeoLatCor}</if>
+            <if test="sceneGeoLngCor != null ">and eo.scene_geo_lng_cor = #{sceneGeoLngCor}</if>
+            <if test="isSecret != null  and isSecret != ''">and eo.is_secret = #{isSecret}</if>
+            <if test="isRepeat != null  and isRepeat != ''">and eo.is_repeat = #{isRepeat}</if>
+            <if test="issueType != null  and issueType != ''">and eo.issue_type = #{issueType}</if>
+            <if test="issueClazz != null  and issueClazz != ''">and eo.issue_clazz = #{issueClazz}</if>
+            <if test="issueLevel != null  and issueLevel != ''">and eo.issue_level = #{issueLevel}</if>
+            <if test="deadline != null ">and eo.deadline = #{deadline}</if>
+            <if test="linkOrders != null  and linkOrders != ''">and eo.link_orders = #{linkOrders}</if>
+            <if test="linkOrdersCode != null  and linkOrdersCode != ''">and eo.link_orders_code = #{linkOrdersCode}</if>
+            <if test="wikiRef != null  and wikiRef != ''">and eo.wiki_ref = #{wikiRef}</if>
+            <if test="acptOrgCode != null  and acptOrgCode != ''">and eo.acpt_org_code = #{acptOrgCode}</if>
+            <if test="acptOrgName != null  and acptOrgName != ''">and eo.acpt_org_name = #{acptOrgName}</if>
+            <if test="handleWay != null  and handleWay != ''">and eo.handle_way = #{handleWay}</if>
+            <if test="externalHandleWay != null  and externalHandleWay != ''">and eo.external_handle_way =
+                #{externalHandleWay}
+            </if>
+            <if test="directFeed != null  and directFeed != ''">and eo.direct_feed = #{directFeed}</if>
+            <if test="directFeedHandler != null  and directFeedHandler != ''">and eo.direct_feed_handler =
+                #{directFeedHandler}
+            </if>
+            <if test="directFeedTime != null ">and eo.direct_feed_time = #{directFeedTime}</if>
+            <if test="images != null  and images != ''">and eo.images = #{images}</if>
+            <if test="flagVaild != null  and flagVaild != ''">and eo.flag_vaild = #{flagVaild}</if>
+            <if test="invalidNote != null  and invalidNote != ''">and eo.invalid_note = #{invalidNote}</if>
+            <if test="invalidTime != null ">and eo.invalid_time = #{invalidTime}</if>
+            <if test="invalidUserName != null  and invalidUserName != ''">and eo.invalid_user_name = #{invalidUserName}
+            </if>
+            <if test="status != null  and status != ''">and eo.status = #{status}</if>
+            <if test="tagApply != null  and tagApply != ''">and eo.tag_apply = #{tagApply}</if>
+            <if test="tagDelay != null  and tagDelay != ''">and eo.tag_delay = #{tagDelay}</if>
+            <if test="tagDoing != null  and tagDoing != ''">and eo.tag_doing = #{tagDoing}</if>
+            <if test="tagResp != null  and tagResp != ''">and eo.tag_resp = #{tagResp}</if>
+            <if test="tagDone != null  and tagDone != ''">and eo.tag_done = #{tagDone}</if>
+            <if test="tagCheck != null  and tagCheck != ''">and eo.tag_check = #{tagCheck}</if>
+            <if test="tagChkTel != null  and tagChkTel != ''">and eo.tag_chk_tel = #{tagChkTel}</if>
+            <if test="tagRedo != null  and tagRedo != ''">and eo.tag_redo = #{tagRedo}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcDispatchCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcDispatchDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(1)
+        FROM
+        ec_dispatch ed
+        LEFT JOIN ec_order eo ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and ed.dispatch_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+            <if test="dispatchId != null ">and dispatch_id = #{dispatchId}</if>
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="dispatchCode != null  and dispatchCode != ''">and dispatch_code = #{dispatchCode}</if>
+            <if test="dispatchTime != null ">and dispatch_time = #{dispatchTime}</if>
+            <if test="dispatchNote != null  and dispatchNote != ''">and dispatch_note = #{dispatchNote}</if>
+            <if test="dispatchImages != null  and dispatchImages != ''">and dispatch_images = #{dispatchImages}</if>
+            <if test="subjectOrgCode != null  and subjectOrgCode != ''">and subject_org_code = #{subjectOrgCode}</if>
+            <if test="subjectOrgName != null  and subjectOrgName != ''">and subject_org_name = #{subjectOrgName}</if>
+            <if test="subjectUserName != null  and subjectUserName != ''">and subject_user_name = #{subjectUserName}
+            </if>
+            <if test="subjectUserCnname != null  and subjectUserCnname != ''">and subject_user_cnname =
+                #{subjectUserCnname}
+            </if>
+            <if test="objectOrgCode != null  and objectOrgCode != ''">and object_org_code = #{objectOrgCode}</if>
+            <if test="objectOrgName != null  and objectOrgName != ''">and object_org_name = #{objectOrgName}</if>
+            <if test="sinkOrgCode != null  and sinkOrgCode != ''">and sink_org_code = #{sinkOrgCode}</if>
+            <if test="sinkOrgName != null  and sinkOrgName != ''">and sink_org_name = #{sinkOrgName}</if>
+            <if test="tagMain != null  and tagMain != ''">and tag_main = #{tagMain}</if>
+            <if test="tagCc != null  and tagCc != ''">and tag_cc = #{tagCc}</if>
+            <if test="tagCti != null  and tagCti != ''">and tag_cti = #{tagCti}</if>
+            <if test="tagTrans != null  and tagTrans != ''">and tag_trans = #{tagTrans}</if>
+            <if test="upDispatchId != null ">and up_dispatch_id = #{upDispatchId}</if>
+            <if test="ackOrgCode != null  and ackOrgCode != ''">and ack_org_code = #{ackOrgCode}</if>
+            <if test="ackOrgName != null  and ackOrgName != ''">and ack_org_name = #{ackOrgName}</if>
+            <if test="ackUserName != null  and ackUserName != ''">and ack_user_name = #{ackUserName}</if>
+            <if test="ackUserCnname != null  and ackUserCnname != ''">and ack_user_cnname = #{ackUserCnname}</if>
+            <if test="ackTime != null ">and ack_time = #{ackTime}</if>
+            <if test="rejectUserName != null  and rejectUserName != ''">and reject_user_name = #{rejectUserName}</if>
+            <if test="rejectUserCnname != null  and rejectUserCnname != ''">and reject_user_cnname =
+                #{rejectUserCnname}
+            </if>
+            <if test="rejectOrgCode != null  and rejectOrgCode != ''">and reject_org_code = #{rejectOrgCode}</if>
+            <if test="rejectOrgName != null  and rejectOrgName != ''">and reject_org_name = #{rejectOrgName}</if>
+            <if test="rejectTime != null ">and reject_time = #{rejectTime}</if>
+            <if test="rejectNote != null  and rejectNote != ''">and reject_note = #{rejectNote}</if>
+            <if test="rejectImages != null  and rejectImages != ''">and reject_images = #{rejectImages}</if>
+            <if test="tagReject != null  and tagReject != ''">and tag_reject = #{tagReject}</if>
+            <if test="rejectType != null  and rejectType != ''">and reject_type = #{rejectType}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcHandleCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcHandleDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(DISTINCT(ehd.uid))
+        FROM
+        ec_handle_doing ehd
+        LEFT JOIN ec_handle eh ON ehd.order_id = eh.order_id
+        LEFT JOIN ec_order eo ON eh.order_id = eo.order_id
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and ehd.biz_time BETWEEN #{startTime} AND
+                #{endTime}
+            </if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+            <if test="handleId != null ">and handle_id = #{handleId}</if>
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="dispatchId != null ">and dispatch_id = #{dispatchId}</if>
+            <if test="handleCode != null  and handleCode != ''">and handle_code = #{handleCode}</if>
+            <if test="hdlOrgCode != null  and hdlOrgCode != ''">and hdl_org_code = #{hdlOrgCode}</if>
+            <if test="hdlOrgName != null  and hdlOrgName != ''">and hdl_org_name = #{hdlOrgName}</if>
+            <if test="arriveLoc != null  and arriveLoc != ''">and arrive_loc = #{arriveLoc}</if>
+            <if test="arriveLocLat != null ">and arrive_loc_lat = #{arriveLocLat}</if>
+            <if test="arriveLocLng != null ">and arrive_loc_lng = #{arriveLocLng}</if>
+            <if test="arriveBizTime != null ">and arrive_biz_time = #{arriveBizTime}</if>
+            <if test="remoteHdlTime != null ">and remote_hdl_time = #{remoteHdlTime}</if>
+            <if test="remoteHdlNote != null  and remoteHdlNote != ''">and remote_hdl_note = #{remoteHdlNote}</if>
+            <if test="remoteHdlImages != null  and remoteHdlImages != ''">and remote_hdl_images = #{remoteHdlImages}
+            </if>
+            <if test="nosopHdlNote != null  and nosopHdlNote != ''">and nosop_hdl_note = #{nosopHdlNote}</if>
+            <if test="nosopHdlImages != null  and nosopHdlImages != ''">and nosop_hdl_images = #{nosopHdlImages}</if>
+            <if test="limitTime != null ">and limit_time = #{limitTime}</if>
+            <if test="delayTime != null ">and delay_time = #{delayTime}</if>
+            <if test="tagHdlDoing != null  and tagHdlDoing != ''">and tag_hdl_doing = #{tagHdlDoing}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcOrderCheckCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderCheckDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(
+        DISTINCT ( eoct.uid ))
+        FROM
+        ec_order_check_tel eoct
+        LEFT JOIN ec_order_check eoc ON eoct.order_id = eoc.order_id
+        LEFT JOIN ec_order eo ON eoc.order_id = eo.order_id
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoci on eoci.order_id = eo.order_id
+        <where>
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and eoct.chk_time BETWEEN #{startTime} AND #{endTime}</if>
+            <if test="startTime != null and endTime != null">and eoci.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="checkCode != null  and checkCode != ''">and check_code = #{checkCode}</if>
+            <if test="checkOrgCode != null  and checkOrgCode != ''">and check_org_code = #{checkOrgCode}</if>
+            <if test="checkOrgName != null  and checkOrgName != ''">and check_org_name = #{checkOrgName}</if>
+            <if test="limitStartTime != null ">and limit_start_time = #{limitStartTime}</if>
+            <if test="limitEndTime != null ">and limit_end_time = #{limitEndTime}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcOrderDoneCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderDoneDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(
+        DISTINCT ( eodl.uid ))
+        FROM
+        ec_order_done_log eodl
+        LEFT JOIN ec_order_done eod ON eod.order_id = eodl.order_id
+        LEFT JOIN ec_order eo ON eod.order_id = eo.order_id
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and eodl.in_audit_time BETWEEN #{startTime} AND
+                #{endTime}
+            </if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="doneCode != null  and doneCode != ''">and done_code = #{doneCode}</if>
+            <if test="firstDoneApplyTime != null ">and first_done_apply_time = #{firstDoneApplyTime}</if>
+            <if test="firstDoneAuditYesTime != null ">and first_done_audit_yes_time = #{firstDoneAuditYesTime}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcOrderRespCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderRespDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(
+        DISTINCT ( eorl.uid ))
+        FROM
+        ec_order_resp_log eorl
+        LEFT JOIN ec_order_resp eor ON eorl.order_id = eor.order_id
+        LEFT JOIN ec_order eo ON eor.order_id = eo.order_id
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and eorl.audit_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="respCode != null  and respCode != ''">and resp_code = #{respCode}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcOrderReviewCount" parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderReviewDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(DISTINCT(eo.order_id))
+        FROM
+        ec_order_review eor
+        LEFT JOIN ec_order eo on eor.order_id = eo.order_id
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and eor.review_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="reviewCode != null  and reviewCode != ''">and review_code = #{reviewCode}</if>
+            <if test="orderCode != null  and orderCode != ''">and order_code = #{orderCode}</if>
+            <if test="telChkId != null ">and tel_chk_id = #{telChkId}</if>
+            <if test="reviewTime != null ">and review_time = #{reviewTime}</if>
+            <if test="reviewUserCnname != null  and reviewUserCnname != ''">and review_user_cnname =
+                #{reviewUserCnname}
+            </if>
+            <if test="reviewUserName != null  and reviewUserName != ''">and review_user_name = #{reviewUserName}</if>
+            <if test="reviewUserPhone != null  and reviewUserPhone != ''">and review_user_phone = #{reviewUserPhone}
+            </if>
+            <if test="reviewOrgCode != null  and reviewOrgCode != ''">and review_org_code = #{reviewOrgCode}</if>
+            <if test="reviewOrgName != null  and reviewOrgName != ''">and review_org_name = #{reviewOrgName}</if>
+            <if test="reviewIssuer != null  and reviewIssuer != ''">and review_issuer = #{reviewIssuer}</if>
+            <if test="reviewIssuerPhone != null  and reviewIssuerPhone != ''">and review_issuer_phone =
+                #{reviewIssuerPhone}
+            </if>
+            <if test="reviewNote != null  and reviewNote != ''">and review_note = #{reviewNote}</if>
+            <if test="reviewYesno != null  and reviewYesno != ''">and review_yesno = #{reviewYesno}</if>
+            <if test="reviewImages != null  and reviewImages != ''">and review_images = #{reviewImages}</if>
+            <if test="ctiVoiceRecordId != null  and ctiVoiceRecordId != ''">and cti_voice_record_id =
+                #{ctiVoiceRecordId}
+            </if>
+            <if test="ctiVoiceRecordUrl != null  and ctiVoiceRecordUrl != ''">and cti_voice_record_url =
+                #{ctiVoiceRecordUrl}
+            </if>
+            <if test="redoOrgCode != null  and redoOrgCode != ''">and redo_org_code = #{redoOrgCode}</if>
+            <if test="redoOrgName != null  and redoOrgName != ''">and redo_org_name = #{redoOrgName}</if>
+            <if test="redoUserName != null  and redoUserName != ''">and redo_user_name = #{redoUserName}</if>
+            <if test="redoUserCnname != null  and redoUserCnname != ''">and redo_user_cnname = #{redoUserCnname}</if>
+            <if test="redoTime != null ">and redo_time = #{redoTime}</if>
+            <if test="redoNote != null  and redoNote != ''">and redo_note = #{redoNote}</if>
+            <if test="redoImages != null  and redoImages != ''">and redo_images = #{redoImages}</if>
+        </where>
+    </select>
+
+
+    <select id="selectEcOrderSuperviseCount"
+            parameterType="org.springblade.modules.eCallEventTwo.dto.EcOrderSuperviseDTO"
+            resultType="java.lang.Integer">
+        SELECT
+        COUNT(DISTINCT(eo.order_id))
+        FROM
+        ec_order_supervise eos
+        LEFT JOIN ec_order eo on eos.order_id = eo.order_id
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc on eoc.order_id = eo.order_id
+        <where>
+            <if test="tagMain != null and tagMain != ''">and ed.tag_main = #{tagMain}</if>
+            <if test="subjectOrgCode != null and subjectOrgCode != ''">and ed.subject_org_code = #{subjectOrgCode}</if>
+            <if test="sinkOrgCode != null and sinkOrgCode != ''">and ed.sink_org_code = #{sinkOrgCode}</if>
+            <if test="startTime != null and endTime != null">and eos.supervise_time BETWEEN #{startTime} AND
+                #{endTime}
+            </if>
+            <if test="startTime != null and endTime != null">and eoc.callin_time BETWEEN #{startTime} AND #{endTime}
+            </if>
+
+
+            <if test="orderId != null ">and order_id = #{orderId}</if>
+            <if test="superviseCode != null  and superviseCode != ''">and supervise_code = #{superviseCode}</if>
+            <if test="orderCode != null  and orderCode != ''">and order_code = #{orderCode}</if>
+            <if test="telChkId != null ">and tel_chk_id = #{telChkId}</if>
+            <if test="superviseTime != null ">and supervise_time = #{superviseTime}</if>
+            <if test="supervisorName != null  and supervisorName != ''">and supervisor_name = #{supervisorName}</if>
+            <if test="supervisorCnname != null  and supervisorCnname != ''">and supervisor_cnname =
+                #{supervisorCnname}
+            </if>
+            <if test="superviseNote != null  and superviseNote != ''">and supervise_note = #{superviseNote}</if>
+            <if test="superviseImages != null  and superviseImages != ''">and supervise_images = #{superviseImages}</if>
+            <if test="supervisorOrgCode != null  and supervisorOrgCode != ''">and supervisor_org_code =
+                #{supervisorOrgCode}
+            </if>
+            <if test="supervisorOrgName != null  and supervisorOrgName != ''">and supervisor_org_name =
+                #{supervisorOrgName}
+            </if>
+            <if test="redoOrgCode != null  and redoOrgCode != ''">and redo_org_code = #{redoOrgCode}</if>
+            <if test="redoOrgName != null  and redoOrgName != ''">and redo_org_name = #{redoOrgName}</if>
+            <if test="redoUserName != null  and redoUserName != ''">and redo_user_name = #{redoUserName}</if>
+            <if test="redoUserCnname != null  and redoUserCnname != ''">and redo_user_cnname = #{redoUserCnname}</if>
+            <if test="redoTime != null ">and redo_time = #{redoTime}</if>
+            <if test="redoNote != null  and redoNote != ''">and redo_note = #{redoNote}</if>
+            <if test="redoImages != null  and redoImages != ''">and redo_images = #{redoImages}</if>
+        </where>
+    </select>
+
+
+    <select id="getUnitAssessmentIndicators" resultType="java.util.Map">
+        select *
+        from `v_statistics_examine_2`
+
+    </select>
+
+
+    <select id="getOrgCode" resultType="org.springblade.modules.eCallEventTwo.dto.EcOrderDTO">
+        SELECT
+        ed.subject_org_code,ed.subject_org_name,ed.sink_org_code,ed.sink_org_name
+        FROM
+        ec_order eo
+        LEFT JOIN ec_dispatch ed ON eo.order_id = ed.order_id
+        LEFT JOIN ec_order_cti eoc ON eoc.order_id = eo.order_id
+        <where>
+            <if test="ecOrderParamDTO.tagMain != null and ecOrderParamDTO.tagMain != '' ">
+                and ed.tag_main = #{ecOrderParamDTO.tagMain}
+                <if test="ecOrderParamDTO.mainFlag != null and ecOrderParamDTO.mainFlag == 2">
+                    <if test="ecOrderParamDTO.subjectOrgName != null and ecOrderParamDTO.subjectOrgName != ''">
+                        and ed.subject_org_name like concat('%',#{ecOrderParamDTO.subjectOrgName},'%')
+                    </if>
+                    GROUP BY ed.subject_org_code
+                </if>
+                <if test="ecOrderParamDTO.mainFlag != null and ecOrderParamDTO.mainFlag == 1">
+                    <if test="ecOrderParamDTO.sinkOrgName != null and ecOrderParamDTO.sinkOrgName != ''">
+                        and ed.sink_org_name like concat('%',#{ecOrderParamDTO.sinkOrgName},'%')
+                    </if>
+                    GROUP BY ed.sink_org_code
+                </if>
+
+            </if>
+        </where>
+
+
+    </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/service/EcOrderService.java b/src/main/java/org/springblade/modules/eCallEventTwo/service/EcOrderService.java
new file mode 100644
index 0000000..46c2615
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/service/EcOrderService.java
@@ -0,0 +1,90 @@
+package org.springblade.modules.eCallEventTwo.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.eCallEventTwo.dto.EcOrderDTO;
+import org.springblade.modules.eCallEventTwo.dto.EcOrderParamDTO;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.entity.EcOrder;
+import org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * EcOrderService接口
+ *
+ * @author ${context.author}
+ * @date 2024-05-27 16:26:59
+ */
+public interface EcOrderService extends IService<EcOrder> {
+	/**
+	 * 查询工单
+	 *
+	 * @param orderId 工单ID
+	 * @return 工单
+	 */
+	public EcOrderDTO selectEcOrderById(Long orderId);
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 工单集合
+	 */
+	public List<EcOrderDTO> selectEcOrderList(EcOrderDTO ecOrderDTO);
+
+	/**
+	 * 新增工单
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 结果
+	 */
+	public int insertEcOrder(EcOrderDTO ecOrderDTO);
+
+	/**
+	 * 修改工单
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 结果
+	 */
+	public int updateEcOrder(EcOrderDTO ecOrderDTO);
+
+	/**
+	 * 批量删除工单
+	 *
+	 * @param ids 需要删除的数据ID
+	 * @return 结果
+	 */
+	public int deleteEcOrderByIds(String ids);
+
+	/**
+	 * 删除工单信息
+	 *
+	 * @param orderId 工单ID
+	 * @return 结果
+	 */
+	public int deleteEcOrderById(Long orderId);
+
+	boolean SynchronizeData(EcOrderParamDTO ecOrderParamDTO);
+
+	/**
+	 * 批量同步工单
+	 * @param recordEntityList
+	 * @return
+	 */
+	public boolean saveEcOrder(List<ECallEventTwoEntity> recordEntityList);
+
+	/**
+	 * 单位考核指标
+	 * @return
+	 */
+	List<Map<String, String>> getUnitAssessmentIndicators();
+
+	/**
+	 * 统计工单
+	 * @param ecOrderParamDTO
+	 * @return
+	 */
+	IPage<EcOrderDTO> getCount(IPage<EcOrderDTO> page, EcOrderParamDTO ecOrderParamDTO);
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/service/IECallEventTwoService.java b/src/main/java/org/springblade/modules/eCallEventTwo/service/IECallEventTwoService.java
new file mode 100644
index 0000000..c4b583c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/service/IECallEventTwoService.java
@@ -0,0 +1,62 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.eCallEventTwo.dto.ECallEventTwoDTO;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 工单 服务类
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+public interface IECallEventTwoService extends IService<ECallEventTwoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param eCallEventTwo
+	 * @return
+	 */
+	IPage<ECallEventTwoVO> selectECallEventTwoPage(IPage<ECallEventTwoVO> page, ECallEventTwoVO eCallEventTwo);
+
+	/**
+	 * 查询工单
+	 *
+	 * @param orderId 工单ID
+	 * @return 工单
+	 */
+	public ECallEventTwoDTO selectECallEventTwoById(Long orderId);
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param eCallEventTwoDTO 工单
+	 * @return 工单集合
+	 */
+	public List<ECallEventTwoDTO> selectECallEventTwoList(ECallEventTwoDTO eCallEventTwoDTO);
+
+	boolean saveTwo(ECallEventTwoVO eCallEventTwo);
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcCallEventTwoServiceImpl.java b/src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcCallEventTwoServiceImpl.java
new file mode 100644
index 0000000..a4adf87
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcCallEventTwoServiceImpl.java
@@ -0,0 +1,144 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.param.GridSet;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.eCallEventTwo.dto.ECallEventTwoDTO;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.mapper.EcCallEventTwoMapper;
+import org.springblade.modules.eCallEventTwo.service.IECallEventTwoService;
+import org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO;
+import org.springblade.modules.system.entity.Dept;
+import org.springblade.modules.system.service.IDeptService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * 工单 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+@Service
+public class EcCallEventTwoServiceImpl extends ServiceImpl<EcCallEventTwoMapper, ECallEventTwoEntity> implements IECallEventTwoService {
+	@Autowired
+	private IDeptService deptService;
+
+	@Override
+	public IPage<ECallEventTwoVO> selectECallEventTwoPage(IPage<ECallEventTwoVO> page, ECallEventTwoVO eCallEventTwo) {
+
+		// 公共参数设置
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(ECallEventTwoVO.class, eCallEventTwo);
+		// 如果是委办局,直接设置成管理角色
+		if(AuthUtil.getUserRole().equals("wbj")){
+			commonParamSet.setIsAdministrator(1);
+		}
+		// 返回
+		List<ECallEventTwoVO> eCallEventTwoVOS = baseMapper.selectECallEventTwoPage(page,
+			eCallEventTwo,
+			commonParamSet.getGridCodeList(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getIsAdministrator());
+		return page.setRecords(eCallEventTwoVOS);
+	}
+
+
+	/**
+	 * 查询工单
+	 *
+	 * @param orderId 工单ID
+	 * @return 工单
+	 */
+	@Override
+	public ECallEventTwoDTO selectECallEventTwoById(Long orderId) {
+		return this.baseMapper.selectECallEventTwoById(orderId);
+	}
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param eCallEventTwoDTO 工单
+	 * @return 工单集合
+	 */
+	@Override
+	public List<ECallEventTwoDTO> selectECallEventTwoList(ECallEventTwoDTO eCallEventTwoDTO) {
+		return this.baseMapper.selectECallEventTwoList(eCallEventTwoDTO);
+	}
+
+	@Override
+	public boolean saveTwo(ECallEventTwoVO eCallEventTwo) {
+		eCallEventTwo.setLat(eCallEventTwo.getSceneGeoLat().toString());
+		eCallEventTwo.setLng(eCallEventTwo.getSceneGeoLng().toString());
+		// 设置工单号
+		eCallEventTwo.setOrderCode(getOrderCode());
+		// 计算网格
+		if (eCallEventTwo.getLng() != null && eCallEventTwo.getLat() != null) {
+			// 点落面计算警格,网格,警格
+			GridSet invoke = new GridSet().invoke(ECallEventTwoVO.class, eCallEventTwo,
+				"lng", "lat", "applicantGrid", "jwGridCode");
+		}
+		return save(eCallEventTwo);
+	}
+
+	/**
+	 * 获取工单号
+	 * @return
+	 */
+	private String getOrderCode() {
+		String deptId1 = AuthUtil.getDeptId();
+		Dept dept = deptService.getOne(Wrappers.<Dept>lambdaQuery().eq(Dept::getId, deptId1));
+		// 生成工单号:
+		// 话务行政区划、编号类型、来电时间、来源渠道、流水号6	361100-00-202402131524-01-123456
+		// 行政区划
+		String deptId = dept.getSort().toString();
+		// 编号类型
+		String no = "00";
+		// 时间
+		String dateStr = getDateStr();
+		// 来源渠道
+		int sort = dept.getSort();
+		String source = String.format("%02d", sort);
+
+		// 流水号6位
+		String serial = getSerialStr();
+
+		String orderCode = "361100" + "-" + no + "-" + dateStr + "-" + source + "-" + serial;
+		return orderCode;
+	}
+
+	private String getSerialStr() {
+		Random random = new Random();
+		int sixDigitNumber = random.nextInt(900000) + 100000; // 生成100000到999999之间的随机数
+		return String.valueOf(sixDigitNumber);
+	}
+
+	private String getDateStr() {
+		LocalDateTime now = LocalDateTime.now();
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
+		return now.format(formatter);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcOrderServiceImpl.java b/src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcOrderServiceImpl.java
new file mode 100644
index 0000000..24a7fc0
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/service/impl/EcOrderServiceImpl.java
@@ -0,0 +1,326 @@
+package org.springblade.modules.eCallEventTwo.service.impl;
+
+import cn.hutool.core.convert.Convert;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import liquibase.repackaged.org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.eCallEventTwo.dto.*;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.entity.EcOrder;
+import org.springblade.modules.eCallEventTwo.mapper.EcOrderMapper;
+import org.springblade.modules.eCallEventTwo.service.EcOrderService;
+import org.springblade.modules.eCallEventTwo.service.IECallEventTwoService;
+import org.springblade.modules.grid.entity.GridEntity;
+import org.springblade.modules.grid.service.IGridService;
+import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
+import org.springblade.modules.police.service.IPoliceAffairsGridService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * EcOrderService业务层处理
+ *
+ * @author ${context.author}
+ * @date 2024-05-27 16:26:59
+ */
+@Service
+public class EcOrderServiceImpl extends ServiceImpl<EcOrderMapper, EcOrder> implements EcOrderService {
+
+	private static final int DEFAULT_SCALE = 2; // 默认保留两位小数
+	private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP; // 默认四舍五入
+	@Autowired
+	private IECallEventTwoService ecOrderService;
+
+	protected static final Logger log = LoggerFactory.getLogger(EcOrderServiceImpl.class);
+	/**
+	 * 查询工单
+	 *
+	 * @param orderId 工单ID
+	 * @return 工单
+	 */
+	@Override
+	public EcOrderDTO selectEcOrderById(Long orderId) {
+		return this.baseMapper.selectEcOrderById(orderId);
+	}
+
+	/**
+	 * 查询工单列表
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 工单集合
+	 */
+	@Override
+	public List<EcOrderDTO> selectEcOrderList(EcOrderDTO ecOrderDTO) {
+		return this.baseMapper.selectEcOrderList(ecOrderDTO);
+	}
+
+	/**
+	 * 新增工单
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 结果
+	 */
+	@Override
+	public int insertEcOrder(EcOrderDTO ecOrderDTO) {
+		return this.baseMapper.insert(ecOrderDTO);
+	}
+
+	/**
+	 * 修改工单
+	 *
+	 * @param ecOrderDTO 工单
+	 * @return 结果
+	 */
+	@Override
+	public int updateEcOrder(EcOrderDTO ecOrderDTO) {
+		return this.baseMapper.updateById(ecOrderDTO);
+	}
+
+	/**
+	 * 删除工单对象
+	 *
+	 * @param ids 需要删除的数据ID
+	 * @return 结果
+	 */
+	@Override
+	public int deleteEcOrderByIds(String ids) {
+		return this.removeByIds(Arrays.asList(Convert.toStrArray(ids))) ? 1 : 0;
+	}
+
+	/**
+	 * 删除工单信息
+	 *
+	 * @param orderId 工单ID
+	 * @return 结果
+	 */
+	@Override
+	public int deleteEcOrderById(Long orderId) {
+		return this.removeById(orderId) ? 1 : 0;
+	}
+
+	@Override
+	public boolean SynchronizeData(EcOrderParamDTO ecOrderParamDTO) {
+		processPages(100, ecOrderParamDTO);
+		return true;
+	}
+
+	public void processPages(int pageSize, EcOrderParamDTO ecOrderParamDTO) {
+		QueryWrapper<EcOrder> ecOrderQueryWrapper = new QueryWrapper<>();
+		if (StringUtils.isNotBlank(ecOrderParamDTO.getStartTime()) && StringUtils.isNotEmpty(ecOrderParamDTO.getEndTime())) {
+			ecOrderQueryWrapper.between("import_time", ecOrderParamDTO.getStartTime(), ecOrderParamDTO.getEndTime());
+		}
+		// System.out.println("**********参数**************************" + JSON.toJSONString(ecOrderParamDTO));
+		long count = count(ecOrderQueryWrapper);
+		System.out.println("**********总数**************************" + count);
+		int totalPages = (int) Math.ceil((double) count / pageSize); // 计算总页数
+
+		for (int pageNum = 1; pageNum <= totalPages; pageNum++) {
+			Page<EcOrder> page = new Page<>(pageNum, pageSize);
+			IPage<EcOrder> resultPage = baseMapper.selectPage(page, ecOrderQueryWrapper);
+			List<EcOrder> records = resultPage.getRecords();
+			List<ECallEventTwoEntity> recordEntityList = BeanUtil.copy(records, ECallEventTwoEntity.class);
+			List<ECallEventTwoEntity> addList = new ArrayList<>();
+			List<ECallEventTwoEntity> updateList = new ArrayList<>();
+			// 过滤出已同步的订单
+			recordEntityList.forEach(record -> {
+				long count1 = ecOrderService.count(Wrappers.<ECallEventTwoEntity>lambdaQuery().eq(ECallEventTwoEntity::getOrderCode, record.getOrderCode()));
+				if (count1 == 0) {
+					setGridInfo(record);
+					addList.add(record);
+				} else {
+					setGridInfo(record);
+					updateList.add(record);
+				}
+			});
+			// 同步订单
+			boolean b = false;
+			if (addList.size() > 0) {
+				b = ecOrderService.saveBatch(addList);
+			}
+			if (updateList.size() > 0) {
+				b = ecOrderService.saveOrUpdateBatch(updateList);
+			}
+			System.out.println("更新第" + pageNum + "页" + b);
+		}
+	}
+
+	@Override
+	@DS("master")
+	public boolean saveEcOrder(List<ECallEventTwoEntity> recordEntityList) {
+		return false;
+	}
+
+
+	/**
+	 * 设置警格网格信息
+	 *
+	 * @param ecOrderEntity
+	 */
+	public void setGridInfo(ECallEventTwoEntity ecOrderEntity) {
+		try {
+			if (ecOrderEntity.getSceneGeoLng() == null || ecOrderEntity.getSceneGeoLat() == null) {
+				return;
+			}
+			// 根据位置设置网格,警格编号
+			IGridService gridService = SpringUtils.getBean(IGridService.class);
+			IPoliceAffairsGridService policeAffairsGridService = SpringUtils.getBean(IPoliceAffairsGridService.class);
+			String point = "'POINT(" + ecOrderEntity.getSceneGeoLng().toString() + " " + ecOrderEntity.getSceneGeoLat().toString() + ")'";
+			// 点坐标解析网格
+			List<GridEntity> gridEntityList = gridService.spatialAnalysis(point);
+			if (gridEntityList.size() > 0) {
+				GridEntity gridEntity = gridEntityList.get(0);
+				ecOrderEntity.setGridCode(gridEntity.getGridCode());
+			}
+			// 点坐标解析警格
+			List<PoliceAffairsGridEntity> policeAffairsGridEntityList = policeAffairsGridService.spatialAnalysis(point);
+			if (policeAffairsGridEntityList.size() > 0) {
+				PoliceAffairsGridEntity policeAffairsGridEntity = policeAffairsGridEntityList.get(0);
+				ecOrderEntity.setJwGridCode(policeAffairsGridEntity.getJwGridCode());
+			}
+		} catch (Exception e) {
+			System.out.println("获取警格网格信息失败" + e);
+		}
+	}
+
+	/**
+	 * 获取单位考核指标
+	 *
+	 * @return
+	 */
+	@Override
+	public List<Map<String, String>> getUnitAssessmentIndicators() {
+		List<Map<String, String>> result = baseMapper.getUnitAssessmentIndicators();
+		return result;
+	}
+
+
+	/**
+	 * 统计办结率
+	 */
+	@Override
+	public IPage<EcOrderDTO> getCount(IPage<EcOrderDTO> page, EcOrderParamDTO ecOrderParamDTO) {
+		// acpt_org_code
+		List<EcOrderDTO> result = baseMapper.getOrgCode(page, ecOrderParamDTO);
+		for (EcOrderDTO ecOrderDTO : result) {
+			if (ecOrderParamDTO.getTagMain().equals("Y")) {
+				ecOrderParamDTO.setSinkOrgCode(ecOrderDTO.getSinkOrgCode());
+			} else {
+				ecOrderParamDTO.setSubjectOrgCode(ecOrderDTO.getSubjectOrgCode());
+			}
+			// 统计办结率
+			buildRate(ecOrderParamDTO, ecOrderDTO);
+			// 获取单位名称
+			if (ecOrderParamDTO.getTagMain().equals("Y")) {
+				ecOrderDTO.setOrgCode(ecOrderDTO.getSinkOrgCode());
+				ecOrderDTO.setOrgName(ecOrderDTO.getSinkOrgName());
+			} else {
+				ecOrderDTO.setOrgCode(ecOrderDTO.getSubjectOrgCode());
+				ecOrderDTO.setOrgName(ecOrderDTO.getSubjectOrgName());
+			}
+		}
+		return page.setRecords(result);
+	}
+
+	@NotNull
+	private void buildRate(EcOrderParamDTO ecOrderParamDTO, EcOrderDTO ecOrder) {
+		// 统计订单
+		EcOrderDTO ecOrderDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderDTO.class);
+		int i = baseMapper.selectEcOrderCount(ecOrderDTO);
+		// 统计派发
+		EcDispatchDTO ecDispatchDTO = BeanUtil.copy(ecOrderParamDTO, EcDispatchDTO.class);
+		int i1 = baseMapper.selectEcDispatchCount(ecDispatchDTO);
+		// 统计处理
+		EcHandleDTO ecHandleDTO = BeanUtil.copy(ecOrderParamDTO, EcHandleDTO.class);
+		int i2 = baseMapper.selectEcHandleCount(ecHandleDTO);
+		// 统计回访
+		EcOrderCheckDTO ecOrderCheckDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderCheckDTO.class);
+		int i3 = baseMapper.selectEcOrderCheckCount(ecOrderCheckDTO);
+		// 统计办结
+		EcOrderDoneDTO ecOrderDoneDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderDoneDTO.class);
+		int i4 = baseMapper.selectEcOrderDoneCount(ecOrderDoneDTO);
+		// 统计答复
+		EcOrderRespDTO ecOrderRespDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderRespDTO.class);
+		int i5 = baseMapper.selectEcOrderRespCount(ecOrderRespDTO);
+		// 统计核实
+		EcOrderReviewDTO ecOrderReviewDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderReviewDTO.class);
+		int i6 = baseMapper.selectEcOrderReviewCount(ecOrderReviewDTO);
+		// 统计督办
+		EcOrderSuperviseDTO ecOrderSuperviseDTO = BeanUtil.copy(ecOrderParamDTO, EcOrderSuperviseDTO.class);
+		int i7 = baseMapper.selectEcOrderSuperviseCount(ecOrderSuperviseDTO);
+		// 工单数	派发单数	办理单数(率)	办结单数(率)	答复单数(率)	回访单数(率)	核实单数	督办单数
+		// Map<String, String> result = new HashMap<>();
+		// 工单数
+		// result.put("orderNumber", String.valueOf(i));
+		ecOrder.setOrderNumber(String.valueOf(i));
+		// 派发单数(率)
+		// result.put("dispatchRate", getRate(i1, i));
+		ecOrder.setDispatchRate(getRate(i1, i));
+		// result.put("dispatchNumber", String.valueOf(i1));
+		ecOrder.setDispatchNumber(String.valueOf(i1));
+		// 办理单数(率)
+		// result.put("handRate", getRate(i2, i));
+		ecOrder.setHandRate(getRate(i2, i));
+		// result.put("handNumber", String.valueOf(i2));
+		// 办结单数(率)
+		// result.put("checkRate", getRate(i3, i));
+		ecOrder.setCheckRate(getRate(i3, i));
+		// result.put("checkNumber", String.valueOf(i3));
+		// 答复单数(率)
+		// result.put("doneRate", getRate(i4, i));
+		ecOrder.setDoneRate(getRate(i4, i));
+		// result.put("doneNumber", String.valueOf(i4));
+		// 回访单数(率)
+		// result.put("respRate", getRate(i5, i));
+		ecOrder.setRespRate(getRate(i5, i));
+		// result.put("respNumber", String.valueOf(i5));
+		// 核实单数(率)
+		// result.put("reviewRate", getRate(i6, i));
+		ecOrder.setReviewRate(getRate(i6, i));
+		// result.put("reviewNumber", String.valueOf(i6));
+		// 督办单数
+		// result.put("superviseNumber", String.valueOf(i7));
+		ecOrder.setSuperviseNumber(String.valueOf(i7));
+		// 返回结果
+		// return result;
+	}
+
+
+	public static String getRate(int dividend, int divisor) {
+		// 检查除数是否为0
+		if (divisor == 0) {
+			return "0";
+		}
+		// 将int转换为BigDecimal
+		BigDecimal bdDividend = BigDecimal.valueOf(dividend);
+		BigDecimal bdDivisor = BigDecimal.valueOf(divisor);
+		// 执行除法操作,设置精度(scale)和舍入模式(RoundingMode)
+		int scale = DEFAULT_SCALE;
+		RoundingMode roundingMode = DEFAULT_ROUNDING_MODE;
+		// 进行除法运算
+		BigDecimal result;
+		try {
+			result = bdDividend.divide(bdDivisor, scale, roundingMode);
+		} catch (ArithmeticException e) {
+			// 处理因除数为0或其他原因引发的算术异常
+			throw new RuntimeException("除法运算出错", e);
+		}
+		return result.toString();
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/vo/ECallEventTwoVO.java b/src/main/java/org/springblade/modules/eCallEventTwo/vo/ECallEventTwoVO.java
new file mode 100644
index 0000000..f6763d8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/vo/ECallEventTwoVO.java
@@ -0,0 +1,49 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 工单 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ECallEventTwoVO extends ECallEventTwoEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "经度")
+	private String lng;
+	@ApiModelProperty(value = "纬度")
+	private String lat;
+	@ApiModelProperty(value = "警务网格编号")
+	private String jwGridCode;
+
+	@ApiModelProperty(value = "社区编号")
+	private String communityCode;
+
+	@ApiModelProperty(value = "角色名称")
+	private String roleName;
+
+}
diff --git a/src/main/java/org/springblade/modules/eCallEventTwo/wrapper/ECallEventTwoWrapper.java b/src/main/java/org/springblade/modules/eCallEventTwo/wrapper/ECallEventTwoWrapper.java
new file mode 100644
index 0000000..49d8267
--- /dev/null
+++ b/src/main/java/org/springblade/modules/eCallEventTwo/wrapper/ECallEventTwoWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.eCallEventTwo.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.eCallEventTwo.entity.ECallEventTwoEntity;
+import org.springblade.modules.eCallEventTwo.vo.ECallEventTwoVO;
+import java.util.Objects;
+
+/**
+ * 工单 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-05-15
+ */
+public class ECallEventTwoWrapper extends BaseEntityWrapper<ECallEventTwoEntity, ECallEventTwoVO>  {
+
+	public static ECallEventTwoWrapper build() {
+		return new ECallEventTwoWrapper();
+ 	}
+
+	@Override
+	public ECallEventTwoVO entityVO(ECallEventTwoEntity eCallEventTwo) {
+		ECallEventTwoVO eCallEventTwoVO = Objects.requireNonNull(BeanUtil.copy(eCallEventTwo, ECallEventTwoVO.class));
+
+		//User createUser = UserCache.getUser(eCallEventTwo.getCreateUser());
+		//User updateUser = UserCache.getUser(eCallEventTwo.getUpdateUser());
+		//eCallEventTwoVO.setCreateUserName(createUser.getName());
+		//eCallEventTwoVO.setUpdateUserName(updateUser.getName());
+
+		return eCallEventTwoVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/email/controller/EmailTemplateController.java b/src/main/java/org/springblade/modules/email/controller/EmailTemplateController.java
new file mode 100644
index 0000000..4e4a6c4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/controller/EmailTemplateController.java
@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import org.springblade.modules.email.vo.EmailTemplateVO;
+import org.springblade.modules.email.wrapper.EmailTemplateWrapper;
+import org.springblade.modules.email.service.IEmailTemplateService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 邮件模版表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-email/emailTemplate")
+@Api(value = "邮件模版表", tags = "邮件模版表接口")
+public class EmailTemplateController extends BladeController {
+
+	private final IEmailTemplateService emailTemplateService;
+
+	/**
+	 * 邮件模版表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入emailTemplate")
+	public R<EmailTemplateVO> detail(EmailTemplateEntity emailTemplate) {
+		EmailTemplateEntity detail = emailTemplateService.getOne(Condition.getQueryWrapper(emailTemplate));
+		return R.data(EmailTemplateWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 邮件模版表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入emailTemplate")
+	public R<IPage<EmailTemplateVO>> list(EmailTemplateEntity emailTemplate, Query query) {
+		IPage<EmailTemplateEntity> pages = emailTemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(emailTemplate));
+		return R.data(EmailTemplateWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 邮件模版表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入emailTemplate")
+	public R<IPage<EmailTemplateVO>> page(EmailTemplateVO emailTemplate, Query query) {
+		IPage<EmailTemplateVO> pages = emailTemplateService.selectEmailTemplatePage(Condition.getPage(query), emailTemplate);
+		return R.data(pages);
+	}
+
+	/**
+	 * 邮件模版表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入emailTemplate")
+	public R save(@Valid @RequestBody EmailTemplateEntity emailTemplate) {
+		return R.status(emailTemplateService.save(emailTemplate));
+	}
+
+	/**
+	 * 邮件模版表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入emailTemplate")
+	public R update(@Valid @RequestBody EmailTemplateEntity emailTemplate) {
+		return R.status(emailTemplateService.updateById(emailTemplate));
+	}
+
+	/**
+	 * 邮件模版表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入emailTemplate")
+	public R submit(@Valid @RequestBody EmailTemplateEntity emailTemplate) {
+		return R.status(emailTemplateService.saveOrUpdate(emailTemplate));
+	}
+
+	/**
+	 * 邮件模版表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(emailTemplateService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/email/dto/EmailTemplateDTO.java b/src/main/java/org/springblade/modules/email/dto/EmailTemplateDTO.java
new file mode 100644
index 0000000..2677b0a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/dto/EmailTemplateDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.dto;
+
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 邮件模版表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class EmailTemplateDTO extends EmailTemplateEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/email/entity/EmailTemplateEntity.java b/src/main/java/org/springblade/modules/email/entity/EmailTemplateEntity.java
new file mode 100644
index 0000000..04faaff
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/entity/EmailTemplateEntity.java
@@ -0,0 +1,79 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 邮件模版表 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+@Data
+@TableName("blade_email_template")
+@ApiModel(value = "EmailTemplate对象", description = "邮件模版表")
+public class EmailTemplateEntity{
+
+	private static final long serialVersionUID = 1L;
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 标题 */
+	@ApiModelProperty(value = "标题", example = "")
+	@TableField("title")
+	private String title;
+
+	/** 邮件内容 */
+	@ApiModelProperty(value = "邮件内容", example = "")
+	@TableField("content")
+	private String content;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 是否已删除 */
+	@ApiModelProperty(value = "是否已删除", example = "")
+	@TableField("is_deleted")
+	private Integer isDeleted;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_by")
+	private Long createBy;
+}
diff --git a/src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.java b/src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.java
new file mode 100644
index 0000000..37ade8c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.java
@@ -0,0 +1,60 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.mapper;
+
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springblade.modules.email.dto.EmailTemplateDTO;
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import org.springblade.modules.email.vo.EmailTemplateVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 邮件模版表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+public interface EmailTemplateMapper extends BaseMapper<EmailTemplateEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param emailTemplate
+	 * @return
+	 */
+	List<EmailTemplateVO> selectEmailTemplatePage(IPage page, @Param("emailTemplate") EmailTemplateVO emailTemplate);
+
+
+	/**
+	 * 查询
+	 *
+	 * @param id ID
+	 * @return
+	 */
+	public EmailTemplateDTO selectBladeEmailTemplateById(Integer id);
+
+	/**
+	 * 查询列表
+	 *
+	 * @param bladeEmailTemplateDTO
+	 * @return 集合
+	 */
+	public List<EmailTemplateDTO> selectBladeEmailTemplateList(EmailTemplateDTO bladeEmailTemplateDTO);
+}
diff --git a/src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.xml b/src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.xml
new file mode 100644
index 0000000..29c4dcb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/mapper/EmailTemplateMapper.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.email.mapper.EmailTemplateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="emailTemplateResultMap" type="org.springblade.modules.email.entity.EmailTemplateEntity">
+    </resultMap>
+
+
+    <select id="selectEmailTemplatePage" resultMap="emailTemplateResultMap">
+        select * from blade_email_template
+        <where>
+            <if test="emailTemplate.id != null ">and id = #{emailTemplate.id}</if>
+            <if test="emailTemplate.title != null  and emailTemplate.title != ''">and title like CONCAT('%', #{emailTemplate.title},'%')</if>
+            <if test="emailTemplate.content != null  and emailTemplate.content != ''">and content = #{emailTemplate.content}</if>
+            <if test="emailTemplate.createTime != null ">and create_time = #{emailTemplate.createTime}</if>
+            <if test="emailTemplate.updateTime != null ">and update_time = #{emailTemplate.updateTime}</if>
+            <if test="emailTemplate.isDeleted != null ">and is_deleted = #{emailTemplate.isDeleted}</if>
+            <if test="emailTemplate.createBy != null ">and create_by = #{emailTemplate.createBy}</if>
+            and is_deleted = 0
+        </where>
+    </select>
+
+    <resultMap type="org.springblade.modules.email.dto.EmailTemplateDTO" id="BladeEmailTemplateDTOResult">
+        <result property="id" column="id"/>
+        <result property="title" column="title"/>
+        <result property="content" column="content"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="isDeleted" column="is_deleted"/>
+        <result property="createBy" column="create_by"/>
+    </resultMap>
+
+    <sql id="selectBladeEmailTemplate">
+        select id,
+               title,
+               content,
+               create_time,
+               update_time,
+               is_deleted,
+               create_by
+        from blade_email_template
+    </sql>
+
+    <select id="selectBladeEmailTemplateById" parameterType="int" resultMap="BladeEmailTemplateDTOResult">
+        <include refid="selectBladeEmailTemplate"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectBladeEmailTemplateList" parameterType="org.springblade.modules.email.dto.EmailTemplateDTO"
+            resultMap="BladeEmailTemplateDTOResult">
+        <include refid="selectBladeEmailTemplate"/>
+        <where>
+            <if test="id != null ">and id = #{id}</if>
+            <if test="title != null  and title != ''">and title = #{title}</if>
+            <if test="content != null  and content != ''">and content = #{content}</if>
+            <if test="createTime != null ">and create_time = #{createTime}</if>
+            <if test="updateTime != null ">and update_time = #{updateTime}</if>
+            <if test="isDeleted != null ">and is_deleted = #{isDeleted}</if>
+            <if test="createBy != null ">and create_by = #{createBy}</if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/email/service/IEmailTemplateService.java b/src/main/java/org/springblade/modules/email/service/IEmailTemplateService.java
new file mode 100644
index 0000000..142069d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/service/IEmailTemplateService.java
@@ -0,0 +1,60 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.email.dto.EmailTemplateDTO;
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import org.springblade.modules.email.vo.EmailTemplateVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 邮件模版表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+public interface IEmailTemplateService extends IService<EmailTemplateEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param emailTemplate
+	 * @return
+	 */
+	IPage<EmailTemplateVO> selectEmailTemplatePage(IPage<EmailTemplateVO> page, EmailTemplateVO emailTemplate);
+	/**
+	 * 查询
+	 *
+	 * @param id ID
+	 * @return
+	 */
+	public EmailTemplateDTO selectBladeEmailTemplateById(Integer id);
+
+	/**
+	 * 查询列表
+	 *
+	 * @param bladeEmailTemplateDTO
+	 * @return 集合
+	 */
+	public List<EmailTemplateDTO> selectBladeEmailTemplateList(EmailTemplateDTO bladeEmailTemplateDTO);
+
+}
diff --git a/src/main/java/org/springblade/modules/email/service/impl/EmailTemplateServiceImpl.java b/src/main/java/org/springblade/modules/email/service/impl/EmailTemplateServiceImpl.java
new file mode 100644
index 0000000..76a7a9a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/service/impl/EmailTemplateServiceImpl.java
@@ -0,0 +1,71 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.email.dto.EmailTemplateDTO;
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import org.springblade.modules.email.vo.EmailTemplateVO;
+import org.springblade.modules.email.mapper.EmailTemplateMapper;
+import org.springblade.modules.email.service.IEmailTemplateService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 邮件模版表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+@Service
+public class EmailTemplateServiceImpl extends ServiceImpl<EmailTemplateMapper, EmailTemplateEntity> implements IEmailTemplateService {
+
+	@Override
+	public IPage<EmailTemplateVO> selectEmailTemplatePage(IPage<EmailTemplateVO> page, EmailTemplateVO emailTemplate) {
+		return page.setRecords(baseMapper.selectEmailTemplatePage(page, emailTemplate));
+	}
+
+	/**
+	 * 查询
+	 *
+	 * @param id ID
+	 * @return
+	 */
+	@Override
+	public EmailTemplateDTO selectBladeEmailTemplateById(Integer id)
+	{
+		return this.baseMapper.selectBladeEmailTemplateById(id);
+	}
+
+	/**
+	 * 查询列表
+	 *
+	 * @param bladeEmailTemplateDTO
+	 * @return 集合
+	 */
+	@Override
+	public List<EmailTemplateDTO> selectBladeEmailTemplateList(EmailTemplateDTO bladeEmailTemplateDTO)
+	{
+		return this.baseMapper.selectBladeEmailTemplateList(bladeEmailTemplateDTO);
+	}
+
+
+
+}
diff --git a/src/main/java/org/springblade/modules/email/vo/EmailTemplateVO.java b/src/main/java/org/springblade/modules/email/vo/EmailTemplateVO.java
new file mode 100644
index 0000000..aa10266
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/vo/EmailTemplateVO.java
@@ -0,0 +1,35 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.vo;
+
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 邮件模版表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class EmailTemplateVO extends EmailTemplateEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/email/wrapper/EmailTemplateWrapper.java b/src/main/java/org/springblade/modules/email/wrapper/EmailTemplateWrapper.java
new file mode 100644
index 0000000..56f5aae
--- /dev/null
+++ b/src/main/java/org/springblade/modules/email/wrapper/EmailTemplateWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.email.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.email.entity.EmailTemplateEntity;
+import org.springblade.modules.email.vo.EmailTemplateVO;
+import java.util.Objects;
+
+/**
+ * 邮件模版表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-04
+ */
+public class EmailTemplateWrapper extends BaseEntityWrapper<EmailTemplateEntity, EmailTemplateVO>  {
+
+	public static EmailTemplateWrapper build() {
+		return new EmailTemplateWrapper();
+ 	}
+
+	@Override
+	public EmailTemplateVO entityVO(EmailTemplateEntity emailTemplate) {
+		EmailTemplateVO emailTemplateVO = Objects.requireNonNull(BeanUtil.copy(emailTemplate, EmailTemplateVO.class));
+
+		//User createUser = UserCache.getUser(emailTemplate.getCreateUser());
+		//User updateUser = UserCache.getUser(emailTemplate.getUpdateUser());
+		//emailTemplateVO.setCreateUserName(createUser.getName());
+		//emailTemplateVO.setUpdateUserName(updateUser.getName());
+
+		return emailTemplateVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/grid/excel/GridPatrolRecordExcel.java b/src/main/java/org/springblade/modules/grid/excel/GridPatrolRecordExcel.java
new file mode 100644
index 0000000..d8802ce
--- /dev/null
+++ b/src/main/java/org/springblade/modules/grid/excel/GridPatrolRecordExcel.java
@@ -0,0 +1,71 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.grid.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 网格巡查记录表 实体类
+ *
+ * @author BladeX
+ * @since 2023-11-16
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class GridPatrolRecordExcel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@ExcelProperty(value = "巡查人名称")
+	private String userName;
+
+	@ExcelProperty(value = "街道名称")
+	private String townStreetName;
+
+	@ExcelProperty(value = "社区名称")
+	private String neiName;
+
+	@ExcelProperty(value = "名称")
+	private String name;
+
+	@ExcelProperty(value = "内容")
+	private String context;
+
+	@ExcelProperty(value = "巡查时间")
+	private Date patrolTime;
+
+	@ExcelProperty(value = "创建时间")
+	private Date createTime;
+
+	@ExcelProperty(value = "纬度")
+	private String latitude;
+
+	@ExcelProperty(value = "经度")
+	private String longitude;
+
+	@ExcelProperty(value = "地址")
+	private String location;
+
+}
diff --git a/src/main/java/org/springblade/modules/house/excel/ExportHouseTenantExcel.java b/src/main/java/org/springblade/modules/house/excel/ExportHouseTenantExcel.java
new file mode 100644
index 0000000..0fed67a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/house/excel/ExportHouseTenantExcel.java
@@ -0,0 +1,93 @@
+package org.springblade.modules.house.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ExportHouseTenantExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/**
+	 * 出租屋ID
+	 */
+	@ExcelProperty(value = "房屋地址")
+	@ColumnWidth(25)
+	private String addressName;
+	/**
+	 * 出租屋ID
+	 */
+	@ExcelProperty(value = "地址编码")
+	@ColumnWidth(25)
+	private String houseCode;
+	/**
+	 * 姓名
+	 */
+	@ExcelProperty(value = "姓名")
+	@ColumnWidth(25)
+	private String name;
+	/**
+	 * 联系电话
+	 */
+	@ExcelProperty(value = "联系电话")
+	@ColumnWidth(25)
+	private String phone;
+	/**
+	 * 身份证
+	 */
+	@ExcelProperty(value = "身份证")
+	@ColumnWidth(25)
+	private String idCard;
+	/**
+	 * 户籍
+	 */
+	@ExcelProperty(value = "户籍")
+	@ColumnWidth(25)
+	private String domicile;
+	/**
+	 * 工作单位
+	 */
+	@ExcelProperty(value = "工作单位")
+	@ColumnWidth(25)
+	private String workUnit;
+
+	/**
+	 * 备注
+	 */
+	@ExcelProperty(value = "备注")
+	@ColumnWidth(25)
+	private String remark;
+
+
+	/** 性别 */
+	@ExcelProperty(value = "性别",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "sex")
+	@ColumnWidth(25)
+	private Integer gender;
+
+	/** 民族 */
+	@ExcelProperty(value = "民族",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "nationType")
+	private Integer ethnicity;
+
+	/** 创建时间 */
+	@ExcelProperty(value = "创建时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date createTime;
+
+}
diff --git a/src/main/java/org/springblade/modules/house/excel/ExportHouseholdExcel.java b/src/main/java/org/springblade/modules/house/excel/ExportHouseholdExcel.java
new file mode 100644
index 0000000..8cdce64
--- /dev/null
+++ b/src/main/java/org/springblade/modules/house/excel/ExportHouseholdExcel.java
@@ -0,0 +1,237 @@
+package org.springblade.modules.house.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+
+/**
+ * ExportHouseholdExcel
+ * 导出住户信息
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ExportHouseholdExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+//	/**
+//	 * 门牌地址编码
+//	 */
+//	@ColumnWidth(25)
+//	@ExcelProperty( "门牌地址编码")
+//	private String houseCode;
+
+	/** 姓名 */
+	@ColumnWidth(15)
+	@ExcelProperty( "姓名*")
+	private String name;
+
+	/** 性别 1: 男 0:女  2: 未知 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "性别",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "sex")
+	@ExcelDictItem(type = "sex")
+	private String gender;
+
+
+	/** 手机号 */
+	@ColumnWidth(15)
+	@ExcelProperty( "手机号*")
+	private String phoneNumber;
+
+	/** 生日 */
+	@ColumnWidth(15)
+	@ExcelProperty( "生日")
+	private String birthday;
+
+	/** 身份证 */
+	@ColumnWidth(15)
+	@ExcelProperty( "身份证号码")
+	private String idCard;
+
+	/** 其他联系方式 */
+	@ColumnWidth(15)
+	@ExcelProperty( "其他联系方式")
+	private String otherContact;
+
+	/** 所属街道 */
+	@ColumnWidth(15)
+	@ExcelProperty( "所属街道")
+	private String townName;
+
+	/** 所属社区 */
+	@ColumnWidth(15)
+	@ExcelProperty( "所属社区")
+	private String communityName;
+
+	/** 所属网格 */
+	@ColumnWidth(15)
+	@ExcelProperty( "所属网格")
+	private String gridName;
+
+	/** 小区名称 */
+	@ColumnWidth(15)
+	@ExcelProperty( "小区名称")
+	private String aoiName;
+
+	/** 与业主关系 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "与业主关系*(业主/妻子/丈夫/女儿/儿子/母亲/父亲/.../租户/其他)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "roleRelation")
+	@ExcelDictItem(type = "roleRelation")
+	private String relationship;
+
+	/** 是否主要联系人 1:是  0:否 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "是否主要联系人",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "primaryContactType")
+	@ExcelDictItem(type = "primaryContactType")
+	private String isPrimaryContact;
+
+	/** 居住状态 1: 是  0:否 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "居住状态",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "residentialStatusType")
+	@ExcelDictItem(type = "residentialStatusType")
+	private String residentialStatus;
+
+	/** 民族 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "民族",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "nationType")
+	@ExcelDictItem(type = "nationType")
+	private String ethnicity;
+
+
+	/** 户籍地址 */
+	@ColumnWidth(15)
+	@ExcelProperty( "户籍地址")
+	private String hukouRegistration;
+
+	/** 现居住地址 */
+	@ColumnWidth(15)
+	@ExcelProperty( "现居住地址")
+	private String currentAddress;
+
+	/** 是否党员  1:党员  2:群众 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "是否党员(党员/群众)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "partyEmberType")
+	@ExcelDictItem(type = "partyEmberType")
+	private String partyEmber;
+
+	/** 学历 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "学历",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "educationType")
+	@ExcelDictItem(type = "educationType")
+	private String education;
+	/**
+	 * 职业类别
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "职业类别")
+	private String occupation;
+
+	/** 工作单位 */
+	@ColumnWidth(15)
+	@ExcelProperty( "工作单位")
+	private String employer;
+	/**
+	 * 工作单位地址
+	 */
+	@ExcelProperty( "工作单位地址")
+	private String cmpyRegAddr;
+
+	/** 工作状态 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "工作状态(在职/离职/退休/其他)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "workStatusType")
+	@ExcelDictItem(type = "workStatusType")
+	private String workStatus;
+
+
+	/** 婚姻状态 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "婚姻状态(未婚/已婚/离异/丧偶/其他)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "marriageStatusType")
+	@ExcelDictItem(type = "marriageStatusType")
+	private String maritalStatus;
+	/**
+	 * 宗教信仰
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "宗教信仰")
+	private String religiousBelief;
+	/**
+	 * 健康状况    业务字典 healthStatus
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "健康状况(健康/良好/较差)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "healthStatus")
+	@ExcelDictItem(type = "healthStatus")
+	private String healthStatus;
+	/**
+	 * 疾病名称
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "疾病名称")
+	private String diseaseName;
+	/**
+	 * 外出去向
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "外出去向")
+	private String goOutWhere;
+	/**
+	 * 外出原因
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "外出原因")
+	private String goOutReason;
+	/**
+	 * 外出时间
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "外出时间")
+	private String goOutTime;
+
+	/**
+	 * 外出详址
+	 */
+	@ExcelProperty( "外出详址")
+	private String goOutAddr;
+
+	/** 车牌号 */
+	@ColumnWidth(15)
+	@ExcelProperty( "车牌号")
+	private String cardNumber;
+	/**
+	 * 自愿者组织
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty( "自愿者组织")
+	private String volunteerOrg;
+
+	/** 备注 */
+	@ColumnWidth(15)
+	@ExcelProperty( "备注")
+	private String remark;
+
+	/** 备注 */
+	@ColumnWidth(15)
+	@ExcelProperty( "标签")
+	private String labelName;
+
+}
+
diff --git a/src/main/java/org/springblade/modules/house/excel/HouseTenantExcel.java b/src/main/java/org/springblade/modules/house/excel/HouseTenantExcel.java
new file mode 100644
index 0000000..d2a2f6b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/house/excel/HouseTenantExcel.java
@@ -0,0 +1,86 @@
+package org.springblade.modules.house.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class HouseTenantExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+
+	/**
+	 * 门牌地址编码
+	 */
+	@ColumnWidth(25)
+	@ExcelProperty( "门牌地址编码*")
+	private String houseCode;
+
+	/** 姓名 */
+	@ColumnWidth(15)
+	@ExcelProperty( "姓名*")
+	private String name;
+
+	/** 性别 1: 男 0:女  2: 未知 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "性别",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "sex")
+	@ExcelDictItem(type = "sex")
+	private String gender;
+
+
+	/** 手机号 */
+	@ColumnWidth(15)
+	@ExcelProperty( "手机号*")
+	private String phoneNumber;
+
+	/** 生日 */
+	@ColumnWidth(15)
+	@ExcelProperty( "生日")
+	private String birthday;
+
+	/** 身份证 */
+	@ColumnWidth(15)
+	@ExcelProperty( "身份证号码")
+	private String idCard;
+
+	/** 与业主关系 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "与业主关系*(业主/妻子/丈夫/女儿/儿子/母亲/父亲/.../租户/其他)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "roleRelation")
+	@ExcelDictItem(type = "roleRelation")
+	private String relationship;
+
+	/** 民族 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "民族",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "nationType")
+	@ExcelDictItem(type = "nationType")
+	private String ethnicity;
+
+
+	/** 户籍地址 */
+	@ColumnWidth(15)
+	@ExcelProperty( "户籍地址")
+	private String hukouRegistration;
+
+
+	/** 工作单位 */
+	@ColumnWidth(15)
+	@ExcelProperty( "工作单位")
+	private String employer;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/house/excel/ImportTenantHouseholdExcel.java b/src/main/java/org/springblade/modules/house/excel/ImportTenantHouseholdExcel.java
new file mode 100644
index 0000000..fe61356
--- /dev/null
+++ b/src/main/java/org/springblade/modules/house/excel/ImportTenantHouseholdExcel.java
@@ -0,0 +1,90 @@
+package org.springblade.modules.house.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+
+/**
+ * ImportHouseHoldExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ImportTenantHouseholdExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/**
+	 * 门牌地址编码
+	 */
+	@ColumnWidth(25)
+	@ExcelProperty( "门牌地址编码*")
+	private String houseCode;
+
+	/** 姓名 */
+	@ColumnWidth(15)
+	@ExcelProperty( "姓名*")
+	private String name;
+
+	/** 性别 1: 男 0:女  2: 未知 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "性别",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "sex")
+	@ExcelDictItem(type = "sex")
+	private String gender;
+
+
+	/** 手机号 */
+	@ColumnWidth(15)
+	@ExcelProperty( "手机号*")
+	private String phoneNumber;
+
+	/** 生日 */
+	@ColumnWidth(15)
+	@ExcelProperty( "生日")
+	private String birthday;
+
+	/** 身份证 */
+	@ColumnWidth(15)
+	@ExcelProperty( "身份证号码")
+	private String idCard;
+
+	/** 与业主关系 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "与业主关系*(业主/妻子/丈夫/女儿/儿子/母亲/父亲/.../租户/其他)",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "roleRelation")
+	@ExcelDictItem(type = "roleRelation")
+	private String relationship;
+
+	/** 民族 */
+	@ColumnWidth(15)
+	@ExcelProperty( value = "民族",converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "nationType")
+	@ExcelDictItem(type = "nationType")
+	private String ethnicity;
+
+
+	/** 户籍地址 */
+	@ColumnWidth(15)
+	@ExcelProperty( "户籍地址")
+	private String hukouRegistration;
+
+
+	/** 工作单位 */
+	@ColumnWidth(15)
+	@ExcelProperty( "工作单位")
+	private String employer;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/house/vo/AddHouseholdVO.java b/src/main/java/org/springblade/modules/house/vo/AddHouseholdVO.java
new file mode 100644
index 0000000..9fd6e52
--- /dev/null
+++ b/src/main/java/org/springblade/modules/house/vo/AddHouseholdVO.java
@@ -0,0 +1,11 @@
+package org.springblade.modules.house.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddHouseholdVO {
+
+	private List<HouseholdVO> householdVOList;
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/controller/IssueClazzController.java b/src/main/java/org/springblade/modules/issueClazz/controller/IssueClazzController.java
new file mode 100644
index 0000000..3152f81
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/controller/IssueClazzController.java
@@ -0,0 +1,140 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.system.vo.DeptVO;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.issueClazz.entity.IssueClazzEntity;
+import org.springblade.modules.issueClazz.vo.IssueClazzVO;
+import org.springblade.modules.issueClazz.wrapper.IssueClazzWrapper;
+import org.springblade.modules.issueClazz.service.IIssueClazzService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.List;
+
+/**
+ * E呼即办 归口文档 控制器
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-issueClazz/issueClazz")
+@Api(value = "E呼即办 归口文档", tags = "E呼即办 归口文档接口")
+public class IssueClazzController extends BladeController {
+
+	private final IIssueClazzService issueClazzService;
+
+	/**
+	 * E呼即办 归口文档 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入issueClazz")
+	public R<IssueClazzVO> detail(IssueClazzEntity issueClazz) {
+		IssueClazzEntity detail = issueClazzService.getOne(Condition.getQueryWrapper(issueClazz));
+		return R.data(IssueClazzWrapper.build().entityVO(detail));
+	}
+	/**
+	 * E呼即办 归口文档 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入issueClazz")
+	public R<IPage<IssueClazzVO>> list(IssueClazzEntity issueClazz, Query query) {
+		IPage<IssueClazzEntity> pages = issueClazzService.page(Condition.getPage(query), Condition.getQueryWrapper(issueClazz));
+		return R.data(IssueClazzWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * E呼即办 归口文档 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入issueClazz")
+	public R<IPage<IssueClazzVO>> page(IssueClazzVO issueClazz, Query query) {
+		IPage<IssueClazzVO> pages = issueClazzService.selectIssueClazzPage(Condition.getPage(query), issueClazz);
+		return R.data(pages);
+	}
+
+	/**
+	 * E呼即办 归口文档 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入issueClazz")
+	public R save(@Valid @RequestBody IssueClazzEntity issueClazz) {
+		return R.status(issueClazzService.save(issueClazz));
+	}
+
+	/**
+	 * E呼即办 归口文档 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入issueClazz")
+	public R update(@Valid @RequestBody IssueClazzEntity issueClazz) {
+		return R.status(issueClazzService.updateById(issueClazz));
+	}
+
+	/**
+	 * E呼即办 归口文档 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入issueClazz")
+	public R submit(@Valid @RequestBody IssueClazzEntity issueClazz) {
+		return R.status(issueClazzService.saveOrUpdate(issueClazz));
+	}
+
+	/**
+	 * E呼即办 归口文档 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(issueClazzService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 获取部门树形结构
+	 */
+	@GetMapping("/tree")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "树形结构", notes = "树形结构")
+	public R<List<IssueClazzVO>> tree() {
+		List<IssueClazzVO> tree = issueClazzService.tree();
+		return R.data(tree);
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/dto/IssueClazzDTO.java b/src/main/java/org/springblade/modules/issueClazz/dto/IssueClazzDTO.java
new file mode 100644
index 0000000..a399717
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/dto/IssueClazzDTO.java
@@ -0,0 +1,48 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * E呼即办 归口文档 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Data
+public class IssueClazzDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "code", type = IdType.ASSIGN_UUID)
+	private String code;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("name")
+	private String name;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("parent_code")
+	private String parentCode;
+
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/entity/IssueClazzEntity.java b/src/main/java/org/springblade/modules/issueClazz/entity/IssueClazzEntity.java
new file mode 100644
index 0000000..721959e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/entity/IssueClazzEntity.java
@@ -0,0 +1,53 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+/**
+ * E呼即办 归口文档 实体类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Data
+@TableName("jczz_issue_clazz")
+@ApiModel(value = "IssueClazz对象", description = "E呼即办 归口文档")
+public class IssueClazzEntity  {
+
+
+
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "code", type = IdType.ASSIGN_UUID)
+	private String code;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("name")
+	private String name;
+
+	@ApiModelProperty(value = "", example = "")
+	@TableField("parent_code")
+	private String parentCode;
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.java b/src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.java
new file mode 100644
index 0000000..a1c5f30
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.java
@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.mapper;
+
+import org.springblade.modules.issueClazz.entity.IssueClazzEntity;
+import org.springblade.modules.issueClazz.vo.IssueClazzVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * E呼即办 归口文档 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+public interface IssueClazzMapper extends BaseMapper<IssueClazzEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param issueClazz
+	 * @return
+	 */
+	List<IssueClazzVO> selectIssueClazzPage(IPage page, IssueClazzVO issueClazz);
+
+
+    List<IssueClazzVO> tree();
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.xml b/src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.xml
new file mode 100644
index 0000000..cc35e9b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/mapper/IssueClazzMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.issueClazz.mapper.IssueClazzMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="issueClazzResultMap" type="org.springblade.modules.issueClazz.entity.IssueClazzEntity">
+    </resultMap>
+
+
+    <select id="selectIssueClazzPage" resultMap="issueClazzResultMap">
+        select * from jczz_issue_clazz where is_deleted = 0
+    </select>
+
+    <resultMap id="treeNodeResultMap" type="org.springblade.core.tool.node.TreeNode">
+        <id column="id" property="id"/>
+<!--        <result column="parent_id" property="parentId"/>-->
+        <result column="title" property="title"/>
+        <result column="value" property="value"/>
+        <result column="key" property="key"/>
+        <result column="has_children" property="hasChildren"/>
+    </resultMap>
+
+
+    <select id="tree" resultMap="treeNodeResultMap">
+        SELECT CODE        id,
+               NAME AS     title,
+               CODE AS     "value",
+               CODE AS     "key",
+               parent_code parentId
+        FROM jczz_issue_clazz
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/issueClazz/service/IIssueClazzService.java b/src/main/java/org/springblade/modules/issueClazz/service/IIssueClazzService.java
new file mode 100644
index 0000000..ca0f2ce
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/service/IIssueClazzService.java
@@ -0,0 +1,46 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.issueClazz.entity.IssueClazzEntity;
+import org.springblade.modules.issueClazz.vo.IssueClazzVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * E呼即办 归口文档 服务类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+public interface IIssueClazzService extends IService<IssueClazzEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param issueClazz
+	 * @return
+	 */
+	IPage<IssueClazzVO> selectIssueClazzPage(IPage<IssueClazzVO> page, IssueClazzVO issueClazz);
+
+
+    List<IssueClazzVO> tree();
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/service/impl/IssueClazzServiceImpl.java b/src/main/java/org/springblade/modules/issueClazz/service/impl/IssueClazzServiceImpl.java
new file mode 100644
index 0000000..61a0550
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/service/impl/IssueClazzServiceImpl.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.modules.issueClazz.entity.IssueClazzEntity;
+import org.springblade.modules.issueClazz.vo.IssueClazzVO;
+import org.springblade.modules.issueClazz.mapper.IssueClazzMapper;
+import org.springblade.modules.issueClazz.service.IIssueClazzService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.system.vo.DeptVO;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * E呼即办 归口文档 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Service
+public class IssueClazzServiceImpl extends ServiceImpl<IssueClazzMapper, IssueClazzEntity> implements IIssueClazzService {
+
+	@Override
+	public IPage<IssueClazzVO> selectIssueClazzPage(IPage<IssueClazzVO> page, IssueClazzVO issueClazz) {
+		return page.setRecords(baseMapper.selectIssueClazzPage(page, issueClazz));
+	}
+
+	@Override
+	public List<IssueClazzVO> tree() {
+		List<IssueClazzVO> tree = baseMapper.tree();
+		return ForestNodeMerger.merge(tree);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/vo/IssueClazzVO.java b/src/main/java/org/springblade/modules/issueClazz/vo/IssueClazzVO.java
new file mode 100644
index 0000000..0b62ea6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/vo/IssueClazzVO.java
@@ -0,0 +1,93 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springblade.modules.issueClazz.entity.IssueClazzEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.system.vo.DeptVO;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * E呼即办 归口文档 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class IssueClazzVO extends IssueClazzEntity  implements INode<IssueClazzVO> {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long id;
+
+	/**
+	 * 父节点ID
+	 */
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long parentId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	private String title;
+
+	/**
+	 * 子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	private List<IssueClazzVO> children;
+
+	/**
+	 * 是否有子孙节点
+	 */
+	@JsonInclude(JsonInclude.Include.NON_EMPTY)
+	private Boolean hasChildren;
+
+	@Override
+	public List<IssueClazzVO> getChildren() {
+		if (this.children == null) {
+			this.children = new ArrayList<>();
+		}
+		return this.children;
+	}
+
+	/**
+	 * 上级机构
+	 */
+	private String parentName;
+
+	/**
+	 * 机构类型名称
+	 */
+	private String deptCategoryName;
+
+	private Boolean disabled;
+
+	/**
+	 * 保持树型结构统一
+	 */
+	private String name;
+}
diff --git a/src/main/java/org/springblade/modules/issueClazz/wrapper/IssueClazzWrapper.java b/src/main/java/org/springblade/modules/issueClazz/wrapper/IssueClazzWrapper.java
new file mode 100644
index 0000000..b016fd7
--- /dev/null
+++ b/src/main/java/org/springblade/modules/issueClazz/wrapper/IssueClazzWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.issueClazz.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.issueClazz.entity.IssueClazzEntity;
+import org.springblade.modules.issueClazz.vo.IssueClazzVO;
+import java.util.Objects;
+
+/**
+ * E呼即办 归口文档 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-05-16
+ */
+public class IssueClazzWrapper extends BaseEntityWrapper<IssueClazzEntity, IssueClazzVO>  {
+
+	public static IssueClazzWrapper build() {
+		return new IssueClazzWrapper();
+ 	}
+
+	@Override
+	public IssueClazzVO entityVO(IssueClazzEntity issueClazz) {
+		IssueClazzVO issueClazzVO = Objects.requireNonNull(BeanUtil.copy(issueClazz, IssueClazzVO.class));
+
+		//User createUser = UserCache.getUser(issueClazz.getCreateUser());
+		//User updateUser = UserCache.getUser(issueClazz.getUpdateUser());
+		//issueClazzVO.setCreateUserName(createUser.getName());
+		//issueClazzVO.setUpdateUserName(updateUser.getName());
+
+		return issueClazzVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/controller/NursingCheckInController.java b/src/main/java/org/springblade/modules/nursingCheckIn/controller/NursingCheckInController.java
new file mode 100644
index 0000000..fe5cc82
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/controller/NursingCheckInController.java
@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import org.springblade.modules.nursingCheckIn.vo.NursingCheckInVO;
+import org.springblade.modules.nursingCheckIn.wrapper.NursingCheckInWrapper;
+import org.springblade.modules.nursingCheckIn.service.INursingCheckInService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 护学打卡 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-nursingCheckIn/nursingCheckIn")
+@Api(value = "护学打卡", tags = "护学打卡接口")
+public class NursingCheckInController extends BladeController {
+
+	private final INursingCheckInService nursingCheckInService;
+
+	/**
+	 * 护学打卡 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入nursingCheckIn")
+	public R<NursingCheckInVO> detail(NursingCheckInEntity nursingCheckIn) {
+		NursingCheckInEntity detail = nursingCheckInService.getOne(Condition.getQueryWrapper(nursingCheckIn));
+		return R.data(NursingCheckInWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 护学打卡 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入nursingCheckIn")
+	public R<IPage<NursingCheckInVO>> list(NursingCheckInEntity nursingCheckIn, Query query) {
+		IPage<NursingCheckInEntity> pages = nursingCheckInService.page(Condition.getPage(query), Condition.getQueryWrapper(nursingCheckIn));
+		return R.data(NursingCheckInWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 护学打卡 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入nursingCheckIn")
+	public R<IPage<NursingCheckInVO>> page(NursingCheckInVO nursingCheckIn, Query query) {
+		IPage<NursingCheckInVO> pages = nursingCheckInService.selectNursingCheckInPage(Condition.getPage(query), nursingCheckIn);
+		return R.data(pages);
+	}
+
+	/**
+	 * 护学打卡 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入nursingCheckIn")
+	public R save(@Valid @RequestBody NursingCheckInEntity nursingCheckIn) {
+		return R.status(nursingCheckInService.save(nursingCheckIn));
+	}
+
+	/**
+	 * 护学打卡 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入nursingCheckIn")
+	public R update(@Valid @RequestBody NursingCheckInEntity nursingCheckIn) {
+		return R.status(nursingCheckInService.updateById(nursingCheckIn));
+	}
+
+	/**
+	 * 护学打卡 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入nursingCheckIn")
+	public R submit(@Valid @RequestBody NursingCheckInEntity nursingCheckIn) {
+		return R.status(nursingCheckInService.saveOrUpdate(nursingCheckIn));
+	}
+
+	/**
+	 * 护学打卡 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(nursingCheckInService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/dto/NursingCheckInDTO.java b/src/main/java/org/springblade/modules/nursingCheckIn/dto/NursingCheckInDTO.java
new file mode 100644
index 0000000..388ae01
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/dto/NursingCheckInDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.dto;
+
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 护学打卡 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class NursingCheckInDTO extends NursingCheckInEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/entity/NursingCheckInEntity.java b/src/main/java/org/springblade/modules/nursingCheckIn/entity/NursingCheckInEntity.java
new file mode 100644
index 0000000..e4eeac6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/entity/NursingCheckInEntity.java
@@ -0,0 +1,110 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 护学打卡 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Data
+@TableName("jczz_nursing_check_in")
+@ApiModel(value = "NursingCheckIn对象", description = "护学打卡")
+public class NursingCheckInEntity   {
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 定位地址 */
+	@ApiModelProperty(value = "定位地址", example = "")
+	@TableField("location")
+	private String location;
+
+	/** 家长名称 */
+	@ApiModelProperty(value = "家长名称", example = "")
+	@TableField("name")
+	private String name;
+
+	/** 家长电话 */
+	@ApiModelProperty(value = "家长电话", example = "")
+	@TableField("phone")
+	private String phone;
+
+	/** 年级与班级 */
+	@ApiModelProperty(value = "年级与班级", example = "")
+	@TableField("grade_and_class")
+	private String gradeAndClass;
+
+	/** 图片 */
+	@ApiModelProperty(value = "图片", example = "")
+	@TableField("images")
+	private String images;
+
+	/** 场所id */
+	@ApiModelProperty(value = "场所id", example = "")
+	@TableField("place_id")
+	private Long placeId;
+
+	/** 1:民警 2:家长 */
+	@ApiModelProperty(value = "1:民警 2:家长", example = "")
+	@TableField("type")
+	private String type;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 经度 */
+	@ApiModelProperty(value = "经度", example = "")
+	@TableField("longitude")
+	private String longitude;
+
+	/** 纬度 */
+	@ApiModelProperty(value = "纬度", example = "")
+	@TableField("latitude")
+	private String latitude;
+
+	/** 地址编码 */
+	@ApiModelProperty(value = "地址编码", example = "")
+	@TableField("house_code")
+	private String houseCode;
+
+	/** 场所名称 */
+	@ApiModelProperty(value = "场所名称", example = "")
+	@TableField("place_name")
+	private String placeName;
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.java b/src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.java
new file mode 100644
index 0000000..6113dcf
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.mapper;
+
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import org.springblade.modules.nursingCheckIn.vo.NursingCheckInVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 护学打卡 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+public interface NursingCheckInMapper extends BaseMapper<NursingCheckInEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param nursingCheckIn
+	 * @return
+	 */
+	List<NursingCheckInVO> selectNursingCheckInPage(IPage page, NursingCheckInVO nursingCheckIn);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.xml b/src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.xml
new file mode 100644
index 0000000..c2f774a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/mapper/NursingCheckInMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.nursingCheckIn.mapper.NursingCheckInMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="nursingCheckInResultMap" type="org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity">
+    </resultMap>
+
+
+    <select id="selectNursingCheckInPage" resultMap="nursingCheckInResultMap">
+        select * from jczz_nursing_check_in
+        <where>
+            <if test="nursingCheckIn.id != null ">and id = #{nursingCheckIn.id}</if>
+            <if test="nursingCheckIn.createUser != null ">and create_user = #{nursingCheckIn.createUser}</if>
+            <if test="nursingCheckIn.location != null  and nursingCheckIn.location != ''">and location = #{nursingCheckIn.location}</if>
+            <if test="nursingCheckIn.name != null  and nursingCheckIn.name != ''">and name like concat('%',#{nursingCheckIn.name},'%')</if>
+            <if test="nursingCheckIn.phone != null  and nursingCheckIn.phone != ''">and phone like concat('%',#{nursingCheckIn.phone},'%')</if>
+            <if test="nursingCheckIn.gradeAndClass != null  and nursingCheckIn.gradeAndClass != ''">and grade_and_class = #{nursingCheckIn.gradeAndClass}</if>
+            <if test="nursingCheckIn.images != null  and nursingCheckIn.images != ''">and images = #{nursingCheckIn.images}</if>
+            <if test="nursingCheckIn.placeId != null ">and place_id = #{nursingCheckIn.placeId}</if>
+            <if test="nursingCheckIn.type != null  and nursingCheckIn.type != ''">and type = #{nursingCheckIn.type}</if>
+            <if test="nursingCheckIn.startTime != null and nursingCheckIn.startTime != '' and nursingCheckIn.endTime != null and nursingCheckIn.endTime != '' ">
+                AND create_time BETWEEN #{nursingCheckIn.startTime} and #{nursingCheckIn.endTime}
+            </if>
+        </where>
+        order by id desc
+    </select>
+
+
+    <resultMap type="org.springblade.modules.nursingCheckIn.dto.NursingCheckInDTO" id="NursingCheckInDTOResult">
+        <result property="id"    column="id"    />
+        <result property="createUser"    column="create_user"    />
+        <result property="location"    column="location"    />
+        <result property="name"    column="name"    />
+        <result property="phone"    column="phone"    />
+        <result property="gradeAndClass"    column="grade_and_class"    />
+        <result property="images"    column="images"    />
+        <result property="placeId"    column="place_id"    />
+        <result property="type"    column="type"    />
+    </resultMap>
+
+    <sql id="selectNursingCheckIn">
+        select
+            id,
+            create_user,
+            location,
+            name,
+            phone,
+            grade_and_class,
+            images,
+            place_id,
+            type
+        from
+            jczz_nursing_check_in
+    </sql>
+
+<!--    <select id="selectNursingCheckInById" parameterType="long" resultMap="NursingCheckInDTOResult">-->
+<!--        <include refid="selectNursingCheckIn"/>-->
+<!--        where-->
+<!--        id = #{id}-->
+<!--    </select>-->
+
+<!--    <select id="selectNursingCheckInList" parameterType="org.springblade.modules..dto.NursingCheckInDTO" resultMap="NursingCheckInDTOResult">-->
+<!--        <include refid="selectNursingCheckIn"/>-->
+<!--        <where>-->
+<!--            <if test="id != null "> and id = #{id}</if>-->
+<!--            <if test="createUser != null "> and create_user = #{createUser}</if>-->
+<!--            <if test="location != null  and location != ''"> and location = #{location}</if>-->
+<!--            <if test="name != null  and name != ''"> and name = #{name}</if>-->
+<!--            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>-->
+<!--            <if test="gradeAndClass != null  and gradeAndClass != ''"> and grade_and_class = #{gradeAndClass}</if>-->
+<!--            <if test="images != null  and images != ''"> and images = #{images}</if>-->
+<!--            <if test="placeId != null "> and place_id = #{placeId}</if>-->
+<!--            <if test="type != null  and type != ''"> and type = #{type}</if>-->
+<!--        </where>-->
+<!--    </select>-->
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/service/INursingCheckInService.java b/src/main/java/org/springblade/modules/nursingCheckIn/service/INursingCheckInService.java
new file mode 100644
index 0000000..34ef802
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/service/INursingCheckInService.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import org.springblade.modules.nursingCheckIn.vo.NursingCheckInVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 护学打卡 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+public interface INursingCheckInService extends IService<NursingCheckInEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param nursingCheckIn
+	 * @return
+	 */
+	IPage<NursingCheckInVO> selectNursingCheckInPage(IPage<NursingCheckInVO> page, NursingCheckInVO nursingCheckIn);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/service/impl/NursingCheckInServiceImpl.java b/src/main/java/org/springblade/modules/nursingCheckIn/service/impl/NursingCheckInServiceImpl.java
new file mode 100644
index 0000000..52254d3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/service/impl/NursingCheckInServiceImpl.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import org.springblade.modules.nursingCheckIn.vo.NursingCheckInVO;
+import org.springblade.modules.nursingCheckIn.mapper.NursingCheckInMapper;
+import org.springblade.modules.nursingCheckIn.service.INursingCheckInService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 护学打卡 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Service
+public class NursingCheckInServiceImpl extends ServiceImpl<NursingCheckInMapper, NursingCheckInEntity> implements INursingCheckInService {
+
+	@Override
+	public IPage<NursingCheckInVO> selectNursingCheckInPage(IPage<NursingCheckInVO> page, NursingCheckInVO nursingCheckIn) {
+		return page.setRecords(baseMapper.selectNursingCheckInPage(page, nursingCheckIn));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/vo/NursingCheckInVO.java b/src/main/java/org/springblade/modules/nursingCheckIn/vo/NursingCheckInVO.java
new file mode 100644
index 0000000..4fbe338
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/vo/NursingCheckInVO.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 护学打卡 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class NursingCheckInVO extends NursingCheckInEntity {
+	private static final long serialVersionUID = 1L;
+	@ApiModelProperty("开始时间")
+	private String startTime;
+
+	@ApiModelProperty("结束时间")
+	private String endTime;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/nursingCheckIn/wrapper/NursingCheckInWrapper.java b/src/main/java/org/springblade/modules/nursingCheckIn/wrapper/NursingCheckInWrapper.java
new file mode 100644
index 0000000..296d033
--- /dev/null
+++ b/src/main/java/org/springblade/modules/nursingCheckIn/wrapper/NursingCheckInWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.nursingCheckIn.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.nursingCheckIn.entity.NursingCheckInEntity;
+import org.springblade.modules.nursingCheckIn.vo.NursingCheckInVO;
+import java.util.Objects;
+
+/**
+ * 护学打卡 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+public class NursingCheckInWrapper extends BaseEntityWrapper<NursingCheckInEntity, NursingCheckInVO>  {
+
+	public static NursingCheckInWrapper build() {
+		return new NursingCheckInWrapper();
+ 	}
+
+	@Override
+	public NursingCheckInVO entityVO(NursingCheckInEntity nursingCheckIn) {
+		NursingCheckInVO nursingCheckInVO = Objects.requireNonNull(BeanUtil.copy(nursingCheckIn, NursingCheckInVO.class));
+
+		//User createUser = UserCache.getUser(nursingCheckIn.getCreateUser());
+		//User updateUser = UserCache.getUser(nursingCheckIn.getUpdateUser());
+		//nursingCheckInVO.setCreateUserName(createUser.getName());
+		//nursingCheckInVO.setUpdateUserName(updateUser.getName());
+
+		return nursingCheckInVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/controller/OrderInfoController.java b/src/main/java/org/springblade/modules/pay/controller/OrderInfoController.java
new file mode 100644
index 0000000..7812ab3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/controller/OrderInfoController.java
@@ -0,0 +1,135 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.pay.vo.OrderInfoVO;
+import org.springblade.modules.pay.wrapper.OrderInfoWrapper;
+import org.springblade.modules.pay.service.IOrderInfoService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 订单信息 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-orderInfo/orderInfo")
+@Api(value = "订单信息", tags = "订单信息接口")
+public class OrderInfoController extends BladeController {
+
+	private final IOrderInfoService orderInfoService;
+
+	/**
+	 * 订单信息 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入orderInfo")
+	public R<OrderInfoVO> detail(OrderInfoEntity orderInfo) {
+		OrderInfoEntity detail = orderInfoService.getOne(Condition.getQueryWrapper(orderInfo));
+		return R.data(OrderInfoWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 订单信息 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入orderInfo")
+	public R<IPage<OrderInfoVO>> list(OrderInfoEntity orderInfo, Query query) {
+		IPage<OrderInfoEntity> pages = orderInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(orderInfo));
+		return R.data(OrderInfoWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 订单信息 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入orderInfo")
+	public R<IPage<OrderInfoVO>> page(OrderInfoVO orderInfo, Query query) {
+		IPage<OrderInfoVO> pages = orderInfoService.selectOrderInfoPage(Condition.getPage(query), orderInfo);
+		return R.data(pages);
+	}
+
+	/**
+	 * 订单信息 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入orderInfo")
+	public R save(@Valid @RequestBody OrderInfoEntity orderInfo) {
+		return R.status(orderInfoService.save(orderInfo));
+	}
+
+	/**
+	 * 创建订单信息
+	 */
+	@PostMapping("/add")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入orderInfo")
+	public R save(@RequestParam Long propertyChargeRecordId) {
+		return R.data(orderInfoService.createOrderByPropertyChargeRecordId(propertyChargeRecordId));
+	}
+
+	/**
+	 * 订单信息 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入orderInfo")
+	public R update(@Valid @RequestBody OrderInfoEntity orderInfo) {
+		return R.status(orderInfoService.updateById(orderInfo));
+	}
+
+	/**
+	 * 订单信息 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入orderInfo")
+	public R submit(@Valid @RequestBody OrderInfoEntity orderInfo) {
+		return R.status(orderInfoService.saveOrUpdate(orderInfo));
+	}
+
+	/**
+	 * 订单信息 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(orderInfoService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/controller/PaymentInfoController.java b/src/main/java/org/springblade/modules/pay/controller/PaymentInfoController.java
new file mode 100644
index 0000000..0c13196
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/controller/PaymentInfoController.java
@@ -0,0 +1,125 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import org.springblade.modules.pay.vo.PaymentInfoVO;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.pay.wrapper.PaymentInfoWrapper;
+import org.springblade.modules.pay.service.IPaymentInfoService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 支付信息 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-paymentInfo/paymentInfo")
+@Api(value = "支付信息", tags = "支付信息接口")
+public class PaymentInfoController extends BladeController {
+
+	private final IPaymentInfoService paymentInfoService;
+
+	/**
+	 * 支付信息 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入paymentInfo")
+	public R<PaymentInfoVO> detail(PaymentInfoEntity paymentInfo) {
+		PaymentInfoEntity detail = paymentInfoService.getOne(Condition.getQueryWrapper(paymentInfo));
+		return R.data(PaymentInfoWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 支付信息 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入paymentInfo")
+	public R<IPage<PaymentInfoVO>> list(PaymentInfoEntity paymentInfo, Query query) {
+		IPage<PaymentInfoEntity> pages = paymentInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(paymentInfo));
+		return R.data(PaymentInfoWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 支付信息 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入paymentInfo")
+	public R<IPage<PaymentInfoVO>> page(PaymentInfoVO paymentInfo, Query query) {
+		IPage<PaymentInfoVO> pages = paymentInfoService.selectPaymentInfoPage(Condition.getPage(query), paymentInfo);
+		return R.data(pages);
+	}
+
+	/**
+	 * 支付信息 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入paymentInfo")
+	public R save(@Valid @RequestBody PaymentInfoEntity paymentInfo) {
+		return R.status(paymentInfoService.save(paymentInfo));
+	}
+
+	/**
+	 * 支付信息 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入paymentInfo")
+	public R update(@Valid @RequestBody PaymentInfoEntity paymentInfo) {
+		return R.status(paymentInfoService.updateById(paymentInfo));
+	}
+
+	/**
+	 * 支付信息 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入paymentInfo")
+	public R submit(@Valid @RequestBody PaymentInfoEntity paymentInfo) {
+		return R.status(paymentInfoService.saveOrUpdate(paymentInfo));
+	}
+
+	/**
+	 * 支付信息 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(paymentInfoService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/controller/RefundInfoController.java b/src/main/java/org/springblade/modules/pay/controller/RefundInfoController.java
new file mode 100644
index 0000000..9a88bd8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/controller/RefundInfoController.java
@@ -0,0 +1,125 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import org.springblade.modules.pay.service.IRefundInfoService;
+import org.springblade.modules.pay.vo.RefundInfoVO;
+import org.springblade.modules.pay.wrapper.RefundInfoWrapper;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 退款信息 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-refundInfo/refundInfo")
+@Api(value = "退款信息", tags = "退款信息接口")
+public class RefundInfoController extends BladeController {
+
+	private final IRefundInfoService refundInfoService;
+
+	/**
+	 * 退款信息 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入refundInfo")
+	public R<RefundInfoVO> detail(RefundInfoEntity refundInfo) {
+		RefundInfoEntity detail = refundInfoService.getOne(Condition.getQueryWrapper(refundInfo));
+		return R.data(RefundInfoWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 退款信息 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入refundInfo")
+	public R<IPage<RefundInfoVO>> list(RefundInfoEntity refundInfo, Query query) {
+		IPage<RefundInfoEntity> pages = refundInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(refundInfo));
+		return R.data(RefundInfoWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 退款信息 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入refundInfo")
+	public R<IPage<RefundInfoVO>> page(RefundInfoVO refundInfo, Query query) {
+		IPage<RefundInfoVO> pages = refundInfoService.selectRefundInfoPage(Condition.getPage(query), refundInfo);
+		return R.data(pages);
+	}
+
+	/**
+	 * 退款信息 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入refundInfo")
+	public R save(@Valid @RequestBody RefundInfoEntity refundInfo) {
+		return R.status(refundInfoService.save(refundInfo));
+	}
+
+	/**
+	 * 退款信息 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入refundInfo")
+	public R update(@Valid @RequestBody RefundInfoEntity refundInfo) {
+		return R.status(refundInfoService.updateById(refundInfo));
+	}
+
+	/**
+	 * 退款信息 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入refundInfo")
+	public R submit(@Valid @RequestBody RefundInfoEntity refundInfo) {
+		return R.status(refundInfoService.saveOrUpdate(refundInfo));
+	}
+
+	/**
+	 * 退款信息 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(refundInfoService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/dto/OrderInfoDTO.java b/src/main/java/org/springblade/modules/pay/dto/OrderInfoDTO.java
new file mode 100644
index 0000000..de45776
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/dto/OrderInfoDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.dto;
+
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 订单信息 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class OrderInfoDTO extends OrderInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/dto/PaymentInfoDTO.java b/src/main/java/org/springblade/modules/pay/dto/PaymentInfoDTO.java
new file mode 100644
index 0000000..0eca252
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/dto/PaymentInfoDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.dto;
+
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 支付信息 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PaymentInfoDTO extends PaymentInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/dto/RefundInfoDTO.java b/src/main/java/org/springblade/modules/pay/dto/RefundInfoDTO.java
new file mode 100644
index 0000000..41b82ac
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/dto/RefundInfoDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.dto;
+
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 退款信息 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RefundInfoDTO extends RefundInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/entity/OrderInfoEntity.java b/src/main/java/org/springblade/modules/pay/entity/OrderInfoEntity.java
new file mode 100644
index 0000000..f7e08e3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/entity/OrderInfoEntity.java
@@ -0,0 +1,100 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 订单信息 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@TableName("jczz_order_info")
+@ApiModel(value = "OrderInfo对象", description = "订单信息")
+public class OrderInfoEntity {
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 订单标题 */
+	@ApiModelProperty(value = "订单标题", example = "")
+	@TableField("title")
+	private String title;
+
+	/** 商户订单编号 */
+	@ApiModelProperty(value = "商户订单编号", example = "")
+	@TableField("order_no")
+	private String orderNo;
+
+	/** 用户id */
+	@ApiModelProperty(value = "用户id", example = "")
+	@TableField("user_id")
+	private Long userId;
+
+	/** 支付产品id */
+	@ApiModelProperty(value = "支付产品id", example = "")
+	@TableField("proper_charge_record_id")
+	private Long properChargeRecordId;
+
+	/** 订单二维码连接 */
+	@ApiModelProperty(value = "订单二维码连接", example = "")
+	@TableField("code_url")
+	private String codeUrl;
+
+	/** 订单金额(分) */
+	@ApiModelProperty(value = "订单金额(分)", example = "")
+	@TableField("total_fee")
+	private Integer totalFee;
+
+	/** 订单状态 */
+	@ApiModelProperty(value = "订单状态", example = "")
+	@TableField("order_status")
+	private String orderStatus;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("create_time")
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("update_time")
+	private Date updateTime;
+
+	/** 物业id */
+	@ApiModelProperty(value = "物业id", example = "")
+	@TableField("proper_id")
+	private Long properId;
+}
diff --git a/src/main/java/org/springblade/modules/pay/entity/PaymentInfoEntity.java b/src/main/java/org/springblade/modules/pay/entity/PaymentInfoEntity.java
new file mode 100644
index 0000000..46c08d3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/entity/PaymentInfoEntity.java
@@ -0,0 +1,95 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 支付信息 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@TableName("jczz_payment_info")
+@ApiModel(value = "PaymentInfo对象", description = "支付信息")
+public class PaymentInfoEntity {
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 订单编号 */
+	@ApiModelProperty(value = "订单编号", example = "")
+	@TableField("order_no")
+	private String orderNo;
+
+	/** 支付系统交易编号 */
+	@ApiModelProperty(value = "支付系统交易编号", example = "")
+	@TableField("transaction_id")
+	private String transactionId;
+
+	/** 支付类型 */
+	@ApiModelProperty(value = "支付类型", example = "")
+	@TableField("payment_type")
+	private String paymentType;
+
+	/** 交易类型 */
+	@ApiModelProperty(value = "交易类型", example = "")
+	@TableField("trade_type")
+	private String tradeType;
+
+	/** 交易状态 */
+	@ApiModelProperty(value = "交易状态", example = "")
+	@TableField("trade_state")
+	private String tradeState;
+
+	/** 支付金额(分) */
+	@ApiModelProperty(value = "支付金额(分)", example = "")
+	@TableField("payer_total")
+	private Integer payerTotal;
+
+	/** 通知参数 */
+	@ApiModelProperty(value = "通知参数", example = "")
+	@TableField("content")
+	private String content;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("create_time")
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("update_time")
+	private Date updateTime;
+}
diff --git a/src/main/java/org/springblade/modules/pay/entity/RefundInfoEntity.java b/src/main/java/org/springblade/modules/pay/entity/RefundInfoEntity.java
new file mode 100644
index 0000000..ec28d2e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/entity/RefundInfoEntity.java
@@ -0,0 +1,102 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 退款信息 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@TableName("jczz_refund_info")
+@ApiModel(value = "RefundInfo对象", description = "退款信息")
+public class RefundInfoEntity  {
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 订单编号 */
+	@ApiModelProperty(value = "订单编号", example = "")
+	@TableField("order_no")
+	private String orderNo;
+
+	/** 退款单编号 */
+	@ApiModelProperty(value = "退款单编号", example = "")
+	@TableField("refund_no")
+	private String refundNo;
+
+	/** 支付系统退款单号 */
+	@ApiModelProperty(value = "支付系统退款单号", example = "")
+	@TableField("refund_id")
+	private String refundId;
+
+	/** 原订单金额(分) */
+	@ApiModelProperty(value = "原订单金额(分)", example = "")
+	@TableField("total_fee")
+	private Integer totalFee;
+
+	/** 退款金额(分) */
+	@ApiModelProperty(value = "退款金额(分)", example = "")
+	@TableField("refund")
+	private Integer refund;
+
+	/** 退款原因 */
+	@ApiModelProperty(value = "退款原因", example = "")
+	@TableField("reason")
+	private String reason;
+
+	/** 退款单状态 */
+	@ApiModelProperty(value = "退款单状态", example = "")
+	@TableField("refund_status")
+	private String refundStatus;
+
+	/** 申请退款返回参数 */
+	@ApiModelProperty(value = "申请退款返回参数", example = "")
+	@TableField("content_return")
+	private String contentReturn;
+
+	/** 退款结果通知参数 */
+	@ApiModelProperty(value = "退款结果通知参数", example = "")
+	@TableField("content_notify")
+	private String contentNotify;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/entity/WeChatMiniAuthorizeVo.java b/src/main/java/org/springblade/modules/pay/entity/WeChatMiniAuthorizeVo.java
new file mode 100644
index 0000000..13625aa
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/entity/WeChatMiniAuthorizeVo.java
@@ -0,0 +1,39 @@
+package org.springblade.modules.pay.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="WeChatMiniAuthorizeVo对象", description="微信小程序用户授权返回数据")
+public class WeChatMiniAuthorizeVo implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    @ApiModelProperty(value = "会话密钥")
+    @JSONField(name = "session_key")
+    private String sessionKey;
+
+    @ApiModelProperty(value = "用户唯一标识")
+    @JSONField(name = "openid")
+    private String openId;
+
+    @ApiModelProperty(value = "用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回")
+    @JSONField(name = "unionid")
+    private String unionId;
+
+    @ApiModelProperty(value = "错误码")
+    @JSONField(name = "errcode")
+    private String errCode;
+
+    @ApiModelProperty(value = "错误信息")
+    @JSONField(name = "errmsg")
+    private String errMsg;
+}
diff --git a/src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.java b/src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.java
new file mode 100644
index 0000000..a6c5f59
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.java
@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.mapper;
+
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import org.springblade.modules.pay.vo.OrderInfoVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 订单信息 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public interface OrderInfoMapper extends BaseMapper<OrderInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param orderInfo
+	 * @return
+	 */
+	List<OrderInfoVO> selectOrderInfoPage(IPage page, OrderInfoVO orderInfo);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.xml b/src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.xml
new file mode 100644
index 0000000..adbec62
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/mapper/OrderInfoMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.pay.mapper.OrderInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="orderInfoResultMap" type="org.springblade.modules.pay.vo.OrderInfoVO">
+    </resultMap>
+
+
+    <select id="selectOrderInfoPage" resultMap="orderInfoResultMap">
+        select * from jczz_order_info where is_deleted = 0
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.java b/src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.java
new file mode 100644
index 0000000..875b7c5
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.java
@@ -0,0 +1,59 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.mapper;
+
+import org.springblade.modules.pay.dto.PaymentInfoDTO;
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import org.springblade.modules.pay.vo.PaymentInfoVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 支付信息 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public interface PaymentInfoMapper extends BaseMapper<PaymentInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param paymentInfo
+	 * @return
+	 */
+	List<PaymentInfoVO> selectPaymentInfoPage(IPage page, PaymentInfoVO paymentInfo);
+
+
+	/**
+	 * 查询支付信息
+	 *
+	 * @param id 支付信息ID
+	 * @return 支付信息
+	 */
+	public PaymentInfoDTO selectPaymentInfoById(Long id);
+
+	/**
+	 * 查询支付信息列表
+	 *
+	 * @param paymentInfoDTO 支付信息
+	 * @return 支付信息集合
+	 */
+	public List<PaymentInfoDTO> selectPaymentInfoList(PaymentInfoDTO paymentInfoDTO);
+}
diff --git a/src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.xml b/src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.xml
new file mode 100644
index 0000000..266d878
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/mapper/PaymentInfoMapper.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.pay.mapper.PaymentInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="paymentInfoResultMap" type="org.springblade.modules.pay.entity.PaymentInfoEntity">
+    </resultMap>
+
+
+    <select id="selectPaymentInfoPage" resultMap="paymentInfoResultMap">
+        select * from jczz_payment_info where is_deleted = 0
+    </select>
+
+    <resultMap type="org.springblade.modules.pay.dto.PaymentInfoDTO" id="PaymentInfoDTOResult">
+        <result property="id"    column="id"    />
+        <result property="orderNo"    column="order_no"    />
+        <result property="transactionId"    column="transaction_id"    />
+        <result property="paymentType"    column="payment_type"    />
+        <result property="tradeType"    column="trade_type"    />
+        <result property="tradeState"    column="trade_state"    />
+        <result property="payerTotal"    column="payer_total"    />
+        <result property="content"    column="content"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectPaymentInfo">
+        select
+            id,
+            order_no,
+            transaction_id,
+            payment_type,
+            trade_type,
+            trade_state,
+            payer_total,
+            content,
+            create_time,
+            update_time
+        from
+            jczz_payment_info
+    </sql>
+
+    <select id="selectPaymentInfoById" parameterType="long" resultMap="PaymentInfoDTOResult">
+        <include refid="selectPaymentInfo"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectPaymentInfoList" parameterType="org.springblade.modules.pay.dto.PaymentInfoDTO" resultMap="PaymentInfoDTOResult">
+        <include refid="selectPaymentInfo"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="orderNo != null  and orderNo != ''"> and order_no = #{orderNo}</if>
+            <if test="transactionId != null  and transactionId != ''"> and transaction_id = #{transactionId}</if>
+            <if test="paymentType != null  and paymentType != ''"> and payment_type = #{paymentType}</if>
+            <if test="tradeType != null  and tradeType != ''"> and trade_type = #{tradeType}</if>
+            <if test="tradeState != null  and tradeState != ''"> and trade_state = #{tradeState}</if>
+            <if test="payerTotal != null  and payerTotal != ''"> and payer_total = #{payerTotal}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+        </where>
+    </select>
+</mapper>
diff --git a/src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.java b/src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.java
new file mode 100644
index 0000000..f42ae01
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.java
@@ -0,0 +1,60 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.mapper;
+
+import org.springblade.modules.pay.dto.RefundInfoDTO;
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import org.springblade.modules.pay.vo.RefundInfoVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 退款信息 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public interface RefundInfoMapper extends BaseMapper<RefundInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param refundInfo
+	 * @return
+	 */
+	List<RefundInfoVO> selectRefundInfoPage(IPage page, RefundInfoVO refundInfo);
+
+	/**
+	 * 查询退款信息
+	 *
+	 * @param id 退款信息ID
+	 * @return 退款信息
+	 */
+	public RefundInfoDTO selectRefundInfoById(Long id);
+
+	/**
+	 * 查询退款信息列表
+	 *
+	 * @param refundInfoDTO 退款信息
+	 * @return 退款信息集合
+	 */
+	public List<RefundInfoDTO> selectRefundInfoList(RefundInfoDTO refundInfoDTO);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.xml b/src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.xml
new file mode 100644
index 0000000..511768f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/mapper/RefundInfoMapper.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.pay.mapper.RefundInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="refundInfoResultMap" type="org.springblade.modules.pay.entity.RefundInfoEntity">
+    </resultMap>
+
+
+    <select id="selectRefundInfoPage" resultMap="refundInfoResultMap">
+        select * from jczz_refund_info where is_deleted = 0
+    </select>
+    <resultMap type="org.springblade.modules.pay.dto.RefundInfoDTO" id="RefundInfoDTOResult">
+        <result property="id"    column="id"    />
+        <result property="orderNo"    column="order_no"    />
+        <result property="refundNo"    column="refund_no"    />
+        <result property="refundId"    column="refund_id"    />
+        <result property="totalFee"    column="total_fee"    />
+        <result property="refund"    column="refund"    />
+        <result property="reason"    column="reason"    />
+        <result property="refundStatus"    column="refund_status"    />
+        <result property="contentReturn"    column="content_return"    />
+        <result property="contentNotify"    column="content_notify"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRefundInfo">
+        select
+            id,
+            order_no,
+            refund_no,
+            refund_id,
+            total_fee,
+            refund,
+            reason,
+            refund_status,
+            content_return,
+            content_notify,
+            create_time,
+            update_time
+        from
+            jczz_refund_info
+    </sql>
+
+    <select id="selectRefundInfoById" parameterType="long" resultMap="RefundInfoDTOResult">
+        <include refid="selectRefundInfo"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectRefundInfoList" parameterType="org.springblade.modules.pay.dto.RefundInfoDTO" resultMap="RefundInfoDTOResult">
+        <include refid="selectRefundInfo"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="orderNo != null "> and order_no = #{orderNo}</if>
+            <if test="refundNo != null "> and refund_no = #{refundNo}</if>
+            <if test="refundId != null "> and refund_id = #{refundId}</if>
+            <if test="totalFee != null  and totalFee != ''"> and total_fee = #{totalFee}</if>
+            <if test="refund != null  and refund != ''"> and refund = #{refund}</if>
+            <if test="reason != null  and reason != ''"> and reason = #{reason}</if>
+            <if test="refundStatus != null  and refundStatus != ''"> and refund_status = #{refundStatus}</if>
+            <if test="contentReturn != null  and contentReturn != ''"> and content_return = #{contentReturn}</if>
+            <if test="contentNotify != null  and contentNotify != ''"> and content_notify = #{contentNotify}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/pay/service/IOrderInfoService.java b/src/main/java/org/springblade/modules/pay/service/IOrderInfoService.java
new file mode 100644
index 0000000..1ded657
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/service/IOrderInfoService.java
@@ -0,0 +1,59 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.common.enums.OrderStatus;
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import org.springblade.modules.pay.vo.OrderInfoVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 订单信息 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public interface IOrderInfoService extends IService<OrderInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param orderInfo
+	 * @return
+	 */
+	IPage<OrderInfoVO> selectOrderInfoPage(IPage<OrderInfoVO> page, OrderInfoVO orderInfo);
+
+
+	OrderInfoEntity createOrderByPropertyChargeRecordId(Long propertyChargeRecordId);
+
+	void saveCodeUrl(String orderNo, String codeUrl);
+
+	List<OrderInfoEntity> listOrderByCreateTimeDesc();
+
+	void updateStatusByOrderNo(String orderNo, OrderStatus orderStatus);
+
+	String getOrderStatus(String orderNo);
+
+	List<OrderInfoEntity> getNoPayOrderByDuration(int minutes);
+
+	OrderInfoEntity getOrderByOrderNo(String orderNo);
+}
diff --git a/src/main/java/org/springblade/modules/pay/service/IPaymentInfoService.java b/src/main/java/org/springblade/modules/pay/service/IPaymentInfoService.java
new file mode 100644
index 0000000..f2501c2
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/service/IPaymentInfoService.java
@@ -0,0 +1,45 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import org.springblade.modules.pay.vo.PaymentInfoVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 支付信息 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public interface IPaymentInfoService extends IService<PaymentInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param paymentInfo
+	 * @return
+	 */
+	IPage<PaymentInfoVO> selectPaymentInfoPage(IPage<PaymentInfoVO> page, PaymentInfoVO paymentInfo);
+
+	void createPaymentInfo(String plainText);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/service/IRefundInfoService.java b/src/main/java/org/springblade/modules/pay/service/IRefundInfoService.java
new file mode 100644
index 0000000..a1eab06
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/service/IRefundInfoService.java
@@ -0,0 +1,46 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import org.springblade.modules.pay.vo.RefundInfoVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 退款信息 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public interface IRefundInfoService extends IService<RefundInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param refundInfo
+	 * @return
+	 */
+	IPage<RefundInfoVO> selectRefundInfoPage(IPage<RefundInfoVO> page, RefundInfoVO refundInfo);
+
+
+	RefundInfoEntity createRefundByOrderNo(String orderNo, String reason);
+
+	void updateRefund(String plainText);
+}
diff --git a/src/main/java/org/springblade/modules/pay/service/impl/OrderInfoServiceImpl.java b/src/main/java/org/springblade/modules/pay/service/impl/OrderInfoServiceImpl.java
new file mode 100644
index 0000000..e3cfef6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/service/impl/OrderInfoServiceImpl.java
@@ -0,0 +1,207 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.enums.OrderStatus;
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import org.springblade.modules.pay.vo.OrderInfoVO;
+import org.springblade.modules.pay.mapper.OrderInfoMapper;
+import org.springblade.modules.pay.service.IOrderInfoService;
+import org.springblade.modules.property.entity.PropertyChargeRecord;
+import org.springblade.modules.property.service.IPropertyChargeRecordService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * 订单信息 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Service
+public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfoEntity> implements IOrderInfoService {
+
+	private static Logger logger = LoggerFactory.getLogger(OrderInfoServiceImpl.class);
+
+
+	@Resource
+	private IPropertyChargeRecordService iPropertyChargeRecordService;
+
+	@Override
+	public IPage<OrderInfoVO> selectOrderInfoPage(IPage<OrderInfoVO> page, OrderInfoVO orderInfo) {
+		return page.setRecords(baseMapper.selectOrderInfoPage(page, orderInfo));
+	}
+
+
+	@Override
+	public OrderInfoEntity createOrderByPropertyChargeRecordId(Long propertyChargeRecordId) {
+
+		//查找已存在但未支付的订单
+		OrderInfoEntity orderInfo = this.getNoPayOrderByPropertyChargeRecordId(propertyChargeRecordId);
+		if( orderInfo != null){
+			return orderInfo;
+		}
+		//获取商品信息
+		PropertyChargeRecord propertyChargeRecord = iPropertyChargeRecordService.getById(propertyChargeRecordId);
+		//生成订单
+		orderInfo = new OrderInfoEntity();
+		orderInfo.setTitle(propertyChargeRecord.getPayContent());
+		orderInfo.setOrderNo(getOrderNoStr()); //订单号
+		orderInfo.setProperChargeRecordId(propertyChargeRecordId);
+		orderInfo.setTotalFee(propertyChargeRecord.getPayPrice().intValue()); //分
+		orderInfo.setOrderStatus(OrderStatus.NOTPAY.getType());
+		baseMapper.insert(orderInfo);
+		return orderInfo;
+	}
+
+	/**
+	 * 存储订单二维码
+	 * @param orderNo
+	 * @param codeUrl
+	 */
+	@Override
+	public void saveCodeUrl(String orderNo, String codeUrl) {
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_no", orderNo);
+
+		OrderInfoEntity orderInfo = new OrderInfoEntity();
+		orderInfo.setCodeUrl(codeUrl);
+
+		baseMapper.update(orderInfo, queryWrapper);
+	}
+
+	/**
+	 * 查询订单列表,并倒序查询
+	 * @return
+	 */
+	@Override
+	public List<OrderInfoEntity> listOrderByCreateTimeDesc() {
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<OrderInfoEntity>().orderByDesc("create_time");
+		return baseMapper.selectList(queryWrapper);
+	}
+
+	/**
+	 * 根据订单号更新订单状态
+	 * @param orderNo
+	 * @param orderStatus
+	 */
+	@Override
+	public void updateStatusByOrderNo(String orderNo, OrderStatus orderStatus) {
+
+		logger.info("更新订单状态 ===> {}", orderStatus.getType());
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_no", orderNo);
+
+		OrderInfoEntity orderInfo = new OrderInfoEntity();
+		orderInfo.setOrderStatus(orderStatus.getType());
+
+		baseMapper.update(orderInfo, queryWrapper);
+	}
+
+	/**
+	 * 根据订单号获取订单状态
+	 * @param orderNo
+	 * @return
+	 */
+	@Override
+	public String getOrderStatus(String orderNo) {
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_no", orderNo);
+		OrderInfoEntity orderInfo = baseMapper.selectOne(queryWrapper);
+		if(orderInfo == null){
+			return null;
+		}
+		return orderInfo.getOrderStatus();
+	}
+
+	/**
+	 * 查询创建超过minutes分钟并且未支付的订单
+	 * @param minutes
+	 * @return
+	 */
+	@Override
+	public List<OrderInfoEntity> getNoPayOrderByDuration(int minutes) {
+
+		Instant instant = Instant.now().minus(Duration.ofMinutes(minutes));
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_status", OrderStatus.NOTPAY.getType());
+		queryWrapper.le("create_time", instant);
+
+		List<OrderInfoEntity> orderInfoList = baseMapper.selectList(queryWrapper);
+
+		return orderInfoList;
+	}
+
+	/**
+	 * 根据订单号获取订单
+	 * @param orderNo
+	 * @return
+	 */
+	@Override
+	public OrderInfoEntity getOrderByOrderNo(String orderNo) {
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("order_no", orderNo);
+		OrderInfoEntity orderInfo = baseMapper.selectOne(queryWrapper);
+
+		return orderInfo;
+	}
+
+
+	/**
+	 * 根据商品id查询未支付订单
+	 * 防止重复创建订单对象
+	 * @param propertyChargeRecordId
+	 * @return
+	 */
+	private OrderInfoEntity getNoPayOrderByPropertyChargeRecordId(Long propertyChargeRecordId) {
+
+		QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("product_id", propertyChargeRecordId);
+		queryWrapper.eq("order_status", OrderStatus.NOTPAY.getType());
+//        queryWrapper.eq("user_id", userId);
+		OrderInfoEntity orderInfo = baseMapper.selectOne(queryWrapper);
+		return orderInfo;
+	}
+
+	//生成订单号
+	public static String getOrderNoStr() {
+		String order = "pay" + new SimpleDateFormat("yyyyMMdd").format(new Date());
+		Random r = new Random();
+		for (int i = 0; i < 10; i++) {
+			order += r.nextInt(9);
+		}
+		return order;
+	}
+}
diff --git a/src/main/java/org/springblade/modules/pay/service/impl/PaymentInfoServiceImpl.java b/src/main/java/org/springblade/modules/pay/service/impl/PaymentInfoServiceImpl.java
new file mode 100644
index 0000000..a42515e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/service/impl/PaymentInfoServiceImpl.java
@@ -0,0 +1,88 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.enums.PayType;
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import org.springblade.modules.pay.mapper.PaymentInfoMapper;
+import org.springblade.modules.pay.vo.PaymentInfoVO;
+import org.springblade.modules.pay.service.IPaymentInfoService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 支付信息 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Service
+public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, PaymentInfoEntity> implements IPaymentInfoService {
+
+	private static Logger logger = LoggerFactory.getLogger(PaymentInfoServiceImpl.class);
+
+	@Override
+	public IPage<PaymentInfoVO> selectPaymentInfoPage(IPage<PaymentInfoVO> page, PaymentInfoVO paymentInfo) {
+		return page.setRecords(baseMapper.selectPaymentInfoPage(page, paymentInfo));
+	}
+
+	/**
+	 * 记录支付日志
+	 * @param plainText
+	 */
+	@Override
+	public void createPaymentInfo(String plainText) {
+
+		logger.info("记录支付日志");
+
+		Gson gson = new Gson();
+		HashMap plainTextMap = gson.fromJson(plainText, HashMap.class);
+
+		//订单号
+		String orderNo = (String)plainTextMap.get("out_trade_no");
+		//业务编号
+		String transactionId = (String)plainTextMap.get("transaction_id");
+		//支付类型
+		String tradeType = (String)plainTextMap.get("trade_type");
+		//交易状态
+		String tradeState = (String)plainTextMap.get("trade_state");
+		//用户实际支付金额
+		Map<String, Object> amount = (Map)plainTextMap.get("amount");
+		Integer payerTotal = ((Double) amount.get("payer_total")).intValue();
+
+		PaymentInfoEntity paymentInfo = new PaymentInfoEntity();
+		paymentInfo.setOrderNo(orderNo);
+		paymentInfo.setPaymentType(PayType.WXPAY.getType());
+		paymentInfo.setTransactionId(transactionId);
+		paymentInfo.setTradeType(tradeType);
+		paymentInfo.setTradeState(tradeState);
+		paymentInfo.setPayerTotal(payerTotal);
+		paymentInfo.setContent(plainText);
+
+		baseMapper.insert(paymentInfo);
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/service/impl/RefundInfoServiceImpl.java b/src/main/java/org/springblade/modules/pay/service/impl/RefundInfoServiceImpl.java
new file mode 100644
index 0000000..be4852f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/service/impl/RefundInfoServiceImpl.java
@@ -0,0 +1,118 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import org.springblade.modules.pay.mapper.RefundInfoMapper;
+import org.springblade.modules.pay.service.IOrderInfoService;
+import org.springblade.modules.pay.service.IRefundInfoService;
+import org.springblade.modules.pay.vo.RefundInfoVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+/**
+ * 退款信息 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Service
+public class RefundInfoServiceImpl extends ServiceImpl<RefundInfoMapper, RefundInfoEntity> implements IRefundInfoService {
+
+
+	@Resource
+	private IOrderInfoService orderInfoService;
+	@Override
+	public IPage<RefundInfoVO> selectRefundInfoPage(IPage<RefundInfoVO> page, RefundInfoVO refundInfo) {
+		return page.setRecords(baseMapper.selectRefundInfoPage(page, refundInfo));
+	}
+
+	@Override
+	public RefundInfoEntity createRefundByOrderNo(String orderNo, String reason) {
+
+		//根据订单号获取订单信息
+		OrderInfoEntity orderInfo = orderInfoService.getOne(Wrappers.<OrderInfoEntity>lambdaQuery()
+			.eq(OrderInfoEntity::getOrderNo, orderNo));
+
+		//根据订单号生成退款订单
+		RefundInfoEntity refundInfo = new RefundInfoEntity();
+		refundInfo.setOrderNo(orderNo);//订单编号
+		refundInfo.setRefundNo(getOrderNoStr());//退款单编号
+		refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(分)
+		refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(分)
+		refundInfo.setReason(reason);//退款原因
+
+		//保存退款订单
+		baseMapper.insert(refundInfo);
+
+		return refundInfo;
+	}
+
+
+	@Override
+	public void updateRefund(String content) {
+		//将json字符串转换成Map
+		Gson gson = new Gson();
+		Map<String, String> resultMap = gson.fromJson(content, HashMap.class);
+
+		//根据退款单编号修改退款单
+		QueryWrapper<RefundInfoEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("refund_no", resultMap.get("out_refund_no"));
+
+		//设置要修改的字段
+		RefundInfoEntity refundInfo = new RefundInfoEntity();
+
+		refundInfo.setRefundId(resultMap.get("refund_id"));//微信支付退款单号
+
+		//查询退款和申请退款中的返回参数
+		if(resultMap.get("status") != null){
+			refundInfo.setRefundStatus(resultMap.get("status"));//退款状态
+			refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段
+		}
+		//退款回调中的回调参数
+		if(resultMap.get("refund_status") != null){
+			refundInfo.setRefundStatus(resultMap.get("refund_status"));//退款状态
+			refundInfo.setContentNotify(content);//将全部响应结果存入数据库的content字段
+		}
+
+		//更新退款单
+		baseMapper.update(refundInfo, queryWrapper);
+	}
+
+
+	//生成订单号
+	public static String getOrderNoStr() {
+		String order = "refund" + new SimpleDateFormat("yyyyMMdd").format(new Date());
+		Random r = new Random();
+		for (int i = 0; i < 10; i++) {
+			order += r.nextInt(9);
+		}
+		return order;
+	}
+}
diff --git a/src/main/java/org/springblade/modules/pay/vo/OrderInfoVO.java b/src/main/java/org/springblade/modules/pay/vo/OrderInfoVO.java
new file mode 100644
index 0000000..7a1129c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/vo/OrderInfoVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.vo;
+
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 订单信息 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class OrderInfoVO extends OrderInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/vo/PaymentInfoVO.java b/src/main/java/org/springblade/modules/pay/vo/PaymentInfoVO.java
new file mode 100644
index 0000000..f137d6d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/vo/PaymentInfoVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.vo;
+
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 支付信息 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PaymentInfoVO extends PaymentInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/vo/RefundInfoVO.java b/src/main/java/org/springblade/modules/pay/vo/RefundInfoVO.java
new file mode 100644
index 0000000..d519c32
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/vo/RefundInfoVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.vo;
+
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 退款信息 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RefundInfoVO extends RefundInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/wrapper/OrderInfoWrapper.java b/src/main/java/org/springblade/modules/pay/wrapper/OrderInfoWrapper.java
new file mode 100644
index 0000000..962a6f3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/wrapper/OrderInfoWrapper.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.pay.entity.OrderInfoEntity;
+import org.springblade.modules.pay.vo.OrderInfoVO;
+
+import java.util.Objects;
+
+/**
+ * 订单信息 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public class OrderInfoWrapper extends BaseEntityWrapper<OrderInfoEntity, OrderInfoVO>  {
+
+	public static OrderInfoWrapper build() {
+		return new OrderInfoWrapper();
+ 	}
+
+	@Override
+	public OrderInfoVO entityVO(OrderInfoEntity orderInfo) {
+		OrderInfoVO orderInfoVO = Objects.requireNonNull(BeanUtil.copy(orderInfo, OrderInfoVO.class));
+
+		//User createUser = UserCache.getUser(orderInfo.getCreateUser());
+		//User updateUser = UserCache.getUser(orderInfo.getUpdateUser());
+		//orderInfoVO.setCreateUserName(createUser.getName());
+		//orderInfoVO.setUpdateUserName(updateUser.getName());
+
+		return orderInfoVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/wrapper/PaymentInfoWrapper.java b/src/main/java/org/springblade/modules/pay/wrapper/PaymentInfoWrapper.java
new file mode 100644
index 0000000..0cc7cfb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/wrapper/PaymentInfoWrapper.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.pay.entity.PaymentInfoEntity;
+import org.springblade.modules.pay.vo.PaymentInfoVO;
+
+import java.util.Objects;
+
+/**
+ * 支付信息 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public class PaymentInfoWrapper extends BaseEntityWrapper<PaymentInfoEntity, PaymentInfoVO>  {
+
+	public static PaymentInfoWrapper build() {
+		return new PaymentInfoWrapper();
+ 	}
+
+	@Override
+	public PaymentInfoVO entityVO(PaymentInfoEntity paymentInfo) {
+		PaymentInfoVO paymentInfoVO = Objects.requireNonNull(BeanUtil.copy(paymentInfo, PaymentInfoVO.class));
+
+		//User createUser = UserCache.getUser(paymentInfo.getCreateUser());
+		//User updateUser = UserCache.getUser(paymentInfo.getUpdateUser());
+		//paymentInfoVO.setCreateUserName(createUser.getName());
+		//paymentInfoVO.setUpdateUserName(updateUser.getName());
+
+		return paymentInfoVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/pay/wrapper/RefundInfoWrapper.java b/src/main/java/org/springblade/modules/pay/wrapper/RefundInfoWrapper.java
new file mode 100644
index 0000000..2ef166e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/pay/wrapper/RefundInfoWrapper.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.pay.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.pay.entity.RefundInfoEntity;
+import org.springblade.modules.pay.vo.RefundInfoVO;
+
+import java.util.Objects;
+
+/**
+ * 退款信息 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-07
+ */
+public class RefundInfoWrapper extends BaseEntityWrapper<RefundInfoEntity, RefundInfoVO>  {
+
+	public static RefundInfoWrapper build() {
+		return new RefundInfoWrapper();
+ 	}
+
+	@Override
+	public RefundInfoVO entityVO(RefundInfoEntity refundInfo) {
+		RefundInfoVO refundInfoVO = Objects.requireNonNull(BeanUtil.copy(refundInfo, RefundInfoVO.class));
+
+		//User createUser = UserCache.getUser(refundInfo.getCreateUser());
+		//User updateUser = UserCache.getUser(refundInfo.getUpdateUser());
+		//refundInfoVO.setCreateUserName(createUser.getName());
+		//refundInfoVO.setUpdateUserName(updateUser.getName());
+
+		return refundInfoVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/place/excel/ExportPlaceExcel.java b/src/main/java/org/springblade/modules/place/excel/ExportPlaceExcel.java
new file mode 100644
index 0000000..7fa9c67
--- /dev/null
+++ b/src/main/java/org/springblade/modules/place/excel/ExportPlaceExcel.java
@@ -0,0 +1,130 @@
+package org.springblade.modules.place.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+
+/**
+ * ExportPlaceExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ExportPlaceExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/** 场所名称 */
+	@ColumnWidth(25)
+	@ExcelProperty( "场所名称*")
+	private String placeName;
+
+	/** 场所负责人 */
+	@ColumnWidth(15)
+	@ExcelProperty( "场所负责人")
+	private String principal;
+
+	/** 场所负责人联系电话 */
+	@ColumnWidth(15)
+	@ExcelProperty( "场所负责人联系电话")
+	private String principalPhone;
+
+	/** 场所负责人身份证号 */
+	@ColumnWidth(15)
+	@ExcelProperty( "场所负责人身份证号")
+	private String principalIdCard;
+
+	/** 地址 */
+	@ColumnWidth(25)
+	@ExcelProperty( "地址")
+	private String location;
+
+	/** 经度 */
+	@ColumnWidth(25)
+	@ExcelProperty( "经度")
+	private String lng;
+
+	/** 纬度 */
+	@ColumnWidth(25)
+	@ExcelProperty( "纬度")
+	private String lat;
+
+	/** 街道名称 */
+	@ExcelProperty( "街道名称")
+	private String streetName;
+
+	/** 社区名称 */
+	@ExcelProperty( "社区名称")
+	private String communityName;
+
+	/** 网格名称 */
+	@ExcelProperty( "网格名称")
+	private String gridName;
+
+//
+//	/** 企业法定代表 */
+//	@ColumnWidth(15)
+//	@ExcelProperty( "企业法定代表")
+//	private String legalPerson;
+//
+//	/** 法定代表联系电话 */
+//	@ColumnWidth(15)
+//	@ExcelProperty( "法定代表联系电话")
+//	private String legalTel;
+//
+//	/** 企业法定代表身份证号码 */
+//	@ColumnWidth(15)
+//	@ExcelProperty( "企业法定代表身份证号码")
+//	private String legalIdCard;
+
+	/** 九小场所类型 */
+	@ExcelProperty( value = "九小场所类型",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "nineType")
+	@ExcelDictItemLabel(type = "nineType")
+	private String nineType;
+
+	/** 阵地类型 */
+	@ExcelProperty( value = "阵地类型",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "frontType")
+	@ExcelDictItemLabel(type = "frontType")
+	private String frontType;
+
+	/** 1:是 2:否  三级消防单位 */
+	@ExcelProperty("三级消防单位(是/否)")
+	private String threeFireProtection;
+
+	/** 无诈类别 */
+	@ExcelProperty(value = "无诈类别", converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "noExplosionCategory")
+	@ExcelDictItemLabel(type = "noExplosionCategory")
+	private String noExplosionCategory;
+
+	/** 标签分类代码 */
+	@ExcelProperty( "标签分类代码")
+	private String labelCode;
+
+	/** 备注 */
+	@ExcelProperty( "备注")
+	private String remark;
+
+	/** 审核状态 */
+	@ExcelProperty( "审核状态")
+	private String confirmFlag;
+
+	/** 是否有二维码 */
+	@ExcelProperty( "是否有二维码")
+	private String source;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/place/excel/ImportPlaceExcel.java b/src/main/java/org/springblade/modules/place/excel/ImportPlaceExcel.java
new file mode 100644
index 0000000..8d52f90
--- /dev/null
+++ b/src/main/java/org/springblade/modules/place/excel/ImportPlaceExcel.java
@@ -0,0 +1,124 @@
+package org.springblade.modules.place.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+
+/**
+ * HouseExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ImportPlaceExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	/** 门牌地址编码 */
+	@ExcelProperty( "门牌地址编码*")
+	private String houseCode;
+
+	/** 地址 */
+	@ColumnWidth(25)
+	@ExcelProperty( "地址")
+	private String location;
+
+	/** 经度 */
+	@ColumnWidth(25)
+	@ExcelProperty( "经度")
+	private String lng;
+
+	/** 纬度 */
+	@ColumnWidth(25)
+	@ExcelProperty( "纬度")
+	private String lat;
+
+	/** 街道名称 */
+	@ExcelProperty( "街道名称")
+	private String streetName;
+
+	/** 社区名称 */
+	@ExcelProperty( "社区名称")
+	private String communityName;
+
+	/** 网格名称 */
+	@ExcelProperty( "网格名称")
+	private String gridName;
+
+	/** 场所名称 */
+	@ColumnWidth(25)
+	@ExcelProperty( "场所名称*")
+	private String placeName;
+
+	/** 场所负责人 */
+	@ColumnWidth(15)
+	@ExcelProperty( "场所负责人")
+	private String principal;
+
+	/** 场所负责人联系电话 */
+	@ColumnWidth(15)
+	@ExcelProperty( "场所负责人联系电话")
+	private String principalPhone;
+
+	/** 场所负责人身份证号 */
+	@ColumnWidth(15)
+	@ExcelProperty( "场所负责人身份证号")
+	private String principalIdCard;
+
+	/** 企业法定代表 */
+	@ColumnWidth(15)
+	@ExcelProperty( "企业法定代表")
+	private String legalPerson;
+
+	/** 法定代表联系电话 */
+	@ColumnWidth(15)
+	@ExcelProperty( "法定代表联系电话")
+	private String legalTel;
+
+	/** 企业法定代表身份证号码 */
+	@ColumnWidth(15)
+	@ExcelProperty( "企业法定代表身份证号码")
+	private String legalIdCard;
+
+	/** 九小场所类型 */
+	@ExcelProperty( value = "九小场所类型",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "nineType")
+	@ExcelDictItemLabel(type = "nineType")
+	private String nineType;
+
+	/** 阵地类型 */
+	@ExcelProperty( value = "阵地类型",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "frontType")
+	@ExcelDictItemLabel(type = "frontType")
+	private String frontType;
+
+	/** 1:是 2:否  三级消防单位 */
+	@ExcelProperty("三级消防单位(是/否)")
+	private String threeFireProtection;
+
+	/** 无诈类别 */
+	@ExcelProperty(value = "无诈类别", converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "noExplosionCategory")
+	@ExcelDictItemLabel(type = "noExplosionCategory")
+	private String noExplosionCategory;
+
+	/** 标签分类代码 */
+	@ExcelProperty( "标签分类代码")
+	private String labelCode;
+
+	/** 备注 */
+	@ExcelProperty( "备注")
+	private String remark;
+
+}
+
diff --git a/src/main/java/org/springblade/modules/place/excel/ImportPractitionerExcel.java b/src/main/java/org/springblade/modules/place/excel/ImportPractitionerExcel.java
new file mode 100644
index 0000000..5a47fbd
--- /dev/null
+++ b/src/main/java/org/springblade/modules/place/excel/ImportPractitionerExcel.java
@@ -0,0 +1,95 @@
+package org.springblade.modules.place.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+
+/**
+ * 场所从业人员 实体类
+ *
+ * @author BladeX
+ * @since 2023-10-28
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ImportPractitionerExcel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 场所ID
+	 */
+	@ExcelProperty("地址编码*")
+	private String houseCode;
+
+	/**
+	 * 姓名
+	 */
+	@ExcelProperty("姓名")
+	private String name;
+
+	/**
+	 * 电话
+	 */
+	@ExcelProperty("电话")
+	private String telephone;
+
+	/**
+	 * 暂住地
+	 */
+	@ExcelProperty("暂住地")
+	private String tempAddress;
+
+	/**
+	 * 身份证
+	 */
+	@ExcelProperty("身份证")
+	private String idCard;
+
+	/**
+	 * 岗位
+	 */
+	@ExcelProperty("岗位")
+	private String jobNature;
+
+	/**
+	 * 民族
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "民族", converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "nationType")
+	@ExcelDictItem(type = "nationType")
+	private String ethnicity;
+
+	/**
+	 * 入职时间
+	 */
+	// @ExcelProperty("入职时间")
+	// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	// @DateTimeFormat("yyyy-MM-dd")
+	// private String employmentTime;
+
+	/**
+	 * 离职时间
+	 */
+	// @ExcelProperty("离职时间")
+	// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	// @DateTimeFormat("yyyy-MM-dd")
+	// private String resignationTime;
+
+	/**
+	 * 是离职 1:否 2:是
+	 */
+	@ExcelProperty("是离职 1:否 2:是")
+	private String resignationFlag;
+
+
+}
diff --git a/src/main/java/org/springblade/modules/place/excel/PractitionerExcel.java b/src/main/java/org/springblade/modules/place/excel/PractitionerExcel.java
new file mode 100644
index 0000000..e0d7653
--- /dev/null
+++ b/src/main/java/org/springblade/modules/place/excel/PractitionerExcel.java
@@ -0,0 +1,106 @@
+package org.springblade.modules.place.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+import org.springblade.common.excel.ExcelDictItemLabel;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 场所从业人员 实体类
+ *
+ * @author BladeX
+ * @since 2023-10-28
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class PractitionerExcel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 场所ID
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "地址编码*")
+	private String houseCode;
+
+	/**
+	 * 姓名
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "姓名")
+	private String name;
+
+	/**
+	 * 电话
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "电话")
+	private String telephone;
+
+	/**
+	 * 暂住地
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "暂住地")
+	private String tempAddress;
+
+	/**
+	 * 身份证
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "身份证")
+	private String idCard;
+
+	/**
+	 * 岗位
+	 */
+	@ExcelProperty(value = "岗位")
+	private String jobNature;
+
+	/**
+	 * 民族
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "民族", converter = ExcelDictConverter.class)
+	@ExcelDictItemLabel(type = "nationType")
+	@ExcelDictItem(type = "nationType")
+	private String ethnicity;
+
+	/**
+	 * 入职时间
+	 */
+	// @ColumnWidth(15)
+	// @ExcelProperty(value = "入职时间")
+	// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	// @DateTimeFormat("yyyy-MM-dd")
+	// private String employmentTime;
+
+	/**
+	 * 离职时间
+	 */
+	// @ColumnWidth(15)
+	// @ExcelProperty(value = "离职时间")
+	// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	// @DateTimeFormat("yyyy-MM-dd")
+	// private String resignationTime;
+
+	/**
+	 * 是离职 1:否 2:是
+	 */
+	@ColumnWidth(15)
+	@ExcelProperty(value = "是离职 1:否 2:是")
+	private String resignationFlag;
+
+}
diff --git a/src/main/java/org/springblade/modules/police/controller/PolicTrajectoryPointController.java b/src/main/java/org/springblade/modules/police/controller/PolicTrajectoryPointController.java
new file mode 100644
index 0000000..a6013d2
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/controller/PolicTrajectoryPointController.java
@@ -0,0 +1,125 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import org.springblade.modules.police.vo.PolicTrajectoryPointVO;
+import org.springblade.modules.police.wrapper.PolicTrajectoryPointWrapper;
+import org.springblade.modules.police.service.IPolicTrajectoryPointService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 用户轨迹记录 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-policTrajectoryPoint/policTrajectoryPoint")
+@Api(value = "用户轨迹记录", tags = "用户轨迹记录接口")
+public class PolicTrajectoryPointController extends BladeController {
+
+	private final IPolicTrajectoryPointService policTrajectoryPointService;
+
+	/**
+	 * 用户轨迹记录 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入policTrajectoryPoint")
+	public R<PolicTrajectoryPointVO> detail(PolicTrajectoryPointEntity policTrajectoryPoint) {
+		PolicTrajectoryPointEntity detail = policTrajectoryPointService.getOne(Condition.getQueryWrapper(policTrajectoryPoint));
+		return R.data(PolicTrajectoryPointWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 用户轨迹记录 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入policTrajectoryPoint")
+	public R<IPage<PolicTrajectoryPointVO>> list(PolicTrajectoryPointEntity policTrajectoryPoint, Query query) {
+		IPage<PolicTrajectoryPointEntity> pages = policTrajectoryPointService.page(Condition.getPage(query), Condition.getQueryWrapper(policTrajectoryPoint));
+		return R.data(PolicTrajectoryPointWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 用户轨迹记录 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入policTrajectoryPoint")
+	public R<IPage<PolicTrajectoryPointVO>> page(PolicTrajectoryPointVO policTrajectoryPoint, Query query) {
+		IPage<PolicTrajectoryPointVO> pages = policTrajectoryPointService.selectPolicTrajectoryPointPage(Condition.getPage(query), policTrajectoryPoint);
+		return R.data(pages);
+	}
+
+	/**
+	 * 用户轨迹记录 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入policTrajectoryPoint")
+	public R save(@Valid @RequestBody PolicTrajectoryPointEntity policTrajectoryPoint) {
+		return R.status(policTrajectoryPointService.save(policTrajectoryPoint));
+	}
+
+	/**
+	 * 用户轨迹记录 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入policTrajectoryPoint")
+	public R update(@Valid @RequestBody PolicTrajectoryPointEntity policTrajectoryPoint) {
+		return R.status(policTrajectoryPointService.updateById(policTrajectoryPoint));
+	}
+
+	/**
+	 * 用户轨迹记录 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入policTrajectoryPoint")
+	public R submit(@Valid @RequestBody PolicTrajectoryPointEntity policTrajectoryPoint) {
+		return R.status(policTrajectoryPointService.saveOrUpdate(policTrajectoryPoint));
+	}
+
+	/**
+	 * 用户轨迹记录 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(policTrajectoryPointService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/police/controller/PoliceAlarmRecordsController.java b/src/main/java/org/springblade/modules/police/controller/PoliceAlarmRecordsController.java
new file mode 100644
index 0000000..57ab702
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/controller/PoliceAlarmRecordsController.java
@@ -0,0 +1,137 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+import org.springblade.modules.police.vo.PoliceAlarmRecordsVO;
+import org.springblade.modules.police.wrapper.PoliceAlarmRecordsWrapper;
+import org.springblade.modules.police.service.IPoliceAlarmRecordsService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 报警记录 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-policeAlarmRecords/policeAlarmRecords")
+@Api(value = "报警记录", tags = "报警记录接口")
+public class PoliceAlarmRecordsController extends BladeController {
+
+	private final IPoliceAlarmRecordsService policeAlarmRecordsService;
+	private final BladeLogger bladeLogger;
+
+	/**
+	 * 报警记录 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入policeAlarmRecords")
+	public R detail(PoliceAlarmRecordsEntity policeAlarmRecords) {
+		PoliceAlarmRecordsEntity detail = policeAlarmRecordsService.getOne(Condition.getQueryWrapper(policeAlarmRecords));
+		return R.data(detail);
+	}
+	/**
+	 * 报警记录 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入policeAlarmRecords")
+	public R<IPage<PoliceAlarmRecordsVO>> list(PoliceAlarmRecordsEntity policeAlarmRecords, Query query) {
+		IPage<PoliceAlarmRecordsEntity> pages = policeAlarmRecordsService.page(Condition.getPage(query), Condition.getQueryWrapper(policeAlarmRecords));
+		return R.data(PoliceAlarmRecordsWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 报警记录 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiLog("报警记录 自定义分页")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入policeAlarmRecords")
+	public R<IPage<PoliceAlarmRecordsVO>> page(PoliceAlarmRecordsVO policeAlarmRecords, Query query) {
+		bladeLogger.info("报警记录 自定义分页", JsonUtil.toJson(policeAlarmRecords));
+		IPage<PoliceAlarmRecordsVO> pages = policeAlarmRecordsService.selectPoliceAlarmRecordsPage(Condition.getPage(query), policeAlarmRecords);
+		return R.data(pages);
+	}
+
+	/**
+	 * 报警记录 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiLog("报警记录 新增")
+	@ApiOperation(value = "新增", notes = "传入policeAlarmRecords")
+	public R save(@Valid @RequestBody PoliceAlarmRecordsEntity policeAlarmRecords) {
+		bladeLogger.info("报警记录 新增", JsonUtil.toJson(policeAlarmRecords));
+		return R.status(policeAlarmRecordsService.savePoliceAlarmRecordsEntity(policeAlarmRecords));
+	}
+
+	/**
+	 * 报警记录 修改
+	 */
+	@PostMapping("/update")
+	@ApiLog("报警记录 修改")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入policeAlarmRecords")
+	public R update(@Valid @RequestBody PoliceAlarmRecordsEntity policeAlarmRecords) {
+		bladeLogger.info("报警记录 修改", JsonUtil.toJson(policeAlarmRecords));
+		return R.status(policeAlarmRecordsService.updateById(policeAlarmRecords));
+	}
+
+	/**
+	 * 报警记录 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入policeAlarmRecords")
+	public R submit(@Valid @RequestBody PoliceAlarmRecordsEntity policeAlarmRecords) {
+		return R.status(policeAlarmRecordsService.saveOrUpdate(policeAlarmRecords));
+	}
+
+	/**
+	 * 报警记录 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiLog("报警记录 删除")
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		bladeLogger.info("报警记录 删除", JsonUtil.toJson(ids));
+		return R.status(policeAlarmRecordsService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/police/dto/PolicTrajectoryPointDTO.java b/src/main/java/org/springblade/modules/police/dto/PolicTrajectoryPointDTO.java
new file mode 100644
index 0000000..517c79b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/dto/PolicTrajectoryPointDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.dto;
+
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户轨迹记录 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PolicTrajectoryPointDTO extends PolicTrajectoryPointEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/police/dto/PoliceAlarmRecordsDTO.java b/src/main/java/org/springblade/modules/police/dto/PoliceAlarmRecordsDTO.java
new file mode 100644
index 0000000..03dbbf9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/dto/PoliceAlarmRecordsDTO.java
@@ -0,0 +1,18 @@
+package org.springblade.modules.police.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+
+/**
+ * 报警记录 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PoliceAlarmRecordsDTO extends PoliceAlarmRecordsEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/police/entity/PolicTrajectoryPointEntity.java b/src/main/java/org/springblade/modules/police/entity/PolicTrajectoryPointEntity.java
new file mode 100644
index 0000000..3eeba29
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/entity/PolicTrajectoryPointEntity.java
@@ -0,0 +1,95 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 用户轨迹记录 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Data
+@TableName("jczz_polic_trajectory_point")
+@ApiModel(value = "PolicTrajectoryPoint对象", description = "用户轨迹记录")
+
+public class PolicTrajectoryPointEntity   {
+
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/** 用户id */
+	@ApiModelProperty(value = "用户id", example = "")
+	@TableField("user_id")
+	private Long userId;
+
+	/** 纬度 */
+	@ApiModelProperty(value = "纬度", example = "")
+	@TableField("latitude")
+	private Double latitude;
+
+	/** 经度 */
+	@ApiModelProperty(value = "经度", example = "")
+	@TableField("longitude")
+	private Double longitude;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 速度,单位 m/s */
+	@ApiModelProperty(value = "速度,单位 m/s", example = "")
+	@TableField("speed")
+	private Double speed;
+
+	/** 位置的精确度 */
+	@ApiModelProperty(value = "位置的精确度", example = "")
+	@TableField("accuracy")
+	private Double accuracy;
+
+	/** 高度,单位 m */
+	@ApiModelProperty(value = "高度,单位 m", example = "")
+	@TableField("altitude")
+	private Double altitude;
+
+	/** 垂直精度,单位 m(Android 无法获取,返回 0) */
+	@ApiModelProperty(value = "垂直精度,单位 m(Android 无法获取,返回 0)", example = "")
+	@TableField("verticalAccuracy")
+	private Double verticalAccuracy;
+
+	/** 水平精度,单位 m */
+	@ApiModelProperty(value = "水平精度,单位 m", example = "")
+	@TableField("horizontalAccuracy")
+	private Double horizontalAccuracy;
+}
diff --git a/src/main/java/org/springblade/modules/police/entity/PoliceAlarmRecordsEntity.java b/src/main/java/org/springblade/modules/police/entity/PoliceAlarmRecordsEntity.java
new file mode 100644
index 0000000..caaa120
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/entity/PoliceAlarmRecordsEntity.java
@@ -0,0 +1,155 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 报警记录 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+@Data
+@TableName("jczz_police_alarm_records")
+@ApiModel(value = "PoliceAlarmRecords对象", description = "报警记录")
+public class PoliceAlarmRecordsEntity {
+	private static final long serialVersionUID = 1L;
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/** 房屋编码 */
+	@ApiModelProperty(value = "房屋编码", example = "")
+	@TableField("house_code")
+	private String houseCode;
+
+	/** 地址 */
+	@ApiModelProperty(value = "地址", example = "")
+	@TableField("address")
+	private String address;
+
+	/** 报警人名称 */
+	@ApiModelProperty(value = "报警人名称", example = "")
+	@TableField("name")
+	private String name;
+
+	/** 报警人电话 */
+	@ApiModelProperty(value = "报警人电话", example = "")
+	@TableField("phone")
+	private String phone;
+
+	/** (刑事案件、治安案件、纠纷、救助、举报) */
+	@ApiModelProperty(value = "(刑事案件、治安案件、纠纷、救助、举报)", example = "")
+	@TableField("alarm_type")
+	private String alarmType;
+
+	/** 0:否 1:是   是否受伤  */
+	@ApiModelProperty(value = "0:否 1:是   是否受伤 ", example = "")
+	@TableField("injury_flag")
+	private Integer injuryFlag;
+
+	/** 网格编码 */
+	@ApiModelProperty(value = "网格编码", example = "")
+	@TableField("grid_code")
+	private String gridCode;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 接警人id */
+	@ApiModelProperty(value = "接警人id", example = "")
+	@TableField("police_id")
+	private Long policeId;
+
+	/** 接警人名称 */
+	@ApiModelProperty(value = "接警人名称", example = "")
+	@TableField("police_name")
+	private String policeName;
+
+	/** 接警人电话 */
+	@ApiModelProperty(value = "接警人电话", example = "")
+	@TableField("police_phone")
+	private String policePhone;
+
+	/** 0:否 1:是 */
+	@ApiModelProperty(value = "0:否 1:是", example = "")
+	@TableField("is_deleted")
+	private Integer isDeleted;
+
+	/** 性别 */
+	@ApiModelProperty(value = "性别", example = "")
+	@TableField("gender")
+	private Integer gender;
+
+	/** 警务网格编码 */
+	@ApiModelProperty(value = "警务网格编码", example = "")
+	@TableField("jw_grid_code")
+	private String jwGridCode;
+
+	/** 接警时间 */
+	@ApiModelProperty(value = "接警时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("alarm_response_time")
+	private Date alarmResponseTime;
+
+	/** 报警内容 */
+	@ApiModelProperty(value = "报警内容", example = "")
+	@TableField("alarm_describe")
+	private String alarmDescribe;
+
+	/** 公安事件:1:否  2:是 */
+	@ApiModelProperty(value = "公安事件:1:否  2:是", example = "")
+	@TableField("public_incidents")
+	private Integer publicIncidents;
+
+	/** 1:待处置 2:已处置 */
+	@ApiModelProperty(value = "1:待处置 2:已处置", example = "")
+	@TableField("status")
+	private Integer status;
+
+	/** 经度 */
+	@ApiModelProperty(value = "经度", example = "")
+	@TableField("longitude")
+	private String longitude;
+
+	/** 纬度 */
+	@ApiModelProperty(value = "纬度", example = "")
+	@TableField("latitude")
+	private String latitude;
+
+}
diff --git a/src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.java b/src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.java
new file mode 100644
index 0000000..b9a1773
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.java
@@ -0,0 +1,59 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.mapper;
+
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springblade.modules.police.dto.PolicTrajectoryPointDTO;
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import org.springblade.modules.police.vo.PolicTrajectoryPointVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 用户轨迹记录 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+public interface PolicTrajectoryPointMapper extends BaseMapper<PolicTrajectoryPointEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param policTrajectoryPoint
+	 * @return
+	 */
+	List<PolicTrajectoryPointVO> selectPolicTrajectoryPointPage(IPage page, @Param("policTrajectoryPoint") PolicTrajectoryPointVO policTrajectoryPoint);
+	/**
+	 * 查询用户轨迹记录
+	 *
+	 * @param id 用户轨迹记录ID
+	 * @return 用户轨迹记录
+	 */
+	public PolicTrajectoryPointDTO selectPolicTrajectoryPointById(Long id);
+
+	/**
+	 * 查询用户轨迹记录列表
+	 *
+	 * @param policTrajectoryPointDTO 用户轨迹记录
+	 * @return 用户轨迹记录集合
+	 */
+	public List<PolicTrajectoryPointDTO> selectPolicTrajectoryPointList(PolicTrajectoryPointDTO policTrajectoryPointDTO);
+
+}
diff --git a/src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.xml b/src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.xml
new file mode 100644
index 0000000..d5aa79d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/mapper/PolicTrajectoryPointMapper.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.police.mapper.PolicTrajectoryPointMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="policTrajectoryPointResultMap" type="org.springblade.modules.police.entity.PolicTrajectoryPointEntity">
+    </resultMap>
+
+
+    <select id="selectPolicTrajectoryPointPage" resultMap="policTrajectoryPointResultMap">
+        select * from jczz_polic_trajectory_point
+        <where>
+            <if test="policTrajectoryPoint.id != null "> and id = #{policTrajectoryPoint.id}</if>
+            <if test="policTrajectoryPoint.userId != null "> and user_id = #{policTrajectoryPoint.userId}</if>
+            <if test="policTrajectoryPoint.latitude != null "> and latitude = #{policTrajectoryPoint.latitude}</if>
+            <if test="policTrajectoryPoint.longitude != null "> and longitude = #{policTrajectoryPoint.longitude}</if>
+            <if test="policTrajectoryPoint.createTimeStr != null and policTrajectoryPoint.createTimeStr != '' "> and DATE(create_time) = #{policTrajectoryPoint.createTimeStr}</if>
+            <if test="policTrajectoryPoint.speed != null "> and speed = #{policTrajectoryPoint.speed}</if>
+            <if test="policTrajectoryPoint.accuracy != null "> and accuracy = #{policTrajectoryPoint.accuracy}</if>
+            <if test="policTrajectoryPoint.altitude != null "> and altitude = #{policTrajectoryPoint.altitude}</if>
+            <if test="policTrajectoryPoint.verticalAccuracy != null "> and verticalAccuracy = #{policTrajectoryPoint.verticalAccuracy}</if>
+            <if test="policTrajectoryPoint.horizontalAccuracy != null "> and horizontalAccuracy = #{policTrajectoryPoint.horizontalAccuracy}</if>
+        </where>
+    </select>
+    <resultMap type="org.springblade.modules.police.dto.PolicTrajectoryPointDTO" id="PolicTrajectoryPointDTOResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="latitude"    column="latitude"    />
+        <result property="longitude"    column="longitude"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="speed"    column="speed"    />
+        <result property="accuracy"    column="accuracy"    />
+        <result property="altitude"    column="altitude"    />
+        <result property="verticalAccuracy"    column="verticalAccuracy"    />
+        <result property="horizontalAccuracy"    column="horizontalAccuracy"    />
+    </resultMap>
+
+    <sql id="selectPolicTrajectoryPoint">
+        select
+            id,
+            user_id,
+            latitude,
+            longitude,
+            create_time,
+            speed,
+            accuracy,
+            altitude,
+            verticalAccuracy,
+            horizontalAccuracy
+        from
+            jczz_polic_trajectory_point
+    </sql>
+
+    <select id="selectPolicTrajectoryPointById" parameterType="long" resultMap="PolicTrajectoryPointDTOResult">
+        <include refid="selectPolicTrajectoryPoint"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectPolicTrajectoryPointList" parameterType="org.springblade.modules.police.dto.PolicTrajectoryPointDTO" resultMap="PolicTrajectoryPointDTOResult">
+        <include refid="selectPolicTrajectoryPoint"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="latitude != null "> and latitude = #{latitude}</if>
+            <if test="longitude != null "> and longitude = #{longitude}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="speed != null "> and speed = #{speed}</if>
+            <if test="accuracy != null "> and accuracy = #{accuracy}</if>
+            <if test="altitude != null "> and altitude = #{altitude}</if>
+            <if test="verticalAccuracy != null "> and verticalAccuracy = #{verticalAccuracy}</if>
+            <if test="horizontalAccuracy != null "> and horizontalAccuracy = #{horizontalAccuracy}</if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.java b/src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.java
new file mode 100644
index 0000000..5de2215
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+import org.springblade.modules.police.vo.PoliceAlarmRecordsVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 报警记录 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+public interface PoliceAlarmRecordsMapper extends BaseMapper<PoliceAlarmRecordsEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param policeAlarmRecords
+	 * @param isAdministrator
+	 * @param regionChildCodesList
+	 * @param gridCodeList
+	 * @return
+	 */
+	List<PoliceAlarmRecordsVO> selectPoliceAlarmRecordsPage(IPage page,
+															@Param("vo") PoliceAlarmRecordsVO policeAlarmRecords,
+															@Param("isAdministrator") Integer isAdministrator,
+															@Param("regionChildCodesList") List<String> regionChildCodesList,
+															@Param("gridCodeList") List<String> gridCodeList);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.xml b/src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.xml
new file mode 100644
index 0000000..3b056d9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/mapper/PoliceAlarmRecordsMapper.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.police.mapper.PoliceAlarmRecordsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="policeAlarmRecordsResultMap" type="org.springblade.modules.police.vo.PoliceAlarmRecordsVO">
+    </resultMap>
+
+
+    <select id="selectPoliceAlarmRecordsPage" resultMap="policeAlarmRecordsResultMap">
+        select
+        jpar.*,
+        bdb.dict_value as alarmTypeName,
+        jpag.pcs_name
+        from jczz_police_alarm_records jpar
+        LEFT JOIN jczz_grid jg on jg.grid_code = jpar.grid_code and jg.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jpar.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        LEFT JOIN blade_region br on br.code = jpag.community_code
+        LEFT JOIN blade_dict_biz bdb ON bdb.dict_key = jpar.alarm_type and bdb.is_deleted = 0 and bdb.code = 'applyAlarmType'
+        <where>
+            <if test="vo.status != null">
+                and jpar.status = #{vo.status}
+            </if>
+            <if test="vo.alarmDescribe != null and vo.alarmDescribe != ''">
+                and jpar.alarm_describe like concat('%',#{vo.alarmDescribe},'%')
+            </if>
+            <if test="vo.policeName != null and vo.policeName != ''">
+                and jpar.police_name like concat('%',#{vo.policeName},'%')
+            </if>
+
+            <if test="vo.pcsName != null and vo.pcsName != ''">
+                and jpag.pcs_name like concat('%',#{vo.pcsName},'%')
+            </if>
+            <if test="vo.startTime != null and vo.startTime != ''">
+                and date_format(jpar.create_time,'%Y-%m-%d') &gt;= #{vo.startTime}
+            </if>
+            <if test="vo.endTime != null and vo.endTime != ''">
+                and date_format(jpar.create_time,'%Y-%m-%d') &lt;= #{vo.endTime}
+            </if>
+            <if test="vo.searchKey!=null and vo.searchKey!=''">
+                and CONCAT(
+                ifnull(jpar.name,''),
+                ifnull(jpar.phone,''),
+                ifnull(jpar.address,''),
+                ifnull(jpar.alarm_describe,''),
+                ifnull(jpar.police_name,'')
+                ) like CONCAT ('%', #{vo.searchKey},'%')
+            </if>
+            <if test="isAdministrator==2">
+                <choose>
+                    <when test="vo.roleName != null and vo.roleName != ''">
+                        <if test="vo.roleName=='wgy'">
+                            <choose>
+                                <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                    and jg.grid_code in
+                                    <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jg.grid_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                        <if test="vo.roleName=='mj'">
+                            <choose>
+                                <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                    and jpag.community_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                        #{code}
+                                    </foreach>
+                                    <if test="vo.policeId != null">
+                                        or jpar.police_id = #{vo.policeId}
+                                    </if>
+                                </when>
+                                <otherwise>
+                                    and jpag.community_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                    </when>
+                    <otherwise>
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and
+                                (
+                                jg.grid_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                or
+                                jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                )
+                            </when>
+                            <otherwise>
+                                and
+                                (
+                                jg.grid_code in ('') or jpag.community_code in ('')
+                                )
+                            </otherwise>
+                        </choose>
+                    </otherwise>
+                </choose>
+            </if>
+           and jpar.is_deleted = 0
+        </where>
+        order by jpar.id desc,jpar.create_time desc
+    </select>
+
+    <resultMap type="org.springblade.modules.police.dto.PoliceAlarmRecordsDTO" id="PoliceAlarmRecordsDTOResult">
+        <result property="id"    column="id"    />
+        <result property="houseCode"    column="house_code"    />
+        <result property="address"    column="address"    />
+        <result property="name"    column="name"    />
+        <result property="phone"    column="phone"    />
+        <result property="alarmType"    column="alarm_type"    />
+        <result property="injuryFlag"    column="injury_flag"    />
+        <result property="gridCode"    column="grid_code"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="policeId"    column="police_id"    />
+        <result property="policeName"    column="police_name"    />
+        <result property="policePhone"    column="police_phone"    />
+        <result property="isDeleted"    column="is_deleted"    />
+        <result property="gender"    column="gender"    />
+        <result property="jwGridCode"    column="jw_grid_code"    />
+        <result property="alarmResponseTime"    column="alarm_response_time"    />
+        <result property="alarmDescribe"    column="alarm_describe"    />
+        <result property="publicIncidents"    column="public_incidents"    />
+        <result property="status"    column="status"    />
+        <result property="longitude"    column="longitude"    />
+        <result property="latitude"    column="latitude"    />
+    </resultMap>
+
+    <sql id="selectPoliceAlarmRecords">
+        select
+            id,
+            house_code,
+            address,
+            name,
+            phone,
+            alarm_type,
+            injury_flag,
+            grid_code,
+            create_time,
+            update_time,
+            police_id,
+            police_name,
+            police_phone,
+            is_deleted,
+            gender,
+            jw_grid_code,
+            alarm_response_time,
+            alarm_describe,
+            public_incidents,
+            status,
+            longitude,
+            latitude
+        from
+            jczz_police_alarm_records
+    </sql>
+
+<!--    <select id="selectPoliceAlarmRecordsById" parameterType="long" resultMap="PoliceAlarmRecordsDTOResult">-->
+<!--        <include refid="selectPoliceAlarmRecords"/>-->
+<!--        where-->
+<!--        id = #{id}-->
+<!--    </select>-->
+
+<!--    <select id="selectPoliceAlarmRecordsList" parameterType="rg.springblade.modules.dto.PoliceAlarmRecordsDTO" resultMap="PoliceAlarmRecordsDTOResult">-->
+<!--        <include refid="selectPoliceAlarmRecords"/>-->
+<!--        <where>-->
+<!--            <if test="id != null "> and id = #{id}</if>
+		<if test="houseCode != null  and houseCode != ''"> and house_code = #{houseCode}</if>
+		<if test="address != null  and address != ''"> and address = #{address}</if>
+		<if test="name != null  and name != ''"> and name = #{name}</if>
+		<if test="phone != null  and phone != ''"> and phone = #{phone}</if>
+		<if test="alarmType != null  and alarmType != ''"> and alarm_type = #{alarmType}</if>
+		<if test="injuryFlag != null "> and injury_flag = #{injuryFlag}</if>
+		<if test="gridCode != null  and gridCode != ''"> and grid_code = #{gridCode}</if>
+		<if test="createTime != null "> and create_time = #{createTime}</if>
+		<if test="updateTime != null "> and update_time = #{updateTime}</if>
+		<if test="policeId != null "> and police_id = #{policeId}</if>
+		<if test="policeName != null  and policeName != ''"> and police_name = #{policeName}</if>
+		<if test="policePhone != null  and policePhone != ''"> and police_phone = #{policePhone}</if>
+		<if test="isDeleted != null "> and is_deleted = #{isDeleted}</if>
+		<if test="gender != null "> and gender = #{gender}</if>
+		<if test="jwGridCode != null  and jwGridCode != ''"> and jw_grid_code = #{jwGridCode}</if>
+		<if test="alarmResponseTime != null "> and alarm_response_time = #{alarmResponseTime}</if>
+		<if test="alarmDescribe != null  and alarmDescribe != ''"> and alarm_describe = #{alarmDescribe}</if>
+		<if test="publicIncidents != null "> and public_incidents = #{publicIncidents}</if>
+		<if test="status != null "> and status = #{status}</if>-->
+<!--        </where>-->
+<!--    </select>-->
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/police/service/IPolicTrajectoryPointService.java b/src/main/java/org/springblade/modules/police/service/IPolicTrajectoryPointService.java
new file mode 100644
index 0000000..f248ad4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/service/IPolicTrajectoryPointService.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import org.springblade.modules.police.vo.PolicTrajectoryPointVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 用户轨迹记录 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+public interface IPolicTrajectoryPointService extends IService<PolicTrajectoryPointEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param policTrajectoryPoint
+	 * @return
+	 */
+	IPage<PolicTrajectoryPointVO> selectPolicTrajectoryPointPage(IPage<PolicTrajectoryPointVO> page, PolicTrajectoryPointVO policTrajectoryPoint);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/police/service/IPoliceAlarmRecordsService.java b/src/main/java/org/springblade/modules/police/service/IPoliceAlarmRecordsService.java
new file mode 100644
index 0000000..96fd003
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/service/IPoliceAlarmRecordsService.java
@@ -0,0 +1,45 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+import org.springblade.modules.police.vo.PoliceAlarmRecordsVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 报警记录 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+public interface IPoliceAlarmRecordsService extends IService<PoliceAlarmRecordsEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param policeAlarmRecords
+	 * @return
+	 */
+	IPage<PoliceAlarmRecordsVO> selectPoliceAlarmRecordsPage(IPage<PoliceAlarmRecordsVO> page, PoliceAlarmRecordsVO policeAlarmRecords);
+
+	/**
+	 * 报警记录 新增
+	 */
+    boolean savePoliceAlarmRecordsEntity(PoliceAlarmRecordsEntity policeAlarmRecords);
+}
diff --git a/src/main/java/org/springblade/modules/police/service/impl/PolicTrajectoryPointServiceImpl.java b/src/main/java/org/springblade/modules/police/service/impl/PolicTrajectoryPointServiceImpl.java
new file mode 100644
index 0000000..4be9e54
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/service/impl/PolicTrajectoryPointServiceImpl.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import org.springblade.modules.police.vo.PolicTrajectoryPointVO;
+import org.springblade.modules.police.mapper.PolicTrajectoryPointMapper;
+import org.springblade.modules.police.service.IPolicTrajectoryPointService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 用户轨迹记录 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Service
+public class PolicTrajectoryPointServiceImpl extends ServiceImpl<PolicTrajectoryPointMapper, PolicTrajectoryPointEntity> implements IPolicTrajectoryPointService {
+
+	@Override
+	public IPage<PolicTrajectoryPointVO> selectPolicTrajectoryPointPage(IPage<PolicTrajectoryPointVO> page, PolicTrajectoryPointVO policTrajectoryPoint) {
+		return page.setRecords(baseMapper.selectPolicTrajectoryPointPage(page, policTrajectoryPoint));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/police/service/impl/PoliceAlarmRecordsServiceImpl.java b/src/main/java/org/springblade/modules/police/service/impl/PoliceAlarmRecordsServiceImpl.java
new file mode 100644
index 0000000..fb8243c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/service/impl/PoliceAlarmRecordsServiceImpl.java
@@ -0,0 +1,81 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.utils.AuthUtils;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.grid.entity.GridEntity;
+import org.springblade.modules.grid.service.IGridService;
+import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+import org.springblade.modules.police.service.IPoliceAffairsGridService;
+import org.springblade.modules.police.vo.PoliceAlarmRecordsVO;
+import org.springblade.modules.police.mapper.PoliceAlarmRecordsMapper;
+import org.springblade.modules.police.service.IPoliceAlarmRecordsService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 报警记录 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+@Service
+public class PoliceAlarmRecordsServiceImpl extends ServiceImpl<PoliceAlarmRecordsMapper, PoliceAlarmRecordsEntity> implements IPoliceAlarmRecordsService {
+
+	@Override
+	public IPage<PoliceAlarmRecordsVO> selectPoliceAlarmRecordsPage(IPage<PoliceAlarmRecordsVO> page, PoliceAlarmRecordsVO policeAlarmRecords) {
+		policeAlarmRecords.setPoliceId(AuthUtil.getUserId());
+		CommonParamSet commonParamSet = new CommonParamSet<>().invoke(PoliceAlarmRecordsVO.class, policeAlarmRecords);
+		return page.setRecords(baseMapper.selectPoliceAlarmRecordsPage(page, policeAlarmRecords,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList()
+			));
+	}
+
+	/**
+	 * 报警记录 新增
+	 */
+	@Override
+	public boolean savePoliceAlarmRecordsEntity(PoliceAlarmRecordsEntity policeAlarmRecords) {
+		// 根据位置设置网格,警格编号
+		IGridService gridService = SpringUtils.getBean(IGridService.class);
+		IPoliceAffairsGridService policeAffairsGridService = SpringUtils.getBean(IPoliceAffairsGridService.class);
+		String point = "'POINT(" + policeAlarmRecords.getLongitude() + " " + policeAlarmRecords.getLatitude() + ")'";
+		//点坐标解析网格
+		List<GridEntity> gridEntityList = gridService.spatialAnalysis(point);
+		if (gridEntityList.size()>0){
+			GridEntity gridEntity = gridEntityList.get(0);
+			policeAlarmRecords.setGridCode(gridEntity.getGridCode());
+		}
+		//点坐标解析警格
+		List<PoliceAffairsGridEntity> policeAffairsGridEntityList = policeAffairsGridService.spatialAnalysis(point);
+		if (policeAffairsGridEntityList.size()>0){
+			PoliceAffairsGridEntity policeAffairsGridEntity = policeAffairsGridEntityList.get(0);
+			policeAlarmRecords.setJwGridCode(policeAffairsGridEntity.getJwGridCode());
+		}
+		// 插入
+		return save(policeAlarmRecords);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/police/vo/PolicTrajectoryPointVO.java b/src/main/java/org/springblade/modules/police/vo/PolicTrajectoryPointVO.java
new file mode 100644
index 0000000..bcd0cd9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/vo/PolicTrajectoryPointVO.java
@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.vo;
+
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户轨迹记录 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PolicTrajectoryPointVO extends PolicTrajectoryPointEntity {
+	private static final long serialVersionUID = 1L;
+
+	private String createTimeStr;
+
+}
diff --git a/src/main/java/org/springblade/modules/police/vo/PoliceAlarmRecordsVO.java b/src/main/java/org/springblade/modules/police/vo/PoliceAlarmRecordsVO.java
new file mode 100644
index 0000000..da022c2
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/vo/PoliceAlarmRecordsVO.java
@@ -0,0 +1,68 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 报警记录 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PoliceAlarmRecordsVO extends PoliceAlarmRecordsEntity {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 社区编号
+	 */
+	private String communityCode;
+
+	/**
+	 * 角色名称
+	 */
+	private String roleName;
+
+	/**
+	 * 搜索关键字
+	 */
+	private String searchKey;
+
+	/**
+	 * 报警类型名称
+	 */
+	private String alarmTypeName;
+
+	/**
+	 * 开始时间
+	 */
+	private String startTime;
+
+	/**
+	 * 结束时间
+	 */
+	private String endTime;
+
+	@ApiModelProperty(value = "派出所名称", example = "")
+	private String pcsName;
+
+}
diff --git a/src/main/java/org/springblade/modules/police/wrapper/PolicTrajectoryPointWrapper.java b/src/main/java/org/springblade/modules/police/wrapper/PolicTrajectoryPointWrapper.java
new file mode 100644
index 0000000..befae75
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/wrapper/PolicTrajectoryPointWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.police.entity.PolicTrajectoryPointEntity;
+import org.springblade.modules.police.vo.PolicTrajectoryPointVO;
+import java.util.Objects;
+
+/**
+ * 用户轨迹记录 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+public class PolicTrajectoryPointWrapper extends BaseEntityWrapper<PolicTrajectoryPointEntity, PolicTrajectoryPointVO>  {
+
+	public static PolicTrajectoryPointWrapper build() {
+		return new PolicTrajectoryPointWrapper();
+ 	}
+
+	@Override
+	public PolicTrajectoryPointVO entityVO(PolicTrajectoryPointEntity policTrajectoryPoint) {
+		PolicTrajectoryPointVO policTrajectoryPointVO = Objects.requireNonNull(BeanUtil.copy(policTrajectoryPoint, PolicTrajectoryPointVO.class));
+
+		//User createUser = UserCache.getUser(policTrajectoryPoint.getCreateUser());
+		//User updateUser = UserCache.getUser(policTrajectoryPoint.getUpdateUser());
+		//policTrajectoryPointVO.setCreateUserName(createUser.getName());
+		//policTrajectoryPointVO.setUpdateUserName(updateUser.getName());
+
+		return policTrajectoryPointVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/police/wrapper/PoliceAlarmRecordsWrapper.java b/src/main/java/org/springblade/modules/police/wrapper/PoliceAlarmRecordsWrapper.java
new file mode 100644
index 0000000..3d6bc6d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/police/wrapper/PoliceAlarmRecordsWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.police.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.police.entity.PoliceAlarmRecordsEntity;
+import org.springblade.modules.police.vo.PoliceAlarmRecordsVO;
+import java.util.Objects;
+
+/**
+ * 报警记录 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-13
+ */
+public class PoliceAlarmRecordsWrapper extends BaseEntityWrapper<PoliceAlarmRecordsEntity, PoliceAlarmRecordsVO>  {
+
+	public static PoliceAlarmRecordsWrapper build() {
+		return new PoliceAlarmRecordsWrapper();
+ 	}
+
+	@Override
+	public PoliceAlarmRecordsVO entityVO(PoliceAlarmRecordsEntity policeAlarmRecords) {
+		PoliceAlarmRecordsVO policeAlarmRecordsVO = Objects.requireNonNull(BeanUtil.copy(policeAlarmRecords, PoliceAlarmRecordsVO.class));
+
+		//User createUser = UserCache.getUser(policeAlarmRecords.getCreateUser());
+		//User updateUser = UserCache.getUser(policeAlarmRecords.getUpdateUser());
+		//policeAlarmRecordsVO.setCreateUserName(createUser.getName());
+		//policeAlarmRecordsVO.setUpdateUserName(updateUser.getName());
+
+		return policeAlarmRecordsVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/property/dto/PropertyChargeRecordDTO.java b/src/main/java/org/springblade/modules/property/dto/PropertyChargeRecordDTO.java
new file mode 100644
index 0000000..7762b9a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/property/dto/PropertyChargeRecordDTO.java
@@ -0,0 +1,18 @@
+package org.springblade.modules.property.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import org.springblade.modules.property.entity.PropertyChargeRecord;
+
+/**
+ * 缴费记录表对象 jczz_property_charge_record
+ *
+ * @author ${context.author}
+ * @date 2024-04-07 15:44:09
+ */
+@ApiModel(value = "PropertyChargeRecordDTO对象")
+@Data
+public class PropertyChargeRecordDTO extends PropertyChargeRecord
+{
+
+}
diff --git a/src/main/java/org/springblade/modules/property/vo/ExpenseDetails.java b/src/main/java/org/springblade/modules/property/vo/ExpenseDetails.java
new file mode 100644
index 0000000..94c0835
--- /dev/null
+++ b/src/main/java/org/springblade/modules/property/vo/ExpenseDetails.java
@@ -0,0 +1,32 @@
+package org.springblade.modules.property.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExpenseDetails {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("业主名称")
+	private String name;
+
+	@ApiModelProperty("房屋号")
+	private String houseName;
+
+	@ApiModelProperty("维修基金金额")
+	private Double maintenanceFundAmount;
+
+	@ApiModelProperty("分摊金额")
+	private Double allocationAmount;
+
+	@ApiModelProperty("支付金额")
+	private Double payment;
+
+	@ApiModelProperty("维修基金余额")
+	private Double maintenanceFundBalance;
+
+
+
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/controller/ReportController.java b/src/main/java/org/springblade/modules/report/controller/ReportController.java
new file mode 100644
index 0000000..c6e51c6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/controller/ReportController.java
@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.report.entity.ReportEntity;
+import org.springblade.modules.report.vo.ReportVO;
+import org.springblade.modules.report.wrapper.ReportWrapper;
+import org.springblade.modules.report.service.IReportService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 在线excel设计器 控制器
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-report/report")
+@Api(value = "在线excel设计器", tags = "在线excel设计器接口")
+public class ReportController extends BladeController {
+
+	private final IReportService reportService;
+
+	/**
+	 * 在线excel设计器 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入report")
+	public R<ReportVO> detail(ReportEntity report) {
+		ReportEntity detail = reportService.getOne(Condition.getQueryWrapper(report));
+		return R.data(ReportWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 在线excel设计器 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入report")
+	public R<IPage<ReportVO>> list(ReportEntity report, Query query) {
+		IPage<ReportEntity> pages = reportService.page(Condition.getPage(query), Condition.getQueryWrapper(report));
+		return R.data(ReportWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 在线excel设计器 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入report")
+	public R<IPage<ReportVO>> page(ReportVO report, Query query) {
+		IPage<ReportVO> pages = reportService.selectReportPage(Condition.getPage(query), report);
+		return R.data(pages);
+	}
+
+	/**
+	 * 在线excel设计器 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入report")
+	public R save(@Valid @RequestBody ReportEntity report) {
+		return R.status(reportService.save(report));
+	}
+
+	/**
+	 * 在线excel设计器 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入report")
+	public R update(@Valid @RequestBody ReportEntity report) {
+		return R.status(reportService.updateById(report));
+	}
+
+	/**
+	 * 在线excel设计器 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入report")
+	public R submit(@Valid @RequestBody ReportEntity report) {
+		return R.status(reportService.saveOrUpdate(report));
+	}
+
+	/**
+	 * 在线excel设计器 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(reportService.removeBatchByIds(Func.toStrList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/controller/ReportDbController.java b/src/main/java/org/springblade/modules/report/controller/ReportDbController.java
new file mode 100644
index 0000000..7457c29
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/controller/ReportDbController.java
@@ -0,0 +1,125 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.report.entity.ReportDbEntity;
+import org.springblade.modules.report.vo.ReportDbVO;
+import org.springblade.modules.report.wrapper.ReportDbWrapper;
+import org.springblade.modules.report.service.IReportDbService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 积木报表表 控制器
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-reportDb/reportDb")
+@Api(value = "积木报表表", tags = "积木报表表接口")
+public class ReportDbController extends BladeController {
+
+	private final IReportDbService reportDbService;
+
+	/**
+	 * 积木报表表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入reportDb")
+	public R<ReportDbVO> detail(ReportDbEntity reportDb) {
+		ReportDbEntity detail = reportDbService.getOne(Condition.getQueryWrapper(reportDb));
+		return R.data(ReportDbWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 积木报表表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入reportDb")
+	public R<IPage<ReportDbVO>> list(ReportDbEntity reportDb, Query query) {
+		IPage<ReportDbEntity> pages = reportDbService.page(Condition.getPage(query), Condition.getQueryWrapper(reportDb));
+		return R.data(ReportDbWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 积木报表表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入reportDb")
+	public R<IPage<ReportDbVO>> page(ReportDbVO reportDb, Query query) {
+		IPage<ReportDbVO> pages = reportDbService.selectReportDbPage(Condition.getPage(query), reportDb);
+		return R.data(pages);
+	}
+
+	/**
+	 * 积木报表表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入reportDb")
+	public R save(@Valid @RequestBody ReportDbEntity reportDb) {
+		return R.status(reportDbService.save(reportDb));
+	}
+
+	/**
+	 * 积木报表表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入reportDb")
+	public R update(@Valid @RequestBody ReportDbEntity reportDb) {
+		return R.status(reportDbService.updateById(reportDb));
+	}
+
+	/**
+	 * 积木报表表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入reportDb")
+	public R submit(@Valid @RequestBody ReportDbEntity reportDb) {
+		return R.status(reportDbService.saveOrUpdate(reportDb));
+	}
+
+	/**
+	 * 积木报表表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(reportDbService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/dto/ReportDTO.java b/src/main/java/org/springblade/modules/report/dto/ReportDTO.java
new file mode 100644
index 0000000..c09afac
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/dto/ReportDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.dto;
+
+import org.springblade.modules.report.entity.ReportEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 在线excel设计器 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ReportDTO extends ReportEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/report/dto/ReportDbDTO.java b/src/main/java/org/springblade/modules/report/dto/ReportDbDTO.java
new file mode 100644
index 0000000..134ef41
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/dto/ReportDbDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.dto;
+
+import org.springblade.modules.report.entity.ReportDbEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 数据源 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ReportDbDTO extends ReportDbEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/report/entity/ReportDbEntity.java b/src/main/java/org/springblade/modules/report/entity/ReportDbEntity.java
new file mode 100644
index 0000000..ed282f9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/entity/ReportDbEntity.java
@@ -0,0 +1,149 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 积木报表表 实体类
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+
+/**
+ * 对象 jimu_report_db
+ *
+ * @author ${context.author}
+ * @date 2024-06-26 14:26:27
+ */
+@ApiModel(value = "JimuReportDb对象", description = "")
+@Data
+@TableName("jimu_report_db")
+public class ReportDbEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_UUID)
+	private String id;
+
+	@ApiModelProperty(value = "主键字段", example = "")
+	@TableField("jimu_report_id")
+	private String jimuReportId;
+
+	@ApiModelProperty(value = "创建人登录名称", example = "")
+	@TableField("create_by")
+	private String createBy;
+
+	@ApiModelProperty(value = "更新人登录名称", example = "")
+	@TableField("update_by")
+	private String updateBy;
+
+	@ApiModelProperty(value = "创建日期", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("create_time")
+	private Date createTime;
+
+	@ApiModelProperty(value = "更新日期", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("update_time")
+	private Date updateTime;
+
+	@ApiModelProperty(value = "数据集编码", example = "")
+	@TableField("db_code")
+	private String dbCode;
+
+	@ApiModelProperty(value = "数据集名字", example = "")
+	@TableField("db_ch_name")
+	private String dbChName;
+
+	@ApiModelProperty(value = "数据源类型", example = "")
+	@TableField("db_type")
+	private String dbType;
+
+	@ApiModelProperty(value = "数据库表名", example = "")
+	@TableField("db_table_name")
+	private String dbTableName;
+
+	@ApiModelProperty(value = "动态查询SQL", example = "")
+	@TableField("db_dyn_sql")
+	private String dbDynSql;
+
+	@ApiModelProperty(value = "数据源KEY", example = "")
+	@TableField("db_key")
+	private String dbKey;
+
+	@ApiModelProperty(value = "填报数据源", example = "")
+	@TableField("tb_db_key")
+	private String tbDbKey;
+
+	@ApiModelProperty(value = "填报数据表", example = "")
+	@TableField("tb_db_table_name")
+	private String tbDbTableName;
+
+	@ApiModelProperty(value = "java类数据集  类型(spring:springkey,class:java类名)", example = "")
+	@TableField("java_type")
+	private String javaType;
+
+	@ApiModelProperty(value = "java类数据源  数值(bean key/java类名)", example = "")
+	@TableField("java_value")
+	private String javaValue;
+
+	@ApiModelProperty(value = "请求地址", example = "")
+	@TableField("api_url")
+	private String apiUrl;
+
+	@ApiModelProperty(value = "请求方法0-get,1-post", example = "")
+	@TableField("api_method")
+	private String apiMethod;
+
+	@ApiModelProperty(value = "是否是列表0否1是 默认0", example = "")
+	@TableField("is_list")
+	private String isList;
+
+	@ApiModelProperty(value = "是否作为分页,0:不分页,1:分页", example = "")
+	@TableField("is_page")
+	private String isPage;
+
+	@ApiModelProperty(value = "数据源", example = "")
+	@TableField("db_source")
+	private String dbSource;
+
+	@ApiModelProperty(value = "数据库类型 MYSQL ORACLE SQLSERVER", example = "")
+	@TableField("db_source_type")
+	private String dbSourceType;
+
+	@ApiModelProperty(value = "json数据,直接解析json内容", example = "")
+	@TableField("json_data")
+	private String jsonData;
+
+	@ApiModelProperty(value = "api转换器", example = "")
+	@TableField("api_convert")
+	private String apiConvert;
+}
+
diff --git a/src/main/java/org/springblade/modules/report/entity/ReportEntity.java b/src/main/java/org/springblade/modules/report/entity/ReportEntity.java
new file mode 100644
index 0000000..458010f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/entity/ReportEntity.java
@@ -0,0 +1,157 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 在线excel设计器 实体类
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+@Data
+@TableName("jimu_report")
+@ApiModel(value = "Report对象", description = "在线excel设计器")
+public class ReportEntity  {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/** 主键 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_UUID)
+	private String id;
+
+	/** 编码 */
+	@ApiModelProperty(value = "编码", example = "")
+	@TableField("code")
+	private String code;
+
+	/** 名称 */
+	@ApiModelProperty(value = "名称", example = "")
+	@TableField("name")
+	private String name;
+
+	/** 说明 */
+	@ApiModelProperty(value = "说明", example = "")
+	@TableField("note")
+	private String note;
+
+	/** 状态 */
+	@ApiModelProperty(value = "状态", example = "")
+	@TableField("status")
+	private String status;
+
+	/** 类型 */
+	@ApiModelProperty(value = "类型", example = "")
+	@TableField("type")
+	private String type;
+
+	/** json字符串 */
+	@ApiModelProperty(value = "json字符串", example = "")
+	@TableField("json_str")
+	private String jsonStr;
+
+	/** 请求地址 */
+	@ApiModelProperty(value = "请求地址", example = "")
+	@TableField("api_url")
+	private String apiUrl;
+
+	/** 缩略图 */
+	@ApiModelProperty(value = "缩略图", example = "")
+	@TableField("thumb")
+	private String thumb;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_by")
+	private String createBy;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("create_time")
+	private Date createTime;
+
+	/** 修改人 */
+	@ApiModelProperty(value = "修改人", example = "")
+	@TableField("update_by")
+	private String updateBy;
+
+	/** 修改时间 */
+	@ApiModelProperty(value = "修改时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("update_time")
+	private Date updateTime;
+
+	/** 删除标识0-正常,1-已删除 */
+	@ApiModelProperty(value = "删除标识0-正常,1-已删除", example = "")
+	@TableField("del_flag")
+	private Byte delFlag;
+
+	/** 请求方法0-get,1-post */
+	@ApiModelProperty(value = "请求方法0-get,1-post", example = "")
+	@TableField("api_method")
+	private String apiMethod;
+
+	/** 请求编码 */
+	@ApiModelProperty(value = "请求编码", example = "")
+	@TableField("api_code")
+	private String apiCode;
+
+	/** 是否是模板 0-是,1-不是 */
+	@ApiModelProperty(value = "是否是模板 0-是,1-不是", example = "")
+	@TableField("template")
+	private Byte template;
+
+	/** 浏览次数 */
+	@ApiModelProperty(value = "浏览次数", example = "")
+	@TableField("view_count")
+	private Long viewCount;
+
+	/** css增强 */
+	@ApiModelProperty(value = "css增强", example = "")
+	@TableField("css_str")
+	private String cssStr;
+
+	/** js增强 */
+	@ApiModelProperty(value = "js增强", example = "")
+	@TableField("js_str")
+	private String jsStr;
+
+	/** py增强 */
+	@ApiModelProperty(value = "py增强", example = "")
+	@TableField("py_str")
+	private String pyStr;
+
+	/** 多租户标识 */
+	@ApiModelProperty(value = "多租户标识", example = "")
+	@TableField("tenant_id")
+	private String tenantId;
+}
diff --git a/src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.java b/src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.java
new file mode 100644
index 0000000..c424646
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.mapper;
+
+import org.springblade.modules.report.entity.ReportDbEntity;
+import org.springblade.modules.report.vo.ReportDbVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 积木报表表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+public interface ReportDbMapper extends BaseMapper<ReportDbEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param reportDb
+	 * @return
+	 */
+	List<ReportDbVO> selectReportDbPage(IPage page, ReportDbVO reportDb);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.xml b/src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.xml
new file mode 100644
index 0000000..164adc5
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/mapper/ReportDbMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.report.mapper.ReportDbMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="reportDbResultMap" type="org.springblade.modules.report.entity.ReportDbEntity">
+    </resultMap>
+
+
+    <select id="selectReportDbPage" resultMap="reportDbResultMap">
+        select * from jimu_report_db order by create_time desc
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/report/mapper/ReportMapper.java b/src/main/java/org/springblade/modules/report/mapper/ReportMapper.java
new file mode 100644
index 0000000..3dbdaa5
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/mapper/ReportMapper.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.mapper;
+
+import org.springblade.modules.report.entity.ReportEntity;
+import org.springblade.modules.report.vo.ReportVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 在线excel设计器 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+public interface ReportMapper extends BaseMapper<ReportEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param report
+	 * @return
+	 */
+	List<ReportVO> selectReportPage(IPage page, ReportVO report);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/mapper/ReportMapper.xml b/src/main/java/org/springblade/modules/report/mapper/ReportMapper.xml
new file mode 100644
index 0000000..8c70609
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/mapper/ReportMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.report.mapper.ReportMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="reportResultMap" type="org.springblade.modules.report.entity.ReportEntity">
+    </resultMap>
+
+
+    <select id="selectReportPage" resultMap="reportResultMap">
+        select * from jimu_report  order by create_time desc
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/report/service/IReportDbService.java b/src/main/java/org/springblade/modules/report/service/IReportDbService.java
new file mode 100644
index 0000000..9702648
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/service/IReportDbService.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.report.entity.ReportDbEntity;
+import org.springblade.modules.report.vo.ReportDbVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 积木报表表 服务类
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+public interface IReportDbService extends IService<ReportDbEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param reportDb
+	 * @return
+	 */
+	IPage<ReportDbVO> selectReportDbPage(IPage<ReportDbVO> page, ReportDbVO reportDb);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/service/IReportService.java b/src/main/java/org/springblade/modules/report/service/IReportService.java
new file mode 100644
index 0000000..25d5284
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/service/IReportService.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.report.entity.ReportEntity;
+import org.springblade.modules.report.vo.ReportVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 在线excel设计器 服务类
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+public interface IReportService extends IService<ReportEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param report
+	 * @return
+	 */
+	IPage<ReportVO> selectReportPage(IPage<ReportVO> page, ReportVO report);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/service/impl/ReportDbServiceImpl.java b/src/main/java/org/springblade/modules/report/service/impl/ReportDbServiceImpl.java
new file mode 100644
index 0000000..b4b8a83
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/service/impl/ReportDbServiceImpl.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.report.entity.ReportDbEntity;
+import org.springblade.modules.report.vo.ReportDbVO;
+import org.springblade.modules.report.mapper.ReportDbMapper;
+import org.springblade.modules.report.service.IReportDbService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 积木报表表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+@Service
+public class ReportDbServiceImpl extends ServiceImpl<ReportDbMapper, ReportDbEntity> implements IReportDbService {
+
+	@Override
+	public IPage<ReportDbVO> selectReportDbPage(IPage<ReportDbVO> page, ReportDbVO reportDb) {
+		return page.setRecords(baseMapper.selectReportDbPage(page, reportDb));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/service/impl/ReportServiceImpl.java b/src/main/java/org/springblade/modules/report/service/impl/ReportServiceImpl.java
new file mode 100644
index 0000000..0524e03
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/service/impl/ReportServiceImpl.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.report.entity.ReportEntity;
+import org.springblade.modules.report.vo.ReportVO;
+import org.springblade.modules.report.mapper.ReportMapper;
+import org.springblade.modules.report.service.IReportService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 在线excel设计器 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+@Service
+public class ReportServiceImpl extends ServiceImpl<ReportMapper, ReportEntity> implements IReportService {
+
+	@Override
+	public IPage<ReportVO> selectReportPage(IPage<ReportVO> page, ReportVO report) {
+		return page.setRecords(baseMapper.selectReportPage(page, report));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/vo/ReportDbVO.java b/src/main/java/org/springblade/modules/report/vo/ReportDbVO.java
new file mode 100644
index 0000000..fd260c4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/vo/ReportDbVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.vo;
+
+import org.springblade.modules.report.entity.ReportDbEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 积木报表表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ReportDbVO extends ReportDbEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/report/vo/ReportVO.java b/src/main/java/org/springblade/modules/report/vo/ReportVO.java
new file mode 100644
index 0000000..fbebe7b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/vo/ReportVO.java
@@ -0,0 +1,35 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.vo;
+
+import org.springblade.modules.report.entity.ReportEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 在线excel设计器 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ReportVO extends ReportEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/report/wrapper/ReportDbWrapper.java b/src/main/java/org/springblade/modules/report/wrapper/ReportDbWrapper.java
new file mode 100644
index 0000000..7054e5c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/wrapper/ReportDbWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.report.entity.ReportDbEntity;
+import org.springblade.modules.report.vo.ReportDbVO;
+import java.util.Objects;
+
+/**
+ * 数据源 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-06-26
+ */
+public class ReportDbWrapper extends BaseEntityWrapper<ReportDbEntity, ReportDbVO>  {
+
+	public static ReportDbWrapper build() {
+		return new ReportDbWrapper();
+ 	}
+
+	@Override
+	public ReportDbVO entityVO(ReportDbEntity reportDb) {
+		ReportDbVO reportDbVO = Objects.requireNonNull(BeanUtil.copy(reportDb, ReportDbVO.class));
+
+		//User createUser = UserCache.getUser(reportDb.getCreateUser());
+		//User updateUser = UserCache.getUser(reportDb.getUpdateUser());
+		//reportDbVO.setCreateUserName(createUser.getName());
+		//reportDbVO.setUpdateUserName(updateUser.getName());
+
+		return reportDbVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/report/wrapper/ReportWrapper.java b/src/main/java/org/springblade/modules/report/wrapper/ReportWrapper.java
new file mode 100644
index 0000000..64770fa
--- /dev/null
+++ b/src/main/java/org/springblade/modules/report/wrapper/ReportWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.report.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.report.entity.ReportEntity;
+import org.springblade.modules.report.vo.ReportVO;
+import java.util.Objects;
+
+/**
+ * 在线excel设计器 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-06-27
+ */
+public class ReportWrapper extends BaseEntityWrapper<ReportEntity, ReportVO>  {
+
+	public static ReportWrapper build() {
+		return new ReportWrapper();
+ 	}
+
+	@Override
+	public ReportVO entityVO(ReportEntity report) {
+		ReportVO reportVO = Objects.requireNonNull(BeanUtil.copy(report, ReportVO.class));
+
+		//User createUser = UserCache.getUser(report.getCreateUser());
+		//User updateUser = UserCache.getUser(report.getUpdateUser());
+		//reportVO.setCreateUserName(createUser.getName());
+		//reportVO.setUpdateUserName(updateUser.getName());
+
+		return reportVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/resource/utils/ImageUtil.java b/src/main/java/org/springblade/modules/resource/utils/ImageUtil.java
new file mode 100644
index 0000000..797cb32
--- /dev/null
+++ b/src/main/java/org/springblade/modules/resource/utils/ImageUtil.java
@@ -0,0 +1,171 @@
+package org.springblade.modules.resource.utils;
+import lombok.extern.slf4j.Slf4j;
+import javax.imageio.ImageIO;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.URL;
+
+/**
+ * @author arsn
+ * @className ImageUtil
+ * @Description 图片缩放
+ **/
+@Slf4j
+public class ImageUtil {
+	/**
+	 * 缩放比例系数
+	 */
+	private static double SCALING = 0.56;
+	/**
+	 * 符合base64的宽
+	 */
+	private static int MAX_WIDTH = 560;
+	/**
+	 * 最大高
+	 */
+	private static int MAX_HEIGHT = 1000;
+
+	/**
+	 * @Author 小帅丶
+	 * @Description 根据图片公网地址转BufferedImage
+	 * @Date  2020/9/29 10:52
+	 * @param url 图片公网地址
+	 * @return java.awt.image.BufferedImage
+	 **/
+	public static BufferedImage imgUrlConvertBufferedImage(String url) throws Exception {
+		URL urls = new URL(url);
+		Image image = Toolkit.getDefaultToolkit().getImage(urls);
+		BufferedImage bufferedImage = toBufferedImage(image);
+		return bufferedImage;
+	}
+	/**
+	 * @Author 小帅丶
+	 * @Description 根据BufferedImage处理图片并返回byte[]
+	 * @Date  2020/9/29 10:55
+	 * @param bufferedImage
+	 * @return byte[]
+	 **/
+	public static byte[] zoomImageByte(BufferedImage bufferedImage) throws Exception {
+		ByteArrayOutputStream outputStreamZoom = new ByteArrayOutputStream();
+		ByteArrayOutputStream outputStreamSource = new ByteArrayOutputStream();
+		ImageIO.write(bufferedImage, "jpg", outputStreamSource);
+		BufferedImage bufferedImageZoom = zoomImage(outputStreamSource.toByteArray());
+		//写入缩减后的图片
+		ImageIO.write(bufferedImageZoom, "jpg", outputStreamZoom);
+		return outputStreamZoom.toByteArray();
+	}
+
+	/**
+	 * @Author 小帅丶
+	 * @Description 根据byte[]处理图片并返回byte[]
+	 * @Date  2020/9/29 10:55
+	 * @param src
+	 * @return byte[]
+	 **/
+	public static byte[] zoomImageByte(byte[] src) throws Exception {
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		BufferedImage bufferedImage = zoomImage(src);
+		//写入缩减后的图片
+		ImageIO.write(bufferedImage, "jpg", outputStream);
+		return outputStream.toByteArray();
+	}
+
+	/**
+	 * 图片缩放 仅适用于微信内容图片安全检测使用
+	 *
+	 * @param src 为源文件byte
+	 */
+	public static BufferedImage zoomImage(byte[] src) throws Exception {
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		ByteArrayInputStream in = new ByteArrayInputStream(src);
+		double wr = 0, hr = 0;
+		BufferedImage bufferedImage = null;
+		//读取图片
+		BufferedImage bufImg = ImageIO.read(in);
+		int height = bufImg.getHeight();
+		int width = bufImg.getWidth();
+		int cHeight = height;
+		int cWidth = width;
+		double Scaling = width / height;
+		if (Scaling < SCALING) {
+			if (height > MAX_HEIGHT) {
+				cHeight = MAX_HEIGHT;
+				cWidth = (width * MAX_HEIGHT) / height;
+			}
+			//以宽为缩放比例
+		} else {
+			if (width > MAX_WIDTH) {
+				cWidth = MAX_WIDTH;
+				cHeight = (height * MAX_WIDTH) / width;
+			}
+		}
+		//获取缩放后的宽高
+		log.info("宽{},高{}", cWidth, cHeight);
+		//设置缩放目标图片模板
+		Image Itemp = bufImg.getScaledInstance(width, cHeight, BufferedImage.SCALE_SMOOTH);
+		//获取缩放比例
+		wr = cWidth * 1.0 / width;
+		hr = cHeight * 1.0 / height;
+		log.info("宽比例{},高比例{}", wr, hr);
+		AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);
+		Itemp = ato.filter(bufImg, null);
+		try {
+			//写入缩减后的图片
+			ImageIO.write((BufferedImage) Itemp, "jpg", outputStream);
+			ByteArrayInputStream inNew = new ByteArrayInputStream(outputStream.toByteArray());
+			bufferedImage = ImageIO.read(inNew);
+		} catch (Exception ex) {
+			log.info("缩放图片异常{}", ex.getMessage());
+		} finally {
+			if (null != outputStream) {
+				outputStream.close();
+			}
+			if (null != in) {
+				in.close();
+			}
+		}
+		return bufferedImage;
+	}
+
+	/**
+	 * @Description Image转BufferedImage
+	 * @param image 通过url获取的image对象
+	 * @return java.awt.image.BufferedImage
+	 **/
+	public static BufferedImage toBufferedImage(Image image) {
+		if (image instanceof BufferedImage) {
+			return (BufferedImage) image;
+		}
+		// This code ensures that all the pixels in the image are loaded
+		image = new ImageIcon(image).getImage();
+		BufferedImage bimage = null;
+		GraphicsEnvironment ge = GraphicsEnvironment
+			.getLocalGraphicsEnvironment();
+		try {
+			int transparency = Transparency.OPAQUE;
+			GraphicsDevice gs = ge.getDefaultScreenDevice();
+			GraphicsConfiguration gc = gs.getDefaultConfiguration();
+			bimage = gc.createCompatibleImage(image.getWidth(null),
+				image.getHeight(null), transparency);
+		} catch (HeadlessException e) {
+			// The system does not have a screen
+		}
+		if (bimage == null) {
+			// Create a buffered image using the default color model
+			int type = BufferedImage.TYPE_INT_RGB;
+			bimage = new BufferedImage(image.getWidth(null),
+				image.getHeight(null), type);
+		}
+		// Copy image to buffered image
+		Graphics g = bimage.createGraphics();
+		// Paint the image onto the buffered image
+		g.drawImage(image, 0, 0, null);
+		g.dispose();
+		return bimage;
+	}
+}
diff --git a/src/main/java/org/springblade/modules/sms/controller/SmsRecordController.java b/src/main/java/org/springblade/modules/sms/controller/SmsRecordController.java
new file mode 100644
index 0000000..21bd2f3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/controller/SmsRecordController.java
@@ -0,0 +1,125 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import org.springblade.modules.sms.vo.SmsRecordVO;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.sms.wrapper.SmsRecordWrapper;
+import org.springblade.modules.sms.service.ISmsRecordService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 短信记录表 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-smsRecord/smsRecord")
+@Api(value = "短信记录表", tags = "短信记录表接口")
+public class SmsRecordController extends BladeController {
+
+	private final ISmsRecordService smsRecordService;
+
+	/**
+	 * 短信记录表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入smsRecord")
+	public R<SmsRecordVO> detail(SmsRecordEntity smsRecord) {
+		SmsRecordEntity detail = smsRecordService.getOne(Condition.getQueryWrapper(smsRecord));
+		return R.data(SmsRecordWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 短信记录表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入smsRecord")
+	public R<IPage<SmsRecordVO>> list(SmsRecordEntity smsRecord, Query query) {
+		IPage<SmsRecordEntity> pages = smsRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(smsRecord));
+		return R.data(SmsRecordWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 短信记录表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入smsRecord")
+	public R<IPage<SmsRecordVO>> page(SmsRecordVO smsRecord, Query query) {
+		IPage<SmsRecordVO> pages = smsRecordService.selectSmsRecordPage(Condition.getPage(query), smsRecord);
+		return R.data(pages);
+	}
+
+	/**
+	 * 短信记录表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入smsRecord")
+	public R save(@Valid @RequestBody SmsRecordEntity smsRecord) {
+		return R.status(smsRecordService.save(smsRecord));
+	}
+
+	/**
+	 * 短信记录表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入smsRecord")
+	public R update(@Valid @RequestBody SmsRecordEntity smsRecord) {
+		return R.status(smsRecordService.updateById(smsRecord));
+	}
+
+	/**
+	 * 短信记录表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入smsRecord")
+	public R submit(@Valid @RequestBody SmsRecordEntity smsRecord) {
+		return R.status(smsRecordService.saveOrUpdate(smsRecord));
+	}
+
+	/**
+	 * 短信记录表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(smsRecordService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/controller/SmsSendController.java b/src/main/java/org/springblade/modules/sms/controller/SmsSendController.java
new file mode 100644
index 0000000..eaa5b85
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/controller/SmsSendController.java
@@ -0,0 +1,118 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.sms.service.ISmsSendService;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 短信模版表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-smsSend/smsSend")
+@Api(value = "发送短信验证码", tags = "发送短信验证码")
+public class SmsSendController extends BladeController {
+
+	private final ISmsSendService iSmsSendService;
+
+	/**
+	 * 短信模版表 详情
+	 */
+	@GetMapping("/send")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "发送短信验证码")
+	public R<SmsTemplateVO> detail(@RequestParam String phone) {
+		Boolean aBoolean = iSmsSendService.sendVerificationCode(phone);
+		return R.status(aBoolean);
+	}
+
+	/**
+	 * 短信模版表 详情
+	 */
+	@GetMapping("/loginSend")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "登录发送短信验证码")
+	public R<SmsTemplateVO> loginSend(@RequestParam String phone) {
+		Boolean aBoolean = iSmsSendService.loginSendVerificationCode(phone);
+		return R.status(aBoolean);
+	}
+
+	/**
+	 * 短信模版表 详情
+	 */
+	@GetMapping("/checkCode")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "校验验证")
+	public R<Boolean> checkCode(@RequestParam String phone, @RequestParam String code) {
+		String result = iSmsSendService.checkCode(phone, code);
+		return R.data(StringUtils.isNotBlank(result) ? false : true, result);
+	}
+
+	/**
+	 * 发送居住申请通知
+	 *
+	 * @param templateId  模版id
+	 * @param residenceId 居住证申请记录id
+	 * @return
+	 */
+	@GetMapping("/sendNotice")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "发送居住申请通知")
+	public R<SmsTemplateVO> sendNotice(@RequestParam("templateId") Long templateId,
+									   @RequestParam(value = "residenceId", required = false) Long residenceId) {
+		Boolean aBoolean = iSmsSendService.sendNotice(templateId, residenceId);
+		return R.status(aBoolean);
+	}
+
+	/**
+	 * @param templateId
+	 * @param placeSelfCheckId
+	 * @return
+	 */
+	@GetMapping("/sendRectificationNotice")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "发送整改完成通知")
+	public R<SmsTemplateVO> sendRectificationNotice(@RequestParam("templateId") Long templateId,
+													@RequestParam(value = "placeSelfCheckId", required = false) Long placeSelfCheckId) {
+		Boolean aBoolean = iSmsSendService.sendRectificationNotice(templateId, placeSelfCheckId);
+		return R.status(aBoolean);
+	}
+
+
+
+	@GetMapping("/batchSendNotice")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "批量发送通知")
+	public void batchSendNotice(@RequestParam("smsTaskId") Long smsTaskId) {
+		Boolean aBoolean = iSmsSendService.batchSendNotice( smsTaskId);
+		// return R.status(aBoolean);
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java b/src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java
new file mode 100644
index 0000000..cfc91a9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/controller/SmsTemplateController.java
@@ -0,0 +1,139 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import org.springblade.modules.sms.wrapper.SmsTemplateWrapper;
+import org.springblade.modules.sms.service.ISmsTemplateService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.List;
+
+/**
+ * 短信模版表 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-smsTemplate/smsTemplate")
+@Api(value = "短信模版表", tags = "短信模版表接口")
+public class SmsTemplateController extends BladeController {
+
+	private final ISmsTemplateService smsTemplateService;
+
+	/**
+	 * 短信模版表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入smsTemplate")
+	public R<SmsTemplateVO> detail(SmsTemplateEntity smsTemplate) {
+		SmsTemplateEntity detail = smsTemplateService.getOne(Condition.getQueryWrapper(smsTemplate));
+		return R.data(SmsTemplateWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 短信模版表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入smsTemplate")
+	public R<IPage<SmsTemplateVO>> list(SmsTemplateEntity smsTemplate, Query query) {
+		IPage<SmsTemplateEntity> pages = smsTemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(smsTemplate));
+		return R.data(SmsTemplateWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 短信模版表 分页
+	 */
+	@GetMapping("/customList")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "不分页", notes = "传入smsTemplate")
+	public R<List<SmsTemplateEntity>> customList() {
+		List<SmsTemplateEntity> list = smsTemplateService.list(Wrappers.<SmsTemplateEntity>lambdaQuery().eq(SmsTemplateEntity::getIsDeleted, 0));
+		return R.data(list);
+	}
+
+	/**
+	 * 短信模版表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入smsTemplate")
+	public R<IPage<SmsTemplateVO>> page(SmsTemplateVO smsTemplate, Query query) {
+		IPage<SmsTemplateVO> pages = smsTemplateService.selectSmsTemplatePage(Condition.getPage(query), smsTemplate);
+		return R.data(pages);
+	}
+
+	/**
+	 * 短信模版表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入smsTemplate")
+	public R save(@Valid @RequestBody SmsTemplateEntity smsTemplate) {
+		return R.status(smsTemplateService.save(smsTemplate));
+	}
+
+	/**
+	 * 短信模版表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入smsTemplate")
+	public R update(@Valid @RequestBody SmsTemplateEntity smsTemplate) {
+		return R.status(smsTemplateService.updateById(smsTemplate));
+	}
+
+	/**
+	 * 短信模版表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入smsTemplate")
+	public R submit(@Valid @RequestBody SmsTemplateEntity smsTemplate) {
+		return R.status(smsTemplateService.saveOrUpdate(smsTemplate));
+	}
+
+	/**
+	 * 短信模版表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(smsTemplateService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/dto/SmsRecordDTO.java b/src/main/java/org/springblade/modules/sms/dto/SmsRecordDTO.java
new file mode 100644
index 0000000..01b28df
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/dto/SmsRecordDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.dto;
+
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短信记录表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SmsRecordDTO extends SmsRecordEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java b/src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java
new file mode 100644
index 0000000..9be2b2d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/dto/SmsTemplateDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.dto;
+
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短信模版表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SmsTemplateDTO extends SmsTemplateEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/entity/SmsRecordEntity.java b/src/main/java/org/springblade/modules/sms/entity/SmsRecordEntity.java
new file mode 100644
index 0000000..8ccaa5d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/entity/SmsRecordEntity.java
@@ -0,0 +1,92 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 短信记录表 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Data
+@TableName("blade_sms_record")
+@ApiModel(value = "SmsRecord对象", description = "短信记录表")
+public class SmsRecordEntity {
+
+	/** 主键 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 模板id */
+	@ApiModelProperty(value = "模板id", example = "")
+	@TableField("template_id")
+	private Long templateId;
+
+	/** 接收手机号 */
+	@ApiModelProperty(value = "接收手机号", example = "")
+	@TableField("phone")
+	private String phone;
+
+	/** 短信内容 */
+	@ApiModelProperty(value = "短信内容", example = "")
+	@TableField("content")
+	private String content;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 创建部门 */
+	@ApiModelProperty(value = "创建部门", example = "")
+	@TableField("create_dept")
+	private Long createDept;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 修改时间 */
+	@ApiModelProperty(value = "修改时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.DEFAULT)
+	private Date updateTime;
+
+	/** 状态 1:否 2:是 */
+	@ApiModelProperty(value = "状态 1:否 2:是", example = "")
+	@TableField("status")
+	private Integer status;
+
+	/** 是否已删除 */
+	@ApiModelProperty(value = "是否已删除", example = "")
+	@TableField("is_deleted")
+	private Integer isDeleted;
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java b/src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java
new file mode 100644
index 0000000..88d4a52
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/entity/SmsTemplateEntity.java
@@ -0,0 +1,115 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 短信模版表对象 blade_sms_template
+ *
+ * @author ${context.author}
+ * @date 2024-03-06 14:25:48
+ */
+@ApiModel(value = "BladeSmsTemplate对象", description = "短信模版表")
+@Data
+@TableName("blade_sms_template")
+public class SmsTemplateEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * id
+	 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 机构id
+	 */
+	@ApiModelProperty(value = "机构id", example = "")
+	@TableField("dept_id")
+	private Integer deptId;
+
+	/**
+	 * 模板内容
+	 */
+	@ApiModelProperty(value = "模板内容", example = "")
+	@TableField("content")
+	private String content;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/**
+	 * 更新时间
+	 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_by")
+	private Long createBy;
+
+	/**
+	 * 0:否 1:是
+	 */
+	@ApiModelProperty(value = "0:否 1:是", example = "")
+	@TableField("is_deleted")
+	private String isDeleted;
+
+	/**
+	 * 1:否 2:是
+	 */
+	@ApiModelProperty(value = "1:否 2:是", example = "")
+	@TableField("status")
+	private String status;
+
+	/**
+	 * 标题
+	 */
+	@ApiModelProperty(value = "标题", example = "")
+	@TableField("title")
+	private String title;
+
+
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注", example = "")
+	@TableField("remark")
+	private String remark;
+}
diff --git a/src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.java b/src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.java
new file mode 100644
index 0000000..1c6c1b8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.java
@@ -0,0 +1,60 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.mapper;
+
+import org.springblade.modules.sms.dto.SmsRecordDTO;
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import org.springblade.modules.sms.vo.SmsRecordVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 短信记录表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+public interface SmsRecordMapper extends BaseMapper<SmsRecordEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param smsRecord
+	 * @return
+	 */
+	List<SmsRecordVO> selectSmsRecordPage(IPage page, SmsRecordVO smsRecord);
+
+	/**
+	 * 查询短信记录表
+	 *
+	 * @param id 短信记录表ID
+	 * @return 短信记录表
+	 */
+	public SmsRecordDTO selectBladeSmsRecordById(Long id);
+
+	/**
+	 * 查询短信记录表列表
+	 *
+	 * @param bladeSmsRecordDTO 短信记录表
+	 * @return 短信记录表集合
+	 */
+	public List<SmsRecordDTO> selectBladeSmsRecordList(SmsRecordDTO bladeSmsRecordDTO);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.xml b/src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.xml
new file mode 100644
index 0000000..4d0d185
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/mapper/SmsRecordMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.sms.mapper.SmsRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="smsRecordResultMap" type="org.springblade.modules.sms.entity.SmsRecordEntity">
+    </resultMap>
+
+
+    <select id="selectSmsRecordPage" resultMap="smsRecordResultMap">
+        select * from blade_sms_record
+        <where>
+            <if test="smsRecord.id != null ">and id = #{smsRecord.id}</if>
+            <if test="smsRecord.templateId != null ">and template_id = #{smsRecord.templateId}</if>
+            <if test="smsRecord.phone != null  and smsRecord.phone != ''">and phone like concat('%',#{smsRecord.phone},'%') </if>
+            <if test="smsRecord.content != null  and smsRecord.content != ''">and content like concat('%',#{smsRecord.content},'%') </if>
+            <if test="smsRecord.createUser != null ">and create_user = #{smsRecord.createUser}</if>
+            <if test="smsRecord.createDept != null ">and create_dept = #{smsRecord.createDept}</if>
+            <if test="smsRecord.createTime != null ">and create_time = #{smsRecord.createTime}</if>
+            <if test="smsRecord.updateTime != null ">and update_time = #{smsRecord.updateTime}</if>
+            <if test="smsRecord.status != null ">and status = #{smsRecord.status}</if>
+            <if test="smsRecord.isDeleted != null ">and is_deleted = #{smsRecord.isDeleted}</if>
+            order by create_time desc
+        </where>
+    </select>
+
+    <resultMap type="org.springblade.modules.sms.dto.SmsRecordDTO" id="BladeSmsRecordDTOResult">
+        <result property="id"    column="id"    />
+        <result property="templateId"    column="template_id"    />
+        <result property="phone"    column="phone"    />
+        <result property="content"    column="content"    />
+        <result property="createUser"    column="create_user"    />
+        <result property="createDept"    column="create_dept"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="status"    column="status"    />
+        <result property="isDeleted"    column="is_deleted"    />
+    </resultMap>
+
+    <sql id="selectBladeSmsRecord">
+        select
+            id,
+            template_id,
+            phone,
+            content,
+            create_user,
+            create_dept,
+            create_time,
+            update_time,
+            status,
+            is_deleted
+        from
+            blade_sms_record
+    </sql>
+
+    <select id="selectBladeSmsRecordById" parameterType="long" resultMap="BladeSmsRecordDTOResult">
+        <include refid="selectBladeSmsRecord"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectBladeSmsRecordList" parameterType="org.springblade.modules.sms.dto.SmsRecordDTO" resultMap="BladeSmsRecordDTOResult">
+        <include refid="selectBladeSmsRecord"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="templateId != null "> and template_id = #{templateId}</if>
+            <if test="phone != null  and phone != ''"> and phone = #{phone}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="createUser != null "> and create_user = #{createUser}</if>
+            <if test="createDept != null "> and create_dept = #{createDept}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="isDeleted != null "> and is_deleted = #{isDeleted}</if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java
new file mode 100644
index 0000000..43b910b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.java
@@ -0,0 +1,60 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.mapper;
+
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 短信模版表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+public interface SmsTemplateMapper extends BaseMapper<SmsTemplateEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param smsTemplate
+	 * @return
+	 */
+	List<SmsTemplateVO> selectSmsTemplatePage(IPage page, SmsTemplateVO smsTemplate);
+
+
+
+	/**
+	 * 查询短信模版表
+	 *
+	 * @param id 短信模版表ID
+	 * @return 短信模版表
+	 */
+	public SmsTemplateDTO selectBladeSmsTemplateById(Integer id);
+
+	/**
+	 * 查询短信模版表列表
+	 *
+	 * @param bladeSmsTemplateDTO 短信模版表
+	 * @return 短信模版表集合
+	 */
+	public List<SmsTemplateDTO> selectBladeSmsTemplateList(SmsTemplateDTO bladeSmsTemplateDTO);
+}
diff --git a/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml
new file mode 100644
index 0000000..beafbbf
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/mapper/SmsTemplateMapper.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.sms.mapper.SmsTemplateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="smsTemplateResultMap" type="org.springblade.modules.sms.entity.SmsTemplateEntity">
+    </resultMap>
+
+
+    <select id="selectSmsTemplatePage" resultMap="smsTemplateResultMap">
+        select * from blade_sms_template
+        <where>
+            <if test="smsTemplate.id != null "> and id = #{smsTemplate.id}</if>
+            <if test="smsTemplate.deptId != null "> and dept_id = #{smsTemplate.deptId}</if>
+            <if test="smsTemplate.content != null  and smsTemplate.content != ''"> and content like concat('%', #{smsTemplate.content},'%')</if>
+            <if test="smsTemplate.createTime != null "> and create_time = #{smsTemplate.createTime}</if>
+            <if test="smsTemplate.updateTime != null "> and update_time = #{smsTemplate.updateTime}</if>
+            <if test="smsTemplate.createBy != null "> and create_by = #{smsTemplate.createBy}</if>
+            <if test="smsTemplate.isDeleted != null  and smsTemplate.isDeleted != ''"> and is_deleted = #{smsTemplate.isDeleted}</if>
+        </where>
+    </select>
+
+
+
+    <resultMap type="org.springblade.modules.sms.dto.SmsTemplateDTO" id="BladeSmsTemplateDTOResult">
+        <result property="id"    column="id"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="content"    column="content"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="isDeleted"    column="is_deleted"    />
+    </resultMap>
+
+    <sql id="selectBladeSmsTemplate">
+        select
+            id,
+            dept_id,
+            content,
+            create_time,
+            update_time,
+            create_by,
+            is_deleted
+        from
+            blade_sms_template
+    </sql>
+
+    <select id="selectBladeSmsTemplateById" parameterType="int" resultMap="BladeSmsTemplateDTOResult">
+        <include refid="selectBladeSmsTemplate"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectBladeSmsTemplateList" parameterType="org.springblade.modules.sms.dto.SmsTemplateDTO" resultMap="BladeSmsTemplateDTOResult">
+        <include refid="selectBladeSmsTemplate"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+            <if test="createBy != null "> and create_by = #{createBy}</if>
+            <if test="isDeleted != null  and isDeleted != ''"> and is_deleted = #{isDeleted}</if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/sms/service/ISmsRecordService.java b/src/main/java/org/springblade/modules/sms/service/ISmsRecordService.java
new file mode 100644
index 0000000..3b22475
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/ISmsRecordService.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import org.springblade.modules.sms.vo.SmsRecordVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 短信记录表 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+public interface ISmsRecordService extends IService<SmsRecordEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param smsRecord
+	 * @return
+	 */
+	IPage<SmsRecordVO> selectSmsRecordPage(IPage<SmsRecordVO> page, SmsRecordVO smsRecord);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/service/ISmsSendService.java b/src/main/java/org/springblade/modules/sms/service/ISmsSendService.java
new file mode 100644
index 0000000..ae971bb
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/ISmsSendService.java
@@ -0,0 +1,47 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+
+/**
+ * 短信模版表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+public interface ISmsSendService extends IService<SmsTemplateEntity> {
+
+	/**
+	 *
+	 *
+	 * @return
+	 */
+	Boolean sendVerificationCode(String phone);
+
+
+	Boolean sendNotice(Long templateId,Long residenceId);
+
+	Boolean sendRectificationNotice(Long templateId,Long placeSelfCheckId);
+
+	Boolean loginSendVerificationCode(String phone);
+
+	String checkCode(String phone, String code);
+
+	Boolean batchSendNotice(Long smsTaskId);
+}
diff --git a/src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java b/src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java
new file mode 100644
index 0000000..26a692f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/ISmsTemplateService.java
@@ -0,0 +1,59 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 短信模版表 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+public interface ISmsTemplateService extends IService<SmsTemplateEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param smsTemplate
+	 * @return
+	 */
+	IPage<SmsTemplateVO> selectSmsTemplatePage(IPage<SmsTemplateVO> page, SmsTemplateVO smsTemplate);
+	/**
+	 * 查询短信模版表
+	 *
+	 * @param id 短信模版表ID
+	 * @return 短信模版表
+	 */
+	public SmsTemplateDTO selectBladeSmsTemplateById(Integer id);
+
+	/**
+	 * 查询短信模版表列表
+	 *
+	 * @param SmsTemplateDTO 短信模版表
+	 * @return 短信模版表集合
+	 */
+	public List<SmsTemplateDTO> selectBladeSmsTemplateList(SmsTemplateDTO SmsTemplateDTO);
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/service/impl/SmsRecordServiceImpl.java b/src/main/java/org/springblade/modules/sms/service/impl/SmsRecordServiceImpl.java
new file mode 100644
index 0000000..9a68423
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/impl/SmsRecordServiceImpl.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import org.springblade.modules.sms.vo.SmsRecordVO;
+import org.springblade.modules.sms.mapper.SmsRecordMapper;
+import org.springblade.modules.sms.service.ISmsRecordService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 短信记录表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Service
+public class SmsRecordServiceImpl extends ServiceImpl<SmsRecordMapper, SmsRecordEntity> implements ISmsRecordService {
+
+	/**
+	 * 分页查询短信记录。
+	 *
+	 * @param page 分页对象,包含当前页码和每页记录数等信息。
+	 * @param smsRecord 短信记录查询条件对象,用于筛选特定的短信记录。
+	 * @return 返回经过分页处理的短信记录列表。
+	 */
+	@Override
+	public IPage<SmsRecordVO> selectSmsRecordPage(IPage<SmsRecordVO> page, SmsRecordVO smsRecord) {
+	    // 调用底层Mapper,查询指定条件的短信记录,并将结果设置到分页对象中
+	    return page.setRecords(baseMapper.selectSmsRecordPage(page, smsRecord));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java b/src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java
new file mode 100644
index 0000000..ea44fe0
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/impl/SmsSendServiceImpl.java
@@ -0,0 +1,522 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.utils.HttpClientUtils;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.common.utils.UtilRandom;
+import org.springblade.common.utils.sms.AlipaySignature;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.resource.entity.Sms;
+import org.springblade.modules.resource.service.ISmsService;
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.mapper.SmsTemplateMapper;
+import org.springblade.modules.sms.service.ISmsRecordService;
+import org.springblade.modules.sms.service.ISmsSendService;
+import org.springblade.modules.sms.service.ISmsTemplateService;
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.modules.smsTask.service.ISmsTaskService;
+import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.service.IUserService;
+import org.springblade.modules.system.vo.UserVO;
+import org.springblade.modules.task.entity.TaskPlaceSelfCheckEntity;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.service.ITaskPlaceSelfCheckService;
+import org.springblade.modules.task.service.ITaskResidencePermitApplyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 短信模版表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@Service
+public class SmsSendServiceImpl extends ServiceImpl<SmsTemplateMapper, SmsTemplateEntity> implements ISmsSendService {
+	@Autowired
+	private BladeRedis redisTemplate;
+	private static Logger logger = LoggerFactory.getLogger(SmsSendServiceImpl.class);
+	// 确保这些字符串被适当地定义和管理
+	public static final String SMS_VALIDATE_PHONE = "sms:validate:code:";
+	public static final String SMS_VALIDATE_PHONE_NUM = "sms:validate:phone:";
+	private static final String SMS_SEND_FAILED = "短信发送失败!";
+	private static final String MESSAGE_SOP_EQUALS_MES_RESPONSE_CODE = "message_sop_equalsMes_response";
+	private static final DateTimeFormatter SECOND_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+
+	@Autowired
+	private ISmsService iSmsService;
+
+	@Autowired
+	private ISmsTemplateService iSmsTemplateService;
+
+	@Override
+	public Boolean sendVerificationCode(String phone) {
+		if (phone == null || phone.length() != 11) {
+			logger.error("手机号格式错误");
+			return false;
+		}
+
+		if (redisTemplate.exists(SMS_VALIDATE_PHONE_NUM + phone)) {
+			logger.error("同一个手机号一分钟内只能发送一条记录");
+			return false;
+		}
+
+		Sms serviceOne = iSmsService.getOne(Wrappers.<Sms>lambdaQuery().eq(Sms::getStatus, 2));
+		if (serviceOne == null) {
+			logger.error("未找到状态为2的Sms服务");
+			return false;
+		}
+		SmsTemplateEntity smsTemplateEntity = iSmsTemplateService.getOne(Wrappers.<SmsTemplateEntity>lambdaQuery()
+			.eq(SmsTemplateEntity::getId, serviceOne.getTemplateId()));
+		if (smsTemplateEntity == null) {
+			logger.error("未找到对应的短信模板");
+			return false;
+		}
+
+		//发送的手机号
+		List<Map> phonesList = new ArrayList<>();
+		Map phoneMap = new HashMap();
+		phoneMap.put("phone", phone);
+		List<String> varList = new ArrayList<>();
+		Integer code = UtilRandom.randomCount(111111, 999999);
+		varList.add(code.toString());
+		phoneMap.put("varList", varList);
+		phonesList.add(phoneMap);
+		//短信内容
+		String content = smsTemplateEntity.getContent();
+		//发送时间
+		LocalDateTime nowDateTime = LocalDateTime.now();
+		String send_time = nowDateTime.format(SECOND_FORMATTER);
+		Map params = new HashMap();
+		params.put("phones", phonesList);
+		//短信主题
+		params.put("subject", "对外接口不同内容发送-动态模板");
+		params.put("content", content);
+		//短信模板
+		params.put("template_id", null);
+		// 发送时间
+		params.put("send_time", send_time);
+		//优先级,高级=5,中级=3,低级=1
+		params.put("priority", "1");
+		//不同内容发送类型,1=动态模板发送,2=文件内容发送
+		params.put("type", "1");
+		//创建人主键
+		params.put("sop_create_by", serviceOne.getSmsCode());
+		//短信发送记录
+		saveSmsRecord(phone, serviceOne, code.toString(), content);
+		Boolean aBoolean = sendSmsGet(serviceOne, params);
+		if (aBoolean) {
+			// 将验证码存入redis,其中phone为手机号,code为验证码
+			// SMS_VALIDATE_PHONE 为前缀,通过phone和code在redis中设置一个过期的键值对
+			redisTemplate.setEx(SMS_VALIDATE_PHONE + phone, code, 300L);
+			// 同时,为了记录该手机短时间内已接收的验证码次数,使用另一个键值对进行计数
+			// SMS_VALIDATE_PHONE_NUM 为计数器的前缀,过期时间为60秒
+			redisTemplate.setEx(SMS_VALIDATE_PHONE_NUM + phone, 1, 60L);
+		}
+		return aBoolean;
+	}
+
+
+	/**
+	 * @param templateId
+	 * @param residenceId
+	 * @return
+	 */
+	@Override
+	public Boolean sendNotice(Long templateId, Long residenceId) {
+
+		Sms serviceOne = iSmsService.getOne(Wrappers.<Sms>lambdaQuery().eq(Sms::getStatus, 2));
+		if (serviceOne == null) {
+			logger.error("未找到状态为2的Sms服务");
+			return false;
+		}
+		SmsTemplateEntity smsTemplateEntity = iSmsTemplateService.getOne(Wrappers.<SmsTemplateEntity>lambdaQuery()
+			.eq(SmsTemplateEntity::getId, templateId));
+		if (smsTemplateEntity == null) {
+			logger.error("未找到对应的短信模板");
+			return false;
+		}
+		ITaskResidencePermitApplyService bean = SpringUtils.getBean(ITaskResidencePermitApplyService.class);
+		TaskResidencePermitApplyEntity residencePermitApplyEntity = bean.getById(residenceId);
+		String phone = residencePermitApplyEntity.getPhone();
+		//发送的手机号
+		List<Map> phonesList = new ArrayList<>();
+		Map phoneMap = new HashMap();
+		phoneMap.put("phone", phone);
+		List<String> varList = new ArrayList<>();
+		// 设置参数
+
+		varList.add(residencePermitApplyEntity.getName());
+		phoneMap.put("varList", varList);
+		phonesList.add(phoneMap);
+		//短信内容
+		String content = smsTemplateEntity.getContent();
+		//发送时间
+		LocalDateTime nowDateTime = LocalDateTime.now();
+		String send_time = nowDateTime.format(SECOND_FORMATTER);
+		Map params = new HashMap();
+		params.put("phones", phonesList);
+		//短信主题
+		params.put("subject", "对外接口不同内容发送-动态模板");
+		params.put("content", content);
+		//短信模板
+		params.put("template_id", null);
+		// 发送时间
+		params.put("send_time", send_time);
+		//优先级,高级=5,中级=3,低级=1
+		params.put("priority", "1");
+		//不同内容发送类型,1=动态模板发送,2=文件内容发送
+		params.put("type", "1");
+		//创建人主键
+		params.put("sop_create_by", serviceOne.getSmsCode());
+		//短信发送记录
+		saveSmsRecord(phone, serviceOne, residencePermitApplyEntity.getName(), content);
+		Boolean aBoolean = sendSmsGet(serviceOne, params);
+		return aBoolean;
+	}
+
+	/**
+	 * @param templateId
+	 * @param placeSelfCheckId
+	 * @return
+	 */
+	@Override
+	public Boolean sendRectificationNotice(Long templateId, Long placeSelfCheckId) {
+
+		Sms serviceOne = iSmsService.getOne(Wrappers.<Sms>lambdaQuery().eq(Sms::getStatus, 2));
+		if (serviceOne == null) {
+			logger.error("未找到状态为2的Sms服务");
+			return false;
+		}
+		SmsTemplateEntity smsTemplateEntity = iSmsTemplateService.getOne(Wrappers.<SmsTemplateEntity>lambdaQuery()
+			.eq(SmsTemplateEntity::getId, templateId));
+		if (smsTemplateEntity == null) {
+			logger.error("未找到对应的短信模板");
+			return false;
+		}
+		ITaskPlaceSelfCheckService bean = SpringUtils.getBean(ITaskPlaceSelfCheckService.class);
+		TaskPlaceSelfCheckEntity placeSelfCheckEntity = bean.getById(placeSelfCheckId);
+		IUserService userService = SpringUtils.getBean(IUserService.class);
+		UserVO userVO = userService.getuserById(placeSelfCheckEntity.getId());
+		String phone = userVO.getPhone();
+		//发送的手机号
+		List<Map> phonesList = new ArrayList<>();
+		Map phoneMap = new HashMap();
+		phoneMap.put("phone", phone);
+		List<String> varList = new ArrayList<>();
+		// 设置参数
+
+		varList.add(userVO.getName());
+		varList.add(placeSelfCheckEntity.getPlaceName());
+		phoneMap.put("varList", varList);
+		phonesList.add(phoneMap);
+		//短信内容
+		String content = smsTemplateEntity.getContent();
+		//发送时间
+		LocalDateTime nowDateTime = LocalDateTime.now();
+		String send_time = nowDateTime.format(SECOND_FORMATTER);
+		Map params = new HashMap();
+		params.put("phones", phonesList);
+		//短信主题
+		params.put("subject", "对外接口不同内容发送-动态模板");
+		params.put("content", content);
+		//短信模板
+		params.put("template_id", null);
+		// 发送时间
+		params.put("send_time", send_time);
+		//优先级,高级=5,中级=3,低级=1
+		params.put("priority", "1");
+		//不同内容发送类型,1=动态模板发送,2=文件内容发送
+		params.put("type", "1");
+		//创建人主键
+		params.put("sop_create_by", serviceOne.getSmsCode());
+		//短信发送记录
+		saveSmsRecord(phone, serviceOne, placeSelfCheckEntity.getPlaceName(), content);
+		Boolean aBoolean = sendSmsGet(serviceOne, params);
+		return aBoolean;
+	}
+
+	@Override
+	public Boolean loginSendVerificationCode(String phone) {
+		if (phone == null || phone.length() != 11) {
+			logger.error("手机号格式错误");
+			return false;
+		}
+
+		if (redisTemplate.exists(SMS_VALIDATE_PHONE_NUM + phone)) {
+			logger.error("同一个手机号一分钟内只能发送一条记录");
+			return false;
+		}
+
+		Sms serviceOne = iSmsService.getOne(Wrappers.<Sms>lambdaQuery().eq(Sms::getStatus, 2));
+		if (serviceOne == null) {
+			logger.error("未找到状态为2的Sms服务");
+			return false;
+		}
+		SmsTemplateEntity smsTemplateEntity = iSmsTemplateService.getOne(Wrappers.<SmsTemplateEntity>lambdaQuery()
+			.eq(SmsTemplateEntity::getId, "1783764287897939969"));
+		if (smsTemplateEntity == null) {
+			logger.error("未找到对应的短信模板");
+			return false;
+		}
+
+		//发送的手机号
+		List<Map> phonesList = new ArrayList<>();
+		Map phoneMap = new HashMap();
+		phoneMap.put("phone", phone);
+		List<String> varList = new ArrayList<>();
+		Integer code = UtilRandom.randomCount(111111, 999999);
+		varList.add(code.toString());
+		phoneMap.put("varList", varList);
+		phonesList.add(phoneMap);
+		//短信内容
+		String content = smsTemplateEntity.getContent();
+		//发送时间
+		LocalDateTime nowDateTime = LocalDateTime.now();
+		String send_time = nowDateTime.format(SECOND_FORMATTER);
+		Map params = new HashMap();
+		params.put("phones", phonesList);
+		//短信主题
+		params.put("subject", "对外接口不同内容发送-动态模板");
+		params.put("content", content);
+		//短信模板
+		params.put("template_id", null);
+		// 发送时间
+		params.put("send_time", send_time);
+		//优先级,高级=5,中级=3,低级=1
+		params.put("priority", "1");
+		//不同内容发送类型,1=动态模板发送,2=文件内容发送
+		params.put("type", "1");
+		//创建人主键
+		params.put("sop_create_by", serviceOne.getSmsCode());
+		//短信发送记录
+		saveSmsRecord(phone, serviceOne, code.toString(), content);
+		Boolean aBoolean = sendSmsGet(serviceOne, params);
+		if (aBoolean) {
+			// 将验证码存入redis,其中phone为手机号,code为验证码
+			// SMS_VALIDATE_PHONE 为前缀,通过phone和code在redis中设置一个过期的键值对
+			redisTemplate.setEx(SMS_VALIDATE_PHONE + phone, code, 300L);
+			// 同时,为了记录该手机短时间内已接收的验证码次数,使用另一个键值对进行计数
+			// SMS_VALIDATE_PHONE_NUM 为计数器的前缀,过期时间为60秒
+			redisTemplate.setEx(SMS_VALIDATE_PHONE_NUM + phone, 1, 60L);
+		}
+		return aBoolean;
+	}
+
+	@Override
+	public String checkCode(String phone, String code) {
+		if (StringUtils.isNotBlank(phone)) {
+			if (StringUtils.isBlank(code)) {
+				return "验证码不能为空!";
+			}
+			Object validateCode = redisTemplate.get(SMS_VALIDATE_PHONE + phone);
+			if (validateCode == null) {
+				return "验证码不存在或已过期";
+			}
+			if (!validateCode.toString().equals(code)) {
+				return "验证码错误";
+			}
+			//删除验证码
+			redisTemplate.del(SMS_VALIDATE_PHONE + phone);
+		}
+		return "";
+	}
+
+	@Override
+	public Boolean batchSendNotice(Long smsTaskId) {
+		ISmsTaskService taskService = SpringUtils.getBean(ISmsTaskService.class);
+		SmsTaskEntity smsTaskEntity = taskService.getById(smsTaskId);
+		List<User> phoneList = taskService.selectSmsTaskListByPhone(smsTaskEntity);
+		if (CollectionUtil.isEmpty(phoneList)) {
+			logger.error("未查询到电话号码!");
+			return false;
+		}
+
+		Sms serviceOne = iSmsService.getOne(Wrappers.<Sms>lambdaQuery().eq(Sms::getStatus, 2));
+		if (serviceOne == null) {
+			logger.error("未找到状态为2的Sms服务");
+			return false;
+		}
+		SmsTemplateEntity smsTemplateEntity = iSmsTemplateService.getOne(Wrappers.<SmsTemplateEntity>lambdaQuery()
+			.eq(SmsTemplateEntity::getId, smsTaskEntity.getSmsTemplate()));
+		if (smsTemplateEntity == null) {
+			logger.error("未找到对应的短信模板");
+			return false;
+		}
+		ISmsRecordService smsRecordService = SpringUtils.getBean(ISmsRecordService.class);
+		Boolean aBoolean = false;
+		for (User user : phoneList) {
+			// 发送的手机号
+			List<Map> phonesList = new ArrayList<>();
+			Map phoneMap = new HashMap();
+			phoneMap.put("phone", user.getPhone());
+			List<String> varList = new ArrayList<>();
+			// 设置参数
+			phoneMap.put("varList", varList);
+			phonesList.add(phoneMap);
+			// 短信内容
+			String content = smsTemplateEntity.getContent();
+			// 发送时间
+			LocalDateTime nowDateTime = LocalDateTime.now();
+			String send_time = nowDateTime.format(SECOND_FORMATTER);
+			Map params = new HashMap();
+			params.put("phones", phonesList);
+			// 短信主题
+			params.put("subject", "对外接口不同内容发送-动态模板");
+			params.put("content", content);
+			// 短信模板
+			params.put("template_id", null);
+			// 发送时间
+			params.put("send_time", send_time);
+			// 优先级,高级=5,中级=3,低级=1
+			params.put("priority", "1");
+			// 不同内容发送类型,1=动态模板发送,2=文件内容发送
+			params.put("type", "1");
+			// 创建人主键
+			params.put("sop_create_by", serviceOne.getSmsCode());
+			// 短信发送记录
+			SmsRecordEntity smsRecordEntity = saveSmsRecord(user.getPhone(), serviceOne, user.getName(), content);
+			aBoolean = false; //sendSmsGet(serviceOne, params);
+			if (aBoolean){
+				smsRecordEntity.setStatus(2);
+				smsRecordService.updateById(smsRecordEntity);
+			}
+		}
+
+		return aBoolean;
+
+	}
+
+	/**
+	 * 发送短信并获取发送结果。
+	 *
+	 * @param serviceOne 用于发送短信的服务对象
+	 * @param params     发送短信所需的参数映射
+	 * @return 如果短信发送成功,则返回true;否则返回false。
+	 */
+	@NotNull
+	private Boolean sendSmsGet(Sms serviceOne, Map params) {
+		try {
+			// 尝试发送短信并解析响应结果
+			String result = sendSms(params, "message.sop.differentMes", serviceOne);
+			JSONObject jsonObject = JSON.parseObject(result);
+			JSONObject messageSopEqualsMesResponse = (JSONObject) jsonObject.get(MESSAGE_SOP_EQUALS_MES_RESPONSE_CODE);
+			if (messageSopEqualsMesResponse.get("code").equals(200)) {
+				// 如果响应代码为200,表示短信发送成功
+				return true;
+			} else {
+				// 记录短信发送失败的日志
+				logger.error("短信发送失败!");
+			}
+		} catch (Exception e) {
+			// 记录发送短信过程中出现的异常
+			logger.error(SMS_SEND_FAILED, e);
+			throw new RuntimeException(e);
+		}
+		// 如果执行到这里,表示短信发送失败或出现异常
+		return false;
+	}
+
+	/**
+	 * 保存短信发送记录
+	 *
+	 * @param phone      接收短信的手机号码
+	 * @param serviceOne 发送短信所使用的服务
+	 * @param code       短信中的验证码
+	 * @param content    短信内容,其中可能包含占位符"#P_1#"用于被验证码替换
+	 */
+	private static SmsRecordEntity saveSmsRecord(String phone, Sms serviceOne, String code, String content) {
+		// 通过Spring工具类获取短信记录服务的实例
+		ISmsRecordService smsRecordService = SpringUtils.getBean(ISmsRecordService.class);
+		// 创建一个新的短信记录实体
+		SmsRecordEntity smsRecordEntity = new SmsRecordEntity();
+		// 设置短信内容,将占位符"#P_1#"替换为验证码
+		smsRecordEntity.setContent(content.replace("#P_1#", code));
+		// 设置手机号码
+		smsRecordEntity.setPhone(phone);
+		// 设置短信模板ID
+		smsRecordEntity.setTemplateId(Long.valueOf(serviceOne.getTemplateId()));
+		// 设置创建用户ID,来自认证工具类
+		smsRecordEntity.setCreateUser(AuthUtil.getUserId());
+		// 保存短信记录实体
+		smsRecordService.save(smsRecordEntity);
+		return smsRecordEntity;
+	}
+
+	public String sendSms(Object bizContent, String method, Sms serviceOne) throws Exception {
+
+		// 公共请求参数
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("app_id", serviceOne.getAccessKey());
+		params.put("method", method);
+		params.put("format", "json");
+		params.put("charset", "utf-8");
+		params.put("sign_type", "RSA2");
+		params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+		params.put("version", "1.0");
+
+		// 业务参数
+		params.put("biz_content", JSON.toJSONString(bizContent));
+		String content = AlipaySignature.getSignContent(params);
+		String sign = AlipaySignature.rsa256Sign(content, serviceOne.getSecretKey(), "utf-8");
+		params.put("sign", sign);
+		logger.info("短信请求参数:" + buildParamQuery(params));
+		String responseData = HttpClientUtils.doGet(serviceOne.getRemark(), params);// 发送请求
+		logger.info("短信响应结果:" + responseData);
+		return responseData;
+	}
+
+	protected static String buildParamQuery(Map<String, String> params) {
+		StringBuilder sb = new StringBuilder();
+		for (Map.Entry<String, String> entry : params.entrySet()) {
+			sb.append("&").append(entry.getKey()).append("=").append(entry.getValue());
+		}
+		return sb.toString().substring(1);
+	}
+
+	protected static String buildUrlQuery(Map<String, String> params) {
+		StringBuilder sb = new StringBuilder();
+		for (Map.Entry<String, String> entry : params.entrySet()) {
+			try {
+				sb.append("&").append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8"));
+			} catch (UnsupportedEncodingException e) {
+				e.printStackTrace();
+			}
+		}
+		return sb.toString().substring(1);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java b/src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java
new file mode 100644
index 0000000..f86d03b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/service/impl/SmsTemplateServiceImpl.java
@@ -0,0 +1,69 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.sms.dto.SmsTemplateDTO;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import org.springblade.modules.sms.mapper.SmsTemplateMapper;
+import org.springblade.modules.sms.service.ISmsTemplateService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 短信模版表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@Service
+public class SmsTemplateServiceImpl extends ServiceImpl<SmsTemplateMapper, SmsTemplateEntity> implements ISmsTemplateService {
+
+	@Override
+	public IPage<SmsTemplateVO> selectSmsTemplatePage(IPage<SmsTemplateVO> page, SmsTemplateVO smsTemplate) {
+		List<SmsTemplateVO> smsTemplateVOS = baseMapper.selectSmsTemplatePage(page, smsTemplate);
+		return page.setRecords(smsTemplateVOS);
+	}
+
+	/**
+	 * 查询短信模版表
+	 *
+	 * @param id 短信模版表ID
+	 * @return 短信模版表
+	 */
+	@Override
+	public SmsTemplateDTO selectBladeSmsTemplateById(Integer id)
+	{
+		return this.baseMapper.selectBladeSmsTemplateById(id);
+	}
+
+	/**
+	 * 查询短信模版表列表
+	 *
+	 * @param SmsTemplateDTO 短信模版表
+	 * @return 短信模版表集合
+	 */
+	@Override
+	public List<SmsTemplateDTO> selectBladeSmsTemplateList(SmsTemplateDTO SmsTemplateDTO)
+	{
+		return this.baseMapper.selectBladeSmsTemplateList(SmsTemplateDTO);
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/vo/SmsRecordVO.java b/src/main/java/org/springblade/modules/sms/vo/SmsRecordVO.java
new file mode 100644
index 0000000..a3876d9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/vo/SmsRecordVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.vo;
+
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短信记录表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SmsRecordVO extends SmsRecordEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java b/src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java
new file mode 100644
index 0000000..d6851dd
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/vo/SmsTemplateVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.vo;
+
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短信模版表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SmsTemplateVO extends SmsTemplateEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/wrapper/SmsRecordWrapper.java b/src/main/java/org/springblade/modules/sms/wrapper/SmsRecordWrapper.java
new file mode 100644
index 0000000..f9c25d6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/wrapper/SmsRecordWrapper.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.sms.entity.SmsRecordEntity;
+import org.springblade.modules.sms.vo.SmsRecordVO;
+
+import java.util.Objects;
+
+/**
+ * 短信记录表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-02
+ */
+public class SmsRecordWrapper extends BaseEntityWrapper<SmsRecordEntity, SmsRecordVO>  {
+
+	public static SmsRecordWrapper build() {
+		return new SmsRecordWrapper();
+ 	}
+
+	@Override
+	public SmsRecordVO entityVO(SmsRecordEntity smsRecord) {
+		SmsRecordVO smsRecordVO = Objects.requireNonNull(BeanUtil.copy(smsRecord, SmsRecordVO.class));
+
+		//User createUser = UserCache.getUser(smsRecord.getCreateUser());
+		//User updateUser = UserCache.getUser(smsRecord.getUpdateUser());
+		//smsRecordVO.setCreateUserName(createUser.getName());
+		//smsRecordVO.setUpdateUserName(updateUser.getName());
+
+		return smsRecordVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java b/src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java
new file mode 100644
index 0000000..512e0aa
--- /dev/null
+++ b/src/main/java/org/springblade/modules/sms/wrapper/SmsTemplateWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.sms.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.sms.entity.SmsTemplateEntity;
+import org.springblade.modules.sms.vo.SmsTemplateVO;
+import java.util.Objects;
+
+/**
+ * 短信模版表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-06
+ */
+public class SmsTemplateWrapper extends BaseEntityWrapper<SmsTemplateEntity, SmsTemplateVO>  {
+
+	public static SmsTemplateWrapper build() {
+		return new SmsTemplateWrapper();
+ 	}
+
+	@Override
+	public SmsTemplateVO entityVO(SmsTemplateEntity smsTemplate) {
+		SmsTemplateVO smsTemplateVO = Objects.requireNonNull(BeanUtil.copy(smsTemplate, SmsTemplateVO.class));
+
+		//User createUser = UserCache.getUser(smsTemplate.getCreateUser());
+		//User updateUser = UserCache.getUser(smsTemplate.getUpdateUser());
+		//smsTemplateVO.setCreateUserName(createUser.getName());
+		//smsTemplateVO.setUpdateUserName(updateUser.getName());
+
+		return smsTemplateVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/controller/SmsTaskController.java b/src/main/java/org/springblade/modules/smsTask/controller/SmsTaskController.java
new file mode 100644
index 0000000..fe209ec
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/controller/SmsTaskController.java
@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.modules.smsTask.vo.SmsTaskVO;
+import org.springblade.modules.smsTask.wrapper.SmsTaskWrapper;
+import org.springblade.modules.smsTask.service.ISmsTaskService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 短信发送任务 控制器
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-smsTask/smsTask")
+@Api(value = "短信发送任务", tags = "短信发送任务接口")
+public class SmsTaskController extends BladeController {
+
+	private final ISmsTaskService smsTaskService;
+
+	/**
+	 * 短信发送任务 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入smsTask")
+	public R<SmsTaskVO> detail(SmsTaskEntity smsTask) {
+		SmsTaskEntity detail = smsTaskService.getOne(Condition.getQueryWrapper(smsTask));
+		return R.data(SmsTaskWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 短信发送任务 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入smsTask")
+	public R<IPage<SmsTaskVO>> list(SmsTaskEntity smsTask, Query query) {
+		IPage<SmsTaskEntity> pages = smsTaskService.page(Condition.getPage(query), Condition.getQueryWrapper(smsTask));
+		return R.data(SmsTaskWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 短信发送任务 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入smsTask")
+	public R<IPage<SmsTaskVO>> page(SmsTaskVO smsTask, Query query) {
+		IPage<SmsTaskVO> pages = smsTaskService.selectSmsTaskPage(Condition.getPage(query), smsTask);
+		return R.data(pages);
+	}
+
+	/**
+	 * 短信发送任务 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入smsTask")
+	public R save(@Valid @RequestBody SmsTaskEntity smsTask) {
+		return R.status(smsTaskService.save(smsTask));
+	}
+
+	/**
+	 * 短信发送任务 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入smsTask")
+	public R update(@Valid @RequestBody SmsTaskEntity smsTask) {
+		return R.status(smsTaskService.updateById(smsTask));
+	}
+
+	/**
+	 * 短信发送任务 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入smsTask")
+	public R submit(@Valid @RequestBody SmsTaskEntity smsTask) {
+		return R.status(smsTaskService.saveOrUpdate(smsTask));
+	}
+
+	/**
+	 * 短信发送任务 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(smsTaskService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/dto/SmsTaskDTO.java b/src/main/java/org/springblade/modules/smsTask/dto/SmsTaskDTO.java
new file mode 100644
index 0000000..79dfa93
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/dto/SmsTaskDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.dto;
+
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短信发送任务 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SmsTaskDTO extends SmsTaskEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/entity/SmsTaskEntity.java b/src/main/java/org/springblade/modules/smsTask/entity/SmsTaskEntity.java
new file mode 100644
index 0000000..5e30561
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/entity/SmsTaskEntity.java
@@ -0,0 +1,99 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 短信发送任务 实体类
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+@Data
+@TableName("jczz_sms_task")
+@ApiModel(value = "SmsTask对象", description = "短信发送任务")
+public class SmsTaskEntity {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/** 任务名称 */
+	@ApiModelProperty(value = "任务名称", example = "")
+	@TableField("name")
+	private String name;
+
+	/** 社区 */
+	@ApiModelProperty(value = "社区", example = "")
+	@TableField("community")
+	private String community;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
+	private Date updateTime;
+
+	/** 短信模板id */
+	@ApiModelProperty(value = "短信模板id", example = "")
+	@TableField("sms_template")
+	private Long smsTemplate;
+
+	/** 0 :否  1 :是 */
+	@ApiModelProperty(value = "0 :否  1 :是", example = "")
+	@TableField("delete_flag")
+	private String deleteFlag;
+
+	/** 小区编码 */
+	@ApiModelProperty(value = "小区ID", example = "")
+	@TableField("district_id")
+	private String districtId;
+
+	/** 楼栋 */
+	@ApiModelProperty(value = "楼栋", example = "")
+	@TableField("building_code")
+	private String buildingCode;
+
+	@ApiModelProperty(value = "小区名称", example = "")
+	@TableField("district_name")
+	private String districtName;
+
+	@ApiModelProperty(value = "楼栋名称", example = "")
+	@TableField("building_name")
+	private String buildingName;
+
+	@ApiModelProperty(value = "状态", example = "")
+	@TableField("status")
+	private String status;
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.java b/src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.java
new file mode 100644
index 0000000..0cb8cb8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.java
@@ -0,0 +1,63 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.smsTask.dto.SmsTaskDTO;
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.modules.smsTask.vo.SmsTaskVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.system.entity.User;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信发送任务 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+public interface SmsTaskMapper extends BaseMapper<SmsTaskEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param smsTask
+	 * @return
+	 */
+	List<SmsTaskVO> selectSmsTaskPage(IPage page, @Param("smsTask") SmsTaskVO smsTask);
+	/**
+	 * 查询短信发送任务
+	 *
+	 * @param id 短信发送任务ID
+	 * @return 短信发送任务
+	 */
+	public SmsTaskDTO selectSmsTaskById(Long id);
+
+	/**
+	 * 查询短信发送任务列表
+	 *
+	 * @param smsTaskDTO 短信发送任务
+	 * @return 短信发送任务集合
+	 */
+	public List<SmsTaskDTO> selectSmsTaskList(SmsTaskDTO smsTaskDTO);
+
+	List<User> selectSmsTaskListByPhone(SmsTaskEntity smsTaskEntity);
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.xml b/src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.xml
new file mode 100644
index 0000000..fdbcf57
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/mapper/SmsTaskMapper.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.smsTask.mapper.SmsTaskMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="smsTaskResultMap" type="org.springblade.modules.smsTask.entity.SmsTaskEntity">
+    </resultMap>
+
+
+    <select id="selectSmsTaskPage" resultMap="smsTaskResultMap">
+        <include refid="selectSmsTask"/>
+        <where>
+            <if test="smsTask.id != null "> and id = #{smsTask.id}</if>
+            <if test="smsTask.name != null  and smsTask.name != ''"> and name = #{smsTask.name}</if>
+            <if test="smsTask.community != null  and smsTask.community != ''"> and community = #{smsTask.community}</if>
+            <if test="smsTask.createTime != null "> and create_time = #{smsTask.createTime}</if>
+            <if test="smsTask.updateTime != null "> and update_time = #{smsTask.updateTime}</if>
+            <if test="smsTask.smsTemplate != null "> and sms_template = #{smsTask.smsTemplate}</if>
+            <if test="smsTask.deleteFlag != null  and smsTask.deleteFlag != ''"> and delete_flag = #{smsTask.deleteFlag}</if>
+            <if test="smsTask.aoiCode != null  and smsTask.aoiCode != ''"> and district_id = #{smsTask.aoiCode}</if>
+            <if test="smsTask.buildingCode != null  smsTask.and buildingCode != ''"> and building_code = #{smsTask.buildingCode}</if>
+        </where>
+    </select>
+
+    <resultMap type="org.springblade.modules.smsTask.dto.SmsTaskDTO" id="SmsTaskDTOResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="community"    column="community"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="smsTemplate"    column="sms_template"    />
+        <result property="deleteFlag"    column="delete_flag"    />
+        <result property="districtId"    column="district_id"    />
+        <result property="buildingCode"    column="building_code"    />
+    </resultMap>
+
+    <sql id="selectSmsTask">
+        select
+            id,
+            name,
+            community,
+            create_time,
+            update_time,
+            sms_template,
+            delete_flag,
+            district_id,
+            building_code,
+            building_name,
+            district_name,
+            status
+        from
+            jczz_sms_task
+    </sql>
+
+    <select id="selectSmsTaskById" parameterType="long" resultMap="SmsTaskDTOResult">
+        <include refid="selectSmsTask"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectSmsTaskList" parameterType="org.springblade.modules.smsTask.dto.SmsTaskDTO" resultMap="SmsTaskDTOResult">
+        <include refid="selectSmsTask"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="name != null  and name != ''"> and name = #{name}</if>
+            <if test="community != null  and community != ''"> and community = #{community}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+            <if test="smsTemplate != null "> and sms_template = #{smsTemplate}</if>
+            <if test="deleteFlag != null  and deleteFlag != ''"> and delete_flag = #{deleteFlag}</if>
+            <if test="districtId != null  and districtId != ''"> and district_id = #{districtId}</if>
+            <if test="buildingCode != null  and buildingCode != ''"> and building_code = #{buildingCode}</if>
+        </where>
+    </select>
+
+
+    <select id="selectSmsTaskListByPhone" resultType="org.springblade.modules.system.entity.User">
+        SELECT DISTINCT
+        bu.phone,
+        bu.name
+        FROM
+        blade_user bu
+        LEFT JOIN jczz_household jhd ON bu.id = jhd.associated_user_id
+        LEFT JOIN jczz_house jh ON jhd.house_code = jh.house_code
+        LEFT JOIN jczz_district jd ON jd.aoi_code = jh.district_code
+        LEFT JOIN jczz_sms_task jst ON jst.district_id = jd.id
+        LEFT JOIN jczz_doorplate_address jda on jda.address_code = jhd.house_code
+        <where>
+            <if test="id != null">jst.id = #{id}</if>
+            <if test="buildingCode != null  and buildingCode != ''">and jda.building_code = #{buildingCode}</if>
+            and jhd.relationship = 1
+            and bu.phone is not null
+        </where>
+    </select>
+
+
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/smsTask/service/ISmsTaskService.java b/src/main/java/org/springblade/modules/smsTask/service/ISmsTaskService.java
new file mode 100644
index 0000000..76f6694
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/service/ISmsTaskService.java
@@ -0,0 +1,71 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.smsTask.dto.SmsTaskDTO;
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.modules.smsTask.vo.SmsTaskVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.system.entity.User;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信发送任务 服务类
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+public interface ISmsTaskService extends IService<SmsTaskEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param smsTask
+	 * @return
+	 */
+	IPage<SmsTaskVO> selectSmsTaskPage(IPage<SmsTaskVO> page, SmsTaskVO smsTask);
+
+
+	/**
+	 * 查询短信发送任务
+	 *
+	 * @param id 短信发送任务ID
+	 * @return 短信发送任务
+	 */
+	public SmsTaskDTO selectSmsTaskById(Long id);
+
+	/**
+	 * 查询短信发送任务列表
+	 *
+	 * @param smsTaskDTO 短信发送任务
+	 * @return 短信发送任务集合
+	 */
+	public List<SmsTaskDTO> selectSmsTaskList(SmsTaskDTO smsTaskDTO);
+
+	/**
+	 *
+	 * @param
+	 * @return
+	 */
+	public List<User> selectSmsTaskListByPhone(SmsTaskEntity smsTaskEntity);
+
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/service/impl/SmsTaskServiceImpl.java b/src/main/java/org/springblade/modules/smsTask/service/impl/SmsTaskServiceImpl.java
new file mode 100644
index 0000000..e8fb3c6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/service/impl/SmsTaskServiceImpl.java
@@ -0,0 +1,76 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.modules.smsTask.dto.SmsTaskDTO;
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.modules.smsTask.vo.SmsTaskVO;
+import org.springblade.modules.smsTask.mapper.SmsTaskMapper;
+import org.springblade.modules.smsTask.service.ISmsTaskService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.system.entity.User;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信发送任务 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+@Service
+public class SmsTaskServiceImpl extends ServiceImpl<SmsTaskMapper, SmsTaskEntity> implements ISmsTaskService {
+
+	@Override
+	public IPage<SmsTaskVO> selectSmsTaskPage(IPage<SmsTaskVO> page, SmsTaskVO smsTask) {
+		return page.setRecords(baseMapper.selectSmsTaskPage(page, smsTask));
+	}
+
+
+	/**
+	 * 查询短信发送任务
+	 *
+	 * @param id 短信发送任务ID
+	 * @return 短信发送任务
+	 */
+	@Override
+	public SmsTaskDTO selectSmsTaskById(Long id)
+	{
+		return this.baseMapper.selectSmsTaskById(id);
+	}
+
+	/**
+	 * 查询短信发送任务列表
+	 *
+	 * @param smsTaskDTO 短信发送任务
+	 * @return 短信发送任务集合
+	 */
+	@Override
+	public List<SmsTaskDTO> selectSmsTaskList(SmsTaskDTO smsTaskDTO)
+	{
+		return this.baseMapper.selectSmsTaskList(smsTaskDTO);
+	}
+
+	@Override
+	public List<User> selectSmsTaskListByPhone(SmsTaskEntity smsTaskEntity) {
+		return baseMapper.selectSmsTaskListByPhone(smsTaskEntity);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/vo/SmsTaskVO.java b/src/main/java/org/springblade/modules/smsTask/vo/SmsTaskVO.java
new file mode 100644
index 0000000..813ccf1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/vo/SmsTaskVO.java
@@ -0,0 +1,35 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.vo;
+
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.core.tool.node.INode;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短信发送任务 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SmsTaskVO extends SmsTaskEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/smsTask/wrapper/SmsTaskWrapper.java b/src/main/java/org/springblade/modules/smsTask/wrapper/SmsTaskWrapper.java
new file mode 100644
index 0000000..5c7a98d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/smsTask/wrapper/SmsTaskWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.smsTask.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.smsTask.entity.SmsTaskEntity;
+import org.springblade.modules.smsTask.vo.SmsTaskVO;
+import java.util.Objects;
+
+/**
+ * 短信发送任务 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-08-08
+ */
+public class SmsTaskWrapper extends BaseEntityWrapper<SmsTaskEntity, SmsTaskVO>  {
+
+	public static SmsTaskWrapper build() {
+		return new SmsTaskWrapper();
+ 	}
+
+	@Override
+	public SmsTaskVO entityVO(SmsTaskEntity smsTask) {
+		SmsTaskVO smsTaskVO = Objects.requireNonNull(BeanUtil.copy(smsTask, SmsTaskVO.class));
+
+		//User createUser = UserCache.getUser(smsTask.getCreateUser());
+		//User updateUser = UserCache.getUser(smsTask.getUpdateUser());
+		//smsTaskVO.setCreateUserName(createUser.getName());
+		//smsTaskVO.setUpdateUserName(updateUser.getName());
+
+		return smsTaskVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/system/controller/DeptController.java b/src/main/java/org/springblade/modules/system/controller/DeptController.java
index a23c600..5944693 100644
--- a/src/main/java/org/springblade/modules/system/controller/DeptController.java
+++ b/src/main/java/org/springblade/modules/system/controller/DeptController.java
@@ -121,6 +121,17 @@
 	}
 
 	/**
+	 * 获取部门树形结构
+	 */
+	@GetMapping("/treeByDept")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "树形结构", notes = "树形结构")
+	public R<List<DeptVO>> treeByDept(@RequestParam(value = "deptId", required = true) Long deptId) {
+		List<DeptVO> tree = deptService.tree(deptId);
+		return R.data(tree);
+	}
+
+	/**
 	 * 懒加载获取部门树形结构
 	 */
 	@GetMapping("/lazy-tree")
@@ -236,6 +247,15 @@
 		return R.data(deptService.dataHandleCommunityByPolice());
 	}
 
-
+	/**
+	 * 查询组织机构树数据(下级包含人员信息)(懒加载)
+	 * @param treeNode
+	 * @return
+	 */
+	@GetMapping("/getDeptAndUserTreeLazyTree")
+	@ApiOperation(value = "查询组织机构树数据(下级包含人员信息)")
+	public R getDeptAndUserTreeLazyTree(DeptUserTreeNode treeNode) {
+		return R.data(deptService.getDeptAndUserTreeLazyTree(treeNode));
+	}
 
 }
diff --git a/src/main/java/org/springblade/modules/system/controller/DictBizController.java b/src/main/java/org/springblade/modules/system/controller/DictBizController.java
index 733f1f6..5c6d783 100644
--- a/src/main/java/org/springblade/modules/system/controller/DictBizController.java
+++ b/src/main/java/org/springblade/modules/system/controller/DictBizController.java
@@ -75,8 +75,8 @@
 	})
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "列表", notes = "传入dict")
-	public R<List<DictBizVO>> list(@ApiIgnore @RequestParam Map<String, Object> dict) {
-		List<DictBiz> list = dictService.list(Condition.getQueryWrapper(dict, DictBiz.class).lambda().orderByAsc(DictBiz::getSort));
+	public R<List<DictBizVO>> list(@ApiIgnore DictBiz dict) {
+		List<DictBiz> list = dictService.list(Condition.getQueryWrapper(dict).lambda().orderByAsc(DictBiz::getSort));
 		return R.data(DictBizWrapper.build().listNodeVO(list));
 	}
 
diff --git a/src/main/java/org/springblade/modules/system/controller/LogApiController.java b/src/main/java/org/springblade/modules/system/controller/LogApiController.java
index b675f20..4f73838 100644
--- a/src/main/java/org/springblade/modules/system/controller/LogApiController.java
+++ b/src/main/java/org/springblade/modules/system/controller/LogApiController.java
@@ -26,6 +26,7 @@
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.modules.system.service.ILogApiService;
+import org.springblade.modules.system.entity.LogApiExt;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -52,7 +53,7 @@
 	 * 查询单条
 	 */
 	@GetMapping("/detail")
-	public R<LogApi> detail(LogApi log) {
+	public R<LogApi> detail(LogApiExt log) {
 		return R.data(logService.getOne(Condition.getQueryWrapper(log)));
 	}
 
@@ -60,8 +61,20 @@
 	 * 查询多条(分页)
 	 */
 	@GetMapping("/list")
-	public R<IPage<LogApi>> list(@ApiIgnore @RequestParam Map<String, Object> log, Query query) {
-		IPage<LogApi> pages = logService.page(Condition.getPage(query.setDescs("create_time")), Condition.getQueryWrapper(log, LogApi.class));
+	public R<IPage<LogApiExt>> list(@ApiIgnore @RequestParam Map<String, Object> log, Query query) {
+		IPage<LogApiExt> pages = logService.page(Condition.getPage(query.setDescs("create_time")), Condition.getQueryWrapper(log, LogApiExt.class));
+		return R.data(pages);
+	}
+
+	/**
+	 * 查询多条(自定义分页)
+	 * @param logApi
+	 * @param query
+	 * @return
+	 */
+	@GetMapping("/page")
+	public R<IPage<LogApiExt>> selectLogApiExtPage(LogApiExt logApi, Query query) {
+		IPage<LogApiExt> pages = logService.selectLogApiExtPage(Condition.getPage(query), logApi);
 		return R.data(pages);
 	}
 
diff --git a/src/main/java/org/springblade/modules/system/controller/LogErrorController.java b/src/main/java/org/springblade/modules/system/controller/LogErrorController.java
index d659ae4..8819a32 100644
--- a/src/main/java/org/springblade/modules/system/controller/LogErrorController.java
+++ b/src/main/java/org/springblade/modules/system/controller/LogErrorController.java
@@ -60,8 +60,8 @@
 	 * 查询多条(分页)
 	 */
 	@GetMapping("/list")
-	public R<IPage<LogError>> list(@ApiIgnore @RequestParam Map<String, Object> logError, Query query) {
-		IPage<LogError> pages = errorLogService.page(Condition.getPage(query.setDescs("create_time")), Condition.getQueryWrapper(logError, LogError.class));
+	public R<IPage<LogError>> list(@ApiIgnore LogError logError, Query query) {
+		IPage<LogError> pages = errorLogService.page(Condition.getPage(query.setDescs("create_time")), Condition.getQueryWrapper(logError));
 		return R.data(pages);
 	}
 
diff --git a/src/main/java/org/springblade/modules/system/controller/LogUsualController.java b/src/main/java/org/springblade/modules/system/controller/LogUsualController.java
index 5898eed..a105677 100644
--- a/src/main/java/org/springblade/modules/system/controller/LogUsualController.java
+++ b/src/main/java/org/springblade/modules/system/controller/LogUsualController.java
@@ -60,8 +60,8 @@
 	 * 查询多条(分页)
 	 */
 	@GetMapping("/list")
-	public R<IPage<LogUsual>> list(@ApiIgnore @RequestParam Map<String, Object> log, Query query) {
-		IPage<LogUsual> pages = logService.page(Condition.getPage(query), Condition.getQueryWrapper(log, LogUsual.class));
+	public R<IPage<LogUsual>> list(@ApiIgnore LogUsual log, Query query) {
+		IPage<LogUsual> pages = logService.page(Condition.getPage(query), Condition.getQueryWrapper(log));
 		return R.data(pages);
 	}
 
diff --git a/src/main/java/org/springblade/modules/system/controller/MenuController.java b/src/main/java/org/springblade/modules/system/controller/MenuController.java
index 37d49b9..13b85a8 100644
--- a/src/main/java/org/springblade/modules/system/controller/MenuController.java
+++ b/src/main/java/org/springblade/modules/system/controller/MenuController.java
@@ -128,8 +128,8 @@
 //	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "菜单列表", notes = "传入menu")
-	public R<List<MenuVO>> menuList(@ApiIgnore @RequestParam Map<String, Object> menu) {
-		List<Menu> list = menuService.list(Condition.getQueryWrapper(menu, Menu.class).lambda().eq(Menu::getCategory, 1).orderByAsc(Menu::getSort));
+	public R<List<MenuVO>> menuList(@ApiIgnore Menu menu) {
+		List<Menu> list = menuService.list(Condition.getQueryWrapper(menu).lambda().eq(Menu::getCategory, 1).orderByAsc(Menu::getSort));
 		return R.data(MenuWrapper.build().listNodeVO(list));
 	}
 
@@ -138,8 +138,11 @@
 	 */
 	@GetMapping("/dynamicMenu")
 	@ApiOperation(value = "菜单列表", notes = "传入menu")
-	public R<List<MenuVO>> dynamicMenu(String roleId, Long topMenuId, @RequestParam(value = "labelType", required = false,defaultValue = "0") Integer labelType, @RequestParam(value = "roleName",required = false) String roleName) {
-		List<MenuVO> list = menuService.routes(roleId, topMenuId,labelType,1,roleName);
+	public R<List<MenuVO>> dynamicMenu(String roleId, Long topMenuId,
+									   @RequestParam(value = "labelType", required = false,defaultValue = "0") Integer labelType,
+									   @RequestParam(value = "roleName",required = false) String roleName,
+									   @RequestParam(value = "houseCode",required = false) String houseCode) {
+		List<MenuVO> list = menuService.routes(roleId, topMenuId,labelType,1,roleName,houseCode);
 		return R.data(list);
 	}
 
@@ -165,7 +168,7 @@
 	 * 新增或修改
 	 */
 	@PostMapping("/submit")
-	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
+//	@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入menu")
 	public R submit(@Valid @RequestBody MenuDTO menu) {
@@ -200,7 +203,7 @@
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "前端菜单数据", notes = "前端菜单数据")
 	public R<List<MenuVO>> routes(BladeUser user, Long topMenuId) {
-		List<MenuVO> list = menuService.routes((user == null) ? null : user.getRoleId(), topMenuId,null,0,"");
+		List<MenuVO> list = menuService.routes((user == null) ? null : user.getRoleId(), topMenuId,null,0,"","");
 		return R.data(list);
 	}
 
diff --git a/src/main/java/org/springblade/modules/system/controller/RegionController.java b/src/main/java/org/springblade/modules/system/controller/RegionController.java
index 2f3eda8..3860f74 100644
--- a/src/main/java/org/springblade/modules/system/controller/RegionController.java
+++ b/src/main/java/org/springblade/modules/system/controller/RegionController.java
@@ -136,6 +136,15 @@
 		return R.data(regionService.getTree(region));
 	}
 
+	/**
+	 * 树列表-查询到社区的树
+	 * @return
+	 */
+	@GetMapping("/treeToCommunity")
+	@ApiOperation(value = "树列表-查询到社区的树", notes = "传入menu")
+	public R treeToCommunity(@RequestParam(value = "isFiter",required = false) String isFiter) {
+		return R.data(regionService.treeToCommunity(isFiter));
+	}
 
 	/**
 	 * 树列表(获取当前树)
diff --git a/src/main/java/org/springblade/modules/system/controller/TenantController.java b/src/main/java/org/springblade/modules/system/controller/TenantController.java
index eb36712..33e9c94 100644
--- a/src/main/java/org/springblade/modules/system/controller/TenantController.java
+++ b/src/main/java/org/springblade/modules/system/controller/TenantController.java
@@ -93,8 +93,8 @@
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入tenant")
 	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R<IPage<Tenant>> list(@ApiIgnore @RequestParam Map<String, Object> tenant, Query query, BladeUser bladeUser) {
-		QueryWrapper<Tenant> queryWrapper = Condition.getQueryWrapper(tenant, Tenant.class);
+	public R<IPage<Tenant>> list(@ApiIgnore Tenant tenant, Query query, BladeUser bladeUser) {
+		QueryWrapper<Tenant> queryWrapper = Condition.getQueryWrapper(tenant);
 		IPage<Tenant> pages = tenantService.page(Condition.getPage(query), (!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(Tenant::getTenantId, bladeUser.getTenantId()) : queryWrapper);
 		return R.data(pages);
 	}
diff --git a/src/main/java/org/springblade/modules/system/controller/UserController.java b/src/main/java/org/springblade/modules/system/controller/UserController.java
index 881a73f..da5ab3b 100644
--- a/src/main/java/org/springblade/modules/system/controller/UserController.java
+++ b/src/main/java/org/springblade/modules/system/controller/UserController.java
@@ -27,9 +27,12 @@
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import org.springblade.common.cache.CacheNames;
+import org.springblade.common.param.ToObject;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.launch.constant.AppConstant;
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.redis.cache.BladeRedis;
@@ -40,6 +43,7 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.constant.RoleConstant;
+import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
@@ -62,6 +66,7 @@
 import java.util.List;
 import java.util.Map;
 
+import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 import static org.springblade.core.cache.constant.CacheConstant.USER_CACHE;
 
 /**
@@ -79,6 +84,7 @@
 
 	private final IUserService userService;
 	private final BladeRedis bladeRedis;
+	private final BladeLogger bladeLogger;
 
 	/**
 	 * 查询单条
@@ -126,8 +132,8 @@
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "列表", notes = "传入account和realName")
 	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
-	public R<IPage<UserVO>> list(@ApiIgnore @RequestParam Map<String, Object> user, Query query, BladeUser bladeUser) {
-		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
+	public R<IPage<UserVO>> list(@ApiIgnore User user, Query query, BladeUser bladeUser) {
+		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user);
 		IPage<User> pages = userService.page(Condition.getPage(query), (!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId()) : queryWrapper);
 		return R.data(UserWrapper.build().pageVO(pages));
 	}
@@ -161,7 +167,9 @@
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "列表", notes = "传入account和realName")
 //	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+	@ApiLog("自定义用户列表")
 	public R<IPage<UserVO>> page(@ApiIgnore User user, Query query, String deptId, BladeUser bladeUser) {
+		bladeLogger.info("自定义用户列表", JsonUtil.toJson(user));
 		IPage<User> pages = userService.selectUserPage(Condition.getPage(query), user, deptId, (bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID) ? StringPool.EMPTY : bladeUser.getTenantId()));
 		return R.data(UserWrapper.build().pageVO(pages));
 	}
@@ -183,9 +191,11 @@
 	 */
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 4)
+	@ApiLog("新增或修改")
 	@ApiOperation(value = "新增或修改", notes = "传入User")
 	@PreAuth("hasAnyRole('administrator', 'admin','wygly')")
 	public R submit(@Valid @RequestBody User user) {
+		bladeLogger.info("新增或修改", JsonUtil.toJson(user));
 		CacheUtil.clear(USER_CACHE);
 		return R.status(userService.submit(user));
 	}
@@ -195,9 +205,12 @@
 	 */
 	@PostMapping("/update")
 	@ApiOperationSupport(order = 5)
+	@ApiLog("修改")
 	@ApiOperation(value = "修改", notes = "传入User")
 	public R update(@Valid @RequestBody User user) {
+		bladeLogger.info("修改", JsonUtil.toJson(user));
 		CacheUtil.clear(USER_CACHE);
+		CacheUtil.clear(SYS_CACHE);
 		return R.status(userService.updateUser(user));
 	}
 
@@ -208,7 +221,9 @@
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "删除", notes = "传入id集合")
 	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+	@ApiLog("删除")
 	public R remove(@RequestParam String ids) {
+		bladeLogger.info("删除", JsonUtil.toJson(ids));
 		CacheUtil.clear(USER_CACHE);
 		return R.status(userService.removeUser(ids));
 	}
@@ -218,10 +233,12 @@
 	 */
 	@PostMapping("/grant")
 	@ApiOperationSupport(order = 7)
+	@ApiLog("设置菜单权限")
 	@ApiOperation(value = "权限设置", notes = "传入roleId集合以及menuId集合")
 	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
 	public R grant(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds,
 				   @ApiParam(value = "roleId集合", required = true) @RequestParam String roleIds) {
+		bladeLogger.info("设置菜单权限", JsonUtil.toJson(userIds));
 		boolean temp = userService.grant(userIds, roleIds);
 		return R.status(temp);
 	}
@@ -232,8 +249,10 @@
 	@PostMapping("/reset-password")
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "初始化密码", notes = "传入userId集合")
+	@ApiLog("重置密码")
 	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
 	public R resetPassword(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds) {
+		bladeLogger.info("重置密码", JsonUtil.toJson(userIds));
 		boolean temp = userService.resetPassword(userIds);
 		return R.status(temp);
 	}
@@ -243,10 +262,12 @@
 	 */
 	@PostMapping("/update-password")
 	@ApiOperationSupport(order = 9)
+	@ApiLog("修改密码")
 	@ApiOperation(value = "修改密码", notes = "传入密码")
 	public R updatePassword(BladeUser user, @ApiParam(value = "旧密码", required = true) @RequestParam String oldPassword,
 							@ApiParam(value = "新密码", required = true) @RequestParam String newPassword,
 							@ApiParam(value = "新密码", required = true) @RequestParam String newPassword1) {
+		bladeLogger.info("修改密码", JsonUtil.toJson(ToObject.toMap("oldPassword:" + oldPassword, "newPassword:" + newPassword, "newPassword1:" + newPassword1)));
 		boolean temp = userService.updatePassword(user.getUserId(), oldPassword, newPassword, newPassword1);
 		return R.status(temp);
 	}
@@ -255,9 +276,11 @@
 	 * 修改基本信息
 	 */
 	@PostMapping("/update-info")
+	@ApiLog("自定义用户列表")
 	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "修改基本信息", notes = "传入User")
 	public R updateInfo(@Valid @RequestBody User user) {
+		bladeLogger.info("修改基本信息", JsonUtil.toJson(user));
 		CacheUtil.clear(USER_CACHE);
 		return R.status(userService.updateUserInfo(user));
 	}
@@ -279,6 +302,7 @@
 	 */
 	@PostMapping("import-user")
 	@ApiOperationSupport(order = 12)
+	@ApiLog("导入用户")
 	@ApiOperation(value = "导入用户", notes = "传入excel")
 	public R importUser(MultipartFile file, Integer isCovered) {
 		UserImporter userImporter = new UserImporter(userService, isCovered == 1);
@@ -290,15 +314,20 @@
 	 * 导出用户
 	 */
 	@GetMapping("export-user")
+	@ApiLog("导出用户")
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "导出用户", notes = "传入user")
 	public void exportUser(@ApiIgnore @RequestParam Map<String, Object> user, BladeUser bladeUser, HttpServletResponse response) {
+		bladeLogger.info("导出用户", JsonUtil.toJson(bladeUser));
+		String deptId = (String) user.get("deptId");
+		// 置空
+		user.put("deptId", "");
 		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
 		if (!AuthUtil.isAdministrator()) {
 			queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId());
 		}
 		queryWrapper.lambda().eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED);
-		List<UserExcel> list = userService.exportUser(queryWrapper);
+		List<UserExcel> list = userService.exportUser(queryWrapper, deptId);
 		ExcelUtil.export(response, "用户数据" + DateUtil.time(), "用户数据表", list, UserExcel.class);
 	}
 
@@ -368,8 +397,10 @@
 	 */
 	@PostMapping("/unlock")
 	@ApiOperationSupport(order = 19)
+	@ApiLog("用户解锁")
 	@ApiOperation(value = "账号解锁", notes = "传入id")
 	public R unlock(String userIds) {
+		bladeLogger.info("用户解锁", JsonUtil.toJson(userIds));
 		if (StringUtil.isBlank(userIds)) {
 			return R.fail("请至少选择一个用户");
 		}
@@ -380,10 +411,11 @@
 
 	/**
 	 * 获取用户信息
+	 *
 	 * @return
 	 */
 	@GetMapping("/getUserInfo")
-	public R getUserInfo(){
+	public R getUserInfo() {
 		//根据保安员编码查询保安员信息
 		return R.data(userService.getUserInfo(AuthUtil.getUserId()));
 	}
@@ -407,23 +439,14 @@
 		return R.data(userService.getUserInfoByDistrictId(districtId, building));
 	}
 
-	/**
-	 * 通过小区id查询物业人员/网格人员
-	 */
-	@GetMapping("/getUserInfoByDistrictIds")
-	@ApiOperation(value = "查询物业人员By小区id", notes = "houseCode")
-	public R getUserInfoByDistrictIds(@RequestParam("districtIds") String districtIds) {
-		return R.data(userService.getUserInfoByDistrictIds(districtIds));
-	}
-
 
 	/**
 	 * 通过机构查询物业公司人员
 	 */
 	@GetMapping("/getUserInfoByPropertyCompanyId")
 	@ApiOperation(value = "通过机构查询物业公司人员", notes = "propertyCompanyId")
-	public R getUserInfoByPropertyId(@RequestParam("propertyCompanyId") String propertyCompanyId,@RequestParam("roleId") String roleId) {
-		return R.data(userService.getUserInfoByPropertyId(propertyCompanyId,roleId));
+	public R getUserInfoByPropertyId(@RequestParam("propertyCompanyId") String propertyCompanyId, @RequestParam("roleId") String roleId) {
+		return R.data(userService.getUserInfoByPropertyId(propertyCompanyId, roleId));
 	}
 
 	/**
@@ -453,4 +476,28 @@
 		return R.success("操作成功");
 	}
 
+	/**
+	 * 通过经纬度查询最近的民警人员
+	 * longitude
+	 * latitude
+	 */
+	@GetMapping("/getPoliceUser")
+	@ApiLog("通过经纬度查询最近的民警人员")
+	@ApiOperation(value = "通过经纬度查询最近的民警人员")
+	public R getPoliceUser(@RequestParam("longitude") String longitude, @RequestParam(value = "latitude") String latitude, @RequestParam(value = "houseCode", required = false) String houseCode) {
+		bladeLogger.info("通过经纬度查询最近的民警人员", JsonUtil.toJson(ToObject.toMap("longitude:" + longitude, "latitude:" + latitude, "houseCode:" + houseCode)));
+		return R.data(userService.getPoliceUser(longitude, latitude, houseCode));
+	}
+
+
+	/**
+	 * 注册用户
+	 */
+	@PostMapping("/register-user")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "注册用户", notes = "传入user")
+	public R registerUser(@RequestBody UserVO user ) {
+		return R.status(userService.registerUser(user ));
+	}
+
 }
diff --git a/src/main/java/org/springblade/modules/system/entity/Dept.java b/src/main/java/org/springblade/modules/system/entity/Dept.java
index 12a326e..1e48f9a 100644
--- a/src/main/java/org/springblade/modules/system/entity/Dept.java
+++ b/src/main/java/org/springblade/modules/system/entity/Dept.java
@@ -86,9 +86,9 @@
 	private Integer deptCategory;
 
 	/**
-	 * 机构性质  1:公安  2:非公安
+	 * 机构性质  1:公安  2:综治
 	 */
-	@ApiModelProperty(value = "机构性质  1:公安  2:非公安")
+	@ApiModelProperty(value = "机构性质  1:公安  2:综治")
 	private Integer deptNature;
 
 	/**
diff --git a/src/main/java/org/springblade/modules/system/entity/LogApiExt.java b/src/main/java/org/springblade/modules/system/entity/LogApiExt.java
new file mode 100644
index 0000000..81cfecd
--- /dev/null
+++ b/src/main/java/org/springblade/modules/system/entity/LogApiExt.java
@@ -0,0 +1,19 @@
+package org.springblade.modules.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.log.model.LogApi;
+
+@Data
+@TableName("blade_log_api")
+public class LogApiExt extends LogApi {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 应用id
+	 */
+	@ApiModelProperty(value = "应用id")
+	private String applicationId;
+}
diff --git a/src/main/java/org/springblade/modules/system/entity/TreeNodeTwo.java b/src/main/java/org/springblade/modules/system/entity/TreeNodeTwo.java
new file mode 100644
index 0000000..a06fbed
--- /dev/null
+++ b/src/main/java/org/springblade/modules/system/entity/TreeNodeTwo.java
@@ -0,0 +1,12 @@
+package org.springblade.modules.system.entity;
+
+
+import lombok.Data;
+import org.springblade.core.tool.node.TreeNode;
+
+@Data
+public class TreeNodeTwo extends TreeNode {
+
+	private String remark;
+
+}
diff --git a/src/main/java/org/springblade/modules/system/entity/User.java b/src/main/java/org/springblade/modules/system/entity/User.java
index 2d6f517..cb87321 100644
--- a/src/main/java/org/springblade/modules/system/entity/User.java
+++ b/src/main/java/org/springblade/modules/system/entity/User.java
@@ -16,7 +16,9 @@
  */
 package org.springblade.modules.system.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.tenant.mp.TenantEntity;
@@ -92,5 +94,20 @@
 	 */
 	private String postId;
 
+	/** 经度 */
+	@ApiModelProperty(value = "经度", example = "")
+	@TableField("lng")
+	private String lng;
+
+	/** 纬度 */
+	@ApiModelProperty(value = "纬度", example = "")
+	@TableField("lat")
+	private String lat;
+
+	@ApiModelProperty(value = "小程序openid", example = "")
+	@TableField("mini_open_id")
+	private String miniOpenId;
+
+
 
 }
diff --git a/src/main/java/org/springblade/modules/system/excel/PoliceUserExcel.java b/src/main/java/org/springblade/modules/system/excel/PoliceUserExcel.java
index 7dbc5c9..071a4f1 100644
--- a/src/main/java/org/springblade/modules/system/excel/PoliceUserExcel.java
+++ b/src/main/java/org/springblade/modules/system/excel/PoliceUserExcel.java
@@ -24,16 +24,20 @@
 	@ExcelProperty("姓名")
 	private String realName;
 
+	@ColumnWidth(10)
+	@ExcelProperty("性别")
+	private String sex;
+
 	@ColumnWidth(15)
-	@ExcelProperty("手机")
+	@ExcelProperty("联系电话")
 	private String phone;
 
 	@ColumnWidth(15)
-	@ExcelProperty("社区代码")
-	private String communityCode;
+	@ExcelProperty("工作单位")
+	private String deptName;
 
 	@ColumnWidth(15)
-	@ExcelProperty("派出所名称")
-	private String policeStationName;
+	@ExcelProperty("角色")
+	private String roleName;
 
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/DeptMapper.java b/src/main/java/org/springblade/modules/system/mapper/DeptMapper.java
index c52324e..56a16d3 100644
--- a/src/main/java/org/springblade/modules/system/mapper/DeptMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/DeptMapper.java
@@ -84,6 +84,15 @@
 	@MapKey(value = "id")
 	Map<String, DeptUserTreeNode> getDeptMap(@Param("treeNode") DeptUserTreeNode treeNode);
 
+
+	/**
+	 * 查询组织机构树,并且获取下级
+	 * @param treeNode
+	 * @return
+	 */
+	@MapKey(value = "id")
+	Map<String, DeptUserTreeNode> getDeptMapAndChildren(@Param("treeNode")DeptUserTreeNode treeNode);
+
 	/**
 	 * 查询用户树
 	 * @param treeNode
@@ -105,4 +114,8 @@
 	 * @return
 	 */
     Dept getDeptByDeptIds(@Param("deptId") String deptId);
+	@MapKey(value = "id")
+	Map<String, DeptUserTreeNode> getDeptMapAndChild(@Param("treeNode")DeptUserTreeNode treeNode);
+	@MapKey(value = "id")
+	Map<String, DeptUserTreeNode> getUserMapByDeptIds(@Param("deptIds") String deptIds);
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml b/src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml
index c22b69a..5211eec 100644
--- a/src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml
@@ -170,6 +170,73 @@
         </if>
     </select>
 
+    <select id="getDeptMapAndChildren" resultType="org.springblade.modules.system.node.DeptUserTreeNode">
+
+        SELECT
+        cast(dept.id as char) as id,
+        dept.parent_id parentId,
+        dept.dept_name AS name,
+        1 as isMan,
+        0 AS phone,
+        0 as email,
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM blade_dept  WHERE  parent_id = dept.id and is_deleted = 0) AS hasChildren,
+        IFNULL(bu.num,0) AS userCount
+        FROM
+        blade_dept dept
+        LEFT JOIN
+        (
+        SELECT COUNT(*) num,dept_id FROM blade_user where is_deleted = 0 GROUP BY dept_id
+        ) bu on dept.id = bu.dept_id
+        WHERE dept.is_deleted = 0
+        <if test="treeNode.id!=null and treeNode.id!=''">
+            and dept.id = #{treeNode.id}
+        </if>
+
+        union
+
+        SELECT
+        cast(dept.id as char) as id,
+        dept.parent_id parentId,
+        dept.dept_name AS name,
+        1 as isMan,
+        0 AS phone,
+        0 as email,
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM blade_dept  WHERE  parent_id = dept.id and is_deleted = 0) AS hasChildren,
+        IFNULL(bu.num,0) AS userCount
+        FROM
+        blade_dept dept
+        LEFT JOIN
+        (
+        SELECT COUNT(*) num,dept_id FROM blade_user where is_deleted = 0 GROUP BY dept_id
+        ) bu on dept.id = bu.dept_id
+        WHERE dept.is_deleted = 0
+        <if test="treeNode.id!=null and treeNode.id!=''">
+            AND ancestors LIKE CONCAT( '%',  #{treeNode.id}, '%')
+        </if>
+
+
+
+
+    </select>
+
+    <select id="getDeptMapAndChild" resultType="org.springblade.modules.system.node.DeptUserTreeNode">
+
+        SELECT
+            cast( dept.id AS CHAR ) AS id,
+            dept.parent_id parentId,
+            dept.dept_name AS NAME,
+            1 AS isMan,
+            0 AS phone,
+            ( SELECT CASE WHEN count( 1 ) > 0 THEN 1 ELSE 0 END FROM blade_dept WHERE parent_id = dept.id AND is_deleted = 0 ) AS hasChildren
+        FROM
+            blade_dept dept
+        WHERE
+            dept.is_deleted = 0
+          AND dept.parent_id = #{treeNode.id}
+
+    </select>
+
+
     <!--查询组织机构树数据(下级包含人员信息)(排除组织机构对应不上的人员)-->
     <select id="getUserMap" resultType="org.springblade.modules.system.node.DeptUserTreeNode">
         select
@@ -183,10 +250,31 @@
         from blade_user bu join blade_dept bd on find_in_set(bu.dept_id,bd.id)
         where 1=1 and bu.is_deleted = 0 and bu.status = 1
         <if test="treeNode.id!=null and treeNode.id!=''">
-            and bu.dept_id like concat(concat('%',#{treeNode.id}),'%')
+            and (bu.dept_id = #{treeNode.id} or bd.ancestors LIKE CONCAT( '%',  #{treeNode.id}, '%'))
         </if>
     </select>
 
+    <select id="getUserMapByDeptIds" resultType="org.springblade.modules.system.node.DeptUserTreeNode">
+        select
+        bu.id,
+        bu.dept_id parentId,
+        bu.real_name AS name,
+        bu.phone,
+        bu.email,
+        2 as isMan,
+        0 as hasChildren
+        from blade_user bu join blade_dept bd on find_in_set(bu.dept_id,bd.id)
+        where 1=1 and bu.is_deleted = 0 and bu.status = 1
+        <if test="deptIds !=null and deptIds!=''">
+            and bu.dept_id in
+            <foreach collection="deptIds.split(',')" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+    </select>
+
+
+
     <!--查询网格对应的机构信息(包含父级机构名称)-->
     <select id="getGridDeptAndParentList" resultType="org.springblade.modules.system.vo.DeptVO">
         select bd.*,bd1.dept_name as parentName from blade_dept bd
diff --git a/src/main/java/org/springblade/modules/system/mapper/DictBizMapper.xml b/src/main/java/org/springblade/modules/system/mapper/DictBizMapper.xml
index 2a95d91..9264842 100644
--- a/src/main/java/org/springblade/modules/system/mapper/DictBizMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/DictBizMapper.xml
@@ -15,11 +15,12 @@
         <result column="is_deleted" property="isDeleted"/>
     </resultMap>
 
-    <resultMap id="treeNodeResultMap" type="org.springblade.core.tool.node.TreeNode">
+    <resultMap id="treeNodeResultMap" type="org.springblade.modules.system.entity.TreeNodeTwo">
         <id column="id" property="id"/>
         <result column="parent_id" property="parentId"/>
         <result column="title" property="title"/>
         <result column="value" property="value"/>
+        <result column="remark" property="remark"/>
         <result column="key" property="key"/>
     </resultMap>
 
@@ -65,6 +66,7 @@
         dict_value AS title,
         id AS "value",
         dict_key AS "key",
+        remark,
         (
         SELECT
         CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
diff --git a/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.java b/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.java
index 7010a9e..84998f5 100644
--- a/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.java
@@ -17,13 +17,29 @@
 package org.springblade.modules.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springblade.core.log.model.LogApi;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.system.entity.LogApiExt;
+
+import java.util.List;
 
 /**
  * Mapper 接口
  *
  * @author Chill
  */
-public interface LogApiMapper extends BaseMapper<LogApi> {
+public interface LogApiMapper extends BaseMapper<LogApiExt> {
 
+	/**
+	 * 查询多条(自定义分页)
+	 * @param logApi
+	 * @param logApi
+	 * @return
+	 */
+	List<LogApiExt> selectLogApiExtPage(IPage<LogApiExt> page,@Param("logApi") LogApiExt logApi);
+
+	/**
+	 * 删除日志
+	 */
+    int removeByTime();
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.xml b/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.xml
index 39b6194..fd06b96 100644
--- a/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/LogApiMapper.xml
@@ -2,25 +2,27 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.modules.system.mapper.LogApiMapper">
 
-    <!-- 通用查询映射结果 -->
-    <resultMap id="logResultMap" type="org.springblade.core.log.model.LogApi">
-        <result column="id" property="id"/>
-        <result column="create_time" property="createTime"/>
-        <result column="service_id" property="serviceId"/>
-        <result column="server_host" property="serverHost"/>
-        <result column="server_ip" property="serverIp"/>
-        <result column="env" property="env"/>
-        <result column="type" property="type"/>
-        <result column="title" property="title"/>
-        <result column="method" property="method"/>
-        <result column="request_uri" property="requestUri"/>
-        <result column="user_agent" property="userAgent"/>
-        <result column="remote_ip" property="remoteIp"/>
-        <result column="method_class" property="methodClass"/>
-        <result column="method_name" property="methodName"/>
-        <result column="params" property="params"/>
-        <result column="time" property="time"/>
-        <result column="create_by" property="createBy"/>
-    </resultMap>
+    <!--自定义分页查询-->
+    <select id="selectLogApiExtPage" resultType="org.springblade.modules.system.entity.LogApiExt">
+        select * from blade_log_api where 1 = 1
+        <if test="logApi.type!=null and logApi.type!=''">
+            and type = #{logApi.type}
+        </if>
+        <if test="logApi.applicationId!=null and logApi.applicationId!=''">
+            and application_id = #{logApi.type}
+        </if>
+        <if test="logApi.serviceId!=null and logApi.serviceId!=''">
+            and service_id like concat('%',#{logApi.serviceId},'%')
+        </if>
+        <if test="logApi.serverHost!=null and logApi.serverHost!=''">
+            and server_host like concat('%',#{logApi.serverHost},'%')
+        </if>
+        order by id desc,create_time desc
+    </select>
+
+    <!--删除接口日志信息-->
+    <delete id="removeByTime">
+        DELETE FROM blade_log_api WHERE create_time &lt; NOW() - INTERVAL 180 DAY;
+    </delete>
 
 </mapper>
diff --git a/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.java b/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.java
index 4fbb70c..531d32c 100644
--- a/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.java
@@ -26,4 +26,8 @@
  */
 public interface LogErrorMapper extends BaseMapper<LogError> {
 
+	/**
+	 * 删除日志
+	 */
+    void removeByTime();
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.xml b/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.xml
index d14b253..34cd13e 100644
--- a/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/LogErrorMapper.xml
@@ -24,4 +24,9 @@
         <result column="create_by" property="createBy"/>
     </resultMap>
 
+    <!--删除接口日志信息-->
+    <delete id="removeByTime">
+        DELETE FROM blade_log_error WHERE create_time &lt; NOW() - INTERVAL 90 DAY;
+    </delete>
+
 </mapper>
diff --git a/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.java b/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.java
index 9e4e186..9881b45 100644
--- a/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.java
@@ -26,4 +26,9 @@
  */
 public interface LogUsualMapper extends BaseMapper<LogUsual> {
 
+	/**
+	 *
+	 * @return
+	 */
+    int removeByTime();
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.xml b/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.xml
index 410cad1..f3973b3 100644
--- a/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/LogUsualMapper.xml
@@ -19,4 +19,9 @@
         <result column="create_by" property="createBy"/>
     </resultMap>
 
+    <!--删除通用日志信息-->
+    <delete id="removeByTime">
+        DELETE FROM blade_log_usual WHERE create_time &lt; NOW() - INTERVAL 90 DAY;
+    </delete>
+
 </mapper>
diff --git a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java
index dcbbfd7..d2386ac 100644
--- a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.java
@@ -98,7 +98,9 @@
 	 * @param regionCode
 	 * @return
 	 */
-    List<Region> getRegionChildList(@Param("regionCode") String regionCode);
+    List<Region> getRegionChildList(@Param("regionCode") String regionCode,
+									@Param("communityCode") String communityCode,
+									@Param("roleName") String roleName);
 
 	/**
 	 * 查询公安对应的辖区树
@@ -111,5 +113,28 @@
 	 * 查询公安相关的区域数据
 	 * @return
 	 */
-	List<Region> getPoliceList();
+	List<Region> getPoliceList(@Param("communityCode") String communityCode);
+
+	/**
+	 * 查询网格员对应的网格
+	 * @param regionCode
+	 * @return
+	 */
+	List<Region> getGridRegionChildList(@Param("regionCode") String regionCode);
+
+	/**
+	 * 查询当前文章范围对应的社区编号字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+    List<String> getAllCommunityNameListString(@Param("articleRange") String articleRange);
+
+	/**
+	 * 树列表-查询到社区的树
+	 * @param regionChildCodesList
+	 * @param isAdministrator
+	 * @return
+	 */
+	@MapKey(value = "id")
+	Map<String, TreeStringNode> treeToCommunity(List<String> regionChildCodesList, Integer isAdministrator);
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml
index ffbffac..e014a13 100644
--- a/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/RegionMapper.xml
@@ -152,15 +152,28 @@
     <!--根据父编号查询所有的下级-->
     <select id="getTreeList" resultType="org.springblade.common.node.TreeStringNode">
         <if test="region.cityCode!=null and region.cityCode!=''">
-        select
-        grid_code as id,
-        community_code as parentId,
-        grid_name as name,
-        jg.sort
-        FROM jczz_grid jg
-        left join blade_region br on br.village_code = jg.community_code and br.region_level = 5
-        where jg.is_deleted = 0 and br.city_code = #{region.cityCode}
-        union all
+            select
+            grid_code as id,
+            community_code as parentId,
+            grid_name as name,
+            jg.sort
+            FROM jczz_grid jg
+            left join blade_region br on br.village_code = jg.community_code and br.region_level = 5
+            where jg.is_deleted = 0 and jg.community_code like concat(#{region.cityCode},'%')
+            <if test="isAdministrator==2">
+                <choose>
+                    <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                        and jg.community_code in
+                        <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                            #{code}
+                        </foreach>
+                    </when>
+                    <otherwise>
+                        and 1=1
+                    </otherwise>
+                </choose>
+            </if>
+            union all
         </if>
         SELECT
         code as id,
@@ -169,7 +182,9 @@
         sort
         FROM blade_region
         where 1=1
-        and district_code = '361102'
+        <if test="region.districtCode!=null and region.districtCode!=''">
+            and district_code like concat(#{region.districtCode},'%')
+        </if>
         <if test="region.parentCode!=null and region.parentCode!=''">
             and parent_code = #{region.parentCode}
         </if>
@@ -232,7 +247,7 @@
         SELECT
         code,parent_code,name,ancestors,region_level,sort
         FROM blade_region
-        where ancestors like concat('%',#{regionCode},'%')
+        where (ancestors like concat('%',#{regionCode},'%') or code = #{regionCode})
         union all
         (
         SELECT
@@ -244,13 +259,37 @@
         jg.sort
         FROM blade_region br
         right join jczz_grid jg on jg.community_code = br.village_code and jg.is_deleted = 0
-        where br.ancestors like concat('%',#{regionCode},'%')
+        where (br.ancestors like concat('%',#{regionCode},'%') or br.code = #{regionCode} or jg.grid_code = #{regionCode})
+        )
+    </select>
+
+    <!--查询网格员对应的网格区域-->
+    <select id="getGridRegionChildList" resultType="org.springblade.modules.system.entity.Region">
+        SELECT
+        jg.grid_code as code,
+        jg.community_code as parent_code,
+        jg.grid_name as name,
+        '' as ancestors,
+        6 as region_level,
+        jg.sort
+        FROM blade_region br
+        right join jczz_grid jg on jg.community_code = br.village_code and jg.is_deleted = 0
+        where (
+        jg.grid_code = #{regionCode}
+        or jg.community_code = #{regionCode}
+        or br.town_code = #{regionCode}
+        or br.district_code = #{regionCode}
+        or br.city_code = #{regionCode}
         )
     </select>
 
     <!--查询公安相关的区域数据-->
     <select id="getPoliceList" resultType="org.springblade.modules.system.entity.Region">
-        SELECT id as code,parentId as parent_code,name,'' as ancestors,null as region_level,1 as sort FROM police_region
+        SELECT id as code,parent_id as parent_code,name,'' as ancestors,null as region_level,1 as sort FROM v_police_region
+        where 1=1
+        <if test="communityCode!=null and communityCode!=''">
+            and id like concat('%',#{communityCode},'%')
+        </if>
     </select>
 
 
@@ -271,4 +310,65 @@
         WHERE is_deleted = 0  AND pcs_code IS NOT NULL
     </select>
 
+    <!--查询当前文章范围对应的社区编号字符串集合-->
+    <select id="getAllCommunityNameListString" resultType="java.lang.String">
+        SELECT
+        code
+        FROM blade_region
+        where
+        <foreach collection="articleRange.split(',')" item="item" open="(" close=")" separator="OR">
+            ancestors like concat('%',#{item},'%')
+        </foreach>
+        and region_level = 5
+        union
+        (
+        SELECT
+        br.code
+        FROM jczz_district jd
+        left join blade_region br on jd.community_code = br.village_code
+        where br.region_level = 5
+        and jd.id in
+        <foreach collection="articleRange.split(',')" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        )
+        union
+        (
+        SELECT
+        jd.id
+        FROM jczz_district jd
+        where
+        jd.id in
+        <foreach collection="articleRange.split(',')" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        )
+    </select>
+
+
+    <!--根据父编号查询所有的下级-->
+    <select id="treeToCommunity" resultType="org.springblade.common.node.TreeStringNode">
+        select
+        br.code as id,
+        br.parent_code as parentId,
+        br.name as name,
+        br.sort
+        FROM blade_region br
+        left join jczz_grid jg on br.village_code = jg.community_code and jg.is_deleted = 0 and br.region_level = 5
+        where 1=1 and (br.ancestors like '%361102%' or br.code = '361102')
+        <if test="isAdministrator==2">
+            <choose>
+                <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                    and jg.community_code in
+                    <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                        #{code}
+                    </foreach>
+                </when>
+                <otherwise>
+                    and jg.community_code in ('')
+                </otherwise>
+            </choose>
+        </if>
+    </select>
+
 </mapper>
diff --git a/src/main/java/org/springblade/modules/system/mapper/RoleMapper.java b/src/main/java/org/springblade/modules/system/mapper/RoleMapper.java
index 65d7c86..1bd7926 100644
--- a/src/main/java/org/springblade/modules/system/mapper/RoleMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/RoleMapper.java
@@ -74,4 +74,12 @@
 	 * @return
 	 */
     List<Role> getRoleList(@Param("roleParam") RoleParam roleParam);
+
+	/**
+	 * 查询对应的角色id
+	 * @param roleId
+	 * @param type 登录类型 2:pc 3:app
+	 * @return
+	 */
+	List<String> getRoleIdStrByRoleIdAndType(@Param("ids") String roleId,@Param("types") List<Integer> type);
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml b/src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml
index 57e1edd..f702df4 100644
--- a/src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml
@@ -53,12 +53,18 @@
         role_alias
         FROM
         blade_role
-        WHERE
-        id IN
-        <foreach collection="array" item="ids" index="index" open="(" close=")" separator=",">
-            #{ids}
-        </foreach>
-        and is_deleted = 0
+        WHERE is_deleted = 0
+        <choose>
+            <when test="array!=null and array.length>0">
+                and id IN
+                <foreach collection="array" item="ids" index="index" open="(" close=")" separator=",">
+                    #{ids}
+                </foreach>
+            </when>
+            <otherwise>
+                and id IN ('')
+            </otherwise>
+        </choose>
     </select>
     <select id="getRoleListByIds" resultType="org.springblade.modules.system.entity.Role">
         SELECT * FROM BLADE_ROLE
@@ -68,6 +74,21 @@
         </foreach>
     </select>
 
+    <!--查询对应的角色id-->
+    <select id="getRoleIdStrByRoleIdAndType" resultType="java.lang.String">
+        SELECT id FROM BLADE_ROLE
+        WHERE id IN
+        <foreach collection="ids.split(',')" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        <if test="types!=null and types.size()>0">
+            and type in
+            <foreach collection="types" item="type" open="(" separator="," close=")">
+                #{type}
+            </foreach>
+        </if>
+    </select>
+
     <!--角色查询-->
     <select id="getRoleList" resultType="org.springblade.modules.system.entity.Role">
         SELECT br.* FROM blade_role br
diff --git a/src/main/java/org/springblade/modules/system/mapper/UserMapper.java b/src/main/java/org/springblade/modules/system/mapper/UserMapper.java
index 112047a..af293dc 100644
--- a/src/main/java/org/springblade/modules/system/mapper/UserMapper.java
+++ b/src/main/java/org/springblade/modules/system/mapper/UserMapper.java
@@ -21,6 +21,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.flowable.idm.engine.impl.persistence.entity.UserEntity;
+import org.springblade.modules.house.vo.HouseholdVO;
 import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.excel.UserExcel;
 import org.springblade.modules.system.vo.UserDetailVO;
@@ -62,7 +63,7 @@
 	 * @param queryWrapper
 	 * @return
 	 */
-	List<UserExcel> exportUser(@Param("ew") Wrapper<User> queryWrapper);
+	List<UserExcel> exportUser(@Param("ew") Wrapper<User> queryWrapper,@Param("deptIdList") List<Long> deptIdList);
 
 	/**
 	 * 按条件查询用户信息
@@ -115,11 +116,21 @@
 
 	List<User> getUserInfoByPropertyId(String deptId, String roleId);
 
+
 	/**
+	 * 通过机构查询用户
 	 *
-	 * 多个小区id查询用户
-	 * @param list
+	 * @param deptIdList
 	 * @return
 	 */
-	List<User> getUserInfoByDistrictIds(@Param("list") List<String> list);
+	List<UserEntity> selectUserByDept(List<Long> deptIdList);
+
+	/**
+	 * 通过经纬度查询最近的民警人员
+	 *
+	 * @param longitude
+	 * @param latitude
+	 * @return
+	 */
+	List<User> getPoliceUser(String longitude, String latitude);
 }
diff --git a/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml b/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
index ccd39d3..3bbac39 100644
--- a/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
+++ b/src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
@@ -74,7 +74,32 @@
     </select>
 
     <select id="exportUser" resultType="org.springblade.modules.system.excel.UserExcel">
-        SELECT id, tenant_id, user_type, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM blade_user ${ew.customSqlSegment}
+        SELECT id,
+               tenant_id,
+               user_type,
+               account,
+               name,
+               real_name,
+               email,
+               phone,
+               birthday,
+               role_id,
+               dept_id,
+               post_id
+        FROM blade_user ${ew.customSqlSegment}
+        <if test="deptIdList!=null and deptIdList.size>0">
+            and id in (
+            SELECT
+            user_id
+            FROM
+            blade_user_dept
+            WHERE
+            dept_id IN
+            <foreach collection="deptIdList" index="index" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            )
+        </if>
     </select>
 
     <!--按条件查询用户信息-->
@@ -83,6 +108,10 @@
         where is_deleted = 0
         <if test="user.roleId!=null and user.roleId!=''">
             and role_id like concat('%',#{user.roleId},'%')
+        </if>
+
+        <if test="user.deptId!=null and user.deptId!=''">
+            and dept_id like concat('%',#{user.deptId},'%')
         </if>
     </select>
 
@@ -104,7 +133,7 @@
     <!--根据手机号查询对应账号和手机号的用户信息-->
     <select id="getUserListByPhoneOrAccount" resultType="org.springblade.modules.system.entity.User">
         SELECT * FROM blade_user where is_deleted = 0
-        and (account = #{phoneNumber} or phone = #{phoneNumber})
+        and account = #{phoneNumber}
     </select>
 
     <!--用户详情map-->
@@ -127,8 +156,21 @@
         left join blade_user_dept bud on bud.user_id = bu.id
         left join blade_dept bd on bud.dept_id = bd.id and bd.is_deleted = 0
         left join blade_region br on br.code = bd.region_code
-        where bu.is_deleted = 0
+        where bu.is_deleted = 0 and bd.dept_nature = 2
         and bu.id = #{userId}
+        union all
+        (
+        SELECT
+        bu.*,
+        bd.id as cid,bd.parent_id,bd.ancestors,bd.dept_category,bd.dept_name,bd.full_name,bd.sort,bd.region_code,
+        br.level as region_level
+        FROM blade_user bu
+        left join blade_user_dept bud on bud.user_id = bu.id
+        left join blade_dept bd on bud.dept_id = bd.id and bd.is_deleted = 0
+        left join v_police_region br on br.id = bd.region_code
+        where bu.is_deleted = 0 and bd.dept_nature = 1
+        and bu.id = #{userId}
+        )
     </select>
 
 
@@ -229,32 +271,48 @@
             )
 
     </select>
-    <select id="getUserInfoByDistrictIds" resultType="org.springblade.modules.system.entity.User">
 
-        SELECT
-        bu.id,
-        bu.tenant_id,
-        bu.code,
-        bu.user_type,
-        bu.account,
-        bu.name,
-        bu.real_name,
-        bu.avatar,
-        bu.email,
-        bu.phone,
-        bu.birthday
-        FROM
-        blade_user bu
-        LEFT JOIN jczz_household jh ON bu.id = jh.associated_user_id
-        LEFT JOIN jczz_house jhe ON jhe.house_code = jh.house_code
-        LEFT JOIN jczz_district jd on jd.aoi_code=jhe.district_code
-        <where>
-            and jd.id  in
-            <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
+
+
+    <select id="selectUserByDept" resultMap="userResultMap">
+        select * from blade_user where is_deleted = 0
+        and id != 1123598821738675201
+        <if test="deptIdList!=null and deptIdList.size>0">
+            and id in (
+            SELECT
+            user_id
+            FROM
+            blade_user_dept
+            WHERE
+            dept_id IN
+            <foreach collection="deptIdList" index="index" item="item" open="(" separator="," close=")">
                 #{item}
             </foreach>
-            and bu.is_deleted = 0
-        </where>
+            )
+        </if>
+        ORDER BY create_time desc
+    </select>
+
+
+    <select id="getPoliceUser" resultType="org.springblade.modules.system.entity.User">
+        SELECT
+            bu.id,
+            bu.name,
+            bu.phone
+        FROM
+            blade_user bu
+        where 1 = 1
+          and  bu.lat is not null
+          and  bu.lng is not null
+          and IFNULL((
+                 ACOS(
+                 SIN(
+                 (#{latitude} * 3.1415) / 180) * SIN((bu.lat * 3.1415) / 180) +
+                 COS((#{latitude} * 3.1415) / 180) * COS((bu.lat * 3.1415) / 180) * COS((#{longitude} * 3.1415) / 180
+                 - (bu.lng * 3.1415) / 180)) * 6370.996
+                 ), 2) &lt;= 1
+          and  bu.role_id like concat('%','1727864411451359233','%')
+          and bu.is_deleted = 0 and bu.status = 2 limit 1
     </select>
 
 
diff --git a/src/main/java/org/springblade/modules/system/node/DeptUserTreeNode.java b/src/main/java/org/springblade/modules/system/node/DeptUserTreeNode.java
index 95e4d44..4cb7d83 100644
--- a/src/main/java/org/springblade/modules/system/node/DeptUserTreeNode.java
+++ b/src/main/java/org/springblade/modules/system/node/DeptUserTreeNode.java
@@ -21,4 +21,6 @@
 	 * 是人还是部门  1:部门  2:人
 	 */
 	private String isMan;
+
+	private Boolean disabled;
 }
diff --git a/src/main/java/org/springblade/modules/system/service/IDeptService.java b/src/main/java/org/springblade/modules/system/service/IDeptService.java
index 8a8aab9..d252e00 100644
--- a/src/main/java/org/springblade/modules/system/service/IDeptService.java
+++ b/src/main/java/org/springblade/modules/system/service/IDeptService.java
@@ -51,6 +51,13 @@
 	List<DeptVO> tree(String tenantId);
 
 	/**
+	 * 机构id
+	 * @param deptId
+	 * @return
+	 */
+	List<DeptVO> tree(Long deptId);
+
+	/**
 	 * 懒加载树形结构
 	 *
 	 * @param tenantId
@@ -153,4 +160,6 @@
 	 * @return
 	 */
 	Dept getDeptByDeptIds(String deptId);
+
+	Object getDeptAndUserTreeLazyTree(DeptUserTreeNode treeNode);
 }
diff --git a/src/main/java/org/springblade/modules/system/service/ILogApiService.java b/src/main/java/org/springblade/modules/system/service/ILogApiService.java
index 2bb99cd..0eb21cf 100644
--- a/src/main/java/org/springblade/modules/system/service/ILogApiService.java
+++ b/src/main/java/org/springblade/modules/system/service/ILogApiService.java
@@ -16,14 +16,27 @@
  */
 package org.springblade.modules.system.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.springblade.core.log.model.LogApi;
+import org.springblade.modules.system.entity.LogApiExt;
 
 /**
  * 服务类
  *
  * @author Chill
  */
-public interface ILogApiService extends IService<LogApi> {
+public interface ILogApiService extends IService<LogApiExt> {
 
+	/**
+	 * 查询多条(自定义分页)
+	 * @param logApi
+	 * @param logApi
+	 * @return
+	 */
+	IPage<LogApiExt> selectLogApiExtPage(IPage<LogApiExt> page, LogApiExt logApi);
+
+	/**
+	 * 删除日志
+	 */
+    void removeByTime();
 }
diff --git a/src/main/java/org/springblade/modules/system/service/ILogErrorService.java b/src/main/java/org/springblade/modules/system/service/ILogErrorService.java
index 1964a52..bd969a4 100644
--- a/src/main/java/org/springblade/modules/system/service/ILogErrorService.java
+++ b/src/main/java/org/springblade/modules/system/service/ILogErrorService.java
@@ -26,4 +26,8 @@
  */
 public interface ILogErrorService extends IService<LogError> {
 
+	/**
+	 * 删除日志
+	 */
+    void removeByTime();
 }
diff --git a/src/main/java/org/springblade/modules/system/service/ILogService.java b/src/main/java/org/springblade/modules/system/service/ILogService.java
index fc9187e..54ecce9 100644
--- a/src/main/java/org/springblade/modules/system/service/ILogService.java
+++ b/src/main/java/org/springblade/modules/system/service/ILogService.java
@@ -51,4 +51,10 @@
 	 */
 	Boolean saveErrorLog(LogError log);
 
+	/**
+	 * 清理时间范围外的日志记录信息
+	 * @param param
+	 * @return
+	 */
+    boolean removeLogs(String param);
 }
diff --git a/src/main/java/org/springblade/modules/system/service/ILogUsualService.java b/src/main/java/org/springblade/modules/system/service/ILogUsualService.java
index 457007d..8f702b8 100644
--- a/src/main/java/org/springblade/modules/system/service/ILogUsualService.java
+++ b/src/main/java/org/springblade/modules/system/service/ILogUsualService.java
@@ -26,4 +26,8 @@
  */
 public interface ILogUsualService extends IService<LogUsual> {
 
+	/**
+	 * 删除日志
+	 */
+    void removeByTime();
 }
diff --git a/src/main/java/org/springblade/modules/system/service/IMenuService.java b/src/main/java/org/springblade/modules/system/service/IMenuService.java
index a97bcdc..5cd4d76 100644
--- a/src/main/java/org/springblade/modules/system/service/IMenuService.java
+++ b/src/main/java/org/springblade/modules/system/service/IMenuService.java
@@ -59,7 +59,7 @@
 	 * @param topMenuId
 	 * @return
 	 */
-	List<MenuVO> routes(String roleId, Long topMenuId,Integer labelType,Integer menuType,String roleName);
+	List<MenuVO> routes(String roleId, Long topMenuId,Integer labelType,Integer menuType,String roleName,String houseCode);
 
 	/**
 	 * 菜单树形结构
diff --git a/src/main/java/org/springblade/modules/system/service/IRegionService.java b/src/main/java/org/springblade/modules/system/service/IRegionService.java
index d3eaf5a..8f2155e 100644
--- a/src/main/java/org/springblade/modules/system/service/IRegionService.java
+++ b/src/main/java/org/springblade/modules/system/service/IRegionService.java
@@ -116,5 +116,32 @@
 	 * @param regionCode
 	 * @return
 	 */
-	List<Region> getRegionChild(String regionCode);
+	List<Region> getRegionChild(String regionCode,String communityCode);
+
+	/**
+	 * 获取民警下级区域
+	 * @param regionCode
+	 * @return
+	 */
+	List<Region> getPoliceRegionChild(String regionCode,String communityCode);
+
+	/**
+	 * 获取综治下级区域
+	 * @param regionCode
+	 * @return
+	 */
+	List<Region> getGridRegionChild(String regionCode, String communityCode, String roleName);
+
+	/**
+	 * 查询当前文章范围对应的社区名称字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+    String getAllCommunityNameListString(String articleRange);
+
+	/**
+	 * 树列表-查询到社区的树
+	 * @return
+	 */
+	List<TreeStringNode> treeToCommunity(String isFiter);
 }
diff --git a/src/main/java/org/springblade/modules/system/service/IRoleService.java b/src/main/java/org/springblade/modules/system/service/IRoleService.java
index f754b33..1bf482f 100644
--- a/src/main/java/org/springblade/modules/system/service/IRoleService.java
+++ b/src/main/java/org/springblade/modules/system/service/IRoleService.java
@@ -124,4 +124,12 @@
 	 * @return
 	 */
     List<Role> getRoleList(RoleParam roleParam);
+
+	/**
+	 * 查询对应的角色id
+	 * @param roleId
+	 * @param type 登录类型 2:pc 3:app
+	 * @return
+	 */
+	List<String> getRoleIdStrByRoleIdAndType(String roleId,Integer type);
 }
diff --git a/src/main/java/org/springblade/modules/system/service/IUserService.java b/src/main/java/org/springblade/modules/system/service/IUserService.java
index 48fc873..95014b1 100644
--- a/src/main/java/org/springblade/modules/system/service/IUserService.java
+++ b/src/main/java/org/springblade/modules/system/service/IUserService.java
@@ -23,6 +23,7 @@
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 import org.springblade.modules.auth.enums.UserEnum;
+import org.springblade.modules.house.vo.HouseholdVO;
 import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.entity.UserInfo;
 import org.springblade.modules.system.entity.UserOauth;
@@ -117,6 +118,17 @@
 	 * @param tenantId
 	 * @param account
 	 * @param password
+	 * @param type 登录类型 2:pc 3:app
+	 * @return
+	 */
+	UserInfo userInfo(String tenantId, String account, String password, Integer type);
+
+	/**
+	 * 用户信息
+	 *
+	 * @param tenantId
+	 * @param account
+	 * @param password
 	 * @param userEnum
 	 * @return
 	 */
@@ -181,7 +193,7 @@
 	 * @param queryWrapper
 	 * @return
 	 */
-	List<UserExcel> exportUser(Wrapper<User> queryWrapper);
+	List<UserExcel> exportUser(Wrapper<User> queryWrapper, String tenantId);
 
 	/**
 	 * 注册用户
@@ -191,6 +203,13 @@
 	 * @return
 	 */
 	boolean registerGuest(User user, Long oauthId);
+
+	/**
+	 * 注册新用户
+	 * @param user
+	 * @return
+	 */
+	boolean registerUser(UserVO user );
 
 	/**
 	 * 配置用户平台
@@ -268,5 +287,12 @@
 	 */
 	void importPoliceUser(List<PoliceUserExcel> data);
 
-	List<User> getUserInfoByDistrictIds(String districtIds);
+
+	/**
+	 * 查询500M内的民警
+	 * @param longitude
+	 * @param latitude
+	 * @return
+	 */
+	List<User> getPoliceUser(String longitude, String latitude, String houseCode);
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/LogApiServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/LogApiServiceImpl.java
index d6d0fcb..6ea0da3 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/LogApiServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/LogApiServiceImpl.java
@@ -16,10 +16,11 @@
  */
 package org.springblade.modules.system.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.core.log.model.LogApi;
 import org.springblade.modules.system.mapper.LogApiMapper;
 import org.springblade.modules.system.service.ILogApiService;
+import org.springblade.modules.system.entity.LogApiExt;
 import org.springframework.stereotype.Service;
 
 /**
@@ -28,7 +29,24 @@
  * @author Chill
  */
 @Service
-public class LogApiServiceImpl extends ServiceImpl<LogApiMapper, LogApi> implements ILogApiService {
+public class LogApiServiceImpl extends ServiceImpl<LogApiMapper, LogApiExt> implements ILogApiService {
 
+	/**
+	 * 查询多条(自定义分页)
+	 * @param logApi
+	 * @param logApi
+	 * @return
+	 */
+	@Override
+	public IPage<LogApiExt> selectLogApiExtPage(IPage<LogApiExt> page, LogApiExt logApi) {
+		return page.setRecords(baseMapper.selectLogApiExtPage(page,logApi));
+	}
 
+	/**
+	 * 删除日志
+	 */
+	@Override
+	public void removeByTime() {
+		baseMapper.removeByTime();
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/LogErrorServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/LogErrorServiceImpl.java
index fa207d5..d5af965 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/LogErrorServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/LogErrorServiceImpl.java
@@ -30,4 +30,11 @@
 @Service
 public class LogErrorServiceImpl extends ServiceImpl<LogErrorMapper, LogError> implements ILogErrorService {
 
+	/**
+	 * 删除日志
+	 */
+	@Override
+	public void removeByTime() {
+		baseMapper.removeByTime();
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/LogServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/LogServiceImpl.java
index 9c363fd..40a13fd 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/LogServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/LogServiceImpl.java
@@ -4,11 +4,22 @@
 import org.springblade.core.log.model.LogApi;
 import org.springblade.core.log.model.LogError;
 import org.springblade.core.log.model.LogUsual;
+import org.springblade.core.secure.exception.SecureException;
+import org.springblade.core.tool.utils.Charsets;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.modules.system.service.ILogApiService;
 import org.springblade.modules.system.service.ILogErrorService;
 import org.springblade.modules.system.service.ILogService;
 import org.springblade.modules.system.service.ILogUsualService;
+import org.springblade.modules.system.entity.LogApiExt;
 import org.springframework.stereotype.Service;
+
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.util.Base64;
+import java.util.Objects;
 
 /**
  * Created by Blade.
@@ -17,7 +28,19 @@
  */
 @Service
 @AllArgsConstructor
-public class LogServiceImpl implements ILogService {
+public class LogServiceImpl implements ILogService, ServletRequestListener {
+
+	private HttpServletRequest request = null;
+
+	@Override
+	public void requestInitialized(ServletRequestEvent sre) {
+		request = (HttpServletRequest) sre.getServletRequest();
+	}
+
+	@Override
+	public void requestDestroyed(ServletRequestEvent sre) {
+
+	}
 
 	private final ILogUsualService usualService;
 	private final ILogApiService apiService;
@@ -30,12 +53,88 @@
 
 	@Override
 	public Boolean saveApiLog(LogApi log) {
-		return apiService.save(log);
+		LogApiExt api = new LogApiExt();
+		try {
+			String[] tokens = extractAndDecodeHeader();
+			api.setApplicationId(tokens[0]);
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		api.setTitle(log.getTitle());
+		api.setTime(log.getTime());
+		api.setTenantId(log.getTenantId());
+		api.setServiceId(log.getServiceId());
+		api.setServerIp(log.getServerIp());
+		api.setEnv(log.getEnv());
+		api.setServerHost(log.getServerHost());
+		api.setRemoteIp(log.getRemoteIp());
+		api.setRequestUri(log.getRequestUri());
+		api.setUserAgent(log.getUserAgent());
+		api.setMethod(log.getMethod());
+		api.setMethodName(log.getMethodName());
+		api.setMethodClass(log.getMethodClass());
+		api.setCreateTime(log.getCreateTime());
+		api.setCreateBy(log.getCreateBy());
+		if (log.getRequestUri().equals("/blade-auth/oauth/token")){
+			api.setType("1");
+		}else {
+			api.setType("2");
+		}
+		// 保存
+		return apiService.save(api);
 	}
+
+
 
 	@Override
 	public Boolean saveErrorLog(LogError log) {
 		return errorService.save(log);
 	}
 
+	/**
+	 * 清理时间范围外的日志记录信息
+	 * @param param
+	 * @return
+	 */
+	@Override
+	public boolean removeLogs(String param) {
+		usualService.removeByTime();
+		apiService.removeByTime();
+		errorService.removeByTime();
+		return true;
+	}
+
+	/**
+	 * 解析请求头
+	 * @return
+	 */
+	public String[] extractAndDecodeHeader() throws UnsupportedEncodingException {
+		try {
+			String header = ((HttpServletRequest) Objects.requireNonNull(request)).getHeader("Authorization");
+			header = Func.toStr(header).replace("Basic%20", "Basic ");
+			if (!header.startsWith("Basic ")) {
+				throw new SecureException("未获取到请求头[Authorization]的信息");
+			} else {
+				byte[] base64Token = header.substring(6).getBytes(Charsets.UTF_8_NAME);
+
+				byte[] decoded;
+				try {
+					decoded = Base64.getDecoder().decode(base64Token);
+				} catch (IllegalArgumentException var5) {
+					throw new RuntimeException("客户端令牌解析失败");
+				}
+
+				String token = new String(decoded, Charsets.UTF_8_NAME);
+				int index = token.indexOf(":");
+				if (index == -1) {
+					throw new RuntimeException("客户端令牌不合法");
+				} else {
+					return new String[]{token.substring(0, index), token.substring(index + 1)};
+				}
+			}
+		} catch (Throwable var6) {
+			throw var6;
+		}
+	}
+
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/LogUsualServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/LogUsualServiceImpl.java
index 7262f39..09fd317 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/LogUsualServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/LogUsualServiceImpl.java
@@ -30,4 +30,11 @@
 @Service
 public class LogUsualServiceImpl extends ServiceImpl<LogUsualMapper, LogUsual> implements ILogUsualService {
 
+	/**
+	 * 删除日志
+	 */
+	@Override
+	public void removeByTime() {
+		baseMapper.removeByTime();
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java
index 07637de..552d5b4 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/RegionServiceImpl.java
@@ -17,14 +17,13 @@
 package org.springblade.modules.system.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.util.Strings;
 import org.springblade.common.cache.SysCache;
 import org.springblade.common.node.TreeStringNode;
+import org.springblade.common.utils.AuthUtils;
 import org.springblade.common.utils.NodeTreeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -45,7 +44,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import static org.springblade.common.cache.RegionCache.*;
 
@@ -141,17 +139,27 @@
 	 */
 	@Override
 	public List<TreeStringNode> getTree(RegionParamVO region) {
-		List<String> regionChildCodesList = SysCache.getRegionChildCodesByDeptId(AuthUtil.getDeptId());
-		Integer isAdministrator = AuthUtil.isAdministrator()==true?1:2;
-		if (null!=region.getDeptNature()){
+		List<String> regionChildCodesList = SysCache.getRegionChildCodesByDeptId(AuthUtil.getDeptId(), null);
+		Integer isAdministrator = AuthUtils.isAdministratorOrAdmin(AuthUtil.getUserRole()) == true ? 1 : 2;
+		if (null != region.getDeptNature()) {
 			// 公安
-			if (region.getDeptNature()==1){
+			if (region.getDeptNature() == 1) {
 				// 查询公安对应的辖区树
 				return NodeTreeUtil.getStringNodeTree(baseMapper.getPoliceTreeList());
 			}
+			// 综治的需要查到网格
+			if (region.getDeptNature()==2){
+				region.setCityCode("361102");
+				region.setDistrictCode("361102");
+			}
+			// 综治的需要查到网格
+			if (region.getDeptNature()==3){
+				region.setDistrictCode("361102");
+			}
 		}
 		// 非公安
-		return NodeTreeUtil.getStringNodeTree(baseMapper.getTreeList(region,regionChildCodesList,isAdministrator));
+		Map<String, TreeStringNode> treeList = baseMapper.getTreeList(region, regionChildCodesList, isAdministrator);
+		return NodeTreeUtil.getStringNodeTree(treeList);
 	}
 
 	/**
@@ -163,7 +171,7 @@
 	@Override
 	public List<TreeStringNode> getTownTree(String code) {
 		String regionCode = null;
-		if (!AuthUtil.isAdministrator() && !AuthUtil.isAdmin()){
+		if (!AuthUtil.isAdministrator() && !AuthUtil.isAdmin()) {
 			Dept dept = deptService.getById(AuthUtil.getDeptId());
 			if (null != dept) {
 				regionCode = dept.getRegionCode();
@@ -195,21 +203,21 @@
 		// 遍历处理
 		for (Region region : regionList) {
 			// 设置code
-			region.setCode(StringUtils.rightPad(region.getCode(),12,"0"));
+			region.setCode(StringUtils.rightPad(region.getCode(), 12, "0"));
 			// 设置parent_code
-			region.setParentCode(StringUtils.rightPad(region.getParentCode(),12,"0"));
+			region.setParentCode(StringUtils.rightPad(region.getParentCode(), 12, "0"));
 			// 设置Ancestors
 			setAncestors(region);
 			// 设置ProvinceCode
-			region.setProvinceCode(StringUtils.rightPad(region.getProvinceCode(),12,"0"));
+			region.setProvinceCode(StringUtils.rightPad(region.getProvinceCode(), 12, "0"));
 			// 设置CityCode
-			region.setCityCode(StringUtils.rightPad(region.getCityCode(),12,"0"));
+			region.setCityCode(StringUtils.rightPad(region.getCityCode(), 12, "0"));
 			// 设置DistrictCode
-			region.setDistrictCode(StringUtils.rightPad(region.getDistrictCode(),12,"0"));
+			region.setDistrictCode(StringUtils.rightPad(region.getDistrictCode(), 12, "0"));
 			// 设置TownCode
-			region.setTownCode(StringUtils.rightPad(region.getTownCode(),12,"0"));
+			region.setTownCode(StringUtils.rightPad(region.getTownCode(), 12, "0"));
 			// 设置VillageCode
-			region.setVillageCode(StringUtils.rightPad(region.getVillageCode(),12,"0"));
+			region.setVillageCode(StringUtils.rightPad(region.getVillageCode(), 12, "0"));
 			// 更新
 			updateById(region);
 		}
@@ -217,55 +225,143 @@
 
 	/**
 	 * Ancestors 字段处理
+	 *
 	 * @param region
 	 */
 	private void setAncestors(Region region) {
 		String[] split = region.getAncestors().split(",");
 		List<String> list = new ArrayList<>();
 		for (String s : split) {
-			list.add(StringUtils.rightPad(s,12,"0"));
+			list.add(StringUtils.rightPad(s, 12, "0"));
 		}
 		region.setAncestors(Strings.join(list, ','));
 	}
 
 	/**
 	 * 查询下级区域(拼接网格)
+	 *
 	 * @param regionCode
 	 * @return
 	 */
 	@Override
-	public List<Region> getRegionChild(String regionCode) {
+	public List<Region> getRegionChild(String regionCode, String communityCode) {
 		// 创建区域对象
 		List<Region> list = new ArrayList<>();
 		// 查询公安相关的区域数据
-		List<Region> regionList = baseMapper.getPoliceList();
-		if (regionList.size()>0) {
-			List<Region> policeList = treeRegionList(regionList,regionCode, list);
+		List<Region> regionList = baseMapper.getPoliceList(communityCode);
+		if (regionList.size() > 0) {
+			List<Region> policeList = treeRegionList(regionList, regionCode, list);
 			list.addAll(policeList);
 		}
 		// 查询综治区域集合
-		List<Region> regionChildList = baseMapper.getRegionChildList(regionCode);
+		List<Region> regionChildList = baseMapper.getRegionChildList(regionCode, null, null);
 		list.addAll(regionChildList);
 		//  返回
 		return list;
 	}
 
 	/**
+	 * 获取民警下级区域
+	 *
+	 * @param regionCode
+	 * @return
+	 */
+	@Override
+	public List<Region> getPoliceRegionChild(String regionCode, String communityCode) {
+		// 创建区域对象
+		List<Region> list = new ArrayList<>();
+		// 查询公安相关的区域数据
+		List<Region> regionList = baseMapper.getPoliceList(communityCode);
+		if (regionList.size() > 0) {
+			List<Region> policeList = treeRegionList(regionList, regionCode, list);
+			list.addAll(policeList);
+		}
+		//  返回
+		return list;
+	}
+
+	/**
+	 * 获取综治下级区域
+	 *
+	 * @param regionCode
+	 * @return
+	 */
+	@Override
+	public List<Region> getGridRegionChild(String regionCode, String communityCode, String roleName) {
+		// 创建区域对象
+		List<Region> list = new ArrayList<>();
+		if (!Strings.isBlank(roleName) && roleName.equals("wgy")) {
+			// 查询综治区域集合
+			List<Region> regionChildList = baseMapper.getGridRegionChildList(regionCode);
+			list.addAll(regionChildList);
+		}else if (!Strings.isBlank(roleName) && roleName.equals("mj")){
+			// 查询公安相关的区域数据
+			List<Region> regionList = baseMapper.getPoliceList(communityCode);
+			if (regionList.size()>0) {
+				List<Region> policeList = treeRegionList(regionList,regionCode, list);
+				list.addAll(policeList);
+			}
+		} else {
+			// 查询综治区域集合
+			List<Region> regionChildList = baseMapper.getRegionChildList(regionCode, communityCode, roleName);
+			list.addAll(regionChildList);
+		}
+		//  返回
+		return list;
+	}
+
+	/**
 	 * 获取某个父节点下面的所有子节点
+	 *
 	 * @param regionList
 	 * @param parentCode
 	 * @param list
 	 * @return
 	 */
-	public static List<Region> treeRegionList( List<Region> regionList, String parentCode,List<Region> list){
-		for(Region region: regionList){
+	public static List<Region> treeRegionList(List<Region> regionList, String parentCode, List<Region> list) {
+		for (Region region : regionList) {
 			//遍历出父id等于参数的id,add进子节点集合
-			if(region.getParentCode().equals(parentCode)){
+			if (region.getParentCode().equals(parentCode)) {
 				list.add(region);
 				//递归遍历下一级
-				treeRegionList(regionList,region.getCode(),list);
+				treeRegionList(regionList, region.getCode(), list);
+			}
+			if(region.getCode().equals(parentCode)){
+				// 本身也加入
+				list.add(region);
 			}
 		}
 		return list;
 	}
+
+	/**
+	 * 查询当前文章范围对应的社区编号字符串集合
+	 * @param articleRange
+	 * @return
+	 */
+	@Override
+	public String getAllCommunityNameListString(String articleRange) {
+		// 分割后es搜索才有效果,不能用逗号分割
+		return String.join("\\",baseMapper.getAllCommunityNameListString(articleRange));
+	}
+
+	/**
+	 * 树列表-查询到社区的树
+	 *
+	 * @return
+	 */
+	@Override
+	public List<TreeStringNode> treeToCommunity(String isFiter) {
+		List<String> regionChildCodesList = SysCache.getRegionChildCodesByDeptId(AuthUtil.getDeptId(), null);
+		Integer isAdministrator;
+		// 判断是否是超级管理员,并且是否过滤,isfiter为空时,过滤
+		if (StringUtils.isBlank(isFiter)) {
+			isAdministrator = AuthUtils.isAdministratorOrAdmin(AuthUtil.getUserRole()) == true ? 1 : 2;
+		} else {
+			isAdministrator = 1;
+		}
+		// 查询
+		Map<String, TreeStringNode> treeList = baseMapper.treeToCommunity(regionChildCodesList, isAdministrator);
+		return NodeTreeUtil.getStringNodeTree(treeList);
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java b/src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java
index bdacb04..134392f 100644
--- a/src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java
+++ b/src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java
@@ -80,7 +80,7 @@
 		}
 		List<RoleVO> merge = ForestNodeMerger.merge(baseMapper.tree(tenantId, excludeRole));
 		List<RoleVO> copy = BeanUtil.copy(merge, RoleVO.class);
-		if (!AuthUtil.isAdministrator()) {
+		if (!AuthUtil.isAdministrator() && !AuthUtil.isAdmin()) {
 			List<RoleVO> collect = copy.stream().filter(item -> roleId.contains(item.getId().toString())).collect(Collectors.toList());
 			return collect;
 		}
@@ -256,4 +256,27 @@
 		roleParam.setRoleId(AuthUtil.getUser().getRoleId());
 		return baseMapper.getRoleList(roleParam);
 	}
+
+	/**
+	 * 查询对应的角色id
+	 * @param roleId
+	 * @param type 登录类型 2:pc 3:app
+	 * @return
+	 */
+	@Override
+	public List<String> getRoleIdStrByRoleIdAndType(String roleId,Integer type) {
+		List<Integer> list = new ArrayList<>();
+		if (type!=1){
+			list.add(1);
+			// pc
+			if (type==2){
+				list.add(2);
+			}
+			// app
+			if (type==3){
+				list.add(3);
+			}
+		}
+		return baseMapper.getRoleIdStrByRoleIdAndType(roleId,list);
+	}
 }
diff --git a/src/main/java/org/springblade/modules/system/vo/RegionParamVO.java b/src/main/java/org/springblade/modules/system/vo/RegionParamVO.java
index 9eee04c..662200c 100644
--- a/src/main/java/org/springblade/modules/system/vo/RegionParamVO.java
+++ b/src/main/java/org/springblade/modules/system/vo/RegionParamVO.java
@@ -43,6 +43,8 @@
 
 	private String regionCode;
 
+	private String districtCode;
+
 	private List<Map<String, Object>> nineTypeStatistics;
 
 	/**
diff --git a/src/main/java/org/springblade/modules/system/vo/UserVO.java b/src/main/java/org/springblade/modules/system/vo/UserVO.java
index d2485f3..0afc858 100644
--- a/src/main/java/org/springblade/modules/system/vo/UserVO.java
+++ b/src/main/java/org/springblade/modules/system/vo/UserVO.java
@@ -41,11 +41,8 @@
 	@JsonSerialize(using = ToStringSerializer.class)
 	private Long id;
 
-	/**
-	 * 密码
-	 */
-	@JsonIgnore
-	private String password;
+
+	private String password2;
 
 	/**
 	 * 租户名
diff --git a/src/main/java/org/springblade/modules/task/controller/TaskNoFraudReportingController.java b/src/main/java/org/springblade/modules/task/controller/TaskNoFraudReportingController.java
new file mode 100644
index 0000000..d165122
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/controller/TaskNoFraudReportingController.java
@@ -0,0 +1,189 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.task.dto.TaskNoFraudReportingDTO;
+import org.springblade.modules.task.dto.TaskPlaceSelfCheckDTO;
+import org.springblade.modules.task.entity.TaskPlaceSelfCheckEntity;
+import org.springblade.modules.task.excel.TaskNoExplosionExcel;
+import org.springblade.modules.task.excel.TaskPlaceSelfCheckExcel;
+import org.springblade.modules.task.service.ITaskNoFraudReportingService;
+import org.springblade.modules.task.vo.TaskPlaceSelfCheckVO;
+import org.springblade.modules.task.wrapper.TaskNoFraudReportingWrapper;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import org.springblade.modules.task.vo.TaskNoFraudReportingVO;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.List;
+
+/**
+ * 无炸上报任务表 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-taskNoFraudReporting/taskNoFraudReporting")
+@Api(value = "无炸上报任务表", tags = "无炸上报任务表接口")
+public class TaskNoFraudReportingController extends BladeController {
+
+	private final ITaskNoFraudReportingService taskNoFraudReportingService;
+
+	private final BladeLogger bladeLogger;
+
+
+	/**
+	 * 无炸上报任务表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入taskNoFraudReporting")
+	public R<TaskNoFraudReportingVO> detail(TaskNoFraudReportingEntity taskNoFraudReporting) {
+		TaskNoFraudReportingEntity detail = taskNoFraudReportingService.getOne(Condition.getQueryWrapper(taskNoFraudReporting));
+		return R.data(TaskNoFraudReportingWrapper.build().entityVO(detail));
+	}
+
+	@ApiOperation("无诈详细信息")
+	@ApiLog("无诈详细信息")
+	@GetMapping(value = "/getInfo")
+	public R<TaskNoFraudReportingVO> getInfo(TaskNoFraudReportingEntity taskNoFraudReporting){
+		bladeLogger.info("无诈表详细信息", JsonUtil.toJson(taskNoFraudReporting));
+		TaskNoFraudReportingVO taskNoFraudReportingVo = taskNoFraudReportingService.selectTaskNoFraudReportingById(taskNoFraudReporting);
+		return R.data(taskNoFraudReportingVo);
+	}
+	/**
+	 * 无炸上报任务表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入taskNoFraudReporting")
+	public R<IPage<TaskNoFraudReportingVO>> list(TaskNoFraudReportingEntity taskNoFraudReporting, Query query) {
+		IPage<TaskNoFraudReportingEntity> pages = taskNoFraudReportingService.page(Condition.getPage(query), Condition.getQueryWrapper(taskNoFraudReporting));
+		return R.data(TaskNoFraudReportingWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 无炸上报任务表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入taskNoFraudReporting")
+	public R<IPage<TaskNoFraudReportingVO>> page(TaskNoFraudReportingVO taskNoFraudReporting, Query query) {
+		IPage<TaskNoFraudReportingVO> pages = taskNoFraudReportingService.selectTaskNoFraudReportingPage(Condition.getPage(query), taskNoFraudReporting);
+		return R.data(pages);
+	}
+
+	/**
+	 * 无炸上报任务表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入taskNoFraudReporting")
+	public R save(@Valid @RequestBody TaskNoFraudReportingEntity taskNoFraudReporting) {
+		return R.status(taskNoFraudReportingService.save(taskNoFraudReporting));
+	}
+
+	/**
+	 *  新增
+	 */
+	@PostMapping("/saveTwo")
+	@ApiLog(" 新增")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "无诈自定义新增", notes = "传入taskPlaceSelfCheck")
+	public R saveTwo(@Valid @RequestBody TaskNoFraudReportingVO taskNoFraudReporting) throws Exception {
+		bladeLogger.info("无诈 新增", JsonUtil.toJson(taskNoFraudReporting));
+		return R.status(taskNoFraudReportingService.saveNoFraudReporting(taskNoFraudReporting));
+	}
+
+	/**
+	 * 无炸上报任务表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入taskNoFraudReporting")
+	public R update(@Valid @RequestBody TaskNoFraudReportingEntity taskNoFraudReporting) {
+		return R.status(taskNoFraudReportingService.updateById(taskNoFraudReporting));
+	}
+
+	/**
+	 * 无炸上报任务表 修改
+	 */
+	@PostMapping("/updateTwo")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入taskNoFraudReporting")
+	public R updateTwo(@Valid @RequestBody TaskNoFraudReportingVO taskNoFraudReporting) {
+		return R.status(taskNoFraudReportingService.updateTaskNoFraudReporting(taskNoFraudReporting));
+	}
+
+	/**
+	 * 无炸上报任务表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入taskNoFraudReporting")
+	public R submit(@Valid @RequestBody TaskNoFraudReportingEntity taskNoFraudReporting) {
+		return R.status(taskNoFraudReportingService.saveOrUpdate(taskNoFraudReporting));
+	}
+
+	/**
+	 * 无炸上报任务表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(taskNoFraudReportingService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 无诈导出
+	 * @param taskNoFraudReportingVO
+	 */
+	@GetMapping("export-taskNoFraudReporting")
+	@ApiLog("无诈导出")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "无诈导出", notes = "")
+	public void exportTaskPlaceSelfCheck(TaskNoFraudReportingVO taskNoFraudReportingVO, HttpServletResponse response) {
+		bladeLogger.info("无诈导出", JsonUtil.toJson(taskNoFraudReportingVO));
+		List<TaskNoExplosionExcel> list = taskNoFraudReportingService.exportTaskNoFraudReporting(taskNoFraudReportingVO);
+		ExcelUtil.export(response, "无诈导出" + DateUtil.time(), "记录表", list, TaskNoExplosionExcel.class);
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/task/controller/TaskResidencePermitApplyController.java b/src/main/java/org/springblade/modules/task/controller/TaskResidencePermitApplyController.java
new file mode 100644
index 0000000..56684aa
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/controller/TaskResidencePermitApplyController.java
@@ -0,0 +1,159 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+
+import javax.validation.Valid;
+
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.vo.TaskResidencePermitApplyVO;
+import org.springblade.modules.task.wrapper.TaskResidencePermitApplyWrapper;
+import org.springblade.modules.task.service.ITaskResidencePermitApplyService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.Date;
+
+/**
+ * 居住证申请 控制器
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-taskResidencePermitApply/taskResidencePermitApply")
+@Api(value = "居住证申请", tags = "居住证申请接口")
+public class TaskResidencePermitApplyController extends BladeController {
+
+	private final ITaskResidencePermitApplyService taskResidencePermitApplyService;
+	private final BladeLogger bladeLogger;
+
+	/**
+	 * 居住证申请 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiLog("居住证申请 详情")
+	@ApiOperation(value = "详情", notes = "传入taskResidencePermitApply")
+	public R<TaskResidencePermitApplyVO> detail(TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		bladeLogger.info("居住证申请 详情", JsonUtil.toJson(taskResidencePermitApply));
+		TaskResidencePermitApplyEntity detail = taskResidencePermitApplyService.getOne(Condition.getQueryWrapper(taskResidencePermitApply));
+		return R.data(TaskResidencePermitApplyWrapper.build().entityVO(detail));
+	}
+
+	/**
+	 * 居住证申请 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入taskResidencePermitApply")
+	public R<IPage<TaskResidencePermitApplyVO>> list(TaskResidencePermitApplyEntity taskResidencePermitApply, Query query) {
+		// 查询自己的记录
+		taskResidencePermitApply.setCreateUser(AuthUtil.getUserId());
+		IPage<TaskResidencePermitApplyEntity> pages = taskResidencePermitApplyService.page(Condition.getPage(query), Condition.getQueryWrapper(taskResidencePermitApply).orderByDesc("create_time"));
+		return R.data(TaskResidencePermitApplyWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 居住证申请 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiLog("居住证申请 自定义分页")
+	@ApiOperation(value = "分页", notes = "传入taskResidencePermitApply")
+	public R<IPage<TaskResidencePermitApplyVO>> page(TaskResidencePermitApplyVO taskResidencePermitApply, Query query) {
+		bladeLogger.info("居住证申请 自定义分页", JsonUtil.toJson(taskResidencePermitApply));
+		IPage<TaskResidencePermitApplyVO> pages = taskResidencePermitApplyService.selectTaskResidencePermitApplyPage(Condition.getPage(query), taskResidencePermitApply);
+		return R.data(pages);
+	}
+
+	/**
+	 * 居住证申请 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiLog("居住证申请 新增")
+	@ApiOperation(value = "新增", notes = "传入taskResidencePermitApply")
+	public R save(@Valid @RequestBody TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		bladeLogger.info("居住证申请 新增", JsonUtil.toJson(taskResidencePermitApply));
+		return R.status(taskResidencePermitApplyService.saveResidencePermitApplyEntity(taskResidencePermitApply));
+	}
+
+	/**
+	 * 居住证申请 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiLog("居住证申请 修改")
+	@ApiOperation(value = "修改", notes = "传入taskResidencePermitApply")
+	public R update(@Valid @RequestBody TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		bladeLogger.info("居住证申请 修改", JsonUtil.toJson(taskResidencePermitApply));
+		return R.status(taskResidencePermitApplyService.updateById(taskResidencePermitApply));
+	}
+	/**
+	 * 居住证申请 审核
+	 */
+	@PostMapping("/auditing")
+	@ApiOperationSupport(order = 5)
+	@ApiLog("居住证申请 审核")
+	@ApiOperation(value = "审核", notes = "传入taskResidencePermitApply")
+	public R updateResidencePermitApply(@Valid @RequestBody TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		bladeLogger.info("居住证申请 审核", JsonUtil.toJson(taskResidencePermitApply));
+		return R.status(taskResidencePermitApplyService.updateResidencePermitApplyEntity(taskResidencePermitApply));
+	}
+
+	/**
+	 * 居住证申请 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiLog("居住证申请 新增或修改")
+	@ApiOperation(value = "新增或修改", notes = "传入taskResidencePermitApply")
+	public R submit(@Valid @RequestBody TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		bladeLogger.info("居住证申请 新增或修改", JsonUtil.toJson(taskResidencePermitApply));
+		return R.status(taskResidencePermitApplyService.saveOrUpdate(taskResidencePermitApply));
+	}
+
+	/**
+	 * 居住证申请 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiLog("居住证申请 详情")
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		bladeLogger.info("居住证申请 删除", JsonUtil.toJson(ids));
+		return R.status(taskResidencePermitApplyService.removeTaskResidencePermitApplyBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/task/controller/TaskSchoolEvenController.java b/src/main/java/org/springblade/modules/task/controller/TaskSchoolEvenController.java
new file mode 100644
index 0000000..210524c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/controller/TaskSchoolEvenController.java
@@ -0,0 +1,144 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.log.logger.BladeLogger;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.service.ITaskSchoolEvenService;
+import org.springblade.modules.task.vo.TaskSchoolEvenVO;
+import org.springblade.modules.task.wrapper.TaskSchoolEvenWrapper;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 校园事件 控制器
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-taskSchoolEven/taskSchoolEven")
+@Api(value = "校园事件", tags = "校园事件接口")
+public class TaskSchoolEvenController extends BladeController {
+
+	private final BladeLogger bladeLogger;
+	private final ITaskSchoolEvenService taskSchoolEvenService;
+
+	/**
+	 * 校园事件 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入taskSchoolEven")
+	public R<TaskSchoolEvenVO> detail(TaskSchoolEvenVO taskSchoolEven) {
+		TaskSchoolEvenVO detail = taskSchoolEvenService.selectTaskSchoolEvenDetail(taskSchoolEven);
+		return R.data(detail);
+	}
+	/**
+	 * 校园事件 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入taskSchoolEven")
+	public R<IPage<TaskSchoolEvenVO>> list(TaskSchoolEvenEntity taskSchoolEven, Query query) {
+		IPage<TaskSchoolEvenEntity> pages = taskSchoolEvenService.page(Condition.getPage(query), Condition.getQueryWrapper(taskSchoolEven));
+		return R.data(TaskSchoolEvenWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 校园事件 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入taskSchoolEven")
+	public R<IPage<TaskSchoolEvenVO>> page(TaskSchoolEvenVO taskSchoolEven, Query query) {
+		IPage<TaskSchoolEvenVO> pages = taskSchoolEvenService.selectTaskSchoolEvenPage(Condition.getPage(query), taskSchoolEven);
+		return R.data(pages);
+	}
+
+	/**
+	 * 校园事件 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入taskSchoolEven")
+	public R save(@Valid @RequestBody TaskSchoolEvenEntity taskSchoolEven) {
+		taskSchoolEven.setCreateUser(AuthUtil.getUserId());
+		return R.status(taskSchoolEvenService.save(taskSchoolEven));
+	}
+
+	/**
+	 * 校园事件 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入taskSchoolEven")
+	public R update(@Valid @RequestBody TaskSchoolEvenEntity taskSchoolEven) {
+		return R.status(taskSchoolEvenService.updateById(taskSchoolEven));
+	}
+
+	/**
+	 * 校园事件 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入taskSchoolEven")
+	public R submit(@Valid @RequestBody TaskSchoolEvenEntity taskSchoolEven) {
+		return R.status(taskSchoolEvenService.saveOrUpdate(taskSchoolEven));
+	}
+
+	/**
+	 * 校园事件 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(taskSchoolEvenService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 校园事件 审核
+	 */
+	@PostMapping("/auditing")
+	@ApiOperationSupport(order = 5)
+	@ApiLog("校园事件 审核")
+	@ApiOperation(value = "审核", notes = "传入taskResidencePermitApply")
+	public R updateSchoolEven(@Valid @RequestBody TaskSchoolEvenVO taskSchoolEvenVO) {
+		bladeLogger.info("校园事件 审核", JsonUtil.toJson(taskSchoolEvenVO));
+		return R.status(taskSchoolEvenService.updateSchoolEven(taskSchoolEvenVO));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/task/dto/TaskNoFraudReportingDTO.java b/src/main/java/org/springblade/modules/task/dto/TaskNoFraudReportingDTO.java
new file mode 100644
index 0000000..c55117f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/dto/TaskNoFraudReportingDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.dto;
+
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 无炸上报任务表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskNoFraudReportingDTO extends TaskNoFraudReportingEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/task/dto/TaskResidencePermitApplyDTO.java b/src/main/java/org/springblade/modules/task/dto/TaskResidencePermitApplyDTO.java
new file mode 100644
index 0000000..81d4b28
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/dto/TaskResidencePermitApplyDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.dto;
+
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 居住证申请 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskResidencePermitApplyDTO extends TaskResidencePermitApplyEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/task/dto/TaskSchoolEvenDTO.java b/src/main/java/org/springblade/modules/task/dto/TaskSchoolEvenDTO.java
new file mode 100644
index 0000000..a26449d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/dto/TaskSchoolEvenDTO.java
@@ -0,0 +1,130 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 校园事件 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskSchoolEvenDTO extends TaskSchoolEvenEntity {
+	private static final long serialVersionUID = 1L;
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 图片 */
+	@ApiModelProperty(value = "图片", example = "")
+	@TableField("images")
+	private String images;
+
+	/** 描述 */
+	@ApiModelProperty(value = "描述", example = "")
+	@TableField("describe")
+	private String describe;
+
+	/** 隐患类型 */
+	@ApiModelProperty(value = "隐患类型", example = "")
+	@TableField("hidden_danger_type")
+	private String hiddenDangerType;
+
+	/** 类型 1:隐患 2:矛盾 */
+	@ApiModelProperty(value = "类型 1:隐患 2:矛盾", example = "")
+	@TableField("type")
+	private String type;
+
+	/** 是否问题 1:是 2:否 */
+	@ApiModelProperty(value = "是否问题 1:是 2:否", example = "")
+	@TableField("is_problem")
+	private String isProblem;
+
+	/** 是否处理 1:是 2:否 */
+	@ApiModelProperty(value = "是否处理 1:是 2:否", example = "")
+	@TableField("is_handle")
+	private String isHandle;
+
+	/** 是否上报 1:是 2:否 */
+	@ApiModelProperty(value = "是否上报 1:是 2:否", example = "")
+	@TableField("is_reporting")
+	private String isReporting;
+
+	/** 工作照片 */
+	@ApiModelProperty(value = "工作照片", example = "")
+	@TableField("work_image")
+	private String workImage;
+
+	/** 确认标记 1:待审核  2:审核通过  3:审核不通过  */
+	@ApiModelProperty(value = "确认标记 1:待审核  2:审核通过  3:审核不通过 ", example = "")
+	@TableField("confirm_flag")
+	private String confirmFlag;
+
+	/** 确认时间 */
+	@ApiModelProperty(value = "确认时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("confirm_time")
+	private Date confirmTime;
+
+	/** 确认用户ID */
+	@ApiModelProperty(value = "确认用户ID", example = "")
+	@TableField("confirm_user_id")
+	private Long confirmUserId;
+
+	/** 确认用户ID */
+	@ApiModelProperty(value = "确认用户ID", example = "")
+	@TableField("confirm_user_name")
+	private String confirmUserName;
+
+	/** 确认意见 */
+	@ApiModelProperty(value = "确认意见", example = "")
+	@TableField("confirm_notion")
+	private String confirmNotion;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+}
diff --git a/src/main/java/org/springblade/modules/task/entity/TaskNoFraudReportingEntity.java b/src/main/java/org/springblade/modules/task/entity/TaskNoFraudReportingEntity.java
new file mode 100644
index 0000000..5b9e88b
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/entity/TaskNoFraudReportingEntity.java
@@ -0,0 +1,194 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 无炸上报任务表 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+@Data
+@TableName("jczz_task_no_fraud_reporting")
+@ApiModel(value = "TaskNoFraudReporting对象", description = "无炸上报任务表")
+public class TaskNoFraudReportingEntity  {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	/** 任务id */
+	@ApiModelProperty(value = "任务id", example = "")
+	@TableField("task_id")
+	private Long taskId;
+
+	/** 任务名称 */
+	@ApiModelProperty(value = "任务名称", example = "")
+	@TableField("task_name")
+	private String taskName;
+
+	/** 场所名称 */
+	@ApiModelProperty(value = "场所名称", example = "")
+	@TableField("place_name")
+	private String placeName;
+
+	/** 内容 */
+	@ApiModelProperty(value = "内容", example = "")
+	@TableField("remark")
+	private String remark;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 门牌地址编码 */
+	@ApiModelProperty(value = "门牌地址编码", example = "")
+	@TableField("house_code")
+	private String houseCode;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 图片 */
+	@ApiModelProperty(value = "图片", example = "")
+	@TableField("image_urls")
+	private String imageUrls;
+
+	/** 状态 1:待审核  2:审核通过  3:审核不通过 4: 待提交(待接收) */
+	@ApiModelProperty(value = "状态 1:待审核  2:审核通过  3:审核不通过 4: 待提交(待接收)", example = "")
+	@TableField("status")
+	private Integer status;
+
+	/** 0:否 1:是 */
+	@ApiModelProperty(value = "0:否 1:是", example = "")
+	@TableField("delete_flag")
+	private Integer deleteFlag;
+
+	/** 1:方式一 2:方式二 */
+	@ApiModelProperty(value = "1:方式一 2:方式二", example = "")
+	@TableField("type")
+	private Integer type;
+
+	/** 场所负责人姓名 */
+	@ApiModelProperty(value = "场所负责人姓名", example = "")
+	@TableField("principal")
+	private String principal;
+
+	/** 场所负责人联系方式 */
+	@ApiModelProperty(value = "场所负责人联系方式", example = "")
+	@TableField("principal_phone")
+	private String principalPhone;
+
+	/** 经度 */
+	@ApiModelProperty(value = "经度", example = "")
+	@TableField("lng")
+	private String lng;
+
+	/** 纬度 */
+	@ApiModelProperty(value = "纬度", example = "")
+	@TableField("lat")
+	private String lat;
+
+	/** 位置 */
+	@ApiModelProperty(value = "位置", example = "")
+	@TableField("location")
+	private String location;
+
+	/** 网格id */
+	@ApiModelProperty(value = "网格id", example = "")
+	@TableField("grid_id")
+	private Integer gridId;
+
+	/** 网格编号 */
+	@ApiModelProperty(value = "网格编号", example = "")
+	@TableField("grid_code")
+	private String gridCode;
+
+	/** 警务网格编号 */
+	@ApiModelProperty(value = "警务网格编号", example = "")
+	@TableField("jw_grid_code")
+	private String jwGridCode;
+
+	/** 派出所编号 */
+	@ApiModelProperty(value = "派出所编号", example = "")
+	@TableField("pcs_code")
+	private String pcsCode;
+
+	/** 派出所名称 */
+	@ApiModelProperty(value = "派出所名称", example = "")
+	@TableField("pcs_name")
+	private String pcsName;
+
+	/** 社区编号 */
+	@ApiModelProperty(value = "社区编号", example = "")
+	@TableField("community_code")
+	private String communityCode;
+
+	/** 社区名称 */
+	@ApiModelProperty(value = "社区名称", example = "")
+	@TableField("community_name")
+	private String communityName;
+
+	/** 文件地址 */
+	@ApiModelProperty(value = "文件地址", example = "")
+	@TableField("file_urls")
+	private String fileUrls;
+
+	/** pdf文件地址 */
+	@ApiModelProperty(value = "pdf文件地址", example = "")
+	@TableField("pdf_urls")
+	private String pdfUrls;
+
+	/** 无诈类型 */
+	@ApiModelProperty(value = "无诈类型", example = "")
+	@TableField("no_fraud_type")
+	private String noFraudType;
+
+	/** 无诈类型 */
+	@ApiModelProperty(value = "标准地址", example = "")
+	@TableField("address_name")
+	private String addressName;
+
+	/** 无诈类型 */
+	@ApiModelProperty(value = "二维码图片", example = "")
+	@TableField("qr_img")
+	private String qrImg;
+}
diff --git a/src/main/java/org/springblade/modules/task/entity/TaskResidencePermitApplyEntity.java b/src/main/java/org/springblade/modules/task/entity/TaskResidencePermitApplyEntity.java
new file mode 100644
index 0000000..0db6532
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/entity/TaskResidencePermitApplyEntity.java
@@ -0,0 +1,162 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 居住证申请 实体类
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+@Data
+@TableName("jczz_task_residence_permit_apply")
+@ApiModel(value = "TaskResidencePermitApply对象", description = "居住证申请")
+public class TaskResidencePermitApplyEntity  {
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 名称 */
+	@ApiModelProperty(value = "名称", example = "")
+	@TableField("name")
+	private String name;
+
+	/** 联系电话 */
+	@ApiModelProperty(value = "联系电话", example = "")
+	@TableField("phone")
+	private String phone;
+
+	/** 身份证 */
+	@ApiModelProperty(value = "身份证", example = "")
+	@TableField("id_card")
+	private String idCard;
+
+	/** 地址 */
+	@ApiModelProperty(value = "地址", example = "")
+	@TableField("address")
+	private String address;
+
+	/** 房屋编码 */
+	@ApiModelProperty(value = "房屋编码", example = "")
+	@TableField("house_code")
+	private String houseCode;
+
+	/** 任务id */
+	@ApiModelProperty(value = "任务id", example = "")
+	@TableField("task_id")
+	private Long taskId;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 出租屋id */
+	@ApiModelProperty(value = "出租屋id", example = "")
+	@TableField("house_rental_id")
+	private Long houseRentalId;
+
+	/** 0:否 1:是 */
+	@ApiModelProperty(value = "0:否 1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+
+	/** 申请事由 */
+	@ApiModelProperty(value = "申请事由", example = "")
+	@TableField("remak")
+	private String remak;
+
+	/** 网格编码 */
+	@ApiModelProperty(value = "网格编码", example = "")
+	@TableField("grid_code")
+	private String gridCode;
+
+	/** 更新人 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField("update_user")
+	private Long updateUser;
+
+	/** 确认人 */
+	@ApiModelProperty(value = "确认人", example = "")
+	@TableField("confirm_user_id")
+	private Long confirmUserId;
+
+	/** 确认时间 */
+	@ApiModelProperty(value = "确认时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("confirm_time")
+	private Date confirmTime;
+
+	/** 状态 1:待审核  2:审核通过  3:审核不通过 4: 待提交(待接收) */
+	@ApiModelProperty(value = "状态 1:待审核  2:审核通过  3:审核不通过 4: 待提交(待接收)", example = "")
+	@TableField("confirm_flag")
+	private Integer confirmFlag;
+
+	/** 确认意见 */
+	@ApiModelProperty(value = "确认意见", example = "")
+	@TableField("confirm_notion")
+	private String confirmNotion;
+
+	/**
+	 * 警务网格编号
+	 */
+	@ApiModelProperty(value = "警务网格编号")
+	@TableField("jw_grid_code")
+	private String jwGridCode;
+
+
+	/** 房东名称 */
+	@ApiModelProperty(value = "房东名称", example = "")
+	@TableField("landlord_name")
+	private String landlordName;
+
+	/** 房东电话 */
+	@ApiModelProperty(value = "房东电话", example = "")
+	@TableField("landlord_phone")
+	private String landlordPhone;
+
+	/** 1:否  2:是 */
+	@ApiModelProperty(value = "1:否  2:是", example = "")
+	@TableField("send_sms_flag")
+	private Integer sendSmsFlag;
+
+}
diff --git a/src/main/java/org/springblade/modules/task/entity/TaskSchoolEvenEntity.java b/src/main/java/org/springblade/modules/task/entity/TaskSchoolEvenEntity.java
new file mode 100644
index 0000000..ecd301d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/entity/TaskSchoolEvenEntity.java
@@ -0,0 +1,137 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.util.Date;
+
+/**
+ * 校园事件 实体类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Data
+@TableName("jczz_task_school_even")
+@ApiModel(value = "TaskSchoolEven对象", description = "校园事件")
+public class TaskSchoolEvenEntity {
+
+
+
+	/** id */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_user")
+	private Long createUser;
+
+	/** 图片 */
+	@ApiModelProperty(value = "图片", example = "")
+	@TableField("images")
+	private String images;
+
+	/** 描述 */
+	@ApiModelProperty(value = "描述", example = "")
+	@TableField("remark")
+	private String remark;
+
+	/** 隐患类型 */
+	@ApiModelProperty(value = "隐患类型", example = "")
+	@TableField("hidden_danger_type")
+	private String hiddenDangerType;
+
+	/** 类型 1:隐患 2:矛盾 */
+	@ApiModelProperty(value = "类型 1:隐患 2:矛盾", example = "")
+	@TableField("type")
+	private String type;
+
+	/** 是否问题 1:是 2:否 */
+	@ApiModelProperty(value = "是否问题 1:是 2:否", example = "")
+	@TableField("is_problem")
+	private String isProblem;
+
+	/** 是否处理 1:是 2:否 */
+	@ApiModelProperty(value = "是否处理 1:是 2:否", example = "")
+	@TableField("is_handle")
+	private String isHandle;
+
+	/** 是否上报 1:是 2:否 */
+	@ApiModelProperty(value = "是否上报 1:是 2:否", example = "")
+	@TableField("is_reporting")
+	private String isReporting;
+
+	/** 工作照片 */
+	@ApiModelProperty(value = "工作照片", example = "")
+	@TableField("work_image")
+	private String workImage;
+
+	/** 确认标记 1:待审核  2:审核通过  3:审核不通过 4:待处理  */
+	@ApiModelProperty(value = "确认标记 1:待审核  2:审核通过  3:审核不通过 4:待处理 ", example = "")
+	@TableField("confirm_flag")
+	private String confirmFlag;
+
+	/** 确认时间 */
+	@ApiModelProperty(value = "确认时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("confirm_time")
+	private Date confirmTime;
+
+	/** 确认用户ID */
+	@ApiModelProperty(value = "确认用户ID", example = "")
+	@TableField("confirm_user_id")
+	private Long confirmUserId;
+
+	/** 确认用户ID */
+	@ApiModelProperty(value = "确认用户ID", example = "")
+	@TableField("confirm_user_name")
+	private String confirmUserName;
+
+	/** 确认意见 */
+	@ApiModelProperty(value = "确认意见", example = "")
+	@TableField("confirm_notion")
+	private String confirmNotion;
+	/** 地址编码 */
+	@ApiModelProperty(value = "地址编码", example = "")
+	@TableField("house_code")
+	private String houseCode;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.UPDATE)
+	private Date updateTime;
+
+	@ApiModelProperty(value = "处理描述", example = "")
+	@TableField("handle_remark")
+	private String handleRemark;
+}
diff --git a/src/main/java/org/springblade/modules/task/excel/TaskNoExplosionExcel.java b/src/main/java/org/springblade/modules/task/excel/TaskNoExplosionExcel.java
new file mode 100644
index 0000000..b71f1f3
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/excel/TaskNoExplosionExcel.java
@@ -0,0 +1,71 @@
+package org.springblade.modules.task.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.common.excel.ExcelDictConverter;
+import org.springblade.common.excel.ExcelDictItem;
+
+import java.io.Serializable;
+
+/**
+ * 消费自查检查
+ *
+ * @author zhongrj
+ * @date 2024/02/22
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class TaskNoExplosionExcel implements Serializable {
+
+	private static final long serialVersionUID = 2L;
+
+	@ExcelProperty(value = "场所名称")
+	private String placeName;
+
+	@ExcelProperty(value = "场所地址")
+	private String location;
+
+	@ExcelProperty( value = "无诈类别",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "noExplosionCategory")
+	private String noExplosionCategory;
+
+	/**
+	 * 街道名称
+	 */
+	@ExcelProperty("所属街道")
+	private String streetName;
+
+	@ExcelProperty(value = "所属社区")
+	private String communityName;
+
+	@ExcelProperty(value = "所属网格")
+	private String gridName;
+
+	//	@ExcelProperty( value = "场所隐患")
+//	private String remark;
+//	@ApiModelProperty(value = "上报数量", example = "")
+//	private Integer number;
+
+	@ExcelProperty(value = "场所负责人")
+	private String principal;
+
+	@ExcelProperty(value = "场所负责人电话")
+	private String principalPhone;
+
+
+	@ExcelProperty(value = "创建时间")
+	private String createTime;
+
+	@ExcelProperty( value = "审核状态",converter = ExcelDictConverter.class)
+	@ExcelDictItem(type = "reviewStatus")
+	private String status;
+
+
+}
+
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.java b/src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.java
new file mode 100644
index 0000000..97409a6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.java
@@ -0,0 +1,84 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.task.dto.TaskNoFraudReportingDTO;
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import org.springblade.modules.task.excel.TaskNoExplosionExcel;
+import org.springblade.modules.task.vo.TaskNoFraudReportingVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 无炸上报任务表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+public interface TaskNoFraudReportingMapper extends BaseMapper<TaskNoFraudReportingEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskNoFraudReporting
+	 * @return
+	 */
+	List<TaskNoFraudReportingVO> selectTaskNoFraudReportingPage(IPage page,
+																@Param("place") TaskNoFraudReportingVO taskNoFraudReporting,
+																@Param("isAdministrator") Integer isAdministrator,
+																@Param("regionChildCodesList") List<String> regionChildCodesList,
+																@Param("gridCodeList") List<String> gridCodeList);
+
+	/**
+	 * 统计总数
+	 * @param taskNoFraudReporting
+	 * @param isAdministrator
+	 * @param regionChildCodesList
+	 * @param gridCodeList
+	 * @return
+	 */
+	Integer selectTaskNoFraudReportingCount(@Param("place") TaskNoFraudReportingVO taskNoFraudReporting,
+																@Param("isAdministrator") Integer isAdministrator,
+																@Param("regionChildCodesList") List<String> regionChildCodesList,
+																@Param("gridCodeList") List<String> gridCodeList);
+
+
+	/**
+	 * 查询无炸上报任务表
+	 *
+	 * @param id 无炸上报任务表ID
+	 * @return 无炸上报任务表
+	 */
+	public TaskNoFraudReportingVO selectTaskNoFraudReportingById(@Param("reporting") TaskNoFraudReportingEntity taskNoFraudReporting);
+
+	/**
+	 * 查询无炸上报任务表列表
+	 *
+	 * @param taskNoFraudReportingDTO 无炸上报任务表
+	 * @return 无炸上报任务表集合
+	 */
+	public List<TaskNoFraudReportingDTO> selectTaskNoFraudReportingList(TaskNoFraudReportingDTO taskNoFraudReportingDTO);
+
+	List<TaskNoExplosionExcel> selectTaskNoFraudReporting(@Param("place") TaskNoFraudReportingVO taskNoFraudReporting,
+														  @Param("isAdministrator") Integer isAdministrator,
+														  @Param("regionChildCodesList") List<String> regionChildCodesList,
+														  @Param("gridCodeList") List<String> gridCodeList);
+}
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.xml b/src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.xml
new file mode 100644
index 0000000..8bc58c2
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskNoFraudReportingMapper.xml
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.task.mapper.TaskNoFraudReportingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="taskNoFraudReportingResultMap" type="org.springblade.modules.task.vo.TaskNoFraudReportingVO">
+        <result property="id" column="id"/>
+        <result property="taskId" column="task_id"/>
+        <result property="taskName" column="task_name"/>
+        <result property="placeName" column="place_name"/>
+        <result property="remark" column="remark"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createTime" column="create_time"/>
+        <result property="houseCode" column="house_code"/>
+        <result property="createUser" column="create_user"/>
+        <result property="imageUrls" column="image_urls"/>
+        <result property="type" column="type"/>
+        <result property="status" column="status"/>
+        <result property="deleteFlag" column="delete_flag"/>
+        <collection property="taskPlaceRecordVOList" column="id" select="selectPatrolRecordList"
+                    javaType="java.util.List" ofType="org.springblade.modules.task.vo.TaskPlaceRecordVO"
+                    autoMapping="true">
+        </collection>
+    </resultMap>
+
+
+    <select id="selectTaskNoFraudReportingPage" resultMap="taskNoFraudReportingResultMap">
+        select jtnfr.*,
+        jp.id jpid,
+        jp.place_name,
+        jp.location,
+        jg.grid_name,
+        jp.principal,
+        jp.principal_phone,
+        IFNULL(jtnfr.no_fraud_type,jp.no_explosion_category) noExplosionCategory,
+        br.town_name as streetName,
+        br.village_name as communityName,
+        jpag.pcs_name,
+        bu.`name`,
+        jpe.legal_tel,
+        jpe.legal_person from jczz_task_no_fraud_reporting jtnfr
+        LEFT JOIN jczz_place jp ON jtnfr.house_code = jp.house_code and jp.is_deleted = 0
+        LEFT JOIN jczz_grid jg ON jg.grid_code = jp.grid_code and jg.is_deleted = 0
+        LEFT JOIN blade_region br ON br.`code` = jg.community_code
+        LEFT JOIN jczz_place_ext jpe ON jpe.place_id = jp.id and jpe.is_deleted = 0
+        LEFT JOIN blade_user bu ON bu.id = jtnfr.create_user and bu.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jp.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        <where>
+            <if test="place.id != null ">and jtnfr.id = #{place.id}</if>
+            <if test="place.taskId != null ">and jtnfr.task_id = #{place.taskId}</if>
+            <if test="place.taskName != null  and place.taskName != ''">and jtnfr.task_name = #{place.taskName}</if>
+            <if test="place.placeName != null  and place.placeName != ''">and jtnfr.place_name = #{place.placeName}</if>
+            <if test="place.remark != null  and place.remark != ''">and jtnfr.remark = #{place.remark}</if>
+            <if test="place.updateTime != null ">and jtnfr.update_time = #{place.updateTime}</if>
+            <if test="place.createTime != null ">and jtnfr.create_time = #{place.createTime}</if>
+            <if test="place.houseCode != null  and place.houseCode != ''">and jtnfr.house_code = #{place.houseCode}</if>
+            <if test="place.createUser != null ">and jtnfr.create_user = #{place.createUser}</if>
+            <if test="place.imageUrls != null  and place.imageUrls != ''">and jtnfr.image_urls = #{place.imageUrls}</if>
+            <if test="place.status != null ">and jtnfr.status = #{place.status}</if>
+            <if test="place.deleteFlag != null ">and jtnfr.delete_flag = #{place.deleteFlag}</if>
+
+            <if test="place.noExplosionCategory != null ">and jp.no_explosion_category = #{place.noExplosionCategory}</if>
+
+            <if test="place.placeName != null  and place.placeName != ''">
+                and jp.place_name like concat('%', #{place.placeName},'%')
+            </if>
+
+            <if test="place.startTime != null and place.startTime != '' and place.endTime != null and place.endTime != '' ">
+                AND jtnfr.create_time BETWEEN #{place.startTime} and #{place.endTime}
+            </if>
+
+            <if test="place.principal != null  and place.principal != ''">
+                and jp.principal like concat('%', #{place.principal},'%')
+            </if>
+            <if test="place.streetName!=null and place.streetName!=''">
+                and br.town_name like concat('%', #{place.streetName},'%')
+            </if>
+
+            <if test="place.communityName!=null and place.communityName!=''">
+                and br.village_name like concat('%', #{place.communityName},'%')
+            </if>
+            <if test="place.gridName!=null and place.gridName!=''">
+                and jg.grid_name like concat('%', #{place.gridName},'%')
+            </if>
+
+            <if test="place.pcsName!=null and place.pcsName!=''">
+                and jtnfr.pcs_name like concat('%', #{place.pcsName},'%')
+            </if>
+
+            <if test="isAdministrator==2 and place.createUser == null">
+                <choose>
+                    <when test="place.roleName != null and place.roleName != ''">
+                        <if test="place.roleName=='wgy'">
+                            <choose>
+                                <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                    and jp.grid_code in
+                                    <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jp.grid_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                        <if test="place.roleName=='mj'">
+                            <choose>
+                                <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                    and (
+                                    jpag.community_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                             separator=",">
+                                        #{code}
+                                    </foreach>
+                                    or
+                                    jtnfr.community_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                             separator=",">
+                                        #{code}
+                                    </foreach>
+                                    )
+                                </when>
+                                <otherwise>
+                                    and jpag.community_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                    </when>
+                    <otherwise>
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and
+                                (
+                                jg.grid_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                or
+                                jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                )
+                            </when>
+                            <otherwise>
+
+                            </otherwise>
+                        </choose>
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        order by jtnfr.create_time desc
+    </select>
+
+    <select id="selectPatrolRecordList" parameterType="Long"
+            resultType="org.springblade.modules.task.vo.TaskPlaceRecordVO">
+        select jpr.id,
+               jpr.item_id,
+               jpr.task_place_self_check_id,
+               jpr.state,
+               jpr.remark,
+               jpr.image_urls,
+               jpr.create_user,
+               jpr.create_time,
+               jpr.is_deleted,
+               jpr.rectification_image_urls,
+               jpr.rectification_remark,
+               jpr.rectification_time,
+               jpr.pdf_path,
+               jpr.original_name,
+               jpgi.items_name
+        from jczz_task_place_record jpr
+                 LEFT JOIN jczz_patrol_group_item jpgi on jpr.item_id = jpgi.id
+        where task_place_self_check_id = #{id}
+          and jpr.type = '2'
+    </select>
+
+    <resultMap type="org.springblade.modules.task.vo.TaskNoFraudReportingVO" id="TaskNoFraudReportingDTOResult">
+        <result property="id" column="id"/>
+        <result property="taskId" column="task_id"/>
+        <result property="taskName" column="task_name"/>
+        <result property="placeName" column="place_name"/>
+        <result property="remark" column="remark"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createTime" column="create_time"/>
+        <result property="houseCode" column="house_code"/>
+        <result property="createUser" column="create_user"/>
+        <result property="imageUrls" column="image_urls"/>
+        <result property="status" column="status"/>
+        <result property="deleteFlag" column="delete_flag"/>
+
+        <collection property="taskPlaceRecordVOList" column="id" select="selectPatrolRecordList"
+                    javaType="java.util.List" ofType="org.springblade.modules.task.vo.TaskPlaceRecordVO"
+                    autoMapping="true">
+        </collection>
+    </resultMap>
+
+    <sql id="selectTaskNoFraudReporting">
+        select id,
+               task_id,
+               task_name,
+               place_name,
+               remark,
+               update_time,
+               create_time,
+               house_code,
+               create_user,
+               image_urls,
+               status,
+               delete_flag
+        from jczz_task_no_fraud_reporting
+    </sql>
+
+    <select id="selectTaskNoFraudReportingById" parameterType="long" resultMap="TaskNoFraudReportingDTOResult">
+        SELECT
+        jtnfpr.*,
+        jp.id jpid,
+        jp.place_name,
+        jp.location,
+        jg.grid_name,
+        jp.principal,
+        jp.no_explosion_category,
+        jp.principal_phone,
+        br.town_name,
+        br.village_name,
+        bu.`name`,
+        jpe.legal_tel,
+        jpe.legal_person,
+        jt.remark reasonFailure,
+        jda.address_name
+        FROM
+        jczz_task_no_fraud_reporting jtnfpr
+        LEFT JOIN jczz_task jt ON jt.id = jtnfpr.task_id
+        LEFT JOIN jczz_place jp ON jtnfpr.house_code = jp.house_code
+        LEFT JOIN jczz_grid jg ON jg.grid_code = jp.grid_code
+        LEFT JOIN blade_region br ON br.`code` = jg.community_code
+        LEFT JOIN jczz_place_ext jpe ON jpe.place_id = jp.id
+        LEFT JOIN blade_user bu ON bu.id = jtnfpr.create_user
+        LEFT JOIN jczz_doorplate_address jda ON jda.address_code = jtnfpr.house_code
+        <where>
+            <if test="reporting.id != null ">and jtnfpr.id = #{reporting.id}</if>
+            <if test="reporting.taskId != null ">and jtnfpr.task_id = #{reporting.taskId}</if>
+        </where>
+    </select>
+
+    <select id="selectTaskNoFraudReportingList" parameterType="org.springblade.modules.task.vo.TaskNoFraudReportingVO"
+            resultMap="TaskNoFraudReportingDTOResult">
+        <include refid="selectTaskNoFraudReporting"/>
+        <where>
+            <if test="id != null ">and id = #{id}</if>
+            <if test="taskId != null ">and task_id = #{taskId}</if>
+            <if test="taskName != null  and taskName != ''">and task_name = #{taskName}</if>
+            <if test="placeName != null  and placeName != ''">and place_name = #{placeName}</if>
+            <if test="remark != null  and remark != ''">and remark = #{remark}</if>
+            <if test="updateTime != null ">and update_time = #{updateTime}</if>
+            <if test="createTime != null ">and create_time = #{createTime}</if>
+            <if test="houseCode != null  and houseCode != ''">and house_code = #{houseCode}</if>
+            <if test="createUser != null ">and create_user = #{createUser}</if>
+            <if test="imageUrls != null  and imageUrls != ''">and image_urls = #{imageUrls}</if>
+            <if test="status != null ">and status = #{status}</if>
+            <if test="deleteFlag != null ">and delete_flag = #{deleteFlag}</if>
+        </where>
+    </select>
+
+    <select id="selectTaskNoFraudReporting"
+            resultType="org.springblade.modules.task.excel.TaskNoExplosionExcel">
+
+        select jtnfr.*,
+        jp.id jpid,
+        jp.place_name,
+        jp.location,
+        jg.grid_name,
+        jp.principal,
+        jp.principal_phone,
+        jp.no_explosion_category,
+        br.town_name as streetName,
+        br.village_name as communityName,
+        bu.`name`,
+        jpe.legal_tel,
+        jpe.legal_person from jczz_task_no_fraud_reporting jtnfr
+        LEFT JOIN jczz_place jp ON jtnfr.house_code = jp.house_code and jp.is_deleted = 0
+        LEFT JOIN jczz_grid jg ON jg.grid_code = jp.grid_code and jg.is_deleted = 0
+        LEFT JOIN blade_region br ON br.`code` = jg.community_code
+        LEFT JOIN jczz_place_ext jpe ON jpe.place_id = jp.id and jpe.is_deleted = 0
+        LEFT JOIN blade_user bu ON bu.id = jtnfr.create_user and bu.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jp.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        <where>
+            <if test="place.id != null ">and jtnfr.id = #{place.id}</if>
+            <if test="place.taskId != null ">and jtnfr.task_id = #{place.taskId}</if>
+            <if test="place.taskName != null  and place.taskName != ''">and jtnfr.task_name = #{place.taskName}</if>
+            <if test="place.placeName != null  and place.placeName != ''">and jtnfr.place_name = #{place.placeName}</if>
+            <if test="place.remark != null  and place.remark != ''">and jtnfr.remark = #{place.remark}</if>
+            <if test="place.updateTime != null ">and jtnfr.update_time = #{place.updateTime}</if>
+            <if test="place.createTime != null ">and jtnfr.create_time = #{place.createTime}</if>
+            <if test="place.houseCode != null  and place.houseCode != ''">and jtnfr.house_code = #{place.houseCode}</if>
+            <if test="place.createUser != null ">and jtnfr.create_user = #{createUser}</if>
+            <if test="place.imageUrls != null  and place.imageUrls != ''">and jtnfr.image_urls = #{place.imageUrls}</if>
+            <if test="place.status != null ">and jtnfr.status = #{place.status}</if>
+            <if test="place.deleteFlag != null ">and jtnfr.delete_flag = #{place.deleteFlag}</if>
+
+            <if test="place.noExplosionCategory != null ">and jp.no_explosion_category = #{place.noExplosionCategory}</if>
+
+            <if test="place.placeName != null  and place.placeName != ''">
+                and jp.place_name like concat('%', #{place.placeName},'%')
+            </if>
+            <if test="place.principal != null  and place.principal != ''">
+                and jp.principal like concat('%', #{place.principal},'%')
+            </if>
+            <if test="place.streetName!=null and place.streetName!=''">
+                and br.town_name like concat('%', #{place.streetName},'%')
+            </if>
+
+            <if test="place.communityName!=null and place.communityName!=''">
+                and br.village_name like concat('%', #{place.communityName},'%')
+            </if>
+            <if test="place.gridName!=null and place.gridName!=''">
+                and jg.grid_name like concat('%', #{place.gridName},'%')
+            </if>
+
+            <if test="isAdministrator==2">
+                <choose>
+                    <when test="place.roleName != null and place.roleName != ''">
+                        <if test="place.roleName=='wgy'">
+                            <choose>
+                                <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                    and jp.grid_code in
+                                    <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jp.grid_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                        <if test="place.roleName=='mj'">
+                            <choose>
+                                <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                    and jpag.community_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                             separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jpag.community_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                    </when>
+                    <otherwise>
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and
+                                (
+                                jg.grid_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                or
+                                jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                )
+                            </when>
+                            <otherwise>
+
+                            </otherwise>
+                        </choose>
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        order by jtnfr.create_time desc
+
+    </select>
+
+
+    <select id="selectTaskNoFraudReportingCount" resultType="java.lang.Integer">
+        select count(1) from jczz_task_no_fraud_reporting jtnfr
+        LEFT JOIN jczz_place jp ON jtnfr.house_code = jp.house_code and jp.is_deleted = 0
+        LEFT JOIN jczz_grid jg ON jg.grid_code = jp.grid_code and jg.is_deleted = 0
+        LEFT JOIN blade_region br ON br.`code` = jg.community_code
+        LEFT JOIN jczz_place_ext jpe ON jpe.place_id = jp.id and jpe.is_deleted = 0
+        LEFT JOIN blade_user bu ON bu.id = jtnfr.create_user and bu.is_deleted = 0
+        LEFT JOIN jczz_police_affairs_grid jpag on jp.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        <where>
+            <if test="place.id != null ">and jtnfr.id = #{place.id}</if>
+            <if test="place.taskId != null ">and jtnfr.task_id = #{place.taskId}</if>
+            <if test="place.taskName != null  and place.taskName != ''">and jtnfr.task_name = #{place.taskName}</if>
+            <if test="place.placeName != null  and place.placeName != ''">and jtnfr.place_name = #{place.placeName}</if>
+            <if test="place.remark != null  and place.remark != ''">and jtnfr.remark = #{place.remark}</if>
+            <if test="place.updateTime != null ">and jtnfr.update_time = #{place.updateTime}</if>
+            <if test="place.createTime != null ">and jtnfr.create_time = #{place.createTime}</if>
+            <if test="place.houseCode != null  and place.houseCode != ''">and jtnfr.house_code = #{place.houseCode}</if>
+            <if test="place.createUser != null ">and jtnfr.create_user = #{place.createUser}</if>
+            <if test="place.imageUrls != null  and place.imageUrls != ''">and jtnfr.image_urls = #{place.imageUrls}</if>
+            <if test="place.status != null ">and jtnfr.status = #{place.status}</if>
+            <if test="place.deleteFlag != null ">and jtnfr.delete_flag = #{place.deleteFlag}</if>
+
+            <if test="place.noExplosionCategory != null ">and jp.no_explosion_category = #{place.noExplosionCategory}</if>
+
+            <if test="place.placeName != null  and place.placeName != ''">
+                and jp.place_name like concat('%', #{place.placeName},'%')
+            </if>
+            <if test="place.principal != null  and place.principal != ''">
+                and jp.principal like concat('%', #{place.principal},'%')
+            </if>
+            <if test="place.streetName!=null and place.streetName!=''">
+                and br.town_name like concat('%', #{place.streetName},'%')
+            </if>
+
+            <if test="place.communityName!=null and place.communityName!=''">
+                and br.village_name like concat('%', #{place.communityName},'%')
+            </if>
+            <if test="place.gridName!=null and place.gridName!=''">
+                and jg.grid_name like concat('%', #{place.gridName},'%')
+            </if>
+
+            <if test="place.pcsName!=null and place.pcsName!=''">
+                and jtnfr.pcs_name like concat('%', #{place.pcsName},'%')
+            </if>
+
+            <if test="isAdministrator==2">
+                <choose>
+                    <when test="place.roleName != null and place.roleName != ''">
+                        <if test="place.roleName=='wgy'">
+                            <choose>
+                                <when test="gridCodeList !=null and gridCodeList.size()>0">
+                                    and jp.grid_code in
+                                    <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                        #{code}
+                                    </foreach>
+                                </when>
+                                <otherwise>
+                                    and jp.grid_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                        <if test="place.roleName=='mj'">
+                            <choose>
+                                <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                    and (
+                                    jpag.community_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                             separator=",">
+                                        #{code}
+                                    </foreach>
+                                    or
+                                    jtnfr.community_code in
+                                    <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                             separator=",">
+                                        #{code}
+                                    </foreach>
+                                    )
+                                </when>
+                                <otherwise>
+                                    and jpag.community_code in ('')
+                                </otherwise>
+                            </choose>
+                        </if>
+                    </when>
+                    <otherwise>
+                        <choose>
+                            <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                                and
+                                (
+                                jg.grid_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                or
+                                jpag.community_code in
+                                <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                    #{code}
+                                </foreach>
+                                )
+                            </when>
+                            <otherwise>
+
+                            </otherwise>
+                        </choose>
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java
new file mode 100644
index 0000000..2aa5df0
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.java
@@ -0,0 +1,53 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.vo.TaskReportForRepairsVO;
+import org.springblade.modules.task.vo.TaskResidencePermitApplyVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 居住证申请 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+public interface TaskResidencePermitApplyMapper extends BaseMapper<TaskResidencePermitApplyEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskResidencePermitApply
+	 * @return
+	 */
+	List<TaskResidencePermitApplyVO> selectTaskResidencePermitApplyPage(IPage page,
+																		@Param("residen") TaskResidencePermitApplyVO taskResidencePermitApply,
+																		@Param("regionChildCodesList") List<String> regionChildCodesList,
+																		@Param("isAdministrator") Integer isAdministrator,
+																		@Param("gridCodeList") List<String> gridCodeList);
+
+
+	Integer getCount(String neiCode, int status, Long userId,@Param("regionChildCodesList") List<String> regionChildCodesList,
+					 @Param("isAdministrator") Integer isAdministrator,
+					 @Param("gridCodeList") List<String> gridCodeList);
+}
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml
new file mode 100644
index 0000000..5a71a03
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskResidencePermitApplyMapper.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.task.mapper.TaskResidencePermitApplyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="taskResidencePermitApplyResultMap"
+               type="org.springblade.modules.task.vo.TaskResidencePermitApplyVO">
+    </resultMap>
+
+
+    <select id="selectTaskResidencePermitApplyPage" resultMap="taskResidencePermitApplyResultMap">
+        select
+        jtrpa.*,
+        br.town_name streetName,
+        case
+        when TIMESTAMPDIFF(year, substring(jtrpa.id_card, 7, 8), now()) &lt; 18 then 2
+        when TIMESTAMPDIFF(year, substring(jtrpa.id_card, 7, 8), now()) &gt;= 18 then 1
+        end as minors,
+        jg.grid_name,
+        jda.aoi_name,
+        br.village_name communityName,
+        jda.address_name as addressName
+        from jczz_task_residence_permit_apply jtrpa
+        left join jczz_doorplate_address jda on jda.address_code = jtrpa.house_code
+        LEFT JOIN jczz_house jh on jh.house_code=jtrpa.house_code
+        left join jczz_grid jg on jg.grid_code = jh.grid_code and jg.is_deleted = 0
+        left join blade_region br on br.code = jg.community_code
+        <where>
+            and jtrpa.is_deleted = 0
+            <if test="residen.minors!=null and residen.minors ==2">
+                and TIMESTAMPDIFF(year, substring(jtrpa.id_card, 7, 8), now()) &lt; 18
+            </if>
+            <if test="residen.minors!=null and residen.minors ==1">
+                and TIMESTAMPDIFF(year, substring(jtrpa.id_card, 7, 8), now()) &gt;= 18
+            </if>
+            <if test="residen.communityCode != null  and residen.communityCode != ''"> and jg.community_code = #{residen.communityCode}</if>
+
+            <if test="residen.id != null ">and jtrpa.id = #{residen.id}</if>
+            <if test="residen.name != null  and residen.name != ''">and jtrpa.name like CONCAT('%',#{residen.name},'%')</if>
+            <if test="residen.phone != null  and residen.phone != ''">and jtrpa.phone like CONCAT('%',#{residen.phone},'%')</if>
+            <if test="residen.idCard != null  and residen.idCard != ''">and jtrpa.id_card like CONCAT('%',#{residen.idCard},'%')</if>
+            <if test="residen.address != null  and residen.address != ''">and jtrpa.address like CONCAT('%',#{residen.address},'%')</if>
+            <if test="residen.houseCode != null  and residen.houseCode != ''">and jtrpa.house_code = #{residen.houseCode}</if>
+            <if test="residen.taskId != null ">and jtrpa.task_id = #{residen.taskId}</if>
+
+            <if test="residen.startTime != null and residen.startTime != '' and residen.endTime != null and residen.endTime != '' ">
+                AND jtrpa.create_time BETWEEN #{residen.startTime} and #{residen.endTime}
+            </if>
+            <if test="residen.updateTime != null ">and jtrpa.update_time = #{residen.updateTime}</if>
+            <if test="residen.createUser != null ">and jtrpa.create_user = #{residen.createUser}</if>
+            <if test="residen.houseRentalId != null ">and jtrpa.house_rental_id = #{residen.houseRentalId}</if>
+            <if test="residen.isDeleted != null ">and jtrpa.is_deleted = #{residen.isDeleted}</if>
+            <if test="residen.remak != null  and residen.remak != ''">and jtrpa.remak = #{residen.remak}</if>
+            <if test="residen.gridCode != null  and residen.gridCode != ''"> and jtrpa.grid_code = #{residen.gridCode}</if>
+            <if test="residen.updateUser != null "> and jtrpa.update_user = #{residen.updateUser}</if>
+            <if test="residen.confirmUserId != null "> and jtrpa.confirm_user_id = #{residen.confirmUserId}</if>
+            <if test="residen.confirmTime != null "> and jtrpa.confirm_time = #{residen.confirmTime}</if>
+            <if test="residen.confirmFlag != null "> and jtrpa.confirm_flag = #{residen.confirmFlag}</if>
+            <if test="residen.confirmNotion != null  and residen.confirmNotion != ''"> and jtrpa.confirm_notion = #{residen.confirmNotion}</if>
+            <if test="residen.jwGridCode != null  and residen.jwGridCode != ''"> and jtrpa.jw_grid_code = #{residen.jwGridCode}</if>
+
+            <if test="isAdministrator==2">
+                <!-- 网格员及其他 -->
+                <if test="residen.roleType ==null and residen.roleName !='inhabitant'">
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jtrpa.jw_grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                    </choose>
+
+                    <choose>
+                        <when test="gridCodeList !=null and gridCodeList.size()>0">
+                            and (
+                            jg.grid_code in
+                            <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                    </choose>
+
+                    <if test="residen.confirmUserId != null ">
+                        or jtrfr.confirm_user_id = #{residen.confirmUserId}
+                    </if>
+
+                </if>
+            </if>
+        </where>
+        order by jtrpa.create_time desc
+    </select>
+
+
+    <select id="getCount" resultType="java.lang.Integer">
+        SELECT count(1)
+        from jczz_task_residence_permit_apply jtrpa
+        left join jczz_doorplate_address jda on jda.address_code = jtrpa.house_code
+        LEFT JOIN jczz_house jh on jh.house_code=jtrpa.house_code
+        left join jczz_grid jg on jg.grid_code = jh.grid_code and jg.is_deleted = 0
+        left join blade_region br on br.code = jg.community_code
+        <where>
+            and jtrpa.is_deleted = 0
+            <if test="neiCode != null  and neiCode != ''"> and jg.community_code = #{neiCode}</if>
+            <if test="status != null  and status != ''"> and jtrpa.confirm_flag = #{status}</if>
+
+           <if test="isAdministrator==2">
+<!--                <if test="residen.roleType ==null ">-->
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and (
+                            jg.grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            or
+                            jtrpa.jw_grid_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                    </choose>
+
+                    <choose>
+                        <when test="gridCodeList !=null and gridCodeList.size()>0">
+                            and (
+                            jg.grid_code in
+                            <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                    </choose>
+<!--                </if>-->
+            </if>
+        </where>
+
+    </select>
+
+    <resultMap type="org.springblade.modules.task.dto.TaskResidencePermitApplyDTO"
+               id="TaskResidencePermitApplyDTOResult">
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="phone" column="phone"/>
+        <result property="idCard" column="id_card"/>
+        <result property="address" column="address"/>
+        <result property="houseCode" column="house_code"/>
+        <result property="taskId" column="task_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createUser" column="create_user"/>
+        <result property="houseRentalId" column="house_rental_id"/>
+        <result property="isDeleted" column="is_deleted"/>
+        <result property="remak" column="remak"/>
+        <result property="gridCode" column="grid_code"/>
+        <result property="updateUser" column="update_user"/>
+        <result property="confirmUserId" column="confirm_user_id"/>
+        <result property="confirmTime" column="confirm_time"/>
+        <result property="confirmFlag" column="confirm_flag"/>
+        <result property="confirmNotion" column="confirm_notion"/>
+        <result property="jwGridCode" column="jw_grid_code"/>
+    </resultMap>
+
+    <sql id="selectTaskResidencePermitApply">
+        select
+            id,
+            name,
+            phone,
+            id_card,
+            address,
+            house_code,
+            task_id,
+            create_time,
+            update_time,
+            create_user,
+            house_rental_id,
+            is_deleted,
+            remak,
+            grid_code,
+            update_user,
+            confirm_user_id,
+            confirm_time,
+            confirm_flag,
+            confirm_notion,
+            jw_grid_code
+        from
+            jczz_task_residence_permit_apply
+    </sql>
+
+
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.java b/src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.java
new file mode 100644
index 0000000..e879fd8
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.java
@@ -0,0 +1,67 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+import org.springblade.modules.task.vo.TaskSchoolEvenVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 校园事件 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+public interface TaskSchoolEvenMapper extends BaseMapper<TaskSchoolEvenEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskSchoolEven
+	 * @return
+	 */
+	List<TaskSchoolEvenVO> selectTaskSchoolEvenPage(IPage page, TaskSchoolEvenVO taskSchoolEven,
+													@Param("regionChildCodesList") List<String> regionChildCodesList,
+													@Param("isAdministrator") Integer isAdministrator,
+													@Param("gridCodeList") List<String> gridCodeList);
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param taskSchoolEven
+	 * @return
+	 */
+	int schoolEvenCount(TaskSchoolEvenVO taskSchoolEven,
+						@Param("regionChildCodesList") List<String> regionChildCodesList,
+						@Param("isAdministrator") Integer isAdministrator,
+						@Param("gridCodeList") List<String> gridCodeList);
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param taskSchoolEven
+	 * @return
+	 */
+	TaskSchoolEvenVO selectTaskSchoolEvenDetail(@Param("taskSchoolEven") TaskSchoolEvenVO taskSchoolEven);
+
+
+}
diff --git a/src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.xml b/src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.xml
new file mode 100644
index 0000000..d88cd62
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/mapper/TaskSchoolEvenMapper.xml
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.task.mapper.TaskSchoolEvenMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="taskSchoolEvenResultMap" type="org.springblade.modules.task.vo.TaskSchoolEvenVO">
+    </resultMap>
+
+
+    <select id="selectTaskSchoolEvenPage" resultMap="taskSchoolEvenResultMap">
+        select
+        jtse.*,
+        br.town_name streetName,
+        jg.grid_name,
+        jda.aoi_name,
+        br.village_name communityName,
+        bu.name,
+        bu.phone,
+        jp.location,
+        jp.place_name,
+        jda.address_name as addressName
+        from jczz_task_school_even jtse
+        left join jczz_doorplate_address jda on jda.address_code = jtse.house_code
+        LEFT JOIN blade_user bu ON bu.id = jtse.create_user
+        LEFT JOIN jczz_place jp on jp.house_code= jtse.house_code
+        left join jczz_grid jg on jg.grid_code = jp.grid_code and jg.is_deleted = 0
+        left join blade_region br on br.code = jg.community_code
+        LEFT JOIN jczz_police_affairs_grid jpag on jp.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        <where>
+            <if test="taskSchoolEven.id != null "> and jtse.id = #{taskSchoolEven.id}</if>
+            <if test="taskSchoolEven.createUser != null "> and jtse.create_user = #{taskSchoolEven.createUser}</if>
+            <if test="taskSchoolEven.images != null  and taskSchoolEven.images != ''"> and jtse.images = #{taskSchoolEven.images}</if>
+            <if test="taskSchoolEven.placeName != null  and taskSchoolEven.placeName != ''"> and jp.place_name like concat('%',#{taskSchoolEven.placeName},'%')</if>
+            <if test="taskSchoolEven.name != null  and taskSchoolEven.name != ''"> and bu.name like concat('%',#{taskSchoolEven.name},'%')</if>
+            <if test="taskSchoolEven.phone != null  and taskSchoolEven.phone != ''"> and bu.phone like concat('%',#{taskSchoolEven.phone},'%')</if>
+            <if test="taskSchoolEven.remark != null  and taskSchoolEven.remark != ''"> and jtse.remark like concat('%',#{taskSchoolEven.remark},'%')</if>
+            <if test="taskSchoolEven.hiddenDangerType != null  and taskSchoolEven.hiddenDangerType != ''"> and jtse.hidden_danger_type = #{taskSchoolEven.hiddenDangerType}</if>
+            <if test="taskSchoolEven.type != null  and taskSchoolEven.type != ''"> and jtse.type = #{taskSchoolEven.type}</if>
+            <if test="taskSchoolEven.isProblem != null  and taskSchoolEven.isProblem != ''"> and jtse.is_problem = #{taskSchoolEven.isProblem}</if>
+            <if test="taskSchoolEven.isHandle != null  and taskSchoolEven.isHandle != ''"> and jtse.is_handle = #{taskSchoolEven.isHandle}</if>
+            <if test="taskSchoolEven.isReporting != null  and taskSchoolEven.isReporting != ''"> and jtse.is_reporting = #{taskSchoolEven.isReporting}</if>
+            <if test="taskSchoolEven.workImage != null  and taskSchoolEven.workImage != ''"> and jtse.work_image = #{taskSchoolEven.workImage}</if>
+            <if test="taskSchoolEven.confirmFlag != null  and taskSchoolEven.confirmFlag != ''"> and jtse.confirm_flag = #{taskSchoolEven.confirmFlag}</if>
+            <if test="taskSchoolEven.confirmTime != null "> and jtse.confirm_time = #{taskSchoolEven.confirmTime}</if>
+            <if test="taskSchoolEven.confirmUserId != null "> and jtse.confirm_user_id = #{taskSchoolEven.confirmUserId}</if>
+            <if test="taskSchoolEven.confirmUserName != null  and taskSchoolEven.confirmUserName != ''"> and jtse.confirm_user_name = #{taskSchoolEven.confirmUserName}</if>
+            <if test="taskSchoolEven.confirmNotion != null  and taskSchoolEven.confirmNotion != ''"> and jtse.confirm_notion = #{taskSchoolEven.confirmNotion}</if>
+            <if test="taskSchoolEven.houseCode != null  and taskSchoolEven.houseCode != ''"> and jtse.house_code = #{taskSchoolEven.houseCode}</if>
+            <if test="taskSchoolEven.createTime != null "> and jtse.create_time = #{taskSchoolEven.createTime}</if>
+            <if test="taskSchoolEven.updateTime != null "> and jtse.update_time = #{taskSchoolEven.updateTime}</if>
+            <if test="taskSchoolEven.startTime != null and taskSchoolEven.startTime != ''">
+                and date_format(jtse.create_time,'%Y-%m-%d') &gt;= #{taskSchoolEven.startTime}
+            </if>
+            <if test="taskSchoolEven.endTime != null and taskSchoolEven.endTime != ''">
+                and date_format(jtse.create_time,'%Y-%m-%d') &lt;= #{taskSchoolEven.endTime}
+            </if>
+
+
+            <if test="isAdministrator==2">
+                <if test="taskSchoolEven.roleName=='mj'">
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and jpag.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")"
+                                     separator=",">
+                                #{code}
+                            </foreach>
+                        </when>
+                        <otherwise>
+                            and jpag.community_code in ('')
+                        </otherwise>
+                    </choose>
+                </if>
+            </if>
+        </where>
+        order by jtse.create_time desc
+    </select>
+
+    <resultMap type="org.springblade.modules.task.dto.TaskSchoolEvenDTO" id="TaskSchoolEvenDTOResult">
+        <result property="id"    column="id"    />
+        <result property="createUser"    column="create_user"    />
+        <result property="images"    column="images"    />
+        <result property="remark"    column="remark"    />
+        <result property="hiddenDangerType"    column="hidden_danger_type"    />
+        <result property="type"    column="type"    />
+        <result property="isProblem"    column="is_problem"    />
+        <result property="isHandle"    column="is_handle"    />
+        <result property="isReporting"    column="is_reporting"    />
+        <result property="workImage"    column="work_image"    />
+        <result property="confirmFlag"    column="confirm_flag"    />
+        <result property="confirmTime"    column="confirm_time"    />
+        <result property="confirmUserId"    column="confirm_user_id"    />
+        <result property="confirmUserName"    column="confirm_user_name"    />
+        <result property="confirmNotion"    column="confirm_notion"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectTaskSchoolEven">
+        select
+            id,
+            create_user,
+            images,
+            remark,
+            hidden_danger_type,
+            type,
+            is_problem,
+            is_handle,
+            is_reporting,
+            work_image,
+            confirm_flag,
+            confirm_time,
+            confirm_user_id,
+            confirm_user_name,
+            confirm_notion,
+            create_time,
+            update_time
+        from
+            jczz_task_school_even
+    </sql>
+
+    <select id="schoolEvenCount" resultType="java.lang.Integer">
+        select
+        count(1)
+        from jczz_task_school_even jtse
+        left join jczz_doorplate_address jda on jda.address_code = jtse.house_code
+        LEFT JOIN blade_user bu ON bu.id = jtse.create_user
+        LEFT JOIN jczz_place jp on jp.house_code= jtse.house_code
+        left join jczz_grid jg on jg.grid_code = jp.grid_code and jg.is_deleted = 0
+        left join blade_region br on br.code = jg.community_code
+        <where>
+            <if test="taskSchoolEven.id != null "> and jtse.id = #{taskSchoolEven.id}</if>
+            <if test="taskSchoolEven.createUser != null "> and jtse.create_user = #{taskSchoolEven.createUser}</if>
+            <if test="taskSchoolEven.images != null  and taskSchoolEven.images != ''"> and jtse.images = #{taskSchoolEven.images}</if>
+            <if test="taskSchoolEven.name != null  and taskSchoolEven.name != ''"> and bu.name like concat('%',#{taskSchoolEven.name},'%')</if>
+            <if test="taskSchoolEven.phone != null  and taskSchoolEven.phone != ''"> and bu.phone like concat('%',#{taskSchoolEven.phone},'%')</if>
+            <if test="taskSchoolEven.remark != null  and taskSchoolEven.remark != ''"> and jtse.remark like concat('%',#{taskSchoolEven.remark},'%')</if>
+            <if test="taskSchoolEven.hiddenDangerType != null  and taskSchoolEven.hiddenDangerType != ''"> and jtse.hidden_danger_type = #{taskSchoolEven.hiddenDangerType}</if>
+            <if test="taskSchoolEven.type != null  and taskSchoolEven.type != ''"> and jtse.type = #{taskSchoolEven.type}</if>
+            <if test="taskSchoolEven.isProblem != null  and taskSchoolEven.isProblem != ''"> and jtse.is_problem = #{taskSchoolEven.isProblem}</if>
+            <if test="taskSchoolEven.isHandle != null  and taskSchoolEven.isHandle != ''"> and jtse.is_handle = #{taskSchoolEven.isHandle}</if>
+            <if test="taskSchoolEven.isReporting != null  and taskSchoolEven.isReporting != ''"> and jtse.is_reporting = #{taskSchoolEven.isReporting}</if>
+            <if test="taskSchoolEven.workImage != null  and taskSchoolEven.workImage != ''"> and jtse.work_image = #{taskSchoolEven.workImage}</if>
+            <if test="taskSchoolEven.confirmFlag != null  and taskSchoolEven.confirmFlag != ''"> and jtse.confirm_flag = #{taskSchoolEven.confirmFlag}</if>
+            <if test="taskSchoolEven.confirmTime != null "> and jtse.confirm_time = #{taskSchoolEven.confirmTime}</if>
+            <if test="taskSchoolEven.confirmUserId != null "> and jtse.confirm_user_id = #{taskSchoolEven.confirmUserId}</if>
+            <if test="taskSchoolEven.confirmUserName != null  and taskSchoolEven.confirmUserName != ''"> and jtse.confirm_user_name = #{taskSchoolEven.confirmUserName}</if>
+            <if test="taskSchoolEven.confirmNotion != null  and taskSchoolEven.confirmNotion != ''"> and jtse.confirm_notion = #{taskSchoolEven.confirmNotion}</if>
+            <if test="taskSchoolEven.houseCode != null  and taskSchoolEven.houseCode != ''"> and jtse.house_code = #{taskSchoolEven.houseCode}</if>
+            <if test="taskSchoolEven.createTime != null "> and jtse.create_time = #{taskSchoolEven.createTime}</if>
+            <if test="taskSchoolEven.updateTime != null "> and jtse.update_time = #{taskSchoolEven.updateTime}</if>
+
+            <if test="isAdministrator==2">
+                <!-- 网格员及其他 -->
+                <if test="taskSchoolEven.roleType ==null and taskSchoolEven.roleName !='inhabitant' and taskSchoolEven.houseCode == null ">
+                    <choose>
+                        <when test="regionChildCodesList !=null and regionChildCodesList.size()>0">
+                            and (
+                            jg.community_code in
+                            <foreach collection="regionChildCodesList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                    </choose>
+
+                    <choose>
+                        <when test="gridCodeList !=null and gridCodeList.size()>0">
+                            and (
+                            jg.grid_code in
+                            <foreach collection="gridCodeList" item="code" open="(" close=")" separator=",">
+                                #{code}
+                            </foreach>
+                            )
+                        </when>
+                    </choose>
+
+                    <if test="taskSchoolEven.confirmUserId != null ">
+                        or jtse.confirm_user_id = #{taskSchoolEven.confirmUserId}
+                    </if>
+
+                </if>
+            </if>
+        </where>
+        order by jtse.create_time desc
+    </select>
+
+    <select id="selectTaskSchoolEvenDetail" resultMap="taskSchoolEvenResultMap">
+        select
+        jtse.*,
+        br.town_name streetName,
+        jg.grid_name,
+        jda.aoi_name,
+        br.village_name communityName,
+        bu.name,
+        bu.phone,
+        jp.location,
+        jp.place_name,
+        jda.address_name as addressName
+        from jczz_task_school_even jtse
+        left join jczz_doorplate_address jda on jda.address_code = jtse.house_code
+        LEFT JOIN blade_user bu ON bu.id = jtse.create_user
+        LEFT JOIN jczz_place jp on jp.house_code= jtse.house_code
+        left join jczz_grid jg on jg.grid_code = jp.grid_code and jg.is_deleted = 0
+        left join blade_region br on br.code = jg.community_code
+        LEFT JOIN jczz_police_affairs_grid jpag on jp.jw_grid_code= jpag.jw_grid_code and jpag.is_deleted = 0
+        <where>
+            <if test="taskSchoolEven.id != null "> and jtse.id = #{taskSchoolEven.id}</if>
+            <if test="taskSchoolEven.createUser != null "> and jtse.create_user = #{taskSchoolEven.createUser}</if>
+            <if test="taskSchoolEven.images != null  and taskSchoolEven.images != ''"> and jtse.images = #{taskSchoolEven.images}</if>
+            <if test="taskSchoolEven.name != null  and taskSchoolEven.name != ''"> and bu.name like concat('%',#{taskSchoolEven.name},'%')</if>
+            <if test="taskSchoolEven.phone != null  and taskSchoolEven.phone != ''"> and bu.phone like concat('%',#{taskSchoolEven.phone},'%')</if>
+            <if test="taskSchoolEven.remark != null  and taskSchoolEven.remark != ''"> and jtse.remark like concat('%',#{taskSchoolEven.remark},'%')</if>
+            <if test="taskSchoolEven.hiddenDangerType != null  and taskSchoolEven.hiddenDangerType != ''"> and jtse.hidden_danger_type = #{taskSchoolEven.hiddenDangerType}</if>
+            <if test="taskSchoolEven.type != null  and taskSchoolEven.type != ''"> and jtse.type = #{taskSchoolEven.type}</if>
+            <if test="taskSchoolEven.isProblem != null  and taskSchoolEven.isProblem != ''"> and jtse.is_problem = #{taskSchoolEven.isProblem}</if>
+            <if test="taskSchoolEven.isHandle != null  and taskSchoolEven.isHandle != ''"> and jtse.is_handle = #{taskSchoolEven.isHandle}</if>
+            <if test="taskSchoolEven.isReporting != null  and taskSchoolEven.isReporting != ''"> and jtse.is_reporting = #{taskSchoolEven.isReporting}</if>
+            <if test="taskSchoolEven.workImage != null  and taskSchoolEven.workImage != ''"> and jtse.work_image = #{taskSchoolEven.workImage}</if>
+            <if test="taskSchoolEven.confirmFlag != null  and taskSchoolEven.confirmFlag != ''"> and jtse.confirm_flag = #{taskSchoolEven.confirmFlag}</if>
+            <if test="taskSchoolEven.confirmTime != null "> and jtse.confirm_time = #{taskSchoolEven.confirmTime}</if>
+            <if test="taskSchoolEven.confirmUserId != null "> and jtse.confirm_user_id = #{taskSchoolEven.confirmUserId}</if>
+            <if test="taskSchoolEven.confirmUserName != null  and taskSchoolEven.confirmUserName != ''"> and jtse.confirm_user_name = #{taskSchoolEven.confirmUserName}</if>
+            <if test="taskSchoolEven.confirmNotion != null  and taskSchoolEven.confirmNotion != ''"> and jtse.confirm_notion = #{taskSchoolEven.confirmNotion}</if>
+            <if test="taskSchoolEven.houseCode != null  and taskSchoolEven.houseCode != ''"> and jtse.house_code = #{taskSchoolEven.houseCode}</if>
+            <if test="taskSchoolEven.createTime != null "> and jtse.create_time = #{taskSchoolEven.createTime}</if>
+            <if test="taskSchoolEven.updateTime != null "> and jtse.update_time = #{taskSchoolEven.updateTime}</if>
+        </where>
+        order by jtse.create_time desc
+    </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/task/service/ITaskNoFraudReportingService.java b/src/main/java/org/springblade/modules/task/service/ITaskNoFraudReportingService.java
new file mode 100644
index 0000000..730f623
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/ITaskNoFraudReportingService.java
@@ -0,0 +1,53 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import org.springblade.modules.task.excel.TaskNoExplosionExcel;
+import org.springblade.modules.task.vo.TaskNoFraudReportingVO;
+
+import java.util.List;
+
+/**
+ * 无炸上报任务表 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+public interface ITaskNoFraudReportingService extends IService<TaskNoFraudReportingEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskNoFraudReporting
+	 * @return
+	 */
+	IPage<TaskNoFraudReportingVO> selectTaskNoFraudReportingPage(IPage<TaskNoFraudReportingVO> page, TaskNoFraudReportingVO taskNoFraudReporting);
+
+	Integer selectTaskNoFraudReportingCount(TaskNoFraudReportingVO taskNoFraudReporting);
+
+	Boolean saveNoFraudReporting(TaskNoFraudReportingVO taskNoFraudReporting);
+
+	TaskNoFraudReportingVO selectTaskNoFraudReportingById(TaskNoFraudReportingEntity taskNoFraudReporting);
+
+	List<TaskNoExplosionExcel> exportTaskNoFraudReporting(TaskNoFraudReportingVO taskNoFraudReportingVO);
+
+	Boolean updateTaskNoFraudReporting(TaskNoFraudReportingVO taskNoFraudReporting);
+}
diff --git a/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java b/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java
new file mode 100644
index 0000000..0b95548
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/ITaskResidencePermitApplyService.java
@@ -0,0 +1,72 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.vo.TaskResidencePermitApplyVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 居住证申请 服务类
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+public interface ITaskResidencePermitApplyService extends IService<TaskResidencePermitApplyEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskResidencePermitApply
+	 * @return
+	 */
+	IPage<TaskResidencePermitApplyVO> selectTaskResidencePermitApplyPage(IPage<TaskResidencePermitApplyVO> page, TaskResidencePermitApplyVO taskResidencePermitApply);
+
+	/**
+	 * 新增
+	 * @param taskResidencePermitApply
+	 * @return
+	 */
+	Boolean saveResidencePermitApplyEntity(TaskResidencePermitApplyEntity taskResidencePermitApply);
+
+	/**
+	 * 统计数量
+	 * @param neiCode
+	 * @param i
+	 * @return
+	 */
+	Integer getCount(String neiCode, int status);
+
+	/**
+	 * 审核
+	 * @param taskResidencePermitApply
+	 * @return
+	 */
+	Boolean updateResidencePermitApplyEntity(TaskResidencePermitApplyEntity taskResidencePermitApply);
+
+	/**
+	 * 居住证申请 删除
+	 * @param toLongList
+	 * @return
+	 */
+	boolean removeTaskResidencePermitApplyBatchByIds(List<Long> toLongList);
+}
diff --git a/src/main/java/org/springblade/modules/task/service/ITaskSchoolEvenService.java b/src/main/java/org/springblade/modules/task/service/ITaskSchoolEvenService.java
new file mode 100644
index 0000000..b171712
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/ITaskSchoolEvenService.java
@@ -0,0 +1,63 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import liquibase.pro.packaged.I;
+import org.springblade.modules.task.vo.TaskSchoolEvenVO;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 校园事件 服务类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+public interface ITaskSchoolEvenService extends IService<TaskSchoolEvenEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param taskSchoolEven
+	 * @return
+	 */
+	IPage<TaskSchoolEvenVO> selectTaskSchoolEvenPage(IPage<TaskSchoolEvenVO> page, TaskSchoolEvenVO taskSchoolEven);
+
+	/**
+	 * 校园事件审核
+	 * @param taskSchoolEvenVO
+	 * @return
+	 */
+    boolean updateSchoolEven(TaskSchoolEvenVO taskSchoolEvenVO);
+
+	/**
+	 * 统计
+	 * @param taskSchoolEven
+	 * @return
+	 */
+	int schoolEvenCount(TaskSchoolEvenVO taskSchoolEven);
+
+	/**
+	 * 详情
+	 * @param taskSchoolEven
+	 * @return
+	 */
+	TaskSchoolEvenVO selectTaskSchoolEvenDetail(TaskSchoolEvenVO taskSchoolEven);
+}
diff --git a/src/main/java/org/springblade/modules/task/service/TaskHandle.java b/src/main/java/org/springblade/modules/task/service/TaskHandle.java
new file mode 100644
index 0000000..ec3394e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/TaskHandle.java
@@ -0,0 +1,7 @@
+package org.springblade.modules.task.service;
+
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+
+public interface TaskHandle {
+	void taskHandle(CustomTaskEntity customTask);
+}
diff --git a/src/main/java/org/springblade/modules/task/service/impl/SelfExaminationTaskHandler.java b/src/main/java/org/springblade/modules/task/service/impl/SelfExaminationTaskHandler.java
new file mode 100644
index 0000000..457278f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/impl/SelfExaminationTaskHandler.java
@@ -0,0 +1,84 @@
+package org.springblade.modules.task.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.place.service.IPlaceService;
+import org.springblade.modules.place.vo.PlaceVO;
+import org.springblade.modules.task.entity.TaskEntity;
+import org.springblade.modules.task.entity.TaskPlaceSelfCheckEntity;
+import org.springblade.modules.task.service.ITaskPlaceSelfCheckService;
+import org.springblade.modules.task.service.ITaskService;
+import org.springblade.modules.task.service.TaskHandle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * 自查任务ServiceImpl
+ */
+@Component("SelfExaminationTaskHandler")
+public class SelfExaminationTaskHandler implements TaskHandle {
+
+	private static final Logger logger = LoggerFactory.getLogger(SelfExaminationTaskHandler.class);
+	@Autowired
+	private IPlaceService placeService;
+
+	@Autowired
+	private ITaskPlaceSelfCheckService taskPlaceSelfCheckService;
+
+	@Override
+	public void taskHandle(CustomTaskEntity customTask) {
+		try {
+			Query query = new Query();
+			IPage<PlaceVO> page = Condition.getPage(query);
+			PlaceVO placeVO = new PlaceVO();
+			placeVO.setPlaceLabel(customTask.getPlaceLabel());
+			placeVO.setPlaceSmallLabel(customTask.getPlaceSmallLabel());
+			placeVO.setNineType(customTask.getNineType());
+			placeVO.setColor(customTask.getLabelColor());
+			placeVO.setTaskRange(customTask.getTaskRange());
+			IPage<PlaceVO> placePage = placeService.getPlacePage(page, placeVO);
+			ITaskService iTaskService = SpringUtils.getBean(ITaskService.class);
+			// 计算总页数
+			long pages = placePage.getPages();
+			System.out.println("总页数:" + pages);
+			for (int i = 1; i <= pages; i++) {
+				page = Condition.getPage(query);
+				page.setCurrent(i);
+				placePage = placeService.getPlacePage(page, placeVO);
+				placePage.getRecords().forEach(place -> {
+					TaskEntity taskEntity = new TaskEntity();
+					taskEntity.setType(1);
+					taskEntity.setName(customTask.getName());
+					taskEntity.setCreateTime(new Date());
+					taskEntity.setHouseCode(place.getHouseCode());
+					taskEntity.setReportType(7);
+					taskEntity.setStatus(4);
+					taskEntity.setFrequency(2);
+					// taskEntitiesList.add(taskEntity);
+					iTaskService.save(taskEntity);
+
+					TaskPlaceSelfCheckEntity taskPlaceSelfCheck = new TaskPlaceSelfCheckEntity();
+					taskPlaceSelfCheck.setTaskId(taskEntity.getId());
+					taskPlaceSelfCheck.setHouseCode(place.getHouseCode());
+					taskPlaceSelfCheck.setPlaceName(place.getPlaceName());
+					taskPlaceSelfCheck.setStatus(4);
+					taskPlaceSelfCheck.setType("1");
+					taskPlaceSelfCheckService.save(taskPlaceSelfCheck);
+					// taskPlaceSelfCheckList.add(taskPlaceSelfCheck);
+				});
+			}
+		} catch (Exception e) {
+			System.out.println("自查任务异常" + e);
+		}
+		// iTaskService.saveBatch(taskEntitiesList);
+		// boolean save = taskPlaceSelfCheckService.saveBatch(taskPlaceSelfCheckList);
+
+	}
+}
diff --git a/src/main/java/org/springblade/modules/task/service/impl/TaskNoFraudReportingServiceImpl.java b/src/main/java/org/springblade/modules/task/service/impl/TaskNoFraudReportingServiceImpl.java
new file mode 100644
index 0000000..aa7e45d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/impl/TaskNoFraudReportingServiceImpl.java
@@ -0,0 +1,222 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.constant.DictConstant;
+import org.springblade.common.exception.CustomException;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.param.GridSet;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.common.utils.WordToPdfUtils;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.modules.resource.builder.oss.OssBuilder;
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import org.springblade.modules.task.entity.TaskPlaceRecordEntity;
+import org.springblade.modules.task.excel.TaskNoExplosionExcel;
+import org.springblade.modules.task.mapper.TaskNoFraudReportingMapper;
+import org.springblade.modules.task.service.ITaskNoFraudReportingService;
+import org.springblade.modules.task.service.ITaskPlaceRecordService;
+import org.springblade.modules.task.service.ITaskService;
+import org.springblade.modules.task.vo.TaskNoFraudReportingVO;
+import org.springblade.modules.task.vo.TaskPlaceRecordVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 无炸上报任务表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+@Service
+public class TaskNoFraudReportingServiceImpl extends ServiceImpl<TaskNoFraudReportingMapper, TaskNoFraudReportingEntity> implements ITaskNoFraudReportingService {
+
+
+	private static final Logger logger = LoggerFactory.getLogger(TaskNoFraudReportingServiceImpl.class);
+
+	/**
+	 * 对象存储构建类
+	 */
+	@Autowired
+	private OssBuilder ossBuilder;
+
+	@Override
+	public IPage<TaskNoFraudReportingVO> selectTaskNoFraudReportingPage(IPage<TaskNoFraudReportingVO> page, TaskNoFraudReportingVO taskNoFraudReporting) {
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskNoFraudReportingVO.class, taskNoFraudReporting);
+		List<TaskNoFraudReportingVO> taskNoFraudReportingVOS = baseMapper.selectTaskNoFraudReportingPage(page,
+			taskNoFraudReporting,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList());
+		return page.setRecords(taskNoFraudReportingVOS);
+	}
+
+	@Override
+	public Integer selectTaskNoFraudReportingCount(TaskNoFraudReportingVO taskNoFraudReporting) {
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskNoFraudReportingVO.class, taskNoFraudReporting);
+		Integer count = baseMapper.selectTaskNoFraudReportingCount(
+			taskNoFraudReporting,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList());
+		return count;
+	}
+
+	@Override
+	public TaskNoFraudReportingVO selectTaskNoFraudReportingById(TaskNoFraudReportingEntity taskNoFraudReporting) {
+		return this.baseMapper.selectTaskNoFraudReportingById(taskNoFraudReporting);
+	}
+
+	@Override
+	public Boolean saveNoFraudReporting(TaskNoFraudReportingVO taskNoFraudReporting) {
+		taskNoFraudReporting.setCreateUser(AuthUtil.getUserId());
+		// 1.保存任务表
+		ITaskService bean2 = SpringUtils.getBean(ITaskService.class);
+		Long aLong = bean2.saveTask(CommonConstant.NUMBER_ONE, DictConstant.NO_FRAUD_REPORTING, 1,
+			"", AuthUtil.getUserId(), taskNoFraudReporting.getHouseCode(), CommonConstant.NUMBER_SIX, 1);
+		if (aLong <= 0) {
+			return false;
+		}
+		taskNoFraudReporting.setTaskId(aLong);
+		// 计算网格
+		if (StringUtils.isNotBlank(taskNoFraudReporting.getLng()) && StringUtils.isNotBlank(taskNoFraudReporting.getLat())) {
+			// 点落面计算警格,网格,警格
+			GridSet invoke = new GridSet().invoke(TaskNoFraudReportingVO.class, taskNoFraudReporting,
+				"lng", "lat", "gridCode", "jwGridCode");
+		}
+		// 2.保存任务详情
+		boolean save = save(taskNoFraudReporting);
+		if (save) {
+			// 3.保存题目记录
+			List<TaskPlaceRecordVO> taskPlaceRecordList = taskNoFraudReporting.getTaskPlaceRecordVOList();
+			ITaskPlaceRecordService bean = SpringUtil.getBean(ITaskPlaceRecordService.class);
+			taskPlaceRecordList.stream().forEach(item -> {
+				item.setTaskPlaceSelfCheckId(taskNoFraudReporting.getId());
+				item.setCreateUser(AuthUtil.getUserId());
+				item.setType("2");
+				// 判断是否有生成pdf
+				if (StringUtils.isBlank(item.getPdfPath()) && StringUtils.isNotBlank(item.getImageUrls())) {
+					// 生成pdf
+					String filePath;
+					FileInputStream file = null;
+					try {
+						// filePath = WordToPdfUtils.wordToPdf(item.getOriginalName(), item.getImageUrls());
+						// file = new FileInputStream(filePath);
+						// BladeFile bladeFile = ossBuilder.template().putFile(item.getOriginalName(), file);
+						// item.setPdfPath(bladeFile.getLink());
+					} catch (Exception e) {
+						logger.error("生成pdf失败", e);
+						// throw new RuntimeException(e);
+					} finally {
+						if (file != null) {
+							try {
+								file.close();
+							} catch (IOException e) {
+								logger.error("关闭流异常", e);
+								/* 异常处理 */
+							}
+						}
+					}
+				}
+			});
+			List<TaskPlaceRecordEntity> collect = taskPlaceRecordList.stream().collect(Collectors.toList());
+			if (collect.size() > 0) {
+				bean.saveBatch(collect);
+			}
+			updateById(taskNoFraudReporting);
+			return save;
+		}
+		return false;
+	}
+
+	@Override
+	public List<TaskNoExplosionExcel> exportTaskNoFraudReporting(TaskNoFraudReportingVO taskNoFraudReportingVO) {
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskNoFraudReportingVO.class, taskNoFraudReportingVO);
+		List<TaskNoExplosionExcel> taskNoExplosionExcels = baseMapper.selectTaskNoFraudReporting(
+			taskNoFraudReportingVO,
+			commonParamSet.getIsAdministrator(),
+			commonParamSet.getRegionChildCodesList(),
+			commonParamSet.getGridCodeList());
+		return taskNoExplosionExcels;
+	}
+
+	/**
+	 * 更新
+	 *
+	 * @param taskNoFraudReporting
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean updateTaskNoFraudReporting(TaskNoFraudReportingVO taskNoFraudReporting) {
+		// 1.更新任务表
+		ITaskService taskService = SpringUtils.getBean(ITaskService.class);
+		Long aLong = taskService.updateTask(null, null, null, taskNoFraudReporting.getReasonFailure(), AuthUtil.getUserId(), taskNoFraudReporting.getTaskId(), taskNoFraudReporting.getStatus());
+		if (aLong <= 0) {
+			return false;
+		}
+		// 2.更新任务详情
+		boolean save = updateById(taskNoFraudReporting);
+		if (save) {
+			// 3.更新或新增题目记录
+			List<TaskPlaceRecordVO> taskPlaceRecordList = taskNoFraudReporting.getTaskPlaceRecordVOList();
+			if (taskPlaceRecordList != null && taskPlaceRecordList.size() > 0) {
+				ITaskPlaceRecordService bean = SpringUtil.getBean(ITaskPlaceRecordService.class);
+				List<TaskPlaceRecordEntity> recordEntityList = BeanUtil.copy(taskPlaceRecordList, TaskPlaceRecordEntity.class);
+				for (TaskPlaceRecordEntity taskPlaceRecordEntity : recordEntityList) {
+					taskPlaceRecordEntity.setType("2");
+					// 判断是否有生成pdf
+					if (StringUtils.isBlank(taskPlaceRecordEntity.getPdfPath()) && StringUtils.isNotBlank(taskPlaceRecordEntity.getImageUrls())) {
+						// 生成pdf
+						String filePath;
+						try {
+							// filePath = WordToPdfUtils.wordToPdf(taskPlaceRecordEntity.getOriginalName(), taskPlaceRecordEntity.getImageUrls());
+							// FileInputStream file = new FileInputStream(filePath);
+							// BladeFile bladeFile = ossBuilder.template().putFile(taskPlaceRecordEntity.getOriginalName(), file);
+							// taskPlaceRecordEntity.setPdfPath(bladeFile.getLink());
+						} catch (Exception e) {
+							logger.error("生成pdf失败", e);
+							// throw new RuntimeException(e);
+						}
+					}
+				}
+				boolean result = bean.saveOrUpdateBatch(recordEntityList);
+				if (result) {
+					return result;
+				}
+				throw new CustomException("保存失败!");
+			}
+			return save;
+		}
+		throw new CustomException("保存失败!");
+	}
+}
diff --git a/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java b/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java
new file mode 100644
index 0000000..22719e6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/impl/TaskResidencePermitApplyServiceImpl.java
@@ -0,0 +1,157 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.constant.DictConstant;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.common.utils.AuthUtils;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.modules.house.entity.HouseEntity;
+import org.springblade.modules.house.service.IHouseService;
+import org.springblade.modules.place.entity.PlaceEntity;
+import org.springblade.modules.place.service.IPlaceService;
+import org.springblade.modules.task.entity.*;
+import org.springblade.modules.task.service.ITaskPlaceRecordService;
+import org.springblade.modules.task.service.ITaskService;
+import org.springblade.modules.task.vo.TaskPlaceRecordVO;
+import org.springblade.modules.task.vo.TaskReportForRepairsVO;
+import org.springblade.modules.task.vo.TaskResidencePermitApplyVO;
+import org.springblade.modules.task.mapper.TaskResidencePermitApplyMapper;
+import org.springblade.modules.task.service.ITaskResidencePermitApplyService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 居住证申请 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+@Service
+public class TaskResidencePermitApplyServiceImpl extends ServiceImpl<TaskResidencePermitApplyMapper, TaskResidencePermitApplyEntity> implements ITaskResidencePermitApplyService {
+
+	@Resource
+	@Lazy
+	private ITaskService taskService;
+
+	@Override
+	public IPage<TaskResidencePermitApplyVO> selectTaskResidencePermitApplyPage(IPage<TaskResidencePermitApplyVO> page, TaskResidencePermitApplyVO taskResidencePermitApply) {
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskResidencePermitApplyVO.class, taskResidencePermitApply);
+		if (taskResidencePermitApply.getRoleName() != null && taskResidencePermitApply.getRoleName().equals("inhabitant")) {
+			taskResidencePermitApply.setCreateUser(AuthUtil.getUserId());
+		}
+		return page.setRecords(baseMapper.selectTaskResidencePermitApplyPage(page, taskResidencePermitApply,
+			commonParamSet.getRegionChildCodesList(), commonParamSet.getIsAdministrator(), commonParamSet.getGridCodeList()));
+	}
+
+	@Override
+	public Boolean saveResidencePermitApplyEntity(TaskResidencePermitApplyEntity permitApply) {
+		permitApply.setCreateUser(AuthUtil.getUserId());
+		// 1.保存任务表
+		ITaskService taskService = SpringUtils.getBean(ITaskService.class);
+		Long aLong = taskService.saveTask(CommonConstant.NUMBER_ONE, DictConstant.RESIDENCE_PERMIT_APPLICATION, 1,
+			"", AuthUtil.getUserId(), permitApply.getHouseCode(), CommonConstant.NUMBER_TWO, 1);
+		if (aLong <= 0) {
+			return false;
+		}
+		if (StringUtils.isNotBlank(permitApply.getHouseCode())) {
+			// 设置网格编码
+			IHouseService houseService = SpringUtils.getBean(IHouseService.class);
+			HouseEntity houseEntity = houseService.getOne(Wrappers.<HouseEntity>lambdaQuery()
+				.eq(HouseEntity::getHouseCode, permitApply.getHouseCode()));
+			permitApply.setGridCode(houseEntity.getGridCode());
+			permitApply.setJwGridCode(houseEntity.getJwGridCode());
+		}
+
+		permitApply.setTaskId(aLong);
+		// 2.保存任务详情
+		boolean save = save(permitApply);
+		return save;
+	}
+
+	@Override
+	public Integer getCount(String neiCode, int status) {
+		TaskResidencePermitApplyVO taskResidencePermitApply = new TaskResidencePermitApplyVO();
+		taskResidencePermitApply.setCommunityCode(neiCode);
+		// 获取请求头中的角色别名
+		String roleName = SpringUtils.getRequestParam("roleName");
+		if (AuthUtils.isMj(roleName)) {
+			// todo 需要改造
+			CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskResidencePermitApplyVO.class, taskResidencePermitApply);
+			return baseMapper.getCount(neiCode, status, AuthUtil.getUserId(),commonParamSet.getRegionChildCodesList(), commonParamSet.getIsAdministrator(), commonParamSet.getGridCodeList());
+		}
+		return 0;
+	}
+
+	/**
+	 * 居住证申请 审核
+	 * @param taskResidencePermitApply
+	 * @return
+	 */
+	@Override
+	public Boolean updateResidencePermitApplyEntity(TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		taskResidencePermitApply.setConfirmTime(new Date());
+		taskResidencePermitApply.setConfirmUserId(AuthUtil.getUserId());
+		boolean b = updateById(taskResidencePermitApply);
+		if (b) {
+			TaskResidencePermitApplyEntity entity = getById(taskResidencePermitApply.getId());
+			// 更新任务表状态
+			TaskEntity taskEntity = new TaskEntity();
+			taskEntity.setId(entity.getTaskId());
+			taskEntity.setStatus(taskResidencePermitApply.getConfirmFlag());
+			b = taskService.updateById(taskEntity);
+			return b;
+		}
+		return b;
+	}
+
+	/**
+	 * 居住证申请 删除
+	 * @param toLongList
+	 * @return
+	 */
+	@Override
+	public boolean removeTaskResidencePermitApplyBatchByIds(List<Long> toLongList) {
+		boolean flag = false;
+		for (Long id : toLongList) {
+			// 先查询对应的任务id
+			TaskResidencePermitApplyEntity taskResidencePermitApplyEntity = getById(id);
+			// 删除居住证
+			flag = removeById(id);
+			if (flag) {
+				// 删除对应的任务
+				flag = taskService.removeById(taskResidencePermitApplyEntity.getTaskId());
+			}
+		}
+		// 返回
+		return flag;
+	}
+}
diff --git a/src/main/java/org/springblade/modules/task/service/impl/TaskSchoolEvenServiceImpl.java b/src/main/java/org/springblade/modules/task/service/impl/TaskSchoolEvenServiceImpl.java
new file mode 100644
index 0000000..46ec5b9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/impl/TaskSchoolEvenServiceImpl.java
@@ -0,0 +1,80 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.common.param.CommonParamSet;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.task.entity.TaskEntity;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.service.ITaskSchoolEvenService;
+import org.springblade.modules.task.service.ITaskService;
+import org.springblade.modules.task.vo.TaskResidencePermitApplyVO;
+import org.springblade.modules.task.vo.TaskSchoolEvenVO;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+import org.springblade.modules.task.mapper.TaskSchoolEvenMapper;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * 校园事件 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Service
+public class TaskSchoolEvenServiceImpl extends ServiceImpl<TaskSchoolEvenMapper, TaskSchoolEvenEntity> implements ITaskSchoolEvenService {
+
+
+	@Resource
+	@Lazy
+	private ITaskService taskService;
+
+	@Override
+	public IPage<TaskSchoolEvenVO> selectTaskSchoolEvenPage(IPage<TaskSchoolEvenVO> page, TaskSchoolEvenVO taskSchoolEven) {
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskSchoolEvenVO.class, taskSchoolEven);
+		if (taskSchoolEven.getRoleName() != null && (taskSchoolEven.getRoleName().equals("xyty"))) {
+			taskSchoolEven.setCreateUser(AuthUtil.getUserId());
+		}
+		return page.setRecords(baseMapper.selectTaskSchoolEvenPage(page, taskSchoolEven,
+			commonParamSet.getRegionChildCodesList(), commonParamSet.getIsAdministrator(), commonParamSet.getGridCodeList()));
+	}
+
+	@Override
+	public boolean updateSchoolEven(TaskSchoolEvenVO taskSchoolEvenVO) {
+		taskSchoolEvenVO.setConfirmTime(new Date());
+		taskSchoolEvenVO.setConfirmUserId(AuthUtil.getUserId());
+		return updateById(taskSchoolEvenVO);
+	}
+
+	@Override
+	public int schoolEvenCount(TaskSchoolEvenVO taskSchoolEven) {
+		CommonParamSet commonParamSet = new CommonParamSet().invoke(TaskSchoolEvenVO.class, taskSchoolEven);
+		return baseMapper.schoolEvenCount(taskSchoolEven,
+			commonParamSet.getRegionChildCodesList(), commonParamSet.getIsAdministrator(), commonParamSet.getGridCodeList());
+	}
+
+	@Override
+	public TaskSchoolEvenVO selectTaskSchoolEvenDetail(TaskSchoolEvenVO taskSchoolEven) {
+		return baseMapper.selectTaskSchoolEvenDetail(taskSchoolEven);
+	}
+}
diff --git a/src/main/java/org/springblade/modules/task/service/impl/VisitingTaskHandler.java b/src/main/java/org/springblade/modules/task/service/impl/VisitingTaskHandler.java
new file mode 100644
index 0000000..925b23d
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/service/impl/VisitingTaskHandler.java
@@ -0,0 +1,57 @@
+package org.springblade.modules.task.service.impl;
+
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.grid.entity.GridWorkLogEntity;
+import org.springblade.modules.grid.service.IGridWorkLogService;
+import org.springblade.modules.house.entity.UserHouseLabelEntity;
+import org.springblade.modules.house.service.IUserHouseLabelService;
+import org.springblade.modules.house.vo.UserHouseLabelVO;
+import org.springblade.modules.task.service.TaskHandle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 走访任务ServiceImpl
+ */
+@Component("VisitingTaskHandler")
+public class VisitingTaskHandler implements TaskHandle {
+
+	@Autowired
+	private IUserHouseLabelService userHouseLabelService;
+
+	@Autowired
+	private  IGridWorkLogService gridWorkLogService;
+	@Override
+	public void taskHandle(CustomTaskEntity customTask) {
+		System.out.println("走访任务");
+		// 查询有标签的颜色的人
+		// List<UserHouseLabelEntity> list = userHouseLabelService.list(Wrappers.<UserHouseLabelEntity>lambdaQuery()
+		// 	.eq(UserHouseLabelEntity::getLableType, 1)
+		// 	.eq(UserHouseLabelEntity::getLabelId, customTask.getLabelId())
+		// 	.eq(UserHouseLabelEntity::getColor, customTask.getLabelColor())
+		// 	.isNotNull(UserHouseLabelEntity::getHouseholdId));
+		UserHouseLabelVO userHouseLabelVO = new UserHouseLabelVO();
+		userHouseLabelVO.setLabelId(customTask.getLabelId().longValue());
+		userHouseLabelVO.setColor(customTask.getLabelColor());
+		userHouseLabelVO.setTaskRange(customTask.getTaskRange());
+		List<UserHouseLabelEntity> list =	userHouseLabelService.getUserHouseLabelList(userHouseLabelVO);
+		List<GridWorkLogEntity> gridWorkLogEntities = new ArrayList<>();
+		list.forEach(userHouseLabelEntity -> {
+			// 创建任务
+			GridWorkLogEntity gridWorkLogEntity = new GridWorkLogEntity();
+			gridWorkLogEntity.setType(2);
+			gridWorkLogEntity.setHouseholdId(userHouseLabelEntity.getHouseholdId());
+			gridWorkLogEntity.setPersonType(customTask.getLabelId());
+			gridWorkLogEntity.setSource(2);
+			gridWorkLogEntity.setStatus(1);
+			gridWorkLogEntities.add(gridWorkLogEntity);
+		});
+		gridWorkLogService.saveBatch(gridWorkLogEntities);
+
+		// 遍历
+			// 创建任务
+	}
+}
diff --git a/src/main/java/org/springblade/modules/task/vo/TaskNoFraudReportingVO.java b/src/main/java/org/springblade/modules/task/vo/TaskNoFraudReportingVO.java
new file mode 100644
index 0000000..c58797c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/vo/TaskNoFraudReportingVO.java
@@ -0,0 +1,108 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 无炸上报任务表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskNoFraudReportingVO extends TaskNoFraudReportingEntity {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "上报项目", example = "")
+	private List<TaskPlaceRecordVO> taskPlaceRecordVOList;
+
+
+	@ApiModelProperty(value = "场所名称", example = "")
+	private String placeName;
+
+	@ApiModelProperty(value = "场所地址", example = "")
+	private String location;
+
+	@ApiModelProperty(value = "负责人", example = "")
+	private String principal;
+
+	@ApiModelProperty(value = "网格名称", example = "")
+	private String gridName;
+
+	@ApiModelProperty(value = "负责人电话", example = "")
+	private String principalPhone;
+
+	@ApiModelProperty(value = "街道名称", example = "")
+	private String streetName;
+
+	@ApiModelProperty(value = "社区名称", example = "")
+	private String communityName;
+
+	@ApiModelProperty(value = "法人", example = "")
+	private String legalPerson;
+
+	@ApiModelProperty(value = "法人电话", example = "")
+	private String legalTel;
+
+	@ApiModelProperty(value = "检查人名称", example = "")
+	private String name;
+
+	@ApiModelProperty(value = "上报数量", example = "")
+	private Integer number;
+
+	@ApiModelProperty(value = "机构名称", example = "")
+	private String deptName;
+
+	@ApiModelProperty(value = "无诈类别", example = "")
+	private String noExplosionCategory;
+
+//	@ApiModelProperty(value = "隐患问题", example = "")
+//	private String hiddenDanger;
+
+	@ApiModelProperty(value = "不通过原因", example = "")
+	private String reasonFailure;
+
+	@ApiModelProperty(value = "地址编码", example = "")
+	private String addressName;
+
+	@ApiModelProperty(value = "开始时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	private String startTime;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "结束时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+	private String endTime;
+
+	// 角色名称
+	@ApiModelProperty(value = "角色名称", example = "")
+	private String roleName;
+
+	// 社区编号
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+	@ApiModelProperty(value = "派出所名称", example = "")
+	private String pcsName;
+}
diff --git a/src/main/java/org/springblade/modules/task/vo/TaskResidencePermitApplyVO.java b/src/main/java/org/springblade/modules/task/vo/TaskResidencePermitApplyVO.java
new file mode 100644
index 0000000..3513a86
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/vo/TaskResidencePermitApplyVO.java
@@ -0,0 +1,70 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 居住证申请 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskResidencePermitApplyVO extends TaskResidencePermitApplyEntity {
+	private static final long serialVersionUID = 1L;
+
+	// 角色名称
+	@ApiModelProperty(value = "角色名称", example = "")
+	private String roleName;
+
+	// 社区编号
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+
+	@ApiModelProperty(value = "地址", example = "")
+	private String addressName;
+
+	@ApiModelProperty(value = "社区名称", example = "")
+	private String communityName;
+
+	@ApiModelProperty(value = "小区名称", example = "")
+	private String aoiName;
+
+	@ApiModelProperty(value = "网格名称", example = "")
+	private String gridName;
+
+	@ApiModelProperty(value = "街道名称", example = "")
+	private String streetName;
+
+	@ApiModelProperty(value = "未成年 1:否 2:是", example = "")
+	private Integer minors;
+
+	@ApiModelProperty(value = "角色类型", example = "")
+	private String roleType;
+	
+	@ApiModelProperty("开始时间")
+	private String startTime;
+
+	@ApiModelProperty("结束时间")
+	private String endTime;
+
+}
diff --git a/src/main/java/org/springblade/modules/task/vo/TaskSchoolEvenVO.java b/src/main/java/org/springblade/modules/task/vo/TaskSchoolEvenVO.java
new file mode 100644
index 0000000..56f2564
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/vo/TaskSchoolEvenVO.java
@@ -0,0 +1,61 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 校园事件 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskSchoolEvenVO extends TaskSchoolEvenEntity {
+	private static final long serialVersionUID = 1L;
+	@ApiModelProperty(value = "名称", example = "")
+	private String name;
+	@ApiModelProperty(value = "电话", example = "")
+	private String phone;
+	@ApiModelProperty(value = "地址", example = "")
+	private String location;
+	@ApiModelProperty(value = "街道", example = "")
+	private String streetName;
+	@ApiModelProperty(value = "社区", example = "")
+	private String communityName;
+
+	// 角色名称
+	@ApiModelProperty(value = "角色名称", example = "")
+	private String roleName;
+
+	// 社区编号
+	@ApiModelProperty(value = "社区编号", example = "")
+	private String communityCode;
+
+	@ApiModelProperty(value = "角色类型", example = "")
+	private String roleType;
+
+	@ApiModelProperty(value = "场所名称", example = "")
+	private String placeName;
+	private String startTime;
+	private String endTime;
+
+}
diff --git a/src/main/java/org/springblade/modules/task/wrapper/TaskNoFraudReportingWrapper.java b/src/main/java/org/springblade/modules/task/wrapper/TaskNoFraudReportingWrapper.java
new file mode 100644
index 0000000..fbcb569
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/wrapper/TaskNoFraudReportingWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.task.entity.TaskNoFraudReportingEntity;
+import org.springblade.modules.task.vo.TaskNoFraudReportingVO;
+import java.util.Objects;
+
+/**
+ * 无炸上报任务表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-10
+ */
+public class TaskNoFraudReportingWrapper extends BaseEntityWrapper<TaskNoFraudReportingEntity, TaskNoFraudReportingVO>  {
+
+	public static TaskNoFraudReportingWrapper build() {
+		return new TaskNoFraudReportingWrapper();
+ 	}
+
+	@Override
+	public TaskNoFraudReportingVO entityVO(TaskNoFraudReportingEntity taskNoFraudReporting) {
+		TaskNoFraudReportingVO taskNoFraudReportingVO = Objects.requireNonNull(BeanUtil.copy(taskNoFraudReporting, TaskNoFraudReportingVO.class));
+
+		//User createUser = UserCache.getUser(taskNoFraudReporting.getCreateUser());
+		//User updateUser = UserCache.getUser(taskNoFraudReporting.getUpdateUser());
+		//taskNoFraudReportingVO.setCreateUserName(createUser.getName());
+		//taskNoFraudReportingVO.setUpdateUserName(updateUser.getName());
+
+		return taskNoFraudReportingVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/task/wrapper/TaskResidencePermitApplyWrapper.java b/src/main/java/org/springblade/modules/task/wrapper/TaskResidencePermitApplyWrapper.java
new file mode 100644
index 0000000..b225d22
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/wrapper/TaskResidencePermitApplyWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.task.entity.TaskResidencePermitApplyEntity;
+import org.springblade.modules.task.vo.TaskResidencePermitApplyVO;
+import java.util.Objects;
+
+/**
+ * 居住证申请 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-03-14
+ */
+public class TaskResidencePermitApplyWrapper extends BaseEntityWrapper<TaskResidencePermitApplyEntity, TaskResidencePermitApplyVO>  {
+
+	public static TaskResidencePermitApplyWrapper build() {
+		return new TaskResidencePermitApplyWrapper();
+ 	}
+
+	@Override
+	public TaskResidencePermitApplyVO entityVO(TaskResidencePermitApplyEntity taskResidencePermitApply) {
+		TaskResidencePermitApplyVO taskResidencePermitApplyVO = Objects.requireNonNull(BeanUtil.copy(taskResidencePermitApply, TaskResidencePermitApplyVO.class));
+
+		//User createUser = UserCache.getUser(taskResidencePermitApply.getCreateUser());
+		//User updateUser = UserCache.getUser(taskResidencePermitApply.getUpdateUser());
+		//taskResidencePermitApplyVO.setCreateUserName(createUser.getName());
+		//taskResidencePermitApplyVO.setUpdateUserName(updateUser.getName());
+
+		return taskResidencePermitApplyVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/task/wrapper/TaskSchoolEvenWrapper.java b/src/main/java/org/springblade/modules/task/wrapper/TaskSchoolEvenWrapper.java
new file mode 100644
index 0000000..970aeb4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/task/wrapper/TaskSchoolEvenWrapper.java
@@ -0,0 +1,51 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.task.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.task.vo.TaskSchoolEvenVO;
+import org.springblade.modules.task.entity.TaskSchoolEvenEntity;
+
+import java.util.Objects;
+
+/**
+ * 校园事件 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-04-18
+ */
+public class TaskSchoolEvenWrapper extends BaseEntityWrapper<TaskSchoolEvenEntity, TaskSchoolEvenVO>  {
+
+	public static TaskSchoolEvenWrapper build() {
+		return new TaskSchoolEvenWrapper();
+ 	}
+
+	@Override
+	public TaskSchoolEvenVO entityVO(TaskSchoolEvenEntity taskSchoolEven) {
+		TaskSchoolEvenVO taskSchoolEvenVO = Objects.requireNonNull(BeanUtil.copy(taskSchoolEven, TaskSchoolEvenVO.class));
+
+		//User createUser = UserCache.getUser(taskSchoolEven.getCreateUser());
+		//User updateUser = UserCache.getUser(taskSchoolEven.getUpdateUser());
+		//taskSchoolEvenVO.setCreateUserName(createUser.getName());
+		//taskSchoolEvenVO.setUpdateUserName(updateUser.getName());
+
+		return taskSchoolEvenVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/test4j/Test4jController.java b/src/main/java/org/springblade/modules/test4j/Test4jController.java
new file mode 100644
index 0000000..7aced56
--- /dev/null
+++ b/src/main/java/org/springblade/modules/test4j/Test4jController.java
@@ -0,0 +1,64 @@
+package org.springblade.modules.test4j;
+
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import net.sourceforge.tess4j.ITesseract;
+import net.sourceforge.tess4j.Tesseract;
+import net.sourceforge.tess4j.TesseractException;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.test4j.util.Test4jUtil;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/test4j")
+@Api(value = "图片智能识别", tags = "图片智能识别")
+public class Test4jController {
+
+	@PostMapping("/read-id")
+	public R readText(@RequestParam("file") MultipartFile file) {
+		try {
+			BufferedImage grayscaleImage = grayscale(ImageIO.read(file.getInputStream()));
+			String text = recognizeText(grayscaleImage);
+			return R.data(text);
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	public BufferedImage grayscale(BufferedImage image) {
+		int width = image.getWidth();
+		int height = image.getHeight();
+		BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
+		Graphics g = result.getGraphics();
+		g.drawImage(image, 0, 0, null);
+		g.dispose();
+		return result;
+	}
+
+	public String recognizeText(BufferedImage image) {
+		ITesseract tesseract = new Tesseract();
+		// 设置Tesseract的路径
+		tesseract.setDatapath("F:\\test4jdata");
+		// 设置为中文简体
+		tesseract.setLanguage("chi_sim");
+		try {
+			return tesseract.doOCR(image);
+		} catch (TesseractException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+}
diff --git a/src/main/java/org/springblade/modules/test4j/util/Test4jUtil.java b/src/main/java/org/springblade/modules/test4j/util/Test4jUtil.java
new file mode 100644
index 0000000..40752e1
--- /dev/null
+++ b/src/main/java/org/springblade/modules/test4j/util/Test4jUtil.java
@@ -0,0 +1,85 @@
+package org.springblade.modules.test4j.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 身份证信息读取工具
+ */
+public class Test4jUtil {
+	/**
+	 * 去掉字符串里的非中文字符
+	 *
+	 * @param inputString 字符串
+	 * @return 中文字符串
+	 */
+	public static String removeNonChinese(String inputString) {
+		// 匹配非汉字字符的正则表达式
+		String regex = "[^\u4E00-\u9FA5]";
+		Pattern pattern = Pattern.compile(regex);
+		Matcher matcher = pattern.matcher(inputString);
+		// 替换非汉字字符为空格
+		return matcher.replaceAll("");
+	}
+
+	/**
+	 * 提取出生日期
+	 *
+	 * @param inputString 字符串
+	 * @return 出生日期
+	 */
+	private static String extractBirthDate(String inputString) {
+		// 匹配日期格式的正则表达式
+		String regex = "(\\d{4}年\\d{2}月\\d{2}日)";
+		Pattern pattern = Pattern.compile(regex);
+		Matcher matcher = pattern.matcher(inputString);
+		// 提取匹配到的日期
+		if (matcher.find()) {
+			return matcher.group(1);
+		} else {
+			return "未找到日期";
+		}
+	}
+
+	/**
+	 * 截取指定字符
+	 *
+	 * @param inputString 字符串
+	 * @param indexStart  开始Index
+	 * @return 截取的字符串
+	 */
+	public static String getStringByIndex(String inputString, int indexStart) {
+		return getStringByIndex(inputString, indexStart, -1);
+	}
+
+	/**
+	 * 截取指定字符
+	 *
+	 * @param inputString 字符串
+	 * @param indexStart  开始Index
+	 * @param size        截取的字符个数
+	 * @return 截取的字符串
+	 */
+	public static String getStringByIndex(String inputString, int indexStart, int size) {
+		// 去除字符串两端的空白字符
+		String trimmedString = inputString.trim();
+		// 将字符串以空白字符分割
+		StringBuilder res = new StringBuilder();
+		String[] words = trimmedString.split("\\s+");
+		int length = words.length;
+		int contentSize = indexStart + size;
+		if (length > indexStart) {
+			int index = length;
+			if (size > 0 && length > contentSize) {
+				index = contentSize;
+			}
+			for (int i = indexStart; i < index; i++) {
+				res.append(words[i]);
+			}
+		}
+		return res.toString();
+	}
+
+
+
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/controller/CustomTaskController.java b/src/main/java/org/springblade/modules/threeColorTask/controller/CustomTaskController.java
new file mode 100644
index 0000000..4b7ac40
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/controller/CustomTaskController.java
@@ -0,0 +1,125 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.threeColorTask.vo.CustomTaskVO;
+import org.springblade.modules.threeColorTask.wrapper.CustomTaskWrapper;
+import org.springblade.modules.threeColorTask.service.ICustomTaskService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 自定义任务表 控制器
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("blade-customTask/customTask")
+@Api(value = "自定义任务表", tags = "自定义任务表接口")
+public class CustomTaskController extends BladeController {
+
+	private final ICustomTaskService customTaskService;
+
+	/**
+	 * 自定义任务表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入customTask")
+	public R<CustomTaskVO> detail(CustomTaskEntity customTask) {
+		CustomTaskEntity detail = customTaskService.getOne(Condition.getQueryWrapper(customTask));
+		return R.data(CustomTaskWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 自定义任务表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入customTask")
+	public R<IPage<CustomTaskVO>> list(CustomTaskEntity customTask, Query query) {
+		IPage<CustomTaskEntity> pages = customTaskService.page(Condition.getPage(query), Condition.getQueryWrapper(customTask));
+		return R.data(CustomTaskWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 自定义任务表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入customTask")
+	public R<IPage<CustomTaskVO>> page(CustomTaskVO customTask, Query query) {
+		IPage<CustomTaskVO> pages = customTaskService.selectCustomTaskPage(Condition.getPage(query), customTask);
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义任务表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入customTask")
+	public R save(@Valid @RequestBody CustomTaskEntity customTask) {
+		return R.status(customTaskService.saveCustomTask(customTask));
+	}
+
+	/**
+	 * 自定义任务表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入customTask")
+	public R update(@Valid @RequestBody CustomTaskEntity customTask) {
+		return R.status(customTaskService.updateCustomTask(customTask));
+	}
+
+	/**
+	 * 自定义任务表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入customTask")
+	public R submit(@Valid @RequestBody CustomTaskEntity customTask) {
+		return R.status(customTaskService.saveOrUpdate(customTask));
+	}
+
+	/**
+	 * 自定义任务表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(customTaskService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/dto/CustomTaskDTO.java b/src/main/java/org/springblade/modules/threeColorTask/dto/CustomTaskDTO.java
new file mode 100644
index 0000000..da54c0e
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/dto/CustomTaskDTO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.dto;
+
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 自定义任务表 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CustomTaskDTO extends CustomTaskEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/entity/CustomTaskEntity.java b/src/main/java/org/springblade/modules/threeColorTask/entity/CustomTaskEntity.java
new file mode 100644
index 0000000..9f4bee4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/entity/CustomTaskEntity.java
@@ -0,0 +1,127 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * 自定义任务表对象 jczz_custom_task
+ *
+ * @author ${context.author}
+ * @date 2024-07-30 16:50:32
+ */
+@ApiModel(value = "CustomTask对象" , description = "自定义任务表")
+@Data
+@TableName("jczz_three_color_task")
+public class CustomTaskEntity  {
+
+
+	private static final long serialVersionUID = 1L;
+
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty("主键id")
+	@TableId(value = "id", type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/** 任务名称 */
+	@ApiModelProperty(value = "任务名称", example = "")
+	@TableField("name")
+	private String name;
+
+	/** 1.走访任务 2.自查任务 */
+	@ApiModelProperty(value = "1.走访任务 2.自查任务", example = "")
+	@TableField("task_type")
+	private String taskType;
+
+	/** 标签id */
+	@ApiModelProperty(value = "标签id", example = "")
+	@TableField("label_id")
+	private Integer labelId;
+
+	/** 标签颜色 */
+	@ApiModelProperty(value = "标签颜色", example = "")
+	@TableField("label_color")
+	private String labelColor;
+
+	/** 分类id */
+	@ApiModelProperty(value = "分类id", example = "")
+	@TableField("place_label")
+	private Integer placeLabel;
+
+
+	/** 分类id */
+	@ApiModelProperty(value = "分类id", example = "")
+	@TableField("place_small_label")
+	private Integer placeSmallLabel;
+
+	/** 九小类型 */
+	@ApiModelProperty(value = "九小类型", example = "")
+	@TableField("nineType")
+	private Integer nineType;
+
+	/** 0 :否  1 :是 */
+	@ApiModelProperty(value = "0 :否  1 :是", example = "")
+	@TableField("delete_flag")
+	private Integer deleteFlag;
+
+	/** 更新时间 */
+	@ApiModelProperty(value = "更新时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
+	private Date updateTime;
+
+	/** 创建时间 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time",fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/** 创建人 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField("create_by")
+	private Long createBy;
+
+	/** 更新人 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField("update_by")
+	private Long updateBy;
+
+	@ApiModelProperty(value = "cron表达式", example = "")
+	@TableField("cron")
+	private String cron;
+
+	@ApiModelProperty(value = "任务状态", example = "")
+	@TableField("task_status")
+	private Integer taskStatus;
+
+	@ApiModelProperty(value = "任务id", example = "")
+	@TableField("job_id")
+	private Integer jobId;
+
+	@ApiModelProperty(value = "任务范围", example = "")
+	@TableField("task_range")
+	private String taskRange;
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.java b/src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.java
new file mode 100644
index 0000000..eb8ceff
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.java
@@ -0,0 +1,61 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.threeColorTask.dto.CustomTaskDTO;
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.threeColorTask.vo.CustomTaskVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 自定义任务表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+public interface CustomTaskMapper extends BaseMapper<CustomTaskEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param customTask
+	 * @return
+	 */
+	List<CustomTaskVO> selectCustomTaskPage(IPage page, @Param("customTask") CustomTaskVO customTask);
+
+
+	/**
+	 * 查询自定义任务表
+	 *
+	 * @param id 自定义任务表ID
+	 * @return 自定义任务表
+	 */
+	public CustomTaskDTO selectCustomTaskById(Integer id);
+
+	/**
+	 * 查询自定义任务表列表
+	 *
+	 * @param customTaskDTO 自定义任务表
+	 * @return 自定义任务表集合
+	 */
+	public List<CustomTaskDTO> selectCustomTaskList(CustomTaskDTO customTaskDTO);
+
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.xml b/src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.xml
new file mode 100644
index 0000000..e02a803
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/mapper/CustomTaskMapper.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.threeColorTask.mapper.CustomTaskMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="customTaskResultMap" type="org.springblade.modules.threeColorTask.entity.CustomTaskEntity">
+    </resultMap>
+
+
+    <select id="selectCustomTaskPage" resultMap="customTaskResultMap">
+        <include refid="selectCustomTask"/>
+        <where>
+            <if test="customTask.id != null "> and id = #{customTask.id}</if>
+            <if test="customTask.name != null  and customTask.name != ''"> and name = #{customTask.name}</if>
+            <if test="customTask.taskType != null  and customTask.taskType != ''"> and task_type = #{customTask.taskType}</if>
+            <if test="customTask.labelId != null "> and label_id = #{customTask.labelId}</if>
+            <if test="customTask.labelColor != null  and customTask.labelColor != ''"> and label_color = #{customTask.labelColor}</if>
+            <if test="customTask.placeLabel != null "> and place_label = #{placeLabel}</if>
+            <if test="customTask.placeSmallLabel != null  and customTask.placeSmallLabel != ''"> and place_small_label = #{customTask.placeSmallLabel}</if>
+            <if test="customTask.nineType != null "> and nineType = #{customTask.nineType}</if>
+            <if test="customTask.deleteFlag != null "> and delete_flag = #{customTask.deleteFlag}</if>
+            <if test="customTask.updateTime != null "> and update_time = #{customTask.updateTime}</if>
+            <if test="customTask.createTime != null "> and create_time = #{customTask.createTime}</if>
+            <if test="customTask.createBy != null "> and create_by = #{customTask.createBy}</if>
+            <if test="customTask.updateBy != null "> and update_by = #{customTask.updateBy}</if>
+            <if test="customTask.cron != null  and customTask.cron != ''"> and cron = #{customTask.cron}</if>
+            <if test="customTask.taskStatus != null  and customTask.taskStatus != ''"> and task_status = #{customTask.taskStatus}</if>
+            <if test="customTask.jobId != null "> and job_id = #{customTask.jobId}</if>
+        </where>
+    </select>
+
+
+    <resultMap type="org.springblade.modules.threeColorTask.dto.CustomTaskDTO" id="CustomTaskDTOResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="taskType"    column="task_type"    />
+        <result property="labelId"    column="label_id"    />
+        <result property="labelColor"    column="label_color"    />
+        <result property="placeLabel"    column="place_label"    />
+        <result property="placeSmallLabel"    column="place_small_label"    />
+        <result property="nineType"    column="nineType"    />
+        <result property="deleteFlag"    column="delete_flag"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="cron"    column="cron"    />
+        <result property="taskStatus"    column="task_status"    />
+        <result property="taskRange"    column="task_range"    />
+        <result property="jobId"    column="job_id"    />
+    </resultMap>
+
+    <sql id="selectCustomTask">
+        select
+            id,
+            name,
+            task_type,
+            label_id,
+            label_color,
+            place_label,
+            place_small_label,
+            nineType,
+            delete_flag,
+            update_time,
+            create_time,
+            create_by,
+            update_by,
+            cron,
+            task_range,
+            task_status,
+            job_id
+        from
+            jczz_three_color_task
+    </sql>
+
+    <select id="selectCustomTaskById" parameterType="int" resultMap="CustomTaskDTOResult">
+        <include refid="selectCustomTask"/>
+        where
+        id = #{id}
+    </select>
+
+    <select id="selectCustomTaskList" parameterType="org.springblade.modules.threeColorTask.dto.CustomTaskDTO" resultMap="CustomTaskDTOResult">
+        <include refid="selectCustomTask"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="name != null  and name != ''"> and name = #{name}</if>
+            <if test="taskType != null  and taskType != ''"> and task_type = #{taskType}</if>
+            <if test="labelId != null "> and label_id = #{labelId}</if>
+            <if test="labelColor != null  and labelColor != ''"> and label_color = #{labelColor}</if>
+            <if test="placeLabel != null "> and place_label = #{placeLabel}</if>
+            <if test="placeSmallLabel != null  and placeSmallLabel != ''"> and place_small_label = #{placeSmallLabel}</if>
+            <if test="nineType != null "> and nineType = #{nineType}</if>
+            <if test="deleteFlag != null "> and delete_flag = #{deleteFlag}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+            <if test="createTime != null "> and create_time = #{createTime}</if>
+            <if test="createBy != null "> and create_by = #{createBy}</if>
+            <if test="updateBy != null "> and update_by = #{updateBy}</if>
+            <if test="cron != null  and cron != ''"> and cron = #{cron}</if>
+            <if test="taskRange != null  and taskRange != ''"> and task_range = #{taskRange}</if>
+            <if test="taskStatus != null  and taskStatus != ''"> and task_status = #{taskStatus}</if>
+            <if test="jobId != null "> and job_id = #{jobId}</if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/threeColorTask/service/ICustomTaskService.java b/src/main/java/org/springblade/modules/threeColorTask/service/ICustomTaskService.java
new file mode 100644
index 0000000..04df9e9
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/service/ICustomTaskService.java
@@ -0,0 +1,74 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.modules.threeColorTask.dto.CustomTaskDTO;
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.threeColorTask.vo.CustomTaskVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * 自定义任务表 服务类
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+public interface ICustomTaskService extends IService<CustomTaskEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param customTask
+	 * @return
+	 */
+	IPage<CustomTaskVO> selectCustomTaskPage(IPage<CustomTaskVO> page, CustomTaskVO customTask);
+
+
+	/**
+	 * 查询自定义任务表
+	 *
+	 * @param id 自定义任务表ID
+	 * @return 自定义任务表
+	 */
+	public CustomTaskDTO selectCustomTaskById(Integer id);
+
+	/**
+	 * 查询自定义任务表列表
+	 *
+	 * @param customTaskDTO 自定义任务表
+	 * @return 自定义任务表集合
+	 */
+	public List<CustomTaskDTO> selectCustomTaskList(CustomTaskDTO customTaskDTO);
+
+	/**
+	 * 新增自定义任务表
+	 * @param customTask
+	 * @return
+	 */
+	boolean saveCustomTask(CustomTaskEntity customTask);
+
+	/**
+	 * 修改自定义任务表
+	 * @param customTask
+	 * @return
+	 */
+	boolean updateCustomTask(CustomTaskEntity customTask);
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/service/impl/CustomTaskServiceImpl.java b/src/main/java/org/springblade/modules/threeColorTask/service/impl/CustomTaskServiceImpl.java
new file mode 100644
index 0000000..259fcd6
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/service/impl/CustomTaskServiceImpl.java
@@ -0,0 +1,137 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.modules.threeColorTask.dto.CustomTaskDTO;
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.threeColorTask.mapper.CustomTaskMapper;
+import org.springblade.modules.threeColorTask.service.ICustomTaskService;
+import org.springblade.modules.threeColorTask.vo.CustomTaskVO;
+import org.springblade.xxljob.entity.JobInfoEntity;
+import org.springblade.xxljob.service.IJobInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 自定义任务表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+@Service
+public class CustomTaskServiceImpl extends ServiceImpl<CustomTaskMapper, CustomTaskEntity> implements ICustomTaskService {
+
+	@Override
+	public IPage<CustomTaskVO> selectCustomTaskPage(IPage<CustomTaskVO> page, CustomTaskVO customTask) {
+		return page.setRecords(baseMapper.selectCustomTaskPage(page, customTask));
+	}
+
+
+	/**
+	 * 查询自定义任务表
+	 *
+	 * @param id 自定义任务表ID
+	 * @return 自定义任务表
+	 */
+	@Override
+	public CustomTaskDTO selectCustomTaskById(Integer id) {
+		return this.baseMapper.selectCustomTaskById(id);
+	}
+
+	/**
+	 * 查询自定义任务表列表
+	 *
+	 * @param customTaskDTO 自定义任务表
+	 * @return 自定义任务表集合
+	 */
+	@Override
+	public List<CustomTaskDTO> selectCustomTaskList(CustomTaskDTO customTaskDTO) {
+		return this.baseMapper.selectCustomTaskList(customTaskDTO);
+	}
+
+	@Autowired
+	private IJobInfoService jobInfoService;
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updateCustomTask(CustomTaskEntity customTask) {
+		boolean update = updateById(customTask);
+		if (!update) {
+			return update;
+		}
+		JobInfoEntity jobInfoEntity = jobInfoService.getById(customTask.getJobId());
+		jobInfoEntity.setScheduleConf(customTask.getCron());
+		Integer taskStatus = customTask.getTaskStatus() - 1;
+		jobInfoEntity.setTriggerStatus(taskStatus.byteValue());
+		jobInfoEntity.setExecutorParam(JSON.toJSONString(customTask));
+		jobInfoEntity.setJobDesc(customTask.getName());
+		boolean update1 = jobInfoService.updateById(jobInfoEntity);
+		if (!update1) {
+			throw new RuntimeException("更新任务表失败");
+		}
+		return update;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean saveCustomTask(CustomTaskEntity customTask) {
+		// 保存自定义任务表
+		save(customTask);
+		// 保存任务表
+		JobInfoEntity jobInfoEntity = new JobInfoEntity();
+		jobInfoEntity.setJobDesc(customTask.getName());
+		jobInfoEntity.setScheduleConf(customTask.getCron());
+		jobInfoEntity.setJobGroup(1);
+		jobInfoEntity.setScheduleType("CRON");
+		jobInfoEntity.setExecutorRouteStrategy("FIRST");
+		jobInfoEntity.setExecutorHandler("threeColourJobHandler");
+		jobInfoEntity.setExecutorParam(JSON.toJSONString(customTask));
+		jobInfoEntity.setExecutorBlockStrategy("SERIAL_EXECUTION");
+		jobInfoEntity.setGlueType("BEAN");
+		jobInfoEntity.setGlueSource("");
+		jobInfoEntity.setGlueRemark("GLUE代码初始化");
+		Integer taskStatus = customTask.getTaskStatus() - 1;
+		jobInfoEntity.setTriggerStatus(taskStatus.byteValue());
+		jobInfoEntity.setTriggerLastTime(0L);
+		jobInfoEntity.setTriggerNextTime(0L);
+		jobInfoEntity.setAuthor("林伟");
+		jobInfoEntity.setAlarmEmail("872216696@qq.com");
+		jobInfoEntity.setExecutorFailRetryCount(0);
+		jobInfoEntity.setGlueUpdatetime(DateUtil.now());
+		jobInfoEntity.setAddTime(DateUtil.now());
+		jobInfoEntity.setUpdateTime(DateUtil.now());
+		jobInfoEntity.setMisfireStrategy("DO_NOTHING");
+		jobInfoEntity.setExecutorTimeout(0);
+		boolean save1 = jobInfoService.save(jobInfoEntity);
+		if (!save1) {
+			throw new RuntimeException("保存任务表失败");
+		}
+		customTask.setJobId(jobInfoEntity.getId());
+		boolean update = updateById(customTask);
+		if (!update) {
+			throw new RuntimeException("更新自定义任务表失败");
+		}
+		return update;
+	}
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/vo/CustomTaskVO.java b/src/main/java/org/springblade/modules/threeColorTask/vo/CustomTaskVO.java
new file mode 100644
index 0000000..f8e89bc
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/vo/CustomTaskVO.java
@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.vo;
+
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 自定义任务表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CustomTaskVO extends CustomTaskEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/org/springblade/modules/threeColorTask/wrapper/CustomTaskWrapper.java b/src/main/java/org/springblade/modules/threeColorTask/wrapper/CustomTaskWrapper.java
new file mode 100644
index 0000000..093d14f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/threeColorTask/wrapper/CustomTaskWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.threeColorTask.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.threeColorTask.entity.CustomTaskEntity;
+import org.springblade.modules.threeColorTask.vo.CustomTaskVO;
+import java.util.Objects;
+
+/**
+ * 自定义任务表 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2024-07-30
+ */
+public class CustomTaskWrapper extends BaseEntityWrapper<CustomTaskEntity, CustomTaskVO>  {
+
+	public static CustomTaskWrapper build() {
+		return new CustomTaskWrapper();
+ 	}
+
+	@Override
+	public CustomTaskVO entityVO(CustomTaskEntity customTask) {
+		CustomTaskVO customTaskVO = Objects.requireNonNull(BeanUtil.copy(customTask, CustomTaskVO.class));
+
+		//User createUser = UserCache.getUser(customTask.getCreateUser());
+		//User updateUser = UserCache.getUser(customTask.getUpdateUser());
+		//customTaskVO.setCreateUserName(createUser.getName());
+		//customTaskVO.setUpdateUserName(updateUser.getName());
+
+		return customTaskVO;
+	}
+
+
+}
diff --git a/src/main/java/org/springblade/modules/wechat/controller/WechatController.java b/src/main/java/org/springblade/modules/wechat/controller/WechatController.java
new file mode 100644
index 0000000..82b571f
--- /dev/null
+++ b/src/main/java/org/springblade/modules/wechat/controller/WechatController.java
@@ -0,0 +1,33 @@
+package org.springblade.modules.wechat.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.pay.entity.WeChatMiniAuthorizeVo;
+import org.springblade.modules.wechat.service.WechatService;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@RestController
+@RequestMapping("blade-wechat/wechat/")
+@Api(tags = "用户 -- 登录注册")
+public class WechatController {
+	@Resource
+	private WechatService wechatService;
+
+    @ApiOperation(value = "微信小程序授权")
+    @RequestMapping(value = "/getOpenId", method = RequestMethod.GET)
+    public R<WeChatMiniAuthorizeVo> wechatRoutineLogin(String code) throws Exception {
+        return R.data(wechatService.miniAuthCode(code));
+    }
+
+
+}
+
+
+
diff --git a/src/main/java/org/springblade/modules/wechat/service/WechatService.java b/src/main/java/org/springblade/modules/wechat/service/WechatService.java
new file mode 100644
index 0000000..b6e029c
--- /dev/null
+++ b/src/main/java/org/springblade/modules/wechat/service/WechatService.java
@@ -0,0 +1,12 @@
+package org.springblade.modules.wechat.service;
+
+import org.springblade.modules.pay.entity.WeChatMiniAuthorizeVo;
+
+public interface WechatService {
+    /**
+     * 小程序登录凭证校验
+     *
+     * @return 小程序登录校验对象
+     */
+    WeChatMiniAuthorizeVo miniAuthCode(String code);
+}
diff --git a/src/main/java/org/springblade/modules/wechat/service/impl/WechatServiceImpl.java b/src/main/java/org/springblade/modules/wechat/service/impl/WechatServiceImpl.java
new file mode 100644
index 0000000..6f9b9d4
--- /dev/null
+++ b/src/main/java/org/springblade/modules/wechat/service/impl/WechatServiceImpl.java
@@ -0,0 +1,60 @@
+package org.springblade.modules.wechat.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.config.WxMiniConfig;
+import org.springblade.common.exception.CustomException;
+import org.springblade.common.utils.HttpClientUtils;
+import org.springblade.common.utils.SpringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.modules.pay.entity.WeChatMiniAuthorizeVo;
+import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.service.IUserService;
+import org.springblade.modules.wechat.service.WechatService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class WechatServiceImpl implements WechatService {
+
+	private static final Logger logger = LoggerFactory.getLogger(WechatServiceImpl.class);
+
+	@Resource
+	private WxMiniConfig wxMiniConfig;
+
+	/**
+	 * 小程序登录凭证校验
+	 *
+	 * @return 小程序登录校验对象
+	 */
+	@Override
+	public WeChatMiniAuthorizeVo miniAuthCode(String code) {
+		String url = StrUtil.format(wxMiniConfig.getJscode2sessionUrl(), wxMiniConfig.getAppid(), wxMiniConfig.getSecret(), code);
+		JSONObject data = JSON.parseObject(HttpClientUtils.doGet(url));
+		if (ObjectUtil.isNull(data)) {
+			logger.error("微信平台接口异常,没任何数据返回!");
+			throw new CustomException("微信平台接口异常,没任何数据返回!");
+		}
+		if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) {
+			if (data.containsKey("errmsg")) {
+				logger.error("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
+				throw new CustomException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg"));
+			}
+		}
+		WeChatMiniAuthorizeVo weChatMiniAuthorizeVo = JSONObject.parseObject(data.toJSONString(), WeChatMiniAuthorizeVo.class);
+		// 绑定用户openid
+		Long userId = AuthUtil.getUserId();
+		IUserService userService = SpringUtils.getBean(IUserService.class);
+		userService.update(Wrappers.<User>lambdaUpdate().set(User::getMiniOpenId, weChatMiniAuthorizeVo.getOpenId()).eq(User::getId, userId));
+		return weChatMiniAuthorizeVo;
+	}
+
+
+}
+
diff --git a/src/main/java/org/springblade/xxljob/cron/CronExpression.java b/src/main/java/org/springblade/xxljob/cron/CronExpression.java
new file mode 100644
index 0000000..4781f36
--- /dev/null
+++ b/src/main/java/org/springblade/xxljob/cron/CronExpression.java
@@ -0,0 +1,1402 @@
+package org.springblade.xxljob.cron;
+
+import java.io.Serializable;
+import java.text.ParseException;
+import java.util.*;
+
+public final class CronExpression implements Serializable, Cloneable {
+
+    private static final long serialVersionUID = 12423409423L;
+
+    protected static final int SECOND = 0;
+    protected static final int MINUTE = 1;
+    protected static final int HOUR = 2;
+    protected static final int DAY_OF_MONTH = 3;
+    protected static final int MONTH = 4;
+    protected static final int DAY_OF_WEEK = 5;
+    protected static final int YEAR = 6;
+    protected static final int ALL_SPEC_INT = 99; // '*'
+    protected static final int NO_SPEC_INT = 98; // '?'
+    protected static final Integer ALL_SPEC = ALL_SPEC_INT;
+    protected static final Integer NO_SPEC = NO_SPEC_INT;
+
+    protected static final Map<String, Integer> monthMap = new HashMap<String, Integer>(20);
+    protected static final Map<String, Integer> dayMap = new HashMap<String, Integer>(60);
+
+    static {
+        monthMap.put("JAN", 0);
+        monthMap.put("FEB", 1);
+        monthMap.put("MAR", 2);
+        monthMap.put("APR", 3);
+        monthMap.put("MAY", 4);
+        monthMap.put("JUN", 5);
+        monthMap.put("JUL", 6);
+        monthMap.put("AUG", 7);
+        monthMap.put("SEP", 8);
+        monthMap.put("OCT", 9);
+        monthMap.put("NOV", 10);
+        monthMap.put("DEC", 11);
+
+        dayMap.put("SUN", 1);
+        dayMap.put("MON", 2);
+        dayMap.put("TUE", 3);
+        dayMap.put("WED", 4);
+        dayMap.put("THU", 5);
+        dayMap.put("FRI", 6);
+        dayMap.put("SAT", 7);
+    }
+
+    private final String cronExpression;
+    private TimeZone timeZone = null;
+    protected transient TreeSet<Integer> seconds;
+    protected transient TreeSet<Integer> minutes;
+    protected transient TreeSet<Integer> hours;
+    protected transient TreeSet<Integer> daysOfMonth;
+    protected transient TreeSet<Integer> months;
+    protected transient TreeSet<Integer> daysOfWeek;
+    protected transient TreeSet<Integer> years;
+
+    protected transient boolean lastdayOfWeek = false;
+    protected transient int nthdayOfWeek = 0;
+    protected transient boolean lastdayOfMonth = false;
+    protected transient boolean nearestWeekday = false;
+    protected transient int lastdayOffset = 0;
+    protected transient boolean expressionParsed = false;
+
+    public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100;
+
+    public CronExpression(String cronExpression) throws ParseException {
+        if (cronExpression == null) {
+            throw new IllegalArgumentException("cronExpression cannot be null");
+        }
+
+        this.cronExpression = cronExpression.toUpperCase(Locale.US);
+
+        buildExpression(this.cronExpression);
+    }
+
+    public CronExpression(CronExpression expression) {
+        this.cronExpression = expression.getCronExpression();
+        try {
+            buildExpression(cronExpression);
+        } catch (ParseException ex) {
+            throw new AssertionError();
+        }
+        if (expression.getTimeZone() != null) {
+            setTimeZone((TimeZone) expression.getTimeZone().clone());
+        }
+    }
+    public boolean isSatisfiedBy(Date date) {
+        Calendar testDateCal = Calendar.getInstance(getTimeZone());
+        testDateCal.setTime(date);
+        testDateCal.set(Calendar.MILLISECOND, 0);
+        Date originalDate = testDateCal.getTime();
+
+        testDateCal.add(Calendar.SECOND, -1);
+
+        Date timeAfter = getTimeAfter(testDateCal.getTime());
+
+        return ((timeAfter != null) && (timeAfter.equals(originalDate)));
+    }
+
+    public Date getNextValidTimeAfter(Date date) {
+        return getTimeAfter(date);
+    }
+
+    public Date getNextInvalidTimeAfter(Date date) {
+        long difference = 1000;
+
+        //move back to the nearest second so differences will be accurate
+        Calendar adjustCal = Calendar.getInstance(getTimeZone());
+        adjustCal.setTime(date);
+        adjustCal.set(Calendar.MILLISECOND, 0);
+        Date lastDate = adjustCal.getTime();
+
+        Date newDate;
+
+        //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution.
+
+        //keep getting the next included time until it's farther than one second
+        // apart. At that point, lastDate is the last valid fire time. We return
+        // the second immediately following it.
+        while (difference == 1000) {
+            newDate = getTimeAfter(lastDate);
+            if (newDate == null)
+                break;
+
+            difference = newDate.getTime() - lastDate.getTime();
+
+            if (difference == 1000) {
+                lastDate = newDate;
+            }
+        }
+
+        return new Date(lastDate.getTime() + 1000);
+    }
+
+    public TimeZone getTimeZone() {
+        if (timeZone == null) {
+            timeZone = TimeZone.getDefault();
+        }
+
+        return timeZone;
+    }
+
+    public void setTimeZone(TimeZone timeZone) {
+        this.timeZone = timeZone;
+    }
+
+    @Override
+    public String toString() {
+        return cronExpression;
+    }
+
+    public static boolean isValidExpression(String cronExpression) {
+
+        try {
+            new CronExpression(cronExpression);
+        } catch (ParseException pe) {
+            return false;
+        }
+
+        return true;
+    }
+
+    public static void validateExpression(String cronExpression) throws ParseException {
+
+        new CronExpression(cronExpression);
+    }
+
+
+    ////////////////////////////////////////////////////////////////////////////
+    //
+    // Expression Parsing Functions
+    //
+    ////////////////////////////////////////////////////////////////////////////
+
+    protected void buildExpression(String expression) throws ParseException {
+        expressionParsed = true;
+
+        try {
+
+            if (seconds == null) {
+                seconds = new TreeSet<Integer>();
+            }
+            if (minutes == null) {
+                minutes = new TreeSet<Integer>();
+            }
+            if (hours == null) {
+                hours = new TreeSet<Integer>();
+            }
+            if (daysOfMonth == null) {
+                daysOfMonth = new TreeSet<Integer>();
+            }
+            if (months == null) {
+                months = new TreeSet<Integer>();
+            }
+            if (daysOfWeek == null) {
+                daysOfWeek = new TreeSet<Integer>();
+            }
+            if (years == null) {
+                years = new TreeSet<Integer>();
+            }
+
+            int exprOn = SECOND;
+
+            StringTokenizer exprsTok = new StringTokenizer(expression, " \t",
+                    false);
+
+            while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {
+                String expr = exprsTok.nextToken().trim();
+
+                // throw an exception if L is used with other days of the month
+                if (exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {
+                    throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1);
+                }
+                // throw an exception if L is used with other days of the week
+                if (exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {
+                    throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1);
+                }
+                if (exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') + 1) != -1) {
+                    throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1);
+                }
+
+                StringTokenizer vTok = new StringTokenizer(expr, ",");
+                while (vTok.hasMoreTokens()) {
+                    String v = vTok.nextToken();
+                    storeExpressionVals(0, v, exprOn);
+                }
+
+                exprOn++;
+            }
+
+            if (exprOn <= DAY_OF_WEEK) {
+                throw new ParseException("Unexpected end of expression.",
+                        expression.length());
+            }
+
+            if (exprOn <= YEAR) {
+                storeExpressionVals(0, "*", YEAR);
+            }
+
+            TreeSet<Integer> dow = getSet(DAY_OF_WEEK);
+            TreeSet<Integer> dom = getSet(DAY_OF_MONTH);
+
+            // Copying the logic from the UnsupportedOperationException below
+            boolean dayOfMSpec = !dom.contains(NO_SPEC);
+            boolean dayOfWSpec = !dow.contains(NO_SPEC);
+
+            if (!dayOfMSpec || dayOfWSpec) {
+                if (!dayOfWSpec || dayOfMSpec) {
+                    throw new ParseException(
+                            "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0);
+                }
+            }
+        } catch (ParseException pe) {
+            throw pe;
+        } catch (Exception e) {
+            throw new ParseException("Illegal cron expression format ("
+                    + e.toString() + ")", 0);
+        }
+    }
+
+    protected int storeExpressionVals(int pos, String s, int type)
+            throws ParseException {
+
+        int incr = 0;
+        int i = skipWhiteSpace(pos, s);
+        if (i >= s.length()) {
+            return i;
+        }
+        char c = s.charAt(i);
+        if ((c >= 'A') && (c <= 'Z') && (!s.equals("L")) && (!s.equals("LW")) && (!s.matches("^L-[0-9]*[W]?"))) {
+            String sub = s.substring(i, i + 3);
+            int sval = -1;
+            int eval = -1;
+            if (type == MONTH) {
+                sval = getMonthNumber(sub) + 1;
+                if (sval <= 0) {
+                    throw new ParseException("Invalid Month value: '" + sub + "'", i);
+                }
+                if (s.length() > i + 3) {
+                    c = s.charAt(i + 3);
+                    if (c == '-') {
+                        i += 4;
+                        sub = s.substring(i, i + 3);
+                        eval = getMonthNumber(sub) + 1;
+                        if (eval <= 0) {
+                            throw new ParseException("Invalid Month value: '" + sub + "'", i);
+                        }
+                    }
+                }
+            } else if (type == DAY_OF_WEEK) {
+                sval = getDayOfWeekNumber(sub);
+                if (sval < 0) {
+                    throw new ParseException("Invalid Day-of-Week value: '"
+                            + sub + "'", i);
+                }
+                if (s.length() > i + 3) {
+                    c = s.charAt(i + 3);
+                    if (c == '-') {
+                        i += 4;
+                        sub = s.substring(i, i + 3);
+                        eval = getDayOfWeekNumber(sub);
+                        if (eval < 0) {
+                            throw new ParseException(
+                                    "Invalid Day-of-Week value: '" + sub
+                                            + "'", i);
+                        }
+                    } else if (c == '#') {
+                        try {
+                            i += 4;
+                            nthdayOfWeek = Integer.parseInt(s.substring(i));
+                            if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
+                                throw new Exception();
+                            }
+                        } catch (Exception e) {
+                            throw new ParseException(
+                                    "A numeric value between 1 and 5 must follow the '#' option",
+                                    i);
+                        }
+                    } else if (c == 'L') {
+                        lastdayOfWeek = true;
+                        i++;
+                    }
+                }
+
+            } else {
+                throw new ParseException(
+                        "Illegal characters for this position: '" + sub + "'",
+                        i);
+            }
+            if (eval != -1) {
+                incr = 1;
+            }
+            addToSet(sval, eval, incr, type);
+            return (i + 3);
+        }
+
+        if (c == '?') {
+            i++;
+            if ((i + 1) < s.length()
+                    && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) {
+                throw new ParseException("Illegal character after '?': "
+                        + s.charAt(i), i);
+            }
+            if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) {
+                throw new ParseException(
+                        "'?' can only be specified for Day-of-Month or Day-of-Week.",
+                        i);
+            }
+            if (type == DAY_OF_WEEK && !lastdayOfMonth) {
+                int val = daysOfMonth.last();
+                if (val == NO_SPEC_INT) {
+                    throw new ParseException(
+                            "'?' can only be specified for Day-of-Month -OR- Day-of-Week.",
+                            i);
+                }
+            }
+
+            addToSet(NO_SPEC_INT, -1, 0, type);
+            return i;
+        }
+
+        if (c == '*' || c == '/') {
+            if (c == '*' && (i + 1) >= s.length()) {
+                addToSet(ALL_SPEC_INT, -1, incr, type);
+                return i + 1;
+            } else if (c == '/'
+                    && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s
+                    .charAt(i + 1) == '\t')) {
+                throw new ParseException("'/' must be followed by an integer.", i);
+            } else if (c == '*') {
+                i++;
+            }
+            c = s.charAt(i);
+            if (c == '/') { // is an increment specified?
+                i++;
+                if (i >= s.length()) {
+                    throw new ParseException("Unexpected end of string.", i);
+                }
+
+                incr = getNumericValue(s, i);
+
+                i++;
+                if (incr > 10) {
+                    i++;
+                }
+                checkIncrementRange(incr, type, i);
+            } else {
+                incr = 1;
+            }
+
+            addToSet(ALL_SPEC_INT, -1, incr, type);
+            return i;
+        } else if (c == 'L') {
+            i++;
+            if (type == DAY_OF_MONTH) {
+                lastdayOfMonth = true;
+            }
+            if (type == DAY_OF_WEEK) {
+                addToSet(7, 7, 0, type);
+            }
+            if (type == DAY_OF_MONTH && s.length() > i) {
+                c = s.charAt(i);
+                if (c == '-') {
+                    ValueSet vs = getValue(0, s, i + 1);
+                    lastdayOffset = vs.value;
+                    if (lastdayOffset > 30)
+                        throw new ParseException("Offset from last day must be <= 30", i + 1);
+                    i = vs.pos;
+                }
+                if (s.length() > i) {
+                    c = s.charAt(i);
+                    if (c == 'W') {
+                        nearestWeekday = true;
+                        i++;
+                    }
+                }
+            }
+            return i;
+        } else if (c >= '0' && c <= '9') {
+            int val = Integer.parseInt(String.valueOf(c));
+            i++;
+            if (i >= s.length()) {
+                addToSet(val, -1, -1, type);
+            } else {
+                c = s.charAt(i);
+                if (c >= '0' && c <= '9') {
+                    ValueSet vs = getValue(val, s, i);
+                    val = vs.value;
+                    i = vs.pos;
+                }
+                i = checkNext(i, s, val, type);
+                return i;
+            }
+        } else {
+            throw new ParseException("Unexpected character: " + c, i);
+        }
+
+        return i;
+    }
+
+    private void checkIncrementRange(int incr, int type, int idxPos) throws ParseException {
+        if (incr > 59 && (type == SECOND || type == MINUTE)) {
+            throw new ParseException("Increment > 60 : " + incr, idxPos);
+        } else if (incr > 23 && (type == HOUR)) {
+            throw new ParseException("Increment > 24 : " + incr, idxPos);
+        } else if (incr > 31 && (type == DAY_OF_MONTH)) {
+            throw new ParseException("Increment > 31 : " + incr, idxPos);
+        } else if (incr > 7 && (type == DAY_OF_WEEK)) {
+            throw new ParseException("Increment > 7 : " + incr, idxPos);
+        } else if (incr > 12 && (type == MONTH)) {
+            throw new ParseException("Increment > 12 : " + incr, idxPos);
+        }
+    }
+
+    protected int checkNext(int pos, String s, int val, int type)
+            throws ParseException {
+
+        int end = -1;
+        int i = pos;
+
+        if (i >= s.length()) {
+            addToSet(val, end, -1, type);
+            return i;
+        }
+
+        char c = s.charAt(pos);
+
+        if (c == 'L') {
+            if (type == DAY_OF_WEEK) {
+                if (val < 1 || val > 7)
+                    throw new ParseException("Day-of-Week values must be between 1 and 7", -1);
+                lastdayOfWeek = true;
+            } else {
+                throw new ParseException("'L' option is not valid here. (pos=" + i + ")", i);
+            }
+            TreeSet<Integer> set = getSet(type);
+            set.add(val);
+            i++;
+            return i;
+        }
+
+        if (c == 'W') {
+            if (type == DAY_OF_MONTH) {
+                nearestWeekday = true;
+            } else {
+                throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i);
+            }
+            if (val > 31)
+                throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i);
+            TreeSet<Integer> set = getSet(type);
+            set.add(val);
+            i++;
+            return i;
+        }
+
+        if (c == '#') {
+            if (type != DAY_OF_WEEK) {
+                throw new ParseException("'#' option is not valid here. (pos=" + i + ")", i);
+            }
+            i++;
+            try {
+                nthdayOfWeek = Integer.parseInt(s.substring(i));
+                if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
+                    throw new Exception();
+                }
+            } catch (Exception e) {
+                throw new ParseException(
+                        "A numeric value between 1 and 5 must follow the '#' option",
+                        i);
+            }
+
+            TreeSet<Integer> set = getSet(type);
+            set.add(val);
+            i++;
+            return i;
+        }
+
+        if (c == '-') {
+            i++;
+            c = s.charAt(i);
+            int v = Integer.parseInt(String.valueOf(c));
+            end = v;
+            i++;
+            if (i >= s.length()) {
+                addToSet(val, end, 1, type);
+                return i;
+            }
+            c = s.charAt(i);
+            if (c >= '0' && c <= '9') {
+                ValueSet vs = getValue(v, s, i);
+                end = vs.value;
+                i = vs.pos;
+            }
+            if (i < s.length() && ((c = s.charAt(i)) == '/')) {
+                i++;
+                c = s.charAt(i);
+                int v2 = Integer.parseInt(String.valueOf(c));
+                i++;
+                if (i >= s.length()) {
+                    addToSet(val, end, v2, type);
+                    return i;
+                }
+                c = s.charAt(i);
+                if (c >= '0' && c <= '9') {
+                    ValueSet vs = getValue(v2, s, i);
+                    int v3 = vs.value;
+                    addToSet(val, end, v3, type);
+                    i = vs.pos;
+                    return i;
+                } else {
+                    addToSet(val, end, v2, type);
+                    return i;
+                }
+            } else {
+                addToSet(val, end, 1, type);
+                return i;
+            }
+        }
+
+        if (c == '/') {
+            if ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s.charAt(i + 1) == '\t') {
+                throw new ParseException("'/' must be followed by an integer.", i);
+            }
+
+            i++;
+            c = s.charAt(i);
+            int v2 = Integer.parseInt(String.valueOf(c));
+            i++;
+            if (i >= s.length()) {
+                checkIncrementRange(v2, type, i);
+                addToSet(val, end, v2, type);
+                return i;
+            }
+            c = s.charAt(i);
+            if (c >= '0' && c <= '9') {
+                ValueSet vs = getValue(v2, s, i);
+                int v3 = vs.value;
+                checkIncrementRange(v3, type, i);
+                addToSet(val, end, v3, type);
+                i = vs.pos;
+                return i;
+            } else {
+                throw new ParseException("Unexpected character '" + c + "' after '/'", i);
+            }
+        }
+
+        addToSet(val, end, 0, type);
+        i++;
+        return i;
+    }
+
+    public String getCronExpression() {
+        return cronExpression;
+    }
+
+    public String getExpressionSummary() {
+        StringBuilder buf = new StringBuilder();
+
+        buf.append("seconds: ");
+        buf.append(getExpressionSetSummary(seconds));
+        buf.append("\n");
+        buf.append("minutes: ");
+        buf.append(getExpressionSetSummary(minutes));
+        buf.append("\n");
+        buf.append("hours: ");
+        buf.append(getExpressionSetSummary(hours));
+        buf.append("\n");
+        buf.append("daysOfMonth: ");
+        buf.append(getExpressionSetSummary(daysOfMonth));
+        buf.append("\n");
+        buf.append("months: ");
+        buf.append(getExpressionSetSummary(months));
+        buf.append("\n");
+        buf.append("daysOfWeek: ");
+        buf.append(getExpressionSetSummary(daysOfWeek));
+        buf.append("\n");
+        buf.append("lastdayOfWeek: ");
+        buf.append(lastdayOfWeek);
+        buf.append("\n");
+        buf.append("nearestWeekday: ");
+        buf.append(nearestWeekday);
+        buf.append("\n");
+        buf.append("NthDayOfWeek: ");
+        buf.append(nthdayOfWeek);
+        buf.append("\n");
+        buf.append("lastdayOfMonth: ");
+        buf.append(lastdayOfMonth);
+        buf.append("\n");
+        buf.append("years: ");
+        buf.append(getExpressionSetSummary(years));
+        buf.append("\n");
+
+        return buf.toString();
+    }
+
+    protected String getExpressionSetSummary(Set<Integer> set) {
+
+        if (set.contains(NO_SPEC)) {
+            return "?";
+        }
+        if (set.contains(ALL_SPEC)) {
+            return "*";
+        }
+
+        StringBuilder buf = new StringBuilder();
+
+        Iterator<Integer> itr = set.iterator();
+        boolean first = true;
+        while (itr.hasNext()) {
+            Integer iVal = itr.next();
+            String val = iVal.toString();
+            if (!first) {
+                buf.append(",");
+            }
+            buf.append(val);
+            first = false;
+        }
+
+        return buf.toString();
+    }
+
+    protected String getExpressionSetSummary(ArrayList<Integer> list) {
+
+        if (list.contains(NO_SPEC)) {
+            return "?";
+        }
+        if (list.contains(ALL_SPEC)) {
+            return "*";
+        }
+
+        StringBuilder buf = new StringBuilder();
+
+        Iterator<Integer> itr = list.iterator();
+        boolean first = true;
+        while (itr.hasNext()) {
+            Integer iVal = itr.next();
+            String val = iVal.toString();
+            if (!first) {
+                buf.append(",");
+            }
+            buf.append(val);
+            first = false;
+        }
+
+        return buf.toString();
+    }
+
+    protected int skipWhiteSpace(int i, String s) {
+        for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\t'); i++) {
+        }
+
+        return i;
+    }
+
+    protected int findNextWhiteSpace(int i, String s) {
+        for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\t'); i++) {
+        }
+
+        return i;
+    }
+
+    protected void addToSet(int val, int end, int incr, int type)
+            throws ParseException {
+
+        TreeSet<Integer> set = getSet(type);
+
+        if (type == SECOND || type == MINUTE) {
+            if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) {
+                throw new ParseException(
+                        "Minute and Second values must be between 0 and 59",
+                        -1);
+            }
+        } else if (type == HOUR) {
+            if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) {
+                throw new ParseException(
+                        "Hour values must be between 0 and 23", -1);
+            }
+        } else if (type == DAY_OF_MONTH) {
+            if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT)
+                    && (val != NO_SPEC_INT)) {
+                throw new ParseException(
+                        "Day of month values must be between 1 and 31", -1);
+            }
+        } else if (type == MONTH) {
+            if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) {
+                throw new ParseException(
+                        "Month values must be between 1 and 12", -1);
+            }
+        } else if (type == DAY_OF_WEEK) {
+            if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT)
+                    && (val != NO_SPEC_INT)) {
+                throw new ParseException(
+                        "Day-of-Week values must be between 1 and 7", -1);
+            }
+        }
+
+        if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {
+            if (val != -1) {
+                set.add(val);
+            } else {
+                set.add(NO_SPEC);
+            }
+
+            return;
+        }
+
+        int startAt = val;
+        int stopAt = end;
+
+        if (val == ALL_SPEC_INT && incr <= 0) {
+            incr = 1;
+            set.add(ALL_SPEC); // put in a marker, but also fill values
+        }
+
+        if (type == SECOND || type == MINUTE) {
+            if (stopAt == -1) {
+                stopAt = 59;
+            }
+            if (startAt == -1 || startAt == ALL_SPEC_INT) {
+                startAt = 0;
+            }
+        } else if (type == HOUR) {
+            if (stopAt == -1) {
+                stopAt = 23;
+            }
+            if (startAt == -1 || startAt == ALL_SPEC_INT) {
+                startAt = 0;
+            }
+        } else if (type == DAY_OF_MONTH) {
+            if (stopAt == -1) {
+                stopAt = 31;
+            }
+            if (startAt == -1 || startAt == ALL_SPEC_INT) {
+                startAt = 1;
+            }
+        } else if (type == MONTH) {
+            if (stopAt == -1) {
+                stopAt = 12;
+            }
+            if (startAt == -1 || startAt == ALL_SPEC_INT) {
+                startAt = 1;
+            }
+        } else if (type == DAY_OF_WEEK) {
+            if (stopAt == -1) {
+                stopAt = 7;
+            }
+            if (startAt == -1 || startAt == ALL_SPEC_INT) {
+                startAt = 1;
+            }
+        } else if (type == YEAR) {
+            if (stopAt == -1) {
+                stopAt = MAX_YEAR;
+            }
+            if (startAt == -1 || startAt == ALL_SPEC_INT) {
+                startAt = 1970;
+            }
+        }
+
+        // if the end of the range is before the start, then we need to overflow into
+        // the next day, month etc. This is done by adding the maximum amount for that
+        // type, and using modulus max to determine the value being added.
+        int max = -1;
+        if (stopAt < startAt) {
+            switch (type) {
+                case SECOND:
+                    max = 60;
+                    break;
+                case MINUTE:
+                    max = 60;
+                    break;
+                case HOUR:
+                    max = 24;
+                    break;
+                case MONTH:
+                    max = 12;
+                    break;
+                case DAY_OF_WEEK:
+                    max = 7;
+                    break;
+                case DAY_OF_MONTH:
+                    max = 31;
+                    break;
+                case YEAR:
+                    throw new IllegalArgumentException("Start year must be less than stop year");
+                default:
+                    throw new IllegalArgumentException("Unexpected type encountered");
+            }
+            stopAt += max;
+        }
+
+        for (int i = startAt; i <= stopAt; i += incr) {
+            if (max == -1) {
+                // ie: there's no max to overflow over
+                set.add(i);
+            } else {
+                // take the modulus to get the real value
+                int i2 = i % max;
+
+                // 1-indexed ranges should not include 0, and should include their max
+                if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH)) {
+                    i2 = max;
+                }
+
+                set.add(i2);
+            }
+        }
+    }
+
+    TreeSet<Integer> getSet(int type) {
+        switch (type) {
+            case SECOND:
+                return seconds;
+            case MINUTE:
+                return minutes;
+            case HOUR:
+                return hours;
+            case DAY_OF_MONTH:
+                return daysOfMonth;
+            case MONTH:
+                return months;
+            case DAY_OF_WEEK:
+                return daysOfWeek;
+            case YEAR:
+                return years;
+            default:
+                return null;
+        }
+    }
+
+    protected ValueSet getValue(int v, String s, int i) {
+        char c = s.charAt(i);
+        StringBuilder s1 = new StringBuilder(String.valueOf(v));
+        while (c >= '0' && c <= '9') {
+            s1.append(c);
+            i++;
+            if (i >= s.length()) {
+                break;
+            }
+            c = s.charAt(i);
+        }
+        ValueSet val = new ValueSet();
+
+        val.pos = (i < s.length()) ? i : i + 1;
+        val.value = Integer.parseInt(s1.toString());
+        return val;
+    }
+
+    protected int getNumericValue(String s, int i) {
+        int endOfVal = findNextWhiteSpace(i, s);
+        String val = s.substring(i, endOfVal);
+        return Integer.parseInt(val);
+    }
+
+    protected int getMonthNumber(String s) {
+        Integer integer = monthMap.get(s);
+
+        if (integer == null) {
+            return -1;
+        }
+
+        return integer;
+    }
+
+    protected int getDayOfWeekNumber(String s) {
+        Integer integer = dayMap.get(s);
+
+        if (integer == null) {
+            return -1;
+        }
+
+        return integer;
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
+    //
+    // Computation Functions
+    //
+    ////////////////////////////////////////////////////////////////////////////
+
+    public Date getTimeAfter(Date afterTime) {
+
+        // Computation is based on Gregorian year only.
+        Calendar cl = new GregorianCalendar(getTimeZone());
+
+        // move ahead one second, since we're computing the time *after* the
+        // given time
+        afterTime = new Date(afterTime.getTime() + 1000);
+        // CronTrigger does not deal with milliseconds
+        cl.setTime(afterTime);
+        cl.set(Calendar.MILLISECOND, 0);
+
+        boolean gotOne = false;
+        // loop until we've computed the next time, or we've past the endTime
+        while (!gotOne) {
+
+            //if (endTime != null && cl.getTime().after(endTime)) return null;
+            if (cl.get(Calendar.YEAR) > 2999) { // prevent endless loop...
+                return null;
+            }
+
+            SortedSet<Integer> st = null;
+            int t = 0;
+
+            int sec = cl.get(Calendar.SECOND);
+            int min = cl.get(Calendar.MINUTE);
+
+            // get second.................................................
+            st = seconds.tailSet(sec);
+            if (st != null && st.size() != 0) {
+                sec = st.first();
+            } else {
+                sec = seconds.first();
+                min++;
+                cl.set(Calendar.MINUTE, min);
+            }
+            cl.set(Calendar.SECOND, sec);
+
+            min = cl.get(Calendar.MINUTE);
+            int hr = cl.get(Calendar.HOUR_OF_DAY);
+            t = -1;
+
+            // get minute.................................................
+            st = minutes.tailSet(min);
+            if (st != null && st.size() != 0) {
+                t = min;
+                min = st.first();
+            } else {
+                min = minutes.first();
+                hr++;
+            }
+            if (min != t) {
+                cl.set(Calendar.SECOND, 0);
+                cl.set(Calendar.MINUTE, min);
+                setCalendarHour(cl, hr);
+                continue;
+            }
+            cl.set(Calendar.MINUTE, min);
+
+            hr = cl.get(Calendar.HOUR_OF_DAY);
+            int day = cl.get(Calendar.DAY_OF_MONTH);
+            t = -1;
+
+            // get hour...................................................
+            st = hours.tailSet(hr);
+            if (st != null && st.size() != 0) {
+                t = hr;
+                hr = st.first();
+            } else {
+                hr = hours.first();
+                day++;
+            }
+            if (hr != t) {
+                cl.set(Calendar.SECOND, 0);
+                cl.set(Calendar.MINUTE, 0);
+                cl.set(Calendar.DAY_OF_MONTH, day);
+                setCalendarHour(cl, hr);
+                continue;
+            }
+            cl.set(Calendar.HOUR_OF_DAY, hr);
+
+            day = cl.get(Calendar.DAY_OF_MONTH);
+            int mon = cl.get(Calendar.MONTH) + 1;
+            // '+ 1' because calendar is 0-based for this field, and we are
+            // 1-based
+            t = -1;
+            int tmon = mon;
+
+            // get day...................................................
+            boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC);
+            boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC);
+            if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule
+                st = daysOfMonth.tailSet(day);
+                if (lastdayOfMonth) {
+                    if (!nearestWeekday) {
+                        t = day;
+                        day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+                        day -= lastdayOffset;
+                        if (t > day) {
+                            mon++;
+                            if (mon > 12) {
+                                mon = 1;
+                                tmon = 3333; // ensure test of mon != tmon further below fails
+                                cl.add(Calendar.YEAR, 1);
+                            }
+                            day = 1;
+                        }
+                    } else {
+                        t = day;
+                        day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+                        day -= lastdayOffset;
+
+                        Calendar tcal = Calendar.getInstance(getTimeZone());
+                        tcal.set(Calendar.SECOND, 0);
+                        tcal.set(Calendar.MINUTE, 0);
+                        tcal.set(Calendar.HOUR_OF_DAY, 0);
+                        tcal.set(Calendar.DAY_OF_MONTH, day);
+                        tcal.set(Calendar.MONTH, mon - 1);
+                        tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));
+
+                        int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+                        int dow = tcal.get(Calendar.DAY_OF_WEEK);
+
+                        if (dow == Calendar.SATURDAY && day == 1) {
+                            day += 2;
+                        } else if (dow == Calendar.SATURDAY) {
+                            day -= 1;
+                        } else if (dow == Calendar.SUNDAY && day == ldom) {
+                            day -= 2;
+                        } else if (dow == Calendar.SUNDAY) {
+                            day += 1;
+                        }
+
+                        tcal.set(Calendar.SECOND, sec);
+                        tcal.set(Calendar.MINUTE, min);
+                        tcal.set(Calendar.HOUR_OF_DAY, hr);
+                        tcal.set(Calendar.DAY_OF_MONTH, day);
+                        tcal.set(Calendar.MONTH, mon - 1);
+                        Date nTime = tcal.getTime();
+                        if (nTime.before(afterTime)) {
+                            day = 1;
+                            mon++;
+                        }
+                    }
+                } else if (nearestWeekday) {
+                    t = day;
+                    day = daysOfMonth.first();
+
+                    Calendar tcal = Calendar.getInstance(getTimeZone());
+                    tcal.set(Calendar.SECOND, 0);
+                    tcal.set(Calendar.MINUTE, 0);
+                    tcal.set(Calendar.HOUR_OF_DAY, 0);
+                    tcal.set(Calendar.DAY_OF_MONTH, day);
+                    tcal.set(Calendar.MONTH, mon - 1);
+                    tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));
+
+                    int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+                    int dow = tcal.get(Calendar.DAY_OF_WEEK);
+
+                    if (dow == Calendar.SATURDAY && day == 1) {
+                        day += 2;
+                    } else if (dow == Calendar.SATURDAY) {
+                        day -= 1;
+                    } else if (dow == Calendar.SUNDAY && day == ldom) {
+                        day -= 2;
+                    } else if (dow == Calendar.SUNDAY) {
+                        day += 1;
+                    }
+
+
+                    tcal.set(Calendar.SECOND, sec);
+                    tcal.set(Calendar.MINUTE, min);
+                    tcal.set(Calendar.HOUR_OF_DAY, hr);
+                    tcal.set(Calendar.DAY_OF_MONTH, day);
+                    tcal.set(Calendar.MONTH, mon - 1);
+                    Date nTime = tcal.getTime();
+                    if (nTime.before(afterTime)) {
+                        day = daysOfMonth.first();
+                        mon++;
+                    }
+                } else if (st != null && st.size() != 0) {
+                    t = day;
+                    day = st.first();
+                    // make sure we don't over-run a short month, such as february
+                    int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+                    if (day > lastDay) {
+                        day = daysOfMonth.first();
+                        mon++;
+                    }
+                } else {
+                    day = daysOfMonth.first();
+                    mon++;
+                }
+
+                if (day != t || mon != tmon) {
+                    cl.set(Calendar.SECOND, 0);
+                    cl.set(Calendar.MINUTE, 0);
+                    cl.set(Calendar.HOUR_OF_DAY, 0);
+                    cl.set(Calendar.DAY_OF_MONTH, day);
+                    cl.set(Calendar.MONTH, mon - 1);
+                    // '- 1' because calendar is 0-based for this field, and we
+                    // are 1-based
+                    continue;
+                }
+            } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule
+                if (lastdayOfWeek) { // are we looking for the last XXX day of
+                    // the month?
+                    int dow = daysOfWeek.first(); // desired
+                    // d-o-w
+                    int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
+                    int daysToAdd = 0;
+                    if (cDow < dow) {
+                        daysToAdd = dow - cDow;
+                    }
+                    if (cDow > dow) {
+                        daysToAdd = dow + (7 - cDow);
+                    }
+
+                    int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+
+                    if (day + daysToAdd > lDay) { // did we already miss the
+                        // last one?
+                        cl.set(Calendar.SECOND, 0);
+                        cl.set(Calendar.MINUTE, 0);
+                        cl.set(Calendar.HOUR_OF_DAY, 0);
+                        cl.set(Calendar.DAY_OF_MONTH, 1);
+                        cl.set(Calendar.MONTH, mon);
+                        // no '- 1' here because we are promoting the month
+                        continue;
+                    }
+
+                    // find date of last occurrence of this day in this month...
+                    while ((day + daysToAdd + 7) <= lDay) {
+                        daysToAdd += 7;
+                    }
+
+                    day += daysToAdd;
+
+                    if (daysToAdd > 0) {
+                        cl.set(Calendar.SECOND, 0);
+                        cl.set(Calendar.MINUTE, 0);
+                        cl.set(Calendar.HOUR_OF_DAY, 0);
+                        cl.set(Calendar.DAY_OF_MONTH, day);
+                        cl.set(Calendar.MONTH, mon - 1);
+                        // '- 1' here because we are not promoting the month
+                        continue;
+                    }
+
+                } else if (nthdayOfWeek != 0) {
+                    // are we looking for the Nth XXX day in the month?
+                    int dow = daysOfWeek.first(); // desired
+                    // d-o-w
+                    int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
+                    int daysToAdd = 0;
+                    if (cDow < dow) {
+                        daysToAdd = dow - cDow;
+                    } else if (cDow > dow) {
+                        daysToAdd = dow + (7 - cDow);
+                    }
+
+                    boolean dayShifted = false;
+                    if (daysToAdd > 0) {
+                        dayShifted = true;
+                    }
+
+                    day += daysToAdd;
+                    int weekOfMonth = day / 7;
+                    if (day % 7 > 0) {
+                        weekOfMonth++;
+                    }
+
+                    daysToAdd = (nthdayOfWeek - weekOfMonth) * 7;
+                    day += daysToAdd;
+                    if (daysToAdd < 0
+                            || day > getLastDayOfMonth(mon, cl
+                            .get(Calendar.YEAR))) {
+                        cl.set(Calendar.SECOND, 0);
+                        cl.set(Calendar.MINUTE, 0);
+                        cl.set(Calendar.HOUR_OF_DAY, 0);
+                        cl.set(Calendar.DAY_OF_MONTH, 1);
+                        cl.set(Calendar.MONTH, mon);
+                        // no '- 1' here because we are promoting the month
+                        continue;
+                    } else if (daysToAdd > 0 || dayShifted) {
+                        cl.set(Calendar.SECOND, 0);
+                        cl.set(Calendar.MINUTE, 0);
+                        cl.set(Calendar.HOUR_OF_DAY, 0);
+                        cl.set(Calendar.DAY_OF_MONTH, day);
+                        cl.set(Calendar.MONTH, mon - 1);
+                        // '- 1' here because we are NOT promoting the month
+                        continue;
+                    }
+                } else {
+                    int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w
+                    int dow = daysOfWeek.first(); // desired
+                    // d-o-w
+                    st = daysOfWeek.tailSet(cDow);
+                    if (st != null && st.size() > 0) {
+                        dow = st.first();
+                    }
+
+                    int daysToAdd = 0;
+                    if (cDow < dow) {
+                        daysToAdd = dow - cDow;
+                    }
+                    if (cDow > dow) {
+                        daysToAdd = dow + (7 - cDow);
+                    }
+
+                    int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));
+
+                    if (day + daysToAdd > lDay) { // will we pass the end of
+                        // the month?
+                        cl.set(Calendar.SECOND, 0);
+                        cl.set(Calendar.MINUTE, 0);
+                        cl.set(Calendar.HOUR_OF_DAY, 0);
+                        cl.set(Calendar.DAY_OF_MONTH, 1);
+                        cl.set(Calendar.MONTH, mon);
+                        // no '- 1' here because we are promoting the month
+                        continue;
+                    } else if (daysToAdd > 0) { // are we swithing days?
+                        cl.set(Calendar.SECOND, 0);
+                        cl.set(Calendar.MINUTE, 0);
+                        cl.set(Calendar.HOUR_OF_DAY, 0);
+                        cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd);
+                        cl.set(Calendar.MONTH, mon - 1);
+                        // '- 1' because calendar is 0-based for this field,
+                        // and we are 1-based
+                        continue;
+                    }
+                }
+            } else { // dayOfWSpec && !dayOfMSpec
+                throw new UnsupportedOperationException(
+                        "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.");
+            }
+            cl.set(Calendar.DAY_OF_MONTH, day);
+
+            mon = cl.get(Calendar.MONTH) + 1;
+            // '+ 1' because calendar is 0-based for this field, and we are
+            // 1-based
+            int year = cl.get(Calendar.YEAR);
+            t = -1;
+
+            // test for expressions that never generate a valid fire date,
+            // but keep looping...
+            if (year > MAX_YEAR) {
+                return null;
+            }
+
+            // get month...................................................
+            st = months.tailSet(mon);
+            if (st != null && st.size() != 0) {
+                t = mon;
+                mon = st.first();
+            } else {
+                mon = months.first();
+                year++;
+            }
+            if (mon != t) {
+                cl.set(Calendar.SECOND, 0);
+                cl.set(Calendar.MINUTE, 0);
+                cl.set(Calendar.HOUR_OF_DAY, 0);
+                cl.set(Calendar.DAY_OF_MONTH, 1);
+                cl.set(Calendar.MONTH, mon - 1);
+                // '- 1' because calendar is 0-based for this field, and we are
+                // 1-based
+                cl.set(Calendar.YEAR, year);
+                continue;
+            }
+            cl.set(Calendar.MONTH, mon - 1);
+            // '- 1' because calendar is 0-based for this field, and we are
+            // 1-based
+
+            year = cl.get(Calendar.YEAR);
+            t = -1;
+
+            // get year...................................................
+            st = years.tailSet(year);
+            if (st != null && st.size() != 0) {
+                t = year;
+                year = st.first();
+            } else {
+                return null; // ran out of years...
+            }
+
+            if (year != t) {
+                cl.set(Calendar.SECOND, 0);
+                cl.set(Calendar.MINUTE, 0);
+                cl.set(Calendar.HOUR_OF_DAY, 0);
+                cl.set(Calendar.DAY_OF_MONTH, 1);
+                cl.set(Calendar.MONTH, 0);
+                // '- 1' because calendar is 0-based for this field, and we are
+                // 1-based
+                cl.set(Calendar.YEAR, year);
+                continue;
+            }
+            cl.set(Calendar.YEAR, year);
+
+            gotOne = true;
+        } // while( !done )
+
+        return cl.getTime();
+    }
+
+    protected void setCalendarHour(Calendar cal, int hour) {
+        cal.set(Calendar.HOUR_OF_DAY, hour);
+        if (cal.get(Calendar.HOUR_OF_DAY) != hour && hour != 24) {
+            cal.set(Calendar.HOUR_OF_DAY, hour + 1);
+        }
+    }
+
+    public Date getTimeBefore(Date endTime) {
+        // FUTURE_TODO: implement QUARTZ-423
+        return null;
+    }
+
+    public Date getFinalFireTime() {
+        // FUTURE_TODO: implement QUARTZ-423
+        return null;
+    }
+
+    protected boolean isLeapYear(int year) {
+        return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
+    }
+
+    protected int getLastDayOfMonth(int monthNum, int year) {
+
+        switch (monthNum) {
+            case 1:
+                return 31;
+            case 2:
+                return (isLeapYear(year)) ? 29 : 28;
+            case 3:
+                return 31;
+            case 4:
+                return 30;
+            case 5:
+                return 31;
+            case 6:
+                return 30;
+            case 7:
+                return 31;
+            case 8:
+                return 31;
+            case 9:
+                return 30;
+            case 10:
+                return 31;
+            case 11:
+                return 30;
+            case 12:
+                return 31;
+            default:
+                throw new IllegalArgumentException("Illegal month number: "
+                        + monthNum);
+        }
+    }
+
+
+    private void readObject(java.io.ObjectInputStream stream)
+            throws java.io.IOException, ClassNotFoundException {
+
+        stream.defaultReadObject();
+        try {
+            buildExpression(cronExpression);
+        } catch (Exception ignore) {
+        } // never happens
+    }
+
+    @Override
+    @Deprecated
+    public Object clone() {
+        return new CronExpression(this);
+    }
+}
+
+class ValueSet {
+    public int value;
+
+    public int pos;
+}
diff --git a/src/main/java/org/springblade/xxljob/jobhandler/DataHandleJob.java b/src/main/java/org/springblade/xxljob/jobhandler/DataHandleJob.java
new file mode 100644
index 0000000..66ae3f7
--- /dev/null
+++ b/src/main/java/org/springblade/xxljob/jobhandler/DataHandleJob.java
@@ -0,0 +1,59 @@
+package org.springblade.xxljob.jobhandler;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.apache.logging.log4j.util.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.modules.resource.service.IAttachDataService;
+import org.springblade.modules.system.service.ILogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 数据处理任务
+ * @author zhongrj
+ * @date 2024-05-25
+ */
+@Component
+public class DataHandleJob {
+
+	private static Logger logger = LoggerFactory.getLogger(LabelHandleJob.class);
+
+	@Autowired
+	private ILogService logService;
+
+	@Autowired
+	private IAttachDataService attachDataService;
+
+	/**
+	 * 清理时间范围外的日志记录信息
+	 */
+	@XxlJob("logJobHandler")
+	public void logJobHandler (String param){
+		XxlJobHelper.log("开始执行任务...清理时间范围外的日志记录信息");
+		// 解析参数
+		JSONObject jsonParam = JSON.parseObject(param);
+//		String dayString = jsonParam.getString("day");
+		// 开始执行
+		boolean result = logService.removeLogs(param);
+		XxlJobHelper.log("任务响应结果..." + result);
+		// 结束
+		XxlJobHelper.log("结束自动创建任务...");
+	}
+
+	/**
+	 * 附件临时文件信息清理
+	 */
+	@XxlJob("attachDataJobHandler")
+	public void attachDataJobHandler (String param){
+		XxlJobHelper.log("开始执行任务...附件临时文件信息清理");
+		// 开始执行
+		boolean result = attachDataService.removeBladeAttachDatas(param);
+		XxlJobHelper.log("任务响应结果..." + result);
+		// 结束
+		XxlJobHelper.log("结束自动创建任务...");
+	}
+}
diff --git a/src/main/java/org/springblade/xxljob/jobhandler/SynchronizationEhjb.java b/src/main/java/org/springblade/xxljob/jobhandler/SynchronizationEhjb.java
new file mode 100644
index 0000000..dcb4d89
--- /dev/null
+++ b/src/main/java/org/springblade/xxljob/jobhandler/SynchronizationEhjb.java
@@ -0,0 +1,53 @@
+package org.springblade.xxljob.jobhandler;
+
+import cn.hutool.core.date.DatePattern;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.modules.eCallEventTwo.dto.EcOrderParamDTO;
+import org.springblade.modules.eCallEventTwo.service.EcOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.ChronoUnit;
+
+@Component
+public class SynchronizationEhjb {
+
+
+	@Autowired
+	private EcOrderService ecOrderService;
+
+	@XxlJob("ehjbJobHandler")
+	public void ehjbJobHandler() {
+		String param = XxlJobHelper.getJobParam();
+
+		XxlJobHelper.log("开始执行任务..." + param);
+
+		// 校园安全检查
+		// 根据类型创建任务
+		XxlJobHelper.log("开始执行任务...E呼即办定时任务");
+		LocalDateTime localDateTime;
+		if (StringUtils.isNotBlank(param)) {
+			// 时间字符串转LocalDateTime
+			localDateTime = cn.hutool.core.date.DateUtil.parseLocalDateTime(param, DatePattern.NORM_DATETIME_PATTERN);
+		} else {
+			// 获取当前日期时间
+			localDateTime = LocalDateTime.now();
+		}
+		// 创建居住证发送短信定时任务
+		EcOrderParamDTO ecOrderParamDTO = new EcOrderParamDTO();
+		// 获取前一天的开始时间
+		LocalDateTime yesterdayStart = localDateTime.minus(1, ChronoUnit.DAYS).with(LocalTime.MIN);
+		// 获取前一天的结束时间
+		LocalDateTime yesterdayEnd = localDateTime.minus(1, ChronoUnit.DAYS).with(LocalTime.MAX);
+		ecOrderParamDTO.setEndTime(yesterdayEnd.format(DateUtil.DATETIME_FORMATTER));
+		ecOrderParamDTO.setStartTime(yesterdayStart.format(DateUtil.DATETIME_FORMATTER));
+		boolean result = ecOrderService.SynchronizeData(ecOrderParamDTO);
+		XxlJobHelper.log("任务响应结果..." + result);
+		XxlJobHelper.log("E呼即办定时任务-结束自动创建任务...");
+	}
+}
diff --git a/src/main/java/org/springblade/xxljob/util/CookieUtil.java b/src/main/java/org/springblade/xxljob/util/CookieUtil.java
new file mode 100644
index 0000000..6cd7c8e
--- /dev/null
+++ b/src/main/java/org/springblade/xxljob/util/CookieUtil.java
@@ -0,0 +1,98 @@
+package org.springblade.xxljob.util;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Cookie.Util
+ *
+ * @author liyh
+ */
+public class CookieUtil {
+
+    // 默认缓存时间,单位/秒, 2H
+    private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE;
+    // 保存路径,根路径
+    private static final String COOKIE_PATH = "/";
+
+    /**
+     * 保存
+     *
+     * @param response
+     * @param key
+     * @param value
+     * @param ifRemember
+     */
+    public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) {
+        int age = ifRemember ? COOKIE_MAX_AGE : -1;
+        set(response, key, value, null, COOKIE_PATH, age, true);
+    }
+
+    /**
+     * 保存
+     *
+     * @param response
+     * @param key
+     * @param value
+     * @param maxAge
+     */
+    private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) {
+        Cookie cookie = new Cookie(key, value);
+        if (domain != null) {
+            cookie.setDomain(domain);
+        }
+        cookie.setPath(path);
+        cookie.setMaxAge(maxAge);
+        cookie.setHttpOnly(isHttpOnly);
+        response.addCookie(cookie);
+    }
+
+    /**
+     * 查询value
+     *
+     * @param request
+     * @param key
+     * @return
+     */
+    public static String getValue(HttpServletRequest request, String key) {
+        Cookie cookie = get(request, key);
+        if (cookie != null) {
+            return cookie.getValue();
+        }
+        return null;
+    }
+
+    /**
+     * 查询Cookie
+     *
+     * @param request
+     * @param key
+     */
+    private static Cookie get(HttpServletRequest request, String key) {
+        Cookie[] arr_cookie = request.getCookies();
+        if (arr_cookie != null && arr_cookie.length > 0) {
+            for (Cookie cookie : arr_cookie) {
+                if (cookie.getName().equals(key)) {
+                    return cookie;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 删除Cookie
+     *
+     * @param request
+     * @param response
+     * @param key
+     */
+    public static void remove(HttpServletRequest request, HttpServletResponse response, String key) {
+        Cookie cookie = get(request, key);
+        if (cookie != null) {
+            set(response, key, "", null, COOKIE_PATH, 0, true);
+        }
+    }
+
+}
diff --git a/src/main/java/org/springblade/xxljob/util/JacksonUtil.java b/src/main/java/org/springblade/xxljob/util/JacksonUtil.java
new file mode 100644
index 0000000..1a7dd3a
--- /dev/null
+++ b/src/main/java/org/springblade/xxljob/util/JacksonUtil.java
@@ -0,0 +1,93 @@
+package org.springblade.xxljob.util;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+/**
+ * Jackson util
+ * <p>
+ * 1、obj need private and set/get;
+ * 2、do not support inner class;
+ *
+ * @author liyh
+ */
+public class JacksonUtil {
+    private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
+
+    private final static ObjectMapper objectMapper = new ObjectMapper();
+
+    public static ObjectMapper getInstance() {
+        return objectMapper;
+    }
+
+    /**
+     * bean、array、List、Map --> json
+     *
+     * @param obj
+     * @return json string
+     * @throws Exception
+     */
+    public static String writeValueAsString(Object obj) {
+        try {
+            return getInstance().writeValueAsString(obj);
+        } catch (JsonGenerationException e) {
+            logger.error(e.getMessage(), e);
+        } catch (JsonMappingException e) {
+            logger.error(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * string --> bean、Map、List(array)
+     *
+     * @param jsonStr
+     * @param clazz
+     * @return obj
+     * @throws Exception
+     */
+    public static <T> T readValue(String jsonStr, Class<T> clazz) {
+        try {
+            return getInstance().readValue(jsonStr, clazz);
+        } catch (JsonParseException e) {
+            logger.error(e.getMessage(), e);
+        } catch (JsonMappingException e) {
+            logger.error(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * string --> List<Bean>...
+     *
+     * @param jsonStr
+     * @param parametrized
+     * @param parameterClasses
+     * @param <T>
+     * @return
+     */
+    public static <T> T readValue(String jsonStr, Class<?> parametrized, Class<?>... parameterClasses) {
+        try {
+            JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses);
+            return getInstance().readValue(jsonStr, javaType);
+        } catch (JsonParseException e) {
+            logger.error(e.getMessage(), e);
+        } catch (JsonMappingException e) {
+            logger.error(e.getMessage(), e);
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/org/springblade/xxljob/util/LocalCacheUtil.java b/src/main/java/org/springblade/xxljob/util/LocalCacheUtil.java
new file mode 100644
index 0000000..929e77f
--- /dev/null
+++ b/src/main/java/org/springblade/xxljob/util/LocalCacheUtil.java
@@ -0,0 +1,134 @@
+package org.springblade.xxljob.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * local cache tool
+ *
+ * @author liyh
+ */
+public class LocalCacheUtil {
+
+    private static ConcurrentMap<String, LocalCacheData> cacheRepository = new ConcurrentHashMap<String, LocalCacheData>();   // 类型建议用抽象父类,兼容性更好;
+
+    private static class LocalCacheData {
+        private String key;
+        private Object val;
+        private long timeoutTime;
+
+        public LocalCacheData() {
+        }
+
+        public LocalCacheData(String key, Object val, long timeoutTime) {
+            this.key = key;
+            this.val = val;
+            this.timeoutTime = timeoutTime;
+        }
+
+        public String getKey() {
+            return key;
+        }
+
+        public void setKey(String key) {
+            this.key = key;
+        }
+
+        public Object getVal() {
+            return val;
+        }
+
+        public void setVal(Object val) {
+            this.val = val;
+        }
+
+        public long getTimeoutTime() {
+            return timeoutTime;
+        }
+
+        public void setTimeoutTime(long timeoutTime) {
+            this.timeoutTime = timeoutTime;
+        }
+    }
+
+
+    /**
+     * set cache
+     *
+     * @param key
+     * @param val
+     * @param cacheTime
+     * @return
+     */
+    public static boolean set(String key, Object val, long cacheTime) {
+
+        // clean timeout cache, before set new cache (avoid cache too much)
+        cleanTimeoutCache();
+
+        // set new cache
+        if (key == null || key.trim().length() == 0) {
+            return false;
+        }
+        if (val == null) {
+            remove(key);
+        }
+        if (cacheTime <= 0) {
+            remove(key);
+        }
+        long timeoutTime = System.currentTimeMillis() + cacheTime;
+        LocalCacheData localCacheData = new LocalCacheData(key, val, timeoutTime);
+        cacheRepository.put(localCacheData.getKey(), localCacheData);
+        return true;
+    }
+
+    /**
+     * remove cache
+     *
+     * @param key
+     * @return
+     */
+    public static boolean remove(String key) {
+        if (key == null || key.trim().length() == 0) {
+            return false;
+        }
+        cacheRepository.remove(key);
+        return true;
+    }
+
+    /**
+     * get cache
+     *
+     * @param key
+     * @return
+     */
+    public static Object get(String key) {
+        if (key == null || key.trim().length() == 0) {
+            return null;
+        }
+        LocalCacheData localCacheData = cacheRepository.get(key);
+        if (localCacheData != null && System.currentTimeMillis() < localCacheData.getTimeoutTime()) {
+            return localCacheData.getVal();
+        } else {
+            remove(key);
+            return null;
+        }
+    }
+
+    /**
+     * clean timeout cache
+     *
+     * @return
+     */
+    public static boolean cleanTimeoutCache() {
+        if (!cacheRepository.keySet().isEmpty()) {
+            for (String key : cacheRepository.keySet()) {
+                LocalCacheData localCacheData = cacheRepository.get(key);
+                if (localCacheData != null && System.currentTimeMillis() >= localCacheData.getTimeoutTime()) {
+                    cacheRepository.remove(key);
+                }
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/src/main/java/org/yaml/snakeyaml/representer/Representer.java b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
new file mode 100644
index 0000000..cc799e0
--- /dev/null
+++ b/src/main/java/org/yaml/snakeyaml/representer/Representer.java
@@ -0,0 +1,198 @@
+package org.yaml.snakeyaml.representer;
+
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.introspector.Property;
+import org.yaml.snakeyaml.introspector.PropertyUtils;
+import org.yaml.snakeyaml.nodes.*;
+
+import java.util.*;
+
+public class Representer extends SafeRepresenter {
+	protected Map<Class<? extends Object>, TypeDescription> typeDefinitions = Collections.emptyMap();
+
+	public Representer() {
+		super(new DumperOptions());
+		this.representers.put((Class<?>) null, new RepresentJavaBean());
+	}
+	public Representer(DumperOptions options) {
+		super(options);
+		this.representers.put((Class<?>) null, new RepresentJavaBean());
+	}
+
+	public TypeDescription addTypeDescription(TypeDescription td) {
+		if (Collections.EMPTY_MAP == this.typeDefinitions) {
+			this.typeDefinitions = new HashMap();
+		}
+
+		if (td.getTag() != null) {
+			this.addClassTag(td.getType(), td.getTag());
+		}
+
+		td.setPropertyUtils(this.getPropertyUtils());
+		return (TypeDescription) this.typeDefinitions.put(td.getType(), td);
+	}
+
+	public void setPropertyUtils(PropertyUtils propertyUtils) {
+		super.setPropertyUtils(propertyUtils);
+		Collection<TypeDescription> tds = this.typeDefinitions.values();
+		Iterator var3 = tds.iterator();
+
+		while (var3.hasNext()) {
+			TypeDescription typeDescription = (TypeDescription) var3.next();
+			typeDescription.setPropertyUtils(propertyUtils);
+		}
+
+	}
+
+	protected MappingNode representJavaBean(Set<Property> properties, Object javaBean) {
+		List<NodeTuple> value = new ArrayList(properties.size());
+		Tag customTag = (Tag) this.classTags.get(javaBean.getClass());
+		Tag tag = customTag != null ? customTag : new Tag(javaBean.getClass());
+		MappingNode node = new MappingNode(tag, value, DumperOptions.FlowStyle.AUTO);
+		this.representedObjects.put(javaBean, node);
+		DumperOptions.FlowStyle bestStyle = DumperOptions.FlowStyle.FLOW;
+		Iterator var8 = properties.iterator();
+
+		while (true) {
+			NodeTuple tuple;
+			do {
+				if (!var8.hasNext()) {
+					if (this.defaultFlowStyle != DumperOptions.FlowStyle.AUTO) {
+						node.setFlowStyle(this.defaultFlowStyle);
+					} else {
+						node.setFlowStyle(bestStyle);
+					}
+
+					return node;
+				}
+
+				Property property = (Property) var8.next();
+				Object memberValue = property.get(javaBean);
+				Tag customPropertyTag = memberValue == null ? null : (Tag) this.classTags.get(memberValue.getClass());
+				tuple = this.representJavaBeanProperty(javaBean, property, memberValue, customPropertyTag);
+			} while (tuple == null);
+
+			if (!((ScalarNode) tuple.getKeyNode()).isPlain()) {
+				bestStyle = DumperOptions.FlowStyle.BLOCK;
+			}
+
+			Node nodeValue = tuple.getValueNode();
+			if (!(nodeValue instanceof ScalarNode) || !((ScalarNode) nodeValue).isPlain()) {
+				bestStyle = DumperOptions.FlowStyle.BLOCK;
+			}
+
+			value.add(tuple);
+		}
+	}
+
+	protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
+		ScalarNode nodeKey = (ScalarNode) this.representData(property.getName());
+		boolean hasAlias = this.representedObjects.containsKey(propertyValue);
+		Node nodeValue = this.representData(propertyValue);
+		if (propertyValue != null && !hasAlias) {
+			NodeId nodeId = nodeValue.getNodeId();
+			if (customTag == null) {
+				if (nodeId == NodeId.scalar) {
+					if (property.getType() != Enum.class && propertyValue instanceof Enum) {
+						nodeValue.setTag(Tag.STR);
+					}
+				} else {
+					if (nodeId == NodeId.mapping && property.getType() == propertyValue.getClass() && !(propertyValue instanceof Map) && !nodeValue.getTag().equals(Tag.SET)) {
+						nodeValue.setTag(Tag.MAP);
+					}
+
+					this.checkGlobalTag(property, nodeValue, propertyValue);
+				}
+			}
+		}
+
+		return new NodeTuple(nodeKey, nodeValue);
+	}
+
+	protected void checkGlobalTag(Property property, Node node, Object object) {
+		if (!object.getClass().isArray() || !object.getClass().getComponentType().isPrimitive()) {
+			Class<?>[] arguments = property.getActualTypeArguments();
+			if (arguments != null) {
+				Class t;
+				Iterator iter;
+				Iterator var9;
+				if (node.getNodeId() == NodeId.sequence) {
+					t = arguments[0];
+					SequenceNode snode = (SequenceNode) node;
+					Iterable<Object> memberList = Collections.EMPTY_LIST;
+					if (object.getClass().isArray()) {
+						memberList = Arrays.asList((Object[]) object);
+					} else if (object instanceof Iterable) {
+						memberList = (Iterable) object;
+					}
+
+					iter = ((Iterable) memberList).iterator();
+					if (iter.hasNext()) {
+						var9 = snode.getValue().iterator();
+
+						while (var9.hasNext()) {
+							Node childNode = (Node) var9.next();
+							Object member = iter.next();
+							if (member != null && t.equals(member.getClass()) && childNode.getNodeId() == NodeId.mapping) {
+								childNode.setTag(Tag.MAP);
+							}
+						}
+					}
+				} else if (object instanceof Set) {
+					t = arguments[0];
+					MappingNode mnode = (MappingNode) node;
+					iter = mnode.getValue().iterator();
+					Set<?> set = (Set) object;
+					var9 = set.iterator();
+
+					while (var9.hasNext()) {
+						Object member = var9.next();
+						NodeTuple tuple = (NodeTuple) iter.next();
+						Node keyNode = tuple.getKeyNode();
+						if (t.equals(member.getClass()) && keyNode.getNodeId() == NodeId.mapping) {
+							keyNode.setTag(Tag.MAP);
+						}
+					}
+				} else if (object instanceof Map) {
+					t = arguments[0];
+					Class<?> valueType = arguments[1];
+					MappingNode mnode = (MappingNode) node;
+					iter = mnode.getValue().iterator();
+
+					while (iter.hasNext()) {
+						NodeTuple tuple = (NodeTuple) iter.next();
+						this.resetTag(t, tuple.getKeyNode());
+						this.resetTag(valueType, tuple.getValueNode());
+					}
+				}
+			}
+
+		}
+	}
+
+	private void resetTag(Class<? extends Object> type, Node node) {
+		Tag tag = node.getTag();
+		if (tag.matches(type)) {
+			if (Enum.class.isAssignableFrom(type)) {
+				node.setTag(Tag.STR);
+			} else {
+				node.setTag(Tag.MAP);
+			}
+		}
+
+	}
+
+	protected Set<Property> getProperties(Class<? extends Object> type) {
+		return this.typeDefinitions.containsKey(type) ? ((TypeDescription) this.typeDefinitions.get(type)).getProperties() : this.getPropertyUtils().getProperties(type);
+	}
+
+	protected class RepresentJavaBean implements Represent {
+		protected RepresentJavaBean() {
+		}
+
+		public Node representData(Object data) {
+			return Representer.this.representJavaBean(Representer.this.getProperties(data.getClass()), data);
+		}
+	}
+}
diff --git a/src/main/java/sql/report.menu.sql b/src/main/java/sql/report.menu.sql
new file mode 100644
index 0000000..8572899
--- /dev/null
+++ b/src/main/java/sql/report.menu.sql
@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1806128994395938817', 1123598815738675201, 'report', '在线excel设计器', 'menu', '/report/report', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1806128994395938818', '1806128994395938817', 'report_add', '新增', 'add', '/report/report/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1806128994395938819', '1806128994395938817', 'report_edit', '修改', 'edit', '/report/report/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1806128994395938820', '1806128994395938817', 'report_delete', '删除', 'delete', '/api/blade-report/report/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1806128994395938821', '1806128994395938817', 'report_view', '查看', 'view', '/report/report/view', 'file-text', 4, 2, 2, 1, NULL, 0);
diff --git a/src/main/java/sql/reportdb.menu.sql b/src/main/java/sql/reportdb.menu.sql
new file mode 100644
index 0000000..39470aa
--- /dev/null
+++ b/src/main/java/sql/reportdb.menu.sql
@@ -0,0 +1,10 @@
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1805843789026185217', 1123598815738675201, 'reportDb', '数据源', 'menu', '/reportDb/reportDb', NULL, 1, 1, 0, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1805843789026185218', '1805843789026185217', 'reportDb_add', '新增', 'add', '/reportDb/reportDb/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1805843789026185219', '1805843789026185217', 'reportDb_edit', '修改', 'edit', '/reportDb/reportDb/edit', 'form', 2, 2, 2, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1805843789026185220', '1805843789026185217', 'reportDb_delete', '删除', 'delete', '/api/blade-reportDb/reportDb/remove', 'delete', 3, 2, 3, 1, NULL, 0);
+INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('1805843789026185221', '1805843789026185217', 'reportDb_view', '查看', 'view', '/reportDb/reportDb/view', 'file-text', 4, 2, 2, 1, NULL, 0);
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 66da24d..1176469 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -14,7 +14,7 @@
 
 spring:
   datasource:
-    driver-class-name: com.mysql.cj.jdbc.Driver
+#    driver-class-name: com.mysql.cj.jdbc.Driver
     #driver-class-name: org.postgresql.Driver
     #driver-class-name: oracle.jdbc.OracleDriver
     #driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
@@ -25,8 +25,8 @@
       # Oracle校验
       #validation-query: select 1 from dual
       validation-query-timeout: 2000
-      initial-size: 5
-      max-active: 20
+      initial-size: 20
+      max-active: 100
       min-idle: 5
       max-wait: 60000
       test-on-borrow: false
@@ -44,6 +44,12 @@
         exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
         session-stat-enable: true
         session-stat-max-count: 10
+      # 超过时间限制是否回收
+      remove-abandoned: true
+      # 超时时间;单位为秒。180秒=3分钟
+      remove-abandoned-timeout: 180
+      # 关闭abanded连接时输出错误日志
+      log-abandoned: true
   main:
     allow-circular-references: true
   #邮件配置
@@ -144,7 +150,7 @@
   async-executor-activate: false
   async-history-executor-activate: false
 
-#报表配置
+#报表配置--有漏洞关闭--20240613
 report:
   enabled: false
   database:
@@ -192,6 +198,7 @@
   token:
     #是否有状态
     state: false
+    sign-key: CJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiIxNTE3MDcyMDY5NSIsInJlYWxfbmFtZSI6Inpob25nIiwidG9rZW5fdHlwZSI6ImFjY2Vzc190b2tlbiIsInJvbGVfbmFtZSI
   #redis序列化方式
   redis:
     serializer-type: protostuff
@@ -237,7 +244,19 @@
       - /blade-topics/topics/lists
       - /blade-household/household/getHouseholdOtherInfo
       - /blade-resource/oss/endpoint/put-file
+      - /blade-resource/oss/endpoint/put-file-attach-by-prefix-path
       - /blade-hiddenDangerRecord/**
+      - /blade-system/user/getPoliceUser
+      - /blade-policeAlarmRecords/policeAlarmRecords/save
+      - /blade-smsSend/smsSend/send
+      - /blade-system/user/register-user
+      - /blade-eCallEventTwo/eCallEventTwo/synchronizeData
+      - /jmreport/**
+      - /public_discuss/publicDiscuss/publicDiscussTotal
+      - /public_discuss/publicDiscuss/managementProtocol
+      - /blade-place/place/getNearbyPlaceList
+#      - /blade-householdLabel/**
+#      - /blade-system/**
 #      - /blade-doorplateAddress/doorplateAddress/**
 #      - /blade-house/house/**
 #      - /blade-household/household/**
@@ -256,6 +275,8 @@
 #      - /blade-propertyCompanyComment/**
 #      - /blade-policeStation/**
 #      - /blade-policeAffairsGrid/**
+#      - /blade-category/**
+      - /blade-disputeRecord/**
     #授权认证配置
     auth:
       - method: ALL
@@ -301,3 +322,23 @@
     #排除多租户逻辑
     exclude-tables:
       - blade_user
+sms:
+  url: https://mas.jx139.com:8443/sopA/
+  appId: 202403288666059313538996533
+  privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCCL4tz9BbUz+z3vs/eFwmUmQhsTiP3ZLwruTMJuEhsTEsT58PrdUOKGipwhKF88zj8SCk/Tn8izvDXj5IzqHEWjSEkfivYHx/6cE3VdHc6vvpvpeC06264d5NN4T6hwYH9CYz9iSmx9HFxADlg5zxj0lHqLSFf25cmEPF3F7PvAzj1cmYrKjet1HtCKaAyKADD+ojHHRjNLXZg3E5CINUqRYlLi+OKQph3VdrfokkO8efe8CR2wdiGU78mV1/UtTaiSYOEwv7pkbGECkqIXp+xYzaAVNCxikIWkc+qKmvvJXKsQVOKqv5b7/FQ/ag8trWPe8JLcQCN/Zg7DXSTc9YHAgMBAAECggEAENI73punZ5AGOmy5RyUK49xyLixakVi+x5eCdLsPAI9LFCNaOU5Jj8qZuTgp9Y8nydE5IyjtXH4IuJGgfnRBSHyrz59N4vsCksV4CSCnVzvd+Bci1b2l7MfmjKWSBiyOszdMtGXIsWm4TrWMtGysbOl8FBoIue4RtaVyzcSOR0+gDCIkn2XGqh3FhSIIApYm+eTOPDLZuSOsrgoTrppTOVUCXGN+/cSBAegWQnCES0b49F2EIRCAtSybc52N7zFPB9f8Kzzmgozilf00uS27HLZplwyLA6FMargdOi619x3T/XY52a55r4ldu/aZF2EbD1RpvMi9aGH/O77HtmLfAQKBgQC/32H0ibR5BgqfUjOWS0v+GRqG0gXr4x2R/oY9Pym16F5gEFKDYauBfEK4GYDtTEahB0Wo0n57StSZ3fX6yy9uBsPxywy0yUvzkxwe2th8fBg5czEBbLzHz4RMqo7LkfwKBatKMJLCOLdecSV2uJlDt/AIRFx5ymypiVLyYHb4IQKBgQCtsjv0ThHMM861CEfe9FZ2B4LFGfCptcek95ilARc7r3RpZpSSi+K0mF2992JVen+dkPh3FuG5NM5VSJeFyReNj5RxVz8A+4d9w3fxrqi2qfC1TFHR7IRv4JzPeZ+7wkMSc7rwkJ9UBSOdecXm2FV7BOivtnf7bGWIGLJNUb7pJwKBgCu0ZkudUk5+4cyInNePLzAh57jt/gtNIF8w6sLosEePNnALR8BFbxt/gnMM3CExTqU/Us6xo73RvbuOo4kM3zDguaFJ7wr/Dx3cVHtyvf0dByeO5Yq9igK5chlEgGI+Tnq579pmVgeHg70vaKkyQzb5nuNDLw1O3pF/hjVPY8oBAoGAFLW5nElqqdRLgx43o4eyf2Qp3WJYZYO9CBhVZOcaZA1pbd/DOy3em/XGx42lddejO6A7X8ekpjZ7m4OKPXNakZBa/KCQbIeRAhe6R2Cx0QW2I4e0AbmXmNdJGxu/Rd3FrX+K/H/h31y1gGMyi3Gjz4UoUTsKVzn3aSC4satbfeUCgYEAmpIo2ZO4hQ9THCOdgR5udXRG5s5JjGEct2QSxXntRyJm3RAkPA3/mEDVlI6X5UNIn7BKeThCFo5eM2bbFFF4sFeNV0W4uP8p9dsOnpwU7FzT++16WNiBopQpff72MNzjnt/k/KLlX/zV60zbMJ1R6McYsv0LP9Zuv9RAo8v8ZDU=
+  sopCreateBy: 106575361457
+
+wxpay:
+  api-v3-key: qqwuMJcCPRhcNcmFlqb6ucxdH
+  appid: wxeeab25f4f176f1fc
+  domain: https://srgdjczzxtpt.com:2080
+  mch-id: 1600701071
+  mch-serial-no: 4C19EAFA9E0AD598DDE3D7399B47C3D5C85
+  notify-domain: https://srgdjczzxtpt.com:2080/wxPay/native/notify
+  partnerKey: qqwuMJcCPRhcNcmFlqb6ucxd
+  private-key-path: /www/wwwroot/apiclient_key.pem
+  private-cert-path: /www/wwwroot/apiclient_cert.p12
+wxmini:
+  appid: wxeeab25f4f176f1fc
+  secret: 0a0e0d0a0c0b0a09080706050403020100
+  jscode2sessionUrl: https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code
diff --git a/src/main/resources/log/logback-test.xml b/src/main/resources/log/logback-test.xml
index ab6b102..5b2e691 100644
--- a/src/main/resources/log/logback-test.xml
+++ b/src/main/resources/log/logback-test.xml
@@ -23,9 +23,15 @@
 
     <!-- 生成日志文件 -->
     <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- 日志文件输出的文件名 -->
-            <FileNamePattern>target/blade/log/info-%d{yyyy-MM-dd}.log</FileNamePattern>
+            <FileNamePattern>target/blade/log/info-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--最多保留30天-->
+            <maxHistory>30</maxHistory>
+            <!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到1GB,哪怕没到30天也要删除多余的日志 -->
+            <totalSizeCap>10GB</totalSizeCap>
+            <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
+            <maxFileSize>100MB</maxFileSize>
         </rollingPolicy>
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
@@ -40,9 +46,15 @@
 
     <!-- 生成日志文件 -->
     <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- 日志文件输出的文件名 -->
-            <FileNamePattern>target/blade/log/error-%d{yyyy-MM-dd}.log</FileNamePattern>
+            <FileNamePattern>target/blade/log/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--最多保留30天-->
+            <maxHistory>30</maxHistory>
+            <!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到1GB,哪怕没到30天也要删除多余的日志 -->
+            <totalSizeCap>1GB</totalSizeCap>
+            <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
+            <maxFileSize>10MB</maxFileSize>
         </rollingPolicy>
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>%n%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%logger{50}] %n%-5level: %msg%n</pattern>
diff --git a/src/test/java/org/springblade/test/BladeTest.java b/src/test/java/org/springblade/test/BladeTest.java
index 600b816..0098ce5 100644
--- a/src/test/java/org/springblade/test/BladeTest.java
+++ b/src/test/java/org/springblade/test/BladeTest.java
@@ -1,13 +1,26 @@
 package org.springblade.test;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.springblade.common.utils.SpringUtils;
 import org.springblade.core.test.BladeBootTest;
 import org.springblade.core.test.BladeSpringExtension;
+import org.springblade.core.tool.utils.SpringUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.flow.engine.entity.FlowModel;
 import org.springblade.flow.engine.service.FlowEngineService;
+import org.springblade.modules.doorplateAddress.entity.DoorplateAddressEntity;
+import org.springblade.modules.doorplateAddress.service.IDoorplateAddressService;
+import org.springblade.modules.house.entity.HouseEntity;
+import org.springblade.modules.house.service.IHouseService;
+import org.springblade.modules.place.entity.PlaceEntity;
+import org.springblade.modules.place.service.IPlaceService;
+import org.springblade.modules.police.entity.PoliceAffairsGridEntity;
+import org.springblade.modules.police.service.IPoliceAffairsGridService;
+import org.springblade.modules.task.entity.TaskReportForRepairsEntity;
+import org.springblade.modules.task.service.ITaskReportForRepairsService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.List;
@@ -24,6 +37,52 @@
 	@Autowired
 	private FlowEngineService service;
 
+	@Autowired
+	private IPlaceService iPlaceService;
+
+	@Autowired
+	private IDoorplateAddressService iDoorplateAddressService;
+
+	@Autowired
+	private IHouseService iHouseService;
+
+//	@Test
+	public void test() {
+
+		List<PlaceEntity> list = iPlaceService.list();
+		for (PlaceEntity placeEntity : list) {
+			DoorplateAddressEntity one = iDoorplateAddressService.getOne(Wrappers.<DoorplateAddressEntity>lambdaQuery()
+				.eq(DoorplateAddressEntity::getAddressCode, placeEntity.getHouseCode()).last("limit 1"));
+			if (one != null) {
+				placeEntity.setAoiCode(one.getAoiCode());
+				iPlaceService.updateById(placeEntity);
+			}
+		}
+
+	}
+
+//	@Test
+	public void test2() {
+		// 查询 警务网格为空的数据
+		List<HouseEntity> list = iHouseService.list(Wrappers.<HouseEntity>lambdaQuery().eq(HouseEntity::getIsDeleted,0));
+		// 遍历
+		for (HouseEntity houseEntity : list) {
+			if (!Strings.isBlank(houseEntity.getLng())) {
+				// 空间分析
+				//点坐标解析
+				String point = "'POINT(" + houseEntity.getLng() + " " + houseEntity.getLat() + ")'";
+				List<PoliceAffairsGridEntity> policeAffairsGridEntities
+					= SpringUtil.getBean(IPoliceAffairsGridService.class).spatialAnalysis(point);
+				if (policeAffairsGridEntities.size() > 0) {
+					PoliceAffairsGridEntity policeAffairsGridEntity = policeAffairsGridEntities.get(0);
+					houseEntity.setJwGridCode(policeAffairsGridEntity.getJwGridCode());
+					// 更新
+					iHouseService.updateById(houseEntity);
+				}
+			}
+		}
+	}
+
 	@Test
 	public void contextLoads() {
 		System.out.println("=====数据迁移启动=====");
diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml
index 27343f3..e86453d 100644
--- a/src/test/resources/application.yml
+++ b/src/test/resources/application.yml
@@ -23,8 +23,8 @@
       # Oracle校验
       #validation-query: select 1 from dual
       validation-query-timeout: 2000
-      initial-size: 5
-      max-active: 20
+      initial-size: 50
+      max-active: 200
       min-idle: 5
       max-wait: 60000
       test-on-borrow: false
@@ -42,6 +42,12 @@
         exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
         session-stat-enable: true
         session-stat-max-count: 10
+      # 超过时间限制是否回收
+      remove-abandoned: true
+      # 超时时间;单位为秒。180秒=3分钟
+      remove-abandoned-timeout: 180
+      # 关闭abanded连接时输出错误日志
+      log-abandoned: true
 
 # mybatis
 mybatis-plus:

--
Gitblit v1.9.3