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') >= #{backblastPubPerson.startTime}
+ </if>
+ <if test="backblastPubPerson.endTime != null and backblastPubPerson.endTime != ''">
+ and date_format(jbpp.create_time,'%Y-%m-%d') <= #{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') >= #{backblastPubRecord.startTime}
+ </if>
+ <if test="backblastPubRecord.endTime != null and backblastPubRecord.endTime != ''">
+ and date_format(jbpr.create_time,'%Y-%m-%d') <= #{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') >= #{backblastPubRecord.startTime}
+ </if>
+ <if test="backblastPubRecord.endTime != null and backblastPubRecord.endTime != ''">
+ and date_format(jbpr.create_time,'%Y-%m-%d') <= #{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') >= #{backblastWarnHanRec.startTime}
+ </if>
+ <if test="backblastWarnHanRec.endTime != null and backblastWarnHanRec.endTime != ''">
+ and date_format(jbwhr.create_time,'%Y-%m-%d') <= #{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') >= #{disputeRecord.startTime}
+ </if>
+ <if test="disputeRecord.endTime != null and disputeRecord.endTime != ''">
+ and date_format(jdr.event_time,'%Y-%m-%d') <= #{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') >= #{disputeRecord.startTime}
+ </if>
+ <if test="disputeRecord.endTime != null and disputeRecord.endTime != ''">
+ and date_format(jdr.event_time,'%Y-%m-%d') <= #{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') >= #{vo.startTime}
+ </if>
+ <if test="vo.endTime != null and vo.endTime != ''">
+ and date_format(jpar.create_time,'%Y-%m-%d') <= #{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 < 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 < 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 < 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) <= 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()) < 18 then 2
+ when TIMESTAMPDIFF(year, substring(jtrpa.id_card, 7, 8), now()) >= 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()) < 18
+ </if>
+ <if test="residen.minors!=null and residen.minors ==1">
+ and TIMESTAMPDIFF(year, substring(jtrpa.id_card, 7, 8), now()) >= 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') >= #{taskSchoolEven.startTime}
+ </if>
+ <if test="taskSchoolEven.endTime != null and taskSchoolEven.endTime != ''">
+ and date_format(jtse.create_time,'%Y-%m-%d') <= #{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