From f2905da970e609999751e4c69591d8da80658280 Mon Sep 17 00:00:00 2001 From: Anlin <184993826@qq.com> Date: Tue, 3 Jun 2025 09:47:10 +0800 Subject: [PATCH] first commit --- ruoyi-api/pom.xml | 27 + ruoyi-api/ruoyi-api-bom/pom.xml | 57 + ruoyi-api/ruoyi-api-mp/pom.xml | 27 + .../map/api/RemoteSysDomainService.java | 29 + .../map/api/RemoteUserWokerService.java | 26 + .../map/api/domain/RemoteUserWorkerVo.java | 186 + .../dromara/map/api/model/LoginMpUser.java | 156 + ruoyi-api/ruoyi-api-payment/pom.xml | 33 + .../bill/domain/RemoteMerBillDetailVo.java | 312 + .../api/bill/domain/RemoteMerBillVo.java | 277 + .../domain/RemoteBusChannelAccountSynVo.java | 49 + .../domain/RemoteBusChannelAccountVo.java | 96 + .../domain/RemoteBusChannelCashoutVo.java | 146 + .../domain/RemoteBusChannelFlowsVo.java | 146 + .../domain/RemoteBusChannelProductVo.java | 115 + .../domain/RemoteBusChannelSalesmanVo.java | 61 + .../channel/domain/RemoteBusChannelVo.java | 181 + .../common/domain/RemoteBusAccountsVo.java | 96 + .../api/common/domain/RemoteBusOperLogVo.java | 54 + .../api/common/domain/RemoteTranLogVo.java | 108 + .../domain/RemoteMerInvoiceAddressVo.java | 106 + .../domain/RemoteMerInvoiceBillVo.java | 119 + .../domain/RemoteMerInvoiceDetailVo.java | 71 + .../domain/RemoteMerInvoiceTypeVo.java | 44 + .../invoice/domain/RemoteMerInvoiceVo.java | 236 + .../api/merchant/RemoteMerchantService.java | 18 + .../domain/RemoteBusMerchantAccountSynVo.java | 49 + .../domain/RemoteBusMerchantAccountVo.java | 105 + .../domain/RemoteBusMerchantAgreementVo.java | 94 + .../domain/RemoteBusMerchantCashoutVo.java | 121 + .../domain/RemoteBusMerchantConfigVo.java | 44 + .../domain/RemoteBusMerchantFlowsVo.java | 186 + .../domain/RemoteBusMerchantProductVo.java | 130 + .../merchant/domain/RemoteBusMerchantVo.java | 356 + .../merchant/domain/RemotePubMerchantVo.java | 336 + .../domain/RemoteVMerchantBillDayVo.java | 86 + .../domain/RemoteVMerchantBillVo.java | 99 + .../api/operator/RemoteOperatorService.java | 8 + .../domain/RemoteBusOperatorAccountVo.java | 96 + .../domain/RemoteBusOperatorAgreementVo.java | 74 + .../domain/RemoteBusOperatorCashoutVo.java | 156 + .../domain/RemoteBusOperatorFlowsVo.java | 176 + .../domain/RemoteBusOperatorProductVo.java | 112 + .../operator/domain/RemoteBusOperatorVo.java | 196 + .../domain/RemoteReProductInvoiceVo.java | 59 + .../payment/api/syd/RemoteSydService.java | 8 + .../api/syd/domain/RemoteSysUnitVo.java | 47 + .../syd/domain/syd/RemoteAccAccountsVo.java | 84 + .../syd/domain/syd/RemoteSysSydAccountVo.java | 93 + .../syd/domain/syd/RemoteSysSydCashoutVo.java | 113 + .../syd/domain/syd/RemoteSysSydConfigVo.java | 58 + .../syd/domain/syd/RemoteSysSydFlowsVo.java | 173 + .../syd/domain/syd/RemoteSysSydProductVo.java | 76 + .../domain/syd/RemoteSysSydSignContentVo.java | 43 + .../api/syd/domain/syd/RemoteSysSydVo.java | 194 + .../task/domain/RemoteMerTaskEnrollVo.java | 106 + .../api/task/domain/RemoteMerTaskVo.java | 241 + .../api/worker/RemoteUserWokerService.java | 62 + .../api/worker/domain/RemoteResultZip.java | 22 + .../worker/domain/RemoteUserWorkerZipVo.java | 50 + .../org/dromara/payment/enums/BusLogType.java | 26 + ruoyi-api/ruoyi-api-resource/pom.xml | 33 + .../resource/api/RemoteDhqService.java | 23 + .../resource/api/RemoteFileService.java | 29 + .../resource/api/RemoteFileServiceMock.java | 37 + .../resource/api/RemoteJzqService.java | 43 + .../resource/api/RemoteMailService.java | 21 + .../resource/api/RemoteMessageService.java | 19 + .../api/RemoteMessageServiceStub.java | 38 + .../resource/api/RemoteSmsService.java | 41 + .../resource/api/RemoteWeiXinService.java | 31 + .../resource/api/domain/RemoteDhq.java | 56 + .../resource/api/domain/RemoteFile.java | 34 + .../resource/api/domain/RemoteJzq.java | 96 + .../resource/api/domain/RemoteSms.java | 36 + .../resource/api/domain/SequenceInfo.java | 10 + .../resource/api/domain/SignatoryReq.java | 99 + .../resource/api/domain/SmsConfig.java | 48 + .../resource/api/domain/TencentSmsConfig.java | 30 + ruoyi-api/ruoyi-api-settlement/pom.xml | 33 + .../settlement/api/RemoteAccountService.java | 150 + .../settlement/api/RemoteAuthService.java | 63 + .../settlement/api/RemoteConfigService.java | 158 + .../settlement/api/constant/SystemConfig.java | 87 + .../settlement/api/domain/Account.java | 193 + .../settlement/api/domain/AccountLog.java | 211 + .../settlement/api/domain/AccountSyn.java | 154 + .../settlement/api/domain/AliyunBaseInfo.java | 51 + .../api/domain/AliyunUploadInfo.java | 74 + .../settlement/api/domain/MainAccount.java | 27 + .../settlement/api/domain/QiNiuConfig.java | 97 + .../settlement/api/domain/RechargeVo.java | 55 + .../dromara/settlement/api/domain/Result.java | 251 + .../settlement/api/domain/ResultCodeEnum.java | 39 + .../settlement/api/domain/SignZhifubao.java | 125 + .../settlement/api/domain/TransactionLog.java | 221 + .../settlement/api/domain/UnitConfClass.java | 53 + .../settlement/api/domain/UnitConfDetail.java | 146 + .../settlement/api/domain/UnitConfGroup.java | 66 + .../api/domain/auth/BankCardInfo.java | 77 + .../settlement/api/domain/auth/BankInfo.java | 109 + .../api/domain/auth/CardIdBack.java | 43 + .../api/domain/auth/CardIdPositive.java | 77 + ruoyi-api/ruoyi-api-system/pom.xml | 33 + .../system/api/RemoteClientService.java | 20 + .../system/api/RemoteConfigService.java | 27 + .../system/api/RemoteDataScopeService.java | 20 + .../dromara/system/api/RemoteDeptService.java | 18 + .../dromara/system/api/RemoteDictService.java | 21 + .../dromara/system/api/RemoteLogService.java | 26 + .../system/api/RemoteNoticeService.java | 19 + .../system/api/RemoteOrderNumService.java | 14 + .../system/api/RemoteSocialService.java | 35 + .../system/api/RemoteTenantService.java | 26 + .../dromara/system/api/RemoteUserService.java | 123 + .../api/domain/RemoteSysUnitDomainVo.java | 142 + .../system/api/domain/SysUserOnline.java | 72 + .../api/domain/bo/RemoteLogininforBo.java | 90 + .../system/api/domain/bo/RemoteOperLogBo.java | 120 + .../system/api/domain/bo/RemoteSocialBo.java | 129 + .../system/api/domain/bo/RemoteUserBo.java | 150 + .../system/api/domain/vo/RemoteClientVo.java | 71 + .../api/domain/vo/RemoteDictDataVo.java | 76 + .../system/api/domain/vo/RemoteSocialVo.java | 135 + .../api/domain/vo/RemoteSysNoticeVo.java | 92 + .../system/api/domain/vo/RemoteSysUserVo.java | 159 + .../system/api/domain/vo/RemoteTenantVo.java | 91 + .../dromara/system/api/model/LoginUser.java | 209 + .../org/dromara/system/api/model/RoleDTO.java | 42 + .../system/api/model/XcxLoginUser.java | 27 + ruoyi-auth/Dockerfile | 23 + ruoyi-auth/pom.xml | 156 + .../dromara/auth/RuoYiAuthApplication.java | 25 + .../auth/captcha/UnsignedMathGenerator.java | 88 + .../dromara/auth/config/CaptchaConfig.java | 62 + .../auth/controller/CaptchaController.java | 79 + .../auth/controller/TokenController.java | 317 + .../auth/domain/convert/TenantVoConvert.java | 16 + .../org/dromara/auth/domain/vo/CaptchaVo.java | 25 + .../dromara/auth/domain/vo/LoginTenantVo.java | 25 + .../org/dromara/auth/domain/vo/LoginVo.java | 54 + .../dromara/auth/domain/vo/LoginWxPubVo.java | 20 + .../org/dromara/auth/domain/vo/TLoginVo.java | 32 + .../dromara/auth/domain/vo/TenantListVo.java | 19 + .../dromara/auth/enums/CaptchaCategory.java | 35 + .../org/dromara/auth/enums/CaptchaType.java | 29 + .../org/dromara/auth/form/EmailLoginBody.java | 32 + .../dromara/auth/form/PasswordLoginBody.java | 34 + .../org/dromara/auth/form/RegisterBody.java | 36 + .../org/dromara/auth/form/SmsLoginBody.java | 30 + .../dromara/auth/form/SocialLoginBody.java | 36 + .../org/dromara/auth/form/WxPubLoginBody.java | 24 + .../org/dromara/auth/form/XcxLoginBody.java | 29 + .../auth/listener/UserActionListener.java | 199 + .../auth/properties/CaptchaProperties.java | 45 + .../properties/UserPasswordProperties.java | 29 + .../dromara/auth/service/IAuthStrategy.java | 35 + .../dromara/auth/service/SysLoginService.java | 422 + .../auth/service/impl/EmailAuthStrategy.java | 84 + .../auth/service/impl/MpSmsAuthStrategy.java | 102 + .../service/impl/PasswordAuthStrategy.java | 104 + .../auth/service/impl/SmsAuthStrategy.java | 129 + .../auth/service/impl/SocialAuthStrategy.java | 109 + .../service/impl/SysSensitiveServiceImpl.java | 47 + .../auth/service/impl/WxPubAuthStrategy.java | 112 + .../auth/service/impl/XcxAuthStrategy.java | 69 + ruoyi-auth/src/main/resources/application.yml | 35 + ruoyi-auth/src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 28 + ruoyi-example/pom.xml | 43 + ruoyi-example/ruoyi-demo/README.md | 2 + ruoyi-example/ruoyi-demo/pom.xml | 138 + .../dromara/demo/RuoYiDemoApplication.java | 20 + .../demo/controller/EsCrudController.java | 89 + .../demo/controller/MailController.java | 52 + .../demo/controller/RedisCacheController.java | 95 + .../demo/controller/RedisLockController.java | 71 + .../controller/RedisPubSubController.java | 47 + .../demo/controller/SmsController.java | 59 + .../controller/Swagger3DemoController.java | 31 + .../demo/controller/TestBatchController.java | 89 + .../demo/controller/TestDemoController.java | 146 + .../controller/TestEncryptController.java | 55 + .../demo/controller/TestExcelController.java | 160 + .../demo/controller/TestI18nController.java | 71 + .../controller/TestSensitiveController.java | 75 + .../controller/TestShardingController.java | 46 + .../demo/controller/TestTreeController.java | 104 + .../dromara/demo/controller/package-info.java | 1 + .../org/dromara/demo/domain/Document.java | 25 + .../dromara/demo/domain/ShardingOrder.java | 16 + .../demo/domain/ShardingOrderItem.java | 17 + .../org/dromara/demo/domain/TestDemo.java | 82 + .../dromara/demo/domain/TestDemoEncrypt.java | 29 + .../org/dromara/demo/domain/TestTree.java | 66 + .../dromara/demo/domain/bo/TestDemoBo.java | 61 + .../demo/domain/bo/TestDemoImportVo.java | 53 + .../dromara/demo/domain/bo/TestTreeBo.java | 54 + .../org/dromara/demo/domain/package-info.java | 1 + .../dromara/demo/domain/vo/ExportDemoVo.java | 118 + .../dromara/demo/domain/vo/TestDemoVo.java | 89 + .../dromara/demo/domain/vo/TestTreeVo.java | 64 + .../dromara/demo/esmapper/DocumentMapper.java | 7 + .../demo/listener/ExportDemoListener.java | 68 + .../demo/mapper/ShardingOrderItemMapper.java | 14 + .../demo/mapper/ShardingOrderMapper.java | 15 + .../demo/mapper/TestDemoEncryptMapper.java | 13 + .../dromara/demo/mapper/TestDemoMapper.java | 59 + .../dromara/demo/mapper/TestTreeMapper.java | 21 + .../org/dromara/demo/mapper/package-info.java | 1 + .../demo/service/IExportExcelService.java | 18 + .../demo/service/ITestDemoService.java | 71 + .../demo/service/ITestTreeService.java | 52 + .../service/impl/ExportExcelServiceImpl.java | 222 + .../service/impl/SensitiveServiceImpl.java | 46 + .../service/impl/TestDemoServiceImpl.java | 111 + .../service/impl/TestTreeServiceImpl.java | 88 + .../demo/service/impl/package-info.java | 1 + .../dromara/demo/service/package-info.java | 1 + .../src/main/resources/application.yml | 118 + .../ruoyi-demo/src/main/resources/banner.txt | 10 + .../src/main/resources/excel/单列表.xlsx | Bin 0 -> 10787 bytes .../src/main/resources/excel/多sheet列表.xlsx | Bin 0 -> 13359 bytes .../src/main/resources/excel/多列表.xlsx | Bin 0 -> 10761 bytes .../src/main/resources/logback-plus.xml | 23 + .../mapper/demo/ShardingOrderItemMapper.xml | 7 + .../mapper/demo/ShardingOrderMapper.xml | 7 + .../resources/mapper/demo/TestDemoMapper.xml | 26 + .../resources/mapper/demo/TestTreeMapper.xml | 22 + .../src/main/resources/mapper/package-info.md | 3 + .../src/main/resources/spy.properties | 28 + .../java/org/dromara/demo/AssertUnitTest.java | 45 + .../java/org/dromara/demo/DemoUnitTest.java | 69 + .../java/org/dromara/demo/ParamUnitTest.java | 72 + .../java/org/dromara/demo/TOrderTest.java | 49 + .../java/org/dromara/demo/TagUnitTest.java | 54 + ruoyi-example/ruoyi-stream-mq/pom.xml | 98 + .../stream/RuoYiStreamMqApplication.java | 22 + .../stream/controller/TestMqController.java | 60 + .../org/dromara/stream/mq/TestMessaging.java | 20 + .../stream/mq/consumer/DelayConsumer.java | 22 + .../stream/mq/consumer/LogStreamConsumer.java | 23 + .../mq/consumer/TestStreamConsumer.java | 23 + .../stream/mq/producer/DelayProducer.java | 27 + .../stream/mq/producer/LogStreamProducer.java | 24 + .../mq/producer/TestStreamProducer.java | 26 + .../src/main/resources/application.yml | 112 + .../src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 26 + ruoyi-gateway/Dockerfile | 22 + ruoyi-gateway/pom.xml | 154 + .../gateway/RuoYiGatewayApplication.java | 25 + .../dromara/gateway/config/GatewayConfig.java | 21 + .../properties/ApiDecryptProperties.java | 28 + .../properties/CustomGatewayProperties.java | 24 + .../properties/IgnoreWhiteProperties.java | 29 + .../config/properties/XssProperties.java | 31 + .../dromara/gateway/filter/AuthFilter.java | 69 + .../gateway/filter/BlackListUrlFilter.java | 58 + .../gateway/filter/ForwardAuthFilter.java | 41 + .../filter/GlobalCacheRequestFilter.java | 38 + .../gateway/filter/GlobalCorsFilter.java | 58 + .../gateway/filter/GlobalI18nFilter.java | 41 + .../gateway/filter/GlobalLogFilter.java | 81 + .../org/dromara/gateway/filter/XssFilter.java | 100 + .../handler/GatewayExceptionHandler.java | 46 + .../handler/SentinelFallbackHandler.java | 36 + .../dromara/gateway/utils/WebFluxUtils.java | 150 + .../src/main/resources/application.yml | 37 + ruoyi-gateway/src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 114 + ruoyi-modules/pom.xml | 56 + ruoyi-modules/ruoyi-flexible/pom.xml | 149 + .../flexible/RuoYiFlexibleApplication.java | 29 + .../flexible/exception/FlexibleException.java | 20 + .../src/main/resources/application.yml | 36 + .../src/main/resources/banner.txt | 18 + .../src/main/resources/logback-plus.xml | 28 + .../src/main/resources/spy.properties | 28 + ruoyi-modules/ruoyi-gen/Dockerfile | 16 + ruoyi-modules/ruoyi-gen/pom.xml | 94 + .../org/dromara/gen/RuoYiGenApplication.java | 22 + .../org/dromara/gen/config/GenConfig.java | 65 + .../dromara/gen/constant/GenConstants.java | 186 + .../dromara/gen/controller/GenController.java | 217 + .../java/org/dromara/gen/domain/GenTable.java | 196 + .../dromara/gen/domain/GenTableColumn.java | 222 + .../gen/mapper/GenTableColumnMapper.java | 28 + .../dromara/gen/mapper/GenTableMapper.java | 61 + .../gen/service/GenTableServiceImpl.java | 466 + .../dromara/gen/service/IGenTableService.java | 132 + .../java/org/dromara/gen/util/GenUtils.java | 231 + .../dromara/gen/util/VelocityInitializer.java | 35 + .../org/dromara/gen/util/VelocityUtils.java | 344 + .../src/main/resources/application.yml | 37 + .../ruoyi-gen/src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 25 + .../mapper/generator/GenTableColumnMapper.xml | 78 + .../mapper/generator/GenTableMapper.xml | 194 + .../src/main/resources/mapper/package-info.md | 3 + .../src/main/resources/spy.properties | 28 + .../src/main/resources/vm/java/bo.java.vm | 50 + .../main/resources/vm/java/controller.java.vm | 116 + .../src/main/resources/vm/java/domain.java.vm | 60 + .../src/main/resources/vm/java/mapper.java.vm | 15 + .../main/resources/vm/java/remoteVo.java.vm | 42 + .../main/resources/vm/java/service.java.vm | 53 + .../resources/vm/java/serviceImpl.java.vm | 135 + .../src/main/resources/vm/java/vo.java.vm | 59 + .../main/resources/vm/java/voConvert.java.vm | 19 + .../src/main/resources/vm/sql/oracle/sql.vm | 19 + .../src/main/resources/vm/sql/postgres/sql.vm | 20 + .../src/main/resources/vm/sql/sql.vm | 19 + .../src/main/resources/vm/ts/api.ts.vm | 63 + .../src/main/resources/vm/ts/types.ts.vm | 50 + .../main/resources/vm/vue/index-tree.vue.vm | 507 + .../src/main/resources/vm/vue/index.vue.vm | 474 + .../src/main/resources/vm/xml/mapper.xml.vm | 7 + ruoyi-modules/ruoyi-job/Dockerfile | 23 + ruoyi-modules/ruoyi-job/pom.xml | 105 + .../org/dromara/job/RuoYiJobApplication.java | 24 + .../processors/BroadcastProcessorDemo.java | 56 + .../job/processors/LogTestProcessor.java | 41 + .../job/processors/MapProcessorDemo.java | 93 + .../processors/MapReduceProcessorDemo.java | 93 + .../job/processors/SimpleProcessor.java | 35 + .../processors/StandaloneProcessorDemo.java | 51 + .../job/processors/TimeoutProcessor.java | 25 + .../workflow/WorkflowStandaloneProcessor.java | 36 + .../src/main/resources/application.yml | 36 + .../ruoyi-job/src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 28 + .../src/main/resources/spy.properties | 28 + ruoyi-modules/ruoyi-mp/pom.xml | 174 + .../org/dromara/mp/RuoYiMpApplication.java | 31 + .../mp/controller/CardIdController.java | 204 + .../mp/controller/MyTaskController.java | 232 + .../SettlementAccountController.java | 71 + .../controller/SysUnitDomainController.java | 53 + .../controller/UserWorkCheckinController.java | 102 + .../mp/controller/UserWorkerController.java | 115 + .../java/org/dromara/mp/controller/dome.java | 222 + .../org/dromara/mp/domain/MerTaskEnroll.java | 108 + .../org/dromara/mp/domain/MerTaskSure.java | 53 + .../org/dromara/mp/domain/SysUnitDomain.java | 137 + .../main/java/org/dromara/mp/domain/Test.java | 65 + .../dromara/mp/domain/UserWorkCheckin.java | 89 + .../org/dromara/mp/domain/UserWorker.java | 220 + .../dromara/mp/domain/UserWorkerAccount.java | 92 + .../org/dromara/mp/domain/UserWorkerBiz.java | 57 + .../dromara/mp/domain/bo/MerTaskEnrollBo.java | 123 + .../dromara/mp/domain/bo/SysUnitDomainBo.java | 151 + .../dromara/mp/domain/bo/UserWokerOperBo.java | 79 + .../mp/domain/bo/UserWorkCheckinBo.java | 97 + .../mp/domain/bo/UserWorkerAccountBo.java | 91 + .../dromara/mp/domain/bo/UserWorkerBo.java | 202 + .../dromara/mp/domain/vo/BankCardOcrVo.java | 59 + .../org/dromara/mp/domain/vo/BankCardVo.java | 27 + .../org/dromara/mp/domain/vo/IdCardVo.java | 113 + .../dromara/mp/domain/vo/MerTaskEnrollVo.java | 152 + .../org/dromara/mp/domain/vo/MyTaskVo.java | 88 + .../mp/domain/vo/SettlementChannelVo.java | 32 + .../dromara/mp/domain/vo/SysUnitDomainVo.java | 150 + .../java/org/dromara/mp/domain/vo/TaskVo.java | 89 + .../mp/domain/vo/UserWorkCheckinVo.java | 106 + .../mp/domain/vo/UserWorkerAccountVo.java | 112 + .../dromara/mp/domain/vo/UserWorkerBus.java | 31 + .../dromara/mp/domain/vo/UserWorkerVo.java | 243 + .../mp/dubbo/RemoteUserWorkerServiceImpl.java | 83 + .../mp/exception/BankCard4Exception.java | 18 + .../org/dromara/mp/exception/MpException.java | 17 + .../mp/mapper/MerTaskEnrollMapper.java | 16 + .../org/dromara/mp/mapper/MyTaskMapper.java | 116 + .../mp/mapper/SysUnitDomainMapper.java | 15 + .../mp/mapper/UserWorkCheckinMapper.java | 15 + .../mp/mapper/UserWorkerAccountMapper.java | 27 + .../dromara/mp/mapper/UserWorkerMapper.java | 15 + .../dromara/mp/service/ICardIdService.java | 111 + .../dromara/mp/service/IMyTaskService.java | 131 + .../mp/service/ISettlementAccountService.java | 53 + .../mp/service/ISysUnitDomainService.java | 99 + .../mp/service/IUserWorkCheckinService.java | 49 + .../mp/service/IUserWorkerService.java | 53 + .../mp/service/impl/CardIdServiceImpl.java | 986 ++ .../mp/service/impl/MyTaskServiceImpl.java | 806 ++ .../impl/SettlementAccountServiceImpl.java | 202 + .../impl/SysUnitDomainServiceImpl.java | 282 + .../impl/UserWorkCheckinServiceImpl.java | 125 + .../service/impl/UserWorkerServiceImpl.java | 141 + .../java/org/dromara/mp/util/ImgUtil.java | 48 + .../src/main/resources/application.yml | 36 + .../ruoyi-mp/src/main/resources/banner.txt | 18 + .../src/main/resources/logback-plus.xml | 28 + .../mapper/mp/MerTaskEnrollMapper.xml | 8 + .../main/resources/mapper/mp/MyTaskMapper.xml | 193 + .../mapper/mp/SysUnitDomainMapper.xml | 7 + .../mapper/mp/UserWorkCheckinMapper.xml | 7 + .../mapper/mp/UserWorkerAccountMapper.xml | 14 + .../resources/mapper/mp/UserWorkerMapper.xml | 8 + .../src/main/resources/spy.properties | 28 + ruoyi-modules/ruoyi-payment/Dockerfile | 23 + ruoyi-modules/ruoyi-payment/pom.xml | 176 + .../payment/RuoYiPaymentApplication.java | 26 + .../bill/controller/MerBillController.java | 389 + .../controller/MerBillDetailController.java | 228 + .../dromara/payment/bill/domain/MerBill.java | 281 + .../payment/bill/domain/MerBillDetail.java | 372 + .../payment/bill/domain/bo/AddBillBo.java | 34 + .../payment/bill/domain/bo/BillImportBo.java | 4 + .../payment/bill/domain/bo/MerBillBo.java | 316 + .../bill/domain/bo/MerBillDetailBo.java | 297 + .../convert/MerBillDetailVoConvert.java | 19 + .../bill/domain/convert/MerBillVoConvert.java | 19 + .../bill/domain/vo/MerBillDetailVo.java | 589 + .../payment/bill/domain/vo/MerBillVo.java | 448 + .../bill/listener/BillImportListener.java | 88 + .../bill/mapper/MerBillDetailMapper.java | 28 + .../payment/bill/mapper/MerBillMapper.java | 26 + .../bill/service/IMerBillDetailService.java | 85 + .../payment/bill/service/IMerBillService.java | 139 + .../impl/MerBillDetailServiceImpl.java | 425 + .../bill/service/impl/MerBillServiceImpl.java | 1723 +++ .../BusChannelAccountController.java | 139 + .../BusChannelAccountSynController.java | 106 + .../BusChannelCashoutController.java | 160 + .../controller/BusChannelController.java | 155 + .../controller/BusChannelFlowsController.java | 106 + .../BusChannelProductController.java | 107 + .../BusChannelSalesmanController.java | 132 + .../payment/channel/domain/BusChannel.java | 208 + .../channel/domain/BusChannelAccount.java | 106 + .../channel/domain/BusChannelAccountSyn.java | 51 + .../channel/domain/BusChannelCashout.java | 150 + .../channel/domain/BusChannelFlows.java | 181 + .../channel/domain/BusChannelProduct.java | 122 + .../channel/domain/BusChannelSalesman.java | 63 + .../domain/bo/BusChannelAccountBo.java | 110 + .../domain/bo/BusChannelAccountSynBo.java | 54 + .../channel/domain/bo/BusChannelBo.java | 235 + .../domain/bo/BusChannelCashoutBo.java | 153 + .../channel/domain/bo/BusChannelFlowsBo.java | 170 + .../domain/bo/BusChannelProductBo.java | 137 + .../domain/bo/BusChannelSalesmanBo.java | 78 + .../BusChannelAccountSynVoConvert.java | 19 + .../convert/BusChannelAccountVoConvert.java | 19 + .../convert/BusChannelCashoutVoConvert.java | 19 + .../convert/BusChannelFlowsVoConvert.java | 19 + .../convert/BusChannelProductVoConvert.java | 19 + .../convert/BusChannelSalesmanVoConvert.java | 19 + .../domain/convert/BusChannelVoConvert.java | 19 + .../channel/domain/vo/BaseCompInfo.java | 32 + .../domain/vo/BusChannelAccountSynVo.java | 64 + .../domain/vo/BusChannelAccountVo.java | 157 + .../domain/vo/BusChannelCashoutVo.java | 194 + .../channel/domain/vo/BusChannelFlowsVo.java | 182 + .../domain/vo/BusChannelProductVo.java | 159 + .../domain/vo/BusChannelSalesmanVo.java | 84 + .../channel/domain/vo/BusChannelVo.java | 251 + .../mapper/BusChannelAccountMapper.java | 60 + .../mapper/BusChannelAccountSynMapper.java | 15 + .../mapper/BusChannelCashoutMapper.java | 25 + .../channel/mapper/BusChannelFlowsMapper.java | 16 + .../channel/mapper/BusChannelMapper.java | 29 + .../mapper/BusChannelProductMapper.java | 77 + .../mapper/BusChannelSalesmanMapper.java | 49 + .../service/IBusChannelAccountService.java | 75 + .../service/IBusChannelAccountSynService.java | 49 + .../service/IBusChannelCashoutService.java | 67 + .../service/IBusChannelFlowsService.java | 49 + .../service/IBusChannelProductService.java | 50 + .../service/IBusChannelSalesmanService.java | 52 + .../channel/service/IBusChannelService.java | 81 + .../impl/BusChannelAccountServiceImpl.java | 184 + .../impl/BusChannelAccountSynServiceImpl.java | 112 + .../impl/BusChannelCashoutServiceImpl.java | 391 + .../impl/BusChannelFlowsServiceImpl.java | 132 + .../impl/BusChannelProductServiceImpl.java | 275 + .../impl/BusChannelSalesmanServiceImpl.java | 175 + .../service/impl/BusChannelServiceImpl.java | 511 + .../controller/BusAccountsController.java | 122 + .../controller/BusOperLogController.java | 106 + .../common/controller/TranLogController.java | 106 + .../payment/common/domain/BusAccounts.java | 121 + .../dromara/payment/common/domain/BusId.java | 67 + .../payment/common/domain/BusOperLog.java | 65 + .../domain/CommonSelConditionEntity.java | 70 + .../payment/common/domain/TranLog.java | 127 + .../common/domain/bo/BusAccountsBo.java | 110 + .../common/domain/bo/BusOperLogBo.java | 60 + .../payment/common/domain/bo/TranLogBo.java | 124 + .../domain/convert/BusAccountsVoConvert.java | 19 + .../domain/convert/BusOperLogVoConvert.java | 19 + .../domain/convert/TranLogVoConvert.java | 19 + .../common/domain/vo/BusAccountsVo.java | 150 + .../common/domain/vo/BusOperLogVo.java | 71 + .../payment/common/domain/vo/TranLogVo.java | 141 + .../common/mapper/BusAccountsMapper.java | 65 + .../common/mapper/BusOperLogMapper.java | 15 + .../payment/common/mapper/TranLogMapper.java | 68 + .../common/service/IBusAccountsService.java | 49 + .../common/service/IBusOperLogService.java | 49 + .../common/service/ITranLogService.java | 71 + .../service/impl/BusAccountsServiceImpl.java | 137 + .../service/impl/BusOperLogServiceImpl.java | 113 + .../service/impl/SysSensitiveServiceImpl.java | 47 + .../service/impl/TranLogServiceImpl.java | 280 + .../consumer/BankAccountStreamConsumer.java | 124 + .../consumer/BillPayStreamConsumer.java | 99 + .../controller/CoverPageController.java | 46 + .../payment/coverpage/domain/CoverPageBo.java | 29 + .../coverpage/domain/CoverPageInfo.java | 74 + .../payment/coverpage/domain/MerBillInfo.java | 51 + .../coverpage/mapper/CoverPageMapper.java | 32 + .../coverpage/service/ICoverPageService.java | 15 + .../service/impl/CoverPageServiceImpl.java | 135 + .../MerInvoiceAddressController.java | 116 + .../controller/MerInvoiceBillController.java | 106 + .../controller/MerInvoiceController.java | 268 + .../MerInvoiceDetailController.java | 106 + .../controller/MerInvoiceTypeController.java | 148 + .../payment/invoice/domain/MerInvoice.java | 241 + .../invoice/domain/MerInvoiceAddress.java | 108 + .../invoice/domain/MerInvoiceBill.java | 121 + .../invoice/domain/MerInvoiceDetail.java | 73 + .../invoice/domain/MerInvoiceType.java | 46 + .../domain/bo/MerInvoiceAddressBo.java | 116 + .../invoice/domain/bo/MerInvoiceBillBo.java | 128 + .../invoice/domain/bo/MerInvoiceBo.java | 263 + .../invoice/domain/bo/MerInvoiceDetailBo.java | 77 + .../invoice/domain/bo/MerInvoiceTypeBo.java | 48 + .../invoice/domain/bo/UploadInvoiceBo.java | 43 + .../convert/MerInvoiceAddressVoConvert.java | 19 + .../convert/MerInvoiceBillVoConvert.java | 19 + .../convert/MerInvoiceDetailVoConvert.java | 19 + .../convert/MerInvoiceTypeVoConvert.java | 19 + .../domain/convert/MerInvoiceVoConvert.java | 19 + .../domain/vo/MerInvoiceAddressVo.java | 131 + .../invoice/domain/vo/MerInvoiceBillVo.java | 179 + .../invoice/domain/vo/MerInvoiceDetailVo.java | 89 + .../invoice/domain/vo/MerInvoiceTypeVo.java | 56 + .../invoice/domain/vo/MerInvoiceVo.java | 313 + .../mapper/MerInvoiceAddressMapper.java | 15 + .../invoice/mapper/MerInvoiceBillMapper.java | 58 + .../mapper/MerInvoiceDetailMapper.java | 15 + .../invoice/mapper/MerInvoiceMapper.java | 29 + .../invoice/mapper/MerInvoiceTypeMapper.java | 29 + .../service/IMerInvoiceAddressService.java | 49 + .../service/IMerInvoiceBillService.java | 49 + .../service/IMerInvoiceDetailService.java | 49 + .../invoice/service/IMerInvoiceService.java | 84 + .../service/IMerInvoiceTypeService.java | 66 + .../impl/MerInvoiceAddressServiceImpl.java | 134 + .../impl/MerInvoiceBillServiceImpl.java | 127 + .../impl/MerInvoiceDetailServiceImpl.java | 117 + .../service/impl/MerInvoiceServiceImpl.java | 463 + .../impl/MerInvoiceTypeServiceImpl.java | 188 + .../BusMerchantAccountController.java | 173 + .../BusMerchantAccountSynController.java | 106 + .../BusMerchantAgreementController.java | 106 + .../BusMerchantCashoutController.java | 126 + .../BusMerchantConfigController.java | 106 + .../controller/BusMerchantController.java | 246 + .../BusMerchantFlowsController.java | 109 + .../BusMerchantProductController.java | 115 + .../BusMerchantProductSydController.java | 106 + .../controller/PubMerchantController.java | 106 + .../controller/VMerchantBillController.java | 106 + .../VMerchantBillDayController.java | 106 + .../payment/merchant/domain/BusMerchant.java | 384 + .../merchant/domain/BusMerchantAccount.java | 147 + .../domain/BusMerchantAccountSyn.java | 51 + .../merchant/domain/BusMerchantAgreement.java | 96 + .../merchant/domain/BusMerchantCashout.java | 123 + .../merchant/domain/BusMerchantConfig.java | 63 + .../merchant/domain/BusMerchantFlows.java | 231 + .../merchant/domain/BusMerchantProduct.java | 154 + .../domain/BusMerchantProductSyd.java | 47 + .../payment/merchant/domain/PubMerchant.java | 338 + .../merchant/domain/VMerchantBill.java | 101 + .../merchant/domain/VMerchantBillDay.java | 87 + .../domain/bo/BusMerchantAccountBo.java | 125 + .../domain/bo/BusMerchantAccountSynBo.java | 54 + .../domain/bo/BusMerchantAgreementBo.java | 108 + .../merchant/domain/bo/BusMerchantBo.java | 469 + .../domain/bo/BusMerchantCashoutBo.java | 128 + .../domain/bo/BusMerchantConfigBo.java | 48 + .../domain/bo/BusMerchantFlowsBo.java | 218 + .../domain/bo/BusMerchantProductBo.java | 203 + .../domain/bo/BusMerchantProductSydBo.java | 42 + .../merchant/domain/bo/PubMerchantBo.java | 398 + .../merchant/domain/bo/VMerchantBillBo.java | 114 + .../domain/bo/VMerchantBillDayBo.java | 98 + .../BusMerchantAccountSynVoConvert.java | 19 + .../convert/BusMerchantAccountVoConvert.java | 19 + .../BusMerchantAgreementVoConvert.java | 19 + .../convert/BusMerchantCashoutVoConvert.java | 19 + .../convert/BusMerchantConfigVoConvert.java | 19 + .../convert/BusMerchantFlowsVoConvert.java | 19 + .../convert/BusMerchantProductVoConvert.java | 19 + .../domain/convert/BusMerchantVoConvert.java | 19 + .../domain/convert/PubMerchantVoConvert.java | 19 + .../convert/VMerchantBillDayVoConvert.java | 19 + .../convert/VMerchantBillVoConvert.java | 19 + .../domain/vo/BusMerchantAccountSynVo.java | 64 + .../domain/vo/BusMerchantAccountVo.java | 166 + .../domain/vo/BusMerchantAgreementVo.java | 118 + .../domain/vo/BusMerchantCashoutVo.java | 151 + .../domain/vo/BusMerchantConfigVo.java | 58 + .../domain/vo/BusMerchantFlowsVo.java | 285 + .../domain/vo/BusMerchantProductSydVo.java | 50 + .../domain/vo/BusMerchantProductVo.java | 195 + .../domain/vo/BusMerchantRechargeVo.java | 39 + .../merchant/domain/vo/BusMerchantVo.java | 477 + .../domain/vo/BusOperAndAgentAndMer.java | 38 + .../merchant/domain/vo/PubMerchantVo.java | 410 + .../domain/vo/VMerchantBillDayVo.java | 108 + .../merchant/domain/vo/VMerchantBillVo.java | 128 + .../dubbo/RemoteMerchantServiceImpl.java | 33 + .../mapper/BusMerchantAccountMapper.java | 189 + .../mapper/BusMerchantAccountSynMapper.java | 71 + .../mapper/BusMerchantAgreementMapper.java | 15 + .../mapper/BusMerchantCashoutMapper.java | 15 + .../mapper/BusMerchantConfigMapper.java | 17 + .../mapper/BusMerchantFlowsMapper.java | 25 + .../merchant/mapper/BusMerchantMapper.java | 54 + .../mapper/BusMerchantProductMapper.java | 68 + .../mapper/BusMerchantProductSydMapper.java | 15 + .../merchant/mapper/PubMerchantMapper.java | 15 + .../mapper/VMerchantBillDayMapper.java | 15 + .../merchant/mapper/VMerchantBillMapper.java | 15 + .../service/IBusMerchantAccountService.java | 146 + .../IBusMerchantAccountSynService.java | 49 + .../service/IBusMerchantAgreementService.java | 49 + .../service/IBusMerchantCashoutService.java | 60 + .../service/IBusMerchantConfigService.java | 49 + .../service/IBusMerchantFlowsService.java | 53 + .../service/IBusMerchantProductService.java | 51 + .../IBusMerchantProductSydService.java | 49 + .../merchant/service/IBusMerchantService.java | 79 + .../merchant/service/IPubMerchantService.java | 49 + .../service/IVMerchantBillDayService.java | 49 + .../service/IVMerchantBillService.java | 49 + .../impl/BusMerchantAccountServiceImpl.java | 337 + .../BusMerchantAccountSynServiceImpl.java | 112 + .../impl/BusMerchantAgreementServiceImpl.java | 121 + .../impl/BusMerchantCashoutServiceImpl.java | 280 + .../impl/BusMerchantConfigServiceImpl.java | 111 + .../impl/BusMerchantFlowsServiceImpl.java | 218 + .../impl/BusMerchantProductServiceImpl.java | 235 + .../BusMerchantProductSydServiceImpl.java | 115 + .../service/impl/BusMerchantServiceImpl.java | 417 + .../service/impl/PubMerchantServiceImpl.java | 169 + .../impl/VMerchantBillDayServiceImpl.java | 117 + .../impl/VMerchantBillServiceImpl.java | 122 + .../BusOperatorAccountController.java | 136 + .../BusOperatorAgreementController.java | 106 + .../BusOperatorCashoutController.java | 154 + .../controller/BusOperatorController.java | 129 + .../BusOperatorFlowsController.java | 119 + .../BusOperatorProductController.java | 134 + .../ReProductInvoiceController.java | 106 + .../payment/operator/domain/BusOperator.java | 206 + .../operator/domain/BusOperatorAccount.java | 139 + .../operator/domain/BusOperatorAgreement.java | 76 + .../operator/domain/BusOperatorCashout.java | 158 + .../operator/domain/BusOperatorFlows.java | 216 + .../operator/domain/BusOperatorProduct.java | 107 + .../operator/domain/ReProductInvoice.java | 61 + .../domain/bo/AllocOperatorProductBo.java | 18 + .../domain/bo/BusOperatorAccountBo.java | 120 + .../domain/bo/BusOperatorAgreementBo.java | 84 + .../operator/domain/bo/BusOperatorBo.java | 239 + .../domain/bo/BusOperatorCashoutBo.java | 166 + .../domain/bo/BusOperatorFlowsBo.java | 206 + .../domain/bo/BusOperatorProductBo.java | 123 + .../domain/bo/ReProductInvoiceBo.java | 64 + .../convert/BusOperatorAccountVoConvert.java | 19 + .../BusOperatorAgreementVoConvert.java | 19 + .../convert/BusOperatorCashoutVoConvert.java | 19 + .../convert/BusOperatorFlowsVoConvert.java | 19 + .../convert/BusOperatorProductVoConvert.java | 19 + .../domain/convert/BusOperatorVoConvert.java | 19 + .../convert/ReProductInvoiceVoConvert.java | 19 + .../domain/vo/BusOperatorAccountVo.java | 173 + .../domain/vo/BusOperatorAgreementVo.java | 94 + .../domain/vo/BusOperatorCashoutVo.java | 217 + .../domain/vo/BusOperatorFlowsVo.java | 249 + .../domain/vo/BusOperatorProductVo.java | 147 + .../operator/domain/vo/BusOperatorVo.java | 251 + .../domain/vo/ReProductInvoiceVo.java | 75 + .../mapper/BusOperatorAccountMapper.java | 88 + .../mapper/BusOperatorAgreementMapper.java | 15 + .../mapper/BusOperatorCashoutMapper.java | 25 + .../mapper/BusOperatorFlowsMapper.java | 16 + .../operator/mapper/BusOperatorMapper.java | 15 + .../mapper/BusOperatorProductMapper.java | 60 + .../mapper/ReProductInvoiceMapper.java | 30 + .../service/IBusOperatorAccountService.java | 96 + .../service/IBusOperatorAgreementService.java | 49 + .../service/IBusOperatorCashoutService.java | 68 + .../service/IBusOperatorFlowsService.java | 49 + .../service/IBusOperatorProductService.java | 69 + .../operator/service/IBusOperatorService.java | 49 + .../service/IReProductInvoiceService.java | 49 + .../impl/BusOperatorAccountServiceImpl.java | 329 + .../impl/BusOperatorAgreementServiceImpl.java | 117 + .../impl/BusOperatorCashoutServiceImpl.java | 320 + .../impl/BusOperatorFlowsServiceImpl.java | 140 + .../impl/BusOperatorProductServiceImpl.java | 242 + .../service/impl/BusOperatorServiceImpl.java | 247 + .../impl/ReProductInvoiceServiceImpl.java | 114 + .../properties/PayPasswordProperties.java | 29 + .../properties/PlatformProperties.java | 45 + .../sys/controller/AccAccountsController.java | 106 + .../controller/BusDownloadsController.java | 106 + .../sys/controller/LgEarlyWarnController.java | 53 + .../controller/LgEarlyWarnDtlController.java | 16 + .../controller/ProInfoCommonController.java | 130 + .../sys/controller/SysPayPwdController.java | 58 + .../controller/SysSydAccountController.java | 134 + .../SysSydAccountSynController.java | 106 + .../controller/SysSydCashoutController.java | 130 + .../controller/SysSydConfigController.java | 175 + .../sys/controller/SysSydController.java | 187 + .../sys/controller/SysSydFlowsController.java | 156 + .../sys/controller/SysSydLogController.java | 106 + .../controller/SysSydProductController.java | 127 + .../SysSydSignContentController.java | 106 + .../sys/controller/SysUnitController.java | 144 + .../payment/sys/domain/AccAccounts.java | 101 + .../payment/sys/domain/BusDownloads.java | 47 + .../dromara/payment/sys/domain/SysSyd.java | 223 + .../payment/sys/domain/SysSydAccount.java | 141 + .../payment/sys/domain/SysSydAccountSyn.java | 51 + .../payment/sys/domain/SysSydCashout.java | 118 + .../payment/sys/domain/SysSydConfig.java | 71 + .../payment/sys/domain/SysSydFlows.java | 216 + .../dromara/payment/sys/domain/SysSydLog.java | 204 + .../payment/sys/domain/SysSydProduct.java | 92 + .../payment/sys/domain/SysSydSignContent.java | 50 + .../dromara/payment/sys/domain/SysUnit.java | 51 + .../payment/sys/domain/bo/AccAccountsBo.java | 97 + .../payment/sys/domain/bo/BusDownloadsBo.java | 45 + .../sys/domain/bo/ProInfoCommonBo.java | 53 + .../payment/sys/domain/bo/SysPayPwdBo.java | 29 + .../sys/domain/bo/SysSydAccountBo.java | 110 + .../sys/domain/bo/SysSydAccountSynBo.java | 54 + .../payment/sys/domain/bo/SysSydBo.java | 234 + .../sys/domain/bo/SysSydCashoutBo.java | 123 + .../payment/sys/domain/bo/SysSydConfigBo.java | 68 + .../payment/sys/domain/bo/SysSydFlowsBo.java | 204 + .../payment/sys/domain/bo/SysSydLogBo.java | 237 + .../sys/domain/bo/SysSydProductBo.java | 107 + .../sys/domain/bo/SysSydSignContentBo.java | 50 + .../payment/sys/domain/bo/SysUnitBo.java | 59 + .../domain/convert/AccAccountsVoConvert.java | 19 + .../sys/domain/convert/SysSydVoConvert.java | 17 + .../sys/domain/convert/SysUnitVoConvert.java | 19 + .../payment/sys/domain/vo/AccAccountsVo.java | 108 + .../payment/sys/domain/vo/BusDownloadsVo.java | 56 + .../sys/domain/vo/ProInfoCommonVo.java | 75 + .../payment/sys/domain/vo/SelectSydVo.java | 21 + .../sys/domain/vo/SysSydAccountSynVo.java | 62 + .../sys/domain/vo/SysSydAccountVo.java | 141 + .../sys/domain/vo/SysSydCashoutVo.java | 143 + .../payment/sys/domain/vo/SysSydConfigVo.java | 78 + .../payment/sys/domain/vo/SysSydFlowsVo.java | 244 + .../payment/sys/domain/vo/SysSydLogVo.java | 247 + .../sys/domain/vo/SysSydProductVo.java | 270 + .../sys/domain/vo/SysSydSignContentVo.java | 54 + .../payment/sys/domain/vo/SysSydVo.java | 259 + .../payment/sys/domain/vo/SysUnitVo.java | 63 + .../sys/dubbo/RemoteSydServiceImpl.java | 18 + .../payment/sys/mapper/AccAccountsMapper.java | 49 + .../sys/mapper/BusDownloadsMapper.java | 15 + .../sys/mapper/ProInfoCommnoMapper.java | 93 + .../payment/sys/mapper/SysPayPwdMapper.java | 25 + .../sys/mapper/SysSydAccountMapper.java | 177 + .../sys/mapper/SysSydAccountSynMapper.java | 15 + .../sys/mapper/SysSydCashoutMapper.java | 15 + .../sys/mapper/SysSydConfigMapper.java | 15 + .../payment/sys/mapper/SysSydFlowsMapper.java | 28 + .../payment/sys/mapper/SysSydLogMapper.java | 18 + .../payment/sys/mapper/SysSydMapper.java | 50 + .../sys/mapper/SysSydProductMapper.java | 30 + .../sys/mapper/SysSydSignContentMapper.java | 19 + .../payment/sys/mapper/SysUnitMapper.java | 15 + .../sys/service/IAccAccountsService.java | 48 + .../sys/service/IBusDownloadsService.java | 49 + .../sys/service/IProInfoCommonService.java | 75 + .../sys/service/ISysPayPwdService.java | 29 + .../sys/service/ISysSydAccountService.java | 95 + .../sys/service/ISysSydAccountSynService.java | 48 + .../sys/service/ISysSydCashoutService.java | 59 + .../sys/service/ISysSydConfigService.java | 48 + .../sys/service/ISysSydFlowsService.java | 48 + .../sys/service/ISysSydLogService.java | 48 + .../sys/service/ISysSydProductService.java | 50 + .../payment/sys/service/ISysSydService.java | 128 + .../service/ISysSydSignContentService.java | 48 + .../payment/sys/service/ISysUnitService.java | 73 + .../service/impl/AccAccountsServiceImpl.java | 118 + .../BankAccountServiceTransactionImpl.java | 164 + .../service/impl/BusDownloadsServiceImpl.java | 116 + .../impl/ProInfoCommonServiceImpl.java | 201 + .../service/impl/SysPayPwdServiceImpl.java | 204 + .../impl/SysSydAccountServiceImpl.java | 175 + .../impl/SysSydAccountSynServiceImpl.java | 112 + .../impl/SysSydCashoutServiceImpl.java | 294 + .../service/impl/SysSydConfigServiceImpl.java | 113 + .../service/impl/SysSydFlowsServiceImpl.java | 145 + .../service/impl/SysSydLogServiceImpl.java | 142 + .../impl/SysSydProductServiceImpl.java | 224 + .../sys/service/impl/SysSydServiceImpl.java | 536 + .../impl/SysSydServiceTransactionImpl.java | 206 + .../impl/SysSydSignContentServiceImpl.java | 111 + .../sys/service/impl/SysUnitServiceImpl.java | 165 + .../task/controller/MerTaskController.java | 177 + .../controller/MerTaskEnrollController.java | 144 + .../dromara/payment/task/domain/MerTask.java | 273 + .../payment/task/domain/MerTaskDetail.java | 26 + .../payment/task/domain/MerTaskEnroll.java | 128 + .../payment/task/domain/bo/MerTaskBo.java | 277 + .../task/domain/bo/MerTaskEnrollBo.java | 110 + .../convert/MerTaskEnrollVoConvert.java | 19 + .../task/domain/convert/MerTaskVoConvert.java | 19 + .../task/domain/vo/MerTaskEnrollVo.java | 168 + .../payment/task/domain/vo/MerTaskVo.java | 329 + .../task/mapper/MerTaskEnrollMapper.java | 36 + .../payment/task/mapper/MerTaskMapper.java | 24 + .../task/service/IMerTaskEnrollService.java | 55 + .../payment/task/service/IMerTaskService.java | 66 + .../impl/MerTaskEnrollServiceImpl.java | 298 + .../task/service/impl/MerTaskServiceImpl.java | 696 + .../controller/MerTaxRecordsController.java | 195 + .../MerTaxRecordsDetailController.java | 106 + .../controller/SwMonitorController.java | 85 + .../taxRecords/domain/MerTaxRecords.java | 117 + .../domain/MerTaxRecordsDetail.java | 123 + .../taxRecords/domain/bo/MerTaxRecordsBo.java | 117 + .../domain/bo/MerTaxRecordsDetailBo.java | 132 + .../taxRecords/domain/bo/SwMonitorBo.java | 41 + .../domain/vo/MerTaxRecordsDetailVo.java | 76 + .../taxRecords/domain/vo/MerTaxRecordsVo.java | 183 + .../taxRecords/domain/vo/SwMonitorVo.java | 66 + .../mapper/MerTaxRecordsDetailMapper.java | 76 + .../mapper/MerTaxRecordsMapper.java | 41 + .../taxRecords/mapper/SwMonitorMapper.java | 41 + .../service/IMerTaxRecordsDetailService.java | 49 + .../service/IMerTaxRecordsService.java | 108 + .../taxRecords/service/ISwMonitorService.java | 47 + .../service/impl/AsyncTaxRecordsService.java | 164 + .../impl/MerTaxRecordsDetailServiceImpl.java | 130 + .../impl/MerTaxRecordsServiceImpl.java | 240 + .../service/impl/SwMonitorServiceImpl.java | 234 + .../base/IBaseBusinessFlowService.java | 16 + .../SysThirdPlatformController.java | 29 + .../base/domain/SysThirdPlatform.java | 62 + .../base/domain/bo/SysThirdPlatformBo.java | 67 + .../base/domain/vo/SysThirdPlatformVo.java | 70 + .../base/mapper/SysThirdPlatformMapper.java | 20 + .../utils/PaymentAccountBeanBase.java | 130 + .../utils/PaymentConfigBase.java | 83 + .../utils/PaymentConfigUtils.java | 47 + .../config/XinyujianAccountBean.java | 26 + .../xinyujian/config/XinyujianConfig.java | 31 + .../xinyujian/config/XyjConfig.java | 27 + .../controller/XyjCallbackController.java | 101 + .../xinyujian/domain/ThirdItemTaskTypes.java | 87 + .../domain/bo/ThirdItemTaskTypesBo.java | 97 + .../domain/vo/ThirdItemTaskTypesVo.java | 100 + .../mapper/ThirdItemTaskTypesMapper.java | 15 + .../service/IThirdItemTaskTypesService.java | 48 + .../xinyujian/service/IXyjService.java | 144 + .../ThirdItemTaskTypesServiceImpl.java | 117 + .../xinyujian/service/XyjServerImpl.java | 1001 ++ .../xinyujian/sign/BaseDataVo.java | 70 + .../xinyujian/sign/MD5Utils.java | 170 + .../thirdPlatform/xinyujian/sign/MyRSA.java | 306 + .../timer/BankTransactionCallBackJob.java | 73 + .../payment/timer/BankTransactionJob.java | 87 + .../payment/timer/BankTransactionSynJob.java | 78 + .../payment/timer/CntWorkerBillInfoJob.java | 60 + .../payment/timer/CreateSwMonitorJob.java | 49 + .../timer/InvoiceIogisticsReceivingJob.java | 57 + .../payment/timer/MerchantProductJob.java | 36 + .../payment/timer/SynMerchantAccountJob.java | 124 + .../dromara/payment/util/DateTimeUtil.java | 318 + .../org/dromara/payment/util/MoneyUtils.java | 69 + .../payment/util/UniqueIdGenerator.java | 35 + .../UserWorkerAccountController.java | 120 + .../UserWorkerBusinessController.java | 267 + .../controller/UserWorkerController.java | 106 + .../payment/worker/domain/SysUnitDomain.java | 135 + .../payment/worker/domain/ThirdConf.java | 22 + .../payment/worker/domain/UserWorker.java | 195 + .../worker/domain/UserWorkerAccount.java | 88 + .../worker/domain/UserWorkerAuthorized.java | 73 + .../payment/worker/domain/UserWorkerBill.java | 58 + .../worker/domain/UserWorkerBusiness.java | 151 + .../worker/domain/bo/UserWokerOperBo.java | 78 + .../worker/domain/bo/UserWorkerAccountBo.java | 85 + .../domain/bo/UserWorkerAuthorizedBo.java | 108 + .../worker/domain/bo/UserWorkerBillBo.java | 60 + .../worker/domain/bo/UserWorkerBo.java | 221 + .../domain/bo/UserWorkerBusinessBo.java | 170 + .../worker/domain/vo/ImportResultVo.java | 32 + .../worker/domain/vo/UploadExcelItem.java | 32 + .../worker/domain/vo/UserWorkerAccountVo.java | 117 + .../domain/vo/UserWorkerAuthorizedVo.java | 133 + .../worker/domain/vo/UserWorkerBillVo.java | 68 + .../domain/vo/UserWorkerBusinessVo.java | 265 + .../worker/domain/vo/UserWorkerNoHideVo.java | 20 + .../worker/domain/vo/UserWorkerVo.java | 299 + .../mapper/UserWorkerAccountMapper.java | 27 + .../mapper/UserWorkerAuthorizedMapper.java | 37 + .../worker/mapper/UserWorkerBillMapper.java | 24 + .../mapper/UserWorkerBusinessMapper.java | 124 + .../worker/mapper/UserWorkerMapper.java | 28 + .../service/IIdCardAndOtherService.java | 86 + .../service/IUserWorkerAccountService.java | 57 + .../service/IUserWorkerAuthorizedService.java | 49 + .../service/IUserWorkerBusinessService.java | 124 + .../worker/service/IUserWorkerService.java | 49 + .../TencentIdCardAndOtherServiceImpl.java | 197 + .../impl/UserWorkerAccountServiceImpl.java | 304 + .../impl/UserWorkerAuthorizedServiceImpl.java | 128 + .../impl/UserWorkerBusinessServiceImpl.java | 941 ++ .../service/impl/UserWorkerServiceImpl.java | 140 + .../src/main/resources/application.yml | 36 + .../src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 28 + .../src/main/resources/mapper/package-info.md | 3 + .../mapper/payment/TranLogMapper.xml | 87 + .../payment/bill/MerBillDetailMapper.xml | 115 + .../mapper/payment/bill/MerBillMapper.xml | 84 + .../channel/BusChannelAccountMapper.xml | 126 + .../channel/BusChannelAccountSynMapper.xml | 7 + .../channel/BusChannelCashoutMapper.xml | 60 + .../payment/channel/BusChannelFlowsMapper.xml | 162 + .../payment/channel/BusChannelMapper.xml | 12 + .../channel/BusChannelProductMapper.xml | 102 + .../channel/BusChannelSalesmanMapper.xml | 22 + .../payment/common/BusAccountsMapper.xml | 233 + .../payment/common/BusOperLogMapper.xml | 7 + .../payment/coverPage/CoverPageMapper.xml | 147 + .../invoice/MerInvoiceAddressMapper.xml | 7 + .../payment/invoice/MerInvoiceBillMapper.xml | 183 + .../invoice/MerInvoiceDetailMapper.xml | 7 + .../payment/invoice/MerInvoiceMapper.xml | 196 + .../payment/invoice/MerInvoiceTypeMapper.xml | 44 + .../merchant/BusMerchantAccountMapper.xml | 419 + .../merchant/BusMerchantAccountSynMapper.xml | 79 + .../merchant/BusMerchantAgreementMapper.xml | 7 + .../merchant/BusMerchantCashoutMapper.xml | 7 + .../merchant/BusMerchantConfigMapper.xml | 22 + .../merchant/BusMerchantFlowsMapper.xml | 38 + .../payment/merchant/BusMerchantMapper.xml | 73 + .../merchant/BusMerchantProductMapper.xml | 87 + .../merchant/BusMerchantProductSydMapper.xml | 7 + .../payment/merchant/PubMerchantMapper.xml | 7 + .../merchant/VMerchantBillDayMapper.xml | 7 + .../payment/merchant/VMerchantBillMapper.xml | 7 + .../operator/BusOperatorAccountMapper.xml | 252 + .../operator/BusOperatorAgreementMapper.xml | 7 + .../operator/BusOperatorCashoutMapper.xml | 65 + .../operator/BusOperatorFlowsMapper.xml | 198 + .../payment/operator/BusOperatorMapper.xml | 7 + .../operator/BusOperatorProductMapper.xml | 121 + .../operator/ReProductInvoiceMapper.xml | 32 + .../mapper/payment/syd/AccAccountsMapper.xml | 184 + .../mapper/payment/syd/BusDownloadsMapper.xml | 7 + .../payment/syd/ProInfoCommonMapper.xml | 169 + .../mapper/payment/syd/SysPayPwd.xml | 18 + .../payment/syd/SysSydAccountMapper.xml | 244 + .../payment/syd/SysSydAccountSynMapper.xml | 7 + .../payment/syd/SysSydCashoutMapper.xml | 7 + .../mapper/payment/syd/SysSydConfigMapper.xml | 7 + .../mapper/payment/syd/SysSydFlowsMapper.xml | 238 + .../mapper/payment/syd/SysSydLogMapper.xml | 82 + .../mapper/payment/syd/SysSydMapper.xml | 140 + .../payment/syd/SysSydProductMapper.xml | 74 + .../payment/syd/SysSydSignContentMapper.xml | 78 + .../mapper/payment/syd/SysUnitMapper.xml | 7 + .../payment/task/MerTaskEnrollMapper.xml | 73 + .../mapper/payment/task/MerTaskMapper.xml | 52 + .../taxRecords/MerTaxRecordsDetailMapper.xml | 69 + .../taxRecords/MerTaxRecordsMapper.xml | 54 + .../payment/taxRecords/SwMonitorMapper.xml | 49 + .../thirdPlatform/SysThirdPlatformMapper.xml | 13 + .../worker/UserWorkerAccountMapper.xml | 14 + .../worker/UserWorkerAuthorizedMapper.xml | 26 + .../payment/worker/UserWorkerBillMapper.xml | 24 + .../worker/UserWorkerBusinessMapper.xml | 159 + .../payment/worker/UserWorkerMapper.xml | 50 + .../src/main/resources/spy.properties | 28 + .../payment/invoice/InvoiceImplTest.java | 11629 ++++++++++++++++ ruoyi-modules/ruoyi-resource/Dockerfile | 23 + ruoyi-modules/ruoyi-resource/pom.xml | 171 + .../resource/RuoYiResourceApplication.java | 26 + .../controller/SysDhqSignController.java | 52 + .../controller/SysEmailController.java | 60 + .../controller/SysOssConfigController.java | 100 + .../resource/controller/SysOssController.java | 124 + .../resource/controller/SysSmsController.java | 78 + .../resource/danmi_sms/DMSmsUtils.java | 213 + .../danmi_sms/common/DMSmsResult.java | 43 + .../danmi_sms/common/DMSmsSendResult.java | 53 + .../danmi_sms/common/DMSmsSendResultDtl.java | 99 + .../resource/danmi_sms/common/HttpUtil.java | 86 + .../resource/danmi_sms/common/SmsDto.java | 51 + .../resource/danmi_sms/config/Config.java | 68 + .../resource/danmi_sms/config/SmsConfig.java | 48 + .../resource/domain/BusMerchantAgreement.java | 31 + .../resource/domain/BusOperatorAgreement.java | 19 + .../org/dromara/resource/domain/DhqSign.java | 57 + .../resource/domain/MerTaskEnroll.java | 35 + .../resource/domain/PcSignatoryDto.java | 33 + .../org/dromara/resource/domain/SysOss.java | 50 + .../dromara/resource/domain/SysOssConfig.java | 90 + .../dromara/resource/domain/SysSignLog.java | 68 + .../org/dromara/resource/domain/SysSms.java | 127 + .../dromara/resource/domain/UserWorkAuth.java | 26 + .../resource/domain/UserWorkerBiz.java | 27 + .../dromara/resource/domain/bo/SysOssBo.java | 49 + .../resource/domain/bo/SysOssConfigBo.java | 111 + .../dromara/resource/domain/bo/SysSmsBo.java | 98 + .../domain/convert/SysClientVoConvert.java | 17 + .../resource/domain/vo/SysOssConfigVo.java | 96 + .../resource/domain/vo/SysOssUploadVo.java | 34 + .../dromara/resource/domain/vo/SysOssVo.java | 72 + .../resource/domain/vo/SysSignLogVo.java | 68 + .../dromara/resource/domain/vo/SysSmsVo.java | 106 + .../resource/dubbo/RemoteDhqServiceImpl.java | 64 + .../resource/dubbo/RemoteFileServiceImpl.java | 73 + .../resource/dubbo/RemoteJzqServiceImpl.java | 109 + .../resource/dubbo/RemoteMailServiceImpl.java | 33 + .../dubbo/RemoteMessageServiceImpl.java | 42 + .../resource/dubbo/RemoteSmsServiceImpl.java | 153 + .../dubbo/RemoteUserWorkerServiceImpl.java | 224 + .../dubbo/RemoteWeiXinServiceImpl.java | 118 + .../resource/junziqian/common/CommonUtil.java | 183 + .../resource/junziqian/common/JzqUtils.java | 614 + .../resource/junziqian/common/ResultInfo.java | 93 + .../junziqian/common/bean/sign/JzqBack.java | 43 + .../junziqian/common/bean/sign/JzqSign.java | 96 + .../common/exception/ResultInfoException.java | 36 + .../common/http/HttpClientUtils.java | 479 + .../junziqian/openai/ChatGPTUtils.java | 137 + .../junziqian/openai/ChatMessage.java | 59 + .../junziqian/openai/ChatResponse.java | 81 + .../resource/mapper/SysOssConfigMapper.java | 17 + .../dromara/resource/mapper/SysOssMapper.java | 13 + .../resource/mapper/SysSignLogMapper.java | 39 + .../dromara/resource/mapper/SysSmsMapper.java | 15 + .../runner/ResourceApplicationRunner.java | 28 + .../service/ISysOssConfigService.java | 66 + .../resource/service/ISysOssService.java | 42 + .../resource/service/ISysSmsService.java | 70 + .../service/impl/DhqSignServiceImpl.java | 304 + .../service/impl/JzqSignServiceImpl.java | 205 + .../service/impl/SysOssConfigServiceImpl.java | 175 + .../service/impl/SysOssServiceImpl.java | 257 + .../service/impl/SysSmsServiceImpl.java | 256 + .../src/main/resources/application.yml | 74 + .../src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 28 + .../src/main/resources/mapper/package-info.md | 3 + .../mapper/resource/SysOssConfigMapper.xml | 7 + .../mapper/resource/SysOssMapper.xml | 5 + .../mapper/resource/SysSignLogMapper.xml | 44 + .../mapper/resource/SysSmsMapper.xml | 7 + .../src/main/resources/spy.properties | 28 + ruoyi-modules/ruoyi-settlement/Dockerfile | 23 + .../libs/SADK-CMBCNew-3.1.5.0.jar | Bin 0 -> 3684247 bytes .../libs/cryptokit.jni-1.0.jar | Bin 0 -> 4623 bytes .../libs/logback-cfca-jdk1.6-3.1.0.0.jar | Bin 0 -> 898088 bytes ruoyi-modules/ruoyi-settlement/pom.xml | 194 + .../RuoYiSettlementApplication.java | 31 + .../settlement/common/BussinessVariable.java | 66 + .../settlement/common/PostDataTools.java | 643 + .../settlement/common/PropertyUtils.java | 179 + .../dromara/settlement/common/QiniuUtils.java | 189 + .../common/bank/jiaotong/JiaoTongConfig.java | 25 + .../bank/jiaotong/JiaoTongResponse.java | 45 + .../common/bank/jiaotong/JiaoTongUtil.java | 243 + .../bank/minsheng/EcpSecurityResult.java | 60 + .../common/bank/minsheng/EcpSecurityUtil.java | 263 + .../minsheng/FileEncryptAndDecryptUtil.java | 136 + .../common/bank/minsheng/MinShengConfig.java | 74 + .../bank/minsheng/MinShengConstants.java | 26 + .../bank/minsheng/MinShengResponse.java | 179 + .../common/bank/minsheng/MinShengUtil.java | 254 + .../common/bank/zhaoshang/DCCryptor.java | 138 + .../common/bank/zhaoshang/DCHelper.java | 204 + .../bank/zhaoshang/ZhaoShangConfig.java | 44 + .../bank/zhaoshang/ZhaoShangResponse.java | 46 + .../common/bank/zhaoshang/ZhaoShangUtil.java | 141 + .../common/bank/zhifubao/ZhiFuBaoConfig.java | 12 + .../bank/zhifubao/ZhiFuBaoResponse.java | 45 + .../common/bank/zhifubao/ZhiFuBaoUtil.java | 62 + .../settlement/common/file/FileUtils.java | 100 + .../settlement/common/file/SftpUtils.java | 225 + .../settlement/common/file/ZipUtils.java | 291 + .../settlement/common/http/GCMD5Util.java | 234 + .../common/http/HttpResultData.java | 24 + .../settlement/common/http/HttpUtil.java | 200 + .../common/http/MyX509TrustManager.java | 29 + .../common/http/SynRequestThread.java | 108 + .../settlement/common/http/SynResponse.java | 54 + .../controller/ZhiFuBaoController.java | 66 + .../dromara/settlement/domain/SelectData.java | 62 + .../org/dromara/settlement/domain/SysLog.java | 75 + .../settlement/domain/SysUnitConfig.java | 145 + .../settlement/domain/SysUnitConfigKey.java | 23 + .../settlement/domain/qiniu/ImageInfo.java | 52 + .../settlement/domain/qiniu/UploadPolicy.java | 213 + .../dubbo/RemoteAccountServiceImpl.java | 685 + .../dubbo/RemoteAuthServiceImpl.java | 182 + .../dubbo/RemoteConfigServiceImpl.java | 441 + .../settlement/mapper/AccountLogMapper.java | 53 + .../settlement/mapper/AccountMapper.java | 44 + .../settlement/mapper/AccountSynMapper.java | 26 + .../settlement/mapper/SignZhifubaoMapper.java | 37 + .../settlement/mapper/SysLogMapper.java | 26 + .../mapper/SysUnitConfigMapper.java | 133 + .../mapper/TransactionLogMapper.java | 55 + .../settlement/service/IPublicService.java | 26 + .../impl/AccountServiceTransactionImpl.java | 117 + .../service/impl/JitaoTongServiceImpl.java | 665 + .../service/impl/MinShengServiceImpl.java | 719 + .../service/impl/PublicServiceImpl.java | 146 + .../service/impl/ZhaoShangServiceImpl.java | 833 ++ .../service/impl/ZhiFuBaoServiceImpl.java | 622 + .../src/main/resources/application.yml | 36 + .../src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 28 + .../src/main/resources/mapper/package-info.md | 3 + .../mapper/settlement/AccountLogMapper.xml | 301 + .../mapper/settlement/AccountMapper.xml | 215 + .../mapper/settlement/AccountSynMapper.xml | 146 + .../mapper/settlement/SignZhifubaoMapper.xml | 203 + .../mapper/settlement/SysLogMapper.xml | 126 + .../mapper/settlement/SysUnitConfigMapper.xml | 299 + .../settlement/TransactionLogMapper.xml | 266 + .../src/main/resources/spy.properties | 28 + .../java/org/dromara/settlement/Test.java | 40 + ruoyi-modules/ruoyi-system/Dockerfile | 23 + ruoyi-modules/ruoyi-system/pom.xml | 140 + .../system/RuoYiSystemApplication.java | 24 + .../controller/monitor/CacheController.java | 55 + .../monitor/SysLogininforController.java | 89 + .../monitor/SysOperlogController.java | 75 + .../monitor/SysUserOnlineController.java | 89 + .../controller/system/SysAreaController.java | 122 + .../system/SysClientController.java | 115 + .../system/SysConfigController.java | 137 + .../controller/system/SysDeptController.java | 123 + .../system/SysDictDataController.java | 117 + .../system/SysDictTypeController.java | 125 + .../system/SysIndustryController.java | 118 + .../controller/system/SysMenuController.java | 192 + .../system/SysNoticeController.java | 100 + .../controller/system/SysPostController.java | 121 + .../system/SysProfileController.java | 135 + .../controller/system/SysRoleController.java | 228 + .../system/SysSocialController.java | 38 + .../system/SysTenantController.java | 178 + .../system/SysTenantPackageController.java | 135 + .../system/SysUnitDomainController.java | 116 + .../controller/system/SysUserController.java | 527 + .../dromara/system/domain/BpmOrderNum.java | 42 + .../org/dromara/system/domain/SysArea.java | 71 + .../org/dromara/system/domain/SysClient.java | 79 + .../org/dromara/system/domain/SysConfig.java | 51 + .../org/dromara/system/domain/SysDept.java | 79 + .../dromara/system/domain/SysDictData.java | 71 + .../dromara/system/domain/SysDictType.java | 41 + .../dromara/system/domain/SysIndustry.java | 63 + .../dromara/system/domain/SysLogininfor.java | 85 + .../org/dromara/system/domain/SysMenu.java | 194 + .../org/dromara/system/domain/SysNotice.java | 65 + .../org/dromara/system/domain/SysOperLog.java | 115 + .../org/dromara/system/domain/SysPost.java | 51 + .../org/dromara/system/domain/SysRole.java | 79 + .../dromara/system/domain/SysRoleDept.java | 29 + .../dromara/system/domain/SysRoleMenu.java | 29 + .../org/dromara/system/domain/SysSocial.java | 136 + .../org/dromara/system/domain/SysTenant.java | 103 + .../system/domain/SysTenantPackage.java | 56 + .../dromara/system/domain/SysUnitDomain.java | 140 + .../org/dromara/system/domain/SysUser.java | 179 + .../dromara/system/domain/SysUserMenu.java | 35 + .../dromara/system/domain/SysUserPost.java | 29 + .../dromara/system/domain/SysUserRole.java | 29 + .../dromara/system/domain/bo/SysAreaBo.java | 72 + .../dromara/system/domain/bo/SysClientBo.java | 80 + .../dromara/system/domain/bo/SysConfigBo.java | 60 + .../dromara/system/domain/bo/SysDeptBo.java | 70 + .../system/domain/bo/SysDictDataBo.java | 80 + .../system/domain/bo/SysDictTypeBo.java | 50 + .../system/domain/bo/SysIndustryBo.java | 62 + .../system/domain/bo/SysLogininforBo.java | 87 + .../dromara/system/domain/bo/SysMenuBo.java | 111 + .../dromara/system/domain/bo/SysNoticeBo.java | 67 + .../system/domain/bo/SysOperLogBo.java | 127 + .../dromara/system/domain/bo/SysPostBo.java | 59 + .../dromara/system/domain/bo/SysRoleBo.java | 94 + .../dromara/system/domain/bo/SysSocialBo.java | 142 + .../dromara/system/domain/bo/SysTenantBo.java | 114 + .../system/domain/bo/SysTenantPackageBo.java | 60 + .../system/domain/bo/SysUnitDomainBo.java | 145 + .../dromara/system/domain/bo/SysUserBo.java | 145 + .../system/domain/bo/SysUserMenuBo.java | 36 + .../system/domain/bo/SysUserPasswordBo.java | 34 + .../system/domain/bo/SysUserProfileBo.java | 66 + .../domain/convert/SysClientVoConvert.java | 17 + .../domain/convert/SysDictDataVoConvert.java | 17 + .../convert/SysLogininforBoConvert.java | 17 + .../domain/convert/SysNoticeVoConvert.java | 13 + .../domain/convert/SysOperLogBoConvert.java | 25 + .../domain/convert/SysSocialBoConvert.java | 17 + .../domain/convert/SysSocialVoConvert.java | 17 + .../domain/convert/SysTenantVoConvert.java | 17 + .../convert/SysUnitDomainRemoteConvert.java | 19 + .../convert/SysUnitDomainVoConvert.java | 19 + .../domain/convert/SysUserBoConvert.java | 29 + .../domain/convert/SysUserRemoteConvert.java | 19 + .../dromara/system/domain/vo/AvatarVo.java | 24 + .../system/domain/vo/CacheListInfoVo.java | 28 + .../system/domain/vo/DeptTreeSelectVo.java | 31 + .../system/domain/vo/MenuTreeSelectVo.java | 31 + .../org/dromara/system/domain/vo/MetaVo.java | 67 + .../dromara/system/domain/vo/ProfileVo.java | 35 + .../dromara/system/domain/vo/RouterVo.java | 67 + .../dromara/system/domain/vo/SysAreaVo.java | 80 + .../dromara/system/domain/vo/SysClientVo.java | 89 + .../dromara/system/domain/vo/SysConfigVo.java | 72 + .../dromara/system/domain/vo/SysDeptVo.java | 96 + .../system/domain/vo/SysDictDataVo.java | 88 + .../system/domain/vo/SysDictTypeVo.java | 57 + .../system/domain/vo/SysIndustryVo.java | 68 + .../system/domain/vo/SysLogininforVo.java | 106 + .../dromara/system/domain/vo/SysMenuVo.java | 118 + .../dromara/system/domain/vo/SysNoticeVo.java | 89 + .../system/domain/vo/SysOperLogVo.java | 144 + .../dromara/system/domain/vo/SysPostVo.java | 73 + .../dromara/system/domain/vo/SysRoleVo.java | 100 + .../dromara/system/domain/vo/SysSocialVo.java | 144 + .../system/domain/vo/SysTenantPackageVo.java | 66 + .../dromara/system/domain/vo/SysTenantVo.java | 115 + .../system/domain/vo/SysUnitDomainVo.java | 173 + .../system/domain/vo/SysUserExportVo.java | 99 + .../system/domain/vo/SysUserImportVo.java | 77 + .../system/domain/vo/SysUserInfoVo.java | 45 + .../system/domain/vo/SysUserMenuVo.java | 44 + .../dromara/system/domain/vo/SysUserVo.java | 203 + .../dromara/system/domain/vo/UserInfoVo.java | 35 + .../system/dubbo/RemoteClientServiceImpl.java | 33 + .../system/dubbo/RemoteConfigServiceImpl.java | 49 + .../dubbo/RemoteDataScopeServiceImpl.java | 60 + .../system/dubbo/RemoteDeptServiceImpl.java | 25 + .../system/dubbo/RemoteDictServiceImpl.java | 33 + .../system/dubbo/RemoteLogServiceImpl.java | 39 + .../system/dubbo/RemoteNoticeServiceImpl.java | 37 + .../dubbo/RemoteOrderNumServiceImpl.java | 37 + .../system/dubbo/RemoteSocialServiceImpl.java | 63 + .../system/dubbo/RemoteTenantServiceImpl.java | 43 + .../system/dubbo/RemoteUserServiceImpl.java | 263 + .../listener/SysUserImportListener.java | 119 + .../dromara/system/mapper/CommonMapper.java | 29 + .../dromara/system/mapper/SysAreaMapper.java | 15 + .../system/mapper/SysClientMapper.java | 14 + .../system/mapper/SysConfigMapper.java | 14 + .../dromara/system/mapper/SysDeptMapper.java | 46 + .../system/mapper/SysDictDataMapper.java | 23 + .../system/mapper/SysDictTypeMapper.java | 14 + .../system/mapper/SysIndustryMapper.java | 15 + .../system/mapper/SysLogininforMapper.java | 14 + .../dromara/system/mapper/SysMenuMapper.java | 94 + .../system/mapper/SysNoticeMapper.java | 30 + .../system/mapper/SysOperLogMapper.java | 14 + .../dromara/system/mapper/SysPostMapper.java | 32 + .../system/mapper/SysRoleDeptMapper.java | 13 + .../dromara/system/mapper/SysRoleMapper.java | 71 + .../system/mapper/SysRoleMenuMapper.java | 13 + .../system/mapper/SysSocialMapper.java | 14 + .../system/mapper/SysTenantMapper.java | 14 + .../system/mapper/SysTenantPackageMapper.java | 14 + .../system/mapper/SysUnitDomainMapper.java | 15 + .../dromara/system/mapper/SysUserMapper.java | 130 + .../system/mapper/SysUserMenuMapper.java | 15 + .../system/mapper/SysUserPostMapper.java | 13 + .../system/mapper/SysUserRoleMapper.java | 17 + .../org/dromara/system/service/IOrderNum.java | 16 + .../system/service/ISysAreaService.java | 55 + .../system/service/ISysClientService.java | 58 + .../system/service/ISysConfigService.java | 87 + .../system/service/ISysDeptService.java | 125 + .../system/service/ISysDictDataService.java | 67 + .../system/service/ISysDictTypeService.java | 95 + .../system/service/ISysIndustryService.java | 62 + .../system/service/ISysLogininforService.java | 47 + .../system/service/ISysMenuService.java | 169 + .../system/service/ISysNoticeService.java | 69 + .../system/service/ISysOperLogService.java | 54 + .../system/service/ISysPermissionService.java | 28 + .../system/service/ISysPostService.java | 106 + .../system/service/ISysRoleService.java | 183 + .../system/service/ISysSocialService.java | 56 + .../service/ISysTenantPackageService.java | 57 + .../system/service/ISysTenantService.java | 82 + .../system/service/ISysUnitDomainService.java | 58 + .../system/service/ISysUserService.java | 313 + .../system/service/impl/BpmOrderNumImpl.java | 97 + .../service/impl/SysAreaServiceImpl.java | 118 + .../service/impl/SysClientServiceImpl.java | 143 + .../service/impl/SysConfigServiceImpl.java | 205 + .../service/impl/SysDeptServiceImpl.java | 326 + .../service/impl/SysDictDataServiceImpl.java | 138 + .../service/impl/SysDictTypeServiceImpl.java | 206 + .../service/impl/SysIndustryServiceImpl.java | 155 + .../impl/SysLogininforServiceImpl.java | 108 + .../service/impl/SysMenuServiceImpl.java | 476 + .../service/impl/SysNoticeServiceImpl.java | 172 + .../service/impl/SysOperLogServiceImpl.java | 129 + .../impl/SysPermissionServiceImpl.java | 61 + .../service/impl/SysPostServiceImpl.java | 188 + .../service/impl/SysRoleServiceImpl.java | 486 + .../service/impl/SysSensitiveServiceImpl.java | 47 + .../service/impl/SysSocialServiceImpl.java | 107 + .../impl/SysTenantPackageServiceImpl.java | 145 + .../service/impl/SysTenantServiceImpl.java | 372 + .../impl/SysUnitDomainServiceImpl.java | 133 + .../service/impl/SysUserServiceImpl.java | 822 ++ .../src/main/resources/application.yml | 36 + .../src/main/resources/banner.txt | 10 + .../src/main/resources/logback-plus.xml | 28 + .../src/main/resources/mapper/package-info.md | 3 + .../resources/mapper/system/CommonMapper.xml | 26 + .../resources/mapper/system/SysAreaMapper.xml | 7 + .../mapper/system/SysClientMapper.xml | 7 + .../mapper/system/SysConfigMapper.xml | 7 + .../resources/mapper/system/SysDeptMapper.xml | 29 + .../mapper/system/SysDictDataMapper.xml | 7 + .../mapper/system/SysDictTypeMapper.xml | 7 + .../mapper/system/SysIndustryMapper.xml | 7 + .../mapper/system/SysLogininforMapper.xml | 7 + .../resources/mapper/system/SysMenuMapper.xml | 175 + .../mapper/system/SysNoticeMapper.xml | 49 + .../mapper/system/SysOperLogMapper.xml | 7 + .../resources/mapper/system/SysPostMapper.xml | 26 + .../mapper/system/SysRoleDeptMapper.xml | 7 + .../resources/mapper/system/SysRoleMapper.xml | 67 + .../mapper/system/SysRoleMenuMapper.xml | 7 + .../mapper/system/SysSocialMapper.xml | 7 + .../mapper/system/SysTenantMapper.xml | 7 + .../mapper/system/SysTenantPackageMapper.xml | 7 + .../mapper/system/SysUnitDomainMapper.xml | 7 + .../resources/mapper/system/SysUserMapper.xml | 153 + .../mapper/system/SysUserMenuMapper.xml | 7 + .../mapper/system/SysUserPostMapper.xml | 7 + .../mapper/system/SysUserRoleMapper.xml | 13 + .../mapper/system/UserWorkerMapper.xml | 7 + .../src/main/resources/spy.properties | 28 + .../impl/SysIndustryServiceImplTest.java | 142 + 1366 files changed, 149176 insertions(+) create mode 100644 ruoyi-api/pom.xml create mode 100644 ruoyi-api/ruoyi-api-bom/pom.xml create mode 100644 ruoyi-api/ruoyi-api-mp/pom.xml create mode 100644 ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java create mode 100644 ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java create mode 100644 ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java create mode 100644 ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java create mode 100644 ruoyi-api/ruoyi-api-payment/pom.xml create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java create mode 100644 ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java create mode 100644 ruoyi-api/ruoyi-api-resource/pom.xml create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java create mode 100644 ruoyi-api/ruoyi-api-settlement/pom.xml create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java create mode 100644 ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java create mode 100644 ruoyi-api/ruoyi-api-system/pom.xml create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java create mode 100644 ruoyi-auth/Dockerfile create mode 100644 ruoyi-auth/pom.xml create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java create mode 100644 ruoyi-auth/src/main/resources/application.yml create mode 100644 ruoyi-auth/src/main/resources/banner.txt create mode 100644 ruoyi-auth/src/main/resources/logback-plus.xml create mode 100644 ruoyi-example/pom.xml create mode 100644 ruoyi-example/ruoyi-demo/README.md create mode 100644 ruoyi-example/ruoyi-demo/pom.xml create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/application.yml create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/banner.txt create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/excel/多列表.xlsx create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-example/ruoyi-demo/src/main/resources/spy.properties create mode 100644 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java create mode 100644 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java create mode 100644 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java create mode 100644 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java create mode 100644 ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java create mode 100644 ruoyi-example/ruoyi-stream-mq/pom.xml create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt create mode 100644 ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml create mode 100644 ruoyi-gateway/Dockerfile create mode 100644 ruoyi-gateway/pom.xml create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java create mode 100644 ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java create mode 100644 ruoyi-gateway/src/main/resources/application.yml create mode 100644 ruoyi-gateway/src/main/resources/banner.txt create mode 100644 ruoyi-gateway/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/pom.xml create mode 100644 ruoyi-modules/ruoyi-flexible/pom.xml create mode 100644 ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java create mode 100644 ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java create mode 100644 ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-gen/Dockerfile create mode 100644 ruoyi-modules/ruoyi-gen/pom.xml create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm create mode 100644 ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 ruoyi-modules/ruoyi-job/Dockerfile create mode 100644 ruoyi-modules/ruoyi-job/pom.xml create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-job/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-job/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-mp/pom.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml create mode 100644 ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-payment/Dockerfile create mode 100644 ruoyi-modules/ruoyi-payment/pom.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml create mode 100644 ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java create mode 100644 ruoyi-modules/ruoyi-resource/Dockerfile create mode 100644 ruoyi-modules/ruoyi-resource/pom.xml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml create mode 100644 ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-settlement/Dockerfile create mode 100644 ruoyi-modules/ruoyi-settlement/libs/SADK-CMBCNew-3.1.5.0.jar create mode 100644 ruoyi-modules/ruoyi-settlement/libs/cryptokit.jni-1.0.jar create mode 100644 ruoyi-modules/ruoyi-settlement/libs/logback-cfca-jdk1.6-3.1.0.0.jar create mode 100644 ruoyi-modules/ruoyi-settlement/pom.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java create mode 100644 ruoyi-modules/ruoyi-system/Dockerfile create mode 100644 ruoyi-modules/ruoyi-system/pom.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/application.yml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/banner.txt create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/spy.properties create mode 100644 ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml new file mode 100644 index 0000000..0c9e788 --- /dev/null +++ b/ruoyi-api/pom.xml @@ -0,0 +1,27 @@ + + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + + ruoyi-api-bom + ruoyi-api-system + ruoyi-api-resource + ruoyi-api-payment + ruoyi-api-settlement + ruoyi-api-mp + + + ruoyi-api + pom + + + ruoyi-api系统接口 + + + diff --git a/ruoyi-api/ruoyi-api-bom/pom.xml b/ruoyi-api/ruoyi-api-bom/pom.xml new file mode 100644 index 0000000..b380adb --- /dev/null +++ b/ruoyi-api/ruoyi-api-bom/pom.xml @@ -0,0 +1,57 @@ + + + + 4.0.0 + + org.dromara + ruoyi-api-bom + pom + ${revision} + + + ruoyi-api-bom api依赖项 + + + + 2.1.2 + + + + + + + org.dromara + ruoyi-api-system + ${revision} + + + + + org.dromara + ruoyi-api-resource + ${revision} + + + + org.dromara + ruoyi-api-payment + ${revision} + + + + org.dromara + ruoyi-api-settlement + ${revision} + + + + org.dromara + ruoyi-api-mp + ${revision} + + + + + diff --git a/ruoyi-api/ruoyi-api-mp/pom.xml b/ruoyi-api/ruoyi-api-mp/pom.xml new file mode 100644 index 0000000..101d184 --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.dromara + ruoyi-api + ${revision} + + + ruoyi-api-mp + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java new file mode 100644 index 0000000..819810b --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteSysDomainService.java @@ -0,0 +1,29 @@ +package org.dromara.map.api; + +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteSysDomainService + * @description + * @create 2024-04-07 16:41 + */ +public interface RemoteSysDomainService { + + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:35 + * 说明:获取短信配置 + **/ + + Map selSmsConfig(String domainCode); + + +} diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java new file mode 100644 index 0000000..1f2d5ed --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/RemoteUserWokerService.java @@ -0,0 +1,26 @@ +package org.dromara.map.api; + +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWokerService + * @description + * @create 2024-03-29 10:55 + */ +public interface RemoteUserWokerService { + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-01 11:33 + * 说明:根据手机号、租户ID,查询自雇者 + **/ + public LoginMpUser selectUserWorkByPhonenumer(String phonenumber, String tenantId); + +} diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java new file mode 100644 index 0000000..5665a8c --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/domain/RemoteUserWorkerVo.java @@ -0,0 +1,186 @@ +package org.dromara.map.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者视图对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteUserWorkerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 身份证正面图片 + */ + private String cardPositive; + + /** + * 身份证反面图片 + */ + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Integer isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + private Date issueDate; + + /** + * 失效日期 + */ + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + +} diff --git a/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java new file mode 100644 index 0000000..39ea631 --- /dev/null +++ b/ruoyi-api/ruoyi-api-mp/src/main/java/org/dromara/map/api/model/LoginMpUser.java @@ -0,0 +1,156 @@ +package org.dromara.map.api.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +/** + * 用户信息 + * + * @author ruoyi + */ +@Data +@NoArgsConstructor +public class LoginMpUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 用户昵称 + */ + private String name; + + /** + * 密码 + */ + private String password; + + + + /** + * 当前角色id + */ + private Long curRoleId; + + /** + * 当前角色名称 + */ + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Integer busId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + + private String phone; + + /** + * 获取登录id + */ + public String getLoginId() { + if (userType == null) { + throw new IllegalArgumentException("用户类型不能为空"); + } + if (userId == null) { + throw new IllegalArgumentException("用户ID不能为空"); + } + return userType + ":" + userId; + } + +} diff --git a/ruoyi-api/ruoyi-api-payment/pom.xml b/ruoyi-api/ruoyi-api-payment/pom.xml new file mode 100644 index 0000000..6cbe939 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-payment + + + ruoyi-api-payment系统接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java new file mode 100644 index 0000000..f71cfb5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillDetailVo.java @@ -0,0 +1,312 @@ +package org.dromara.payment.api.bill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 账单明细视图对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerBillDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目子编号 + */ + private String cno; + + /** + * 流水号(系统内部编号) + */ + private String busNo; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + private String workerName; + + /** + * 手机号 + */ + private String workerPhone; + + /** + * 自雇者报名id + */ + private Long workerEnrollId; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 开户行 + */ + private String bankCheque; + + /** + * 账单金额(个人应得) + */ + private Long money; + + /** + * 个税 + */ + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ + private Long amount; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + private Integer payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * B2C回执单地址 + */ + private String payReceipt; + + /** + * 服务费(分) + */ + private Long serviceChargeMoney; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ + private Integer isRefund; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算通道 + */ + private String passage; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * B2B回执单地址 + */ + private String payReceiptB2b; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 运营商服务费率 + */ + private BigDecimal opServiceChargeRate; + + /** + * 运营商分润(分) + */ + private Long opServiceChargeMoney; + + /** + * 孵化中心服务费率 + */ + private BigDecimal fhzxServiceChargeRate; + + /** + * 孵化中心收益(分) + */ + private Long fhzxServiceChargeMoney; + + /** + * 孵化中心id + */ + private Long fhzxChannelId; + + /** + * 总监服务费率 + */ + private BigDecimal zjServiceChargeRate; + + /** + * 总监收益(分) + */ + private Long zjServiceChargeMoney; + + /** + * 总监id + */ + private Long zjChannelId; + + /** + * 业务员服务费率 + */ + private BigDecimal ywyServiceChargeRate; + + /** + * 业务员收益(分) + */ + private Long ywyServiceChargeMoney; + + /** + * 业务员id + */ + private Long ywyChannelId; + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + private String billRemark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java new file mode 100644 index 0000000..5b2ae4c --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/bill/domain/RemoteMerBillVo.java @@ -0,0 +1,277 @@ +package org.dromara.payment.api.bill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 账单视图对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + private String no; + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + private Long serviceChargeType; + + /** + * 服务费比例 + */ + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 结算金额(分) + */ + private Long amountEnt; + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + private Long payStatus; + + /** + * 支付完成时间 + */ + private Date payTime; + + /** + * 发放时间 + */ + private Date giveUpTime; + + /** + * 发放人 + */ + private String giveUpBy; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Long verifyStatus; + + /** + * 商户审核人 + */ + private String verifyBy; + + /** + * 商户审核时间 + */ + private Date verifyTime; + + /** + * 商户备注 + */ + private String verifyReason; + + /** + * 结算通道 + */ + private String passage; + + /** + * 批次下账单明细数量 + */ + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + private Long isAgencyFee; + + /** + * 完税税票号 + */ + private String wssph; + + /** + * 委托代征个税税票号 + */ + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + private Date sphTime; + + /** + * 税票号编辑人 + */ + private String sphBy; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + private Integer isInvoice; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java new file mode 100644 index 0000000..6035830 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountSynVo.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户同步记录视图对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java new file mode 100644 index 0000000..2484178 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelAccountVo.java @@ -0,0 +1,96 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户视图对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 总收益(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + private Integer isDefault; + + /** + * 昨日收益(分) + */ + private Long yesterday; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java new file mode 100644 index 0000000..4888ab2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelCashoutVo.java @@ -0,0 +1,146 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商提现记录视图对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 支付凭证图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java new file mode 100644 index 0000000..604ae50 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelFlowsVo.java @@ -0,0 +1,146 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商流水视图对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java new file mode 100644 index 0000000..2201af2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelProductVo.java @@ -0,0 +1,115 @@ +package org.dromara.payment.channel.api.domain; + +import java.math.BigDecimal; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商产品视图对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java new file mode 100644 index 0000000..7daae45 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelSalesmanVo.java @@ -0,0 +1,61 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商业务员视图对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelSalesmanVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 业务员名称 + */ + private String name; + + /** + * 业务员编号 + */ + private String no; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java new file mode 100644 index 0000000..0695320 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/channel/domain/RemoteBusChannelVo.java @@ -0,0 +1,181 @@ +package org.dromara.payment.channel.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商视图对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusChannelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 代理商编号 + */ + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 代理商名称 + */ + private String name; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 父级代理商 + */ + private Long pId; + + /** + * 代理上下级关系编码 + */ + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java new file mode 100644 index 0000000..b4af68a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusAccountsVo.java @@ -0,0 +1,96 @@ +package org.dromara.payment.api.common.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 资金账户汇总视图对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 企业id + */ + private Long unitId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + private Integer addYpe; + + /** + * 外卡卡号 + */ + private String outBankCard; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java new file mode 100644 index 0000000..2472f78 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteBusOperLogVo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.common.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 业务操作日志视图对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +public class RemoteBusOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 日志描述 + */ + private String logDesc; + + /** + * 角色id + */ + private Long createRoleId; + + /** + * 角色名称 + */ + private String createRoleName; + + /** + * 业务id(任务id或账单批次id) + */ + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java new file mode 100644 index 0000000..eef62fd --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/common/domain/RemoteTranLogVo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.common.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 交易记录视图对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +public class RemoteTranLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 交易记录id + */ + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + private Long busItem; + + /** + * 交易场景id +扣除服务费:任务id +账单付款:账单明细id + */ + private Long buisId; + + /** + * 交易批次 + */ + private String busBatch; + + /** + * 交易id + */ + private Long tranId; + + /** + * 申请交易时间 + */ + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + private Integer tranResult; + + /** + * 待处理批次 + */ + private String tranBatch; + + /** + * 交易完成时间 + */ + private Date tranTime; + + /** + * 付款账户id + */ + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer sourceAccType; + + /** + * 收款账户id + */ + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + private Integer isCallback; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java new file mode 100644 index 0000000..468a5d4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceAddressVo.java @@ -0,0 +1,106 @@ +package org.dromara.payment.invoice.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票地址视图对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceAddressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 收件人姓名 + */ + private String name; + + /** + * 收件人手机号 + */ + private String phone; + + /** + * 收件地址 + */ + private String address; + + /** + * 邮箱地址 + */ + private String email; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 发票抬头 + */ + private String header; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 单位注册地址 + */ + private String unitAddress; + + /** + * 单位电话 + */ + private String unitPhone; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开户行地址 + */ + private String bankAddress; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java new file mode 100644 index 0000000..592f39a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceBillVo.java @@ -0,0 +1,119 @@ +package org.dromara.payment.invoice.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票明细视图对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 票据id + */ + private Long invId; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + private Long status; + + /** + * 账单金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单批次号 + */ + private String billNo; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java new file mode 100644 index 0000000..5faa513 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceDetailVo.java @@ -0,0 +1,71 @@ +package org.dromara.payment.invoice.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 开票明细视图对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 票据申请id + */ + private Long invId; + + /** + * 票据申请编号 + */ + private String invNo; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 发票编号 + */ + private String detailNo; + + /** + * 发票样张地址 + */ + private String invPic; + + /** + * 开票类目 + */ + private String category; + + /** + * 添加人 + */ + private String addBy; + + /** + * 添加时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java new file mode 100644 index 0000000..9737ae9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceTypeVo.java @@ -0,0 +1,44 @@ +package org.dromara.payment.invoice.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票类目视图对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 任务类型 + */ + private String parentType; + + /** + * 开票类目 + */ + private String type; + + /** + * 排序 + */ + private Long sort; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java new file mode 100644 index 0000000..5c8b55f --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/invoice/domain/RemoteMerInvoiceVo.java @@ -0,0 +1,236 @@ +package org.dromara.payment.invoice.api.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户发票记录视图对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +public class RemoteMerInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 申请开票流水号 + */ + private String no; + + /** + * 发票抬头 + */ + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Long type; + + /** + * 纳税人识别号 + */ + private String creditCode; + + /** + * 开户银行地址 + */ + private String bankAddress; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开票类目 + */ + private String category; + + /** + * 发票数量(张) + */ + private Long invNum; + + /** + * 开票总金额 + */ + private Long invAmount; + + /** + * 收件地址id + */ + private Long addId; + + /** + * 收件人姓名 + */ + private String addName; + + /** + * 收件人手机号 + */ + private String addPhone; + + /** + * 收件地址 + */ + private String addAddress; + + /** + * 邮箱地址 + */ + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + private Date iogisticsTime; + + /** + * 快递发件人 + */ + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + private Integer status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 取消或驳回人 + */ + private String cancelBy; + + /** + * 取消或驳回原因 + */ + private String cancelReason; + + /** + * 发票备注栏 + */ + private String invRemark; + + /** + * 备注 + */ + private String remark; + + /** + * 单位注册地址 + */ + private String dwzcdz; + + /** + * 单位电话 + */ + private String dwdh; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 快递签收时间 + */ + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + private String iogisticsReceivingBy; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java new file mode 100644 index 0000000..d306778 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/RemoteMerchantService.java @@ -0,0 +1,18 @@ +package org.dromara.payment.api.merchant; + +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; + +import java.util.List; + +/** + * 商户业务 + */ +public interface RemoteMerchantService { + /** + * 获取商户默认的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + RemoteBusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId,Long sydId); +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java new file mode 100644 index 0000000..748ac68 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountSynVo.java @@ -0,0 +1,49 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账户同步视图对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java new file mode 100644 index 0000000..262d738 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAccountVo.java @@ -0,0 +1,105 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户资金账户视图对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + private String merName; + + /** + * 结算中心id + */ + private Long sydId; + + private String sydName; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 可开票已结算金额 + */ + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java new file mode 100644 index 0000000..78c62d4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantAgreementVo.java @@ -0,0 +1,94 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户协议视图对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java new file mode 100644 index 0000000..a6de751 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantCashoutVo.java @@ -0,0 +1,121 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户提现记录视图对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java new file mode 100644 index 0000000..89867b1 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantConfigVo.java @@ -0,0 +1,44 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户配置视图对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + private Integer valiWorker; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java new file mode 100644 index 0000000..0410b89 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantFlowsVo.java @@ -0,0 +1,186 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户流水视图对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + /** + * 说明 + */ + private String illustrate; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java new file mode 100644 index 0000000..e7ac5dc --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantProductVo.java @@ -0,0 +1,130 @@ +package org.dromara.payment.api.merchant.domain; + +import java.math.BigDecimal; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户产品表视图对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java new file mode 100644 index 0000000..940af82 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteBusMerchantVo.java @@ -0,0 +1,356 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户视图对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteBusMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 商户编号 + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + private String jbrSfzfm; + + /** + * 门头全景照 + */ + private String mtqjzPic; + + /** + * 办公照片1 + */ + private String bgzp1Pic; + + /** + * 办公照片2 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 企业规模 + */ + private String scale; + + /** + * 企业logo地址 + */ + private String logo; + + /** + * 企业介绍 + */ + private String introduce; + + /** + * 业务员id + */ + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ + private Integer isValiAcc; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java new file mode 100644 index 0000000..d9ca6c5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemotePubMerchantVo.java @@ -0,0 +1,336 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户申请表视图对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemotePubMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人证件类型 + */ + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人证件号码 + */ + private String frSfz; + + /** + * 法人证件类型 + */ + private String frZjlx; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人证件有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人证件正面 + */ + private String frSfzzm; + + /** + * 法人证件反面 + */ + private String frSfzfm; + + /** + * 经办人证件正面 + */ + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + private String jbrSfzfm; + + /** + * 门牌照片 + */ + private String mtqjzPic; + + /** + * 前台照片 + */ + private String bgzp1Pic; + + /** + * 办公照片 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 流程确认函 + */ + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 主营业务 + */ + private String zyyw; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java new file mode 100644 index 0000000..7ffb775 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillDayVo.java @@ -0,0 +1,86 @@ +package org.dromara.payment.api.merchant.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户日账单汇总表视图对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteVMerchantBillDayVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + private Long merId; + + /** + * 统计日期 + */ + private Date vDate; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java new file mode 100644 index 0000000..fa7caa2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/merchant/domain/RemoteVMerchantBillVo.java @@ -0,0 +1,99 @@ +package org.dromara.payment.api.merchant.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账单汇总表视图对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RemoteVMerchantBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + private Long yearTranMoney; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java new file mode 100644 index 0000000..ae1793f --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/RemoteOperatorService.java @@ -0,0 +1,8 @@ +package org.dromara.payment.api.operator; + +/** + * 运营商业务 + */ +public interface RemoteOperatorService { + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java new file mode 100644 index 0000000..42075a5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAccountVo.java @@ -0,0 +1,96 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商资金账户视图对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 运营商id + */ + private Long opId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 提现中金额(分) + */ + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java new file mode 100644 index 0000000..7535a02 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorAgreementVo.java @@ -0,0 +1,74 @@ +package org.dromara.payment.api.operator.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商协议视图对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java new file mode 100644 index 0000000..6105290 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorCashoutVo.java @@ -0,0 +1,156 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商提现记录视图对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 发票图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java new file mode 100644 index 0000000..0e730ce --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorFlowsVo.java @@ -0,0 +1,176 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商流水视图对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 运营商id + */ + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java new file mode 100644 index 0000000..8ab175a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorProductVo.java @@ -0,0 +1,112 @@ +package org.dromara.payment.api.operator.domain; + +import java.math.BigDecimal; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商产品视图对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 服务商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + private BigDecimal setingServiceCharge; + + + private Long createBy; + + private Date createTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java new file mode 100644 index 0000000..285f38d --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteBusOperatorVo.java @@ -0,0 +1,196 @@ +package org.dromara.payment.api.operator.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商视图对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteBusOperatorVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 运营商名称 + */ + private String name; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java new file mode 100644 index 0000000..bbb8b44 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/operator/domain/RemoteReProductInvoiceVo.java @@ -0,0 +1,59 @@ +package org.dromara.payment.api.operator.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 产品开票类目视图对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +public class RemoteReProductInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + private Long proType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + private Long invoiceTypeId; + + /** + * 业务id(结算中心id或运营商id) + */ + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java new file mode 100644 index 0000000..9101734 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/RemoteSydService.java @@ -0,0 +1,8 @@ +package org.dromara.payment.api.syd; + +/** + * 服务商业务 + */ +public interface RemoteSydService { + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java new file mode 100644 index 0000000..13c7e3f --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/RemoteSysUnitVo.java @@ -0,0 +1,47 @@ +package org.dromara.payment.api.syd.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 单位基础信息视图对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +public class RemoteSysUnitVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 企业名称 + */ + private String name; + + /** + * 企业编号 + */ + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Integer unitType; + + /** + * 平台客户号 + */ + private String custNo; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java new file mode 100644 index 0000000..2783c85 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteAccAccountsVo.java @@ -0,0 +1,84 @@ +package org.dromara.payment.api.syd.domain.syd; + +import java.util.Date; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 线下银行账户视图对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +public class RemoteAccAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户名称 + */ + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer useObj; + + /** + * 使用对象id + */ + private Long useObjId; + + /** + * 使用对象名称 + */ + private String useObjName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java new file mode 100644 index 0000000..9d9c18b --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydAccountVo.java @@ -0,0 +1,93 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商账户视图对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 税源地id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + private Long accType; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java new file mode 100644 index 0000000..88f1ab4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydCashoutVo.java @@ -0,0 +1,113 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商提现记录视图对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java new file mode 100644 index 0000000..cd08fb8 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydConfigVo.java @@ -0,0 +1,58 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 服务商配置视图对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + private Integer end; + + /** + * 税率(%) + */ + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + private Long calStyle; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java new file mode 100644 index 0000000..0f277fc --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydFlowsVo.java @@ -0,0 +1,173 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商流水视图对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java new file mode 100644 index 0000000..2414b63 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydProductVo.java @@ -0,0 +1,76 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 服务商产品视图对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String no; + + /** + * 配置服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java new file mode 100644 index 0000000..a58a89a --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydSignContentVo.java @@ -0,0 +1,43 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 服务商协议内容视图对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydSignContentVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 结算中心id + */ + private Long id; + + /** + * 协议内容 + */ + private String content; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java new file mode 100644 index 0000000..f665512 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/syd/domain/syd/RemoteSysSydVo.java @@ -0,0 +1,194 @@ +package org.dromara.payment.api.syd.domain.syd; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +/** + * 服务商视图对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +public class RemoteSysSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 结算中心编号 + */ + private String no; + + /** + * 结算中心名称 + */ + private String gsmc; + + /** + * 开户地 + */ + private String kfd; + + /** + * 开户行 + */ + private String kfh; + + /** + * 开户行行号 + */ + private String khhNo; + + /** + * 银行类型(字典) + */ + private Long bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 基本税率(%) + */ + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 法人 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frCardid; + + /** + * 法人手机号 + */ + private String frPhone; + + /** + * 联系人姓名 + */ + private String conName; + + /** + * 联系人手机号 + */ + private String conPhone; + + /** + * 联系人身份证 + */ + private String conCardid; + + /** + * 联系人邮箱 + */ + private String conEmail; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java new file mode 100644 index 0000000..5896279 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskEnrollVo.java @@ -0,0 +1,106 @@ +package org.dromara.payment.api.task.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务的报名视图对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerTaskEnrollVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java new file mode 100644 index 0000000..78f2890 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/task/domain/RemoteMerTaskVo.java @@ -0,0 +1,241 @@ +package org.dromara.payment.api.task.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务视图对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +public class RemoteMerTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long classify; + + /** + * 项目编码 + */ + private String no; + + /** + * 项目标题 + */ + private String name; + + /** + * 最小项目总金额(分) + */ + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + private Long costMax; + + /** + * 所属行业 + */ + private String industry; + + /** + * 用工人数(0:不限) + */ + private Long limitNum; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + private Long costUnit; + + /** + * 任务开始日期 + */ + private Date beginDate; + + /** + * 任务结束日期 + */ + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + private Integer status; + + /** + * 上线时间 + */ + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + private Integer taskStatus; + + /** + * 提交审核时间 + */ + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + private String opVerifyReason; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 冻结金额 + */ + private Long frozenAmount; + + /** + * 实发金额 + */ + private Long relAmount; + + /** + * 最新结算时间 + */ + private Date relAmountTime; + + /** + * 已开票金额 + */ + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + private Integer isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + private String sydVerifyReason; + + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java new file mode 100644 index 0000000..8570429 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/RemoteUserWokerService.java @@ -0,0 +1,62 @@ +package org.dromara.payment.api.worker; + +import org.dromara.payment.api.worker.domain.RemoteResultZip; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWokerService + * @description + * @create 2024-05-06 18:13 + */ +public interface RemoteUserWokerService { + + + /*** + * 下载单个用户的身份证信息 + * @param vo + * @return + * @throws Exception + */ + byte[] downLoadSigleSfzZip(RemoteUserWorkerZipVo vo) throws Exception; + + + /**** + * 打包下载发票信息 + * @param list + * @return + * @throws Exception + */ + byte[] downLoadInvZip(List list) throws Exception; + + + /*** + * 下载身份证信息,批量 + * @param list + * @return + */ + RemoteResultZip createWorkerSfzZip(List list)throws Exception; + + + + /*** + * 下载合同信息 + * @param list + * @return + */ + + RemoteResultZip createWorkerHtZip(List list)throws Exception; + + + + /*** + * 下载支付凭证 + * @param list + * @return + */ + + RemoteResultZip createWorkerPayCerZip(List list)throws Exception; +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java new file mode 100644 index 0000000..bb04ff0 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteResultZip.java @@ -0,0 +1,22 @@ +package org.dromara.payment.api.worker.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteResultZip + * @description + * @create 2024-06-21 14:33 + */ +@Data +public class RemoteResultZip implements Serializable { + + + private Long ossId; + + private String url; + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java new file mode 100644 index 0000000..9605fbf --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/api/worker/domain/RemoteUserWorkerZipVo.java @@ -0,0 +1,50 @@ +package org.dromara.payment.api.worker.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWorkerVo + * @description + * @create 2024-05-06 17:58 + */ +@Data +public class RemoteUserWorkerZipVo implements Serializable { + + private static final long serialVersionUID = 1L; + + //用工ID + private Long workId; + + //姓名 + private String workName; + + //身份证正面 + private String cardPositive; + + //身份证反面 + private String cardBack; + + //合同 + private String htUrl; + + + //业务类型 + private Integer busType; + + //业务流水号 + private String busNo; + + //B2C支付回执 + private String payReceipt; + + //发票编号 + private String invNo; + + //发票样张 + private String invPic; + +} diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java new file mode 100644 index 0000000..f9b127b --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/org/dromara/payment/enums/BusLogType.java @@ -0,0 +1,26 @@ +package org.dromara.payment.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 日志业务类型 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum BusLogType { + /** + * 账单 + */ + BILL(2, "账单"), + /** + * 项目 + */ + TASK(1, "项目"); + + private final int id; + private final String name; + +} diff --git a/ruoyi-api/ruoyi-api-resource/pom.xml b/ruoyi-api/ruoyi-api-resource/pom.xml new file mode 100644 index 0000000..619a481 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-resource + + + ruoyi-api-resource 资源服务接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + com.alibaba + fastjson + ${fastjson.version} + + + + diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java new file mode 100644 index 0000000..c1a9d6a --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteDhqService.java @@ -0,0 +1,23 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SignType; +import org.dromara.resource.api.domain.RemoteDhq; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteDhqService + * @description + * @create 2024-05-20 9:54 + */ +public interface RemoteDhqService { + + /***** + * 大鸿签发起签约 + * @param sign + * @return + * @throws Exception + */ + public String becomeSign(RemoteDhq sign, String domain, SignType signType) throws Exception; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java new file mode 100644 index 0000000..6ab788e --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java @@ -0,0 +1,29 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.resource.api.domain.RemoteFile; + +/** + * 文件服务 + * + * @author Lion Li + */ +public interface RemoteFileService { + + /** + * 上传文件 + * + * @param file 文件信息 + * @return 结果 + */ + RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException; + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + String selectUrlByIds(String ossIds); + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java new file mode 100644 index 0000000..c689f2d --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java @@ -0,0 +1,37 @@ +package org.dromara.resource.api; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.domain.RemoteFile; + +/** + * 文件服务(降级处理) + * + * @author Lion Li + */ +@Slf4j +public class RemoteFileServiceMock implements RemoteFileService { + + /** + * 上传文件 + * + * @param file 文件信息 + * @return 结果 + */ + public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) { + log.warn("服务调用异常 -> 降级处理"); + return null; + } + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + public String selectUrlByIds(String ossIds) { + log.warn("服务调用异常 -> 降级处理"); + return StringUtils.EMPTY; + } + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java new file mode 100644 index 0000000..d540bfc --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteJzqService.java @@ -0,0 +1,43 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SignType; +import org.dromara.resource.api.domain.RemoteJzq; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteJzqService + * @description + * @create 2024-05-20 9:54 + */ +public interface RemoteJzqService { + + /***** + * 君子签发起签约 + * @param sign + * @return + * @throws Exception + */ + public String becomeSign(RemoteJzq sign, String domain, SignType signType); + + public String link(String applyNo,String fullName,String identityCard,int identityType); + + public String bankThreeVerify(String name ,String identityCard,String cardNo); + + public String userValid(String name ,String identityCard); + + public String ocrIdentity(String file, Integer front); + + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone); + + public String ocrBank(File file); + + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom); + + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile); + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse); +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java new file mode 100644 index 0000000..b63e541 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMailService.java @@ -0,0 +1,21 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.exception.ServiceException; + +/** + * 邮件服务 + * + * @author Lion Li + */ +public interface RemoteMailService { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + void send(String to, String subject, String text) throws ServiceException; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java new file mode 100644 index 0000000..6b2ecb5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageService.java @@ -0,0 +1,19 @@ +package org.dromara.resource.api; + +/** + * 消息服务 + * + * @author Lion Li + */ +public interface RemoteMessageService { + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param message 消息文本 + */ + void sendMessage(Long sessionKey, String message); + + void publishAll(String message); +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java new file mode 100644 index 0000000..813fba6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteMessageServiceStub.java @@ -0,0 +1,38 @@ +package org.dromara.resource.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 消息服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +public class RemoteMessageServiceStub implements RemoteMessageService { + + private final RemoteMessageService remoteMessageService; + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param message 消息文本 + */ + public void sendMessage(Long sessionKey, String message) { + try { + remoteMessageService.sendMessage(sessionKey, message); + } catch (Exception e) { + log.warn("websocket 功能未开启或服务未找到"); + } + } + + public void publishAll(String message) { + try { + remoteMessageService.publishAll(message); + } catch (Exception e) { + log.warn("websocket 功能未开启或服务未找到"); + } + } +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java new file mode 100644 index 0000000..39b489d --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java @@ -0,0 +1,41 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.resource.api.domain.RemoteSms; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 短信服务 + * + * @author Lion Li + */ +public interface RemoteSmsService { + + /** + * 发送短信 + * + * @param phones 电话号(多个逗号分割) + * @param templateId 模板id + * @param param 模板对应参数 + */ + RemoteSms send(String phones, String templateId, LinkedHashMap param) throws ServiceException; + + + + + Boolean sendSmsCode(SmsType smsType, String phonenumber, LinkedHashMap param, Map configMap); + + /** + * 发送短信 + * + * @param domain 站点名称 + * @param phone 手机号 + * @param smsType 短信类型 + * @param param 模板对应参数 + */ + RemoteSms send(String domain, String phone, SmsType smsType, LinkedHashMap param) throws ServiceException; + + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java new file mode 100644 index 0000000..9a2d546 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWeiXinService.java @@ -0,0 +1,31 @@ +package org.dromara.resource.api; + +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.resource.api.domain.RemoteSms; + +import java.util.LinkedHashMap; + +/** + * 微信服务 + * + * @author Lion Li + */ +public interface RemoteWeiXinService { + + /** + * 生成公众号授权二维码 + * @param redirectUri 授权回调url + * @return + * @throws ServiceException + */ + String genPubAuthQrcode(String domain,String redirectUri) throws ServiceException; + + /** + * 获取授权用户的微信openid + * @param domain + * @param code + * @return + */ + String getOpenId(String domain,String code); +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java new file mode 100644 index 0000000..19e92db --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteDhq.java @@ -0,0 +1,56 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteDhq + * @description + * @create 2024-05-20 9:53 + */ + +@Data +public class RemoteDhq implements Serializable { + //应用ID + private String applicationId; + + //合作账户 ID + private String businessId; + + private String launchName; + + //发起类型 0-个人 1-企业 + private String launchType; + + //发起用户手机号 + private String launchSubject; + + //发起企业名称(launchType 为 1 企业发 + //起合同时必传) + private String launchEnterpriseName; + + //客户发起时定义的编号 + private String customerOriginationNumber; + + //模板编号 + private String contractModelNum; + + //静默签署企业名 +// private String signEnterpriseName; + + //合同名称 + private String contractName; + + //签署人信息 (json 格式字符串) + private String signatoryInfos; + + private List inputValues; + + private Integer signatureType = 0; + + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java new file mode 100644 index 0000000..ecc4b16 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java @@ -0,0 +1,34 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 文件信息 + * + * @author ruoyi + */ +@Data +public class RemoteFile implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * oss主键 + */ + private Long ossId; + + /** + * 文件名称 + */ + private String name; + + /** + * 文件地址 + */ + private String url; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java new file mode 100644 index 0000000..3949a83 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteJzq.java @@ -0,0 +1,96 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +public class RemoteJzq implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 合同名称,非空,最长100个字符 + */ + private String contractName; + + /** + * 签约方,参考后面签约方说明 + */ + private List signatories; + + /** + * 是否需要服务端云证书:非1不需要(默认);1需要;建议需要,否则影响后续司法服务 + */ + private Integer serverCa; + + /** + * 处理方式:为空或0时默认为手签合同(用户有感知);2只保全;5部份自动签;6HASH只保全;17收集信息批量签 + */ + private Integer dealType; + + /** + * 合同模版编号, fileType=2或4, 时必须传入 + */ + private String templateNo; + + /** + * 合同模版参数JSON字符串, fileType=2或4, 时必须传入 + */ + private String templateParams; + + /** + * 2 API模版(HTML源码); 4 API模板(PDF文件/word文件) + */ + private Integer fileType; + + /** + * ofd文件追加内容(0不能追加内容,1允许追加内容),允许追加内容时noEbqSign需要设置为2 + */ + private Integer addPage; + + /** + * 指定公章位置类型: 0或null使用签字座标位置或不指定签字位置; 1表单域定位(表单域如果上传为pdf时,需pdf自行定义好表单域); 2关键字定义 + */ + private Integer positionType; + + /** + * 验证方式为人脸时必传, 人脸识别阀值: 默认等级(1-100之间整数),建议大于72, 验证方式在签约方中(signatories)设置 + */ + private Integer faceThreshold; + +// /** +// * 是否按顺序签字,非1为不按,1为按 +// */ +// private Integer orderFlag; +// +// /** +// * 多合同顺序签约或批量签合同关联信息,参考后面表格说明 +// */ +// private Map sequenceInfo; +// + /** + * 合同签署完成后异步通知地址 + */ + private String notifyUrl; +// +// /** +// * 不显示ebq的保全章: 1不显示但会签名, 2不显示也不签名; 0或其它-显示 +// */ +// private Integer noEbqSign; +// +// /** +// * 合同附件, 虽不限个数, 但包括合同原文件, 不能超过30MB, *SDK引用中的多文件同名情况的上传说明 +// */ +// private String[] attachFiles; +// +// /** +// * 是否使用骑缝章: 1使用; 2个人不要企业要,3个人要企业不要 +// */ +// private Integer needQifengSign; +// +// /** +// * 是否不显示个人标准章边框: 1不显示;0显示边框(默认);2不显示边框标准章字体为黑 +// */ +// private Integer noBorderSign; +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java new file mode 100644 index 0000000..430eb5b --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java @@ -0,0 +1,36 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 文件信息 + * + * @author ruoyi + */ +@Data +public class RemoteSms implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 是否成功 + */ + private Boolean isSuccess; + + /** + * 响应消息 + */ + private String message; + + /** + * 实际响应体 + *

+ * 可自行转换为 SDK 对应的 SendSmsResponse + */ + private String response; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java new file mode 100644 index 0000000..5f66500 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SequenceInfo.java @@ -0,0 +1,10 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +@Data +public class SequenceInfo { + private String businessNo; + private Integer sequenceOrder; + private Integer totalNum; +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java new file mode 100644 index 0000000..2a1d11e --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SignatoryReq.java @@ -0,0 +1,99 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

    + *
  • 项目名称 : 后台服务
  • + *
  • 文件名称 : SignatoryReq
  • + *
  • 创建时间 : 2019/8/9 9:58
  • + *
  • 描 述 : 签约方请求 + *
+ * + * @author yfx + * @title 签约方请求 + */ +@Data +public class SignatoryReq implements Serializable { + + // 签约方名称,不超过50个字符, 必填 + private String fullName; + + // 身份类型:1身份证,2护照,3台胞证,4港澳居民来往内地通行证,11营业执照,12统一社会信用代码, 必填 + private Integer identityType; + + // 证件号,不超过50个字符, 必填 + private String identityCard; + + // 手机号码(个人必传),11个字符 + private String mobile; + + // 邮箱,企业必传 + private String email; + + // 签字顺序:连续签(orderNum只是针对于当前合同),顺序签时需指定 + private Integer orderNum; + + // 签字位置座标信息:positionType=0时可以传入chapteJson + private String chapteJson; + + // 签字位置-表单域名ID:positionType=1时必须传入 + private String chapteName; + + // 签字位置-按关键字签署,positionType=2时必须传入,关键字支持多个;以英文;分隔 + private String searchKey; + + // 签字位置-按关键字查询-扩展,positionType=2时可以传入,支持指定查询页数/关键字颜色/透明度.可参考相关说明 + private String searchExtend; + + // 签字位置-按关键字查询-结果转换的配置,positionType=2时可以传入,可配置查询结果的位置偏移.可参考后面说明 + private String searchConvertExtend; + + // 签约方需要手签时是否不先行验证手机或邮箱:1不验证,其它验证(默认) + private Integer noNeedVerify; + + // 是否使用自动签,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效);有些场景必须serverCaAuto=1 + private Integer serverCaAuto; + + // 验证等级(传数组字符串):[2,3];2银行卡认证,10三要素认证,11人脸识别,12验证码验证 + private String authLevel; + + // 最小验证种类:默认为authLevel数组长度;必须小于authLevel长度且大于0(等于0时按authLevel数组长度计录);如authLevel=[2,3,10],authLevelRange=2表过只需要验证其中的两项即可 + private Integer authLevelRange; + + // 签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写 + private Integer signLevel; + + // 强制添加现场:0或null:不强制添加现场,1:强制添加现场 + private Integer forceEvidence; + + // 买保险年数:1-3购买年限,基它不买;注需要有相应的套餐 + private Integer insureYear; + + // 强制阅读多少秒,单位1-300秒 + private Integer readTime; + + // 企业用户指定签章ID:此值需为商户上传的自定义公章ID,或商户创建的企业的自定义公章ID。自定义公章可通过sass或api上传 + private String signId; + + // 标准章时是否对个人或企业章图片打码:0不打,1打码 + private Integer nameHideStatus; + + // h5人脸订单号,如使用过君子签提供的人脸认证服务可以上传其订单号 + private String h5FaceOrderNo; + + // 现场存证只能上传视频:1是,其它不是(默认) + private Integer onlyVideoEvidence; + + // 现场存证自定义标题 + private String evidenceTitle; + + // 是否使用电子保管函:1使用0或其它不使用;使用时需有相应套餐 + private Integer safeKeepLetterFlag; + + // api发起显示确认签字 + private Integer apiAffirm; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java new file mode 100644 index 0000000..82cdfb9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SmsConfig.java @@ -0,0 +1,48 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode +@Data +public class SmsConfig { + //@ApiModelProperty("短信签名") + private String sign; + + //@ApiModelProperty("验证码") + private String verification; + + //@ApiModelProperty("充值成功") + private String recharge; + + //@ApiModelProperty("退款成功") + private String refund; + + //@ApiModelProperty("发放成功") + private String giveout; + + //@ApiModelProperty("余额不足") + private String balance; + + //@ApiModelProperty("商家入驻成功,不带密码") + private String merchant; + + //@ApiModelProperty("代理入驻成功,不带密码") + private String agent; + + //@ApiModelProperty("签约提醒") + private String tosign; + + //@ApiModelProperty("充值信息提醒") + private String rechargeInfo; + + //@ApiModelProperty("开票信息提醒") + private String invoce; + + //@ApiModelProperty("灵工线上短信签约提醒") + private String toOnlineSign; + + //@ApiModelProperty("模板信息") + private String templateContent; + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java new file mode 100644 index 0000000..9470070 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/TencentSmsConfig.java @@ -0,0 +1,30 @@ +package org.dromara.resource.api.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title TencentSmsConfig + * @description + * @create 2024-04-07 16:55 + */ + + +@Data +public class TencentSmsConfig implements Serializable { + private String accessKeyId; + private String accessKeySecret; + private String signature; + private String templateId; + private String sdkAppId; + private String territory; + private Integer connTimeout; + private String requestUrl; + private String action; + private String version; + private String service; + +} diff --git a/ruoyi-api/ruoyi-api-settlement/pom.xml b/ruoyi-api/ruoyi-api-settlement/pom.xml new file mode 100644 index 0000000..1ee91d9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-settlement + + + ruoyi-api-settlement系统接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java new file mode 100644 index 0000000..9d2281d --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAccountService.java @@ -0,0 +1,150 @@ +package org.dromara.settlement.api; + +import org.dromara.settlement.api.domain.*; + +import java.util.List; + + + +public interface RemoteAccountService +{ + /** + * 创建虚拟银行账号 + * @author 张涛 + * @date 2021年8月18日 + * @param unitId 税源地id + * @param userType 用户类型(7:运营商 9:商户 10:自雇者 6:服务商 5:平台) + * @param userId 用户id(单位id或自雇者id或税源地id) + * @param userName 用户名称(单位名称或自雇者姓名或税源地名称) + * @return + */ + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType,Long code); + + /** + * 创建虚拟银行账号 + * + * @param unitId 税源地id + * @param userType 用户类型(7:运营商 9:商户 10:自雇者 6:服务商 5:平台) + * @param userId 用户id(单位id或自雇者id或税源地id) + * @param userName 用户名称(单位名称或自雇者姓名或税源地名称) + * @param bindAcctNo 绑卡账户号码(真实公户) + * @param bindAcctName 绑卡账户名称(真实公户) + * @return + * @author 张涛 + * @date 2021年8月18日 + */ + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType, String bindAcctNo, String bindAcctName,Long code); + + /** + * 获取虚拟银行账号收款账户名 + * + * @param unitId 税源地id + * @param bankType 银行名称 + * @param bankCard 银行卡号 + * @return + * @author 张涛 + * @date 2021年8月26日 + */ + public Result getAccountName(long unitId, String bankType, String bankCard); + + /** + * 获取虚拟银行账号收款账户 + * + * @param unitId 税源地id + * @param bankType 银行名称 + * @return + * @author 张涛 + * @date 2021年8月26日 + */ + public Result getMainAccount(long unitId, String bankType); + + /** + * 创建指定银行账号 + * + * @param account + * @return + * @author 张涛 + * @date 2021年8月20日 + */ + public Result addAccount(Account account); + + /** + * 同步银行账户 + * @author 张涛 + * @date 2021年9月6日 + * @param id 银行账户id + * @param trxdir 流水方向(1:收入 2:支出) + * @param synPosition 已同步位置id + * @param exclude 排除的交易摘要 + * @return + */ + public Result synAccount(int id, Short trxdir, long synPosition, List exclude); + + /** + * 申请银行账户转账 + * @author 张涛 + * @date 2021年9月7日 + * @param sourceAccId 付款账户id + * @param targetAccId 收款账户id + * @param amount 转账金额(分) + * @param order 流水号(系统内部编号) + * @param remark 转账摘要 + * @return + */ + public Result applyTransfer(int sourceAccId, int targetAccId, Long amount, String order, String remark); + + /** + * 银行账户转账 + * @author 张涛 + * @date 2021年9月7日 + * @param tranId 交易id + * @return + */ + public Result transfer(long tranId); + + /** + * 同步银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param tranId 交易id + * @return + */ + public Result synTransfer(long tranId); + + /** + * 查询交易记录 + * @author 张涛 + * @date 2021年9月7日 + * @param tranId 交易id + * @return + */ + public Result getTransfer(long tranId); + + /** + * 获取交易流水号 + * @author 张涛 + * @date 2021年9月22日 + * @param tranId 交易id + * @return + */ + public Result getTransferBankNo(long tranId); + + /** + * 获取交易回置单 + * @author 张涛 + * @date 2021年9月16日 + * @param tranId 交易id + * @return + */ + public Result getTransferCallBack(long tranId); + + /** + * 获取签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param unitId 单位id + * @param unitName 单位名称 + * @return + */ + public Result getSignInfo(long unitId, String unitName, String bankType); +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java new file mode 100644 index 0000000..c665f8e --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteAuthService.java @@ -0,0 +1,63 @@ +package org.dromara.settlement.api; + + +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.auth.BankCardInfo; +import org.dromara.settlement.api.domain.auth.BankInfo; +import org.dromara.settlement.api.domain.auth.CardIdBack; +import org.dromara.settlement.api.domain.auth.CardIdPositive; + +public interface RemoteAuthService +{ + /** + * 认证身份证正面 + * @author 张涛 + * @date 2021年8月17日 + * @param positive 正面图片地址 + * @return + */ + public Result authCardIdPositive(String positive); + + /** + * 认证身份证反面 + * @author 张涛 + * @date 2021年8月17日 + * @param positive 正面图片地址 + * @return + */ + public Result authCardIdBack(String back); + + /** + * 认证银行卡信息 + * @author 张涛 + * @date 2021年8月17日 + * @param bankcardUrl 银行卡地址 + * @return + */ + public Result authBankInfo(String bankcardUrl); + + /** + * 认证银行卡是否一致 + * @author 张涛 + * @date 2021年8月17日 + * @param bankcard 银行卡号 + * @param name 银行卡账户名 + * @param idcard 身份证号 + * @return + */ + public Result authBankMatch(String bankcard, String name, String idcard); + + /** + * 验证银行账号是否有效 + * @author 张涛 + * @date 2022年12月8日 + * @param unitId 税源地id + * @param bankType 银行名称 + * @param bankCard 银行卡号 + * @param mobile 手机号 + * @param name 姓名 + * @param cardId 身份证号 + * @return + */ + public Result valiAccount(long unitId,String bankType, String bankCard,String mobile,String name,String cardId); +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java new file mode 100644 index 0000000..668d2f5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/RemoteConfigService.java @@ -0,0 +1,158 @@ +package org.dromara.settlement.api; + + +import org.dromara.settlement.api.constant.SystemConfig; +import org.dromara.settlement.api.domain.*; + +import java.util.List; +import java.util.Map; + + +/** + * 配置业务 + * @author 张涛 + * @date 2019年4月29日 + */ +public interface RemoteConfigService { + /** + * 验证服务是否能访问 + * @author 张涛 + * @date 2021年1月13日 + * @param unitId 单位id + * @param key 访问权限唯一标识 + * @return + */ + public Boolean valiServiceAccess(long unitId,String key); + + /** + * 获取配置项(单个) + * @author 张涛 + * @date 2021年1月13日 + * @param unitId 单位id + * @param key 配置项key + * @return + */ + public String getItem(long unitId,String key); + + /** + * 获取配置项(多个) + * @author 张涛 + * @date 2021年1月13日 + * @param unitId 单位id + * @param keys 配置项key + * @return + */ + public Map getItems(long unitId,String... keys); + + /** + * 获取存储类型 + * @author 张涛 + * @date 2021年1月20日 + * @param unitId 单位id + * @return + */ + public SystemConfig.StoreType getStoreType(long unitId); + + /** + * 获取上传图片的网络路径 + * + * @return + */ + public String getUploadNetPath(long unitId); + + /** + * 获取上传图片的物理路径 + * + * @return + */ + public String getUploadPhyPath(long unitId); + + + /** + * 获取七牛上传凭证 + * + * @return + */ + public String getQiNiuUptoken(long unitId); + + /** + * 获取七牛访问域名 + * + * @return + */ + public String getQiNiuDomain(long unitId); + + /** + * Description: {获取企业大类信息} + * @param : + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result> getConfClass(Long unit_id, String unitType); + + /** + * Description: {获取大类下的组信息} + * @param :unit_id:企业id,class_alias:大类名称 + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result> getConfGroupByUnit(Long unit_id, String class_alias); + + /** + * Description: {获取组下的表单配置项} + * @param :unit_id:企业id,conf_group:组名称 + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result> getConfDetailByUnit(Long unit_id, String conf_group); + + /** + * Description: {编辑配置项} + * @param :配置项明细 + * @return : + * @throws : + * @see :com.tyy.service.user + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public Result editConfDetail(List lendReco); + + /** + * + * Description: {获取七牛上传所需配置} + * @param : + * @return : + * @throws : + * @see :com.tyy.service.config + * @author: dinghongbo + * @date :2021年2月2日 + * Note: Nothing much. + */ + public Result getQiniuConfg(Long unit_id); + + /** + * Description: {修改配置项目} + * @param : + * @return : + * @throws : + * @see :com.tyy.service.config + * @author: dinghongbo + * @date :2021年2月3日 + * Note: Nothing much. + */ + public Result saveConfigById(Long unitId, String key,String value); + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java new file mode 100644 index 0000000..2854510 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/constant/SystemConfig.java @@ -0,0 +1,87 @@ +package org.dromara.settlement.api.constant; + +/** + * 系统配置项 + * @author 张涛 + * @date 2021年1月20日 + */ +public enum SystemConfig { + /** + * 默认密码 + */ + Default_Password("user.default.password"), + /** + * 默认昵称 + */ + Default_Nickname("user.default.nickname"), + /** + * 默认头像 + */ + Default_Avatar("user.default.avatar"), + /** + * 客服电话 + */ + Default_CustomerPhone("system.app.customerphone"), + /** + * 教育备案 + */ + Default_EducationRecord("system.app.educationrecord"), + /** + * 安全等保 + */ + Default_SafetyGuarantee("system.app.safetyguarantee"); + + // 定义私有变量 + private String key; + + // 构造函数,枚举类型只能为私有 + private SystemConfig(String key) { + this.key = key; + } + + @Override + public String toString() { + return this.key; + } + + public String getValue() { + return this.key; + } + + public enum StoreType { + /** + * 七牛云存储 + */ + Store_Qiniu("store.qiniu"), + /** + * 本地存储 + */ + Store_Local("store.local"); + + // 定义私有变量 + private String key; + + // 构造函数,枚举类型只能为私有 + private StoreType(String key) { + this.key = key; + } + + @Override + public String toString() { + return this.key; + } + + public String getValue() { + return this.key; + } + + public static StoreType valueOfs(String storeType){ + if (storeType.equals(Store_Qiniu.key)) { + return Store_Qiniu; + }else if (storeType.equals(Store_Local.key)) { + return Store_Local; + } + return null; + } + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java new file mode 100644 index 0000000..95c12b2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Account.java @@ -0,0 +1,193 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +public class Account implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 5391155157254537039L; + + private Long mer_id; + + private Integer id; + + private Long unitId; + + private String bankType; + + private String bankTypeName; + + private String bankCard; + + private Long balance; + + private Long frozen; + + private Short status; + + private Short type; + + private Date addTime; + + private Date editTime; + + private String name; + + private String bankAddress; + + private Long sydId; + + private String bankArgNo; + + private String bankNo; + + private String bankName; + + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankNo() { + return bankNo; + } + + public void setBankNo(String bankNo) { + this.bankNo = bankNo; + } + + public Long getSydId() { + return sydId; + } + + public void setSydId(Long sydId) { + this.sydId = sydId; + } + + public Long getFrozen() { + return frozen; + } + + public void setFrozen(Long frozen) { + this.frozen = frozen; + } + + public Long getMer_id() { + return mer_id; + } + + public void setMer_id(Long mer_id) { + this.mer_id = mer_id; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getBankCard() { + return bankCard; + } + + public void setBankCard(String bankCard) { + this.bankCard = bankCard; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Short getStatus() { + return status; + } + + public void setStatus(Short status) { + this.status = status; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Date getEditTime() { + return editTime; + } + + public void setEditTime(Date editTime) { + this.editTime = editTime; + } + + public String getBankTypeName() { + return bankTypeName; + } + + public void setBankTypeName(String bankTypeName) { + this.bankTypeName = bankTypeName; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public Short getType() { + return type; + } + + public void setType(Short type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBankAddress() { + return bankAddress; + } + + public void setBankAddress(String bankAddress) { + this.bankAddress = bankAddress; + } + + public String getBankArgNo() { + return bankArgNo; + } + + public void setBankArgNo(String bankArgNo) { + this.bankArgNo = bankArgNo; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java new file mode 100644 index 0000000..b4da6d2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountLog.java @@ -0,0 +1,211 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +public class AccountLog implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -2239121995008551353L; + + private Long id; + + private Long unitId; + + private Integer accId; + + private String bankType; + + private String bankCard; + + private Short trxdir; + + private Long trxamt; + + private Long balance; + + private Date addTime; + + private String addBy; + + private String narinn; + + private String refundTrxnbr; + + private String refundDate; + + private String trxnbr; + + private String ccynbr; + + private Date tranTime; + + private String rpyacc; + + private String rpynam; + + private String trxtxt; + + private String mthflg; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public Integer getAccId() { + return accId; + } + + public void setAccId(Integer accId) { + this.accId = accId; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getBankCard() { + return bankCard; + } + + public void setBankCard(String bankCard) { + this.bankCard = bankCard; + } + + public Short getTrxdir() { + return trxdir; + } + + public void setTrxdir(Short trxdir) { + this.trxdir = trxdir; + } + + public Long getTrxamt() { + return trxamt; + } + + public void setTrxamt(Long trxamt) { + this.trxamt = trxamt; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public String getAddBy() { + return addBy; + } + + public void setAddBy(String addBy) { + this.addBy = addBy; + } + + public String getNarinn() { + return narinn; + } + + public void setNarinn(String narinn) { + this.narinn = narinn; + } + + public String getTrxnbr() { + return trxnbr; + } + + public void setTrxnbr(String trxnbr) { + this.trxnbr = trxnbr; + } + + public String getCcynbr() { + return ccynbr; + } + + public void setCcynbr(String ccynbr) { + this.ccynbr = ccynbr; + } + + public Date getTranTime() { + return tranTime; + } + + public void setTranTime(Date tranTime) { + this.tranTime = tranTime; + } + + public String getRpyacc() { + return rpyacc; + } + + public void setRpyacc(String rpyacc) { + this.rpyacc = rpyacc; + } + + public String getRpynam() { + return rpynam; + } + + public void setRpynam(String rpynam) { + this.rpynam = rpynam; + } + + public String getTrxtxt() { + return trxtxt; + } + + public void setTrxtxt(String trxtxt) { + this.trxtxt = trxtxt; + } + + public String getMthflg() { + return mthflg; + } + + public void setMthflg(String mthflg) { + this.mthflg = mthflg; + } + + public String getRefundTrxnbr() { + return refundTrxnbr; + } + + public void setRefundTrxnbr(String refundTrxnbr) { + this.refundTrxnbr = refundTrxnbr; + } + + public String getRefundDate() { + return refundDate; + } + + public void setRefundDate(String refundDate) { + this.refundDate = refundDate; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java new file mode 100644 index 0000000..e1a8af1 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AccountSyn.java @@ -0,0 +1,154 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +public class AccountSyn implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -318137089612106814L; + + private Integer id; + + private Byte synLock; + + private Date synTime; + + private String synPosition; + + private Short type; + + private String bankType; + + private String bankCard; + + private Long balance; + + private Long addAmount; + + private Long reductionAmount; + + private List logs; + + private Long unitId; + + private String trxnbrs; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Byte getSynLock() { + return synLock; + } + + public void setSynLock(Byte synLock) { + this.synLock = synLock; + } + + public Date getSynTime() { + return synTime; + } + + public void setSynTime(Date synTime) { + this.synTime = synTime; + } + + public String getSynPosition() { + return synPosition; + } + + public void setSynPosition(String synPosition) { + this.synPosition = synPosition; + } + + public Short getType() { + return type; + } + + public void setType(Short type) { + this.type = type; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getBankCard() { + return bankCard; + } + + public void setBankCard(String bankCard) { + this.bankCard = bankCard; + } + + /** + * 新收入金额 + * @author 张涛 + * @date 2021年9月3日 + * @return + */ + public Long getAddAmount() { + return addAmount; + } + + public void setAddAmount(Long addAmount) { + this.addAmount = addAmount; + } + + /** + * 新支出金额 + * @author 张涛 + * @date 2021年9月3日 + * @return + */ + public Long getReductionAmount() { + return reductionAmount; + } + + public void setReductionAmount(Long reductionAmount) { + this.reductionAmount = reductionAmount; + } + + public List getLogs() { + return logs; + } + + public void setLogs(List logs) { + this.logs = logs; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public String getTrxnbrs() { + return trxnbrs; + } + + public void setTrxnbrs(String trxnbrs) { + this.trxnbrs = trxnbrs; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java new file mode 100644 index 0000000..95e2715 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunBaseInfo.java @@ -0,0 +1,51 @@ +package org.dromara.settlement.api.domain; + +/** + * 阿里云基础信息 + * @author 张涛 + * @date 2017年12月5日 + */ +public class AliyunBaseInfo { + public AliyunBaseInfo(){} + + public AliyunBaseInfo(String accessKey, String secretKey) { + this.accessKey = accessKey; + this.secretKey = secretKey; + } + + private String accessKey; + + private String secretKey; + + /** + * 阿里云AccessKey + * + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + /** + * 阿里云SecretKey + * + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java new file mode 100644 index 0000000..0e9ee94 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/AliyunUploadInfo.java @@ -0,0 +1,74 @@ +package org.dromara.settlement.api.domain; + +/** + * 阿里云上传凭证信息 + * @author 张涛 + * @date 2017年12月5日 + */ +public class AliyunUploadInfo extends AliyunBaseInfo{ + public AliyunUploadInfo(){} + + + + public AliyunUploadInfo(String accessKey, String secretKey, String uploadAddress, + String uploadAuth) { + // TODO 自动生成的构造函数存根 + super(accessKey, secretKey); + this.uploadAddress = uploadAddress; + this.uploadAuth = uploadAuth; + } + + + + public AliyunUploadInfo(String accessKey, String secretKey, String videoId, String uploadAddress, + String uploadAuth) { + super(accessKey, secretKey); + this.videoId = videoId; + this.uploadAddress = uploadAddress; + this.uploadAuth = uploadAuth; + } + private String videoId; + private String uploadAddress; + private String uploadAuth; + + /** + * 视频ID + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getVideoId() { + return videoId; + } + public void setVideoId(String videoId) { + this.videoId = videoId; + } + + /** + * 上传地址 + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getUploadAddress() { + return uploadAddress; + } + public void setUploadAddress(String uploadAddress) { + this.uploadAddress = uploadAddress; + } + + /** + * 上传凭证 + * @author 张涛 + * @date 2017年12月5日 + * @return + */ + public String getUploadAuth() { + return uploadAuth; + } + public void setUploadAuth(String uploadAuth) { + this.uploadAuth = uploadAuth; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java new file mode 100644 index 0000000..897ddf0 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/MainAccount.java @@ -0,0 +1,27 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +public class MainAccount implements Serializable { + + private static final long serialVersionUID = -5269873444319953793L; + private String accountName = ""; + + private String khh = ""; + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public String getKhh() { + return khh; + } + + public void setKhh(String khh) { + this.khh = khh; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java new file mode 100644 index 0000000..730deac --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/QiNiuConfig.java @@ -0,0 +1,97 @@ +/** + +*

Title: QiNiuConfig.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年2月2日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * 七牛配置信息类 + * @author DHB + * + */ +public class QiNiuConfig implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7326134253544842394L; + + + private String QiNiu_AccessKey; + + private String QiNiu_BUCKET; + + private String QiNiu_DOMAIN; + + private String QiNiu_Region; + + private String QiNiu_SecretKey; + + private String token; + + public String getQiNiu_AccessKey() { + return QiNiu_AccessKey; + } + + public void setQiNiu_AccessKey(String qiNiu_AccessKey) { + QiNiu_AccessKey = qiNiu_AccessKey; + } + + public String getQiNiu_BUCKET() { + return QiNiu_BUCKET; + } + + public void setQiNiu_BUCKET(String qiNiu_BUCKET) { + QiNiu_BUCKET = qiNiu_BUCKET; + } + + public String getQiNiu_DOMAIN() { + return QiNiu_DOMAIN; + } + + public void setQiNiu_DOMAIN(String qiNiu_DOMAIN) { + QiNiu_DOMAIN = qiNiu_DOMAIN; + } + + public String getQiNiu_Region() { + return QiNiu_Region; + } + + public void setQiNiu_Region(String qiNiu_Region) { + QiNiu_Region = qiNiu_Region; + } + + public String getQiNiu_SecretKey() { + return QiNiu_SecretKey; + } + + public void setQiNiu_SecretKey(String qiNiu_SecretKey) { + QiNiu_SecretKey = qiNiu_SecretKey; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java new file mode 100644 index 0000000..7bc4b73 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/RechargeVo.java @@ -0,0 +1,55 @@ +package org.dromara.settlement.api.domain; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商户充值账户视图对象 + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +public class RechargeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * 充值账户名称 + */ + private String accName; + + /** + * 充值账户开户行 + */ + private String khh; + + /** + * 充值账户开户地 + */ + private String khd; + + /** + * 充值账户所属银行 + */ + private String bankType; + + /** + * 充值账户收款账号 + */ + private String bankCard; + + /** + * 充值账户联行号 + */ + private String khhNo; + + /** + * 充值账户银行转账附言 + */ + private String remark; +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java new file mode 100644 index 0000000..898a1e6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/Result.java @@ -0,0 +1,251 @@ +package org.dromara.settlement.api.domain; + + +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; + + +/** + * 业务结果抽象类 + * @author 张涛 + * @date 2019年4月29日 + * @param + */ +public class Result implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 7172632469626661391L; + + public Result(){} + + public Result(T ret){ + setRtnData(ret); + } + + public Result(T ret, boolean errorRetry){ + setRtnData(ret); + setErrorRetry(errorRetry); + } + + public Result(String error){ + setResult(error); + } + + public Result(T ret, String error){ + setRtnData(ret); + setResult(error); + } + + /** + * 错误提醒 + */ + private String result; + + /** + * 返回成功失败代码,两端约定好 默认值为200 + */ + private int rtnCode =ResultCodeEnum.SUCCESS.Code(); + + /** + * 是否启用错误重试 + */ + private boolean errorRetry = false; + + /** + * 分页前数据总条数 + */ + private Long total; + + /** + * 服务端响应返回数据 + */ + private T rtnData; + + /** + * 当前页数 + */ + private Long currentPage; + + public Long getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(Long currentPage) { + this.currentPage = currentPage; + } + + public int getRtnCode() { + return rtnCode; + } + + public void setRtnCode(ResultCodeEnum _enum) { + this.rtnCode = _enum.Code(); + } + + public T getRtnData() { + return rtnData; + } + + public void setRtnData(T rtnData) { + this.rtnData = rtnData; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + /** + * 是否有错误 + * @author 张涛 + * @date 2019年4月29日 + * @return + */ + public boolean hasError(){ + return getRtnCode() == ResultCodeEnum.ERROR.Code(); + } + + /** + * 是否有错误 + * @author 张涛 + * @date 2019年4月29日 + * @return + */ + public boolean hasError(org.slf4j.Logger log){ + boolean result = hasError(); + if(result) + log.error(getResult()); + return result; + } + + /** + * 清空错误 + * @author 张涛 + * @date 2019年4月29日 + */ + public void clearError(){ + setResult(null); + setRtnCode(ResultCodeEnum.SUCCESS); + } + + /** + * 添加错误 + * @author 张涛 + * @date 2019年4月29日 + * @param error 错误提示 + */ + public void addError(String error){ + setRtnData(null); + setRtnCode(ResultCodeEnum.ERROR); + if (StringUtils.isBlank(getResult())) { + setResult(error); + }else{ + setResult(getResult()+";"+error); + } + } + + /** + * 设置需要确认消息 + * @author 张涛 + * @date 2020年2月11日 + * @param msg 确认提醒内容 + */ + public void confirm(String msg){ + setRtnCode(ResultCodeEnum.CONFIRM); + setResult(msg); + } + + /** + * 设置业务提示 + * @author 张涛 + * @date 2020年2月11日 + * @param msg 业务提示内容 + */ + public void tip(String msg){ + setRtnCode(ResultCodeEnum.TIP); + setResult(msg); + } + + /** + * 是否有业务提示 + * @author 张涛 + * @date 2019年4月29日 + * @return + */ + public boolean hasTip(){ + return getRtnCode() == ResultCodeEnum.TIP.Code(); + } + + /** + * 获取错误列表 + * @author 张涛 + * @date 2019年5月5日 + * @return + */ + public String[] getErrors(){ + if (hasError() && StringUtils.isNotBlank(getResult())) { + return getResult().split(";"); + } + return null; + } + + /** + * 验证是否成功 + * @author 张涛 + * @date 2019年5月6日 + * @param other + * @return + */ + public boolean isSuccess(Result other){ + if(other != null){ + if(!other.hasError()){ + return true; + }else{ + addError(other.getResult()); + setRtnData(null); + } + }else{ + setRtnData(null); + } + return false; + } + + /** + * 验证是否需要确认,如果需要确认,前端操作:是,则再次调用返回需要确认的业务 + * @author 张涛 + * @date 2020年2月5日 + * @return 是否需要确认 + */ + public boolean isNeedConfirm(){ + return rtnCode == ResultCodeEnum.CONFIRM.Code(); + } + + /** + * 是否启用错误重试 + * @author 张涛 + * @date 2021年2月1日 + * @return + */ + public boolean isErrorRetry() { + return errorRetry; + } + + public void setErrorRetry(boolean errorRetry) { + this.errorRetry = errorRetry; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java new file mode 100644 index 0000000..b7ba819 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/ResultCodeEnum.java @@ -0,0 +1,39 @@ +package org.dromara.settlement.api.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; + +/** + * 微服务接口返回结果状态 SUCCESS:成功 200 ERROR:失败 500 CONFIRM:需要确认 201 TIP:业务提示 202 + * NoPermission:无权限访问 203 + * + * @author 丁红博 + * + */ +public enum ResultCodeEnum { + SUCCESS(200), ERROR(500), CONFIRM(201), TIP(202), NoPermission(203); + int resultCode = 200; + + private ResultCodeEnum(int resultCode) { + this.resultCode = resultCode; + } + + public int Code() { + return resultCode; + } + + @JsonCreator // This is the factory method and must be static + public static ResultCodeEnum fromString(int string) { + if (string == 200) { + return ResultCodeEnum.SUCCESS; + } else if (string == 500) { + return ResultCodeEnum.ERROR; + } else if (string == 201) { + return ResultCodeEnum.CONFIRM; + } else if (string == 202) { + return ResultCodeEnum.TIP; + } else if (string == 203) { + return ResultCodeEnum.NoPermission; + } + return null; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java new file mode 100644 index 0000000..d91a2da --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/SignZhifubao.java @@ -0,0 +1,125 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class SignZhifubao implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -6248121087874179082L; + + private Integer id; + + private Long unitId; + + private String appId; + + private String agreementNo; + + private String alipayLogonId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date validTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date signTime; + + private String status; + + private Date addTime; + + private Date editTime; + + private String signUrl; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAgreementNo() { + return agreementNo; + } + + public void setAgreementNo(String agreementNo) { + this.agreementNo = agreementNo; + } + + public String getAlipayLogonId() { + return alipayLogonId; + } + + public void setAlipayLogonId(String alipayLogonId) { + this.alipayLogonId = alipayLogonId; + } + + public Date getValidTime() { + return validTime; + } + + public void setValidTime(Date validTime) { + this.validTime = validTime; + } + + public Date getSignTime() { + return signTime; + } + + public void setSignTime(Date signTime) { + this.signTime = signTime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Date getEditTime() { + return editTime; + } + + public void setEditTime(Date editTime) { + this.editTime = editTime; + } + + public String getSignUrl() { + return signUrl; + } + + public void setSignUrl(String signUrl) { + this.signUrl = signUrl; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java new file mode 100644 index 0000000..eae43ff --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/TransactionLog.java @@ -0,0 +1,221 @@ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; +import java.util.Date; + +public class TransactionLog implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -4881248715747858575L; + + private Long id; + + private Long unitId; + + private String orderNo; + + private Integer sourceAccId; + + private String sourceBankNo; + + private String sourceAccName; + + private String sourceCard; + + private Integer targetAccId; + + private String targetCard; + + private String targetBankNo; + + private String targetAccName; + + private String targetAccBankAddr; + + private String bankType; + + private Long amount; + + private Date addTime; + + private Short result; + + private String remark; + + private Date tranTime; + + private String reason; + + private String payReceipt; + + private String payReceiptId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUnitId() { + return unitId; + } + + public void setUnitId(Long unitId) { + this.unitId = unitId; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public Integer getSourceAccId() { + return sourceAccId; + } + + public void setSourceAccId(Integer sourceAccId) { + this.sourceAccId = sourceAccId; + } + + public String getSourceBankNo() { + return sourceBankNo; + } + + public void setSourceBankNo(String sourceBankNo) { + this.sourceBankNo = sourceBankNo; + } + + public String getSourceCard() { + return sourceCard; + } + + public void setSourceCard(String sourceCard) { + this.sourceCard = sourceCard; + } + + public Integer getTargetAccId() { + return targetAccId; + } + + public void setTargetAccId(Integer targetAccId) { + this.targetAccId = targetAccId; + } + + public String getTargetCard() { + return targetCard; + } + + public void setTargetCard(String targetCard) { + this.targetCard = targetCard; + } + + public String getTargetBankNo() { + return targetBankNo; + } + + public void setTargetBankNo(String targetBankNo) { + this.targetBankNo = targetBankNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getAddTime() { + return addTime; + } + + public void setAddTime(Date addTime) { + this.addTime = addTime; + } + + public Short getResult() { + return result; + } + + public void setResult(Short result) { + this.result = result; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Date getTranTime() { + return tranTime; + } + + public void setTranTime(Date tranTime) { + this.tranTime = tranTime; + } + + public String getTargetAccName() { + return targetAccName; + } + + public void setTargetAccName(String targetAccName) { + this.targetAccName = targetAccName; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public String getTargetAccBankAddr() { + return targetAccBankAddr; + } + + public void setTargetAccBankAddr(String targetAccBankAddr) { + this.targetAccBankAddr = targetAccBankAddr; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getSourceAccName() { + return sourceAccName; + } + + public void setSourceAccName(String sourceAccName) { + this.sourceAccName = sourceAccName; + } + + public String getPayReceipt() { + return payReceipt; + } + + public void setPayReceipt(String payReceipt) { + this.payReceipt = payReceipt; + } + + public String getPayReceiptId() { + return payReceiptId; + } + + public void setPayReceiptId(String payReceiptId) { + this.payReceiptId = payReceiptId; + } +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java new file mode 100644 index 0000000..33152b6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfClass.java @@ -0,0 +1,53 @@ +/** + +*

Title: UnitConfClass.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年1月27日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * 读取大类 + * @author DHB + * + */ +public class UnitConfClass implements Serializable { + + private static final long serialVersionUID = -3960190254141791261L; + + private String class_name; + + private String class_alias; + + public String getClass_name() { + return class_name; + } + + public void setClass_name(String class_name) { + this.class_name = class_name; + } + + public String getClass_alias() { + return class_alias; + } + + public void setClass_alias(String class_alias) { + this.class_alias = class_alias; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java new file mode 100644 index 0000000..7d5c611 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfDetail.java @@ -0,0 +1,146 @@ +/** + +*

Title: UnitConfDetail.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年1月27日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * @author DHB + * + */ +public class UnitConfDetail implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -5113641353439749673L; + + private Long conf_unit; + + private Integer conf_unit_type; + + private String class_name; + + private String class_alias; + + private String conf_group; + + private String conf_group_name; + + private String conf_item; + + private String conf_value; + + private String conf_remark; + + private Integer conf_is_editor; + + private Integer is_enable; + + + public Integer getConf_is_editor() { + return conf_is_editor; + } + + public void setConf_is_editor(Integer conf_is_editor) { + this.conf_is_editor = conf_is_editor; + } + + public Integer getIs_enable() { + return is_enable; + } + + public void setIs_enable(Integer is_enable) { + this.is_enable = is_enable; + } + + public Long getConf_unit() { + return conf_unit; + } + + public void setConf_unit(Long conf_unit) { + this.conf_unit = conf_unit; + } + + public Integer getConf_unit_type() { + return conf_unit_type; + } + + public void setConf_unit_type(Integer conf_unit_type) { + this.conf_unit_type = conf_unit_type; + } + + public String getClass_name() { + return class_name; + } + + public void setClass_name(String class_name) { + this.class_name = class_name; + } + + public String getClass_alias() { + return class_alias; + } + + public void setClass_alias(String class_alias) { + this.class_alias = class_alias; + } + + public String getConf_group() { + return conf_group; + } + + public void setConf_group(String conf_group) { + this.conf_group = conf_group; + } + + public String getConf_group_name() { + return conf_group_name; + } + + public void setConf_group_name(String conf_group_name) { + this.conf_group_name = conf_group_name; + } + + public String getConf_item() { + return conf_item; + } + + public void setConf_item(String conf_item) { + this.conf_item = conf_item; + } + + public String getConf_value() { + return conf_value; + } + + public void setConf_value(String conf_value) { + this.conf_value = conf_value; + } + + public String getConf_remark() { + return conf_remark; + } + + public void setConf_remark(String conf_remark) { + this.conf_remark = conf_remark; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java new file mode 100644 index 0000000..c04f373 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/UnitConfGroup.java @@ -0,0 +1,66 @@ +/** + +*

Title: UnitConfGroup.java

+ +*

Description:

+ +*

Copyright: Copyright (c) 2017

+ +*

Company: www.baidudu.com

+ +* @author 丁红博 + +* @date 2021年1月27日 + +* @version 1.0 + +*/ +package org.dromara.settlement.api.domain; + +import java.io.Serializable; + +/** + * 大类下面的组 + * @author DHB + * + */ +public class UnitConfGroup implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7082429896261327730L; + + private String conf_group; + + private String conf_group_name; + + private Integer is_enable; + + public String getConf_group() { + return conf_group; + } + + public void setConf_group(String conf_group) { + this.conf_group = conf_group; + } + + public String getConf_group_name() { + return conf_group_name; + } + + public void setConf_group_name(String conf_group_name) { + this.conf_group_name = conf_group_name; + } + + public Integer getIs_enable() { + return is_enable; + } + + public void setIs_enable(Integer is_enable) { + this.is_enable = is_enable; + } + + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java new file mode 100644 index 0000000..591ca44 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankCardInfo.java @@ -0,0 +1,77 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +/** + * 银行信息 + * @author 张涛 + * @date 2021年8月17日 + */ +public class BankCardInfo implements Serializable{ + /** + * + */ + private static final long serialVersionUID = -6422914129745338701L; + + private String card; + + private String name; + + private String type; + + private String typeName; + + private String expireDate; + + private String cardholder; + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + public String getExpireDate() { + return expireDate; + } + + public void setExpireDate(String expireDate) { + this.expireDate = expireDate; + } + + public String getCardholder() { + return cardholder; + } + + public void setCardholder(String cardholder) { + this.cardholder = cardholder; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java new file mode 100644 index 0000000..8318170 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/BankInfo.java @@ -0,0 +1,109 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +/** + * 银行信息 + * @author 张涛 + * @date 2021年8月17日 + */ +public class BankInfo implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 2373994781794561985L; + + private Integer bin_digits;//银行卡bin码长度 + private String city;//银行卡开户市 + private String type;//银行卡类型 + private String abbreviation;//银联支付网关简码 + private String bank;//银行名称 + private String province;//银行卡开户省 + private Integer card_digits;//银行卡号长度 + private String weburl;//银行官方网站 + private String card_name;//银行卡名称 + private String logo;//银行logo + private String tel;//银行官方客服电话 + private String isLuhn;//是否支持luhn校验 true-校验成功 false-校验失败 + private String card_bin;//银行卡bin码 + public Integer getBin_digits() { + return bin_digits; + } + public void setBin_digits(Integer bin_digits) { + this.bin_digits = bin_digits; + } + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getAbbreviation() { + return abbreviation; + } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + public String getBank() { + return bank; + } + public void setBank(String bank) { + this.bank = bank; + } + public String getProvince() { + return province; + } + public void setProvince(String province) { + this.province = province; + } + public Integer getCard_digits() { + return card_digits; + } + public void setCard_digits(Integer card_digits) { + this.card_digits = card_digits; + } + public String getWeburl() { + return weburl; + } + public void setWeburl(String weburl) { + this.weburl = weburl; + } + public String getCard_name() { + return card_name; + } + public void setCard_name(String card_name) { + this.card_name = card_name; + } + public String getLogo() { + return logo; + } + public void setLogo(String logo) { + this.logo = logo; + } + public String getTel() { + return tel; + } + public void setTel(String tel) { + this.tel = tel; + } + public String getIsLuhn() { + return isLuhn; + } + public void setIsLuhn(String isLuhn) { + this.isLuhn = isLuhn; + } + public String getCard_bin() { + return card_bin; + } + public void setCard_bin(String card_bin) { + this.card_bin = card_bin; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java new file mode 100644 index 0000000..0f3b8fe --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdBack.java @@ -0,0 +1,43 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +public class CardIdBack implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 2651593151075888506L; + + private String issue; + + private String issueDate; + + private String expiryDate; + + public String getIssue() { + return issue; + } + + public void setIssue(String issue) { + this.issue = issue; + } + + public String getIssueDate() { + return issueDate; + } + + public void setIssueDate(String issueDate) { + this.issueDate = issueDate; + } + + public String getExpiryDate() { + return expiryDate; + } + + public void setExpiryDate(String expiryDate) { + this.expiryDate = expiryDate; + } + + +} diff --git a/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java new file mode 100644 index 0000000..a02ef79 --- /dev/null +++ b/ruoyi-api/ruoyi-api-settlement/src/main/java/org/dromara/settlement/api/domain/auth/CardIdPositive.java @@ -0,0 +1,77 @@ +package org.dromara.settlement.api.domain.auth; + +import java.io.Serializable; + +/** + * 身份证正面 + * @author 张涛 + * @date 2021年8月17日 + */ +public class CardIdPositive implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 1103126175514709517L; + + private String address; + + private String birthday; + + private String name; + + private String code; + + private String sex; + + private String nation; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + +} diff --git a/ruoyi-api/ruoyi-api-system/pom.xml b/ruoyi-api/ruoyi-api-system/pom.xml new file mode 100644 index 0000000..02958f3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/pom.xml @@ -0,0 +1,33 @@ + + + + org.dromara + ruoyi-api + ${revision} + + 4.0.0 + + ruoyi-api-system + + + ruoyi-api-system系统接口模块 + + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-excel + + + + + diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java new file mode 100644 index 0000000..89c3068 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteClientService.java @@ -0,0 +1,20 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.vo.RemoteClientVo; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +public interface RemoteClientService { + + /** + * 根据客户端id获取客户端详情 + * + * @param clientId 客户端id + * @return 客户端对象 + */ + RemoteClientVo queryByClientId(String clientId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java new file mode 100644 index 0000000..59dd3e4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java @@ -0,0 +1,27 @@ +package org.dromara.system.api; + +import jakarta.validation.constraints.NotBlank; +import org.dromara.common.core.domain.R; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; + +/** + * 配置服务 + * + * @author Michelle.Chung + */ +public interface RemoteConfigService { + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 根据域名获取站点配置信息 + * @param domain 域名地址 + * @return + */ + public RemoteSysUnitDomainVo queryByDomainName(String domain); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java new file mode 100644 index 0000000..ceac940 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDataScopeService.java @@ -0,0 +1,20 @@ +package org.dromara.system.api; + +/** + * 数据权限服务 + * + * @author Lion Li + */ +public interface RemoteDataScopeService { + + /** + * 获取角色自定义权限语句 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门和下级权限语句 + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java new file mode 100644 index 0000000..095fd7c --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java @@ -0,0 +1,18 @@ +package org.dromara.system.api; + +/** + * 部门服务 + * + * @author Lion Li + */ +public interface RemoteDeptService { + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java new file mode 100644 index 0000000..142dc45 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java @@ -0,0 +1,21 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.List; + +/** + * 字典服务 + * + * @author Lion Li + */ +public interface RemoteDictService { + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java new file mode 100644 index 0000000..af084a2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java @@ -0,0 +1,26 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; + +/** + * 日志服务 + * + * @author Lion Li + */ +public interface RemoteLogService { + + /** + * 保存系统日志 + * + * @param sysOperLog 日志实体 + */ + void saveLog(RemoteOperLogBo sysOperLog); + + /** + * 保存访问记录 + * + * @param sysLogininfor 访问实体 + */ + void saveLogininfor(RemoteLogininforBo sysLogininfor); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java new file mode 100644 index 0000000..d83c873 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java @@ -0,0 +1,19 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; + +/** + * 通知服务 + * + * @author Lion Li + */ +public interface RemoteNoticeService { + + /** + * 添加通知 + * @param noticeVo + */ + void addNotice(RemoteSysNoticeVo noticeVo); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java new file mode 100644 index 0000000..85d148f --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteOrderNumService.java @@ -0,0 +1,14 @@ +package org.dromara.system.api; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteOrderNumService + * @description + * @create 2024-07-16 14:56 + */ +public interface RemoteOrderNumService { + + + Long getOrderNum(String bpmType,int size ); +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java new file mode 100644 index 0000000..ff61c12 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSocialService.java @@ -0,0 +1,35 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; + +import java.util.List; + +/** + * 社会化关系服务 + * + * @author Michelle.Chung + */ +public interface RemoteSocialService { + + /** + * 根据 authId 查询用户信息 + */ + List selectByAuthId(String authId); + + /** + * 保存社会化关系 + */ + void insertByBo(RemoteSocialBo bo); + + /** + * 更新社会化关系 + */ + void updateByBo(RemoteSocialBo bo); + + /** + * 删除社会化关系 + */ + Boolean deleteWithValidById(Long socialId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java new file mode 100644 index 0000000..5cfcc05 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java @@ -0,0 +1,26 @@ +package org.dromara.system.api; + + +import org.dromara.system.api.domain.vo.RemoteTenantVo; + +import java.util.List; + +/** + * @author zhujie + */ +public interface RemoteTenantService { + + /** + * 根据租户id获取租户详情 + * @param tenantId 租户id + * @return 结果 + */ + RemoteTenantVo queryByTenantId(String tenantId); + + /** + * 获取租户列表 + * @return 结果 + */ + List queryList(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java new file mode 100644 index 0000000..1997a3b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java @@ -0,0 +1,123 @@ +package org.dromara.system.api; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.api.model.XcxLoginUser; + +/** + * 用户服务 + * + * @author Lion Li + */ +public interface RemoteUserService { + + /** + * 通过用户名查询用户信息 + * + * @param username 用户名 + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfo(String username, String tenantId) throws UserException; + + /** + * 通过用户id查询用户信息 + * + * @param userId 用户id + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfo(Long userId, String tenantId) throws UserException; + + /** + * 通过手机号查询用户信息 + * + * @param phonenumber 手机号 + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException; + + /** + * 通过邮箱查询用户信息 + * + * @param email 邮箱 + * @param tenantId 租户id + * @return 结果 + */ + LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException; + + /** + * 通过openid查询用户信息 + * + * @param openid openid + * @return 结果 + */ + XcxLoginUser getUserInfoByOpenid(String openid) throws UserException; + + /** + * 注册用户信息 + * + * @param remoteUserBo 用户信息 + * @return 结果 + */ + Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException; + + /** + * 通过userId查询用户账户 + * + * @param userId 用户id + * @return 结果 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户名查询用户信息 + * @param userName 用户名 + * @return + */ + RemoteSysUserVo selectUserByName(String userName); + + /** + * 通过用户名查询用户信息 + * @param userId 用户id + * @return + */ + RemoteSysUserVo selectUserById(long userId); + + /** + * 通过用户ID查询用户昵称 + * + * @param userId 用户id + * @return 结果 + */ + String selectNicknameById(Long userId); + + /** + * 更新用户信息 + * + * @param userId 用户ID + * @param ip IP地址 + */ + void recordLoginInfo(Long userId, String ip); + + + /*** + * 添加运营商,企业,代理商,服务商管理员账号 + * @param userBo + * @return + */ + int insertBusUser(RemoteUserBo userBo); + + + /**** + * 更新用户信息 + * @param userBo + * @return + */ + int updateUserResetPayTag(Long userId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java new file mode 100644 index 0000000..cb6081f --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/RemoteSysUnitDomainVo.java @@ -0,0 +1,142 @@ +package org.dromara.system.api.domain; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + + +/** + * 单位域名配置视图对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +public class RemoteSysUnitDomainVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + /** + * 短信配置 + */ + private String smsConfig; + + /** + * 是否开通短信(0:否 1:是) + */ + private Integer openSms; + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 微信公众号配置 + */ + private String wxPubConfig; + + + private String weChatThirdParams; + + private String weChatDomainName; + + /*** + * 大鸿签参数配置 + */ + private String signConfig; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java new file mode 100644 index 0000000..4ad3c06 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUserOnline.java @@ -0,0 +1,72 @@ +package org.dromara.system.api.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 当前在线会话 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class SysUserOnline implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java new file mode 100644 index 0000000..ac2c411 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java @@ -0,0 +1,90 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RemoteLogininforBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java new file mode 100644 index 0000000..aad49f6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java @@ -0,0 +1,120 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RemoteOperLogBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java new file mode 100644 index 0000000..78daf2f --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteSocialBo.java @@ -0,0 +1,129 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 社会化关系业务对象 sys_social + * + * @author Michelle.Chung + */ +@Data +@NoArgsConstructor +public class RemoteSocialBo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long id; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 平台唯一id + */ + private String openId; + + /** + * 用户的 ID + */ + private Long userId; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java new file mode 100644 index 0000000..d331b77 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java @@ -0,0 +1,150 @@ +package org.dromara.system.api.domain.bo; + + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.xss.Xss; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +public class RemoteUserBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + private Long avatar; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 数据权限 当前角色ID + */ + private Integer roleId; + + + + //角色名称 + private String roleName; + + //权限范围(1:角色 2:个人 + private Integer roleDataRange; + + //主体编码 + private String busNo; + + //主体id(结算中心id或运营商id或渠道商id或商户id) + private Long busId; + + + private Long createBy; + + private Date createTime; + + + //是否重置支付密码(0:否,1:是) + private Integer isResetPaypass; + + + + public RemoteUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java new file mode 100644 index 0000000..400f56b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteClientVo.java @@ -0,0 +1,71 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys_client + * + * @author Michelle.Chung + */ +@Data +public class RemoteClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java new file mode 100644 index 0000000..294d3e3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java @@ -0,0 +1,76 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +public class RemoteDictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java new file mode 100644 index 0000000..71e8d58 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSocialVo.java @@ -0,0 +1,135 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; +import java.io.Serial; +import java.io.Serializable; + + +/** + * 社会化关系视图对象 sys_social + * + * @author thiszhc + */ +@Data +public class RemoteSocialVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java new file mode 100644 index 0000000..7a7783b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysNoticeVo.java @@ -0,0 +1,92 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; +import org.dromara.common.core.enums.BusRole; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 通知公告视图对象 sys_notice + * + * @author Michelle.Chung + */ +@Data +public class RemoteSysNoticeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + public RemoteSysNoticeVo(){} + + public RemoteSysNoticeVo(String noticeTitle, String noticeContent, Integer unitId, BusRole role) { + this.noticeTitle = noticeTitle; + this.noticeContent = noticeContent; + this.unitId = unitId; + this.noticeType = "1";//通知 + this.roleId = Long.parseLong(role.getId()+""); + this.roleName = role.getName(); + } + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建人名称 + */ + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色id(0:所有 5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 接收单位(0:所有) + */ + private Integer unitId; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java new file mode 100644 index 0000000..da74de2 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysUserVo.java @@ -0,0 +1,159 @@ +package org.dromara.system.api.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +public class RemoteSysUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 是否登录过(0:否 1:是) + */ + private Integer loginFirst; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID(作废) + */ + private Long roleId; + + private Long curRoleId; + + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java new file mode 100644 index 0000000..b9387f9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java @@ -0,0 +1,91 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 + * + * @author zhujie + */ +@Data +public class RemoteTenantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java new file mode 100644 index 0000000..b91a7bb --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java @@ -0,0 +1,209 @@ +package org.dromara.system.api.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +/** + * 用户信息 + * + * @author ruoyi + */ +@Data +@NoArgsConstructor +public class LoginUser implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 用户昵称 + */ + private String nickname; + + /** + * 密码 + */ + private String password; + + /** + * 角色对象 + */ + private List roles; + + + /** + * 数据权限 当前角色ID(作废) + */ + private Long roleId; + + /** + * 当前角色id + */ + private Long curRoleId; + + /** + * 当前角色名称 + */ + private String curRoleName; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:38 + * 说明:角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + **/ + private Integer busRole; + + /** + * 主体编码(结算中心id或运营商id或渠道商id或商户id) + */ + private String busNo; + + + /** + * 选择的服务商id + */ + private Long sydId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 手机号 + */ + private String phonenumber; + + private String ids; + + /** + * 获取登录id + */ + public String getLoginId() { + if (userType == null) { + throw new IllegalArgumentException("用户类型不能为空"); + } + if (userId == null) { + throw new IllegalArgumentException("用户ID不能为空"); + } + return userType + ":" + userId; + } + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java new file mode 100644 index 0000000..71b9af3 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/RoleDTO.java @@ -0,0 +1,42 @@ +package org.dromara.system.api.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 角色 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RoleDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java new file mode 100644 index 0000000..3982e2e --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/XcxLoginUser.java @@ -0,0 +1,27 @@ +package org.dromara.system.api.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * 小程序登录用户身份权限 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class XcxLoginUser extends LoginUser { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * openid + */ + private String openid; + +} diff --git a/ruoyi-auth/Dockerfile b/ruoyi-auth/Dockerfile new file mode 100644 index 0000000..f6721d2 --- /dev/null +++ b/ruoyi-auth/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/auth/logs \ + /ruoyi/auth/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/auth + +ENV SERVER_PORT=9210 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-auth.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-auth \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml new file mode 100644 index 0000000..c2750e3 --- /dev/null +++ b/ruoyi-auth/pom.xml @@ -0,0 +1,156 @@ + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + ruoyi-auth + + + ruoyi-auth 认证授权中心 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + cn.hutool + hutool-captcha + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-social + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + org.dromara + ruoyi-api-resource + + + + org.dromara + ruoyi-api-mp + + + + + org.dromara + ruoyi-common-loadbalancer + + + + org.dromara + ruoyi-common-sensitive + + + + + + + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java b/ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java new file mode 100644 index 0000000..9a2896a --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/RuoYiAuthApplication.java @@ -0,0 +1,25 @@ +package org.dromara.auth; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 认证授权中心 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiAuthApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiAuthApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 认证授权中心启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java b/ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java new file mode 100644 index 0000000..feb4cdf --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/captcha/UnsignedMathGenerator.java @@ -0,0 +1,88 @@ +package org.dromara.auth.captcha; + +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.math.Calculator; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.RandomUtil; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serial; + +/** + * 无符号计算生成器 + * + * @author Lion Li + */ +public class UnsignedMathGenerator implements CodeGenerator { + + @Serial + private static final long serialVersionUID = -5514819971774091076L; + + private static final String OPERATORS = "+-*"; + + /** + * 参与计算数字最大长度 + */ + private final int numberLength; + + /** + * 构造 + */ + public UnsignedMathGenerator() { + this(2); + } + + /** + * 构造 + * + * @param numberLength 参与计算最大数字位数 + */ + public UnsignedMathGenerator(int numberLength) { + this.numberLength = numberLength; + } + + @Override + public String generate() { + final int limit = getLimit(); + int a = RandomUtil.randomInt(limit); + int b = RandomUtil.randomInt(limit); + String max = Integer.toString(Math.max(a,b)); + String min = Integer.toString(Math.min(a,b)); + max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); + min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); + + return max + RandomUtil.randomChar(OPERATORS) + min + '='; + } + + @Override + public boolean verify(String code, String userInputCode) { + int result; + try { + result = Integer.parseInt(userInputCode); + } catch (NumberFormatException e) { + // 用户输入非数字 + return false; + } + + final int calculateResult = (int) Calculator.conversion(code); + return result == calculateResult; + } + + /** + * 获取验证码长度 + * + * @return 验证码长度 + */ + public int getLength() { + return this.numberLength * 2 + 2; + } + + /** + * 根据长度获取参与计算数字最大值 + * + * @return 最大值 + */ + private int getLimit() { + return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java b/ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java new file mode 100644 index 0000000..5880016 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/config/CaptchaConfig.java @@ -0,0 +1,62 @@ +package org.dromara.auth.config; + +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.captcha.ShearCaptcha; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.awt.*; + +/** + * 验证码配置 + * + * @author Lion Li + */ +@Configuration +public class CaptchaConfig { + + private static final int WIDTH = 160; + private static final int HEIGHT = 60; + private static final Color BACKGROUND = Color.PINK; + private static final Font FONT = new Font("Arial", Font.BOLD, 48); + + /** + * 圆圈干扰验证码 + */ + @Lazy + @Bean + public CircleCaptcha circleCaptcha() { + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + + /** + * 线段干扰的验证码 + */ + @Lazy + @Bean + public LineCaptcha lineCaptcha() { + LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + + /** + * 扭曲干扰验证码 + */ + @Lazy + @Bean + public ShearCaptcha shearCaptcha() { + ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT); + captcha.setBackground(BACKGROUND); + captcha.setFont(FONT); + return captcha; + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java new file mode 100644 index 0000000..63d002c --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/CaptchaController.java @@ -0,0 +1,79 @@ +package org.dromara.auth.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.core.util.IdUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.auth.domain.vo.CaptchaVo; +import org.dromara.auth.enums.CaptchaType; +import org.dromara.auth.properties.CaptchaProperties; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.ratelimiter.enums.LimitType; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; + +/** + * 验证码操作处理 + * + * @author Lion Li + */ +@SaIgnore +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +public class CaptchaController { + + private final CaptchaProperties captchaProperties; + + /** + * 生成验证码 + */ + @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) + @GetMapping("/code") + public R getCode() { + CaptchaVo captchaVo = new CaptchaVo(); + boolean captchaEnabled = captchaProperties.getEnabled(); + if (!captchaEnabled) { + captchaVo.setCaptchaEnabled(false); + return R.ok(captchaVo); + } + // 保存验证码信息 + String uuid = IdUtil.simpleUUID(); + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; + // 生成验证码 + CaptchaType captchaType = captchaProperties.getType(); + boolean isMath = CaptchaType.MATH == captchaType; + Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength(); + CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length); + AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz()); + captcha.setGenerator(codeGenerator); + captcha.createCode(); + String code = captcha.getCode(); + if (isMath) { + ExpressionParser parser = new SpelExpressionParser(); + Expression exp = parser.parseExpression(StringUtils.remove(code, "=")); + code = exp.getValue(String.class); + } + RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + captchaVo.setUuid(uuid); + captchaVo.setImg(captcha.getImageBase64()); + return R.ok(captchaVo); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java new file mode 100644 index 0000000..07a9336 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -0,0 +1,317 @@ +package org.dromara.auth.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.*; +import org.dromara.auth.form.RegisterBody; +import org.dromara.auth.form.SocialLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginBody; +import org.dromara.common.core.utils.*; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.api.RemoteClientService; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.net.URL; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * token 控制 + * + * @author Lion Li + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +public class TokenController { + + private final SocialProperties socialProperties; + private final SysLoginService sysLoginService; + private final ScheduledExecutorService scheduledExecutorService; + + @DubboReference + private final RemoteConfigService remoteConfigService; + @DubboReference + private final RemoteTenantService remoteTenantService; + @DubboReference + private final RemoteClientService remoteClientService; + @DubboReference + private final RemoteSocialService remoteSocialService; + + @DubboReference(stub = "true") + private final RemoteMessageService remoteMessageService; + + /** + * 登录方法(登录第一步) + * + * @param body 登录信息 + * @return 结果 + */ + @ApiEncrypt + @PostMapping("/tlogin") + public R tlogin(@RequestBody String body) { + return R.ok(sysLoginService.tlogin(body)); + } + + /** + * 获取登录短信验证码 + * @param domain 域名 + * @param id 用户id + * @return + */ + @PostMapping("/loginSmsCode") + public R loginSmsCode(@NotBlank(message = "站点名称不能为空") String domain,long id) { + sysLoginService.loginSmsCode(domain,id); + return R.ok(); + } + + /** + * 获取微信登录验证二维码 + * @param domain 域名 + * @param id 用户id + * @return + */ + @PostMapping("/loginWxPubCode") + public R loginWxPubCode(@NotBlank(message = "站点名称不能为空") String domain, long id, Long sydId) { + return R.ok(sysLoginService.loginWxPubCode(domain,id,sydId)); + } + + /** + * 获取微信登录结果 + * @param id 用户id + * @return + */ + @PostMapping("/loginWxPubResult") + public R loginWxPubResult(long id) { + return R.ok(sysLoginService.loginWxPubResult(id)); + } + + /** + * 登录方法 + * + * @param body 登录信息 + * @return 结果 + */ + @ApiEncrypt + @PostMapping("/login") + public R login(@RequestBody String body) { + LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); + ValidatorUtils.validate(loginBody); + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId); + + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(clientVo) || !StringUtils.contains(clientVo.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } else if (!UserConstants.NORMAL.equals(clientVo.getStatus())) { + return R.fail(MessageUtils.message("auth.grant.type.blocked")); + } + // 校验租户 + //sysLoginService.checkTenant(loginBody.getTenantId()); + // 登录 + LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); + + Long userId = LoginHelper.getUserId(); + scheduledExecutorService.schedule(() -> { + try { + remoteMessageService.sendMessage(userId, "欢迎登录flexible-employment微服务管理系统"); + } catch (Exception ignored) { + } + }, 3, TimeUnit.SECONDS); + return R.ok(loginVo); + } + + + + + /** + * 公众号登录方法 + * + * @param body 登录信息 + * @return 结果 + */ +// @ApiEncrypt + @PostMapping("/mpLogin") + public R mpLogin(@RequestBody String body) { + LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); + ValidatorUtils.validate(loginBody); + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId); + + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(clientVo) || !StringUtils.contains(clientVo.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } else if (!UserConstants.NORMAL.equals(clientVo.getStatus())) { + return R.fail(MessageUtils.message("auth.grant.type.blocked")); + } + // 校验租户 + //sysLoginService.checkTenant(loginBody.getTenantId()); + // 登录 + LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); + +// Long userId = LoginHelper.getUserId(); +// scheduledExecutorService.schedule(() -> { +// try { +// remoteMessageService.sendMessage(userId, "欢迎登录flexible-employment微服务管理系统"); +// } catch (Exception ignored) { +// } +// }, 3, TimeUnit.SECONDS); + return R.ok(loginVo); + } + + + + + + /** + * 第三方登录请求 + * + * @param source 登录来源 + * @return 结果 + */ + @GetMapping("/binding/{source}") + public R authBinding(@PathVariable("source") String source) { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + return R.fail(source + "平台账号暂不支持"); + } + AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); + String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); + return R.ok("操作成功", authorizeUrl); + } + + /** + * 第三方登录回调业务处理 绑定授权 + * + * @param loginBody 请求体 + * @return 结果 + */ + @PostMapping("/social/callback") + public R socialCallback(@RequestBody SocialLoginBody loginBody) { + // 获取第三方登录信息 + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + AuthUser authUserData = response.getData(); + // 判断授权响应是否成功 + if (!response.ok()) { + return R.fail(response.getMsg()); + } + sysLoginService.socialRegister(authUserData); + return R.ok(); + } + + + /** + * 取消授权 + * + * @param socialId socialId + */ + @DeleteMapping(value = "/unlock/{socialId}") + public R unlockSocial(@PathVariable Long socialId) { + Boolean rows = remoteSocialService.deleteWithValidById(socialId); + return rows ? R.ok() : R.fail("取消授权失败"); + } + + /** + * 登出方法 + */ + @PostMapping("logout") + public R logout() { + sysLoginService.logout(); + return R.ok(); + } + + + + + /** + * 公众号登出方法 + */ + @PostMapping("mpLogout") + public R mpLogout() { + sysLoginService.mpLogout(); + return R.ok(); + } + + + + + + /** + * 用户注册 + */ + @ApiEncrypt + @PostMapping("register") + public R register(@RequestBody RegisterBody registerBody) { + if (!remoteConfigService.selectRegisterEnabled(registerBody.getTenantId())) { + return R.fail("当前系统没有开启注册功能!"); + } + // 用户注册 + sysLoginService.register(registerBody); + return R.ok(); + } + + /** + * 登录页面租户下拉框 + * + * @return 租户列表 + */ + @GetMapping("/tenant/list") + public R tenantList(HttpServletRequest request) throws Exception { + List tenantList = remoteTenantService.queryList(); + List voList = MapstructUtils.convert(tenantList, TenantListVo.class); + // 获取域名 + String host; + String referer = request.getHeader("referer"); + if (StringUtils.isNotBlank(referer)) { + // 这里从referer中取值是为了本地使用hosts添加虚拟域名,方便本地环境调试 + host = referer.split("//")[1].split("/")[0]; + } else { + host = new URL(request.getRequestURL().toString()).getHost(); + } + // 根据域名进行筛选 + List list = StreamUtils.filter(voList, vo -> + StringUtils.equals(vo.getDomain(), host)); + // 返回对象 + LoginTenantVo vo = new LoginTenantVo(); + vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList); + vo.setTenantEnabled(TenantHelper.isEnable()); + return R.ok(vo); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java new file mode 100644 index 0000000..7888f2c --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/convert/TenantVoConvert.java @@ -0,0 +1,16 @@ +package org.dromara.auth.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.auth.domain.vo.TenantListVo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 租户vo转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface TenantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java new file mode 100644 index 0000000..2a4c0bd --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/CaptchaVo.java @@ -0,0 +1,25 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 验证码信息 + * + * @author Michelle.Chung + */ +@Data +public class CaptchaVo { + + /** + * 是否开启验证码 + */ + private Boolean captchaEnabled = true; + + private String uuid; + + /** + * 验证码图片 + */ + private String img; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java new file mode 100644 index 0000000..fcfdcc3 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java @@ -0,0 +1,25 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 登录租户对象 + * + * @author Michelle.Chung + */ +@Data +public class LoginTenantVo { + + /** + * 租户开关 + */ + private Boolean tenantEnabled; + + /** + * 租户对象列表 + */ + private List voList; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java new file mode 100644 index 0000000..e4bea14 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java @@ -0,0 +1,54 @@ +package org.dromara.auth.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class LoginVo { + + /** + * 授权令牌 + */ + @JsonProperty("access_token") + private String accessToken; + + /** + * 刷新令牌 + */ + @JsonProperty("refresh_token") + private String refreshToken; + + /** + * 授权令牌 access_token 的有效期 + */ + @JsonProperty("expire_in") + private Long expireIn; + + /** + * 刷新令牌 refresh_token 的有效期 + */ + @JsonProperty("refresh_expire_in") + private Long refreshExpireIn; + + /** + * 应用id + */ + @JsonProperty("client_id") + private String clientId; + + /** + * 令牌权限 + */ + private String scope; + + /** + * 用户 openid + */ + private String openid; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java new file mode 100644 index 0000000..783df0f --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginWxPubVo.java @@ -0,0 +1,20 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 微信登录信息 + */ +@Data +public class LoginWxPubVo { + + /** + * 微信登录二维码地址 + */ + private String qrcode; + + /** + * 微信登录id + */ + private Long id; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java new file mode 100644 index 0000000..81983a2 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TLoginVo.java @@ -0,0 +1,32 @@ +package org.dromara.auth.domain.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class TLoginVo { + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 用户id + */ + private Long id; + + /** + * 服务商id + */ + private Long sydId; + + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phone; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java new file mode 100644 index 0000000..b993b37 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java @@ -0,0 +1,19 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 租户列表 + * + * @author zhujie + */ +@Data +public class TenantListVo { + + private String tenantId; + + private String companyName; + + private String domain; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java new file mode 100644 index 0000000..b387aed --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaCategory.java @@ -0,0 +1,35 @@ +package org.dromara.auth.enums; + +import cn.hutool.captcha.AbstractCaptcha; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.captcha.LineCaptcha; +import cn.hutool.captcha.ShearCaptcha; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 验证码类别 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CaptchaCategory { + + /** + * 线段干扰 + */ + LINE(LineCaptcha.class), + + /** + * 圆圈干扰 + */ + CIRCLE(CircleCaptcha.class), + + /** + * 扭曲干扰 + */ + SHEAR(ShearCaptcha.class); + + private final Class clazz; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java new file mode 100644 index 0000000..b663345 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/enums/CaptchaType.java @@ -0,0 +1,29 @@ +package org.dromara.auth.enums; + +import cn.hutool.captcha.generator.CodeGenerator; +import cn.hutool.captcha.generator.RandomGenerator; +import org.dromara.auth.captcha.UnsignedMathGenerator; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 验证码类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CaptchaType { + + /** + * 数字 + */ + MATH(UnsignedMathGenerator.class), + + /** + * 字符 + */ + CHAR(RandomGenerator.class); + + private final Class clazz; +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java new file mode 100644 index 0000000..931e236 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java @@ -0,0 +1,32 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 邮件登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class EmailLoginBody extends LoginBody { + + /** + * 邮箱 + */ + @NotBlank(message = "{user.email.not.blank}") + @Email(message = "{user.email.not.valid}") + private String email; + + /** + * 邮箱code + */ + @NotBlank(message = "{email.code.not.blank}") + private String emailCode; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java new file mode 100644 index 0000000..edb7ab2 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/PasswordLoginBody.java @@ -0,0 +1,34 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; +import org.hibernate.validator.constraints.Length; + +import static org.dromara.common.core.constant.UserConstants.*; + +/** + * 密码登录对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PasswordLoginBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") + private String password; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java new file mode 100644 index 0000000..386c0fc --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/RegisterBody.java @@ -0,0 +1,36 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; +import org.hibernate.validator.constraints.Length; + +import static org.dromara.common.core.constant.UserConstants.*; + +/** + * 用户注册对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RegisterBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") + private String password; + + private String userType; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java new file mode 100644 index 0000000..8b9751d --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java @@ -0,0 +1,30 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 短信登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsLoginBody extends LoginBody { + + /** + * 手机号 + */ + //@NotBlank(message = "{user.phonenumber.not.blank}") + private String phonenumber; + + /** + * 短信code + */ + @NotBlank(message = "{sms.code.not.blank}") + private String smsCode; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java new file mode 100644 index 0000000..cbd61c9 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/SocialLoginBody.java @@ -0,0 +1,36 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SocialLoginBody extends LoginBody { + + /** + * 第三方登录平台 + */ + @NotBlank(message = "{social.source.not.blank}") + private String source; + + /** + * 第三方登录code + */ + @NotBlank(message = "{social.code.not.blank}") + private String socialCode; + + /** + * 第三方登录socialState + */ + @NotBlank(message = "{social.state.not.blank}") + private String socialState; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java new file mode 100644 index 0000000..c80be35 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/WxPubLoginBody.java @@ -0,0 +1,24 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 微信公众号登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxPubLoginBody extends LoginBody { + + @NotBlank(message = "微信授权code不能为空") + private String wxcode; + + @NotBlank(message = "站点名称不能为空") + private String domain; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java new file mode 100644 index 0000000..c68306c --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/XcxLoginBody.java @@ -0,0 +1,29 @@ +package org.dromara.auth.form; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 三方登录对象 + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class XcxLoginBody extends LoginBody { + + /** + * 小程序id(多个小程序时使用) + */ + private String appid; + + /** + * 小程序code + */ + @NotBlank(message = "{xcx.code.not.blank}") + private String xcxCode; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java b/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java new file mode 100644 index 0000000..0c7d2e0 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/listener/UserActionListener.java @@ -0,0 +1,199 @@ +package org.dromara.auth.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.SysUserOnline; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.concurrent.ScheduledExecutorService; + +/** + * 用户行为 侦听器的实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + private final SaTokenConfig tokenConfig; + private final ScheduledExecutorService scheduledExecutorService; + @DubboReference + private RemoteUserService remoteUserService; + @DubboReference + private RemoteMessageService remoteMessageService; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + LoginUser user = LoginHelper.getLoginUser(); + LoginMpUser mpUser = MpLoginHelper.getLoginUser(); + if(user != null){ + SysUserOnline userOnline = new SysUserOnline(); + userOnline.setIpaddr(ip); + userOnline.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + userOnline.setBrowser(userAgent.getBrowser().getName()); + userOnline.setOs(userAgent.getOs().getName()); + userOnline.setLoginTime(System.currentTimeMillis()); + userOnline.setTokenId(tokenValue); + userOnline.setUserName(user.getUsername()); + userOnline.setClientKey(user.getClientKey()); + userOnline.setDeviceType(user.getDeviceType()); + if (ObjectUtil.isNotNull(user.getDeptName())) { + userOnline.setDeptName(user.getDeptName()); + } + if (tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline); + } else { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline, Duration.ofSeconds(tokenConfig.getTimeout())); + } + // 记录登录日志 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(user.getTenantId()); + logininforEvent.setUsername(user.getUsername()); + logininforEvent.setStatus(Constants.LOGIN_SUCCESS); + logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + // 更新登录信息 + remoteUserService.recordLoginInfo(user.getUserId(), ServletUtils.getClientIP()); + log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); + + }else{ + SysUserOnline userOnline = new SysUserOnline(); + userOnline.setIpaddr(ip); + userOnline.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + userOnline.setBrowser(userAgent.getBrowser().getName()); + userOnline.setOs(userAgent.getOs().getName()); + userOnline.setLoginTime(System.currentTimeMillis()); + userOnline.setTokenId(tokenValue); + userOnline.setUserName(mpUser.getPhone()); + userOnline.setClientKey(mpUser.getClientKey()); + userOnline.setDeviceType(mpUser.getDeviceType()); + + if (tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline); + } else { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, userOnline, Duration.ofSeconds(tokenConfig.getTimeout())); + } + // 记录登录日志 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(mpUser.getTenantId()); + logininforEvent.setUsername(mpUser.getPhone()); + logininforEvent.setStatus(Constants.LOGIN_SUCCESS); + logininforEvent.setMessage(MessageUtils.message("user.login.success")); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + // 更新登录信息 + remoteUserService.recordLoginInfo(mpUser.getUserId(), ServletUtils.getClientIP()); + log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); + + } + + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId, String service) { + } + + /** + * 每次打开二级认证时触发 + */ + @Override + public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCloseSafe(String loginType, String tokenValue, String service) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + /** + * 每次Token续期时触发 + */ + @Override + public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java b/ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java new file mode 100644 index 0000000..1cd7098 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/properties/CaptchaProperties.java @@ -0,0 +1,45 @@ +package org.dromara.auth.properties; + +import org.dromara.auth.enums.CaptchaCategory; +import org.dromara.auth.enums.CaptchaType; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 验证码配置 + * + * @author ruoyi + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.captcha") +public class CaptchaProperties { + /** + * 验证码类型 + */ + private CaptchaType type; + + /** + * 验证码类别 + */ + private CaptchaCategory category; + + /** + * 数字验证码位数 + */ + private Integer numberLength; + + /** + * 字符验证码长度 + */ + private Integer charLength; + + /** + * 验证码开关 + */ + private Boolean enabled; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java b/ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java new file mode 100644 index 0000000..5960d71 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/properties/UserPasswordProperties.java @@ -0,0 +1,29 @@ +package org.dromara.auth.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 用户密码配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "user.password") +public class UserPasswordProperties { + + /** + * 密码最大错误次数 + */ + private Integer maxRetryCount; + + /** + * 密码锁定时间(默认10分钟) + */ + private Integer lockTime; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java new file mode 100644 index 0000000..0bc3657 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/IAuthStrategy.java @@ -0,0 +1,35 @@ +package org.dromara.auth.service; + +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.system.api.domain.vo.RemoteClientVo; + +/** + * 授权策略 + * + * @author Michelle.Chung + */ +public interface IAuthStrategy { + + String BASE_NAME = "AuthStrategy"; + + /** + * 登录 + */ + static LoginVo login(String body, RemoteClientVo client, String grantType) { + // 授权类型和客户端id + String beanName = grantType + BASE_NAME; + if (!SpringUtils.containsBean(beanName)) { + throw new ServiceException("授权类型不正确!"); + } + IAuthStrategy instance = SpringUtils.getBean(beanName); + return instance.login(body, client); + } + + /** + * 登录 + */ + LoginVo login(String body, RemoteClientVo client); + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java new file mode 100644 index 0000000..2c25355 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java @@ -0,0 +1,422 @@ +package org.dromara.auth.service; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthUser; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.domain.vo.LoginWxPubVo; +import org.dromara.auth.domain.vo.TLoginVo; +import org.dromara.auth.form.PasswordLoginBody; +import org.dromara.auth.form.RegisterBody; +import org.dromara.auth.properties.CaptchaProperties; +import org.dromara.auth.properties.UserPasswordProperties; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.enums.TenantStatus; +import org.dromara.common.core.enums.UserType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.*; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.common.tenant.exception.TenantException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Supplier; + +/** + * 登录校验方法 + * + * @author ruoyi + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class SysLoginService { + + @DubboReference + private RemoteUserService remoteUserService; + @DubboReference + private RemoteTenantService remoteTenantService; + @DubboReference + private RemoteSocialService remoteSocialService; + + @DubboReference + private final RemoteSmsService remoteSmsService; + + @DubboReference + private final RemoteWeiXinService remoteWeiXinService; + + @DubboReference + private RemoteFileService remoteFileService; + + @Autowired + private UserPasswordProperties userPasswordProperties; + @Autowired + private final CaptchaProperties captchaProperties; + + + @Value("${weixin.scanUrl}") + private String scanUrl; + + /** + * 绑定第三方用户 + * + * @param authUserData 授权响应实体 + */ + public void socialRegister(AuthUser authUserData) { + String authId = authUserData.getSource() + authUserData.getUuid(); + // 第三方用户信息 + RemoteSocialBo bo = BeanUtil.toBean(authUserData, RemoteSocialBo.class); + BeanUtil.copyProperties(authUserData.getToken(), bo); + bo.setUserId(LoginHelper.getUserId()); + bo.setAuthId(authId); + bo.setOpenId(authUserData.getUuid()); + bo.setUserName(authUserData.getUsername()); + bo.setNickName(authUserData.getNickname()); + // 查询是否已经绑定用户 + List list = remoteSocialService.selectByAuthId(authId); + if (CollUtil.isEmpty(list)) { + // 没有绑定用户, 新增用户信息 + remoteSocialService.insertByBo(bo); + } else { + // 更新用户信息 + bo.setId(list.get(0).getId()); + remoteSocialService.updateByBo(bo); + } + } + + /** + * 退出登录 + */ + public void logout() { + try { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } + recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + } catch (NotLoginException ignored) { + } finally { + try { + StpUtil.logout(); + } catch (NotLoginException ignored) { + } + } + } + + + + /** + * 退出登录 + */ + public void mpLogout() { + try { + LoginMpUser loginUser = MpLoginHelper.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + return; + } + if (TenantHelper.isEnable() && MpLoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } + recordLogininfor(loginUser.getTenantId(), loginUser.getPhone(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + } catch (NotLoginException ignored) { + } finally { + try { + StpUtil.logout(); + } catch (NotLoginException ignored) { + } + } + } + + /** + * 注册 + */ + public void register(RegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); + String username = registerBody.getUsername(); + String password = registerBody.getPassword(); + // 校验用户类型是否存在 + String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); + + boolean captchaEnabled = captchaProperties.getEnabled(); + // 验证码开关 + if (captchaEnabled) { + validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); + } + + // 注册用户信息 + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setTenantId(tenantId); + remoteUserBo.setUserName(username); + remoteUserBo.setNickName(username); + remoteUserBo.setPassword(BCrypt.hashpw(password)); + remoteUserBo.setUserType(userType); + + boolean regFlag = remoteUserService.registerUserInfo(remoteUserBo); + if (!regFlag) { + throw new UserException("user.register.error"); + } + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + public void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + * @return + */ + public void recordLogininfor(String tenantId, String username, String status, String message) { + // 封装对象 + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + + /** + * 登录校验 + */ + public void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { + String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username; + String loginFail = Constants.LOGIN_FAIL; + Integer maxRetryCount = userPasswordProperties.getMaxRetryCount(); + Integer lockTime = userPasswordProperties.getLockTime(); + + // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); + // 锁定时间内登录 则踢出 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } + + if (supplier.get()) { + // 错误次数递增 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + // 达到规定错误次数 则锁定登录 + if (errorNumber >= maxRetryCount) { + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); + } else { + // 未达到规定错误次数 + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); + throw new UserException(loginType.getRetryLimitCount(), errorNumber); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(errorKey); + } + + /** + * 校验租户 + * + * @param tenantId 租户ID + */ + public void checkTenant(String tenantId) { + if (!TenantHelper.isEnable()) { + return; + } + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + return; + } + if (StringUtils.isBlank(tenantId)) { + throw new TenantException("tenant.number.not.blank"); + } + RemoteTenantVo tenant = remoteTenantService.queryByTenantId(tenantId); + if (ObjectUtil.isNull(tenant)) { + log.info("登录租户:{} 不存在.", tenantId); + throw new TenantException("tenant.not.exists"); + } else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) { + log.info("登录租户:{} 已被停用.", tenantId); + throw new TenantException("tenant.blocked"); + } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) + && new Date().after(tenant.getExpireTime())) { + log.info("登录租户:{} 已超过有效期.", tenantId); + throw new TenantException("tenant.expired"); + } + } + + public TLoginVo tlogin(String body){ + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + // 验证码开关 + if (captchaProperties.getEnabled()) { + validateCaptcha(tenantId, username, code, uuid); + } + RemoteSysUserVo loginUser = remoteUserService.selectUserByName(username); + checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, loginUser.getPassword())); + TLoginVo rtn = new TLoginVo(); + rtn.setLoginType(loginUser.getLoginType()); + rtn.setPhone(loginUser.getPhonenumber()); + rtn.setId(loginUser.getUserId()); + rtn.setSydId(loginBody.getSydId()); + return rtn; + } + + /** + * 获取登录短信验证码 + * @param domain 域名 + * @param id 用户id + * @return + */ + public Boolean loginSmsCode(String domain, long id){ + RemoteSysUserVo user = remoteUserService.selectUserById(id); + if(user == null){ + throw new ServiceException("用户异常,请重新登录"); + } + SmsType smsType = SmsType.getSmsTypeByRole(user.getCurRoleId()); + if(smsType == null){ + throw new ServiceException("用户角色异常,请重新登录"); + } + String key = smsType.getCacheKey(user.getPhonenumber()); + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(smsType.getExpireTime())); + LinkedHashMap map = new LinkedHashMap<>(); + map.put("code", code); + map.put("expirs", smsType.getExpireTime() + ""); + RemoteSms sysSms = remoteSmsService.send(domain,user.getPhonenumber(),smsType,map); + return sysSms.getIsSuccess(); + + } + + /** + * 获取微信登录验证二维码 + * @param domain 域名 + * @param id 用户id + * @return + */ + public LoginWxPubVo loginWxPubCode(String domain, long id, Long sydId){ + RemoteSysUserVo user = remoteUserService.selectUserById(id); + if(user == null){ + throw new ServiceException("用户异常,请重新登录"); + } + SmsType smsType = SmsType.getSmsTypeByRole(user.getCurRoleId()); + if(smsType == null){ + throw new ServiceException("用户角色异常,请重新登录"); + } + LoginWxPubVo rtn = new LoginWxPubVo(); + String key = smsType.getCacheKey(user.getUserId().toString()); + String code = RandomUtil.randomNumbers(4); + Long wxLoginId = Long.parseLong((new Date().getTime()+"") + (id+""));//此次微信登录id + String redirectUri = scanUrl+"/loginCode.html"+"?ncode="+code+"&id="+wxLoginId+"&sydId="+(sydId != null ? sydId : "")+"&domain="+ Base64.encode(domain); +// String redirectUri = domain + "/loginWxPub?ncode="+code+"&id="+wxLoginId+"&sydId="+(sydId != null ? sydId : ""); + String qrcodeUrl = remoteWeiXinService.genPubAuthQrcode(domain,redirectUri); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(smsType.getExpireTime())); + R loginResultVo = new R(); + loginResultVo.setCode(0);//等待扫码中 + loginResultVo.setData(new LoginVo()); + loginResultVo.getData().setClientId(id+"");//存入登录用户id + RedisUtils.setCacheObject(getWxPubLoginResultCacheKey(wxLoginId), loginResultVo, Duration.ofMinutes(smsType.getExpireTime()+1)); + rtn.setQrcode(qrcodeUrl); + rtn.setId(wxLoginId); + return rtn; + } + + /** + * 获取微信登录结果缓存key + * @param id 用户id + * @return + */ + public String getWxPubLoginResultCacheKey(long id){ + return GlobalConstants.CAPTCHA_CODE_KEY + ":weixinpub:"+ id; + } + + /** + * 获取微信登录结果 + * @param id 用户id + * @return + */ + public LoginVo loginWxPubResult(long id){ + String key = getWxPubLoginResultCacheKey(id); + R loginResultVo = RedisUtils.getCacheObject(key); + if (loginResultVo == null){ + throw new ServiceException("二维码已过期,请重新登录"); + } + if(loginResultVo.getCode() == 0){//等待扫码中 + return null; + } + if (R.isError(loginResultVo)){ + throw new ServiceException(loginResultVo.getMsg()); + } + RedisUtils.deleteObject(key); + return loginResultVo.getData(); + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java new file mode 100644 index 0000000..8790fe1 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/EmailAuthStrategy.java @@ -0,0 +1,84 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.EmailLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/** + * 邮件认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("email" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class EmailAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String email = loginBody.getEmail(); + String emailCode = loginBody.getEmailCode(); + + // 通过邮箱查找用户 + LoginUser loginUser = remoteUserService.getUserInfoByEmail(email, tenantId); + loginService.checkLogin(LoginType.EMAIL, tenantId, loginUser.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode)); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验邮箱验证码 + */ + private boolean validateEmailCode(String tenantId, String email, String emailCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + email); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(emailCode); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java new file mode 100644 index 0000000..67d03a3 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/MpSmsAuthStrategy.java @@ -0,0 +1,102 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SmsLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.map.api.RemoteUserWokerService; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title MpSmsAuthStrategy + * @description 公众号短信登录 + * @create 2024-04-01 10:34 + */ + +@Service +@Slf4j +@RequiredArgsConstructor +public class MpSmsAuthStrategy implements IAuthStrategy { + + @DubboReference + private RemoteUserWokerService userWokerService; + + @Resource + private SysLoginService loginService; + + + @Override + public LoginVo login(String body, RemoteClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + + // 通过手机号查找用户 +// LoginUser loginUser = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId); +// loginService.checkLogin(LoginType.SMS, tenantId, loginUser.getUsername(), () -> !); + validateSmsCode(tenantId, phonenumber, smsCode); + + LoginMpUser loginUser = this.userWokerService.selectUserWorkByPhonenumer(phonenumber,tenantId); + + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(MpLoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + MpLoginHelper.login(loginUser,tenantId, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + + /** + * 校验短信验证码 + */ + private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_MP_PHONE_CODE_KEY+ SmsType.MP.getIType() + phonenumber); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + } + + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java new file mode 100644 index 0000000..9550485 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java @@ -0,0 +1,104 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.PasswordLoginBody; +import org.dromara.auth.properties.CaptchaProperties; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/** + * 密码认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("password" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class PasswordAuthStrategy implements IAuthStrategy { + + private final CaptchaProperties captchaProperties; + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + + // 验证码开关 + if (captchaProperties.getEnabled()) { + validateCaptcha(tenantId, username, code, uuid); + } + + LoginUser loginUser = remoteUserService.getUserInfo(username, tenantId); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, loginUser.getPassword())); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + private void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java new file mode 100644 index 0000000..0aff8fe --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SmsAuthStrategy.java @@ -0,0 +1,129 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SmsLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +/** + * 短信认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("sms" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SmsAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + //String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + if(ObjectUtil.isNull(loginBody.getId())){ + throw new ServiceException("登录参数缺失,请重新登录"); + } + // 通过手机号查找用户 + LoginUser loginUser = remoteUserService.getUserInfo(loginBody.getId(),tenantId); + loginService.checkLogin(LoginType.SMS, tenantId, loginUser.getUsername(), () -> { + SmsType smsType = SmsType.getSmsTypeByRole(loginUser.getCurRoleId()); + String code = RedisUtils.getCacheObject(smsType.getCacheKey(loginUser.getPhonenumber())); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, loginUser.getUsername(), Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return !code.equals(smsCode); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + loginUser.setSydId(loginBody.getSydId()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + + /*public LoginVo login(String body, RemoteClientVo client) { + SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String phonenumber = loginBody.getPhonenumber(); + String smsCode = loginBody.getSmsCode(); + + // 通过手机号查找用户 + LoginUser loginUser = remoteUserService.getUserInfoByPhonenumber(phonenumber, tenantId); + loginService.checkLogin(LoginType.SMS, tenantId, loginUser.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + }*/ + + /** + * 校验短信验证码 + */ + /*private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phonenumber); + if (StringUtils.isBlank(code)) { + loginService.recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + }*/ + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java new file mode 100644 index 0000000..f02ef79 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SocialAuthStrategy.java @@ -0,0 +1,109 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.SocialLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.utils.SocialUtils; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * 第三方授权策略 + * + * @author thiszhc is 三三 + */ +@Slf4j +@Service("social" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class SocialAuthStrategy implements IAuthStrategy { + + private final SocialProperties socialProperties; + private final SysLoginService loginService; + + @DubboReference + private RemoteSocialService remoteSocialService; + @DubboReference + private RemoteUserService remoteUserService; + + /** + * 登录-第三方授权登录 + * + * @param body 登录信息 + * @param client 客户端信息 + */ + @Override + public LoginVo login(String body, RemoteClientVo client) { + SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); + ValidatorUtils.validate(loginBody); + AuthResponse response = SocialUtils.loginAuth( + loginBody.getSource(), loginBody.getSocialCode(), + loginBody.getSocialState(), socialProperties); + if (!response.ok()) { + throw new ServiceException(response.getMsg()); + } + AuthUser authUserData = response.getData(); + if ("GITEE".equals(authUserData.getSource())) { + // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/flexible-employment") + .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) + .executeAsync(); + } + + List list = remoteSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (CollUtil.isEmpty(list)) { + throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); + } + Optional opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny(); + if (opt.isEmpty()) { + throw new ServiceException("对不起,你没有权限登录当前租户!"); + } + RemoteSocialVo socialVo = opt.get(); + + LoginUser loginUser = remoteUserService.getUserInfo(socialVo.getUserId(), socialVo.getTenantId()); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..6ab8692 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotEmpty(roleKey); + boolean permsExist = StringUtils.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java new file mode 100644 index 0000000..addcddb --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/WxPubAuthStrategy.java @@ -0,0 +1,112 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.http.Method; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.WxPubLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.time.Duration; + +/** + * 微信公众号认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("weixinpub" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class WxPubAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @DubboReference + private RemoteWeiXinService remoteWeiXinService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + WxPubLoginBody loginBody = JsonUtils.parseObject(body, WxPubLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + if(ObjectUtil.isNull(loginBody.getId())){ + throw new ServiceException("登录参数缺失,请重新登录"); + } + String resultKey = loginService.getWxPubLoginResultCacheKey(loginBody.getId()); + R loginResultVo = RedisUtils.getCacheObject(resultKey); + if (loginResultVo == null || loginResultVo.getData() == null || StringUtils.isBlank(loginResultVo.getData().getClientId())){ + throw new ServiceException("二维码已过期,请重新登录"); + } + Long userId = Long.parseLong(loginResultVo.getData().getClientId()); + String curOpenId = remoteWeiXinService.getOpenId(Base64.decodeStr(loginBody.getDomain()),loginBody.getWxcode()); + if (StringUtils.isBlank(curOpenId)){ + loginResultVo.setMsg("授权失败,请重新登录"); + RedisUtils.setCacheObject(resultKey, loginResultVo, Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + throw new ServiceException(loginResultVo.getMsg()); + } + LoginUser loginUser = remoteUserService.getUserInfo(userId,tenantId); + if(!curOpenId.equals(loginUser.getBindOpenId())){ + loginResultVo.setMsg("登录失败,绑定账户不正确"); + RedisUtils.setCacheObject(resultKey, loginResultVo, Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + throw new ServiceException(loginResultVo.getMsg()); + } + SmsType smsType = SmsType.getSmsTypeByRole(loginUser.getCurRoleId()); + String code = RedisUtils.getCacheObject(smsType.getCacheKey(loginUser.getUserId().toString())); + if (StringUtils.isBlank(code) || !code.equals(loginBody.getCode())) { + loginResultVo.setMsg("二维码已过期,请重新登录"); + RedisUtils.setCacheObject(resultKey, loginResultVo, Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + loginService.recordLogininfor(tenantId, loginUser.getUsername(), Constants.LOGIN_FAIL, loginResultVo.getMsg()); + throw new BaseException("user",loginResultVo.getMsg()); + } + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + loginUser.setSydId(loginBody.getSydId()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + long size = RedisUtils.getTimeToLive(resultKey); +// RedisUtils.setCacheObject(resultKey, R.ok(loginVo), Duration.ofSeconds(RedisUtils.getTimeToLive(resultKey))); + RedisUtils.setCacheObject(resultKey, R.ok(loginVo)); + return loginVo; + } +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java new file mode 100644 index 0000000..20ec4cc --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/XcxAuthStrategy.java @@ -0,0 +1,69 @@ +package org.dromara.auth.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.XcxLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.auth.service.SysLoginService; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.XcxLoginUser; +import org.springframework.stereotype.Service; + +/** + * 邮件认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("xcx" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class XcxAuthStrategy implements IAuthStrategy { + + private final SysLoginService loginService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); + ValidatorUtils.validate(loginBody); + // xcxCode 为 小程序调用 wx.login 授权后获取 + String xcxCode = loginBody.getXcxCode(); + // 多个小程序识别使用 + String appid = loginBody.getAppid(); + + // todo 以下自行实现 + // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid + String openid = ""; + XcxLoginUser loginUser = remoteUserService.getUserInfoByOpenid(openid); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + loginVo.setOpenid(openid); + return loginVo; + } + +} diff --git a/ruoyi-auth/src/main/resources/application.yml b/ruoyi-auth/src/main/resources/application.yml new file mode 100644 index 0000000..b00d227 --- /dev/null +++ b/ruoyi-auth/src/main/resources/application.yml @@ -0,0 +1,35 @@ +# Tomcat +server: + port: 9211 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-auth + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-auth/src/main/resources/banner.txt b/ruoyi-auth/src/main/resources/banner.txt new file mode 100644 index 0000000..97c5c27 --- /dev/null +++ b/ruoyi-auth/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) | | | | + _ __ _ _ ___ _ _ _ ______ __ _ _ _ | |_ | |__ +| '__|| | | | / _ \ | | | || ||______| / _` || | | || __|| '_ \ +| | | |_| || (_) || |_| || | | (_| || |_| || |_ | | | | +|_| \__,_| \___/ \__, ||_| \__,_| \__,_| \__||_| |_| + __/ | + |___/ \ No newline at end of file diff --git a/ruoyi-auth/src/main/resources/logback-plus.xml b/ruoyi-auth/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-auth/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-example/pom.xml b/ruoyi-example/pom.xml new file mode 100644 index 0000000..6e27885 --- /dev/null +++ b/ruoyi-example/pom.xml @@ -0,0 +1,43 @@ + + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + + ruoyi-demo + ruoyi-stream-mq + + + ruoyi-example + pom + + + ruoyi-example 例子模块 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/README.md b/ruoyi-example/ruoyi-demo/README.md new file mode 100644 index 0000000..5ac83c8 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/README.md @@ -0,0 +1,2 @@ +# 使用说明 +需要在 `ry-cloud` 数据库内执行 `test.sql` 文件 初始化测试数据 \ No newline at end of file diff --git a/ruoyi-example/ruoyi-demo/pom.xml b/ruoyi-example/ruoyi-demo/pom.xml new file mode 100644 index 0000000..d717e93 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/pom.xml @@ -0,0 +1,138 @@ + + + + org.dromara + ruoyi-example + ${revision} + + 4.0.0 + + ruoyi-demo + + + ruoyi-demo 演示模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-tenant + + + + + + + + + + + + + + + org.dromara + ruoyi-common-elasticsearch + + + + org.dromara + ruoyi-common-sensitive + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java new file mode 100644 index 0000000..c62aa66 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/RuoYiDemoApplication.java @@ -0,0 +1,20 @@ +package org.dromara.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 演示模块 + * + * @author Lion Li + */ +@SpringBootApplication +public class RuoYiDemoApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiDemoApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 演示模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java new file mode 100644 index 0000000..d3a1548 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java @@ -0,0 +1,89 @@ +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.Document; +import org.dromara.demo.esmapper.DocumentMapper; +import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 搜索引擎 crud 演示案例 + * + * @author Lion Li + */ +@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true") +@RequiredArgsConstructor +@RestController +@RequestMapping("/es") +public class EsCrudController { + + private final DocumentMapper documentMapper; + + /** + * 查询(指定) + * + * @param title 标题 + */ + @GetMapping("/select") + public Document select(String title) { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, title); + return documentMapper.selectOne(wrapper); + } + + /** + * 搜索(模糊) + * + * @param key 搜索关键字 + */ + @GetMapping("/search") + public List search(String key) { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.like(Document::getTitle, key); + return documentMapper.selectList(wrapper); + } + + /** + * 插入 + */ + @PostMapping("/insert") + public Integer insert(@RequestBody Document document) { + return documentMapper.insert(document); + } + + /** + * 更新 + */ + @PutMapping("/update") + public R update(@RequestBody Document document) { + // 测试更新 更新有两种情况 分别演示如下: + // case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询) + documentMapper.updateById(document); + + // case2: id未知, 根据条件更新 +// LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); +// wrapper.like(Document::getTitle, document.getTitle()); +// Document document2 = new Document(); +// document2.setTitle(document.getTitle()); +// document2.setContent(document.getContent()); +// documentMapper.update(document2, wrapper); + + return R.ok(); + } + + /** + * 删除 + * + * @param id 主键 + */ + @DeleteMapping("/delete/{id}") + public R delete(@PathVariable String id) { + // 测试删除数据 删除有两种情况:根据id删或根据条件删 + return R.ok(documentMapper.deleteById(id)); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java new file mode 100644 index 0000000..7f3e3b7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/MailController.java @@ -0,0 +1,52 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.mail.utils.MailUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; + + +/** + * 邮件发送案例 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mail") +public class MailController { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + @GetMapping("/sendSimpleMessage") + public R sendSimpleMessage(String to, String subject, String text) { + MailUtils.sendText(to, subject, text); + return R.ok(); + } + + /** + * 发送邮件(带附件) + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + * @param filePath 附件路径 + */ + @GetMapping("/sendMessageWithAttachment") + public R sendMessageWithAttachment(String to, String subject, String text, String filePath) { + MailUtils.sendText(to, subject, text, new File(filePath)); + return R.ok(); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java new file mode 100644 index 0000000..9a6508a --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java @@ -0,0 +1,95 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.RedisUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; + +/** + * spring-cache 演示案例 + * + * @author Lion Li + */ +// 类级别 缓存统一配置 +//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE) +@RequiredArgsConstructor +@RestController +@RequestMapping("/cache") +public class RedisCacheController { + + /** + * 测试 @Cacheable + *

+ * 表示这个方法有了缓存的功能,方法的返回值会被缓存下来 + * 下一次调用该方法前,会去检查是否缓存中已经有值 + * 如果有就直接返回,不调用方法 + * 如果没有,就调用方法,然后把结果缓存起来 + * 这个注解「一般用在查询方法上」 + *

+ * 重点说明: 缓存注解严禁与其他筛选数据功能一起使用 + * 例如: 数据权限注解 会造成 缓存击穿 与 数据不一致问题 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null") + @GetMapping("/test1") + public R test1(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试 @CachePut + *

+ * 加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用 + * 它「通常用在新增或者实时更新方法上」 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") + @GetMapping("/test2") + public R test2(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试 @CacheEvict + *

+ * 使用了CacheEvict注解的方法,会清空指定缓存 + * 「一般用在删除的方法上」 + *

+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 + */ + @CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null") + @GetMapping("/test3") + public R test3(String key, String value) { + return R.ok("操作成功", value); + } + + /** + * 测试设置过期时间 + * 手动设置过期时间10秒 + * 11秒后获取 判断是否相等 + */ + @GetMapping("/test6") + public R test6(String key, String value) { + RedisUtils.setCacheObject(key, value); + boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10)); + System.out.println("***********" + flag); + try { + Thread.sleep(11 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Object obj = RedisUtils.getCacheObject(key); + return R.ok(value.equals(obj)); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java new file mode 100644 index 0000000..1cf0542 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisLockController.java @@ -0,0 +1,71 @@ +package org.dromara.demo.controller; + +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import com.baomidou.lock.annotation.Lock4j; +import com.baomidou.lock.executor.RedissonLockExecutor; +import org.dromara.common.core.domain.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalTime; + + +/** + * 测试分布式锁的样例 + * + * @author shenxinquan + */ +@Slf4j +@RestController +@RequestMapping("/redisLock") +public class RedisLockController { + + @Autowired + private LockTemplate lockTemplate; + + /** + * 测试lock4j 注解 + */ + @Lock4j(keys = {"#key"}) + @GetMapping("/testLock4j") + public R testLock4j(String key, String value) { + System.out.println("start:" + key + ",time:" + LocalTime.now()); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("end :" + key + ",time:" + LocalTime.now()); + return R.ok("操作成功", value); + } + + /** + * 测试lock4j 工具 + */ + @GetMapping("/testLock4jLockTemplate") + public R testLock4jLockTemplate(String key, String value) { + final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class); + if (null == lockInfo) { + throw new RuntimeException("业务处理中,请稍后再试"); + } + // 获取锁成功,处理业务 + try { + try { + Thread.sleep(8000); + } catch (InterruptedException e) { + // + } + System.out.println("执行简单方法1 , 当前线程:" + Thread.currentThread().getName()); + } finally { + //释放锁 + lockTemplate.releaseLock(lockInfo); + } + //结束 + return R.ok("操作成功", value); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java new file mode 100644 index 0000000..5b19610 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisPubSubController.java @@ -0,0 +1,47 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.RedisUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Redis 发布订阅 演示案例 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/redis/pubsub") +public class RedisPubSubController { + + /** + * 发布消息 + * + * @param key 通道Key + * @param value 发送内容 + */ + @GetMapping("/pub") + public R pub(String key, String value) { + RedisUtils.publish(key, value, consumer -> { + System.out.println("发布通道 => " + key + ", 发送值 => " + value); + }); + return R.ok("操作成功"); + } + + /** + * 订阅消息 + * + * @param key 通道Key + */ + @GetMapping("/sub") + public R sub(String key) { + RedisUtils.subscribe(key, String.class, msg -> { + System.out.println("订阅通道 => " + key + ", 接收值 => " + msg); + }); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java new file mode 100644 index 0000000..f14fdb7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java @@ -0,0 +1,59 @@ +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.LinkedHashMap; + +/** + * 短信演示案例 + * 请先阅读文档 否则无法使用 + * + * @author Lion Li + * @version 4.2.0 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sms") +public class SmsController { + /** + * 发送短信Aliyun + * + * @param phones 电话号 + * @param templateId 模板ID + */ + @GetMapping("/sendAliyun") + public R sendAliyun(String phones, String templateId) { + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", "1234"); + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); + return R.ok(smsResponse); + } + + /** + * 发送短信Tencent + * + * @param phones 电话号 + * @param templateId 模板ID + */ + @GetMapping("/sendTencent") + public R sendTencent(String phones, String templateId) { + LinkedHashMap map = new LinkedHashMap<>(1); +// map.put("2", "测试测试"); + map.put("1", "1234"); + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map); + return R.ok(smsResponse); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java new file mode 100644 index 0000000..bb02f98 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/Swagger3DemoController.java @@ -0,0 +1,31 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * swagger3 用法示例 + * + * @author Lion Li + */ +@RestController +@RequestMapping("/swagger/demo") +public class Swagger3DemoController { + + /** + * 上传请求 + * 必须使用 @RequestPart 注解标注为文件 + * + * @param file 文件 + */ + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + return R.ok("操作成功", file.getOriginalFilename()); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java new file mode 100644 index 0000000..2c49b4d --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBatchController.java @@ -0,0 +1,89 @@ +package org.dromara.demo.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.mapper.TestDemoMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +/** + * 测试批量方法 + * + * @author Lion Li + * @date 2021-05-30 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/batch") +public class TestBatchController extends BaseController { + + /** + * 为了便于测试 直接引入mapper + */ + private final TestDemoMapper testDemoMapper; + + /** + * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) + *

+ * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 + */ + @PostMapping("/add") +// @DS("slave") + public R add() { + List list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); + } + return toAjax(testDemoMapper.insertBatch(list)); + } + + /** + * 新增或更新 可完美替代 saveOrUpdateBatch 高性能 + *

+ * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 + */ + @PostMapping("/addOrUpdate") +// @DS("slave") + public R addOrUpdate() { + List list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); } + testDemoMapper.insertBatch(list); + for (int i = 0; i < list.size(); i++) { + TestDemo testDemo = list.get(i); + testDemo.setTestKey("批量新增或修改"); + testDemo.setValue("批量新增或修改"); + if (i % 2 == 0) { + testDemo.setId(null); + } + } + return toAjax(testDemoMapper.insertOrUpdateBatch(list)); + } + + /** + * 删除批量方法 + */ + @DeleteMapping() +// @DS("slave") + public R remove() { + return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() + .eq(TestDemo::getOrderNum, -1L))); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java new file mode 100644 index 0000000..93b4687 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestDemoController.java @@ -0,0 +1,146 @@ +package org.dromara.demo.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.bo.TestDemoImportVo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.dromara.demo.service.ITestDemoService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 测试单表Controller + * + * @author Lion Li + * @date 2021-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo") +public class TestDemoController extends BaseController { + + private final ITestDemoService iTestDemoService; + + /** + * 查询测试单表列表 + */ + @SaCheckPermission("demo:demo:list") + @GetMapping("/list") + public TableDataInfo list(TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.queryPageList(bo, pageQuery); + } + + /** + * 自定义分页查询 + */ + @SaCheckPermission("demo:demo:list") + @GetMapping("/page") + public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.customPageList(bo, pageQuery); + } + + /** + * 导入测试-校验 + * + * @param file 导入文件 + */ + @Log(title = "测试单表", businessType = BusinessType.IMPORT) + @SaCheckPermission("demo:demo:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file) throws Exception { + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); + List volist = excelResult.getList(); + List list = BeanUtil.copyToList(volist, TestDemo.class); + iTestDemoService.saveBatch(list); + return R.ok(excelResult.getAnalysis()); + } + + /** + * 导出测试单表列表 + */ + @SaCheckPermission("demo:demo:export") + @Log(title = "测试单表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@Validated TestDemoBo bo, HttpServletResponse response) { + List list = iTestDemoService.queryList(bo); + // 测试雪花id导出 +// for (TestDemoVo vo : list) { +// vo.setId(1234567891234567893L); +// } + ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); + } + + /** + * 获取测试单表详细信息 + * + * @param id 测试ID + */ + @SaCheckPermission("demo:demo:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { + return R.ok(iTestDemoService.queryById(id)); + } + + /** + * 新增测试单表 + */ + @SaCheckPermission("demo:demo:add") + @Log(title = "测试单表", businessType = BusinessType.INSERT) + @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}") + @PostMapping() + public R add(@RequestBody TestDemoBo bo) { + // 使用校验工具对标 @Validated(AddGroup.class) 注解 + // 用于在非 Controller 的地方校验对象 + ValidatorUtils.validate(bo, AddGroup.class); + return toAjax(iTestDemoService.insertByBo(bo)); + } + + /** + * 修改测试单表 + */ + @SaCheckPermission("demo:demo:edit") + @Log(title = "测试单表", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { + return toAjax(iTestDemoService.updateByBo(bo)); + } + + /** + * 删除测试单表 + * + * @param ids 测试ID串 + */ + @SaCheckPermission("demo:demo:remove") + @Log(title = "测试单表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java new file mode 100644 index 0000000..de32a43 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java @@ -0,0 +1,55 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.TestDemoEncrypt; +import org.dromara.demo.mapper.TestDemoEncryptMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 测试数据库加解密功能 + * + * @author Lion Li + */ +@Validated +@RestController +@RequestMapping("/encrypt") +public class TestEncryptController { + + @Autowired + private TestDemoEncryptMapper mapper; + @Value("${mybatis-encryptor.enable}") + private Boolean encryptEnable; + + /** + * 测试数据库加解密 + * + * @param key 测试key + * @param value 测试value + */ + @GetMapping() + public R> test(String key, String value) { + if (!encryptEnable) { + throw new RuntimeException("加密功能未开启!"); + } + Map map = new HashMap<>(2); + TestDemoEncrypt demo = new TestDemoEncrypt(); + demo.setTestKey(key); + demo.setValue(value); + mapper.insert(demo); + map.put("加密", demo); + TestDemoEncrypt testDemo = mapper.selectById(demo.getId()); + map.put("解密", testDemo); + return R.ok(map); + } + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java new file mode 100644 index 0000000..d82ea3b --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java @@ -0,0 +1,160 @@ +package org.dromara.demo.controller; + +import cn.hutool.core.collection.CollUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.ExportDemoVo; +import org.dromara.demo.listener.ExportDemoListener; +import org.dromara.demo.service.IExportExcelService; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 测试Excel功能 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/excel") +public class TestExcelController { + + private final IExportExcelService exportExcelService; + + /** + * 单列表多数据 + */ + @GetMapping("/exportTemplateOne") + public void exportTemplateOne(HttpServletResponse response) { + Map map = new HashMap<>(); + map.put("title", "单列表多数据"); + map.put("test1", "数据测试1"); + map.put("test2", "数据测试2"); + map.put("test3", "数据测试3"); + map.put("test4", "数据测试4"); + map.put("testTest", "666"); + List list = new ArrayList<>(); + list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4")); + list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8")); + list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12")); + ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "单列表.xlsx", "excel/单列表.xlsx", response); + } + + /** + * 多列表多数据 + */ + @GetMapping("/exportTemplateMuliti") + public void exportTemplateMuliti(HttpServletResponse response) { + Map map = new HashMap<>(); + map.put("title1", "标题1"); + map.put("title2", "标题2"); + map.put("title3", "标题3"); + map.put("title4", "标题4"); + map.put("author", "Lion Li"); + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + list1.add(new TestObj1("list1测试7", "list1测试8", "list1测试9")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9")); + list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12")); + Map multiListMap = new HashMap<>(); + multiListMap.put("map", map); + multiListMap.put("data1", list1); + multiListMap.put("data2", list2); + multiListMap.put("data3", list3); + multiListMap.put("data4", list4); + ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response); + } + + /** + * 导出下拉框 + * + * @param response / + */ + @GetMapping("/exportWithOptions") + public void exportWithOptions(HttpServletResponse response) { + exportExcelService.exportWithOptions(response); + } + + /** + * 多个sheet导出 + */ + @GetMapping("/exportTemplateMultiSheet") + public void exportTemplateMultiSheet(HttpServletResponse response) { + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + list3.add(new TestObj1("list3测试4", "list3测试5", "list3测试6")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + + List> list = new ArrayList<>(); + Map sheetMap1 = new HashMap<>(); + sheetMap1.put("data1", list1); + Map sheetMap2 = new HashMap<>(); + sheetMap2.put("data2", list2); + Map sheetMap3 = new HashMap<>(); + sheetMap3.put("data3", list3); + Map sheetMap4 = new HashMap<>(); + sheetMap4.put("data4", list4); + + list.add(sheetMap1); + list.add(sheetMap2); + list.add(sheetMap3); + list.add(sheetMap4); + ExcelUtil.exportTemplateMultiSheet(list, "多sheet列表", "excel/多sheet列表.xlsx", response); + } + + /** + * 导入表格 + */ + @PostMapping(value = "/importWithOptions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public List importWithOptions(@RequestPart("file") MultipartFile file) throws Exception { + // 处理解析结果 + ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), ExportDemoVo.class, new ExportDemoListener()); + return excelResult.getList(); + } + + @Data + @AllArgsConstructor + static class TestObj1 { + private String test1; + private String test2; + private String test3; + } + + @Data + @AllArgsConstructor + static class TestObj { + private String name; + private String list1; + private String list2; + private String list3; + private String list4; + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java new file mode 100644 index 0000000..d618512 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestI18nController.java @@ -0,0 +1,71 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MessageUtils; +import lombok.Data; +import org.hibernate.validator.constraints.Range; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + + +/** + * 测试国际化 + * + * @author Lion Li + */ +@Validated +@RestController +@RequestMapping("/i18n") +public class TestI18nController { + + /** + * 通过code获取国际化内容 + * code为 messages.properties 中的 key + *

+ * 测试使用 user.register.success + * + * @param code 国际化code + */ + @GetMapping() + public R get(String code) { + return R.ok(MessageUtils.message(code)); + } + + /** + * Validator 校验国际化 + * 不传值 分别查看异常返回 + *

+ * 测试使用 not.null + */ + @GetMapping("/test1") + public R test1(@NotBlank(message = "{not.null}") String str) { + return R.ok(str); + } + + /** + * Bean 校验国际化 + * 不传值 分别查看异常返回 + *

+ * 测试使用 not.null + */ + @GetMapping("/test2") + public R test2(@Validated TestI18nBo bo) { + return R.ok(bo); + } + + @Data + public static class TestI18nBo { + + @NotBlank(message = "{not.null}") + private String name; + + @NotNull(message = "{not.null}") + @Range(min = 0, max = 100, message = "{length.not.valid}") + private Integer age; + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java new file mode 100644 index 0000000..1feaf1b --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestSensitiveController.java @@ -0,0 +1,75 @@ +package org.dromara.demo.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.web.core.BaseController; +import lombok.Data; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试数据脱敏控制器 + *

+ * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + * @see org.dromara.common.sensitive.core.SensitiveService + */ +@RestController +@RequestMapping("/sensitive") +public class TestSensitiveController extends BaseController { + + /** + * 测试数据脱敏 + */ + @GetMapping("/test") + public R test() { + TestSensitive testSensitive = new TestSensitive(); + testSensitive.setIdCard("210397198608215431"); + testSensitive.setPhone("17640125371"); + testSensitive.setAddress("北京市朝阳区某某四合院1203室"); + testSensitive.setEmail("17640125371@163.com"); + testSensitive.setBankCard("6226456952351452853"); + return R.ok(testSensitive); + } + + @Data + static class TestSensitive { + + /** + * 身份证 + */ + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String idCard; + + /** + * 电话 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common") + private String phone; + + /** + * 地址 + */ + @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query") + private String address; + + /** + * 邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL, roleKey = "common", perms = "system:user:query1") + private String email; + + /** + * 银行卡 + */ + @Sensitive(strategy = SensitiveStrategy.BANK_CARD, roleKey = "common1", perms = "system:user:query") + private String bankCard; + + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java new file mode 100644 index 0000000..81bb2a7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestShardingController.java @@ -0,0 +1,46 @@ +package org.dromara.demo.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.ShardingOrder; +import org.dromara.demo.mapper.ShardingOrderMapper; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 使用方式 看官网文档扩展项目 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/sharding") +public class TestShardingController { + + private final ShardingOrderMapper torderMapper; + + @GetMapping("/page") + public R> page() { + Page page = new Page<>(); + page.setCurrent(3L); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.orderByAsc(ShardingOrder::getOrderId); + torderMapper.selectPage(page, lqw); + return R.ok(page); + } + + @GetMapping("/insert") + public R insert() { + for (Long i = 1L; i <= 100L; i++) { + ShardingOrder torder = new ShardingOrder(); + torder.setUserId(i); + torder.setTotalMoney(100 + Integer.parseInt(i + "")); + torderMapper.insert(torder); + } + + return R.ok("分库分表数据批量插入成功!"); + + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java new file mode 100644 index 0000000..178a4b8 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestTreeController.java @@ -0,0 +1,104 @@ +package org.dromara.demo.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; +import org.dromara.demo.service.ITestTreeService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 测试树表Controller + * + * @author Lion Li + * @date 2021-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tree") +public class TestTreeController extends BaseController { + + private final ITestTreeService iTestTreeService; + + /** + * 查询测试树表列表 + */ + @SaCheckPermission("demo:tree:list") + @GetMapping("/list") + public R> list(TestTreeBo bo) { + List list = iTestTreeService.queryList(bo); + return R.ok(list); + } + + /** + * 导出测试树表列表 + */ + @SaCheckPermission("demo:tree:export") + @Log(title = "测试树表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public void export(@Validated TestTreeBo bo, HttpServletResponse response) { + List list = iTestTreeService.queryList(bo); + ExcelUtil.exportExcel(list, "测试树表", TestTreeVo.class, response); + } + + /** + * 获取测试树表详细信息 + * + * @param id 测试树ID + */ + @SaCheckPermission("demo:tree:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { + return R.ok(iTestTreeService.queryById(id)); + } + + /** + * 新增测试树表 + */ + @SaCheckPermission("demo:tree:add") + @Log(title = "测试树表", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.insertByBo(bo)); + } + + /** + * 修改测试树表 + */ + @SaCheckPermission("demo:tree:edit") + @Log(title = "测试树表", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.updateByBo(bo)); + } + + /** + * 删除测试树表 + * + * @param ids 测试树ID串 + */ + @SaCheckPermission("demo:tree:remove") + @Log(title = "测试树表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java new file mode 100644 index 0000000..16c30f8 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.controller; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java new file mode 100644 index 0000000..71c77ee --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java @@ -0,0 +1,25 @@ +package org.dromara.demo.domain; + +import lombok.Data; + +/** + * 文档实体 + */ +@Data +public class Document { + + /** + * es中的唯一id + */ + private String id; + + /** + * 文档标题 + */ + private String title; + + /** + * 文档内容 + */ + private String content; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java new file mode 100644 index 0000000..6190e9c --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrder.java @@ -0,0 +1,16 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@TableName("t_order") +@Data +public class ShardingOrder { + + + private Long orderId; + + private Long userId; + + private int totalMoney; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java new file mode 100644 index 0000000..83fde7c --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/ShardingOrderItem.java @@ -0,0 +1,17 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@TableName("t_order_item") +@Data +public class ShardingOrderItem { + + private Long orderItemId; + + private Long orderId; + + private Long userId; + + private int totalMoney; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java new file mode 100644 index 0000000..c0f59ae --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemo.java @@ -0,0 +1,82 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.*; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Base64; + +/** + * 测试单表对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 排序号 + */ + @OrderBy(asc = false, sort = 1) + private Integer orderNum; + + /** + * key键 + */ + private String testKey; + + /** + * 值 + */ + private String value; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + + + public static void main(String[] args) { +// byte[] bytes = Base64.decode("YVd+ZNfLLowp45JTyri0nO2SHo1ooKDU/QRc9MIsk4Ih52SN+uR2vMRNZLMJ23dKXJefCi9xm2BA37ZIkkl7614iXTwnmsNiuoMmOfH+ds="); + String encodedString = "YVd+ZNfLLowp45JTyri0nO2SHo1ooKDU/QRc9MIsk4Ih52SN++uR2vMRNZLMJ23dKXJefCi9xm2BA37ZIkkl7614iXTwnmsNiuoMmOfH+ds="; +// if (encodedString.length() % 4 != 0) { +// int padSize = 4 - (encodedString.length() % 4); +// encodedString += "="; // 添加填充字符 +// } + System.out.println(encodedString); + byte[] bytes = Base64.getDecoder().decode(encodedString); + System.out.println(bytes.length); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java new file mode 100644 index 0000000..bdcd596 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java @@ -0,0 +1,29 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.encrypt.annotation.EncryptField; +import org.dromara.common.encrypt.enumd.AlgorithmType; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemoEncrypt extends TestDemo { + + /** + * key键 + */ + // @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==") + @EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB") + private String testKey; + + /** + * 值 + */ + // @EncryptField // 什么也不写走默认yml配置 + // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5") + @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5") + private String value; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java new file mode 100644 index 0000000..6cd3109 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestTree.java @@ -0,0 +1,66 @@ +package org.dromara.demo.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 测试树表对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_tree") +public class TestTree extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 父ID + */ + private Long parentId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 树节点名 + */ + private String treeName; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java new file mode 100644 index 0000000..2896f6c --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java @@ -0,0 +1,61 @@ +package org.dromara.demo.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.demo.domain.TestDemo; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestDemo.class, reverseConvertGenerate = false) +public class TestDemoBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long userId; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class}) + private Integer orderNum; + + /** + * key键 + */ + @NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class}) + private String testKey; + + /** + * 值 + */ + @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) + private String value; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java new file mode 100644 index 0000000..c066118 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java @@ -0,0 +1,53 @@ +package org.dromara.demo.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +public class TestDemoImportVo { + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空") + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空") + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空") + @ExcelProperty(value = "排序号") + private Long orderNum; + + /** + * key键 + */ + @NotBlank(message = "key键不能为空") + @ExcelProperty(value = "key键") + private String testKey; + + /** + * 值 + */ + @NotBlank(message = "值不能为空") + @ExcelProperty(value = "值") + private String value; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java new file mode 100644 index 0000000..a0a765a --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestTreeBo.java @@ -0,0 +1,54 @@ +package org.dromara.demo.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.demo.domain.TestTree; + +/** + * 测试树表业务对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TestTree.class, reverseConvertGenerate = false) +public class TestTreeBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 父ID + */ + private Long parentId; + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long deptId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long userId; + + /** + * 树节点名 + */ + @NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class}) + private String treeName; + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java new file mode 100644 index 0000000..cb7d83f --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.domain; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java new file mode 100644 index 0000000..95fa0d1 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java @@ -0,0 +1,118 @@ +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.annotation.ExcelEnumFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.excel.convert.ExcelEnumConvert; + +/** + * 带有下拉选的Excel导出 + * + * @author Emil.Zhang + */ +@Data +@ExcelIgnoreUnannotated +@AllArgsConstructor +@NoArgsConstructor +public class ExportDemoVo { + + private static final long serialVersionUID = 1L; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名", index = 0) + @NotEmpty(message = "用户名不能为空", groups = AddGroup.class) + private String nickName; + + /** + * 用户类型 + *

+ * 使用ExcelEnumFormat注解需要进行下拉选的部分 + */ + @ExcelProperty(value = "用户类型", index = 1, converter = ExcelEnumConvert.class) + @ExcelEnumFormat(enumClass = UserStatus.class, textField = "info") + @NotEmpty(message = "用户类型不能为空", groups = AddGroup.class) + private String userStatus; + + /** + * 性别 + *

+ * 使用ExcelDictFormat注解需要进行下拉选的部分 + */ + @ExcelProperty(value = "性别", index = 2, converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + @NotEmpty(message = "性别不能为空", groups = AddGroup.class) + private String gender; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号", index = 3) + @NotEmpty(message = "手机号不能为空", groups = AddGroup.class) + private String phoneNumber; + + /** + * Email + */ + @ExcelProperty(value = "Email", index = 4) + @NotEmpty(message = "Email不能为空", groups = AddGroup.class) + private String email; + + /** + * 省 + *

+ * 级联下拉,仅判断是否选了 + */ + @ExcelProperty(value = "省", index = 5) + @NotNull(message = "省不能为空", groups = AddGroup.class) + private String province; + + /** + * 数据库中的省ID + *

+ * 处理完毕后再判断是否市正确的值 + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer provinceId; + + /** + * 市 + *

+ * 级联下拉 + */ + @ExcelProperty(value = "市", index = 6) + @NotNull(message = "市不能为空", groups = AddGroup.class) + private String city; + + /** + * 数据库中的市ID + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer cityId; + + /** + * 县 + *

+ * 级联下拉 + */ + @ExcelProperty(value = "县", index = 7) + @NotNull(message = "县不能为空", groups = AddGroup.class) + private String area; + + /** + * 数据库中的县ID + */ + @NotNull(message = "请勿手动输入", groups = EditGroup.class) + private Integer areaId; +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java new file mode 100644 index 0000000..3eb072f --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -0,0 +1,89 @@ +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.demo.domain.TestDemo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 测试单表视图对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestDemo.class) +public class TestDemoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 排序号 + */ + @ExcelProperty(value = "排序号") + private Integer orderNum; + + /** + * key键 + */ + @ExcelProperty(value = "key键") + private String testKey; + + /** + * 值 + */ + @ExcelProperty(value = "值") + private String value; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String createBy; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updateTime; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private String updateBy; + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java new file mode 100644 index 0000000..aac6033 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java @@ -0,0 +1,64 @@ +package org.dromara.demo.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.demo.domain.TestTree; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 测试树表视图对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TestTree.class) +public class TestTreeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 父id + */ + @ExcelProperty(value = "父id") + private Long parentId; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 用户id + */ + @ExcelProperty(value = "用户id") + private Long userId; + + /** + * 树节点名 + */ + @ExcelProperty(value = "树节点名") + private String treeName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java new file mode 100644 index 0000000..c925b62 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java @@ -0,0 +1,7 @@ +package org.dromara.demo.esmapper; + +import org.dromara.demo.domain.Document; +import org.dromara.easyes.core.core.BaseEsMapper; + +public interface DocumentMapper extends BaseEsMapper { +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java new file mode 100644 index 0000000..7bd4e1e --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java @@ -0,0 +1,68 @@ +package org.dromara.demo.listener; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.excel.context.AnalysisContext; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.core.DefaultExcelListener; +import org.dromara.common.excel.core.DropDownOptions; +import org.dromara.demo.domain.vo.ExportDemoVo; + +import java.util.List; + +/** + * Excel带下拉框的解析处理器 + * + * @author Emil.Zhang + */ +public class ExportDemoListener extends DefaultExcelListener { + + public ExportDemoListener() { + // 显示使用构造函数,否则将导致空指针 + super(true); + } + + @Override + public void invoke(ExportDemoVo data, AnalysisContext context) { + // 先校验必填 + ValidatorUtils.validate(data, AddGroup.class); + + // 处理级联下拉的部分 + String province = data.getProvince(); + String city = data.getCity(); + String area = data.getArea(); + // 本行用户选择的省 + List thisRowSelectedProvinceOption = DropDownOptions.analyzeOptionValue(province); + if (thisRowSelectedProvinceOption.size() == 2) { + String provinceIdStr = thisRowSelectedProvinceOption.get(1); + if (NumberUtil.isNumber(provinceIdStr)) { + // 严格要求数据的话可以在这里做与数据库相关的判断 + // 例如判断省信息是否在数据库中存在等,建议结合RedisCache做缓存10s,减少数据库调用 + data.setProvinceId(Integer.parseInt(provinceIdStr)); + } + } + // 本行用户选择的市 + List thisRowSelectedCityOption = DropDownOptions.analyzeOptionValue(city); + if (thisRowSelectedCityOption.size() == 2) { + String cityIdStr = thisRowSelectedCityOption.get(1); + if (NumberUtil.isNumber(cityIdStr)) { + data.setCityId(Integer.parseInt(cityIdStr)); + } + } + // 本行用户选择的县 + List thisRowSelectedAreaOption = DropDownOptions.analyzeOptionValue(area); + if (thisRowSelectedAreaOption.size() == 2) { + String areaIdStr = thisRowSelectedAreaOption.get(1); + if (NumberUtil.isNumber(areaIdStr)) { + data.setAreaId(Integer.parseInt(areaIdStr)); + } + } + + // 处理完毕以后判断是否符合规则 + ValidatorUtils.validate(data, EditGroup.class); + + // 添加到处理结果中 + getExcelResult().getList().add(data); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java new file mode 100644 index 0000000..0082677 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderItemMapper.java @@ -0,0 +1,14 @@ +package org.dromara.demo.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.demo.domain.ShardingOrderItem; + +@Mapper +@DS("sharding") +public interface ShardingOrderItemMapper extends BaseMapper { + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java new file mode 100644 index 0000000..58d3525 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/ShardingOrderMapper.java @@ -0,0 +1,15 @@ +package org.dromara.demo.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.demo.domain.ShardingOrder; + + +@Mapper +@DS("sharding") +public interface ShardingOrderMapper extends BaseMapper { + + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java new file mode 100644 index 0000000..601f97a --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java @@ -0,0 +1,13 @@ +package org.dromara.demo.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestDemoEncrypt; + +/** + * 测试加密功能 + * + * @author Lion Li + */ +public interface TestDemoEncryptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java new file mode 100644 index 0000000..08d2e0d --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -0,0 +1,59 @@ +package org.dromara.demo.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 测试单表Mapper接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface TestDemoMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + Page customPageList(@Param("page") Page page, @Param("ew") Wrapper wrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectList(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) TestDemo entity); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int deleteBatchIds(@Param(Constants.COLL) Collection idList); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java new file mode 100644 index 0000000..e5f4c44 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java @@ -0,0 +1,21 @@ +package org.dromara.demo.mapper; + +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.demo.domain.TestTree; +import org.dromara.demo.domain.vo.TestTreeVo; + +/** + * 测试树表Mapper接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +@DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") +}) +public interface TestTreeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java new file mode 100644 index 0000000..ff1c4df --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.mapper; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java new file mode 100644 index 0000000..4dfa5ef --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/IExportExcelService.java @@ -0,0 +1,18 @@ +package org.dromara.demo.service; + +import jakarta.servlet.http.HttpServletResponse; + +/** + * 导出下拉框Excel示例 + * + * @author Emil.Zhang + */ +public interface IExportExcelService { + + /** + * 导出下拉框 + * + * @param response / + */ + void exportWithOptions(HttpServletResponse response); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java new file mode 100644 index 0000000..bca4192 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestDemoService.java @@ -0,0 +1,71 @@ +package org.dromara.demo.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.vo.TestDemoVo; + +import java.util.Collection; +import java.util.List; + +/** + * 测试单表Service接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface ITestDemoService { + + /** + * 查询单个 + * + * @return + */ + TestDemoVo queryById(Long id); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); + + /** + * 自定义分页查询 + */ + TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); + + /** + * 查询列表 + */ + List queryList(TestDemoBo bo); + + /** + * 根据新增业务对象插入测试单表 + * + * @param bo 测试单表新增业务对象 + * @return + */ + Boolean insertByBo(TestDemoBo bo); + + /** + * 根据编辑业务对象修改测试单表 + * + * @param bo 测试单表编辑业务对象 + * @return + */ + Boolean updateByBo(TestDemoBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量保存 + */ + Boolean saveBatch(List list); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java new file mode 100644 index 0000000..9155201 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestTreeService.java @@ -0,0 +1,52 @@ +package org.dromara.demo.service; + +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; + +import java.util.Collection; +import java.util.List; + +/** + * 测试树表Service接口 + * + * @author Lion Li + * @date 2021-07-26 + */ +public interface ITestTreeService { + /** + * 查询单个 + * + * @return + */ + TestTreeVo queryById(Long id); + + /** + * 查询列表 + */ + List queryList(TestTreeBo bo); + + /** + * 根据新增业务对象插入测试树表 + * + * @param bo 测试树表新增业务对象 + * @return + */ + Boolean insertByBo(TestTreeBo bo); + + /** + * 根据编辑业务对象修改测试树表 + * + * @param bo 测试树表编辑业务对象 + * @return + */ + Boolean updateByBo(TestTreeBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java new file mode 100644 index 0000000..0240e02 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java @@ -0,0 +1,222 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.excel.core.DropDownOptions; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.demo.domain.vo.ExportDemoVo; +import org.dromara.demo.service.IExportExcelService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 导出下拉框Excel示例 + * + * @author Emil.Zhang + */ +@Service +@RequiredArgsConstructor +public class ExportExcelServiceImpl implements IExportExcelService { + + @Override + public void exportWithOptions(HttpServletResponse response) { + // 创建表格数据,业务中一般通过数据库查询 + List excelDataList = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + // 模拟数据库中的一条数据 + ExportDemoVo everyRowData = new ExportDemoVo(); + everyRowData.setNickName("用户-" + i); + everyRowData.setUserStatus(UserStatus.OK.getCode()); + everyRowData.setGender("1"); + everyRowData.setPhoneNumber(String.format("175%08d", i)); + everyRowData.setEmail(String.format("175%08d", i) + "@163.com"); + everyRowData.setProvinceId(i); + everyRowData.setCityId(i); + everyRowData.setAreaId(i); + excelDataList.add(everyRowData); + } + + // 通过@ExcelIgnoreUnannotated配合@ExcelProperty合理显示需要的列 + // 并通过@DropDown注解指定下拉值,或者通过创建ExcelOptions来指定下拉框 + // 使用ExcelOptions时建议指定列index,防止出现下拉列解析不对齐 + + // 首先从数据库中查询下拉框内的可选项 + // 这里模拟查询结果 + List provinceList = getProvinceList(), + cityList = getCityList(provinceList), + areaList = getAreaList(cityList); + int provinceIndex = 5, cityIndex = 6, areaIndex = 7; + + DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions( + provinceList, + provinceIndex, + cityList, + cityIndex, + DemoCityData::getId, + DemoCityData::getPid, + everyOptions -> DropDownOptions.createOptionValue( + everyOptions.getName(), + everyOptions.getId() + ) + ); + + DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions( + cityList, + cityIndex, + areaList, + areaIndex, + DemoCityData::getId, + DemoCityData::getPid, + everyOptions -> DropDownOptions.createOptionValue( + everyOptions.getName(), + everyOptions.getId() + ) + ); + + // 把所有的下拉框存储 + List options = new ArrayList<>(); + options.add(provinceToCity); + options.add(cityToArea); + + // 到此为止所有的下拉框可选项已全部配置完毕 + + // 接下来需要将Excel中的展示数据转换为对应的下拉选 + List outList = StreamUtils.toList(excelDataList, everyRowData -> { + // 只需要处理没有使用@ExcelDictFormat注解的下拉框 + // 一般来说,可以直接在数据库查询即查询出省市县信息,这里通过模拟操作赋值 + everyRowData.setProvince(buildOptions(provinceList, everyRowData.getProvinceId())); + everyRowData.setCity(buildOptions(cityList, everyRowData.getCityId())); + everyRowData.setArea(buildOptions(areaList, everyRowData.getAreaId())); + return everyRowData; + }); + + ExcelUtil.exportExcel(outList, "下拉框示例", ExportDemoVo.class, response, options); + } + + private String buildOptions(List cityDataList, Integer id) { + Map> groupByIdMap = + cityDataList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); + if (groupByIdMap.containsKey(id)) { + DemoCityData demoCityData = groupByIdMap.get(id).get(0); + return DropDownOptions.createOptionValue(demoCityData.getName(), demoCityData.getId()); + } else { + return StrUtil.EMPTY; + } + } + + /** + * 模拟查询数据库操作 + * + * @return / + */ + private List getProvinceList() { + List provinceList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + provinceList.add(new DemoCityData(0, null, "安徽省")); + provinceList.add(new DemoCityData(1, null, "江苏省")); + + return provinceList; + } + + /** + * 模拟查找数据库操作,需要连带查询出省的数据 + * + * @param provinceList 模拟的父省数据 + * @return / + */ + private List getCityList(List provinceList) { + List cityList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + cityList.add(new DemoCityData(0, 0, "合肥市")); + cityList.add(new DemoCityData(1, 0, "芜湖市")); + cityList.add(new DemoCityData(2, 1, "南京市")); + cityList.add(new DemoCityData(3, 1, "无锡市")); + cityList.add(new DemoCityData(4, 1, "徐州市")); + + selectParentData(provinceList, cityList); + + return cityList; + } + + /** + * 模拟查找数据库操作,需要连带查询出市的数据 + * + * @param cityList 模拟的父市数据 + * @return / + */ + private List getAreaList(List cityList) { + List areaList = new ArrayList<>(); + + // 实际业务中一般采用数据库读取的形式,这里直接拼接创建 + areaList.add(new DemoCityData(0, 0, "瑶海区")); + areaList.add(new DemoCityData(1, 0, "庐江区")); + areaList.add(new DemoCityData(2, 1, "南宁县")); + areaList.add(new DemoCityData(3, 1, "镜湖区")); + areaList.add(new DemoCityData(4, 2, "玄武区")); + areaList.add(new DemoCityData(5, 2, "秦淮区")); + areaList.add(new DemoCityData(6, 3, "宜兴市")); + areaList.add(new DemoCityData(7, 3, "新吴区")); + areaList.add(new DemoCityData(8, 4, "鼓楼区")); + areaList.add(new DemoCityData(9, 4, "丰县")); + + selectParentData(cityList, areaList); + + return areaList; + } + + /** + * 模拟数据库的查询父数据操作 + * + * @param parentList / + * @param sonList / + */ + private void selectParentData(List parentList, List sonList) { + Map> parentGroupByIdMap = + parentList.stream().collect(Collectors.groupingBy(DemoCityData::getId)); + + sonList.forEach(everySon -> { + if (parentGroupByIdMap.containsKey(everySon.getPid())) { + everySon.setPData(parentGroupByIdMap.get(everySon.getPid()).get(0)); + } + }); + } + + /** + * 模拟的数据库省市县 + */ + @Data + private static class DemoCityData { + /** + * 数据库id字段 + */ + private Integer id; + /** + * 数据库pid字段 + */ + private Integer pid; + /** + * 数据库name字段 + */ + private String name; + /** + * MyBatisPlus连带查询父数据 + */ + private DemoCityData pData; + + public DemoCityData(Integer id, Integer pid, String name) { + this.id = id; + this.pid = pid; + this.name = name; + } + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java new file mode 100644 index 0000000..01cc1a6 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/SensitiveServiceImpl.java @@ -0,0 +1,46 @@ +package org.dromara.demo.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + */ +@Service +public class SensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotBlank(roleKey); + boolean permsExist = StringUtils.isNotBlank(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java new file mode 100644 index 0000000..afc99c7 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.demo.domain.TestDemo; +import org.dromara.demo.domain.bo.TestDemoBo; +import org.dromara.demo.domain.vo.TestDemoVo; +import org.dromara.demo.mapper.TestDemoMapper; +import org.dromara.demo.service.ITestDemoService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 测试单表Service业务层处理 + * + * @author Lion Li + * @date 2021-07-26 + */ +@RequiredArgsConstructor +@Service +public class TestDemoServiceImpl implements ITestDemoService { + + private final TestDemoMapper baseMapper; + + @Override + public TestDemoVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 自定义分页查询 + */ + @Override + public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(TestDemoBo bo) { + return baseMapper.selectVoList(buildQueryWrapper(bo)); + } + + private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); + lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByAsc(TestDemo::getId); + return lqw; + } + + @Override + public Boolean insertByBo(TestDemoBo bo) { + TestDemo add = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + public Boolean updateByBo(TestDemoBo bo) { + TestDemo update = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestDemo entity) { + //TODO 做一些数据校验,如唯一约束 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean saveBatch(List list) { + return baseMapper.insertBatch(list); + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java new file mode 100644 index 0000000..138e19b --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java @@ -0,0 +1,88 @@ +package org.dromara.demo.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.demo.domain.TestTree; +import org.dromara.demo.domain.bo.TestTreeBo; +import org.dromara.demo.domain.vo.TestTreeVo; +import org.dromara.demo.mapper.TestTreeMapper; +import org.dromara.demo.service.ITestTreeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 测试树表Service业务层处理 + * + * @author Lion Li + * @date 2021-07-26 + */ +// @DS("slave") // 切换从库查询 +@RequiredArgsConstructor +@Service +public class TestTreeServiceImpl implements ITestTreeService { + + private final TestTreeMapper baseMapper; + + @Override + public TestTreeVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + // @DS("slave") // 切换从库查询 + @Override + public List queryList(TestTreeBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.orderByAsc(TestTree::getId); + return lqw; + } + + @Override + public Boolean insertByBo(TestTreeBo bo) { + TestTree add = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + public Boolean updateByBo(TestTreeBo bo) { + TestTree update = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestTree entity) { + //TODO 做一些数据校验,如唯一约束 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java new file mode 100644 index 0000000..7011984 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.service.impl; diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java new file mode 100644 index 0000000..16727ff --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/package-info.java @@ -0,0 +1 @@ +package org.dromara.demo.service; diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml new file mode 100644 index 0000000..00185d9 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml @@ -0,0 +1,118 @@ +# Tomcat +server: + port: 9401 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-demo + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:ruoyi-resource.yml + - optional:nacos:datasource.yml + +--- # 数据源设置 需在 system 数据源下 执行 test.sql 文件 +spring: + datasource: + dynamic: + seata: false + # 设置默认的数据源或者数据源组,默认值即为 master + primary: master + datasource: + # 主库数据源 + master: + type: ${spring.datasource.type} + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${datasource.system-master.url} + username: ${datasource.system-master.username} + password: ${datasource.system-master.password} + sharding: + lazy: true + type: ${spring.datasource.type} + driver-class-name: com.mysql.cj.jdbc.Driver + # shardingproxy 服务的ip地址 + url: jdbc:mysql://127.0.0.1:3307/data-center_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true + username: root + password: root +# oracle: +# type: ${spring.datasource.type} +# driverClassName: oracle.jdbc.OracleDriver +# url: ${datasource.system-oracle.url} +# username: ${datasource.system-oracle.username} +# password: ${datasource.system-oracle.password} +# hikari: +# connectionTestQuery: SELECT 1 FROM DUAL +# postgres: +# type: ${spring.datasource.type} +# driverClassName: org.postgresql.Driver +# url: ${datasource.system-postgres.url} +# username: ${datasource.system-postgres.username} +# password: ${datasource.system-postgres.password} + +--- # elasticsearch 功能配置 +# 文档地址: https://www.easy-es.cn/ +# 更改包名需要去 EasyEsConfiguration 修改包扫描(后续版本支持配置文件读取) +easy-es: + # 是否开启EE自动配置 + enable: false + # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开 + address : localhost:9200 + # 默认为http + schema: http + # 注意ES建议使用账号认证 不使用会报警告日志 + #如果无账号密码则可不配置此行 + #username: + #如果无账号密码则可不配置此行 + #password: + # 心跳策略时间 单位:ms + keep-alive-millis: 18000 + # 连接超时时间 单位:ms + connectTimeout: 5000 + # 通信超时时间 单位:ms + socketTimeout: 5000 + # 连接请求超时时间 单位:ms + connectionRequestTimeout: 5000 + # 最大连接数 单位:个 + maxConnTotal: 100 + # 最大连接路由数 单位:个 + maxConnPerRoute: 100 + global-config: + # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能 + print-dsl: true + # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快 + asyncProcessIndexBlocking: true + db-config: + # 是否开启下划线转驼峰 默认为false + map-underscore-to-camel-case: true + # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成 + id-type: customize + # 字段更新策略 默认为not_null + field-strategy: not_null + # 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响. + enable-track-total-hits: true + # 数据刷新策略,默认为不刷新 + refresh-policy: immediate diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt b/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt new file mode 100644 index 0000000..1514deb --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ __| | ___ _ __ ___ ___ +| '__| | | |/ _ \| | | | |______/ _` |/ _ \ '_ ` _ \ / _ \ +| | | |_| | (_) | |_| | | | (_| | __/ | | | | | (_) | +|_| \__,_|\___/ \__, |_| \__,_|\___|_| |_| |_|\___/ + __/ | + |___/ diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx b/ruoyi-example/ruoyi-demo/src/main/resources/excel/单列表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f7347d652c06ae29eca9fa6cd1055ec6ae6c6e3 GIT binary patch literal 10787 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 GzyAY;y@`_m literal 0 HcmV?d00001 diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml b/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..ec6586f --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/logback-plus.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml new file mode 100644 index 0000000..aeed502 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderItemMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml new file mode 100644 index 0000000..420912e --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/ShardingOrderMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml new file mode 100644 index 0000000..9b722d1 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml new file mode 100644 index 0000000..f34a565 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties b/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java new file mode 100644 index 0000000..40c6ab3 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/AssertUnitTest.java @@ -0,0 +1,45 @@ +package org.dromara.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * 断言单元测试案例 + * + * @author Lion Li + */ +@DisplayName("断言单元测试案例") +public class AssertUnitTest { + + @DisplayName("测试 assertEquals 方法") + @Test + public void testAssertEquals() { + Assertions.assertEquals("666", new String("666")); + Assertions.assertNotEquals("666", new String("666")); + } + + @DisplayName("测试 assertSame 方法") + @Test + public void testAssertSame() { + Object obj = new Object(); + Object obj1 = obj; + Assertions.assertSame(obj, obj1); + Assertions.assertNotSame(obj, obj1); + } + + @DisplayName("测试 assertTrue 方法") + @Test + public void testAssertTrue() { + Assertions.assertTrue(true); + Assertions.assertFalse(true); + } + + @DisplayName("测试 assertNull 方法") + @Test + public void testAssertNull() { + Assertions.assertNull(null); + Assertions.assertNotNull(null); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java new file mode 100644 index 0000000..a3e96dd --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/DemoUnitTest.java @@ -0,0 +1,69 @@ +package org.dromara.demo; + +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.TimeUnit; + +/** + * 单元测试案例 + * + * @author Lion Li + */ +@SpringBootTest // 此注解只能在 springboot 主包下使用 需包含 main 方法与 yml 配置文件 +@DisplayName("单元测试案例") +public class DemoUnitTest { + + @Value("${spring.application.name}") + private String appName; + + @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解") + @Test + public void testTest() { + System.out.println(appName); + } + + @Disabled + @DisplayName("测试 @Disabled 注解") + @Test + public void testDisabled() { + System.out.println(appName); + } + + @Timeout(value = 2L, unit = TimeUnit.SECONDS) + @DisplayName("测试 @Timeout 注解") + @Test + public void testTimeout() throws InterruptedException { + Thread.sleep(3000); + System.out.println(appName); + } + + + @DisplayName("测试 @RepeatedTest 注解") + @RepeatedTest(3) + public void testRepeatedTest() { + System.out.println(666); + } + + @BeforeAll + public static void testBeforeAll() { + System.out.println("@BeforeAll =================="); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + @AfterAll + public static void testAfterAll() { + System.out.println("@AfterAll =================="); + } + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java new file mode 100644 index 0000000..ce56d53 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/ParamUnitTest.java @@ -0,0 +1,72 @@ +package org.dromara.demo; + +import org.dromara.common.core.enums.UserType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * 带参数单元测试案例 + * + * @author Lion Li + */ +@DisplayName("带参数单元测试案例") +public class ParamUnitTest { + + @DisplayName("测试 @ValueSource 注解") + @ParameterizedTest + @ValueSource(strings = {"t1", "t2", "t3"}) + public void testValueSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @NullSource 注解") + @ParameterizedTest + @NullSource + public void testNullSource(String str) { + System.out.println(str); + } + + @DisplayName("测试 @EnumSource 注解") + @ParameterizedTest + @EnumSource(UserType.class) + public void testEnumSource(UserType type) { + System.out.println(type.getUserType()); + } + + @DisplayName("测试 @MethodSource 注解") + @ParameterizedTest + @MethodSource("getParam") + public void testMethodSource(String str) { + System.out.println(str); + } + + public static Stream getParam() { + List list = new ArrayList<>(); + list.add("t1"); + list.add("t2"); + list.add("t3"); + return list.stream(); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java new file mode 100644 index 0000000..300057d --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TOrderTest.java @@ -0,0 +1,49 @@ +package org.dromara.demo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import org.dromara.demo.domain.ShardingOrder; +import org.dromara.demo.mapper.ShardingOrderMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TOrderTest { + + @Autowired + ShardingOrderMapper torderMapper; + + + @Test + void find() { + //Order order = orderMapper.selectById(1640990702722723841L); + } + + @Test + void page() { + Page page = new Page<>(); + page.setCurrent(3L); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByAsc("order_id"); + torderMapper.selectPage(page,queryWrapper); + System.out.println(page.getTotal()); + for(ShardingOrder order : page.getRecords()){ + System.out.print(order.getTotalMoney()+" "); + } + } + + @Test + void insert() { + for(Long i = 1L; i <= 100L; i++){ + ShardingOrder torder = new ShardingOrder(); + torder.setUserId(i); + torder.setTotalMoney(100 + Integer.parseInt(i+"")); + torderMapper.insert(torder); + } + + } + + +} diff --git a/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java new file mode 100644 index 0000000..6d8c416 --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/test/java/org/dromara/demo/TagUnitTest.java @@ -0,0 +1,54 @@ +package org.dromara.demo; + +import org.junit.jupiter.api.*; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * 标签单元测试案例 + * + * @author Lion Li + */ +@SpringBootTest +@DisplayName("标签单元测试案例") +public class TagUnitTest { + + @Tag("dev") + @DisplayName("测试 @Tag dev") + @Test + public void testTagDev() { + System.out.println("dev"); + } + + @Tag("prod") + @DisplayName("测试 @Tag prod") + @Test + public void testTagProd() { + System.out.println("prod"); + } + + @Tag("local") + @DisplayName("测试 @Tag local") + @Test + public void testTagLocal() { + System.out.println("local"); + } + + @Tag("exclude") + @DisplayName("测试 @Tag exclude") + @Test + public void testTagExclude() { + System.out.println("exclude"); + } + + @BeforeEach + public void testBeforeEach() { + System.out.println("@BeforeEach =================="); + } + + @AfterEach + public void testAfterEach() { + System.out.println("@AfterEach =================="); + } + + +} diff --git a/ruoyi-example/ruoyi-stream-mq/pom.xml b/ruoyi-example/ruoyi-stream-mq/pom.xml new file mode 100644 index 0000000..5b3343e --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/pom.xml @@ -0,0 +1,98 @@ + + + + org.dromara + ruoyi-example + ${revision} + + 4.0.0 + + ruoyi-stream-mq + + + ruoyi-stream-mq SpringCloud-Stream-MQ 案例项目 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + + com.alibaba.cloud + spring-cloud-starter-stream-rocketmq + + + + org.springframework.cloud + spring-cloud-starter-stream-kafka + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java new file mode 100644 index 0000000..2c46467 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/RuoYiStreamMqApplication.java @@ -0,0 +1,22 @@ +package org.dromara.stream; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * SpringCloud-Stream-MQ 案例项目 + * + * @author Lion Li + */ +@SpringBootApplication +public class RuoYiStreamMqApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiStreamMqApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ MQ案例模块启动成功 ლ(´ڡ`ლ)゙ "); + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java new file mode 100644 index 0000000..bbfee28 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/controller/TestMqController.java @@ -0,0 +1,60 @@ +package org.dromara.stream.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.stream.mq.producer.DelayProducer; +import org.dromara.stream.mq.producer.LogStreamProducer; +import org.dromara.stream.mq.producer.TestStreamProducer; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试mq + */ +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/test-mq") +public class TestMqController { + + private final DelayProducer delayProducer; + private final TestStreamProducer testStreamProducer; + private final LogStreamProducer logStreamProducer; + + /** + * 发送消息Rabbitmq + * + * @param msg 消息内容 + * @param delay 延时时间 + */ + @GetMapping("/sendRabbitmq") + public R sendRabbitmq(String msg, Long delay) { + delayProducer.sendMsg(msg, delay); + return R.ok(); + } + + /** + * 发送消息Rocketmq + * + * @param msg 消息内容 + */ + @GetMapping("/sendRocketmq") + public R sendRocketmq(String msg) { + testStreamProducer.streamTestMsg(msg); + return R.ok(); + } + + /** + * 发送消息Kafka + * + * @param msg 消息内容 + */ + @GetMapping("/sendKafka") + public R sendKafka(String msg) { + logStreamProducer.streamLogMsg(msg); + return R.ok(); + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java new file mode 100644 index 0000000..9759bee --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/TestMessaging.java @@ -0,0 +1,20 @@ +package org.dromara.stream.mq; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * @author Lion Li + */ +@Data +@Accessors(chain = true) +public class TestMessaging { + /** + * 消息id + */ + private String msgId; + /** + * 消息内容 + */ + private String msgText; +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java new file mode 100644 index 0000000..6045286 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/DelayConsumer.java @@ -0,0 +1,22 @@ +package org.dromara.stream.mq.consumer; + + +import org.dromara.stream.mq.TestMessaging; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + +@Slf4j +@Component +public class DelayConsumer { + + @Bean + Consumer delay() { + log.info("初始化订阅"); + return obj -> { + log.info("消息接收成功:" + obj); + }; + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java new file mode 100644 index 0000000..b6fed99 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/LogStreamConsumer.java @@ -0,0 +1,23 @@ +package org.dromara.stream.mq.consumer; + +import org.dromara.stream.mq.TestMessaging; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + +@Slf4j +@Component +public class LogStreamConsumer { + + @Bean + Consumer log() { + log.info("初始化订阅log"); + return msg -> { + System.out.println(msg.toString()); + log.info("通过stream消费到消息 => {}", msg.toString()); + }; + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java new file mode 100644 index 0000000..b881c01 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/consumer/TestStreamConsumer.java @@ -0,0 +1,23 @@ +package org.dromara.stream.mq.consumer; + +import org.dromara.stream.mq.TestMessaging; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.function.Consumer; + +@Slf4j +@Component +public class TestStreamConsumer { + + @Bean + Consumer demo() { + log.info("初始化订阅rocketmq"); + return msg -> { + System.out.println("================="); + log.info("通过stream消费到消息 => {}", msg.toString()); + }; + } + +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java new file mode 100644 index 0000000..b879d91 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/DelayProducer.java @@ -0,0 +1,27 @@ +package org.dromara.stream.mq.producer; + +import org.dromara.stream.mq.TestMessaging; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class DelayProducer { + + @Autowired + private StreamBridge streamBridge; + + public void sendMsg(String msg, Long delay) { + // 构建消息对象 + TestMessaging testMessaging = new TestMessaging() + .setMsgId(UUID.randomUUID().toString()) + .setMsgText(msg); + Message message = MessageBuilder.withPayload(testMessaging) + .setHeader("x-delay", delay).build(); + streamBridge.send("delay-out-0", message); + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java new file mode 100644 index 0000000..bff3924 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/LogStreamProducer.java @@ -0,0 +1,24 @@ +package org.dromara.stream.mq.producer; + +import org.dromara.stream.mq.TestMessaging; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class LogStreamProducer { + + @Autowired + private StreamBridge streamBridge; + + public void streamLogMsg(String msg) { + // 构建消息对象 + TestMessaging testMessaging = new TestMessaging() + .setMsgId(UUID.randomUUID().toString()) + .setMsgText(msg); + streamBridge.send("log-out-0", MessageBuilder.withPayload(testMessaging).build()); + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java new file mode 100644 index 0000000..839ae49 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/java/org/dromara/stream/mq/producer/TestStreamProducer.java @@ -0,0 +1,26 @@ +package org.dromara.stream.mq.producer; + +import org.dromara.stream.mq.TestMessaging; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class TestStreamProducer { + + @Autowired + private StreamBridge streamBridge; + + public void streamTestMsg(String msg) { + // 构建消息对象 + TestMessaging testMessaging = new TestMessaging() + .setMsgId( UUID.randomUUID().toString()) + .setMsgText(msg); + + System.out.println(testMessaging); + streamBridge.send("demo-out-0", MessageBuilder.withPayload(testMessaging).build()); + } +} diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml b/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml new file mode 100644 index 0000000..41e7d3a --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/application.yml @@ -0,0 +1,112 @@ +server: + port: 9402 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-stream-mq + profiles: + # 环境配置 + active: @profiles.active@ + cloud: + function: + # 重点配置 与 binding 名与消费者对应 + definition: delay;demo;log + +--- # rabbitmq 配置 +spring: + rabbitmq: + host: localhost + port: 5672 + username: root + password: root + cloud: + stream: + rabbit: + bindings: + delay-in-0: + consumer: + delayedExchange: true + delay-out-0: + producer: + delayedExchange: true + bindings: + delay-in-0: + destination: delay.exchange.cloud + content-type: application/json + group: delay-group + binder: rabbit + delay-out-0: + destination: delay.exchange.cloud + content-type: application/json + group: delay-group + binder: rabbit + +--- # rocketmq 配置 +spring: + cloud: + stream: + rocketmq: + binder: + # rocketmq 地址 + name-server: 192.168.32.213:9876 + bindings: + demo-out-0: + producer: + # 必须得写 + group: default + bindings: + demo-out-0: + content-type: application/json + destination: stream-test-topic + group: test-group + binder: rocketmq + + demo-in-0: + content-type: application/json + destination: stream-test-topic + group: test-group + binder: rocketmq + + +--- # kafka 配置 +spring: + cloud: + stream: + kafka: + binder: + brokers: localhost:9092 + bindings: + log-out-0: + destination: stream-log-topic + contentType: application/json + group: log_group + binder: kafka + log-in-0: + destination: stream-log-topic + contentType: application/json + group: log_group + binder: kafka + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt b/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt new file mode 100644 index 0000000..8a8054c --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___| |_ _ __ ___ __ _ _ __ ___ ______ _ __ ___ __ _ +| '__| | | |/ _ \| | | | |______/ __| __| '__/ _ \/ _` | '_ ` _ \______| '_ ` _ \ / _` | +| | | |_| | (_) | |_| | | \__ \ |_| | | __/ (_| | | | | | | | | | | | | (_| | +|_| \__,_|\___/ \__, |_| |___/\__|_| \___|\__,_|_| |_| |_| |_| |_| |_|\__, | + __/ | | | + |___/ |_| diff --git a/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml b/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..0507560 --- /dev/null +++ b/ruoyi-example/ruoyi-stream-mq/src/main/resources/logback-plus.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + diff --git a/ruoyi-gateway/Dockerfile b/ruoyi-gateway/Dockerfile new file mode 100644 index 0000000..35bf497 --- /dev/null +++ b/ruoyi-gateway/Dockerfile @@ -0,0 +1,22 @@ + #FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/gateway/logs \ + /ruoyi/gateway/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/gateway + +ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-gateway.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-gateway \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} diff --git a/ruoyi-gateway/pom.xml b/ruoyi-gateway/pom.xml new file mode 100644 index 0000000..95945bd --- /dev/null +++ b/ruoyi-gateway/pom.xml @@ -0,0 +1,154 @@ + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + ruoyi-gateway + + + ruoyi-gateway网关模块 + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + com.github.ben-manes.caffeine + caffeine + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.cloud + spring-cloud-loadbalancer + + + + cn.hutool + hutool-http + + + + + cn.dev33 + sa-token-reactor-spring-boot3-starter + ${satoken.version} + + + + org.dromara + ruoyi-common-sentinel + + + com.alibaba.csp + sentinel-apache-dubbo3-adapter + + + + + + org.dromara + ruoyi-common-satoken + + + + + org.dromara + ruoyi-common-redis + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + + + org.dromara + ruoyi-common-loadbalancer + + + + + + + + + + + + + + + + + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java new file mode 100644 index 0000000..877d6f5 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/RuoYiGatewayApplication.java @@ -0,0 +1,25 @@ +package org.dromara.gateway; + +import cn.hutool.crypto.SecureUtil; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 网关启动程序 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiGatewayApplication { + public static void main(String[] args) { + // 标记 sentinel 类型为 网关 + System.setProperty("csp.sentinel.app.type", "1"); + SpringApplication application = new SpringApplication(RuoYiGatewayApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 网关启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java new file mode 100644 index 0000000..d3b40dd --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/GatewayConfig.java @@ -0,0 +1,21 @@ +package org.dromara.gateway.config; + +import org.dromara.gateway.handler.SentinelFallbackHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; + +/** + * 网关限流配置 + * + * @author ruoyi + */ +@Configuration +public class GatewayConfig { + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SentinelFallbackHandler sentinelGatewayExceptionHandler() { + return new SentinelFallbackHandler(); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java new file mode 100644 index 0000000..c038bd4 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/ApiDecryptProperties.java @@ -0,0 +1,28 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +/** + * api解密属性配置类 + * @author wdhcr + */ +@Data +@Component +@RefreshScope +@ConfigurationProperties(prefix = "api-decrypt") +public class ApiDecryptProperties { + + /** + * 加密开关 + */ + private Boolean enabled; + + /** + * 头部标识 + */ + private String headerFlag; + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java new file mode 100644 index 0000000..5996030 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/CustomGatewayProperties.java @@ -0,0 +1,24 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 自定义gateway参数配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "spring.cloud.gateway") +public class CustomGatewayProperties { + + /** + * 请求日志 + */ + private Boolean requestLog; + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java new file mode 100644 index 0000000..bf27ed6 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/IgnoreWhiteProperties.java @@ -0,0 +1,29 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * 放行白名单配置 + * + * @author ruoyi + */ +@Data +@NoArgsConstructor +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.ignore") +public class IgnoreWhiteProperties { + /** + * 放行白名单配置,网关不校验此处的白名单 + */ + private List whites = new ArrayList<>(); + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java new file mode 100644 index 0000000..d75b024 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/config/properties/XssProperties.java @@ -0,0 +1,31 @@ +package org.dromara.gateway.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * XSS跨站脚本配置 + * + * @author ruoyi + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "security.xss") +public class XssProperties { + /** + * Xss开关 + */ + private Boolean enabled; + + /** + * 排除路径 + */ + private List excludeUrls = new ArrayList<>(); + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java new file mode 100644 index 0000000..88c61d2 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/AuthFilter.java @@ -0,0 +1,69 @@ +package org.dromara.gateway.filter; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.reactor.context.SaReactorSyncHolder; +import cn.dev33.satoken.reactor.filter.SaReactorFilter; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.gateway.config.properties.IgnoreWhiteProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.server.reactive.ServerHttpRequest; + +/** + * [Sa-Token 权限认证] 拦截器 + * + * @author Lion Li + */ +@Configuration +public class AuthFilter { + + /** + * 注册 Sa-Token 全局过滤器 + */ + @Bean + public SaReactorFilter getSaReactorFilter(IgnoreWhiteProperties ignoreWhite) { + return new SaReactorFilter() + // 拦截地址 + .addInclude("/**") + .addExclude("/favicon.ico", "/actuator/**") + // 鉴权方法:每次访问进入 + .setAuth(obj -> { + // 登录校验 -- 拦截所有路由 + SaRouter.match("/**") + .notMatch(ignoreWhite.getWhites()) + .check(r -> { + // 检查是否登录 是否有token + StpUtil.checkLogin(); + + // 检查 header 与 param 里的 clientid 与 token 里的是否一致 + ServerHttpRequest request = SaReactorSyncHolder.getContext().getRequest(); + String headerCid = request.getHeaders().getFirst(LoginHelper.CLIENT_KEY); + String paramCid = request.getQueryParams().getFirst(LoginHelper.CLIENT_KEY); + String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); + if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { + // token 无效 + throw NotLoginException.newInstance(StpUtil.getLoginType(), + "-100", "客户端ID与Token不匹配", + StpUtil.getTokenValue()); + } + + // 有效率影响 用于临时测试 + // if (log.isDebugEnabled()) { + // log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout()); + // log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); + // } + }); + }).setError(e -> { + e.printStackTrace(); + if (e instanceof NotLoginException) { + return SaResult.error(e.getMessage()).setCode(HttpStatus.UNAUTHORIZED); + } + return SaResult.error("认证失败,无法访问系统资源").setCode(HttpStatus.UNAUTHORIZED); + }); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java new file mode 100644 index 0000000..177e93c --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/BlackListUrlFilter.java @@ -0,0 +1,58 @@ +package org.dromara.gateway.filter; + +import org.dromara.gateway.utils.WebFluxUtils; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * 黑名单过滤器 + * + * @author ruoyi + */ +@Component +public class BlackListUrlFilter extends AbstractGatewayFilterFactory { + @Override + public GatewayFilter apply(Config config) { + return (exchange, chain) -> { + + String url = exchange.getRequest().getURI().getPath(); + if (config.matchBlacklist(url)) { + return WebFluxUtils.webFluxResponseWriter(exchange.getResponse(), "请求地址不允许访问"); + } + + return chain.filter(exchange); + }; + } + + public BlackListUrlFilter() { + super(Config.class); + } + + public static class Config { + private List blacklistUrl; + + private List blacklistUrlPattern = new ArrayList<>(); + + public boolean matchBlacklist(String url) { + return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find()); + } + + public List getBlacklistUrl() { + return blacklistUrl; + } + + public void setBlacklistUrl(List blacklistUrl) { + this.blacklistUrl = blacklistUrl; + this.blacklistUrlPattern.clear(); + this.blacklistUrl.forEach(url -> { + this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE)); + }); + } + } + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java new file mode 100644 index 0000000..fe0348b --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/ForwardAuthFilter.java @@ -0,0 +1,41 @@ +package org.dromara.gateway.filter; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.same.SaSameUtil; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 转发认证过滤器(内部服务外网隔离) + * + * @author Lion Li + */ +@Component +public class ForwardAuthFilter implements GlobalFilter, Ordered { + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + // 未开启配置则直接跳过 + if (!SaManager.getConfig().getCheckSameToken()) { + return chain.filter(exchange); + } + ServerHttpRequest newRequest = exchange + .getRequest() + .mutate() + // 为请求追加 Same-Token 参数 + .header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken()) + .build(); + ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); + return chain.filter(newExchange); + } + + @Override + public int getOrder() { + return -100; + } +} + diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java new file mode 100644 index 0000000..09e50ff --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCacheRequestFilter.java @@ -0,0 +1,38 @@ +package org.dromara.gateway.filter; + +import org.dromara.gateway.utils.WebFluxUtils; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 全局缓存获取body请求数据(解决流不能重复读取问题) + * + * @author Lion Li + */ +@Component +public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + // 只缓存json类型请求 + if (!WebFluxUtils.isJsonRequest(exchange)) { + return chain.filter(exchange); + } + return ServerWebExchangeUtils.cacheRequestBody(exchange, (serverHttpRequest) -> { + if (serverHttpRequest == exchange.getRequest()) { + return chain.filter(exchange); + } + return chain.filter(exchange.mutate().request(serverHttpRequest).build()); + }); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 1; + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java new file mode 100644 index 0000000..e383565 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsFilter.java @@ -0,0 +1,58 @@ +package org.dromara.gateway.filter; + +import org.springframework.core.Ordered; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.cors.reactive.CorsUtils; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + + +/** + * 跨域配置 + * + * @author Lion Li + */ +@Component +public class GlobalCorsFilter implements WebFilter, Ordered { + + /** + * 这里为支持的请求头,如果有自定义的header字段请自己添加 + */ + private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Language, Content-Type, Authorization, clientid, credential, X-XSRF-TOKEN, isToken, token, Admin-Token, App-Token, isEncrypt, encrypt-key"; + private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD"; + private static final String ALLOWED_ORIGIN = "*"; + private static final String ALLOWED_EXPOSE = "*"; + private static final String MAX_AGE = "18000L"; + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + if (CorsUtils.isCorsRequest(request)) { + ServerHttpResponse response = exchange.getResponse(); + HttpHeaders headers = response.getHeaders(); + headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS); + headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS); + headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN); + headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE); + headers.add("Access-Control-Max-Age", MAX_AGE); + headers.add("Access-Control-Allow-Credentials", "true"); + if (request.getMethod() == HttpMethod.OPTIONS) { + response.setStatusCode(HttpStatus.OK); + return Mono.empty(); + } + } + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java new file mode 100644 index 0000000..bad65bf --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalI18nFilter.java @@ -0,0 +1,41 @@ +package org.dromara.gateway.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.context.i18n.SimpleLocaleContext; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.Locale; + +/** + * 全局国际化处理 + * + * @author Lion Li + */ +@Slf4j +@Component +public class GlobalI18nFilter implements GlobalFilter, Ordered { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + String language = exchange.getRequest().getHeaders().getFirst("content-language"); + Locale locale = Locale.getDefault(); + if (language != null && language.length() > 0) { + String[] split = language.split("_"); + locale = new Locale(split[0], split[1]); + } + LocaleContextHolder.setLocaleContext(new SimpleLocaleContext(locale), true); + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java new file mode 100644 index 0000000..2c77651 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalLogFilter.java @@ -0,0 +1,81 @@ +package org.dromara.gateway.filter; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.gateway.config.properties.ApiDecryptProperties; +import org.dromara.gateway.config.properties.CustomGatewayProperties; +import org.dromara.gateway.utils.WebFluxUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.MultiValueMap; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 全局日志过滤器 + *

+ * 用于打印请求执行参数与响应时间等等 + * + * @author Lion Li + */ +@Slf4j +@Component +public class GlobalLogFilter implements GlobalFilter, Ordered { + + @Autowired + private CustomGatewayProperties customGatewayProperties; + @Autowired + private ApiDecryptProperties apiDecryptProperties; + + private static final String START_TIME = "startTime"; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + if (!customGatewayProperties.getRequestLog()) { + return chain.filter(exchange); + } + ServerHttpRequest request = exchange.getRequest(); + String path = WebFluxUtils.getOriginalRequestUrl(exchange); + String url = request.getMethod().name() + " " + path; + + // 打印请求参数 + if (WebFluxUtils.isJsonRequest(exchange)) { + if (apiDecryptProperties.getEnabled() + && ObjectUtil.isNotNull(request.getHeaders().getFirst(apiDecryptProperties.getHeaderFlag()))) { + log.info("[PLUS]开始请求 => URL[{}],参数类型[encrypt]", url); + } else { + String jsonParam = WebFluxUtils.resolveBodyFromCacheRequest(exchange); + log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + } + } else { + MultiValueMap parameterMap = request.getQueryParams(); + if (MapUtil.isNotEmpty(parameterMap)) { + String parameters = JsonUtils.toJsonString(parameterMap); + log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); + } else { + log.info("[PLUS]开始请求 => URL[{}],无参数", url); + } + } + + exchange.getAttributes().put(START_TIME, System.currentTimeMillis()); + return chain.filter(exchange).then(Mono.fromRunnable(() -> { + Long startTime = exchange.getAttribute(START_TIME); + if (startTime != null) { + long executeTime = (System.currentTimeMillis() - startTime); + log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", url, executeTime); + } + })); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE; + } + +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java new file mode 100644 index 0000000..d501610 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/filter/XssFilter.java @@ -0,0 +1,100 @@ +package org.dromara.gateway.filter; + +import cn.hutool.http.HtmlUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.gateway.config.properties.XssProperties; +import org.dromara.gateway.utils.WebFluxUtils; +import io.netty.buffer.ByteBufAllocator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpRequestDecorator; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; + +/** + * 跨站脚本过滤器 + * + * @author ruoyi + */ +@Component +@ConditionalOnProperty(value = "security.xss.enabled", havingValue = "true") +public class XssFilter implements GlobalFilter, Ordered { + // 跨站脚本的 xss 配置,nacos自行添加 + @Autowired + private XssProperties xss; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + // GET DELETE 不过滤 + HttpMethod method = request.getMethod(); + if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) { + return chain.filter(exchange); + } + // 非json类型,不过滤 + if (!WebFluxUtils.isJsonRequest(exchange)) { + return chain.filter(exchange); + } + // excludeUrls 不过滤 + String url = request.getURI().getPath(); + if (StringUtils.matches(url, xss.getExcludeUrls())) { + return chain.filter(exchange); + } + ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange); + return chain.filter(exchange.mutate().request(httpRequestDecorator).build()); + + } + + private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) { + ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) { + @Override + public Flux getBody() { + Flux body = super.getBody(); + return body.buffer().map(dataBuffers -> { + DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(); + DataBuffer join = dataBufferFactory.join(dataBuffers); + byte[] content = new byte[join.readableByteCount()]; + join.read(content); + DataBufferUtils.release(join); + String bodyStr = new String(content, StandardCharsets.UTF_8); + // 防xss攻击过滤 + bodyStr = HtmlUtil.cleanHtmlTag(bodyStr); + // 转成字节 + byte[] bytes = bodyStr.getBytes(); + NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT); + DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length); + buffer.write(bytes); + return buffer; + }); + } + + @Override + public HttpHeaders getHeaders() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.putAll(super.getHeaders()); + // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length + httpHeaders.remove(HttpHeaders.CONTENT_LENGTH); + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + return httpHeaders; + } + + }; + return serverHttpRequestDecorator; + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java new file mode 100644 index 0000000..e89538e --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/GatewayExceptionHandler.java @@ -0,0 +1,46 @@ +package org.dromara.gateway.handler; + +import org.dromara.gateway.utils.WebFluxUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; +import org.springframework.cloud.gateway.support.NotFoundException; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * 网关统一异常处理 + * + * @author ruoyi + */ +@Slf4j +@Order(-1) +@Configuration +public class GatewayExceptionHandler implements ErrorWebExceptionHandler { + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) { + ServerHttpResponse response = exchange.getResponse(); + + if (exchange.getResponse().isCommitted()) { + return Mono.error(ex); + } + + String msg; + + if (ex instanceof NotFoundException) { + msg = "服务未找到"; + } else if (ex instanceof ResponseStatusException responseStatusException) { + msg = responseStatusException.getMessage(); + } else { + msg = "内部服务器错误"; + } + + log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage()); + + return WebFluxUtils.webFluxResponseWriter(response, msg); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java new file mode 100644 index 0000000..0aec088 --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/handler/SentinelFallbackHandler.java @@ -0,0 +1,36 @@ +package org.dromara.gateway.handler; + +import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.dromara.gateway.utils.WebFluxUtils; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebExceptionHandler; +import reactor.core.publisher.Mono; + +/** + * 自定义限流异常处理 + * + * @author ruoyi + */ +public class SentinelFallbackHandler implements WebExceptionHandler { + private Mono writeResponse(ServerResponse response, ServerWebExchange exchange) { + return WebFluxUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试"); + } + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) { + ex.printStackTrace(); + if (exchange.getResponse().isCommitted()) { + return Mono.error(ex); + } + if (!BlockException.isBlockException(ex)) { + return Mono.error(ex); + } + return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange)); + } + + private Mono handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) { + return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable); + } +} diff --git a/ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java b/ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java new file mode 100644 index 0000000..278050a --- /dev/null +++ b/ruoyi-gateway/src/main/java/org/dromara/gateway/utils/WebFluxUtils.java @@ -0,0 +1,150 @@ +package org.dromara.gateway.utils; + +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.gateway.filter.GlobalCacheRequestFilter; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.util.UriComponentsBuilder; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashSet; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; + +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR; + +/** + * WebFlux 工具类 + * + * @author Lion Li + */ +public class WebFluxUtils { + + /** + * 获取原请求路径 + */ + public static String getOriginalRequestUrl(ServerWebExchange exchange) { + ServerHttpRequest request = exchange.getRequest(); + LinkedHashSet uris = exchange.getAttributeOrDefault(GATEWAY_ORIGINAL_REQUEST_URL_ATTR, new LinkedHashSet<>()); + URI requestUri = uris.stream().findFirst().orElse(request.getURI()); + return UriComponentsBuilder.fromPath(requestUri.getRawPath()).build().toUriString(); + } + + /** + * 是否是Json请求 + * + * @param exchange HTTP请求 + */ + public static boolean isJsonRequest(ServerWebExchange exchange) { + String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } + + /** + * 读取request内的body + * + * 注意一个request只能读取一次 读取之后需要重新包装 + */ + public static String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) { + // 获取请求体 + Flux body = serverHttpRequest.getBody(); + AtomicReference bodyRef = new AtomicReference<>(); + body.subscribe(buffer -> { + try (DataBuffer.ByteBufferIterator iterator = buffer.readableByteBuffers()) { + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(iterator.next()); + DataBufferUtils.release(buffer); + bodyRef.set(charBuffer.toString()); + } + }); + return bodyRef.get(); + } + + /** + * 从缓存中读取request内的body + * + * 注意要求经过 {@link ServerWebExchangeUtils#cacheRequestBody(ServerWebExchange, Function)} 此方法创建缓存 + * 框架内已经使用 {@link GlobalCacheRequestFilter} 全局创建了body缓存 + * + * @return body + */ + public static String resolveBodyFromCacheRequest(ServerWebExchange exchange) { + Object obj = exchange.getAttributes().get(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR); + if (ObjectUtil.isNull(obj)) { + return null; + } + DataBuffer buffer = (DataBuffer) obj; + try (DataBuffer.ByteBufferIterator iterator = buffer.readableByteBuffers()) { + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(iterator.next()); + return charBuffer.toString(); + } + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, Object value) { + return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL); + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param code 响应状态码 + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, Object value, int code) { + return webFluxResponseWriter(response, HttpStatus.OK, value, code); + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param status http状态码 + * @param code 响应状态码 + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code) { + return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code); + } + + /** + * 设置webflux模型响应 + * + * @param response ServerHttpResponse + * @param contentType content-type + * @param status http状态码 + * @param code 响应状态码 + * @param value 响应内容 + * @return Mono + */ + public static Mono webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code) { + response.setStatusCode(status); + response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType); + R result = R.fail(code, value.toString()); + DataBuffer dataBuffer = response.bufferFactory().wrap(JsonUtils.toJsonString(result).getBytes()); + return response.writeWith(Mono.just(dataBuffer)); + } +} diff --git a/ruoyi-gateway/src/main/resources/application.yml b/ruoyi-gateway/src/main/resources/application.yml new file mode 100644 index 0000000..3e2def6 --- /dev/null +++ b/ruoyi-gateway/src/main/resources/application.yml @@ -0,0 +1,37 @@ +# Tomcat +server: + port: 8081 + servlet: + context-path: / + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-gateway + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-gateway/src/main/resources/banner.txt b/ruoyi-gateway/src/main/resources/banner.txt new file mode 100644 index 0000000..ceced29 --- /dev/null +++ b/ruoyi-gateway/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ __ _ __ _ | |_ ___ __ __ __ _ _ _ +| '__|| | | | / _ \ | | | || ||______| / _` | / _` || __| / _ \\ \ /\ / / / _` || | | | +| | | |_| || (_) || |_| || | | (_| || (_| || |_ | __/ \ V V / | (_| || |_| | +|_| \__,_| \___/ \__, ||_| \__, | \__,_| \__| \___| \_/\_/ \__,_| \__, | + __/ | __/ | __/ | + |___/ |___/ |___/ \ No newline at end of file diff --git a/ruoyi-gateway/src/main/resources/logback-plus.xml b/ruoyi-gateway/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..4d66014 --- /dev/null +++ b/ruoyi-gateway/src/main/resources/logback-plus.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + ${log.path}/console.log + + + ${log.path}/console.%d{yyyy-MM-dd}.log + + 1 + + + ${log.pattern} + utf-8 + + + + INFO + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml new file mode 100644 index 0000000..e482762 --- /dev/null +++ b/ruoyi-modules/pom.xml @@ -0,0 +1,56 @@ + + + + org.dromara + flexible-employment + ${revision} + + 4.0.0 + + + ruoyi-system + ruoyi-gen + ruoyi-job + ruoyi-resource + ruoyi-payment + ruoyi-settlement + ruoyi-mp + ruoyi-flexible + + + ruoyi-modules + pom + + + ruoyi-modules业务模块 + + + + + + org.dromara + ruoyi-common-loadbalancer + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-flexible/pom.xml b/ruoyi-modules/ruoyi-flexible/pom.xml new file mode 100644 index 0000000..5d089bd --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/pom.xml @@ -0,0 +1,149 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-flexible + + + ruoyi-flexible灵活用工业务 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + + + + + + + + + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-websocket + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java new file mode 100644 index 0000000..7976e91 --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/RuoYiFlexibleApplication.java @@ -0,0 +1,29 @@ +package org.dromara.flexible; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * @author sunzexing + * @version 1.0 + * @title RuoYiMpApplication + * @description + * @create 2024-03-28 14:27 + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiFlexibleApplication { + + public static void main(String[] args) { + + SpringApplication application = new SpringApplication(RuoYiFlexibleApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 灵工业务模块启动成功 ლ(´ڡ`ლ)゙ "); + + } + +} diff --git a/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java new file mode 100644 index 0000000..c1bd728 --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/java/org/dromara/flexible/exception/FlexibleException.java @@ -0,0 +1,20 @@ +package org.dromara.flexible.exception; + +import org.dromara.common.core.exception.base.BaseException; + +/** + * @author sunzexing + * @version 1.0 + * @title FlexibleException + * @description 灵活用工自定义异常类 + * @create 2024-04-13 17:30 + */ +public class FlexibleException extends BaseException { + + + public FlexibleException(String msg){ + super(msg); + } + + +} diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml b/ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml new file mode 100644 index 0000000..fd66dbb --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9224 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-flexible + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt new file mode 100644 index 0000000..d4f7e6e --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/banner.txt @@ -0,0 +1,18 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + # # # # + ############# ## ### ############ # + # # ##### # # # ############# + ########### # # # # # + # # # # # # # + ############ ## # # ########### # + # # # ########### # # # # + # # # # # # # + # # # # # # # # # # + ## # ## # ######## ########### # + # # # # ### # # # # # # + # # # # # # # # # + # # # # # # # # # # + # ## # # # # # # ############### + ## ### # ####### # # # # +## # # # # # # diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-flexible/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-gen/Dockerfile b/ruoyi-modules/ruoyi-gen/Dockerfile new file mode 100644 index 0000000..5b1f972 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/Dockerfile @@ -0,0 +1,16 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/gen/logs + +WORKDIR /ruoyi/gen + +ENV SERVER_PORT=9202 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-gen.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} -jar app.jar ${JAVA_OPTS} diff --git a/ruoyi-modules/ruoyi-gen/pom.xml b/ruoyi-modules/ruoyi-gen/pom.xml new file mode 100644 index 0000000..f1b388b --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/pom.xml @@ -0,0 +1,94 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-gen + + + ruoyi-gen代码生成 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.apache.velocity + velocity-engine-core + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java new file mode 100644 index 0000000..d2350df --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java @@ -0,0 +1,22 @@ +package org.dromara.gen; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 代码生成 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiGenApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiGenApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 代码生成模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java new file mode 100644 index 0000000..e973e32 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/config/GenConfig.java @@ -0,0 +1,65 @@ +package org.dromara.gen.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +public class GenConfig { + /** + * 作者 + */ + public static String author; + + /** + * 生成包路径 + */ + public static String packageName; + + /** + * 自动去除表前缀,默认是false + */ + public static boolean autoRemovePre; + + /** + * 表前缀(类名不会包含表前缀) + */ + public static String tablePrefix; + + public static String getAuthor() { + return author; + } + + public void setAuthor(String author) { + GenConfig.author = author; + } + + public static String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() { + return autoRemovePre; + } + + public void setAutoRemovePre(boolean autoRemovePre) { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() { + return tablePrefix; + } + + public void setTablePrefix(String tablePrefix) { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java new file mode 100644 index 0000000..937869f --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java @@ -0,0 +1,186 @@ +package org.dromara.gen.constant; + +/** + * 代码生成通用常量 + * + * @author Lion Li + */ +public interface GenConstants { + /** + * 单表(增删改查) + */ + String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + String TPL_TREE = "tree"; + + /** + * 树编码字段 + */ + String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2"}; + + /** + * 数据库文本类型 + */ + String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob", + "ntext", "image", "bytea"}; + + /** + * 数据库时间类型 + */ + String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval", + "smalldatetime", "datetime2", "datetimeoffset"}; + + /** + * 数据库数字类型 + */ + String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal", "numeric", "real", "double precision", + "smallserial", "serial", "bigserial", "money", "smallmoney"}; + + /** + * BO对象 不需要添加字段 + */ + String[] COLUMNNAME_NOT_ADD = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要编辑字段 + */ + String[] COLUMNNAME_NOT_EDIT = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * VO对象 不需要返回字段 + */ + String[] COLUMNNAME_NOT_LIST = {"create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "version", "tenant_id"}; + + /** + * BO对象 不需要查询字段 + */ + String[] COLUMNNAME_NOT_QUERY = {"id", "create_dept", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark", "version", "tenant_id"}; + + /** + * Entity基类字段 + */ + String[] BASE_ENTITY = {"createDept", "createBy", "createTime", "updateBy", "updateTime", "tenantId"}; + + /** + * 文本框 + */ + String HTML_INPUT = "input"; + + /** + * 文本域 + */ + String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + String HTML_SELECT = "select"; + + /** + * 单选框 + */ + String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + String TYPE_STRING = "String"; + + /** + * 整型 + */ + String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + String QUERY_LIKE = "LIKE"; + + /** + * 相等查询 + */ + String QUERY_EQ = "EQ"; + + /** + * 需要 + */ + String REQUIRE = "1"; +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java new file mode 100644 index 0000000..bd278b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java @@ -0,0 +1,217 @@ +package org.dromara.gen.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; +import org.dromara.gen.service.IGenTableService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成 操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/gen") +public class GenController extends BaseController { + + private final IGenTableService genTableService; + + /** + * 查询代码生成列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageGenTableList(genTable, pageQuery); + } + + /** + * 修改代码生成业务 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:query") + @GetMapping(value = "/{tableId}") + public R> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap<>(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return R.ok(map); + } + + /** + * 查询数据库列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageDbTableList(genTable, pageQuery); + } + + /** + * 查询数据表字段列表 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { + TableDataInfo dataInfo = new TableDataInfo<>(); + List list = genTableService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + * + * @param tables 表名串 + */ + @SaCheckPermission("tool:gen:import") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public R importTableSave(String tables, String dataName) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames, dataName); + genTableService.importGenTable(tableList, dataName); + return R.ok(); + } + + /** + * 修改保存代码生成业务 + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public R editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return R.ok(); + } + + /** + * 删除代码生成 + * + * @param tableIds 表ID串 + */ + @SaCheckPermission("tool:gen:remove") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public R remove(@PathVariable Long[] tableIds) { + genTableService.deleteGenTableByIds(tableIds); + return R.ok(); + } + + /** + * 预览代码 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:preview") + @GetMapping("/preview/{tableId}") + public R> preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return R.ok(dataMap); + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableId}") + public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException { + byte[] data = genTableService.downloadCode(tableId); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableId}") + public R genCode(@PathVariable("tableId") Long tableId) { + genTableService.generatorCode(tableId); + return R.ok(); + } + + /** + * 同步数据库 + * + * @param tableId 表ID + */ + @SaCheckPermission("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableId}") + public R synchDb(@PathVariable("tableId") Long tableId) { + genTableService.synchDb(tableId); + return R.ok(); + } + + /** + * 批量生成代码 + * + * @param tableIdStr 表ID串 + */ + @SaCheckPermission("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException { + String[] tableIds = Convert.toStrArray(tableIdStr); + byte[] data = genTableService.downloadCode(tableIds); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + //response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.write(response.getOutputStream(), false, data); + } + + /** + * 查询数据源名称列表 + */ + @SaCheckPermission("tool:gen:list") + @GetMapping(value = "/getDataNames") + public R getCurrentDataSourceNameList(){ + return R.ok(DataBaseHelper.getDataSourceNameList()); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java new file mode 100644 index 0000000..19f94b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java @@ -0,0 +1,196 @@ +package org.dromara.gen.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.gen.constant.GenConstants; + +import java.util.List; + +/** + * 业务表 gen_table + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table") +public class GenTable extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "table_id") + private Long tableId; + + /** + * 数据源名称 + */ + @NotBlank(message = "数据源名称不能为空") + private String dataName; + + /** + * 表名称 + */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** + * 表描述 + */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** + * 关联父表的表名 + */ + private String subTableName; + + /** + * 本表关联父表的外键名 + */ + private String subTableFkName; + + /** + * 实体类名称(首字母大写) + */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** + * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) + */ + private String tplCategory; + + /** + * 生成包路径 + */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** + * 生成模块名 + */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** + * 生成业务名 + */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** + * 生成功能名 + */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** + * 生成作者 + */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + + /** + * 生成路径(不填默认项目路径) + */ + @TableField(updateStrategy = FieldStrategy.NOT_EMPTY) + private String genPath; + + /** + * 主键信息 + */ + @TableField(exist = false) + private GenTableColumn pkColumn; + + /** + * 表列信息 + */ + @Valid + @TableField(exist = false) + private List columns; + + /** + * 其它生成选项 + */ + private String options; + + /** + * 备注 + */ + private String remark; + + /** + * 树编码字段 + */ + @TableField(exist = false) + private String treeCode; + + /** + * 树父编码字段 + */ + @TableField(exist = false) + private String treeParentCode; + + /** + * 树名称字段 + */ + @TableField(exist = false) + private String treeName; + + /* + * 菜单id列表 + */ + @TableField(exist = false) + private List menuIds; + + /** + * 上级菜单ID字段 + */ + @TableField(exist = false) + private String parentMenuId; + + /** + * 上级菜单名称字段 + */ + @TableField(exist = false) + private String parentMenuName; + + public boolean isTree() { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java new file mode 100644 index 0000000..b3fe7c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTableColumn.java @@ -0,0 +1,222 @@ +package org.dromara.gen.domain; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.ibatis.type.JdbcType; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gen_table_column") +public class GenTableColumn extends BaseEntity { + + /** + * 编号 + */ + @TableId(value = "column_id") + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isPk; + + /** + * 是否自增(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isIncrement; + + /** + * 是否必填(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isEdit; + + /** + * 是否列表字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isList; + + /** + * 是否查询字段(1是) + */ + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) + private String isQuery; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public boolean isPk() { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public boolean isIncrement() { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public boolean isRequired() { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public boolean isInsert() { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public boolean isEdit() { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public boolean isList() { + return isList(this.isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public boolean isQuery() { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", + // TreeEntity + "parentName", "parentId"); + } + + public boolean isUsableColumn() { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append(StringUtils.EMPTY).append(startStr).append("=").append(endStr).append(StringUtils.SEPARATOR); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return this.columnComment; + } + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..501f0c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java @@ -0,0 +1,28 @@ +package org.dromara.gen.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.List; + +/** + * 业务字段 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableColumnMapper extends BaseMapperPlus { + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @param dataName 数据源名称 + * @return 列信息 + */ + @DS("#dataName") + List selectDbTableColumnsByName(@Param("tableName") String tableName, String dataName); + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java new file mode 100644 index 0000000..2567c89 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java @@ -0,0 +1,61 @@ +package org.dromara.gen.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.gen.domain.GenTable; + +import java.util.List; + +/** + * 业务 数据层 + * + * @author Lion Li + */ +@InterceptorIgnore(dataPermission = "true", tenantLine = "true") +public interface GenTableMapper extends BaseMapperPlus { + + /** + * 查询据库列表 + * + * @param genTable 查询条件 + * @return 数据库表集合 + */ + Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + GenTable selectGenTableByName(String tableName); + + @DS("") + List selectTableNameList(String dataName); +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java new file mode 100644 index 0000000..9031760 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java @@ -0,0 +1,466 @@ +package org.dromara.gen.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.gen.constant.GenConstants; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; +import org.dromara.gen.mapper.GenTableColumnMapper; +import org.dromara.gen.mapper.GenTableMapper; +import org.dromara.gen.util.GenUtils; +import org.dromara.gen.util.VelocityInitializer; +import org.dromara.gen.util.VelocityUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class GenTableServiceImpl implements IGenTableService { + + private final GenTableMapper baseMapper; + private final GenTableColumnMapper genTableColumnMapper; + private final IdentifierGenerator identifierGenerator; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); + } + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + GenTable genTable = baseMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + @Override + public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); + return TableDataInfo.build(page); + } + + private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { + Map params = genTable.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper + .eq(StringUtils.isNotEmpty(genTable.getDataName()),"data_name", genTable.getDataName()) + .like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) + .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "create_time", params.get("beginTime"), params.get("endTime")); + return wrapper; + } + + @DS("#genTable.dataName") + @Override + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + genTable.getParams().put("genTableNames",baseMapper.selectTableNameList(genTable.getDataName())); + Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + return TableDataInfo.build(page); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + @DS("#dataName") + @Override + public List selectDbTableListByNames(String[] tableNames, String dataName) { + return baseMapper.selectDbTableListByNames(tableNames); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + return baseMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void updateGenTable(GenTable genTable) { + String options = JsonUtils.toJsonString(genTable.getParams()); + genTable.setOptions(options); + int row = baseMapper.updateById(genTable); + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { + genTableColumnMapper.updateById(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteGenTableByIds(Long[] tableIds) { + List ids = Arrays.asList(tableIds); + baseMapper.deleteBatchIds(ids); + genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + @DSTransactional + @Override + public void importGenTable(List tableList, String dataName) { + Long operId = LoginHelper.getUserId(); + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table, operId); + table.setDataName(dataName); + int row = baseMapper.insert(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName, dataName); + List saveColumns = new ArrayList<>(); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + saveColumns.add(column); + } + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertBatch(saveColumns); + } + } + } + } catch (Exception e) { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(Long tableId) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableId, zip); + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + @Override + public void generatorCode(Long tableId) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + FileUtils.writeUtf8String(sw.toString(), path); + } catch (Exception e) { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + @DSTransactional + @Override + public void synchDb(Long tableId) { + GenTable table = baseMapper.selectGenTableById(tableId); + List tableColumns = table.getColumns(); + Map tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + if (CollUtil.isEmpty(dbTableColumns)) { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = StreamUtils.toList(dbTableColumns, GenTableColumn::getColumnName); + + List saveColumns = new ArrayList<>(); + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + } + saveColumns.add(column); + }); + if (CollUtil.isNotEmpty(saveColumns)) { + genTableColumnMapper.insertOrUpdateBatch(saveColumns); + } + List delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName())); + if (CollUtil.isNotEmpty(delColumns)) { + List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId); + if (CollUtil.isNotEmpty(ids)) { + genTableColumnMapper.deleteBatchIds(ids); + } + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableIds) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableId : tableIds) { + generatorCode(Long.parseLong(tableId), zip); + } + IoUtil.close(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(Long tableId, ZipOutputStream zip) { + // 查询表信息 + GenTable table = baseMapper.selectGenTableById(tableId); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(identifierGenerator.nextId(null).longValue()); + } + table.setMenuIds(menuIds); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString()); + IoUtil.close(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JsonUtils.toJsonString(genTable.getParams()); + Dict paramsObj = JsonUtils.parseMap(options); + if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_CODE))) { + throw new ServiceException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { + throw new ServiceException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_NAME))) { + throw new ServiceException("树名称字段不能为空"); + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (ObjectUtil.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + if (ObjectUtil.isNotNull(paramsObj)) { + String treeCode = paramsObj.getStr(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getStr(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} + diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java new file mode 100644 index 0000000..ea23c53 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/IGenTableService.java @@ -0,0 +1,132 @@ +package org.dromara.gen.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.List; +import java.util.Map; + +/** + * 业务 服务层 + * + * @author Lion Li + */ +public interface IGenTableService { + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @param dataName 数据源名称 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames, String dataName); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + */ + void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + */ + void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + * @param dataName 数据源名称 + */ + void importGenTable(List tableList, String dataName); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableId 表名称 + * @return 数据 + */ + byte[] downloadCode(Long tableId); + + /** + * 生成代码(自定义路径) + * + * @param tableId 表名称 + */ + void generatorCode(Long tableId); + + /** + * 同步数据库 + * + * @param tableId 表名称 + */ + void synchDb(Long tableId); + + /** + * 批量生成代码(下载方式) + * + * @param tableIds 表ID数组 + * @return 数据 + */ + byte[] downloadCode(String[] tableIds); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + void validateEdit(GenTable genTable); +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java new file mode 100644 index 0000000..214b181 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java @@ -0,0 +1,231 @@ +package org.dromara.gen.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.RegExUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.gen.config.GenConfig; +import org.dromara.gen.constant.GenConstants; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.Arrays; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class GenUtils { + + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, Long operId) { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operId); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), StringUtils.SEPARATOR); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // BO对象 默认插入勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_ADD, columnName) && !column.isPk()) { + column.setIsInsert(GenConstants.REQUIRE); + } + // BO对象 默认编辑勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName)) { + column.setIsEdit(GenConstants.REQUIRE); + } + // BO对象 默认是否必填勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName)) { + column.setIsRequired(GenConstants.REQUIRE); + } + // VO对象 默认返回勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName)) { + column.setIsList(GenConstants.REQUIRE); + } + // BO对象 默认查询勾选 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) { + int firstIndex = tableName.indexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, firstIndex + 1, nameLength); + businessName = StringUtils.toCamelCase(businessName); + return businessName; + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { + String[] searchList = StringUtils.split(tablePrefix, StringUtils.SEPARATOR); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + */ + public static String replaceFirst(String replacementm, String[] searchList) { + String text = replacementm; + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { + text = replacementm.replaceFirst(searchString, StringUtils.EMPTY); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBefore(columnType, "("); + } else { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } else { + return 0; + } + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java new file mode 100644 index 0000000..68773b2 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityInitializer.java @@ -0,0 +1,35 @@ +package org.dromara.gen.util; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.app.Velocity; +import org.dromara.common.core.constant.Constants; + +import java.util.Properties; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityInitializer { + + /** + * 初始化vm方法 + */ + public static void initVelocity() { + Properties p = new Properties(); + try { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java new file mode 100644 index 0000000..1206767 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java @@ -0,0 +1,344 @@ +package org.dromara.gen.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.VelocityContext; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.gen.constant.GenConstants; +import org.dromara.gen.domain.GenTable; +import org.dromara.gen.domain.GenTableColumn; + +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityUtils { + + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); + } + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList<>(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/remoteVo.java.vm"); + templates.add("vm/java/voConvert.java.vm"); + templates.add("vm/java/bo.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + if (DataBaseHelper.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (DataBaseHelper.isPostgerSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } + templates.add("vm/ts/api.ts.vm"); + templates.add("vm/ts/types.ts.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("vo.java.vm")) { + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + } + if (template.contains("remoteVo.java.vm")) { + fileName = StringUtils.format("{}/api/domain/Remote{}Vo.java", javaPath, className); + } + if (template.contains("voConvert.java.vm")) { + fileName = StringUtils.format("{}/domain/convert/{}VoConvert.java", javaPath, className); + } + if (template.contains("bo.java.vm")) { + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); + } + if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName); + } else if (template.contains("types.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + HashSet importList = new HashSet<>(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet<>(); + addDicts(dicts, columns); + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(Map paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml new file mode 100644 index 0000000..253639b --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml @@ -0,0 +1,37 @@ +# Tomcat +server: + port: 9202 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-gen + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt new file mode 100644 index 0000000..05f528c --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ + (_) + _ __ _ _ ___ _ _ _ ______ __ _ ___ _ __ +| '__|| | | | / _ \ | | | || ||______| / _` | / _ \| '_ \ +| | | |_| || (_) || |_| || | | (_| || __/| | | | +|_| \__,_| \___/ \__, ||_| \__, | \___||_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..0ef8ae4 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/logback-plus.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..8fedeb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..3f4f0ce --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm new file mode 100644 index 0000000..511d37c --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/bo.java.vm @@ -0,0 +1,50 @@ +package ${packageName}.domain.bo; + +import ${packageName}.domain.${ClassName}; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +#foreach ($import in $importList) +import ${import}; +#end + +/** + * ${functionName}业务对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ${ClassName}.class, reverseConvertGenerate = false) +public class ${ClassName}Bo extends BaseEntity { + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField) && ($column.query || $column.insert || $column.edit)) + /** + * $column.columnComment + */ +#if($column.insert && $column.edit) +#set($Group="AddGroup.class, EditGroup.class") +#elseif($column.insert) +#set($Group="AddGroup.class") +#elseif($column.edit) +#set($Group="EditGroup.class") +#end +#if($column.required) +#if($column.javaType == 'String') + @NotBlank(message = "$column.columnComment不能为空", groups = { $Group }) +#else + @NotNull(message = "$column.columnComment不能为空", groups = { $Group }) +#end +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..a842537 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,116 @@ +package ${packageName}.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.service.I${ClassName}Service; +#if($table.crud || $table.sub) +import org.dromara.common.mybatis.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName} + * 前端访问路由地址为:/${moduleName}/${businessName} + * + * @author ${author} + * @date ${datetime} + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/${businessName}") +public class ${ClassName}Controller extends BaseController { + + private final I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @SaCheckPermission("${permissionPrefix}:list") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo<${ClassName}Vo> list(${ClassName}Bo bo, PageQuery pageQuery) { + return ${className}Service.queryPageList(bo, pageQuery); + } +#elseif($table.tree) + public R> list(${ClassName}Bo bo) { + List<${ClassName}Vo> list = ${className}Service.queryList(bo); + return R.ok(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @SaCheckPermission("${permissionPrefix}:export") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(${ClassName}Bo bo, HttpServletResponse response) { + List<${ClassName}Vo> list = ${className}Service.queryList(bo); + ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response); + } + + /** + * 获取${functionName}详细信息 + * + * @param ${pkColumn.javaField} 主键 + */ + @SaCheckPermission("${permissionPrefix}:query") + @GetMapping("/{${pkColumn.javaField}}") + public R<${ClassName}Vo> getInfo(@NotNull(message = "主键不能为空") + @PathVariable ${pkColumn.javaType} ${pkColumn.javaField}) { + return R.ok(${className}Service.queryById(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @SaCheckPermission("${permissionPrefix}:add") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(${className}Service.insertByBo(bo)); + } + + /** + * 修改${functionName} + */ + @SaCheckPermission("${permissionPrefix}:edit") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(${className}Service.updateByBo(bo)); + } + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField}s 主键串 + */ + @SaCheckPermission("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { + return toAjax(${className}Service.deleteWithValidByIds(List.of(${pkColumn.javaField}s), true)); + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..205fb73 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,60 @@ +package ${packageName}.domain; + +#foreach ($column in $columns) +#if($column.javaField=='tenantId') +#set($IsTenant=1) +#end +#end +#if($IsTenant==1) +import org.dromara.common.tenant.core.TenantEntity; +#else +import org.dromara.common.mybatis.core.domain.BaseEntity; +#end +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +#foreach ($import in $importList) +import ${import}; +#end + +import java.io.Serial; + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($IsTenant==1) +#set($Entity="TenantEntity") +#else +#set($Entity="BaseEntity") +#end +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("${tableName}") +public class ${ClassName} extends ${Entity} { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** + * $column.columnComment + */ +#if($column.javaField=='delFlag') + @TableLogic +#end +#if($column.javaField=='version') + @Version +#end +#if($column.isPk==1) + @TableId(value = "$column.columnName") +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..0922401 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,15 @@ +package ${packageName}.mapper; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.domain.vo.${ClassName}Vo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> { + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm new file mode 100644 index 0000000..6f51acc --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/remoteVo.java.vm @@ -0,0 +1,42 @@ +package ${packageName}.api.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * ${functionName}视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +public class Remote${ClassName}Vo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..d596a0e --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,53 @@ +package ${packageName}.service; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; +#if($table.crud || $table.sub) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +#end + +import java.util.Collection; +import java.util.List; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service { + + /** + * 查询${functionName} + */ + ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}); + +#if($table.crud || $table.sub) + /** + * 查询${functionName}列表 + */ + TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); +#end + + /** + * 查询${functionName}列表 + */ + List<${ClassName}Vo> queryList(${ClassName}Bo bo); + + /** + * 新增${functionName} + */ + Boolean insertByBo(${ClassName}Bo bo); + + /** + * 修改${functionName} + */ + Boolean updateByBo(${ClassName}Bo bo); + + /** + * 校验并批量删除${functionName}信息 + */ + Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..3cf3302 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,135 @@ +package ${packageName}.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +#if($table.crud || $table.sub) +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +#end +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.${ClassName}; +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.service.I${ClassName}Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@RequiredArgsConstructor +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service { + + private final ${ClassName}Mapper baseMapper; + + /** + * 查询${functionName} + */ + @Override + public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ + return baseMapper.selectVoById(${pkColumn.javaField}); + } + +#if($table.crud || $table.sub) + /** + * 查询${functionName}列表 + */ + @Override + public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { + QueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + Page<${ClassName}Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } +#end + + /** + * 查询${functionName}列表 + */ + @Override + public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { + QueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { + Map params = bo.getParams(); + QueryWrapper<${ClassName}> lqw = new QueryWrapper<>(); +#foreach($column in $columns) +#if($column.query) +#set($queryType=$column.queryType) +#set($javaField=$column.javaField) +#set($javaType=$column.javaType) +#set($columnName=$column.columnName) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($mpMethod=$column.queryType.toLowerCase()) +#if($queryType != 'BETWEEN') +#if($javaType == 'String') +#set($condition='StringUtils.isNotBlank(bo.get'+$AttrName+'())') +#else +#set($condition='bo.get'+$AttrName+'() != null') +#end + lqw.$mpMethod($condition, "$columnName", bo.get$AttrName()); +#else + lqw.between(params.get("begin$AttrName") != null && params.get("end$AttrName") != null, + "$columnName" ,params.get("begin$AttrName"), params.get("end$AttrName")); +#end +#end +#end + return lqw; + } + + /** + * 新增${functionName} + */ + @Override + public Boolean insertByBo(${ClassName}Bo bo) { + ${ClassName} add = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; +#set($pk=$pkColumn.javaField.substring(0,1).toUpperCase() + ${pkColumn.javaField.substring(1)}) + if (flag) { + bo.set$pk(add.get$pk()); + } + return flag; + } + + /** + * 修改${functionName} + */ + @Override + public Boolean updateByBo(${ClassName}Bo bo) { + ${ClassName} update = MapstructUtils.convert(bo, ${ClassName}.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(${ClassName} entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除${functionName} + */ + @Override + public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm new file mode 100644 index 0000000..f99a2ed --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/vo.java.vm @@ -0,0 +1,59 @@ +package ${packageName}.domain.vo; + +#foreach ($import in $importList) +import ${import}; +#end +import ${packageName}.domain.${ClassName}; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * ${functionName}视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ${ClassName}.class) +public class ${ClassName}Vo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if(${column.dictType} && ${column.dictType} != '') + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "${column.dictType}") +#elseif($parentheseIndex != -1) + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") +#else + @ExcelProperty(value = "${comment}") +#end + private $column.javaType $column.javaField; + +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm new file mode 100644 index 0000000..ba8107b --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/voConvert.java.vm @@ -0,0 +1,19 @@ +package ${packageName}.domain.convert; + +import io.github.linpeilie.BaseMapper; +import ${packageName}.api.domain.Remote${ClassName}Vo; +import ${packageName}.domain.vo.${ClassName}Vo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * ${functionName}Convert接口 + * + * @author ${author} + * @date ${datetime} + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface ${ClassName}VoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm new file mode 100644 index 0000000..f6638be --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/oracle/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate, null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, sysdate, null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate, null, null, ''); diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm new file mode 100644 index 0000000..0923392 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/postgres/sql.vm @@ -0,0 +1,20 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, now(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, now(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, now(), null, null, ''); + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..01824c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,19 @@ +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 103, 1, sysdate(), null, null, ''); diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm new file mode 100644 index 0000000..3aa4a5f --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/api.ts.vm @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { ${BusinessName}VO, ${BusinessName}Form, ${BusinessName}Query } from '@/api/${moduleName}/${businessName}/types'; + +/** + * 查询${functionName}列表 + * @param query + * @returns {*} + */ + +export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<${BusinessName}VO[]> => { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }); +}; + +/** + * 查询${functionName}详细 + * @param ${pkColumn.javaField} + */ +export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }); +}; + +/** + * 新增${functionName} + * @param data + */ +export const add${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }); +}; + +/** + * 修改${functionName} + * @param data + */ +export const update${BusinessName} = (data: ${BusinessName}Form) => { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }); +}; + +/** + * 删除${functionName} + * @param ${pkColumn.javaField} + */ +export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array) => { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }); +}; diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm new file mode 100644 index 0000000..4e0ab5e --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/ts/types.ts.vm @@ -0,0 +1,50 @@ +export interface ${BusinessName}VO { +#foreach ($column in $columns) +#if($column.insert || $column.edit) + /** + * $column.columnComment + */ + $column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +#if ($table.tree) + /** + * 子对象 + */ + children: ${BusinessName}VO[]; +#end +} + +export interface ${BusinessName}Form extends BaseEntity { +#foreach ($column in $columns) +#if($column.insert || $column.edit) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +} + +export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{ +#foreach ($column in $columns) +#if($column.query) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..f876f55 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,507 @@ + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..6ba61fc --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..9fb48d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-job/Dockerfile b/ruoyi-modules/ruoyi-job/Dockerfile new file mode 100644 index 0000000..2922d84 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/job/logs \ + /ruoyi/job/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/job + +ENV SERVER_PORT=9203 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-job.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-job \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml new file mode 100644 index 0000000..6b92a99 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -0,0 +1,105 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-job + + + ruoyi-job 任务调度模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-job + + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + + + org.dromara + ruoyi-common-security + + + + + org.dromara + ruoyi-api-system + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java new file mode 100644 index 0000000..ddc03d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/RuoYiJobApplication.java @@ -0,0 +1,24 @@ +package org.dromara.job; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 任务调度模块 + * + * @author Lion Li + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiJobApplication { + + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiJobApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 任务调度模块启动成功 ლ(´ڡ`ლ)゙ "); + } + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java new file mode 100644 index 0000000..2b4c28a --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/BroadcastProcessorDemo.java @@ -0,0 +1,56 @@ +package org.dromara.job.processors; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import tech.powerjob.common.utils.NetUtils; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.TaskResult; +import tech.powerjob.worker.core.processor.sdk.BroadcastProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.List; + +/** + * 广播处理器 示例 + * + * @author tjq + * @since 2020/4/17 + */ +@Slf4j +@Component +public class BroadcastProcessorDemo implements BroadcastProcessor { + + @Override + public ProcessResult preProcess(TaskContext context) { + System.out.println("===== BroadcastProcessorDemo#preProcess ======"); + context.getOmsLogger().info("BroadcastProcessorDemo#preProcess, current host: {}", NetUtils.getLocalHost()); + if ("rootFailed".equals(context.getJobParams())) { + return new ProcessResult(false, "console need failed"); + } else { + return new ProcessResult(true); + } + } + + @Override + public ProcessResult process(TaskContext taskContext) throws Exception { + OmsLogger logger = taskContext.getOmsLogger(); + System.out.println("===== BroadcastProcessorDemo#process ======"); + logger.info("BroadcastProcessorDemo#process, current host: {}", NetUtils.getLocalHost()); + long sleepTime = 1000; + try { + sleepTime = Long.parseLong(taskContext.getJobParams()); + } catch (Exception e) { + logger.warn("[BroadcastProcessor] parse sleep time failed!", e); + } + Thread.sleep(Math.max(sleepTime, 1000)); + return new ProcessResult(true); + } + + @Override + public ProcessResult postProcess(TaskContext context, List taskResults) { + System.out.println("===== BroadcastProcessorDemo#postProcess ======"); + context.getOmsLogger().info("BroadcastProcessorDemo#postProcess, current host: {}, taskResult: {}", NetUtils.getLocalHost(), taskResults); + return new ProcessResult(true, "success"); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java new file mode 100644 index 0000000..2a1000f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/LogTestProcessor.java @@ -0,0 +1,41 @@ +package org.dromara.job.processors; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; +import tech.powerjob.official.processors.util.CommonUtils; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Date; +import java.util.Optional; + +/** + * LogTestProcessor + * + * @author tjq + * @since 2022/9/18 + */ +@Component +public class LogTestProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + final OmsLogger omsLogger = context.getOmsLogger(); + final String parseParams = CommonUtils.parseParams(context); + final JSONObject config = Optional.ofNullable(JSONObject.parseObject(parseParams)).orElse(new JSONObject()); + + final long loopTimes = Optional.ofNullable(config.getLong("loopTimes")).orElse(1000L); + + for (int i = 0; i < loopTimes; i++) { + omsLogger.debug("[DEBUG] one DEBUG log in {}", new Date()); + omsLogger.info("[INFO] one INFO log in {}", new Date()); + omsLogger.warn("[WARN] one WARN log in {}", new Date()); + omsLogger.error("[ERROR] one ERROR log in {}", new Date()); + } + + return new ProcessResult(true); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java new file mode 100644 index 0000000..720d333 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapProcessorDemo.java @@ -0,0 +1,93 @@ +package org.dromara.job.processors; + +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.dromara.common.json.utils.JsonUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.MapProcessor; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * Map处理器 示例 + * + * @author tjq + * @since 2020/4/18 + */ +@Component +public class MapProcessorDemo implements MapProcessor { + + + /** + * 每一批发送任务大小 + */ + private static final int BATCH_SIZE = 100; + /** + * 发送的批次 + */ + private static final int BATCH_NUM = 5; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + log.info("============== MapProcessorDemo#process =============="); + log.info("isRootTask:{}", isRootTask()); + log.info("taskContext:{}", JsonUtils.toJsonString(context)); + + if (isRootTask()) { + log.info("==== MAP ===="); + List subTasks = Lists.newLinkedList(); + for (int j = 0; j < BATCH_NUM; j++) { + SubTask subTask = new SubTask(); + subTask.siteId = j; + subTask.itemIds = Lists.newLinkedList(); + subTasks.add(subTask); + for (int i = 0; i < BATCH_SIZE; i++) { + subTask.itemIds.add(i + j * 100); + } + } + map(subTasks, "MAP_TEST_TASK"); + return new ProcessResult(true, "map successfully"); + } else { + + log.info("==== PROCESS ===="); + SubTask subTask = (SubTask) context.getSubTask(); + for (Integer itemId : subTask.getItemIds()) { + if (Thread.interrupted()) { + // 任务被中断 + log.info("job has been stop! so stop to process subTask: {} => {}", subTask.getSiteId(), itemId); + break; + } + log.info("processing subTask: {} => {}", subTask.getSiteId(), itemId); + int max = Integer.MAX_VALUE >> 7; + for (int i = 0; ; i++) { + // 模拟耗时操作 + if (i > max) { + break; + } + } + } + // 测试在 Map 任务中追加上下文 + context.getWorkflowContext().appendData2WfContext("Yasuo", "A sword's poor company for a long road."); + boolean b = ThreadLocalRandom.current().nextBoolean(); + if (context.getCurrentRetryTimes() >= 1) { + // 重试的话一定会成功 + b = true; + } + return new ProcessResult(b, "RESULT:" + b); + } + } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class SubTask { + private Integer siteId; + private List itemIds; + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java new file mode 100644 index 0000000..1498854 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/MapReduceProcessorDemo.java @@ -0,0 +1,93 @@ +package org.dromara.job.processors; + +import cn.hutool.core.lang.Dict; +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.json.utils.JsonUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.TaskResult; +import tech.powerjob.worker.core.processor.sdk.MapReduceProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * MapReduce 处理器示例 + * 控制台参数:{"batchSize": 100, "batchNum": 2} + * + * @author tjq + * @since 2020/4/17 + */ +@Slf4j +@Component +public class MapReduceProcessorDemo implements MapReduceProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + OmsLogger omsLogger = context.getOmsLogger(); + + log.info("============== TestMapReduceProcessor#process =============="); + log.info("isRootTask:{}", isRootTask()); + log.info("taskContext:{}", JsonUtils.toJsonString(context)); + + // 根据控制台参数获取MR批次及子任务大小 + final Dict jobParams = JsonUtils.parseMap(context.getJobParams()); + + Integer batchSize = (Integer) jobParams.getOrDefault("batchSize", 100); + Integer batchNum = (Integer) jobParams.getOrDefault("batchNum", 10); + + if (isRootTask()) { + log.info("==== MAP ===="); + omsLogger.info("[DemoMRProcessor] start root task~"); + List subTasks = Lists.newLinkedList(); + for (int j = 0; j < batchNum; j++) { + for (int i = 0; i < batchSize; i++) { + int x = j * batchSize + i; + subTasks.add(new TestSubTask("name" + x, x)); + } + map(subTasks, "MAP_TEST_TASK"); + subTasks.clear(); + } + omsLogger.info("[DemoMRProcessor] map success~"); + return new ProcessResult(true, "MAP_SUCCESS"); + } else { + log.info("==== NORMAL_PROCESS ===="); + omsLogger.info("[DemoMRProcessor] process subTask: {}.", JsonUtils.toJsonString(context.getSubTask())); + log.info("subTask: {}", JsonUtils.toJsonString(context.getSubTask())); + Thread.sleep(1000); + if (context.getCurrentRetryTimes() == 0) { + return new ProcessResult(false, "FIRST_FAILED"); + } else { + return new ProcessResult(true, "PROCESS_SUCCESS"); + } + } + } + + @Override + public ProcessResult reduce(TaskContext context, List taskResults) { + log.info("================ MapReduceProcessorDemo#reduce ================"); + log.info("TaskContext: {}", JsonUtils.toJsonString(context)); + log.info("List: {}", JsonUtils.toJsonString(taskResults)); + context.getOmsLogger().info("MapReduce job finished, result is {}.", taskResults); + + boolean success = ThreadLocalRandom.current().nextBoolean(); + return new ProcessResult(success, context + ": " + success); + } + + @Getter + @ToString + @NoArgsConstructor + @AllArgsConstructor + public static class TestSubTask { + private String name; + private int age; + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java new file mode 100644 index 0000000..3342cfe --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/SimpleProcessor.java @@ -0,0 +1,35 @@ +package org.dromara.job.processors; + +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Optional; + +/** + * @author Echo009 + * @since 2022/4/27 + */ +@Component +public class SimpleProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + + OmsLogger logger = context.getOmsLogger(); + + String jobParams = Optional.ofNullable(context.getJobParams()).orElse("S"); + logger.info("Current context:{}", context.getWorkflowContext()); + logger.info("Current job params:{}", jobParams); + + // 测试中文问题 #581 + if (jobParams.contains("CN")) { + return new ProcessResult(true, "任务成功啦!!!"); + } + + return jobParams.contains("F") ? new ProcessResult(false) : new ProcessResult(true, "yeah!"); + + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java new file mode 100644 index 0000000..ea8eff3 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/StandaloneProcessorDemo.java @@ -0,0 +1,51 @@ +package org.dromara.job.processors; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Collections; + +/** + * 单机处理器 示例 + * + * @author tjq + * @since 2020/4/17 + */ +@Slf4j +@Component +public class StandaloneProcessorDemo implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + OmsLogger omsLogger = context.getOmsLogger(); + omsLogger.info("StandaloneProcessorDemo start process,context is {}.", context); + omsLogger.info("Notice! If you want this job process failed, your jobParams need to be 'failed'"); + omsLogger.info("Let's test the exception~"); + // 测试异常日志 + try { + Collections.emptyList().add("277"); + } catch (Exception e) { + omsLogger.error("oh~it seems that we have an exception~", e); + } + log.info("================ StandaloneProcessorDemo#process ================"); + log.info("jobParam:{}", context.getJobParams()); + log.info("instanceParams:{}", context.getInstanceParams()); + String param; + // 解析参数,非处于工作流中时,优先取实例参数(允许动态[instanceParams]覆盖静态参数[jobParams]) + if (context.getWorkflowContext() == null) { + param = StringUtils.isBlank(context.getInstanceParams()) ? context.getJobParams() : context.getInstanceParams(); + } else { + param = context.getJobParams(); + } + // 根据参数判断是否成功 + boolean success = !"failed".equals(param); + omsLogger.info("StandaloneProcessorDemo finished process,success: {}", success); + omsLogger.info("anyway, we finished the job successfully~Congratulations!"); + return new ProcessResult(success, context + ": " + success); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java new file mode 100644 index 0000000..4b5899f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/processors/TimeoutProcessor.java @@ -0,0 +1,25 @@ +package org.dromara.job.processors; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +/** + * 测试超时任务(可中断) + * + * @author tjq + * @since 2020/4/20 + */ +@Component +@Slf4j +public class TimeoutProcessor implements BasicProcessor { + @Override + public ProcessResult process(TaskContext context) throws Exception { + long sleepTime = Long.parseLong(context.getJobParams()); + log.info("TaskInstance({}) will sleep {} ms", context.getInstanceId(), sleepTime); + Thread.sleep(Long.parseLong(context.getJobParams())); + return new ProcessResult(true, "impossible~~~~QAQ~"); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java new file mode 100644 index 0000000..51187e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/workflow/WorkflowStandaloneProcessor.java @@ -0,0 +1,36 @@ +package org.dromara.job.workflow; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Map; + +/** + * 工作流测试 + * + * @author tjq + * @since 2020/6/2 + */ +@Component +@Slf4j +public class WorkflowStandaloneProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext context) throws Exception { + OmsLogger logger = context.getOmsLogger(); + logger.info("current jobParams: {}", context.getJobParams()); + logger.info("current context: {}", context.getWorkflowContext()); + log.info("jobParams:{}", context.getJobParams()); + log.info("currentContext:{}", JSON.toJSONString(context)); + + // 尝试获取上游任务 + Map workflowContext = context.getWorkflowContext().fetchWorkflowContext(); + log.info("工作流上下文数据:{}", workflowContext); + return new ProcessResult(true, context.getJobId() + " process successfully."); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/application.yml b/ruoyi-modules/ruoyi-job/src/main/resources/application.yml new file mode 100644 index 0000000..77fda0c --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9203 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-job + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-job/src/main/resources/banner.txt new file mode 100644 index 0000000..683f20c --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) (_) | | + _ __ _ _ ___ _ _ _ ______ _ ___ | |__ +| '__| | | |/ _ \| | | | |______| |/ _ \| '_ \ +| | | |_| | (_) | |_| | | | | (_) | |_) | +|_| \__,_|\___/ \__, |_| | |\___/|_.__/ + __/ | _/ | + |___/ |__/ diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-job/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-mp/pom.xml b/ruoyi-modules/ruoyi-mp/pom.xml new file mode 100644 index 0000000..645e216 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/pom.xml @@ -0,0 +1,174 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-mp + + + ruoyi-mp公众号 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.987 + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + + + + + + + + + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-websocket + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + + org.dromara + ruoyi-api-settlement + + + + + + org.dromara + ruoyi-api-mp + + + org.dromara + ruoyi-api-settlement + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java new file mode 100644 index 0000000..6291267 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/RuoYiMpApplication.java @@ -0,0 +1,31 @@ +package org.dromara.mp; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * @author sunzexing + * @version 1.0 + * @title RuoYiMpApplication + * @description + * @create 2024-03-28 14:27 + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiMpApplication { + + public static void main(String[] args) { + + SpringApplication application = new SpringApplication(RuoYiMpApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 公众号模块启动成功 ლ(´ڡ`ლ)゙ "); + + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java new file mode 100644 index 0000000..7447c7f --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/CardIdController.java @@ -0,0 +1,204 @@ +package org.dromara.mp.controller; + +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.service.ICardIdService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title CardIdController + * @description 身份证信息 + * @create 2024-04-01 17:26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cardId") +@Slf4j +public class CardIdController extends BaseController { + + + @Resource + public ICardIdService cardIdService; + +// @Log(title = "身份证识别", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Log(title = "身份证识别", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R idCardOcr(@RequestPart("file") MultipartFile file, String type,String code ){ + if (ObjectUtil.isNull(file)|| file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + Map reultMap = null; + try{ + reultMap = this.cardIdService.idCardOcr(file,type,code); + }catch(Exception e){ + e.printStackTrace(); + log.error("身份证识别错误===>"+e.getMessage()); + return R.fail(e.getMessage()); + } + return R.ok(reultMap); + } + + /** + * 银行卡识别上传接口 + * 使用OCR技术对上传的银行卡图片进行识别,并返回识别结果。 + * @param file 上传的银行卡图片文件,必须是multipart/form-data类型。 + * @param code 业务代码或标识,可用于特定的业务逻辑处理。 + * @return 返回一个包含识别结果的Map对象,如果失败则返回错误信息。 + */ + @PostMapping(value = "/bankUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Log(title = "银行卡识别上传接口", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R bankUploadOcr(@RequestPart("file") MultipartFile file, String code) { + // 检查上传的文件是否为空 + if (ObjectUtil.isNull(file) || file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + Map reultMap = null; + try { + // 调用服务进行银行卡识别处理 + reultMap = this.cardIdService.bankUploadOcr(file, null, code); + } catch (Exception e) { + e.printStackTrace(); + log.error("银行卡识别错误===>"+e.getMessage()); + return R.fail("银行卡识别错误"); + } + // 返回识别结果 + return R.ok(reultMap); + } + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 10:46 + * 说明:身份证识别信息提交 + **/ + @PostMapping(value = "/authSubmit") + @Log(title = "身份证识别信息提交", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R submitIdCardInfo(@Validated(AddGroup.class) UserWorkerBo userWorkerBo, String code)throws Exception{ + Map resultMap = this.cardIdService.submitIdCardInfo(userWorkerBo,code); + return R.ok(resultMap); + } + + + + + + /** + * 提交银行认证信息 + * @param cardNo 银行卡号 + * @param code 验证码 + * @param bankImg 银行卡图片 + * @param bankInfo 银行信息 + * @param cardType 卡类型 + * @param cardName 卡名称 + * @param phone 手机号 + * @param channelName 通道名称 + * @return 返回认证结果,包含认证状态和相关信息 + * @throws Exception 处理过程中可能抛出的异常 + */ + @PostMapping(value = "/bankAuth") + @Log(title = "提交银行认证信息", businessType = BusinessType.INSERT,operatorType= OperatorType.MOBILE) + public R submitBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,String channelName) throws Exception{ + + Map resultMap = new HashMap(); + resultMap = this.cardIdService.bankAuth4(cardNo,code,bankImg,bankInfo,cardType,cardName,phone,channelName); + return R.ok(resultMap); + } + + + + + /** + * 修改银行卡信息 + * @param cardNo 银行卡号 + * @param code 验证码 + * @param bankImg 银行卡图片 + * @param bankInfo 银行信息 + * @param cardType 卡类型 + * @param cardName 卡名称 + * @param phone 手机号 + * @param id 银行卡ID + * @return 返回认证结果,包含认证状态和相关信息 + * @throws Exception 处理过程中可能抛出的异常 + */ + @PostMapping(value = "/mdyBank") + @Log(title = "修改银行卡信息", businessType = BusinessType.UPDATE,operatorType= OperatorType.MOBILE) + public R mdyBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,Long id) throws Exception{ + return R.ok(this.cardIdService.mdyBank(cardNo,code,bankImg,bankInfo,cardType,cardName,phone,id)); + } + + + /*** + * 获取用户信息 + * @return + */ + @GetMapping(value = "/getInfo") + @Log(title = "获取用户信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getUserInfo(){ + return R.ok(this.cardIdService.getUserInfo()); + } + + + + + @GetMapping(value = "/getCardInfo") + @Log(title = "获取身份信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getUserCardInfo(){ + return R.ok(this.cardIdService.getUserCardInfo()); + } + + + + /**** + * 获取人身核验地址 + * @param code + * @return + * @throws Exception + */ + @GetMapping(value = "/getFa") + @Log(title = "获取人身核验地址", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getFaceAuth(String code)throws Exception{ + return R.ok(this.cardIdService.getFaceAuth(code)); + } + + + /**** + * 获取人脸核验结果 + * @param bizToken 人脸核验token + * @return + * @throws Exception + */ + + @GetMapping(value = "/getFaResult") + @Log(title = "获取人脸核验结果", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getFaceAuthResult(String bizToken,String code)throws Exception{ + return R.ok(this.cardIdService.getFaceAuthResult(bizToken, code)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java new file mode 100644 index 0000000..5adba88 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/MyTaskController.java @@ -0,0 +1,232 @@ +package org.dromara.mp.controller; + +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; +import org.dromara.mp.domain.vo.MyTaskVo; +import org.dromara.mp.domain.vo.TaskVo; +import org.dromara.mp.domain.vo.UserWorkerBus; +import org.dromara.mp.service.IMyTaskService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskController + * @description + * @create 2024-05-08 18:46 + */ +@RestController +@RequestMapping("/task") +public class MyTaskController extends BaseController { + + @Resource + public IMyTaskService taskService; + + + /*** + * 任务广场 + * @param name + * @param pageQuery + * @return + */ + @GetMapping("/taskList") + @Log(title = "任务广场", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo selTastList(String name, PageQuery pageQuery){ + return taskService.selTastList(name,pageQuery); + } + + + + /*** + * 任务广场 + * @param name + * @param pageQuery + * @return + */ + @GetMapping("/myTaskList") + @Log(title = "我的任务", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo selMyTastList(String name, PageQuery pageQuery){ + return taskService.selMyTastList(name,pageQuery); + } + + + /**** + * 任务广场-任务详情 + * @param id + * @return + */ + @GetMapping("/taskListDetail") + @Log(title = "任务详情", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R selTaskListDetail(Long id){ + return R.ok(taskService.selTaskListDetail(id)); + } + + + /*** + * 请求任务 + * @param id 项目ID + * @param no 项目编码 + * @return + */ + @PostMapping("/accept") + @Log(title = "接收任务", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R acceptTask(Long id,String no){ + return R.ok(taskService.acceptTask(id,no)); + } + + + + /*** + * 签到-项目列表 + * @return + */ + @PostMapping("/selMyCheckPro") + @Log(title = "签到项目列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R> selMyCheckPro(){ + return R.ok(taskService.selMyCheckPro()); + } + + + + + /*** + * 我的任务-任务详情 + * @return + */ + @GetMapping("/myTaskDetail") + @Log(title = "我的任务-任务详情", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R selMyTaskDetail(Long id){ + return R.ok(taskService.selMyTaskDetail(id)); + } + + + + + /*** + * 我的任务-提交完工报告 + * @return + */ + @PostMapping("/updOverReport") + @Log(title = "我的任务-提交完工报告", businessType = BusinessType.UPDATE,operatorType= OperatorType.MOBILE) + public R updOverReport(MerTaskEnroll enroll){ + return R.ok(taskService.updOverReport(enroll)); + } + + + /*** + * 我的任务-查询完工报告 + * @return + */ + @GetMapping("/getOverReport") + @Log(title = "我的任务-查看完工报告", businessType = BusinessType.UPDATE,operatorType= OperatorType.MOBILE) + public R selOverReport(Long id) { + return R.ok(taskService.selOverReport(id)); + } + + + + /*** + * 我的合同列表 + * @param name + * @param pageQuery + * @return + */ + @GetMapping("/getMyHts") + @Log(title = "我的合同列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo getMyHts(String name, PageQuery pageQuery){ + return taskService.selMyHtList(name,pageQuery); + } + + + + /*** + * + * 我的项目确认单 + * @param name + * @param pageQuery + * @return + * + */ + @GetMapping("/proSureDoc") + @Log(title = "我的项目确认单", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo selProSureDoc(String name, PageQuery pageQuery){ + return taskService.selProSureDoc(name,pageQuery); + } + + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getSignUrl") + @Log(title = "获取签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getSignUrl(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signPro(id,domain)); + } + + + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getSureSigUrl") + @Log(title = "获取确认单签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R signSurePro(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signSurePro(id,domain)); + } + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getJzqSignUrl") + @GetMapping("/getSignUrl") + @Log(title = "获取签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getJzqSignUrl(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signProJzq(id,domain)); + } + + + + /*** + * 获取签约信息 + * @param id + * @param domain + * @return + * @throws Exception + */ +// @GetMapping("/getJzqSureSigUrl") + @GetMapping("/getSureSigUrl") + @Log(title = "获取确认单签约信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R JzqsignSurePro(Long id,String domain)throws Exception{ + return R.ok("",this.taskService.signSureProJzq(id,domain)); + } + + + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java new file mode 100644 index 0000000..6bc083f --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SettlementAccountController.java @@ -0,0 +1,71 @@ +package org.dromara.mp.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; +import org.dromara.mp.service.ISettlementAccountService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SettlementAccountController + * @description 个人中心-结算账户 + * @create 2024-05-08 14:09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sac") +@Slf4j +public class SettlementAccountController extends BaseController { + + + @Resource + private ISettlementAccountService settlementAccountService; + + + /*** + * 获取结算通道 + * @return + */ + @GetMapping("/getSettleChannel") + @Log(title = "获取结算通道", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + +// @Log(title = "公众号获取结算通道", businessType = BusinessType.SELECT) + public R getSettleChannel(){ + return R.ok(this.settlementAccountService.getSettleChannel()); + } + + + + @GetMapping("/getBanks") + @Log(title = "获取银行列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) +// @Log(title = "公众号获取银行", businessType = BusinessType.SELECT) + public R getBankList(String bankName){ + return R.ok(this.settlementAccountService.getBankList(bankName)); + } + + + + + @GetMapping("/getDetail") +// @Log(title = "公众号获取银行卡详情", businessType = BusinessType.SELECT) + @Log(title = "获取银行卡详情", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getBankDetail(Long id){ + return R.ok(this.settlementAccountService.getBankDetail(id)); + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java new file mode 100644 index 0000000..8d9708a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/SysUnitDomainController.java @@ -0,0 +1,53 @@ +package org.dromara.mp.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.web.core.BaseController; +import org.dromara.mp.domain.vo.SysUnitDomainVo; +import org.dromara.mp.service.ISysUnitDomainService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 单位域名配置 + * 前端访问路由地址为:/mp/unitDomain + * + * @author LionLi + * @date 2024-04-07 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/unitDomain") +public class SysUnitDomainController extends BaseController { + + private final ISysUnitDomainService sysUnitDomainService; + + /** + * 查询单位域名配置列表 + */ + @GetMapping("/selSiteInfo") + @SaIgnore + @Log(title = "查询单位域名配置列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R list(String mpDomain) { + return R.ok(sysUnitDomainService.queryByMpDomain(mpDomain)); + } + + + + @GetMapping("/sendSms") + @SaIgnore + @Log(title = "发送短信验证码", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R sendSms(String phone,String domainCode){ + return R.ok(this.sysUnitDomainService.sendSms(phone,domainCode)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java new file mode 100644 index 0000000..a06f78a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkCheckinController.java @@ -0,0 +1,102 @@ +package org.dromara.mp.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import org.dromara.common.log.enums.OperatorType; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.mp.service.IUserWorkCheckinService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者打卡记录 + * 前端访问路由地址为:/mp/workCheckin + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workCheckin") +public class UserWorkCheckinController extends BaseController { + + private final IUserWorkCheckinService userWorkCheckinService; + + /** + * 查询自雇者打卡记录列表 + */ + @GetMapping("/list") + @Log(title = "查询自雇者打卡记录列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R> list(UserWorkCheckinBo bo, PageQuery pageQuery) { + bo.setUserWorkId(MpLoginHelper.getUserId()); + return R.ok(userWorkCheckinService.queryList(bo)); + } + + /** + * 导出自雇者打卡记录列表 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkCheckinBo bo, HttpServletResponse response) { + List list = userWorkCheckinService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者打卡记录", UserWorkCheckinVo.class, response); + } + + /** + * 获取自雇者打卡记录详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + @Log(title = "获取自雇者打卡记录详细信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkCheckinService.queryById(id)); + } + + /** + * 新增自雇者打卡记录 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.INSERT) + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkCheckinBo bo) { + bo.setUserWorkId(MpLoginHelper.getUserId()); + return toAjax(userWorkCheckinService.insertByBo(bo)); + } + + /** + * 修改自雇者打卡记录 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.UPDATE) + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkCheckinBo bo) { + return toAjax(userWorkCheckinService.updateByBo(bo)); + } + + /** + * 删除自雇者打卡记录 + * + * @param ids 主键串 + */ + @Log(title = "自雇者打卡记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkCheckinService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java new file mode 100644 index 0000000..5eea04a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/UserWorkerController.java @@ -0,0 +1,115 @@ +package org.dromara.mp.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.log.enums.OperatorType; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.service.IUserWorkerService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者 + * 前端访问路由地址为:/mp/worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/worker") +public class UserWorkerController extends BaseController { + + private final IUserWorkerService userWorkerService; + + + + + + + + + /** + * 查询自雇者列表 + */ + @SaCheckPermission("mp:worker:list") + @GetMapping("/list") + @Log(title = "查询自雇者列表", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public TableDataInfo list(UserWorkerBo bo, PageQuery pageQuery) { + return userWorkerService.queryPageList(bo, pageQuery); + } + + /** + * 导出自雇者列表 + */ + @SaCheckPermission("mp:worker:export") + @Log(title = "自雇者", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkerBo bo, HttpServletResponse response) { + List list = userWorkerService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者", UserWorkerVo.class, response); + } + + /** + * 获取自雇者详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("mp:worker:query") + @GetMapping("/{id}") + @Log(title = "获取自雇者详细信息", businessType = BusinessType.SELECT,operatorType= OperatorType.MOBILE) + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerService.queryById(id)); + } + + /** + * 新增自雇者 + */ + @SaCheckPermission("mp:worker:add") + @Log(title = "自雇者", businessType = BusinessType.INSERT) + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.insertByBo(bo)); + } + + /** + * 修改自雇者 + */ + @SaCheckPermission("mp:worker:edit") + @Log(title = "自雇者", businessType = BusinessType.UPDATE) + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.updateByBo(bo)); + } + + /** + * 删除自雇者 + * + * @param ids 主键串 + */ + @SaCheckPermission("mp:worker:remove") + @Log(title = "自雇者", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerService.deleteWithValidByIds(List.of(ids), true)); + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java new file mode 100644 index 0000000..2a1dd7b --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/controller/dome.java @@ -0,0 +1,222 @@ +package org.dromara.mp.controller; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@RequestMapping("/demo") +public class dome { + + @PostMapping(value = "/testV3") + public String testV3()throws Exception + { +// String apiUrl = "http://192.168.124.5:8090/openAPI/contractSign/v3/becomeSilentSaveSign"; // 替换为实际的API地址 + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v3/becomeSilentSaveSign"; // 替换为实际的API地址 + // 构建请求参数对象 + BecomeSilentSaveSingleSignatureDto becomeSilentSaveSignDto = new BecomeSilentSaveSingleSignatureDto(); + becomeSilentSaveSignDto.setApplicationId("2205026100");//应用id + becomeSilentSaveSignDto.setBusinessId("95d6eb9ae14b4b6f8770467a37132c82");//合作方ID + becomeSilentSaveSignDto.setContractName("测试合同9220");//合同名称 + becomeSilentSaveSignDto.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + becomeSilentSaveSignDto.setLaunchSubject("13839900475");//发起用户手机号 + becomeSilentSaveSignDto.setLaunchEnterpriseName("郑州沃薪科技有限公司");//发起企业名称(launchType为1企业发起合同时必传) + becomeSilentSaveSignDto.setSignEnterpriseName("郑州沃薪科技有限公司");//静默签署企业名 + +// becomeSilentSaveSignDto.setSignEnterpriseName("常州钢构建设工程有限公司厦门分公司");//静默签署企业名 + becomeSilentSaveSignDto.setCustomerOriginationNumber("8374673663338222");//客户发起时定义的编号 + becomeSilentSaveSignDto.setInputValues("郑州沃薪科技有限公司,孙泽星,41152119850526,王舟舟,郑州沃薪科技有限公司,郑州沃薪科技有限公司,郑州沃薪科技有限公司,郑州沃薪科技有限公司,2024-05-31");//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + becomeSilentSaveSignDto.setContractModelNum("2024053111351717126553386040");//模板编号 + becomeSilentSaveSignDto.setSignatureType("0"); + List> data=new ArrayList<>(); + Map map = new HashMap<>(); + map.put("userName","孙泽星");//经办人姓名 + map.put("userPhone","15981832697");//经办人手机号 + map.put("type","0");//类型 0-个人 1-企业 + map.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + // map.put("type","1");//类型 0-个人 1-企业 + // map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + // map.put("enterpriseName","贵州省七进制科技有限公司");//企业名称(类型type为1时必传) + data.add(map); + String s = JSONObject.toJSONString(data); + becomeSilentSaveSignDto.setSignatoryInfos(s);//签署方相关信息 + + String response = callThirdPartyApi(apiUrl, becomeSilentSaveSignDto); + + + System.out.println(response); + return null; + + } + + + public static void main(String[] args) throws Exception{ + dome d = new dome(); + d.testV3(); + } + + + + @PostMapping(value = "/testV4") + public String testV4()throws Exception + { +// String apiUrl = "http://192.168.124.5:8090/openAPI/contractSign/v4/becomeSilentSaveSign"; // 替换为实际的API地址 + + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v2/becomeSilentSaveSign"; + //String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v4/becomeSilentSaveSign"; // 替换为实际的API地址 + // 构建请求参数对象 + BecomeSilentSaveSingleSignatureDto becomeSilentSaveSignDto = new BecomeSilentSaveSingleSignatureDto(); + becomeSilentSaveSignDto.setApplicationId("2205026100");//应用id + becomeSilentSaveSignDto.setBusinessId("95d6eb9ae14b4b6f8770467a37132c82");//合作方ID + becomeSilentSaveSignDto.setContractName("测试合同92");//合同名称 + becomeSilentSaveSignDto.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + becomeSilentSaveSignDto.setLaunchSubject("18137182576");//发起用户手机号 + becomeSilentSaveSignDto.setLaunchEnterpriseName("郑州沃薪科技有限公司");//发起企业名称(launchType为1企业发起合同时必传) + becomeSilentSaveSignDto.setCustomerOriginationNumber("83746736681111223");//客户发起时定义的编号 + becomeSilentSaveSignDto.setInputValues("");//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + becomeSilentSaveSignDto.setSignatureType("0"); +// becomeSilentSaveSignDto.setInputValues("");//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 +// becomeSilentSaveSignDto.setContractModelNum("2024041717141713345299606662");//模板编号 + becomeSilentSaveSignDto.setContractModelNum("2024041717141713345299606662");//模板编号 + + +// 2024041717001713344451988901 + PcSignatoryDto pc = new PcSignatoryDto(); + pc.setUserName("罗啊啊");//姓名 + pc.setUserPhone("15981832697");//手机号 + pc.setEnterpriseName("常州钢构建设分公司");//公司名称 + pc.setSignMode("1");//1用户手绘章 2用户模板章 3企业章 4合同章 5法人章 +// pc.setSignLevel(1);//签署顺序 + pc.setType(0);//类型 0-个人 1-企业 + + + PcSignatoryDto pc1 = new PcSignatoryDto(); + pc1.setUserName("孙**");//姓名 + pc1.setUserPhone("1563**090");//手机号 + pc1.setSignMode("1");//1用户手绘章 2用户模板章 3企业章 4合同章 5法人章 + pc1.setSignLevel(2);//签署顺序 + pc1.setType(0);//类型 0-个人 1-企业 + + + PcSignatoryDto pc2 = new PcSignatoryDto(); + pc2.setUserName("魏**");//姓名 + pc2.setUserPhone("1563**090");//手机号 + pc2.setSignMode("1");//1用户手绘章 2用户模板章 3企业章 4合同章 5法人章 + pc2.setSignLevel(3);//签署顺序 + pc2.setType(0);//类型 0-个人 1-企业 + List enterpriseSignDtoList=new ArrayList<>(); + enterpriseSignDtoList.add(pc); +// enterpriseSignDtoList.add(pc1); +// enterpriseSignDtoList.add(pc2); +// becomeSilentSaveSignDto.setSignatoryInfos(enterpriseSignDtoList); + + String response = callThirdPartyApi(apiUrl, becomeSilentSaveSignDto); + System.out.println(response); + + + return null; + } + + + public static String callThirdPartyApi(String apiUrl, BecomeSilentSaveSingleSignatureDto becomeSilentSaveSignDto) throws IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(apiUrl); + + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = objectMapper.writeValueAsString(becomeSilentSaveSignDto); + + System.out.println(requestBody); + StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON); + httpPost.setEntity(requestEntity); + + CloseableHttpResponse response = httpClient.execute(httpPost); + try { + HttpEntity entity = response.getEntity(); + BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); + StringBuilder responseBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + responseBuilder.append(line); + } + return responseBuilder.toString(); + } finally { + response.close(); + } + } + + + + + +} + + + +@Data +class BecomeSilentSaveSingleSignatureDto{ + + private String applicationId; + + private String businessId; + + private String launchType; + + private String launchSubject; + + private String launchEnterpriseName; + + private String customerOriginationNumber; + private String contractModelNum; + private String signEnterpriseName; + private String contractName; + private String signatoryInfos; + + private String inputValues; + + private String signatureType; + + + + +// private List signatoryInfos; + + + + +} + + +@Data +class PcSignatoryDto{ + + private String userName; + + private String userPhone; + + private String enterpriseName; + + private String signMode; + + private Integer signLevel; + + private Integer type; + private String signType; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java new file mode 100644 index 0000000..96510d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskEnroll.java @@ -0,0 +1,108 @@ +package org.dromara.mp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 任务的报名对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_task_enroll") +public class MerTaskEnroll extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java new file mode 100644 index 0000000..30ae5c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/MerTaskSure.java @@ -0,0 +1,53 @@ +package org.dromara.mp.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author sunzexing + * @version 1.0 + * @title MerTaskSure + * @description 项目确认单 + * @create 2024-05-29 18:21 + */ + +@Data +public class MerTaskSure implements Serializable { + + private String proNo; + + private Integer signStatus; + + private String signUrl; + + private String sysName; + + private String taskTitle; + + private BigDecimal cost; + + private String workName; + + private String phone; + + private String cardId; + + private Long id; + + private String signNo; + + private String conPhone; + + private String conName; + + private String yyzz; + + private String conEmail; + + private String createTime; + + private String nsrSbh; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java new file mode 100644 index 0000000..3ee959d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/SysUnitDomain.java @@ -0,0 +1,137 @@ +package org.dromara.mp.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位域名配置对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_unit_domain") +public class SysUnitDomain extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + + private Integer openSms; + + private String smsConfig; + + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java new file mode 100644 index 0000000..28f1952 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/Test.java @@ -0,0 +1,65 @@ +package org.dromara.mp.domain; + +/** + * @author sunzexing + * @version 1.0 + * @title Test + * @description + * @create 2024-07-09 13:42 + */ +public class Test { + + //输入GCJ经纬度 转WGS纬度 + public static double WGSLat (double lat,double lon) { + double PI = 3.14159265358979324;//圆周率 + double a = 6378245.0;//克拉索夫斯基椭球参数长半轴a + double ee = 0.00669342162296594323;//克拉索夫斯基椭球参数第一偏心率平方 + double dLat = transformLat(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * PI; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI); + return (lat - dLat); + } + + //输入GCJ经纬度 转WGS经度 + public static double WGSLon (double lat,double lon) { + double PI = 3.14159265358979324;//圆周率 + double a = 6378245.0;//克拉索夫斯基椭球参数长半轴a + double ee = 0.00669342162296594323;//克拉索夫斯基椭球参数第一偏心率平方 + double dLon = transformLon(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * PI; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI); + return (lon - dLon); + } + + //转换经度所需 + public static double transformLon(double x, double y) { + double PI = 3.14159265358979324;//圆周率 + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + //转换纬度所需 + public static double transformLat(double x, double y) { + double PI = 3.14159265358979324;//圆周率 + double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + + public static void main(String[] args) { + + System.out.println(Test.WGSLat(39.894599,116.379443)); + System.out.println(Test.WGSLon(39.894599,116.379443)); + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java new file mode 100644 index 0000000..9951ae4 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkCheckin.java @@ -0,0 +1,89 @@ +package org.dromara.mp.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者打卡记录对象 user_work_checkin + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_work_checkin") +public class UserWorkCheckin extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 乐观锁 + */ + private Long revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long proId; + + /** + * 项目编码 + */ + private String proNum; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 自雇者id + */ + private Long userWorkId; + + /** + * 打开地址 + */ + private String addressInfo; + + /** + * 经度 + */ + private String longi; + + /** + * 纬度 + */ + private String lati; + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java new file mode 100644 index 0000000..366c4b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorker.java @@ -0,0 +1,220 @@ +package org.dromara.mp.domain; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker") +public class UserWorker extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 创建时间 + */ + @TableField(exist = false) + private Date createTime; + + /** + * 更新者 + */ + @TableField(exist = false) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(exist = false) + private Date updateTime; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 身份证正面图片 + */ + private String cardPositive; + + /** + * 身份证反面图片 + */ + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Integer isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + private Date issueDate; + + /** + * 失效日期 + */ + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + + private String bizToken; + + private Date tokenExpirDate; + + private Integer isFaceAuth; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java new file mode 100644 index 0000000..1e31570 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerAccount.java @@ -0,0 +1,92 @@ +package org.dromara.mp.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 自雇者账户对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_account") +public class UserWorkerAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 银行卡照片 + */ + private String bankCardPic; + + /** + * 预留手机号 + */ + private String phone; + + /** + * 结算通道 + */ + private String passage; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + private String cardType; + + + private Integer status; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java new file mode 100644 index 0000000..194f829 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/UserWorkerBiz.java @@ -0,0 +1,57 @@ +package org.dromara.mp.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerBiz + * @description + * @create 2024-05-20 18:34 + */ + +@Data +public class UserWorkerBiz implements Serializable { + + private Long id; + + private String cardId; + + + private String vPhone; + + + private String gsmc; + + + private String signUrl; + + private String viewUrl; + + + private String conPhone; + + private String yyzz; + + private String conEmail; + + + private String name; + + private String htCode; + + //联系人 + private String conName; + + private String cardPositive; + + private String cardBack; + + private Integer isCA; + + private String nsrSbh; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java new file mode 100644 index 0000000..a60eeac --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/MerTaskEnrollBo.java @@ -0,0 +1,123 @@ +package org.dromara.mp.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.mp.domain.MerTaskEnroll; + +import java.util.Date; + +/** + * 任务的报名业务对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaskEnroll.class, reverseConvertGenerate = false) +public class MerTaskEnrollBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 项目子编号 + */ + @NotBlank(message = "项目子编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 项目编号 + */ + @NotBlank(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskNo; + + /** + * 任务id + */ + @NotNull(message = "任务id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long taskId; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 自雇者微信openid + */ + @NotBlank(message = "自雇者微信openid不能为空", groups = { AddGroup.class, EditGroup.class }) + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + @NotNull(message = "竞标状态(1:竞标中 2:竞标失败 3:竞标成功)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 选定审核人 + */ + @NotBlank(message = "选定审核人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyBy; + + /** + * 选定审核时间 + */ + @NotNull(message = "选定审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + @NotNull(message = "完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer taskStatus; + + /** + * 验收备注 + */ + @NotBlank(message = "验收备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + @NotNull(message = "结算状态(0:待结算 1:已结算)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + @NotBlank(message = "任务确认书文件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskConfirmFile; + + /** + * 交付内容 + */ + @NotBlank(message = "交付内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskDesc; + + /** + * 交付图片 + */ + @NotBlank(message = "交付图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskPic; + + /** + * 报名时间 + */ + @NotNull(message = "报名时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java new file mode 100644 index 0000000..64edf8d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/SysUnitDomainBo.java @@ -0,0 +1,151 @@ +package org.dromara.mp.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.mp.domain.SysUnitDomain; + +/** + * 单位域名配置业务对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUnitDomain.class, reverseConvertGenerate = false) +public class SysUnitDomainBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 域名地址 + */ + @NotBlank(message = "域名地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String domainName; + + /** + * 站点名称 + */ + @NotBlank(message = "站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String websiteName; + + /** + * 客服热线 + */ + @NotBlank(message = "客服热线不能为空", groups = { AddGroup.class, EditGroup.class }) + private String hotline; + + /** + * 版权信息 + */ + @NotBlank(message = "版权信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyright; + + /** + * 备案号 + */ + @NotBlank(message = "备案号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String recordNo; + + /** + * 备案号链接地址 + */ + @NotBlank(message = "备案号链接地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @NotBlank(message = "PC登录页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @NotBlank(message = "PC登录页广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @NotBlank(message = "PC主页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String homePageLogo; + + /** + * 手机端LOGO + */ + @NotBlank(message = "手机端LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapLogo; + + /** + * 手机端广告图 + */ + @NotBlank(message = "手机端广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @NotBlank(message = "微信公众号站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String weChatPub; + + + + /** + * PC登录协议 + */ + @NotBlank(message = "PC登录协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @NotBlank(message = "手机端用户协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @NotBlank(message = "私有协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @NotNull(message = "状态(1:正常 2:禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @NotNull(message = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @NotNull(message = "主体id(结算中心id或运营商id或渠道商id或商户id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busId; + + + private Integer openSms; + + private String smsConfig; + + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java new file mode 100644 index 0000000..0873025 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWokerOperBo.java @@ -0,0 +1,79 @@ +package org.dromara.mp.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWokerOperBo + * @description + * @create 2024-04-29 11:40 + */ + +@Data +public class UserWokerOperBo implements Serializable { + + //企业ID + @NotNull(message = "企业ID不能为空", groups = { AddGroup.class }) + private Long merId; + + //企业编号 + @NotNull(message = "企业编号不能为空", groups = { AddGroup.class }) + private String merNo; + + //服务商编号 + @NotNull(message = "服务商编号不能为空", groups = { AddGroup.class }) + private String sydNo; + + //服务商ID + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class }) + private Long sydId; + + //姓名 + @NotNull(message = "姓名不能为空", groups = { AddGroup.class }) + private String workName; + + //身份证 + @NotNull(message = "身份证不能为空", groups = { AddGroup.class }) + private String idCard; + + //手机号 + @NotNull(message = "手机号不能为空", groups = { AddGroup.class }) + private String phone; + + //业务类型 + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class }) + private Integer busType; + + //开户行名称 + @NotNull(message = "开户行名称不能为空", groups = { AddGroup.class }) + private String khh; + + //开户行名称 + @NotNull(message = "开户行账号不能为空", groups = { AddGroup.class }) + private String backCard; + + private String code; + + //身份证正面 + private String cardPositive; + + //身份证反面 + private String cardBack; + + //银行卡照片 + private String bankPic; + + //人脸照片 + private String facePic; + + private Long workId; + + private String channelName; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java new file mode 100644 index 0000000..2898c15 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkCheckinBo.java @@ -0,0 +1,97 @@ +package org.dromara.mp.domain.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 自雇者打卡记录业务对象 user_work_checkin + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode() +@AutoMapper(target = UserWorkCheckin.class, reverseConvertGenerate = false) +public class UserWorkCheckinBo extends BaseEntity { + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + + /** + * 乐观锁 + */ + private Long revision; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 主键id + */ + private Long id; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 项目编码 + */ + private String proNum; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 自雇者id + */ + private Long userWorkId; + + /** + * 打开地址 + */ + @NotBlank(message = "打开地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addressInfo; + + /** + * 经度 + */ + private String longi; + + /** + * 纬度 + */ + private String lati; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java new file mode 100644 index 0000000..1b79f1e --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerAccountBo.java @@ -0,0 +1,91 @@ +package org.dromara.mp.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.mp.domain.UserWorkerAccount; + +import java.util.Date; + +/** + * 自雇者账户业务对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerAccount.class, reverseConvertGenerate = false) +public class UserWorkerAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 银行卡照片 + */ + @NotBlank(message = "银行卡照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCardPic; + + /** + * 预留手机号 + */ + @NotBlank(message = "预留手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + + private String cardType; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java new file mode 100644 index 0000000..185b585 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/bo/UserWorkerBo.java @@ -0,0 +1,202 @@ +package org.dromara.mp.domain.bo; + +import org.dromara.mp.domain.UserWorker; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 自雇者业务对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorker.class, reverseConvertGenerate = false) +public class UserWorkerBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class}) + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class}) + private String cardId; + + /** + * 身份证正面图片 + */ + @NotBlank(message = "身份证正面图片不能为空", groups = { AddGroup.class}) + private String cardPositive; + + /** + * 身份证反面图片 + */ + @NotBlank(message = "身份证反面图片不能为空", groups = { AddGroup.class}) + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date issueDate; + + /** + * 失效日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + private String bizToken; + + private Date tokenExpirDate; + + private Integer isFaceAuth; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java new file mode 100644 index 0000000..74366b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardOcrVo.java @@ -0,0 +1,59 @@ +package org.dromara.mp.domain.vo; + +public class BankCardOcrVo { + private String cardNo; // 银行卡号 (必返) + private String bankName; // 发卡行名称 (必返) + private String orderNo; // 流水号 (必返) + private int executeStatus; // 执行状态(0:success;1:fail) (必返) + private String resultMessage; // 返回信息 (必返) + private String validDate; // 银行卡有效期 (必返) + + // Getters and Setters + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public int getExecuteStatus() { + return executeStatus; + } + + public void setExecuteStatus(int executeStatus) { + this.executeStatus = executeStatus; + } + + public String getResultMessage() { + return resultMessage; + } + + public void setResultMessage(String resultMessage) { + this.resultMessage = resultMessage; + } + + public String getValidDate() { + return validDate; + } + + public void setValidDate(String validDate) { + this.validDate = validDate; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java new file mode 100644 index 0000000..9666773 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/BankCardVo.java @@ -0,0 +1,27 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BankCardVo + * @description 银行卡信息 + * @create 2024-04-02 13:38 + */ + +@Data +public class BankCardVo implements Serializable { + + private String cardNo; + + private String bankInfo; + + private String cardType; + + private String cardName; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java new file mode 100644 index 0000000..3b8bfb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/IdCardVo.java @@ -0,0 +1,113 @@ +package org.dromara.mp.domain.vo; + +public class IdCardVo { + private String address; // 户籍地住址(上传人像面时必返) + private String birthday; // 出生日期(上传人像面时必返) + private String gender; // 性别(上传人像面时必返) + private String idNo; // 身份证号码 (上传人像面时必返) + private String name; // 姓名(上传人像面时必返) + private String nation; // 民族(上传人像面时必返) + private String issuingAuthority; // 发证机关(上传国徽面时必返) + private String issuingTime; // 有效期开始时间(上传国徽面时必返) + private String overdueTime; // 有效期结束时间(上传国徽面时必返) + private String orderNo; // 流水号 (必返) + private int executeStatus; // 执行状态(0:success;1:fail) (必返) + private String resultMessage; // 结果消息 + + // Getters and Setters + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getIdNo() { + return idNo; + } + + public void setIdNo(String idNo) { + this.idNo = idNo; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getIssuingAuthority() { + return issuingAuthority; + } + + public void setIssuingAuthority(String issuingAuthority) { + this.issuingAuthority = issuingAuthority; + } + + public String getIssuingTime() { + return issuingTime; + } + + public void setIssuingTime(String issuingTime) { + this.issuingTime = issuingTime; + } + + public String getOverdueTime() { + return overdueTime; + } + + public void setOverdueTime(String overdueTime) { + this.overdueTime = overdueTime; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public int getExecuteStatus() { + return executeStatus; + } + + public void setExecuteStatus(int executeStatus) { + this.executeStatus = executeStatus; + } + + public String getResultMessage() { + return resultMessage; + } + + public void setResultMessage(String resultMessage) { + this.resultMessage = resultMessage; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java new file mode 100644 index 0000000..0a1b98f --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MerTaskEnrollVo.java @@ -0,0 +1,152 @@ +package org.dromara.mp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.mp.domain.MerTaskEnroll; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 任务的报名视图对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaskEnroll.class) +public class MerTaskEnrollVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 项目子编号 + */ + @ExcelProperty(value = "项目子编号") + private String no; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + /** + * 任务id + */ + @ExcelProperty(value = "任务id") + private Long taskId; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 自雇者微信openid + */ + @ExcelProperty(value = "自雇者微信openid") + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + @ExcelProperty(value = "竞标状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:竞标中,2=:竞标失败,3=:竞标成功") + private Long verifyStatus; + + /** + * 选定审核人 + */ + @ExcelProperty(value = "选定审核人") + private String verifyBy; + + /** + * 选定审核时间 + */ + @ExcelProperty(value = "选定审核时间") + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + @ExcelProperty(value = "完工状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未完成,1=:已完成,2=:验收驳回,3=:验收通过") + private Integer taskStatus; + + /** + * 验收备注 + */ + @ExcelProperty(value = "验收备注") + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + @ExcelProperty(value = "结算状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待结算,1=:已结算") + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + @ExcelProperty(value = "任务确认书文件地址") + private String taskConfirmFile; + + /** + * 交付内容 + */ + @ExcelProperty(value = "交付内容") + private String taskDesc; + + /** + * 交付图片 + */ + @ExcelProperty(value = "交付图片") + private String taskPic; + + /** + * 报名时间 + */ + @ExcelProperty(value = "报名时间") + private Date addTime; + + + @ExcelProperty(value = "任务标题") + private String name; + + + private Integer signStatus; + + /*** + * 获取确认单状态 0 未确认, 1确认 + * @return + */ + public Integer getDocStatus() { + if(this.signStatus != null && this.signStatus == 1){ + return 1; + }else{ + return 0; + } + } + + private Integer docStatus; + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java new file mode 100644 index 0000000..4e6ed2d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/MyTaskVo.java @@ -0,0 +1,88 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskVo + * @description + * @create 2024-05-08 18:42 + */ + +@Data +public class MyTaskVo implements Serializable { + + + //任务ID + private Long id; + + //任务标题 + private String proName; + + //佣金 + private Long yj; + + //最大佣金 + private Long maxYj; + + //行业 + private String hy; + + + //佣金 + private String yjStr; + + //项目编号 + private String no; + + + //派单类型 + private Integer proType; + + + private Date createTime; + + + //发布时间 + private String publishTime; + + + + //派单类型中文 + private String proTypeStr; + + //竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + private Integer verifyStatus; + + //完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + private Integer taskStatus; + + public String getYjStr() { + return StringUtils.fenToYuanFormatter(this.yj); + } + + + + public String getProTypeStr() { + + if(this.proType != null){ + if( 1 == proType ){ + return "派单"; + }else{ + return "抢单"; + } + }else{ + return "--"; + } + + } + + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java new file mode 100644 index 0000000..099ca11 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SettlementChannelVo.java @@ -0,0 +1,32 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title SettlementChannelVo + * @description + * @create 2024-05-08 18:02 + */ + +@Data +public class SettlementChannelVo implements Serializable { + + private Long id; + + //通道名称 + private String channelName; + + //银行卡号 + private String bankCard; + + //银行名称 + private String bankName; + + //卡类型 + private String cardType; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java new file mode 100644 index 0000000..810b6af --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/SysUnitDomainVo.java @@ -0,0 +1,150 @@ +package org.dromara.mp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.mp.domain.SysUnitDomain; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 单位域名配置视图对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUnitDomain.class) +public class SysUnitDomainVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 域名地址 + */ + @ExcelProperty(value = "域名地址") + private String domainName; + + /** + * 站点名称 + */ + @ExcelProperty(value = "站点名称") + private String websiteName; + + /** + * 客服热线 + */ + @ExcelProperty(value = "客服热线") + private String hotline; + + /** + * 版权信息 + */ + @ExcelProperty(value = "版权信息") + private String copyright; + + /** + * 备案号 + */ + @ExcelProperty(value = "备案号") + private String recordNo; + + /** + * 备案号链接地址 + */ + @ExcelProperty(value = "备案号链接地址") + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @ExcelProperty(value = "PC登录页LOGO") + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @ExcelProperty(value = "PC登录页广告图") + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @ExcelProperty(value = "PC主页LOGO") + private String homePageLogo; + + /** + * 手机端LOGO + */ + @ExcelProperty(value = "手机端LOGO") + private String wapLogo; + + /** + * 手机端广告图 + */ + @ExcelProperty(value = "手机端广告图") + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @ExcelProperty(value = "微信公众号站点名称") + private String weChatPub; + + + /** + * PC登录协议 + */ + @ExcelProperty(value = "PC登录协议") + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @ExcelProperty(value = "手机端用户协议") + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @ExcelProperty(value = "私有协议") + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:禁用") + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)") + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @ExcelProperty(value = "主体id(结算中心id或运营商id或渠道商id或商户id)") + private Long busId; + + + private String mpDomainHashCode; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java new file mode 100644 index 0000000..3659506 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/TaskVo.java @@ -0,0 +1,89 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title TaskVo + * @description + * @create 2024-05-09 14:06 + */ +@Data +public class TaskVo implements Serializable { + + + private Long id; + + private Long taskId; + + private String proName; + + private String no; + + private Long yj; + + private Long maxYj; + + private Integer classify; + + public String getyJStr() { + if(classify != null){ + if(classify == 1){ + return StringUtils.fenToYuanFormatter(this.yj)+" ~ "+StringUtils.fenToYuanFormatter(this.maxYj); + }else{ + return StringUtils.fenToYuanFormatter(this.yj); + } + + }else{ + return ""; + } + + } + private String yjStr; + + private String hy; + + private Date createTime; + + private String proContent; + + public String getMerName() { + return StringUtils.merNameHide(this.merName); + } + + private String merName; + + private Date merCreateTime; + + private Integer merIsAuth; + + private Integer verifyStatus; + + private String taskDesc; + + private String taskPic; + + private String taskRemark; + + private String taskConfirmFile; + + private Integer taskStatus; + + + + + + //签到信息 + private List checkInVolist = new ArrayList<>(); + + + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java new file mode 100644 index 0000000..2d982d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkCheckinVo.java @@ -0,0 +1,106 @@ +package org.dromara.mp.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.mp.domain.UserWorkCheckin; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者打卡记录视图对象 user_work_checkin + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkCheckin.class) +public class UserWorkCheckinVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 乐观锁 + */ + @ExcelProperty(value = "乐观锁") + private Long revision; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String createdBy; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createdTime; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private String updatedBy; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 项目id + */ + @ExcelProperty(value = "项目id") + private Long proId; + + /** + * 项目编码 + */ + @ExcelProperty(value = "项目编码") + private String proNum; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updatedTime; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long userWorkId; + + /** + * 打开地址 + */ + @ExcelProperty(value = "打开地址") + private String addressInfo; + + /** + * 经度 + */ + @ExcelProperty(value = "经度") + private String longi; + + /** + * 纬度 + */ + @ExcelProperty(value = "纬度") + private String lati; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java new file mode 100644 index 0000000..7297063 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerAccountVo.java @@ -0,0 +1,112 @@ +package org.dromara.mp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.mp.domain.UserWorkerAccount; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 自雇者账户视图对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerAccount.class) +public class UserWorkerAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 银行卡照片 + */ + @ExcelProperty(value = "银行卡照片") + private String bankCardPic; + + + /** + * 预留手机号 + */ + @ExcelProperty(value = "预留手机号") + private String phone; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + + private String cardType; + + //用工姓名 + private String name; + + private Integer status; + + public String getPhone() { + return this.phone; +// if(StringUtils.isNotEmpty(this.phone)){ +// return StringUtils.phoneHide(this.phone); +// }else{ +// return "--"; +// } + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java new file mode 100644 index 0000000..21a7574 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerBus.java @@ -0,0 +1,31 @@ +package org.dromara.mp.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerBus + * @description + * @create 2024-05-10 18:32 + */ +@Data +public class UserWorkerBus implements Serializable { + + private Long id; + + private String signSub; + + private String htNo; + + private Integer signStatus; + + private String webUrl; + + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java new file mode 100644 index 0000000..202ac8b --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/domain/vo/UserWorkerVo.java @@ -0,0 +1,243 @@ +package org.dromara.mp.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.mp.domain.UserWorker; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者视图对象 user_worker + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorker.class) +public class UserWorkerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 微信openid + */ + @ExcelProperty(value = "微信openid") + private String openId; + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String name; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + @ExcelProperty(value = "银行卡是否认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuthentication; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 身份证正面图片 + */ + @ExcelProperty(value = "身份证正面图片") + private String cardPositive; + + /** + * 身份证反面图片 + */ + @ExcelProperty(value = "身份证反面图片") + private String cardBack; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + @ExcelProperty(value = "是否实名认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + @ExcelProperty(value = "是否签约", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isSign; + + /** + * 签约时间 + */ + @ExcelProperty(value = "签约时间") + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + @ExcelProperty(value = "是否临时税务登记", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isRegister; + + /** + * 人脸照片 + */ + @ExcelProperty(value = "人脸照片") + private String photoPath; + + /** + * 性别 + */ + @ExcelProperty(value = "性别") + private String sex; + + /** + * 标签 + */ + @ExcelProperty(value = "标签") + private String tag; + + /** + * 区域编码 + */ + @ExcelProperty(value = "区域编码") + private String userArea; + + /** + * 区域名称 + */ + @ExcelProperty(value = "区域名称") + private String userAreaName; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 民族 + */ + @ExcelProperty(value = "民族") + private String nation; + + /** + * 户籍地址 + */ + @ExcelProperty(value = "户籍地址") + private String address; + + /** + * 出生日期 + */ + @ExcelProperty(value = "出生日期") + private Date birthday; + + /** + * 签发机关 + */ + @ExcelProperty(value = "签发机关") + private String issue; + + /** + * 签发日期 + */ + @ExcelProperty(value = "签发日期") + private Date issueDate; + + /** + * 失效日期 + */ + @ExcelProperty(value = "失效日期") + private String expiryDate; + + /** + * 推荐人 + */ + @ExcelProperty(value = "推荐人") + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:启用,2=:禁用") + private Integer status; + + + @ExcelIgnore + private String bizToken; + + @ExcelIgnore + private Date tokenExpirDate; + + @ExcelIgnore + private Integer isFaceAuth; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java new file mode 100644 index 0000000..dc92b26 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/dubbo/RemoteUserWorkerServiceImpl.java @@ -0,0 +1,83 @@ +package org.dromara.mp.dubbo; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.map.api.RemoteUserWokerService; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.IUserWorkerService; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWorkerServiceImpl + * @description + * @create 2024-03-29 10:57 + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteUserWorkerServiceImpl implements RemoteUserWokerService { + + + @Resource + private IUserWorkerService userWorkerService; + + @Resource + private UserWorkerMapper userWorkerMapper; + + + @Override + public LoginMpUser selectUserWorkByPhonenumer(String phonenumber, String tenantId) { + return TenantHelper.dynamic(phonenumber,()->{ + UserWorker userWorker = userWorkerMapper.selectOne(new LambdaQueryWrapper() + .select(UserWorker::getPhone, UserWorker::getId,UserWorker::getStatus) + .eq(UserWorker::getPhone, phonenumber)); + if (ObjectUtil.isNotNull(userWorker)) { + if (userWorker.getStatus() == 2) { + throw new UserException("user.blocked", phonenumber); + } + LoginMpUser userWorkVo = getLoginMpUser(userWorker); + return userWorkVo; + }else{ + UserWorker uw = new UserWorker(); + uw.setPhone(phonenumber); + uw.setIsAuth(0); + uw.setStatus(1); + uw.setAddTime(DateUtil.date().toJdkDate()); + this.userWorkerMapper.insert(uw); + LoginMpUser userWorkVo = getLoginMpUser(uw); + +// LoginMpUser userWorkVo = new LoginMpUser(); +// userWorkVo.setUserId(IdUtil.getSnowflakeNextId()); + return userWorkVo; + } + }); + + } + + @NotNull + private LoginMpUser getLoginMpUser(UserWorker userWorker) { + LoginMpUser userWorkVo = new LoginMpUser(); + userWorkVo.setUserId(userWorker.getId()); + userWorkVo.setPhone(userWorker.getPhone()); + userWorkVo.setName(userWorker.getName()); +// userWorkVo.setIsAuth(userWorker.getIsAuth()); + return userWorkVo; + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java new file mode 100644 index 0000000..5e74ea9 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/BankCard4Exception.java @@ -0,0 +1,18 @@ +package org.dromara.mp.exception; + +import org.dromara.common.core.exception.base.BaseException; + +/** + * @author sunzexing + * @version 1.0 + * @title BankCard4 + * @description + * @create 2024-04-02 13:56 + */ +public class BankCard4Exception extends BaseException { + + public BankCard4Exception(String msg){ + super(msg); + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java new file mode 100644 index 0000000..271d919 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/exception/MpException.java @@ -0,0 +1,17 @@ +package org.dromara.mp.exception; + +import org.dromara.common.core.exception.base.BaseException; + +/** + * @author sunzexing + * @version 1.0 + * @title MpException + * @description + * @create 2024-04-07 15:37 + */ +public class MpException extends BaseException { + + public MpException(String msg){ + super(msg); + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java new file mode 100644 index 0000000..7e2aff3 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MerTaskEnrollMapper.java @@ -0,0 +1,16 @@ +package org.dromara.mp.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; + +/** + * 任务的报名Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerTaskEnrollMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java new file mode 100644 index 0000000..61c35a9 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/MyTaskMapper.java @@ -0,0 +1,116 @@ +package org.dromara.mp.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.mp.domain.MerTaskSure; +import org.dromara.mp.domain.UserWorkerBiz; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; +import org.dromara.mp.domain.vo.MyTaskVo; +import org.dromara.mp.domain.vo.TaskVo; +import org.dromara.mp.domain.vo.UserWorkerBus; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskMapper + * @description 我的任务接口 + * @create 2024-05-08 18:43 + */ +public interface MyTaskMapper { + + + /*** + * 任务广场查询 + * @param name + * @param workId + * @param page + * @return + */ + Page selTastList(@Param("name") String name,@Param("workId") Long workId, @Param("page") IPage page); + + + /**** + * 任务广场- 任务详情 + * @param id + * @return + */ + TaskVo selTaskListDetail(Long id); + + + /*** + * 我的任务 + * @param name + * @param workId + * @param page + * @return + */ + Page selectMyTaskList(@Param("name") String name,@Param("workId") Long workId, @Param("page") IPage page); + + + /*** + * 签到 查询项目 + * @param workId + * @return + */ + List selMyCheckPro(Long workId); + + + TaskVo selMyTaskDetail(@Param("id") Long id,@Param("workId") Long workId); + + + /*** + * 个人签约查询 + * @param workId + * @param page + * @return + */ + Page selHtListByWorkId(@Param("workId") Long workId, @Param("page") IPage page); + + + /**** + * 项目确认单查询 + * @param workId + * @param page + * @return + */ + Page selProSureDoc(@Param("workId") Long workId, @Param("page") IPage page); + + + /*** + * 获取合同信息 + * @param id + * @return + */ + UserWorkerBiz selectHtInfoByUwbId(Long id); + + + int updateUserWorkerHtInfoByBizId(UserWorkerBiz uwbiz); + + + /**** + * 项目确认单 + * @param id + * @return + */ + MerTaskSure selectTaskSure(Long id); + + + /*** + * 更新项目确认单 + * @param mts + * @return + */ + int updateTaskSure(MerTaskSure mts); + + + /** + * 更新CA状态 + */ + void updateCAStatus(String name); +} + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java new file mode 100644 index 0000000..95e315d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/SysUnitDomainMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mp.mapper; + +import org.dromara.mp.domain.SysUnitDomain; +import org.dromara.mp.domain.vo.SysUnitDomainVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 单位域名配置Mapper接口 + * + * @author LionLi + * @date 2024-04-07 + */ +public interface SysUnitDomainMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java new file mode 100644 index 0000000..812cecc --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkCheckinMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mp.mapper; + +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 自雇者打卡记录Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface UserWorkCheckinMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java new file mode 100644 index 0000000..204a4d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerAccountMapper.java @@ -0,0 +1,27 @@ +package org.dromara.mp.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.mp.domain.UserWorkerAccount; +import org.dromara.mp.domain.bo.UserWokerOperBo; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; + +import java.util.List; + + +/** + * 自雇者账户Mapper接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface UserWorkerAccountMapper extends BaseMapperPlus { + + + /*** + * 根据用工id,通道,银行卡号查询银行卡信息 + * @param bo + * @return + */ + public List selctBankInfoByUidChannelBankNo(UserWokerOperBo bo); + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java new file mode 100644 index 0000000..ab04165 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/mapper/UserWorkerMapper.java @@ -0,0 +1,15 @@ +package org.dromara.mp.mapper; + +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 自雇者Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface UserWorkerMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java new file mode 100644 index 0000000..c67ec61 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ICardIdService.java @@ -0,0 +1,111 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ICardIdService + * @description 身份证信息 + * @create 2024-04-01 17:32 + */ +public interface ICardIdService { + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 19:24 + * 说明: + **/ + + public Map idCardOcr(MultipartFile file, String type, String code) throws Exception; + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 11:15 + * 说明: + **/ + + public Map bankUploadOcr(@RequestPart("file") MultipartFile file, String type, String code )throws Exception; + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 19:20 + * 说明: 身份认证结果,成功-生成人身核验连接 + **/ + Map submitIdCardInfo(UserWorkerBo userWorkerBo,String code) throws Exception; + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-17 14:57 + * 说明:银行卡3要素认证 + **/ + + public Map bankAuth4(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,String channelName)throws Exception; + + + /*** + * 修改银行卡信息 + * @param cardNo + * @param code + * @param bankImg + * @param bankInfo + * @param cardType + * @param cardName + * @param phone + * @param id + * @return + */ + public Boolean mdyBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,Long id)throws Exception; + + /*** + * 获取用户信息 + * @return + */ + Map getUserInfo(); + + + /*** + * 获取人身核验地址 + * @param code + * @return + */ + Map getFaceAuth(String code)throws Exception; + + + /**** + * 获取人脸核验的结果 + * @param bizToken + * @param code 唯一码 + * @return + */ + String getFaceAuthResult(String bizToken,String code)throws Exception; + + + + Map getUserCardInfo(); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java new file mode 100644 index 0000000..9c84aa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IMyTaskService.java @@ -0,0 +1,131 @@ +package org.dromara.mp.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.vo.MerTaskEnrollVo; +import org.dromara.mp.domain.vo.MyTaskVo; +import org.dromara.mp.domain.vo.TaskVo; +import org.dromara.mp.domain.vo.UserWorkerBus; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title IMyTaskService + * @description + * @create 2024-05-08 18:44 + */ +public interface IMyTaskService { + + + /*** + * 查询任务广场 + * @param name + * @param pageQuery + * @return + */ + TableDataInfo selTastList(String name, PageQuery pageQuery); + + + /*** + * 查询我的任务广场 + * @param name + * @param pageQuery + * @return + */ + TableDataInfo selMyTastList(String name, PageQuery pageQuery); + + + + /*** + * 任务广场-任务详情 + * @param id + * @return + */ + TaskVo selTaskListDetail(Long id); + + + /*** + * 接受任务 + * @param id 任务ID + * @param no 任务编码 + * @return + */ + Boolean acceptTask(Long id,String no); + + + List selMyCheckPro(); + + + TaskVo selMyTaskDetail(Long id); + + + /*** + * 上传完工报告 + * @param enroll + * @return + */ + int updOverReport(MerTaskEnroll enroll); + + + /*** + * 查询完工报告 + * @param id + * @return + */ + MerTaskEnrollVo selOverReport(Long id); + + + + TableDataInfo selMyHtList(String name, PageQuery pageQuery); + + + /*** + * 查询我的项目确认单 + * @param name + * @param pageQuery + * @return + */ + TableDataInfo selProSureDoc(String name, PageQuery pageQuery); + + + /*** + * 签到 + * @param id + * @param domain + * @return + * @throws Exception + */ + String signPro(Long id,String domain)throws Exception; + + /*** + * 签到 + * @param id + * @param domain + * @return + * @throws Exception + */ + String signProJzq(Long id,String domain)throws Exception; + + + + /*** + * 项目确认单连接 + * @param id + * @param domain + * @return + * @throws Exception + */ + public String signSurePro(Long id,String domain)throws Exception; + + /*** + * 项目确认单连接 + * @param id + * @param domain + * @return + * @throws Exception + */ + public String signSureProJzq(Long id,String domain)throws Exception; +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java new file mode 100644 index 0000000..3b27ec5 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISettlementAccountService.java @@ -0,0 +1,53 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.vo.SettlementChannelVo; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title ISettlementAccountService + * @description 个人中心-结算账户 + * @create 2024-05-08 14:10 + */ +public interface ISettlementAccountService { + + + /*** + * 获取结算渠道 + * @return + */ + List getSettleChannel(); + + /*** + * 获取银行列表 + * @param bankName + * @return + */ + List getBankList(String bankName); + + + /**** + * 添加结算账户 + * @param bankType + * @param name + * @param bankCard + * @param channelName + * @param phone + * @param bankPic + * @return + */ + int addAccount(String bankType, String name, String bankCard,String channelName,String phone, + String bankPic,String cardType); + + + /**** + * 获取银行卡详情 + * @param id + * @return + */ + UserWorkerAccountVo getBankDetail(Long id); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java new file mode 100644 index 0000000..1abf1bb --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/ISysUnitDomainService.java @@ -0,0 +1,99 @@ +package org.dromara.mp.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.mp.domain.SysUnitDomain; +import org.dromara.mp.domain.bo.SysUnitDomainBo; +import org.dromara.mp.domain.vo.SysUnitDomainVo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 单位域名配置Service接口 + * + * @author LionLi + * @date 2024-04-07 + */ +public interface ISysUnitDomainService { + + /** + * 查询单位域名配置 + */ + SysUnitDomainVo queryById(Long id); + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 15:11 + * 说明:根据域名查询配置信息 + **/ + SysUnitDomainVo queryByMpDomain(String mpDomain); + + +// +// /** +// * @Param +// * @Return +// * @Author sunzexing +// * @Date 2024-04-07 16:35 +// * 说明:获取短信配置 +// **/ +// +// Map selSmsConfig(String domainCode); + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:35 + * 说明:获取短信配置 + **/ + + SysUnitDomain selSmsConfig(String domainCode); + + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:36 + * 说明: 获取人脸核验,ocr等配置 + **/ + Map mpOtherThirdConfig(String domainCode); + + + + boolean sendSms(String phone,String domainCode); + + /** + * 查询单位域名配置列表 + */ + TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery); + + /** + * 查询单位域名配置列表 + */ + List queryList(SysUnitDomainBo bo); + + /** + * 新增单位域名配置 + */ + Boolean insertByBo(SysUnitDomainBo bo); + + /** + * 修改单位域名配置 + */ + Boolean updateByBo(SysUnitDomainBo bo); + + /** + * 校验并批量删除单位域名配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java new file mode 100644 index 0000000..0dcb75d --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkCheckinService.java @@ -0,0 +1,49 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自雇者打卡记录Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IUserWorkCheckinService { + + /** + * 查询自雇者打卡记录 + */ + UserWorkCheckinVo queryById(Long id); + + /** + * 查询自雇者打卡记录列表 + */ + TableDataInfo queryPageList(UserWorkCheckinBo bo, PageQuery pageQuery); + + /** + * 查询自雇者打卡记录列表 + */ + List queryList(UserWorkCheckinBo bo); + + /** + * 新增自雇者打卡记录 + */ + Boolean insertByBo(UserWorkCheckinBo bo); + + /** + * 修改自雇者打卡记录 + */ + Boolean updateByBo(UserWorkCheckinBo bo); + + /** + * 校验并批量删除自雇者打卡记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java new file mode 100644 index 0000000..8f47f2a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/IUserWorkerService.java @@ -0,0 +1,53 @@ +package org.dromara.mp.service; + +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 自雇者Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IUserWorkerService { + + /** + * 查询自雇者 + */ + UserWorkerVo queryById(Long id); + + /** + * 查询自雇者列表 + */ + TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery); + + + + + /** + * 查询自雇者列表 + */ + List queryList(UserWorkerBo bo); + + /** + * 新增自雇者 + */ + Boolean insertByBo(UserWorkerBo bo); + + /** + * 修改自雇者 + */ + Boolean updateByBo(UserWorkerBo bo); + + /** + * 校验并批量删除自雇者信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java new file mode 100644 index 0000000..49234f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/CardIdServiceImpl.java @@ -0,0 +1,986 @@ +package org.dromara.mp.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.lang.UUID; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ibm.icu.text.SimpleDateFormat; +import com.tencentcloudapi.common.AbstractModel; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.faceid.v20180301.FaceidClient; +import com.tencentcloudapi.faceid.v20180301.models.*; +import com.tencentcloudapi.ocr.v20181119.OcrClient; +import com.tencentcloudapi.ocr.v20181119.models.BankCardOCRRequest; +import com.tencentcloudapi.ocr.v20181119.models.BankCardOCRResponse; +import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest; +import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.map.api.domain.RemoteUserWorkerVo; +import org.dromara.map.api.model.LoginMpUser; +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.domain.UserWorkerAccount; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.*; +import org.dromara.mp.exception.BankCard4Exception; +import org.dromara.mp.exception.MpException; +import org.dromara.mp.mapper.UserWorkerAccountMapper; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.ICardIdService; +import org.dromara.mp.service.ISettlementAccountService; +import org.dromara.mp.service.ISysUnitDomainService; +import org.dromara.mp.service.IUserWorkerService; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.system.api.RemoteClientService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.*; +import java.text.ParseException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title CardIdService + * @description 身份信息 + * @create 2024-04-01 17:34 + */ +@Service +@Slf4j +public class CardIdServiceImpl extends BaseService implements ICardIdService { + + + @Resource + public ISysUnitDomainService unitDomainService; + + @Resource + public IUserWorkerService userWorkerService; + + @DubboReference + public RemoteFileService remoteFileService; + + + @DubboReference + public RemoteClientService remoteClientService; + + @DubboReference + public RemoteJzqService remoteJzqService; + + @Resource + public ISettlementAccountService settlementAccountService; + + + @Resource + public UserWorkerAccountMapper userWorkerAccountMapper; + + + @Resource + public UserWorkerMapper userWorkerMapper; + + + public static final long MAXSIZE = 1024*1024*5; + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 14:13 + * 说明:银行卡4要素认证 + **/ + + @Override + public Map bankAuth4(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,String channelName)throws Exception{ + Map result = new HashMap(); + + if(StringUtils.isEmpty(phone)){ + this.invalidationParamsException("银行预留手机号不能为空"); + } + + if(StringUtils.isEmpty(bankInfo)){ + this.invalidationParamsException("银行信息不能为空"); + } + + if(StringUtils.isEmpty(cardNo)){ + this.invalidationParamsException("银行卡号不能为空"); + } + Long userId = MpLoginHelper.getUserId(); + UserWorkerVo userWorker = this.userWorkerService.queryById(userId); + ThirdConf tc = this.getThirdConfig(code,"bankCard4Config"); + boolean tag = this.bankCard3(cardNo,userWorker.getName(),userWorker.getCardId()); + if(tag){ + int i = this.settlementAccountService.addAccount(bankInfo,userWorker.getName(),cardNo,channelName,phone,bankImg,cardType); + if( i <= 0){ + this.invalidationParamsException("添加银行卡失败!"); + } + } + + UserWorkerBo bo = new UserWorkerBo(); + bo.setId(userWorker.getId()); + bo.setIsAuthentication(1L); + bo.setUpdateTime(new Date()); + this.userWorkerService.updateByBo(bo); + result.put("resultTag",tag); + return result; + } + + + + + @Override + @Transactional + public Boolean mdyBank(String cardNo,String code,String bankImg, + String bankInfo,String cardType,String cardName,String phone,Long id)throws Exception { + + if(id == null){ + this.invalidationParamsException("银行卡ID不能为空"); + } + + if(StringUtils.isEmpty(phone)){ + this.invalidationParamsException("银行预留手机号不能为空"); + } + + if(StringUtils.isEmpty(bankInfo)){ + this.invalidationParamsException("银行信息不能为空"); + } + + if(StringUtils.isEmpty(cardNo)){ + this.invalidationParamsException("银行卡号不能为空"); + } + + Long userId = MpLoginHelper.getUserId(); + UserWorkerVo userWorker = this.userWorkerService.queryById(userId); + ThirdConf tc = this.getThirdConfig(code,"bankCard4Config"); + boolean tag = this.bankCard3(cardNo,userWorker.getName(),userWorker.getCardId()); + + + UserWorkerAccountVo uwav = this.userWorkerAccountMapper.selectVoById(id); + + if(uwav != null && uwav.getBankCard().equals(cardNo) &&uwav.getBankType().equals(bankInfo)){ + UserWorkerAccount userWorkerAccount = new UserWorkerAccount(); + userWorkerAccount.setId(id); + userWorkerAccount.setBankCardPic(bankImg); + userWorkerAccount.setBankType(bankInfo); + userWorkerAccount.setUpdateBy(MpLoginHelper.getUserId()); + userWorkerAccount.setUpdateTime(new Date()); + userWorkerAccount.setCardType(cardType); + userWorkerAccount.setPhone(phone); + this.userWorkerAccountMapper.updateById(userWorkerAccount); + + }else{ + UserWorkerAccount userWorkerAccount = new UserWorkerAccount(); + userWorkerAccount.setId(id); + userWorkerAccount.setIsDefault(0L); + userWorkerAccount.setStatus(0); + this.userWorkerAccountMapper.updateById(userWorkerAccount); + int i = this.settlementAccountService.addAccount(bankInfo,userWorker.getName(),cardNo,uwav.getPassage(),phone,bankImg,cardType); + if( i <= 0){ + this.invalidationParamsException("修改银行卡失败!"); + } + + } + + return true; + } + + @Override + public Map getUserInfo() { + Map paraMap = new HashMap(); + UserWorkerVo vo = this.userWorkerService.queryById(MpLoginHelper.getUserId()); + paraMap.put("name",vo.getName()); + paraMap.put("phone",vo.getPhone()); + paraMap.put("isAuth",vo.getIsAuth()); + paraMap.put("isAuthentication",vo.getIsAuthentication()); + paraMap.put("isFaceAuth",vo.getIsFaceAuth()); + return paraMap; + } + + + /*** + * 身份证识别 + * @param file + * @param type + * @param code + * @return + * @throws Exception + */ + + public Map idCardOcr(MultipartFile file, String type,String code) throws Exception{ + + Map resultMap = new HashMap(); + + try{ + String imagestr = null; + if(file.getSize() > MAXSIZE){ + imagestr = org.dromara.mp.util.ImgUtil.scaleImgToBase64(file.getInputStream(),0.8f); + }else{ + imagestr = Base64.encode(file.getInputStream()); + } + if(StringUtils.isEmpty(imagestr)){ + invalidationParamsException("base64编码出错"); + } +// ThirdConf thirdConf = this.getThirdConfig(code,"idcardConfig"); +// LoginMpUser userWorkerVo = MpLoginHelper.getLoginUser(); +// UserWorkerVo resultWorkerVo = this.cardIdOcr(userWorkerVo.getPhone(),imagestr,thirdConf,type); + + + String resultFile; + + if (type.equals("FRONT")){ + resultFile = remoteJzqService.ocrIdentity(imagestr,1); + JSONObject jsonObject = JSONObject.parseObject(resultFile); + if (jsonObject.getString("success").equals("false")){ + this.invalidationParamsException("身份证正面识别失败"); + } + JSONObject data = jsonObject.getJSONObject("data"); + IdCardVo idCardVo = data.toJavaObject(IdCardVo.class); + String birthday = convertDateFormat(idCardVo.getBirthday()); + LocalDate localDate = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); + + resultMap.put("name", idCardVo.getName()); + resultMap.put("cardId", idCardVo.getIdNo()); + resultMap.put("address", idCardVo.getAddress()); + resultMap.put("birthday", sqlDate); + resultMap.put("sex", idCardVo.getGender()); + resultMap.put("nation", idCardVo.getNation()); + }else { + resultFile = remoteJzqService.ocrIdentity(imagestr,0); + JSONObject jsonObject = JSONObject.parseObject(resultFile); + if(jsonObject.getString("success").equals("false")){ + this.invalidationParamsException("身份证反面识别失败"); + } + JSONObject data = jsonObject.getJSONObject("data"); + IdCardVo idCardVo = data.toJavaObject(IdCardVo.class); + String issueDate = convertDateFormat(idCardVo.getIssuingTime()); + String expiryDate = convertDateFormat(idCardVo.getOverdueTime()); + LocalDate localDate = LocalDate.parse(issueDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + LocalDate localDate1 = LocalDate.parse(expiryDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + resultMap.put("issue", idCardVo.getIssuingAuthority()); + resultMap.put("issueDate", localDate); + resultMap.put("expiryDate", localDate1); + + } + + String originalFilename = file.getOriginalFilename(); + String contentType = file.getContentType(); + RemoteFile remoteFile = remoteFileService.upload(UUID.fastUUID().toString(),originalFilename,contentType,file.getBytes()); + + resultMap.put("cardImg",remoteFile.getUrl()); + resultMap.put("ossId",remoteFile.getOssId()); + }catch (Exception e){ + e.printStackTrace(); + log.error("身份证识别报错===>"+e.getMessage()); + throw e; + } + return resultMap; + } + + private String convertDateFormat(String dateStr) { + if (dateStr == null || dateStr.length() != 8) { + throw new IllegalArgumentException("日期格式不正确,应为 yyyyMMdd"); + } + return dateStr.substring(0, 4) + "-" + dateStr.substring(4, 6) + "-" + dateStr.substring(6, 8); + } + + /*** + * 银行卡图片识别 + * @param file + * @param type + * @param code + * @return + * @throws Exception + */ + @Override + public Map bankUploadOcr(MultipartFile file, String type, String code) throws Exception { + + Map resultMap = new HashMap(); +// String imagestr = null; +// if(file.getSize() > MAXSIZE){ +// imagestr = org.dromara.mp.util.ImgUtil.scaleImgToBase64(file.getInputStream(),0.8f); +// }else{ +// imagestr = Base64.encode(file.getInputStream()); +// } +// +// if(StringUtils.isEmpty(imagestr)){ +// invalidationParamsException("base64编码出错"); +// } + + File file1 = new File(file.getOriginalFilename()); + try (FileOutputStream fos = new FileOutputStream(file1)) { + fos.write(file.getBytes()); // 将字节流写入文件 + } + +// ThirdConf thirdConf = this.getThirdConfig(code,"bankCardOcrConfig"); +// +// BankCardVo bankCardVo = this.bankCardOcr(null,imagestr,thirdConf); + + String result = remoteJzqService.ocrBank(file1); + JSONObject jsonObject = JSONObject.parseObject(result); + JSONObject data = jsonObject.getJSONObject("data"); + BankCardOcrVo bankCardVo = data.toJavaObject(BankCardOcrVo.class); + + + String originalFilename = file.getOriginalFilename(); + String contentType = file.getContentType(); + RemoteFile remoteFile = remoteFileService.upload(UUID.fastUUID().toString(),originalFilename,contentType,file.getBytes()); + + resultMap.put("cardName",bankCardVo.getBankName()); + resultMap.put("cardNo",bankCardVo.getCardNo()); +// resultMap.put("bankInfo",bankCardVo.getBankInfo().replaceAll("[\\d()]","")); + resultMap.put("validDate",bankCardVo.getValidDate()); +// resultMap.put("cardType",bankCardVo.getCardType()); + resultMap.put("orderNo",bankCardVo.getOrderNo()); + resultMap.put("bankImg",remoteFile.getUrl()); + resultMap.put("ossId",remoteFile.getOssId()); + + return resultMap; + } + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 19:28 + * 说明: + **/ + @Override + @Transactional + public Map submitIdCardInfo(UserWorkerBo userWorkerBo,String code)throws Exception { + + Map resultMap = new HashMap(); + + if(StringUtils.isEmpty(code)){ + throw new MpException("唯一码不能为空"); + } + + if(isIDCardExpired(userWorkerBo.getExpiryDate())){ + throw new MpException("身份证已过期"); + } + + + ThirdConf thirdConf = this.getThirdConfig(code,"idcardAuthConfig"); + //身份证二要素 + // boolean tag = this.cardId2(userWorkerBo.getName(), userWorkerBo.getCardId(),thirdConf); + String s = remoteJzqService.userValid(userWorkerBo.getName(), userWorkerBo.getCardId()); + JSONObject json = JSONObject.parseObject(s); + JSONObject data = json.getJSONObject("data"); + if(data.get("valid").equals("false")){ + throw new MpException(data.getString("message")); + } + + //更新数据 + long userId = MpLoginHelper.getUserId(); + UserWorkerVo uwv = this.userWorkerService.queryById(userId); + if(uwv == null){ + throw new MpException("非法用户"); + } + if(StringUtils.isNotEmpty(uwv.getCardId())){ + if(!uwv.getCardId().equals(userWorkerBo.getCardId())){ + throw new MpException("登录账号身份证不一致"); + } + } + UserWorkerBo paramBo = new UserWorkerBo(); + paramBo.setCardId(userWorkerBo.getCardId()); + List selList = this.userWorkerService.queryList(paramBo); + if(selList != null && !selList.isEmpty()){ + int size = selList.size(); + if(size > 1){ + throw new MpException("身份证已绑定"); + }else{ + UserWorkerVo vo = selList.get(0); + if(StringUtils.isEmpty(vo.getPhone())){ + //更新手机号 + vo.setPhone(uwv.getPhone()); + List delList = new ArrayList(); + delList.add(userId); + boolean delTag = this.userWorkerService.deleteWithValidByIds(delList,true); + if(delTag){ + UserWorkerBo upUserBo = new UserWorkerBo(); + upUserBo.setId(vo.getId()); + upUserBo.setPhone(uwv.getPhone()); + upUserBo.setStatus(1); + upUserBo.setUpdateTime(new Date()); + this.userWorkerService.updateByBo(upUserBo); + //更新缓存信息 + LoginMpUser loginMpUser = new LoginMpUser(); + loginMpUser.setUserId(vo.getId()); + loginMpUser.setPhone(vo.getPhone()); + loginMpUser.setName(vo.getName()); + String clientId = MpLoginHelper.getExtra(MpLoginHelper.CLIENT_KEY).toString(); + RemoteClientVo client = remoteClientService.queryByClientId(clientId); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(MpLoginHelper.CLIENT_KEY, client.getClientId()); + MpLoginHelper.login(loginMpUser,null, model); + Map tokenMap = new HashMap(); + tokenMap.put("access_token",StpUtil.getTokenValue()); + tokenMap.put("refresh_token",StpUtil.getTokenValue()); + resultMap.put("token",tokenMap); + userId = vo.getId(); +// MpLoginHelper.setLoginInfo(loginMpUser); + } + + }else if(!vo.getId().equals(userId)){ + throw new MpException("身份证已绑定"); + } + } + } + + + thirdConf = this.getThirdConfig(code,"faceAuthConfig"); + + Date currentDate = new Date(); +// FaceAuth faceAuth = this.faceAuth(thirdConf.getRuleId(), thirdConf.getRedirectUrl(),userWorkerBo.getName(), userWorkerBo.getCardId(),thirdConf); +// resultMap.put("redirectUrl",faceAuth.getRedirectUrl()); + + + + String orderNo = "XZS1974"; + String s1 = remoteJzqService.startH5Face(orderNo, userWorkerBo.getName(), userWorkerBo.getCardId(), thirdConf.getRedirectUrl(), 1); + JSONObject result = JSONObject.parseObject(s1); + if(result.getString("success").equals("false")){ + log.error(result.getString("msg")); + throw new MpException(result.getString("msg")); + } + JSONObject result1 = result.getJSONObject("data"); + + resultMap.put("redirectUrl", result1.getString("startFaceUrl")); + + userWorkerBo.setId(userId); + userWorkerBo.setBizToken("81EEF6178-28EE-4759-A823E-6CBBBE6BC442"); + userWorkerBo.setTokenExpirDate(DateUtil.offsetSecond(currentDate,7200)); + userWorkerBo.setIsAuth(1L); + userWorkerBo.setEditTime(currentDate); + userWorkerBo.setIsFaceAuth(1); + this.userWorkerService.updateByBo(userWorkerBo); + //人脸核验url + return resultMap; + + } + + + @Override + public Map getFaceAuth(String code)throws Exception{ + + if(StringUtils.isEmpty(code)){ + this.invalidationParamsException("唯一码不能为空"); + } + + UserWorkerVo uwv = this.userWorkerService.queryById(MpLoginHelper.getUserId()); + + if(uwv == null || uwv.getIsAuth() == null || uwv.getIsAuth().intValue() != 1){ + this.invalidationParamsException("未完成实名认证"); + } + Map resultMap = new HashMap(); + + + + ThirdConf thirdConf = this.getThirdConfig(code,"faceAuthConfig"); + + String orderNo = "XZS9740"; + + String s1 = remoteJzqService.startH5Face(orderNo, uwv.getName(), uwv.getCardId(), thirdConf.getRedirectUrl(), 1); + JSONObject result = JSONObject.parseObject(s1); + if(result.getString("success").equals("false")){ + log.error(result.getString("msg")); + throw new MpException(result.getString("msg")); + } + JSONObject result1 = result.getJSONObject("data"); + + resultMap.put("redirectUrl", result1.getString("startFaceUrl")); + +// FaceAuth faceAuth = this.faceAuth(thirdConf.getRuleId(), thirdConf.getRedirectUrl(),uwv.getName(), uwv.getCardId(),thirdConf); +// resultMap.put("redirectUrl",faceAuth.getRedirectUrl()); + Date currentDate = new Date(); + UserWorkerBo userWorkerBo = new UserWorkerBo(); + userWorkerBo.setId(MpLoginHelper.getUserId()); + userWorkerBo.setBizToken("81EEF6178-28EE-4759-A823E-6CBBBE6BC442"); + userWorkerBo.setTokenExpirDate(DateUtil.offsetSecond(currentDate,7200)); + userWorkerBo.setEditTime(currentDate); + this.userWorkerService.updateByBo(userWorkerBo); + return resultMap; + } + + + /**** + * 获取人审核的结果 + * @param bizToken + * @param code 唯一码 + * @return + * @throws Exception + */ + @Override + public String getFaceAuthResult(String bizToken,String code)throws Exception { + + if(StringUtils.isEmpty(bizToken)){ + this.invalidationParamsException("人脸核验token不能为空!"); + } + ThirdConf thirdConf = this.getThirdConfig(code,"faceAuthConfig"); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("biz_token",bizToken); + UserWorker uw = this.userWorkerMapper.selectOne(wrapper); + if(uw == null){ + return ""; + } + + RemoteFile remoteFile = this.getDectInfo(null,bizToken,thirdConf); + if(remoteFile != null && StringUtils.isNotEmpty(remoteFile.getUrl())){ + UserWorker uwk = new UserWorker(); + uwk.setId(uw.getId()); + uwk.setIsFaceAuth(1); + uwk.setPhotoPath(remoteFile.getUrl()); + uwk.setUpdateTime(new Date()); + this.userWorkerMapper.updateById(uwk); + } + return "1"; + } + + @Override + public Map getUserCardInfo() { + UserWorkerVo uwv = this.userWorkerMapper.selectVoById(MpLoginHelper.getUserId()); + Map resultMap = new HashMap(); + + resultMap.put("name",uwv.getName()); + resultMap.put("cardId",uwv.getCardId()); + resultMap.put("cardPositive",uwv.getCardPositive()); + resultMap.put("cardBack",uwv.getCardBack()); + resultMap.put("is_auth",uwv.getIsAuth()); + return resultMap; + } + + + public static boolean isIDCardExpired(String endDateStr) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date endDate; + try { + + if(endDateStr.contains("长期")){ + return false; + } + endDate = sdf.parse(endDateStr); + Date currentDate = new Date(); // 获取当前日期 + // 比较当前日期和身份证有效期结束日期 + if (currentDate.after(endDate)) { + return true; // 当前日期在有效期之后,身份证已过期 + } else { + return false; // 当前日期在有效期内,身份证未过期 + } + } catch (ParseException e) { + e.printStackTrace(); + return false; // 如果无法解析有效期结束日期,则默认返回未过期 + } + } + + private ThirdConf getThirdConfig(String code,String type ){ + + Map configMap = this.unitDomainService.mpOtherThirdConfig(code); + if(configMap == null){ + throw new MpException("第三方参数未配置!"); + } + Map subMap = (Map) configMap.get(type); + ThirdConf thirdConf = JsonUtils.parseObject(JsonUtils.toJsonString(subMap),ThirdConf.class); + + return thirdConf; + } + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-08 9:25 + * 说明:身份证二要素认证 + **/ + private boolean cardId2(String name,String idCard,ThirdConf config) throws Exception{ + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(),config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IdCardVerificationRequest req = new IdCardVerificationRequest(); + + req.setName(name); + req.setIdCard(idCard); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IdCardVerificationResponse resp = client.IdCardVerification(req); + log.info("身份证二要素识姓名:["+name+"],idcard["+idCard+"]别返回结果: "+ AbstractModel.toJsonString(resp)); + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new MpException(resp.getDescription()); + } + }catch(TencentCloudSDKException e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw e; + }catch (Exception e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw e; + } + } + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:36 + * 说明: + **/ + private UserWorkerVo cardIdOcr(String phone,String base64ImgStr,ThirdConf config,String cardType)throws Exception{ + + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(),config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + OcrClient client = new OcrClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IDCardOCRRequest req = new IDCardOCRRequest(); + req.setImageBase64(base64ImgStr); + req.setCardSide(cardType); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IDCardOCRResponse resp = client.IDCardOCR(req); + log.info("身份证识别:["+phone+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + UserWorkerVo user = new UserWorkerVo(); + user.setName(resp.getName()); + user.setCardId(resp.getIdNum()); + user.setAddress(resp.getAddress()); + user.setBirthday(DateUtil.parse(resp.getBirth())); + user.setSex(resp.getSex()); + user.setNation(resp.getNation()); + user.setIssue(resp.getAuthority()); + String validDate = resp.getValidDate(); + if(StringUtils.isNotEmpty(validDate)){ + String[] vs = validDate.split("-"); + if( vs.length >1){ + user.setIssueDate(DateUtil.parseDate(vs[0].trim().replaceAll("\\.","-"))); + user.setExpiryDate(vs[1].trim().replaceAll("\\.","-")); + } + } + return user; + }catch(TencentCloudSDKException e){ + log.error("身份证OCR识别出错:手机号:{},状态码{},错误信息{}",phone,e.getErrorCode(),e.getMessage()); + throw e; + + }catch (Exception e){ + log.error("身份证OCR识别出错:手机号:{},错误信息{}",phone,e.getMessage()); + throw e; + } + } + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:36 + * 说明:银行卡识别 + **/ + private BankCardVo bankCardOcr(String phone, String base64ImgStr,ThirdConf config)throws Exception{ + + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(), config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + OcrClient client = new OcrClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + BankCardOCRRequest req = new BankCardOCRRequest(); + + req.setImageBase64(base64ImgStr); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + BankCardOCRResponse resp = client.BankCardOCR(req); + log.info("银行卡识别:["+phone+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + BankCardVo backCard = new BankCardVo(); + backCard.setCardName(resp.getCardName()); + backCard.setCardNo(resp.getCardNo()); + backCard.setBankInfo(resp.getBankInfo()); + backCard.setCardType(resp.getCardType()); + return backCard; + }catch(TencentCloudSDKException e){ + log.error("银行卡OCR识别出错:手机号:{},状态码{},错误信息{}",phone,e.getErrorCode(),e.getMessage()); + throw e; + }catch (Exception e){ + log.error("银行卡OCR识别出错:手机号:{},错误信息{}",phone,e.getMessage()); + throw e; + } + } + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:50 + * 说明:银行卡三要素认证 + **/ + private boolean bankCard3(String bankCard,String name,String idCard)throws Exception{ + JSONObject result = JSONObject.parseObject( remoteJzqService.bankThreeVerify(name,idCard,bankCard)); + if(result.getString("success").equals("false")){ + log.error("银行卡三要素认证失败:银行卡号:{},姓名:{},身份证号:{},原因:{}",bankCard,name,idCard,result.getString("msg")); + throw new Exception(result.getString("msg")); + } + return result.getString("success").equals("true"); + } + + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 13:50 + * 说明:银行卡四要素认证 + **/ + private boolean bankCard4(String bankCard,String name,String phone,String idCard,ThirdConf conf)throws Exception{ + + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + BankCard4EVerificationRequest req = new BankCard4EVerificationRequest(); + req.setName(name); + req.setBankCard(bankCard); + req.setIdCard(idCard); + req.setPhone(phone); + // 返回的resp是一个BankCard4EVerificationResponse的实例,与请求对象对应 + BankCard4EVerificationResponse resp = client.BankCard4EVerification(req); + log.info("银行卡四要素:["+bankCard+","+name+","+phone+","+idCard+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BankCard4Exception(resp.getDescription()); + } + } catch (TencentCloudSDKException e) { + log.error("银行卡四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},状态码{},错误信息{}",phone,name,idCard,bankCard,e.getErrorCode(),e.getMessage()); + throw e; + } catch(Exception e){ + e.printStackTrace(); + log.error("银行卡四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},错误信息{}",phone,name,idCard,bankCard,e.getMessage()); + throw e; + } + } + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 14:10 + * 说明:人脸核验获取BizToken + **/ + private FaceAuth faceAuth(String ruleId,String redirectUrl,String name,String idCard,ThirdConf conf) throws Exception{ + try { + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + DetectAuthRequest req = new DetectAuthRequest(); + req.setIdCard(idCard); + req.setName(name); + req.setRedirectUrl(redirectUrl); + req.setRuleId(ruleId); + // 返回的resp是一个DetectAuthResponse的实例,与请求对象对应 + DetectAuthResponse resp = client.DetectAuth(req); + FaceAuth fa = new FaceAuth(); + fa.setRedirectUrl(resp.getUrl()); + fa.setBizToken(resp.getBizToken()); + return fa; + + } catch (TencentCloudSDKException e) { + log.error("人脸核验获取BizToken:状态码{},错误信息{}", e.getErrorCode(), e.getMessage()); + throw e; + } catch (Exception e) { + e.printStackTrace(); + log.error("人脸核验获取BizToken,错误信息{}", e.getMessage()); + throw e; + } + + } + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-02 14:10 + * 说明:人脸核验结果 + **/ + private RemoteFile getDectInfo(String ruleId,String bizToken,ThirdConf conf) throws Exception{ + try { + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + GetDetectInfoEnhancedRequest req = new GetDetectInfoEnhancedRequest(); + + req.setRuleId(conf.getRuleId()); + req.setBizToken(bizToken); + + // 返回的resp是一个GetDetectInfoResponse的实例,与请求对象对应 + GetDetectInfoEnhancedResponse resp = client.GetDetectInfoEnhanced(req); + + if(resp.getText() != null && resp.getText().getErrCode() == 0){ + DetectInfoBestFrame baseFrame = resp.getBestFrame(); + if(baseFrame != null){ + String bestBase64 = baseFrame.getBestFrame(); + byte[] face = Base64.decode(bestBase64); + String fileName = UUID.fastUUID().toString(); + RemoteFile file = this.remoteFileService.upload(fileName,fileName+".png","image/png",face); + return file; + } + return new RemoteFile(); + }else{ + throw new RuntimeException(resp.getText().getErrMsg()); + } + } catch (TencentCloudSDKException e) { + log.error("查询人脸核验结果:状态码{},错误信息{}", e.getErrorCode(), e.getMessage()); + throw e; + } catch (Exception e) { + e.printStackTrace(); + log.error("查询人脸核验结果,错误信息{}", e.getMessage()); + throw e; + } + } + + + +} + + +@Data +class FaceAuth { + + //核验流程唯一密钥 + private String bizToken; + + //用于发起核身流程的 URL + private String redirectUrl; +} + + +@Data +class ThirdConf{ + + private String type; + + private String secretId; + + private String secretKey; + + private String endPoint; + + private String ruleId; + + private String redirectUrl; + + private String region; + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java new file mode 100644 index 0000000..a400835 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/MyTaskServiceImpl.java @@ -0,0 +1,806 @@ +package org.dromara.mp.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.SignType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.mp.domain.MerTaskEnroll; +import org.dromara.mp.domain.MerTaskSure; +import org.dromara.mp.domain.UserWorkerBiz; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.mp.domain.vo.*; +import org.dromara.mp.mapper.MerTaskEnrollMapper; +import org.dromara.mp.mapper.MyTaskMapper; +import org.dromara.mp.mapper.UserWorkCheckinMapper; +import org.dromara.mp.service.IMyTaskService; +import org.dromara.mp.service.IUserWorkCheckinService; +import org.dromara.mp.service.IUserWorkerService; +import org.dromara.resource.api.RemoteDhqService; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.domain.RemoteDhq; +import org.dromara.resource.api.domain.RemoteJzq; +import org.dromara.resource.api.domain.SignatoryReq; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title MyTaskServiceImpl + * @description + * @create 2024-05-08 18:44 + */ +@Service +@Slf4j +public class MyTaskServiceImpl extends BaseService implements IMyTaskService { + + + @Resource + public MyTaskMapper myTaskMapper; + + @Resource + public MerTaskEnrollMapper merTaskEnrollMapper; + + @Resource + public UserWorkCheckinMapper checkinMapper; + + @Resource + public IUserWorkCheckinService userWorkerCheckinService; + + + @DubboReference + public RemoteDhqService remoteDhqService; + + @DubboReference + public RemoteJzqService remoteJzqService; + + + + @DubboReference + private RemoteConfigService remoteConfigService; + + + /**** + * 确认单 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signSurePro(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_conf"); + MerTaskSure uwb = this.myTaskMapper.selectTaskSure(id); + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(uwb.getSignStatus() == null && StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + String originaNumber = "DHQQRD"+ IdUtil.getSnowflakeNextIdStr(); + RemoteDhq dhq = new RemoteDhq(); + dhq.setLaunchType("1"); + dhq.setContractName("用工确认单");//合同名称 + dhq.setContractModelNum(workerSignConfig.getString("tempCode")); + dhq.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + dhq.setLaunchSubject(uwb.getConPhone());//发起用户手机号 + dhq.setLaunchName(uwb.getConName()); + dhq.setLaunchEnterpriseName(uwb.getSysName());//发起企业名称(launchType为1企业发起合同时必传) +// dhq.setSignEnterpriseName(uwb.getSysName()); + dhq.setCustomerOriginationNumber(originaNumber);//客户发起时定义的编号 +// dhq.setInputValues(uwb.getProNo()+","+originaNumber+","+uwb.getSysName()+","+uwb.getCost()+","+uwb.getCreateTime()+"," +// +uwb.getWorkName()+","+uwb.getCardId()+","+uwb.getPhone()+","+uwb.getProContent());//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + + + List mapList=new ArrayList<>(); + Map map2 = new HashMap(); + map2.put("controlNumber",workerSignConfig.getString("pro_controlNumber")); + map2.put("writeContent",uwb.getProNo()); + mapList.add(map2); + Map map1 = new HashMap(); + map1.put("controlNumber",workerSignConfig.getString("xy_controlNumber")); + map1.put("writeContent",originaNumber); + mapList.add(map1); + Map map3 = new HashMap(); + map3.put("controlNumber",workerSignConfig.getString("fbf_controlNumber")); + map3.put("writeContent",uwb.getSysName()); + mapList.add(map3); + Map map4 = new HashMap(); + map4.put("controlNumber",workerSignConfig.getString("je_controlNumber")); + map4.put("writeContent",uwb.getCost()); + mapList.add(map4); + Map map51 = new HashMap(); + map51.put("controlNumber",workerSignConfig.getString("time_controlNumber")); + map51.put("writeContent",uwb.getCreateTime()); + mapList.add(map51); + Map map6 = new HashMap(); + map6.put("controlNumber",workerSignConfig.getString("user_controlNumber")); + map6.put("writeContent",uwb.getWorkName()); + mapList.add(map6); + Map map7 = new HashMap(); + map7.put("controlNumber",workerSignConfig.getString("card_controlNumber")); + map7.put("writeContent",uwb.getCardId()); + mapList.add(map7); + Map map8 = new HashMap(); + map8.put("controlNumber",workerSignConfig.getString("phone_controlNumber")); + map8.put("writeContent",uwb.getPhone()); + mapList.add(map8); +// int length = uwb.getProContent().replace("\t","").length(); +// int size = (length +38 -1) / 38 ; +// for(int i = 0; i < size ; i++){ +// if(i > 3){ +// break; +// } +// Map map9 = new HashMap(); +// map9.put("controlNumber",workerSignConfig.getString("txt1"+i+"_controlNumber")); +// map9.put("writeContent",uwb.getProContent().substring(i*38,i*38+38 > length?length -1:i*38+38)); +// mapList.add(map9); +// } + +// if(size < 4){ +// for( int i = size ; i < 4; i++){ +// Map map9 = new HashMap(); +// map9.put("controlNumber",workerSignConfig.getString("txt1"+i+"_controlNumber")); +// map9.put("writeContent",""); +// mapList.add(map9); +// } +// +// } + + + dhq.setInputValues(mapList); + + + List> data=new ArrayList<>(); + Map map = new HashMap<>(); + map.put("userName",uwb.getConName());//经办人姓名 + map.put("userPhone",uwb.getConPhone());//经办人手机号 + map.put("type","1");//类型 0-个人 1-企业 + map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map.put("silenceSign","1"); //是否需要静默签:0不需要 1需要 + map.put("enterpriseName",uwb.getSysName());//企业名称(类型type为1时必传) + map.put("signNumber",workerSignConfig.getString("signNumber1")); //0签署方编号 + + Map map5 = new HashMap<>(); + map5.put("userName",uwb.getWorkName());//经办人姓名 + map5.put("userPhone",uwb.getPhone());//经办人手机号 + map5.put("type","0");//类型 0-个人 1-企业 + map5.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map5.put("silenceSign","0"); //是否需要静默签:0不需要 1需要 + map5.put("signNumber",workerSignConfig.getString("signNumber2")); //0签署方编号 + data.add(map); + data.add(map5); + String s = JSONObject.toJSONString(data); + + + + String result = this.remoteDhqService.becomeSign(dhq,domain, SignType.USER_WORKER_CONFIRMATION); + if(StringUtils.isEmpty(result)){ + this.invalidationParamsException("获取签约连接失败"); + } + String signWebUrl = null; + String contractNum = null; + JSONObject resultObj = JSONObject.parseObject(result); + String code = resultObj.getString("code"); + if(StringUtils.isNotEmpty(code) && code.equals("200")){ + JSONObject jno = resultObj.getJSONObject("result"); + if(jno != null){ + JSONArray signWebUrls = jno.getJSONArray("signUrls"); + signWebUrl =signWebUrls.getJSONObject(0).getString("signUserUrl"); + contractNum = jno.getString("contractNum"); + } + } + if(StringUtils.isEmpty(signWebUrl)){ + this.invalidationParamsException("获取签约连接失败"); + }else{ + MerTaskSure uwBiz = new MerTaskSure(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setSignNo(originaNumber); + this.myTaskMapper.updateTaskSure(uwBiz); + } + return signWebUrl; + } + + /**** + * 确认单 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signSureProJzq(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_conf"); + MerTaskSure uwb = this.myTaskMapper.selectTaskSure(id); + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(uwb.getSignStatus() == null && StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + + + + RemoteJzq remoteJzq = new RemoteJzq(); + remoteJzq.setContractName("用工确认单"); //合同名称 + remoteJzq.setTemplateNo(workerSignConfig.getString("tempCode")); + remoteJzq.setServerCa(1); + remoteJzq.setDealType(5); + remoteJzq.setFileType(4); + String originaNumber = "4FDCA706A6D042D5A3FFF417A7C006A6"; + remoteJzq.setTemplateNo(originaNumber); + remoteJzq.setNotifyUrl("http://116.255.147.51/prod-api/resource/sign/acceptSure"); + Map mapList = new HashMap<>(); + mapList.put("corporatename", "薪资社"); + String jsonString = JSONObject.toJSONString(mapList); + remoteJzq.setTemplateParams(jsonString); + + + + + + List signatoryReqs = new ArrayList<>(); + + SignatoryReq signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getSysName()); + + + signatoriesReq.setIdentityType(11); + signatoriesReq.setIdentityCard(uwb.getNsrSbh()); + signatoriesReq.setEmail(uwb.getConEmail()); + signatoriesReq.setServerCaAuto(1); + signatoriesReq.setChapteJson("[{\"page\":4,\"chaptes\":[{\"offsetX\":0.121,\"offsetY\":0.3941}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setSignLevel(0); + signatoriesReq.setNoNeedVerify(1); + signatoryReqs.add(signatoriesReq); + + + signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getWorkName()); + signatoriesReq.setIdentityType(1); + signatoriesReq.setIdentityCard(uwb.getCardId()); + signatoriesReq.setMobile(uwb.getPhone()); + signatoriesReq.setServerCaAuto(0); + signatoriesReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.3047,\"offsetY\":0.2677}]},{\"page\":4,\"chaptes\":[{\"offsetX\":0.2378,\"offsetY\":0.1681}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setNoNeedVerify(1); //取消签约前短信校验 + signatoriesReq.setServerCaAuto(0);//是否使用自动签署完成,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效) + signatoriesReq.setSignLevel(1);//签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写,3个人方形标准章(用户类型是个人且姓名2-4个字符生效,其他情况默认使用系统标准图形章) + + + signatoryReqs.add(signatoriesReq); + + + remoteJzq.setSignatories(signatoryReqs); + + + + + String result = this.remoteJzqService.becomeSign(remoteJzq,domain, SignType.USER_WORKER_PROTOCOL); + JSONObject jsonObject = JSONObject.parseObject(result); + + if(jsonObject.getString("success").equals("false")){ + + this.invalidationParamsException(jsonObject.getString("msg")); + } + + String code = jsonObject.getString("data"); + + String data = this.remoteJzqService.link(code,uwb.getWorkName(),uwb.getCardId(),1); + + JSONObject resultObj = JSONObject.parseObject(data); + + if (resultObj.getString("success").equals("false")){ + this.invalidationParamsException("获取签约连接失败"); + } + + String signWebUrl = resultObj.getString("data"); + + MerTaskSure uwBiz = new MerTaskSure(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setSignNo(code); + this.myTaskMapper.updateTaskSure(uwBiz); + + return signWebUrl; + } + +// +// public static void main(String[] args) { +// String result = "{\"success\":true,\"message\":\"操作成功!\",\"code\":200,\"result\":{\"businessId\":\"95d6eb9ae14b4b6f8770467a37132c82\",\"contractNum\":\"2024081416141723623293870089\",\"applicationId\":\"2205026100\",\"signUrls\":[{\"signUserPhone\":\"15981832697\",\"signUserUrl\":\"https://openapi.signzg.com/copilot/index.html#/sign-info?dXNlcklkPTIzMjI1JnNpZ25JZD0xMzk1NQ==\"}]},\"timestamp\":1723623294932}"; +// JSONObject resultObj = JSONObject.parseObject(result); +// String code = resultObj.getString("code"); +// String signWebUrl ="中信银行(03020000)".replaceAll("[\\d()]",""); +// String contractNum =""; +// if(StringUtils.isNotEmpty(code) && code.equals("200")){ +// JSONObject jno = resultObj.getJSONObject("result"); +// if(jno != null){ +// JSONArray signWebUrls = jno.getJSONArray("signUrls"); +// signWebUrl =signWebUrls.getJSONObject(0).getString("signUserUrl"); +// contractNum = jno.getString("contractNum"); +// } +// } +// +// } + + /**** + * 签约 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signPro(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_pro"); + + UserWorkerBiz uwb = this.myTaskMapper.selectHtInfoByUwbId(id); + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + String originaNumber = "DHQUZ"+ IdUtil.getSnowflakeNextIdStr(); + RemoteDhq dhq = new RemoteDhq(); + dhq.setApplicationId(signConfig.getString("appId")); + dhq.setBusinessId(signConfig.getString("businessId")); + dhq.setContractName("用工签约");//合同名称 + dhq.setLaunchType("1"); //发起类型 0-个人发起 1-企业发起 + dhq.setLaunchSubject(uwb.getConPhone());//发起用户手机号 + dhq.setContractModelNum(workerSignConfig.getString("tempCode")); + dhq.setLaunchName(uwb.getConName()); + dhq.setLaunchEnterpriseName(uwb.getGsmc());//发起企业名称(launchType为1企业发起合同时必传) +// dhq.setSignEnterpriseName(uwb.getGsmc()); + dhq.setCustomerOriginationNumber(originaNumber);//客户发起时定义的编号 +// dhq.setInputValues(uwb.getGsmc()+","+uwb.getConName()+","+uwb.getCardId()+","+uwb.getName()+","+uwb.getGsmc()+","+uwb.getGsmc()+","+uwb.getGsmc()+","+uwb.getGsmc()+","+ DateUtils.getDate());//输入内容设置模板签署位置时要签署的内容 多个用逗号分隔 + + + + + List mapList=new ArrayList<>(); + Map map2 = new HashMap(); + map2.put("controlNumber",workerSignConfig.getString("jf_controlNumber")); + map2.put("writeContent",uwb.getGsmc()); + mapList.add(map2); + Map map1 = new HashMap(); + map1.put("controlNumber",workerSignConfig.getString("jfuser_controlNumber")); + map1.put("writeContent",uwb.getConName()); + mapList.add(map1); + Map map3 = new HashMap(); + map3.put("controlNumber",workerSignConfig.getString("yf_controlNumber")); + map3.put("writeContent",uwb.getName()); + mapList.add(map3); + Map map4 = new HashMap(); + map4.put("controlNumber",workerSignConfig.getString("yfuser_controlNumber")); + map4.put("writeContent",uwb.getCardId()); + mapList.add(map4); + Map map51 = new HashMap(); + map51.put("controlNumber",workerSignConfig.getString("sys0_controlNumber")); + map51.put("writeContent",uwb.getGsmc()); + mapList.add(map51); + Map map6 = new HashMap(); + map6.put("controlNumber",workerSignConfig.getString("sys1_controlNumber")); + map6.put("writeContent",uwb.getGsmc()); + mapList.add(map6); + Map map7 = new HashMap(); + map7.put("controlNumber",workerSignConfig.getString("sys2_controlNumber")); + map7.put("writeContent",uwb.getGsmc()); + mapList.add(map7); + Map map8 = new HashMap(); + map8.put("controlNumber",workerSignConfig.getString("sys3_controlNumber")); + map8.put("writeContent",uwb.getGsmc()); + mapList.add(map8); + Map map9 = new HashMap(); + map9.put("controlNumber",workerSignConfig.getString("time_controlNumber")); + map9.put("writeContent",DateUtils.getDate()); + mapList.add(map9); + dhq.setInputValues(mapList); + + List> data=new ArrayList<>(); + Map map = new HashMap<>(); + map.put("userName",uwb.getConName());//经办人姓名 + map.put("userPhone",uwb.getConPhone());//经办人手机号 + map.put("type","1");//类型 0-个人 1-企业 + map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map.put("silenceSign","1"); //是否需要静默签:0不需要 1需要 + map.put("enterpriseName",uwb.getGsmc());//企业名称(类型type为1时必传) + map.put("signNumber",workerSignConfig.getString("signNumber1")); //0签署方编号 + + Map map5 = new HashMap<>(); + map5.put("userName",uwb.getName());//经办人姓名 + map5.put("userPhone",uwb.getVPhone());//经办人手机号 + map5.put("type","0");//类型 0-个人 1-企业 + map5.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 + map5.put("silenceSign","0"); //是否需要静默签:0不需要 1需要 + map5.put("signNumber",workerSignConfig.getString("signNumber2")); //0签署方编号 + data.add(map); + data.add(map5); + String s = JSONObject.toJSONString(data); + dhq.setSignatoryInfos(s);//签署方相关信息 + + + +// List> data=new ArrayList<>(); +// Map map = new HashMap<>(); +// map.put("userName",uwb.getName());//经办人姓名 +// map.put("userPhone",uwb.getVPhone());//经办人手机号 +// map.put("type","0");//类型 0-个人 1-企业 +// map.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// // map.put("type","1");//类型 0-个人 1-企业 +// // map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// // map.put("enterpriseName","贵州省七进制科技有限公司");//企业名称(类型type为1时必传) +// data.add(map); +// String s = JSONObject.toJSONString(data); +// dhq.setSignatoryInfos(s);//签署方相关信息 + + + String result = this.remoteDhqService.becomeSign(dhq,domain, SignType.USER_WORKER_PROTOCOL); + if(StringUtils.isEmpty(result)){ + this.invalidationParamsException("获取签约连接失败"); + } + String signWebUrl = null; + String contractNum = null; + JSONObject resultObj = JSONObject.parseObject(result); + String code = resultObj.getString("code"); + if(StringUtils.isNotEmpty(code) && code.equals("200")){ + JSONObject jno = resultObj.getJSONObject("result"); + if(jno != null){ + JSONArray signWebUrls = jno.getJSONArray("signUrls"); + signWebUrl =signWebUrls.getJSONObject(0).getString("signUserUrl"); + contractNum = jno.getString("contractNum"); + } + + + } + if(StringUtils.isEmpty(signWebUrl)){ + this.invalidationParamsException("获取签约连接失败"); + }else{ + UserWorkerBiz uwBiz = new UserWorkerBiz(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setHtCode(originaNumber); + this.myTaskMapper.updateUserWorkerHtInfoByBizId(uwBiz); + } + return signWebUrl; + } + + /**** + * 签约 + * @param id + * @param domain + * @return + * @throws Exception + */ + @Override + public String signProJzq(Long id,String domain)throws Exception{ + + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + + if(site == null || StringUtils.isEmpty(site.getSignConfig())){ + throw new Exception("未找到该域名的签约配置信息"); + } + + JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); + JSONObject workerSignConfig = signConfig.getJSONObject("user_worker_pro"); + + + log.info(id+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + + UserWorkerBiz uwb = this.myTaskMapper.selectHtInfoByUwbId(id); + + if(uwb == null){ + this.invalidationParamsException("参数无效"); + } + + if(StringUtils.isNotEmpty(uwb.getSignUrl())){ + return uwb.getSignUrl(); + } + + if(ObjectUtils.isEmpty(uwb.getIsCA()) || uwb.getIsCA()==0){ + String name = uwb.getName(); + String identityCard = uwb.getCardId(); + String cardPositive = uwb.getCardPositive(); + String cardBack = uwb.getCardBack(); + // 保存文件的目录(使用临时目录) + String saveDir = "/www/wwwroot"; + // 保存的文件名 + String fileName = "downloaded_image.jpeg"; + String fileName1 = "downloaded_image1.jpeg"; + File file = createFileFromURL(cardPositive, saveDir, fileName); + File file1 = createFileFromURL(cardBack, saveDir, fileName1); + + + String s = remoteJzqService.cloudCertiPerInfo(name, identityCard, file, file1); + JSONObject parse = JSONObject.parseObject(s); + if (parse.getString("success").equals("false")){ + throw new Exception(parse.getString("msg")); + } + + this.myTaskMapper.updateCAStatus(name); + } + + + + RemoteJzq remoteJzq = new RemoteJzq(); + remoteJzq.setContractName("用工签约"); //合同名称 + remoteJzq.setTemplateNo(workerSignConfig.getString("tempCode")); + remoteJzq.setServerCa(1); + remoteJzq.setDealType(5); + remoteJzq.setFileType(4); + String originaNumber = "3B1EF1A9BD8B47E7A9E23BBE16408658"; + remoteJzq.setTemplateNo(originaNumber); + remoteJzq.setNotifyUrl("http://116.255.147.51/prod-api/resource/sign/accept"); + Map mapList = new HashMap<>(); + mapList.put("corporatename", "薪资社"); + String jsonString = JSONObject.toJSONString(mapList); + remoteJzq.setTemplateParams(jsonString); + + + + + + List signatoryReqs = new ArrayList<>(); + + SignatoryReq signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getGsmc()); + signatoriesReq.setIdentityType(11); + signatoriesReq.setIdentityCard(uwb.getNsrSbh()); + signatoriesReq.setEmail(uwb.getConEmail()); + signatoriesReq.setServerCaAuto(1); + signatoriesReq.setChapteJson("[{\"page\":4,\"chaptes\":[{\"offsetX\":0.121,\"offsetY\":0.3941}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setSignLevel(0); + signatoriesReq.setNoNeedVerify(1); + signatoryReqs.add(signatoriesReq); + + + signatoriesReq = new SignatoryReq(); + signatoriesReq.setFullName(uwb.getName()); + signatoriesReq.setIdentityType(1); + signatoriesReq.setIdentityCard(uwb.getCardId()); + signatoriesReq.setMobile(uwb.getVPhone()); + signatoriesReq.setServerCaAuto(0); + signatoriesReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.3047,\"offsetY\":0.2677}]},{\"page\":4,\"chaptes\":[{\"offsetX\":0.2378,\"offsetY\":0.1681}]}]");//坐标(X Y)定位签字位置 + signatoriesReq.setNoNeedVerify(1); //取消签约前短信校验 + signatoriesReq.setServerCaAuto(0);//是否使用自动签署完成,0或null不使用,1自动(当且只当合同处理方式为部份自动或收集批量签时有效) + signatoriesReq.setSignLevel(1);//签字类型,标准图形章或公章:0标准图形章,1公章或手写,2公章手写或手写,3个人方形标准章(用户类型是个人且姓名2-4个字符生效,其他情况默认使用系统标准图形章) + + + signatoryReqs.add(signatoriesReq); + + + remoteJzq.setSignatories(signatoryReqs); + + + String result = this.remoteJzqService.becomeSign(remoteJzq,domain, SignType.USER_WORKER_PROTOCOL); + JSONObject jsonObject = JSONObject.parseObject(result); + + if(jsonObject.getString("success").equals("false")){ + + this.invalidationParamsException(jsonObject.getString("msg")); + } + + String code = jsonObject.getString("data"); + + String data = this.remoteJzqService.link(code,uwb.getName(),uwb.getCardId(),1); + + JSONObject resultObj = JSONObject.parseObject(data); + + if (resultObj.getString("success").equals("false")){ + this.invalidationParamsException("获取签约连接失败"); + } + + String signWebUrl = resultObj.getString("data"); + + UserWorkerBiz uwBiz = new UserWorkerBiz(); + uwBiz.setId(id); + uwBiz.setSignUrl(signWebUrl); + uwBiz.setHtCode(code); + this.myTaskMapper.updateUserWorkerHtInfoByBizId(uwBiz); + + return signWebUrl; + } + + + public static File createFileFromURL(String fileUrl, String saveDir, String fileName) throws Exception { + // 确保保存目录存在 + File savePath = new File(saveDir); + if (!savePath.exists()) { + savePath.mkdirs(); + } + + // 创建目标文件 + File file = new File(saveDir, fileName); + + // 从URL下载文件并保存到本地 + try (InputStream inputStream = new URL(fileUrl).openStream(); + FileOutputStream outputStream = new FileOutputStream(file)) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + + return file; + } + + + @Override + public TableDataInfo selTastList(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selTastList(name,workId,pageQuery.build())); + } + + @Override + public TableDataInfo selMyTastList(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selectMyTaskList(name,workId,pageQuery.build())); + } + + @Override + public TaskVo selTaskListDetail(Long id) { + if(id == null){ + this.invalidationParamsException("任务ID不能为空"); + } + + TaskVo vo = this.myTaskMapper.selTaskListDetail(id); + vo.setMerIsAuth(1); + vo.setVerifyStatus(0); + return vo; + } + + + @Override + public Boolean acceptTask(Long id,String no){ + if(id == null){ + this.invalidationParamsException("任务ID不能为空"); + } + + if(StringUtils.isEmpty(no)){ + this.invalidationParamsException("任务编码不能为空"); + } + + MerTaskEnroll enroll = new MerTaskEnroll(); + enroll.setTaskId(id); + enroll.setTaskNo(no); + enroll.setCreateTime(new Date()); + enroll.setCreateBy(MpLoginHelper.getUserId()); + enroll.setVerifyStatus(1L); + enroll.setWorkId(MpLoginHelper.getUserId()); + enroll.setNo("ST"+StringUtils.randmNumber(12)); + this.getAddEnroll(enroll); + return true; + } + + @Override + public List selMyCheckPro() { + return this.myTaskMapper.selMyCheckPro(MpLoginHelper.getUserId()); + } + + @Override + public TaskVo selMyTaskDetail(Long id) { + if(id == null){ + this.invalidationParamsException("任务ID不能为空"); + } + Long workId = MpLoginHelper.getUserId(); + TaskVo taskVo = myTaskMapper.selMyTaskDetail(id,workId); + UserWorkCheckinBo bo = new UserWorkCheckinBo(); + bo.setUserWorkId(workId); + bo.setProId(taskVo.getTaskId()); + List checkInList = this.userWorkerCheckinService.queryList(bo); + taskVo.setCheckInVolist(checkInList); + return taskVo; + + } + + @Override + public int updOverReport(MerTaskEnroll enroll) { + + if(enroll.getId() == null){ + this.invalidationParamsException("ID不能为空"); + } + if(StringUtils.isEmpty(enroll.getTaskDesc())){ + this.invalidationParamsException("交付内容不能为空"); + } + + if(StringUtils.isEmpty(enroll.getTaskPic())){ + this.invalidationParamsException("交付图片不能为空"); + } + enroll.setUpdateBy(MpLoginHelper.getUserId()); + enroll.setUpdateTime(new Date()); + enroll.setTaskStatus(1); + return this.merTaskEnrollMapper.updateById(enroll); + } + + @Override + public MerTaskEnrollVo selOverReport(Long id) { + if(id == null){ + this.invalidationParamsException("ID不能为空"); + } + MerTaskEnrollVo mtev = this.merTaskEnrollMapper.selectVoById(id); + + MerTaskEnrollVo result = new MerTaskEnrollVo(); + if(mtev != null){ + result.setId(mtev.getId()); + result.setTaskDesc(mtev.getTaskDesc()); + result.setTaskPic(mtev.getTaskPic()); + } + return result; + } + + @Override + public TableDataInfo selMyHtList(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selHtListByWorkId(workId,pageQuery.build())); + } + + + @Override + public TableDataInfo selProSureDoc(String name, PageQuery pageQuery) { + Long workId = MpLoginHelper.getUserId(); + return TableDataInfo.build(this.myTaskMapper.selProSureDoc(workId,pageQuery.build())); + } + + + private void getAddEnroll(MerTaskEnroll enroll) { + try{ + this.merTaskEnrollMapper.insert(enroll); + }catch (DuplicateKeyException e){ + enroll.setNo("ST"+StringUtils.randmNumber(12)); + this.getAddEnroll(enroll); + } + } + + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java new file mode 100644 index 0000000..80b1dcb --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SettlementAccountServiceImpl.java @@ -0,0 +1,202 @@ +package org.dromara.mp.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.mp.domain.UserWorkerAccount; +import org.dromara.mp.domain.bo.UserWokerOperBo; +import org.dromara.mp.domain.vo.SettlementChannelVo; +import org.dromara.mp.domain.vo.UserWorkerAccountVo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.exception.MpException; +import org.dromara.mp.mapper.UserWorkerAccountMapper; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.ISettlementAccountService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SettlementAccountServiceImpl + * @description + * @create 2024-05-08 14:11 + */ + +@Service +public class SettlementAccountServiceImpl extends BaseService implements ISettlementAccountService { + + @DubboReference + private RemoteDictService remoteDictService; + + @Resource + private UserWorkerAccountMapper userWorkerAccountMapper; + + + @Resource + private UserWorkerMapper userWorkerMapper; + + + @DubboReference + private RemoteAccountService accountService; + + + + + @Override + public List getSettleChannel() { + List list = remoteDictService.selectDictDataByType("pay_channel"); + QueryWrapper wapper = new QueryWrapper(); + wapper.eq("work_id",MpLoginHelper.getUserId()); + wapper.eq("is_default",1); + wapper.eq("status",1); + List uwaList = this.userWorkerAccountMapper.selectVoList(wapper); + + List settlementChannelVoList = new ArrayList<>(); + for(RemoteDictDataVo vo : list){ + SettlementChannelVo stcv = new SettlementChannelVo(); + stcv.setChannelName(vo.getDictLabel()); + uwaList.stream().filter(item->item.getPassage().equals(vo.getDictLabel())).forEach(item->{ + stcv.setBankCard(StringUtils.bankHide(item.getBankCard())); + stcv.setId(item.getId()); + stcv.setBankName(item.getBankType()); + stcv.setCardType(item.getCardType()); + }); + settlementChannelVoList.add(stcv); + } + + return settlementChannelVoList; + } + + @Override + public List getBankList(String bankName) { + List list = remoteDictService.selectDictDataByType("bank_list"); + + if(StringUtils.isNotEmpty(bankName)){ + List list1 = new ArrayList<>(); + list.stream().filter(item -> item.getDictLabel().contains(bankName)).forEach(item -> { + list1.add(item); + }); + return list1; + } + return list; + } + + + /*** + * 添加结算账户 + * @param bankType 银行类型 + * @param name 姓名 + * @param bankCard 银行卡号 + * @param channelName 通道名称 + * @param phone 手机号 + * @param bankPic 银行卡图片 + * @return + */ + @Transactional + public int addAccount(String bankType, String name, String bankCard,String channelName,String phone, + String bankPic,String cardType){ + + if(StringUtils.isEmpty(channelName)){ + List channelList = remoteDictService.selectDictDataByType("pay_channel"); + if(channelList != null && !channelList.isEmpty()){ + channelName = channelList.get(0).getDictLabel(); + }else{ + throw new MpException("系统无可用结算通道"); + } + } + + UserWokerOperBo bo = new UserWokerOperBo(); + bo.setChannelName(channelName); + bo.setWorkId(MpLoginHelper.getUserId()); + + List accountList= this.userWorkerAccountMapper.selctBankInfoByUidChannelBankNo(bo); + long isDefault = 1; + UserWorkerAccountVo hav = null; + if(accountList != null && !accountList.isEmpty()){ + for(UserWorkerAccountVo vo :accountList){ + if(bankCard.equals(vo.getBankCard())){ + hav = vo; + } + if(vo.getIsDefault().intValue() == 1 ){ + isDefault = 0; + } + } + } + + UserWorkerAccount uwa1 = new UserWorkerAccount(); + uwa1.setWorkId(MpLoginHelper.getUserId()); + uwa1.setIsDefault(0L); + uwa1.setUpdateTime(new Date()); + this.userWorkerAccountMapper.updateById(uwa1); + + if(hav != null){ + UserWorkerAccount userwo = new UserWorkerAccount(); + userwo.setStatus(1); + userwo.setId(hav.getId()); + userwo.setIsDefault(1L); + userwo.setPassage(channelName); + userwo.setBankCardPic(bankPic); + userwo.setBankType(bankType); + userwo.setCardType(cardType); + this.userWorkerAccountMapper.updateById(userwo); + return 1; + } + + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bankCard); + bankAcc.setBankType(bankType); + bankAcc.setUnitId(0L); + bankAcc.setName(name); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId != null){ + UserWorkerAccount userWorkerAccount = new UserWorkerAccount(); + userWorkerAccount.setCreateBy(MpLoginHelper.getUserId()); + userWorkerAccount.setWorkId(MpLoginHelper.getUserId()); + userWorkerAccount.setCreateTime(new Date()); + userWorkerAccount.setPassage(channelName); + userWorkerAccount.setAccId(Long.valueOf(accountId)); + userWorkerAccount.setBankCardPic(bankPic); + userWorkerAccount.setBankCard(bankCard); + userWorkerAccount.setBankType(bankType); + userWorkerAccount.setCardType(cardType); + userWorkerAccount.setIsDefault(1L); + userWorkerAccount.setPhone(phone); + return this.userWorkerAccountMapper.insert(userWorkerAccount); + }else{ + return -1; + } + } + + @Override + public UserWorkerAccountVo getBankDetail(Long id) { + if(id == null){ + this.invalidationParamsException("ID不能为空"); + } + UserWorkerAccountVo vo = this.userWorkerAccountMapper.selectVoById(id); + + + if(vo != null){ + vo.setAccId(null); + UserWorkerVo user = this.userWorkerMapper.selectVoById(vo.getWorkId()); + vo.setName(user.getName()); + } + return vo; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java new file mode 100644 index 0000000..e462f04 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/SysUnitDomainServiceImpl.java @@ -0,0 +1,282 @@ +package org.dromara.mp.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.MpContants; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.mp.domain.SysUnitDomain; +import org.dromara.mp.domain.bo.SysUnitDomainBo; +import org.dromara.mp.domain.vo.SysUnitDomainVo; +import org.dromara.mp.exception.MpException; +import org.dromara.mp.mapper.SysUnitDomainMapper; +import org.dromara.mp.service.ISysUnitDomainService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.TencentSmsConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.*; + +/** + * 单位域名配置Service业务层处理 + * + * @author LionLi + * @date 2024-04-07 + */ +@RequiredArgsConstructor +@Service +public class SysUnitDomainServiceImpl implements ISysUnitDomainService { + + private static final Logger log = LoggerFactory.getLogger(SysUnitDomainServiceImpl.class); + private final SysUnitDomainMapper baseMapper; + @DubboReference + public RemoteSmsService smsService; + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 17:45 + * 说明:发送验证码 + **/ + + public boolean sendSms(String phone,String domainCode){ + SysUnitDomain smsConfig = this.selSmsConfig(domainCode); + if(smsConfig == null){ + throw new MpException("站点未配置短信参数"); + } + + if(StringUtils.isEmpty(phone)){ + throw new MpException("手机号不能为空"); + } + +// String type = (String)smsConfig.get("type"); +// String sign = (String)smsConfig.get("sign"); +// String accid = (String)smsConfig.get("accid"); +// String acckey = (String)smsConfig.get("acckey"); +// String appid = (String)smsConfig.get("appid"); +// String temp_dlyzm = (String)smsConfig.get("temp_dlyzm"); +// +// TencentSmsConfig tencentSmsConfig = new TencentSmsConfig(); +// +// tencentSmsConfig.setAccessKeyId(accid); +// tencentSmsConfig.setAccessKeySecret(acckey); +// tencentSmsConfig.setSignature(sign); +// tencentSmsConfig.setSdkAppId(appid); +// tencentSmsConfig.setTemplateId(temp_dlyzm); + + String key = GlobalConstants.CAPTCHA_MP_PHONE_CODE_KEY+SmsType.MP.getIType() + phone; + String code = RandomUtil.randomNumbers(4); + String cacheCode = RedisUtils.getCacheObject(key); + if(StringUtils.isNotEmpty(cacheCode)){ + throw new MpException("2分钟内不能重复发送"); + } + + + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); +// RedisUtils.setCacheObject(key, code, Duration.ofMinutes(1000)); + LinkedHashMap map = new LinkedHashMap<>(2); + map.put("code", code); + map.put("expirs","2"); + Map map1 = new HashMap<>(); + map1.put("smsConfig", smsConfig.getSmsConfig()); + // smsConfig.put("tempId","temp_dlyzm"); + + this.smsService.sendSmsCode(SmsType.MP,phone,map,map1); + + return true; + } + + + /** + * 查询单位域名配置 + */ + @Override + public SysUnitDomainVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public SysUnitDomainVo queryByMpDomain(String mpDomain) { + + if(StringUtils.isEmpty(mpDomain)){ + throw new MpException("站点域名不能为空!"); + } + String cacheKey = MpContants.MP_DOMAIN_KEY+mpDomain.hashCode() ; + SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); + if(mpDomainVo == null){ + SysUnitDomainBo bo = new SysUnitDomainBo(); + bo.setStatus(1); + bo.setWeChatDomainName(mpDomain); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + mpDomainVo = this.baseMapper.selectOne(lqw); + if(mpDomainVo != null){ + RedisUtils.setCacheObject(cacheKey,mpDomainVo); + }else{ + throw new MpException("未配置公众号站点信息"); + } + } + + SysUnitDomainVo domainVo = new SysUnitDomainVo(); + domainVo.setWebsiteName(mpDomainVo.getWebsiteName()); + domainVo.setHotline(mpDomainVo.getHotline()); + domainVo.setCopyright(mpDomainVo.getCopyright()); + domainVo.setWapBanner(mpDomainVo.getWapBanner()); + domainVo.setWapLogo(mpDomainVo.getWapLogo()); + domainVo.setWeChatPub(mpDomainVo.getWeChatPub()); + domainVo.setMpDomainHashCode(mpDomain.hashCode()+""); + domainVo.setPrivacyAgreement(mpDomainVo.getPrivacyAgreement()); + domainVo.setMobileUserAgreement(mpDomainVo.getMobileUserAgreement()); + + return domainVo; + } + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:39 + * 说明:获取短信配置 + **/ + + @Override + public SysUnitDomain selSmsConfig(String domainCode) { + + + log.info(domainCode+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + String cacheKey = MpContants.MP_DOMAIN_KEY+domainCode; + SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); + + if(mpDomainVo != null){ +// String smsConfigStr = mpDomainVo.getSmsConfig(); +// return JsonUtils.parseObject(smsConfigStr,Map.class); + return mpDomainVo; + } + + return null; + } + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 16:39 + * 说明:获取人脸核验等其他配置 + **/ + @Override + public Map mpOtherThirdConfig(String domainCode) { + + String cacheKey = MpContants.MP_DOMAIN_KEY+domainCode; + SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); + if(mpDomainVo != null){ + String thirdConfigStr = mpDomainVo.getWeChatThirdParams(); + return JsonUtils.parseObject(thirdConfigStr,Map.class); + } + return null; + + } + + + /** + * 查询单位域名配置列表 + */ + @Override + public TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询单位域名配置列表 + */ + @Override + public List queryList(SysUnitDomainBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysUnitDomainBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDomainName()), SysUnitDomain::getDomainName, bo.getDomainName()); + lqw.like(StringUtils.isNotBlank(bo.getWebsiteName()), SysUnitDomain::getWebsiteName, bo.getWebsiteName()); + lqw.eq(StringUtils.isNotBlank(bo.getHotline()), SysUnitDomain::getHotline, bo.getHotline()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyright()), SysUnitDomain::getCopyright, bo.getCopyright()); + lqw.eq(StringUtils.isNotBlank(bo.getRecordNo()), SysUnitDomain::getRecordNo, bo.getRecordNo()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyrightUrl()), SysUnitDomain::getCopyrightUrl, bo.getCopyrightUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageLogo()), SysUnitDomain::getLoginPageLogo, bo.getLoginPageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageBanner()), SysUnitDomain::getLoginPageBanner, bo.getLoginPageBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getHomePageLogo()), SysUnitDomain::getHomePageLogo, bo.getHomePageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapLogo()), SysUnitDomain::getWapLogo, bo.getWapLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapBanner()), SysUnitDomain::getWapBanner, bo.getWapBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getWeChatPub()), SysUnitDomain::getWeChatPub, bo.getWeChatPub()); + lqw.eq(StringUtils.isNotBlank(bo.getPcLoginProtocol()), SysUnitDomain::getPcLoginProtocol, bo.getPcLoginProtocol()); + lqw.eq(StringUtils.isNotBlank(bo.getMobileUserAgreement()), SysUnitDomain::getMobileUserAgreement, bo.getMobileUserAgreement()); + lqw.eq(StringUtils.isNotBlank(bo.getPrivacyAgreement()), SysUnitDomain::getPrivacyAgreement, bo.getPrivacyAgreement()); + lqw.eq(StringUtils.isNotBlank(bo.getWeChatDomainName()),SysUnitDomain::getWeChatDomainName,bo.getWeChatDomainName()); + lqw.eq(bo.getStatus() != null, SysUnitDomain::getStatus, bo.getStatus()); + lqw.eq(bo.getBusRole() != null, SysUnitDomain::getBusRole, bo.getBusRole()); + lqw.eq(bo.getBusId() != null, SysUnitDomain::getBusId, bo.getBusId()); + return lqw; + } + + /** + * 新增单位域名配置 + */ + @Override + public Boolean insertByBo(SysUnitDomainBo bo) { + SysUnitDomain add = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改单位域名配置 + */ + @Override + public Boolean updateByBo(SysUnitDomainBo bo) { + SysUnitDomain update = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysUnitDomain entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除单位域名配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java new file mode 100644 index 0000000..b37d113 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkCheckinServiceImpl.java @@ -0,0 +1,125 @@ +package org.dromara.mp.service.impl; + +import cn.hutool.core.date.DateTime; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.mp.domain.bo.UserWorkCheckinBo; +import org.dromara.mp.domain.vo.UserWorkCheckinVo; +import org.dromara.mp.domain.UserWorkCheckin; +import org.dromara.mp.mapper.UserWorkCheckinMapper; +import org.dromara.mp.service.IUserWorkCheckinService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者打卡记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class UserWorkCheckinServiceImpl implements IUserWorkCheckinService { + + private final UserWorkCheckinMapper baseMapper; + + /** + * 查询自雇者打卡记录 + */ + @Override + public UserWorkCheckinVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询自雇者打卡记录列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkCheckinBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询自雇者打卡记录列表 + */ + @Override + public List queryList(UserWorkCheckinBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserWorkCheckinBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getRevision() != null, UserWorkCheckin::getRevision, bo.getRevision()); + lqw.eq(StringUtils.isNotBlank(bo.getCreatedBy()), UserWorkCheckin::getCreatedBy, bo.getCreatedBy()); + lqw.eq(bo.getCreatedTime() != null, UserWorkCheckin::getCreatedTime, bo.getCreatedTime()); + lqw.eq(StringUtils.isNotBlank(bo.getUpdatedBy()), UserWorkCheckin::getUpdatedBy, bo.getUpdatedBy()); + lqw.eq(bo.getProId() != null, UserWorkCheckin::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getProNum()), UserWorkCheckin::getProNum, bo.getProNum()); + lqw.eq(bo.getUpdatedTime() != null, UserWorkCheckin::getUpdatedTime, bo.getUpdatedTime()); + lqw.eq(bo.getUserWorkId() != null, UserWorkCheckin::getUserWorkId, bo.getUserWorkId()); + lqw.eq(StringUtils.isNotBlank(bo.getAddressInfo()), UserWorkCheckin::getAddressInfo, bo.getAddressInfo()); + lqw.eq(StringUtils.isNotBlank(bo.getLongi()), UserWorkCheckin::getLongi, bo.getLongi()); + lqw.eq(StringUtils.isNotBlank(bo.getLati()), UserWorkCheckin::getLati, bo.getLati()); + lqw.orderByDesc(UserWorkCheckin::getCreatedTime); + return lqw; + } + + /** + * 新增自雇者打卡记录 + */ + @Override + public Boolean insertByBo(UserWorkCheckinBo bo) { + UserWorkCheckin add = MapstructUtils.convert(bo, UserWorkCheckin.class); + add.setUserWorkId(MpLoginHelper.getUserId()); + add.setCreatedTime(new Date()); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改自雇者打卡记录 + */ + @Override + public Boolean updateByBo(UserWorkCheckinBo bo) { + UserWorkCheckin update = MapstructUtils.convert(bo, UserWorkCheckin.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkCheckin entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者打卡记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java new file mode 100644 index 0000000..7bd4e9a --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/service/impl/UserWorkerServiceImpl.java @@ -0,0 +1,141 @@ +package org.dromara.mp.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.mp.domain.bo.UserWorkerBo; +import org.dromara.mp.domain.vo.UserWorkerVo; +import org.dromara.mp.domain.UserWorker; +import org.dromara.mp.mapper.UserWorkerMapper; +import org.dromara.mp.service.IUserWorkerService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerServiceImpl implements IUserWorkerService { + + private final UserWorkerMapper baseMapper; + + /** + * 查询自雇者 + */ + @Override + public UserWorkerVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询自雇者列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + /** + * 查询自雇者列表 + */ + @Override + public List queryList(UserWorkerBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserWorkerBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), UserWorker::getOpenId, bo.getOpenId()); + lqw.like(StringUtils.isNotBlank(bo.getName()), UserWorker::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), UserWorker::getPhone, bo.getPhone()); + lqw.eq(bo.getIsAuthentication() != null, UserWorker::getIsAuthentication, bo.getIsAuthentication()); + lqw.eq(StringUtils.isNotBlank(bo.getCardId()), UserWorker::getCardId, bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getCardPositive()), UserWorker::getCardPositive, bo.getCardPositive()); + lqw.eq(StringUtils.isNotBlank(bo.getCardBack()), UserWorker::getCardBack, bo.getCardBack()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), UserWorker::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), UserWorker::getBankCard, bo.getBankCard()); + lqw.eq(bo.getIsAuth() != null, UserWorker::getIsAuth, bo.getIsAuth()); + lqw.eq(bo.getIsSign() != null, UserWorker::getIsSign, bo.getIsSign()); + lqw.eq(bo.getSignTime() != null, UserWorker::getSignTime, bo.getSignTime()); + lqw.eq(bo.getIsRegister() != null, UserWorker::getIsRegister, bo.getIsRegister()); + lqw.eq(StringUtils.isNotBlank(bo.getPhotoPath()), UserWorker::getPhotoPath, bo.getPhotoPath()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), UserWorker::getSex, bo.getSex()); + lqw.eq(StringUtils.isNotBlank(bo.getTag()), UserWorker::getTag, bo.getTag()); + lqw.eq(StringUtils.isNotBlank(bo.getUserArea()), UserWorker::getUserArea, bo.getUserArea()); + lqw.like(StringUtils.isNotBlank(bo.getUserAreaName()), UserWorker::getUserAreaName, bo.getUserAreaName()); + lqw.eq(bo.getAddTime() != null, UserWorker::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), UserWorker::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), UserWorker::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, UserWorker::getEditTime, bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getNation()), UserWorker::getNation, bo.getNation()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), UserWorker::getAddress, bo.getAddress()); + lqw.eq(bo.getBirthday() != null, UserWorker::getBirthday, bo.getBirthday()); + lqw.eq(StringUtils.isNotBlank(bo.getIssue()), UserWorker::getIssue, bo.getIssue()); + lqw.eq(bo.getIssueDate() != null, UserWorker::getIssueDate, bo.getIssueDate()); + lqw.eq(StringUtils.isNotBlank(bo.getExpiryDate()), UserWorker::getExpiryDate, bo.getExpiryDate()); + lqw.eq(StringUtils.isNotBlank(bo.getReferrerBy()), UserWorker::getReferrerBy, bo.getReferrerBy()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), UserWorker::getAlipayLogonId, bo.getAlipayLogonId()); + lqw.eq(bo.getStatus() != null, UserWorker::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增自雇者 + */ + @Override + public Boolean insertByBo(UserWorkerBo bo) { + UserWorker add = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改自雇者 + */ + @Override + public Boolean updateByBo(UserWorkerBo bo) { + UserWorker update = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorker entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java new file mode 100644 index 0000000..fa7b526 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/java/org/dromara/mp/util/ImgUtil.java @@ -0,0 +1,48 @@ +package org.dromara.mp.util; + +import cn.hutool.core.codec.Base64; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +/** + * @author sunzexing + * @version 1.0 + * @title ImgUtil + * @description + * @create 2024-08-19 11:28 + */ +public class ImgUtil { + + + + public static byte[] scaleImg(InputStream in,float scale){ + if(in == null){ + return null; + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try{ + cn.hutool.core.img.ImgUtil.scale(in,out,scale); + }catch(Exception e){ + e.printStackTrace(); + return null; + }finally { + try{ + in.close(); + }catch (Exception e){ + e.printStackTrace(); + } + } + return out.toByteArray(); + } + + + public static String scaleImgToBase64(InputStream in,float scale){ + byte[] bytes = scaleImg(in,scale); + if(bytes == null){ + return null; + } + return Base64.encode(bytes); + } + +} diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/application.yml b/ruoyi-modules/ruoyi-mp/src/main/resources/application.yml new file mode 100644 index 0000000..03e3a4c --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9214 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-mp + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt new file mode 100644 index 0000000..834d1d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/banner.txt @@ -0,0 +1,18 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + # # + # # ########## + # # # # # + # # # # # # + # # # # # # + # # # ### ######### + # # # ## # # + # # ### ############### + ## # # # # # + # # # # # + # # # # # ########## + # # # # # # # + # # # # # # # + ######### # # ### # + # # # # # # + # diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..2c90f13 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml new file mode 100644 index 0000000..8d0f5e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MerTaskEnrollMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml new file mode 100644 index 0000000..1880eb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/MyTaskMapper.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update user_worker_business set update_time = now() + , sign_url = #{signUrl} + , web_url = #{viewUrl} + , no = #{htCode} + where id = #{id} + + + + + + + + + + update mer_task_enroll t set update_time = now() + ,sign_url = #{signUrl} + ,sign_status = #{signStatus} + ,sign_no = #{signNo} + where id = #{id} + + + + update user_worker set is_CA = 1 where name = #{name} + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml new file mode 100644 index 0000000..212f2a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/SysUnitDomainMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml new file mode 100644 index 0000000..68b2cbc --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkCheckinMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml new file mode 100644 index 0000000..56bf400 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerAccountMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml new file mode 100644 index 0000000..e77953b --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/mapper/mp/UserWorkerMapper.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-mp/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-payment/Dockerfile b/ruoyi-modules/ruoyi-payment/Dockerfile new file mode 100644 index 0000000..4c1bb0a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/payment/logs \ + /ruoyi/payment/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/payment + +ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-payment.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-system \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-payment/pom.xml b/ruoyi-modules/ruoyi-payment/pom.xml new file mode 100644 index 0000000..4a058e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/pom.xml @@ -0,0 +1,176 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-payment + + + ruoyi-payment系统模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-job + + + + + org.dromara + ruoyi-api-system + + + + + org.dromara + ruoyi-api-payment + + + + + org.dromara + ruoyi-api-resource + + + + org.dromara + ruoyi-api-payment + + + + org.dromara + ruoyi-api-settlement + + + + com.alibaba.cloud + spring-cloud-starter-stream-rocketmq + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.987 + + + org.springframework.cloud + spring-cloud-commons + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java new file mode 100644 index 0000000..b92953c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/RuoYiPaymentApplication.java @@ -0,0 +1,26 @@ +package org.dromara.payment; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * 系统模块 + * + * @author ruoyi + */ +@EnableDubbo +@EnableAsync +@SpringBootApplication +public class RuoYiPaymentApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiPaymentApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 代发薪资模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java new file mode 100644 index 0000000..4492bd1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillController.java @@ -0,0 +1,389 @@ +package org.dromara.payment.bill.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.listener.BillImportListener; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.dromara.payment.task.service.IMerTaskService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.http.MediaType; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 账单 + * 前端访问路由地址为:/payment/bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/bill") +public class MerBillController extends BaseController { + + private final IMerBillService merBillService; + + private final IMerBillDetailService billDetailService; + + private final IMerTaskService merTaskService; + + private final IMerTaskEnrollService merTaskEnrollService; + + private final StreamBridge streamBridge; + + private void bindDataPermission(MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + } + } + + /** + * 查询代发批次列表 + */ + @SaCheckPermission("payment:bill:list") + @GetMapping("/list") + public TableDataInfo list(MerBillBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return merBillService.queryPageList(bo, pageQuery); + } + + /** + * 服务商接单审批代发列表 + */ + @GetMapping("/orderApprovalList") + public TableDataInfo orderApprovalList(MerBillBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + return merBillService.queryPageList(bo, pageQuery); + } + + /** + * 服务商接单审批代发待审批数量 + */ + @GetMapping("/orderApprovalCount") + public R orderApprovalCount(MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + bo.setStatus(0l);//已提交 + bo.setSydVerifyStatus(1);//待审批 + return R.ok(merBillService.queryListCount(bo)); + } + + /** + * 导出接单审批代发列表 + */ + @Log(title = "导出接单审批代发列表", businessType = BusinessType.EXPORT) + @PostMapping("/exportOrderApproval") + public void exportOrderApproval(MerBillBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + List list = merBillService.queryList(bo); + ExcelUtil.exportExcel(list, "批次打款_"+ DateUtils.dateTimeNow(), MerBillVo.class, response); + } + + /** + * 商户出款审批代发列表 + */ + @GetMapping("/paymentApprovalList") + public TableDataInfo paymentApprovalList(MerBillBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + return new TableDataInfo(); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + } + + return merBillService.queryPageList(bo, pageQuery); + } + + /** + * 商户出款审批代发待审批数量 + */ + @GetMapping("/paymentApprovalCount") + public R paymentApprovalCount(MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + return R.ok(0); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + } + + bo.setStatus(1l);//已接单 + bo.setVerifyStatus(1l);//待审批 + return R.ok(merBillService.queryListCount(bo)); + } + + /** + * 导出出款审批代发列表 + */ + @Log(title = "导出出款审批代发列表", businessType = BusinessType.EXPORT) + @PostMapping("/exportPaymentApproval") + public void exportPaymentApproval(MerBillBo bo, HttpServletResponse response,String fields) { + LoginUser loginUser = LoginHelper.getLoginUser(); + List list = new ArrayList<>(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + list = new ArrayList<>(); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + list = merBillService.queryList(bo); + } + + +// ExcelUtil.exportExcel(list, "批次打款_"+ DateUtils.dateTimeNow(), MerBillVo.class, response); + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + ExcelUtil.exportExcelInclude(list, "批次打款_"+ DateUtils.dateTimeNow(), MerBillVo.class, response,fieldList); + } + + /** + * 出款审批 + */ + @Log(title = "出款审批", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping() + public R paymentApproval(@Validated(EditGroup.class) @RequestBody MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setVerifyBy(loginUser.getNickname()); + Boolean rtn = merBillService.paymentApproval(bo); + if (rtn && bo.getVerifyStatus() == 3){//审核通过 + JSONObject queueParam = new JSONObject(); + queueParam.put("billId", bo.getId()); + streamBridge.send("bill-out-0", MessageBuilder.withPayload(queueParam).build()); + } + return toAjax(rtn); + } + + /** + * 导出代发B2B回单 + * @param billIds 代发批次id(多个逗号分隔) + */ + @Log(title = "导出代发B2B回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2B") + public void exportB2B(@NotBlank(message = "代发批次id不能为空") String billIds, HttpServletResponse response) throws IOException { + MerBillDetailBo where = new MerBillDetailBo(); + where.setBillIds(billIds); + where.setPayStatus(1);//支付成功 + List details = billDetailService.queryList(where); + List b2bs = StreamUtils.toList(details,MerBillDetailVo::getPayReceiptB2b, b2b -> StringUtils.isNotBlank(b2b)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2bs); + } + + /** + * 导出代发批次列表 + */ +// @SaCheckPermission("payment:bill:export") + @Log(title = "代发批次导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerBillBo bo, HttpServletResponse response,String fields) { + bindDataPermission(bo); + List list = merBillService.queryList(bo); + + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + ExcelUtil.exportExcelInclude(list, "代发批次", MerBillVo.class, response,fieldList); + } + + /** + * 获取账单详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:bill:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merBillService.queryById(id)); + } + + + + /** + * 获取账单详细信息 + * @param no 编码 + * + */ + @SaCheckPermission("payment:bill:query") + @GetMapping("/getInfo/{no}") + public R getInfo(@NotNull(message = "账单编码不能为空") + @PathVariable String no) { + return R.ok(merBillService.queryByNo(no)); + } + + + /** + * 派单在线打款导入 + * @param bo + * @return + */ + @Log(title = "派单在线打款导入", businessType = BusinessType.IMPORT) + @RepeatSubmit() + @PostMapping("/onlinePaymentImport") + public R> onlinePaymentImport(@Validated(AddGroup.class) @RequestBody AddBillBo bo) { + this.merBillService.validateSysSyd(bo); + return R.ok(merBillService.onlinePaymentImport(bo)); + } + + /** + * 抢单项目打款导入 + * @param bo + * @return + */ + @Log(title = "抢单项目打款导入", businessType = BusinessType.IMPORT) + @RepeatSubmit() + @PostMapping("/qdPaymentImport") + public R> qdPaymentImport(@Validated(AddGroup.class) @RequestBody AddBillBo bo) { + this.merBillService.validateSysSyd(bo); + return R.ok(merBillService.qdPaymentImport(bo)); + } + + /** + * 派单上传批量打款文件 + * @param file + * @param bo + * @return + * @throws Exception + */ + @Log(title = "派单上传批量打款文件", businessType = BusinessType.IMPORT) + @PostMapping(value = "/importBillData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R> importBillData(@RequestPart("file") MultipartFile file,AddBillBo bo) throws Exception { + this.merBillService.validateSysSyd(bo); + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(),new BillImportListener(bo)); + return R.ok(result); + } + + /** + * 接单审核 + */ + @Log(title = "接单审核", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/orderApproval") + public R orderApproval(@Validated(EditGroup.class) @RequestBody MerBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydVerifyBy(loginUser.getNickname()); + return toAjax(merBillService.orderApproval(bo)); + } + + /** + * 新增账单 + */ +// @SaCheckPermission("payment:bill:add") + @Log(title = "账单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody AddBillBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merBillService.insertByBo(bo)); + } + + /** + * 修改账单 + */ + @SaCheckPermission("payment:bill:edit") + @Log(title = "账单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/edit") + public R edit(@Validated(EditGroup.class) @RequestBody MerBillBo bo) { + return toAjax(merBillService.updateByBo(bo)); + } + + /** + * 删除账单 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:bill:remove") + @Log(title = "账单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merBillService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 查询待结算的抢单任务列表 + */ + @GetMapping("/balanceTaskList") + @Log(title = "查询待结算的抢单任务列表", businessType = BusinessType.OTHER) + public TableDataInfo list(MerTaskBo bo, PageQuery pageQuery) { + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.PLATFORM.getId()){ + return new TableDataInfo<>(); + } + bo.setStatus(1); + bo.setClassify(2l); + bo.setTaskStatusList(Arrays.asList(7,8)); + return merTaskService.queryPageList(bo, pageQuery); + } + + /** + * 查询待结算的抢单任务竞标人列表 + */ + @GetMapping("/balanceEnrollList") + @Log(title = "查询待结算的抢单任务竞标人列表", businessType = BusinessType.OTHER) + public TableDataInfo list(MerTaskEnrollBo bo, PageQuery pageQuery) { + bo.setTaskStatus(3); + bo.setSettlementStatus(0); + return merTaskEnrollService.queryPageList(bo, pageQuery); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java new file mode 100644 index 0000000..ff48256 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/controller/MerBillDetailController.java @@ -0,0 +1,228 @@ +package org.dromara.payment.bill.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.RandomUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 账单明细 + * 前端访问路由地址为:/payment/billDetail + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/billDetail") +public class MerBillDetailController extends BaseController { + + private final IMerBillDetailService merBillDetailService; + + private final IBusChannelService channelService; + + /** + * 查询代发明细列表 + */ + @SaCheckPermission("payment:billDetail:list") + @GetMapping("/list") + public TableDataInfo list(MerBillDetailBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + TableDataInfo rtn = merBillDetailService.queryPageList(bo, pageQuery); + filterChannelHalve(rtn.getRows()); + return rtn; + } + + private void bindDataPermission(MerBillDetailBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ +// bo.setParams(Map.of("channel_no",loginUser.getBusNo())); + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + } + } + + /** + * 过滤代理商分润数据权限 + * @param list + */ + private void filterChannelHalve(List list){ + if(list == null || list.size() == 0){ + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + for (MerBillDetailVo vo: + list) { + vo.setFhzxChannelName(null); + vo.setFhzxServiceChargeMoney(null); + vo.setZjChannelName(null); + vo.setZjServiceChargeMoney(null); + vo.setYwyChannelName(null); + vo.setYwyServiceChargeMoney(null); + } + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + BusChannelVo channelVo = channelService.queryById(loginUser.getBusId()); + for (MerBillDetailVo vo: + list) { + if(channelVo.getDwLevel() == 2){// 2:总监 + vo.setFhzxChannelName(null); + vo.setFhzxServiceChargeMoney(null); + vo.setFhzxServiceChargeRate(null); + }else if(channelVo.getDwLevel() == 3){//3:业务员 + vo.setFhzxChannelName(null); + vo.setFhzxServiceChargeRate(null); + vo.setFhzxServiceChargeMoney(null); + vo.setZjChannelName(null); + vo.setZjServiceChargeRate(null); + vo.setZjServiceChargeMoney(null); + } + } + } + } + + /** + * 导出代发明细列表 + */ + @SaCheckPermission("payment:billDetail:export") + @Log(title = "代发明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerBillDetailBo bo, HttpServletResponse response,String fields) { + bindDataPermission(bo); + List list = merBillDetailService.queryList(bo); + filterChannelHalve(list); + List noF = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + noF = Arrays.asList(fields.split(",")); + } + ExcelUtil.exportExcelInclude(list, "账单明细", MerBillDetailVo.class, response,noF); + } + + + /** + * 导出代发明细列表 + */ +// @SaCheckPermission("payment:billDetail:export") + @Log(title = "代发明细", businessType = BusinessType.EXPORT) + @PostMapping("/exportDetail") + public void exportDetail(MerBillDetailBo bo, HttpServletResponse response,String notFilds) { + bindDataPermission(bo); + List list = merBillDetailService.queryList(bo); + filterChannelHalve(list); + List noF = new ArrayList(); + if(StringUtils.isNotBlank(notFilds)){ + noF = Arrays.asList(notFilds.split(",")); + } + ExcelUtil.exportExcelInclude(list, "收益明细", MerBillDetailVo.class, response,noF); + } + + /** + * 导出代发B2C回单 + * @param billDetailIds 代发明细id(多个逗号分隔) + */ + @Log(title = "导出代发B2B回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2C") + public void exportB2C(@NotBlank(message = "代发明细id不能为空") String billDetailIds, HttpServletResponse response) throws IOException { + MerBillDetailBo where = new MerBillDetailBo(); + where.setParams(Map.of("ids",billDetailIds)); + List details = merBillDetailService.queryList(where); + List b2cs = StreamUtils.toList(details,MerBillDetailVo::getPayReceipt, b2c -> StringUtils.isNotBlank(b2c)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2cs); + } + + /** + * 获取账单明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:billDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merBillDetailService.queryById(id)); + } + + /** + * 新增账单明细 + */ + @SaCheckPermission("payment:billDetail:add") + @Log(title = "账单明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerBillDetailBo bo) { + return toAjax(merBillDetailService.insertByBo(bo)); + } + + /** + * 修改账单明细 + */ + @SaCheckPermission("payment:billDetail:edit") + @Log(title = "账单明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerBillDetailBo bo) { + return toAjax(merBillDetailService.updateByBo(bo)); + } + + + @Log(title = "补发失败明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/rePay") + public R rePay(@RequestBody MerBillDetailBo bo){ + return toAjax(merBillDetailService.rePay(bo)); + } + + + /** + * 删除账单明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:billDetail:remove") + @Log(title = "账单明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merBillDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java new file mode 100644 index 0000000..579f4cc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBill.java @@ -0,0 +1,281 @@ +package org.dromara.payment.bill.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 账单对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_bill") +public class MerBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + private String no; + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + private Long serviceChargeType; + + /** + * 服务费比例 + */ + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 结算金额(分) + */ + private Long amountEnt; + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + private Long payStatus; + + /** + * 支付完成时间 + */ + private Date payTime; + + /** + * 发放时间 + */ + private Date giveUpTime; + + /** + * 发放人 + */ + private String giveUpBy; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Long verifyStatus; + + /** + * 商户审核人 + */ + private String verifyBy; + + /** + * 商户审核时间 + */ + private Date verifyTime; + + /** + * 商户备注 + */ + private String verifyReason; + + /** + * 结算通道 + */ + private String passage; + + /** + * 批次下账单明细数量 + */ + @TableField(exist = false) + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + private Long isAgencyFee; + + /** + * 完税税票号 + */ + private String wssph; + + /** + * 委托代征个税税票号 + */ + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + private Date sphTime; + + /** + * 税票号编辑人 + */ + private String sphBy; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + private Integer isInvoice; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java new file mode 100644 index 0000000..7b430c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/MerBillDetail.java @@ -0,0 +1,372 @@ +package org.dromara.payment.bill.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusId; + +import java.io.Serial; + +/** + * 账单明细对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_bill_detail") +public class MerBillDetail extends BusId { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目子编号 + */ + private String cno; + + /** + * 流水号(系统内部编号) + */ + private String busNo; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + private String workerName; + + /** + * 手机号 + */ + private String workerPhone; + + /** + * 自雇者报名id + */ + private Long workerEnrollId; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户id + */ + private Integer bankAccId; + + /** + * 开户行 + */ + private String bankCheque; + + /** + * 账单金额(个人应得) + */ + private Long money; + + /** + * 个税 + */ + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ + private Long amount; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + private Integer payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * B2C回执单地址 + */ + private String payReceipt; + + /** + * 服务费(分) + */ + private Long serviceChargeMoney; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ + private Integer isRefund; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算通道 + */ + private String passage; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * B2B回执单地址 + */ + private String payReceiptB2b; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 运营商服务费率 + */ + private BigDecimal opServiceChargeRate; + + /** + * 运营商分润(分) + */ + private Long opServiceChargeMoney; + + /** + * 孵化中心服务费率 + */ + private BigDecimal fhzxServiceChargeRate; + + /** + * 孵化中心收益(分) + */ + private Long fhzxServiceChargeMoney; + + /** + * 孵化中心id + */ + private Long fhzxChannelId; + + /** + * 总监服务费率 + */ + private BigDecimal zjServiceChargeRate; + + /** + * 总监收益(分) + */ + private Long zjServiceChargeMoney; + + /** + * 总监id + */ + private Long zjChannelId; + + /** + * 业务员服务费率 + */ + private BigDecimal ywyServiceChargeRate; + + /** + * 业务员收益(分) + */ + private Long ywyServiceChargeMoney; + + /** + * 业务员id + */ + private Long ywyChannelId; + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + private String billRemark; + + /** + * 服务商服务费率 + */ + private BigDecimal sydServiceChargeRate; + + //商户服务费率 + private BigDecimal shServiceChargeRate; + + /** + * 服务商分润(分) + */ + private Long sydServiceChargeMoney; + + /** + * 运营商分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + private Integer opHalveStatus; + + /** + * 运营商分润失败原因 + */ + private String opHalveRemark; + + /** + * 服务商分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + private Integer sydHalveStatus; + + /** + * 服务商分润失败原因 + */ + private String sydHalveRemark; + + /** + * 平台分润(分) + */ + private Long ptServiceChargeMoney; + + /** + * 平台分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + private Integer ptHalveStatus; + + /** + * 平台分润失败原因 + */ + private String ptHalveRemark; + + private Integer thridRecruit; + + private String thridRecruitReason; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java new file mode 100644 index 0000000..be4abb4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/AddBillBo.java @@ -0,0 +1,34 @@ +package org.dromara.payment.bill.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.bill.domain.MerBill; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 账单业务对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class AddBillBo extends MerBillBo { + + @NotNull + @Size(min = 1,message = "账单详情不为空") + private List details; + + + private String domain; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java new file mode 100644 index 0000000..18936cd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/BillImportBo.java @@ -0,0 +1,4 @@ +package org.dromara.payment.bill.domain.bo; + +public class BillImportBo { +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java new file mode 100644 index 0000000..b5c9e9f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillBo.java @@ -0,0 +1,316 @@ +package org.dromara.payment.bill.domain.bo; + +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusId; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 账单业务对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerBill.class, reverseConvertGenerate = false) +public class MerBillBo extends BusId { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代发批次id(多个逗号分隔) + */ + private String ids; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空", groups = { AddGroup.class }) + private Long taskId; + + /** + * 项目编号 + */ + @NotBlank(message = "项目编号不能为空", groups = { AddGroup.class }) + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + @NotBlank(message = "批次号不能为空", groups = { AddGroup.class }) + private String no; + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + @NotNull(message = "服务费承担方式不能为空", groups = { AddGroup.class }) + private Long serviceChargeType; + + /** + * 服务费比例 + */ + @NotNull(message = "服务费比例不能为空", groups = { AddGroup.class }) + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 结算金额(分) + */ + private Long amountEnt; + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + private Long payStatus; + + /** + * 支付完成时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date payTime; + + /** + * 发放时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date giveUpTime; + + /** + * 发放人 + */ + private String giveUpBy; + + /** + * 添加时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Long verifyStatus; + + /** + * 商户审核人 + */ + private String verifyBy; + + /** + * 商户审核时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date verifyTime; + + /** + * 商户备注 + */ + private String verifyReason; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class }) + private String passage; + + /** + * 批次下账单明细数量 + */ + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + private Long isAgencyFee; + + /** + * 完税税票号 + */ + private String wssph; + + /** + * 委托代征个税税票号 + */ + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sphTime; + + /** + * 税票号编辑人 + */ + private String sphBy; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ +// @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class }) + private String opNo; + + /** + * 运营商id + */ +// @NotNull(message = "运营商id不能为空", groups = { AddGroup.class }) + private Long opId; + + /** + * 代理商id + */ +// @NotNull(message = "代理商id不能为空", groups = { AddGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ +// @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ +// @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class }) + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class }) + private String merNo; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class }) + private Long proId; + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + private Integer isInvoice; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class }) + private Integer busType; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式不能为空", groups = { AddGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限不能为空", groups = { AddGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型不能为空", groups = { AddGroup.class }) + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式不能为空", groups = { AddGroup.class }) + private Integer chargeMode; + + /** + * 支付密码 + */ + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java new file mode 100644 index 0000000..5a3362d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/bo/MerBillDetailBo.java @@ -0,0 +1,297 @@ +package org.dromara.payment.bill.domain.bo; + +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusId; + +/** + * 账单明细业务对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerBillDetail.class, reverseConvertGenerate = false) +public class MerBillDetailBo extends BusId { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 项目子编号 + */ + private String cno; + + /** + * 流水号(系统内部编号) + */ + private String busNo; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 代发批次id(多个逗号分隔) + */ + private String billIds; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String workerName; + + /** + * 手机号 + */ + private String workerPhone; + + /** + * 自雇者报名id + */ + private Long workerEnrollId; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户id + */ + private Integer bankAccId; + + /** + * 开户行 + */ + private String bankCheque; + + /** + * 账单金额(个人应得) + */ + @NotNull(message = "账单金额(个人应得)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal moneyDecimal; + private Long money; + + /** + * 个税 + */ + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ + private Long amount; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + private Integer payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * B2C回执单地址 + */ + private String payReceipt; + + /** + * 服务费(分) + */ + private Long serviceChargeMoney; + + + /*** + * 企业支付(分) + */ + private Long qyzf; + + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ + private Integer isRefund; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 三方订单号 + */ + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + private Long isOut; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * B2B回执单地址 + */ + private String payReceiptB2b; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + /** + * 运营商服务费率 + */ + private BigDecimal opServiceChargeRate; + + /** + * 运营商分润(分) + */ + private Long opServiceChargeMoney; + + /** + * 孵化中心服务费率 + */ + private BigDecimal fhzxServiceChargeRate; + + /** + * 孵化中心收益(分) + */ + private Long fhzxServiceChargeMoney; + + /** + * 孵化中心id + */ + private Long fhzxChannelId; + + /** + * 总监服务费率 + */ + private BigDecimal zjServiceChargeRate; + + /** + * 总监收益(分) + */ + private Long zjServiceChargeMoney; + + /** + * 总监id + */ + private Long zjChannelId; + + /** + * 业务员服务费率 + */ + private BigDecimal ywyServiceChargeRate; + + /** + * 业务员收益(分) + */ + private Long ywyServiceChargeMoney; + + /** + * 业务员id + */ + private Long ywyChannelId; + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + private String billRemark; + + + private String errorMsg; + + private String password; + + private String payStatuStrs; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java new file mode 100644 index 0000000..541839a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillDetailVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.bill.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.bill.domain.RemoteMerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 账单明细Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerBillDetailVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java new file mode 100644 index 0000000..beae61e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/convert/MerBillVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.bill.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.bill.domain.RemoteMerBillVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 账单Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerBillVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java new file mode 100644 index 0000000..cf36bc3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillDetailVo.java @@ -0,0 +1,589 @@ +package org.dromara.payment.bill.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.payment.bill.domain.MerBillDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 账单明细视图对象 mer_bill_detail + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerBillDetail.class) +public class MerBillDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + /** + * 项目子编号 + */ + @ExcelProperty(value = "项目子编号") + private String cno; + + /** + * 流水号(系统内部编号) + */ + @ExcelProperty(value = "订单号") + private String busNo; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "账单批次号") + private String billNo; + + + @ExcelProperty(value = "企业名称") + private String merName; + + @ExcelProperty(value = "服务商名称") + private String sydName; + + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + + /** + * 账单id + */ +// @ExcelProperty(value = "账单id") + @ExcelIgnore + private Long billId; + + /** + * 自雇者id + */ +// @ExcelProperty(value = "自雇者id") + @ExcelIgnore + private Long workerId; + + /** + * 姓名 + */ + @ExcelProperty(value = "收款人") + private String workerName; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String cardId; + + + /** + * 银行账号 + */ + @ExcelProperty(value = "结算账户") + private String bankCard; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String workerPhone; + + /** + * 自雇者报名id + */ +// @ExcelProperty(value = "自雇者报名id") + @ExcelIgnore + private Long workerEnrollId; + + + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + + /** + * 银行账户id + */ + @ExcelIgnore + private Integer bankAccId; + + /** + * 开户行 + */ +// @ExcelProperty(value = "开户行") + @ExcelIgnore + private String bankCheque; + + + /** + * 账单金额(个人应得) + */ + @ExcelIgnore + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + @ExcelProperty(value = "交易金额(元)") + private String moneyStr; + + /** + * 个税 + */ +// @ExcelProperty(value = "个税") + @ExcelIgnore + private Long raise; + + /** + * 实收金额(账单金额-个人承担的服务费)(到手金额) + */ +// @ExcelProperty(value = "实收金额(账单金额-个人承担的服务费)", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "到=手金额") + + @ExcelIgnore + private Long amount; + + public String getAmountStr() { + return StringUtils.fenToYuanFormatter(this.amount); + } + + @ExcelProperty(value="打款金额(元)") + private String amountStr; + + /** + * 支付结果(0:待支付 1:成功 2:失败 3:支付中 4:已取消) + */ + @ExcelProperty(value = "打款状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=待支付,1=成功,2=失败,3=支付中,4=已取消") + private Integer payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "备注") + private String payRemark; + + /** + * B2C回执单地址 + */ +// @ExcelProperty(value = "B2C回执单地址") + @ExcelIgnore + private String payReceipt; + + /** + * 服务费(分) + */ +// @ExcelProperty(value = "服务费(分)") + @ExcelIgnore + private Long serviceChargeMoney; + + + /** + * 交易号(银行流水号) + */ + @ExcelProperty(value = "交易号(银行流水号)") + private String bankNo; + + /** + * 计算代理费金额(公司开票金额C/个人应得金额P) + */ +// @ExcelProperty(value = "计算代理费金额", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "公=司开票金额C/个人应得金额P") + @ExcelIgnore + private Long agentMoney; + + /** + * 是否退款(0:否 1:是) + */ +// @ExcelProperty(value = "是否退款", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + @ExcelIgnore + private Integer isRefund; + + /** + * 退款时间 + */ +// @ExcelProperty(value = "退款时间") + @ExcelIgnore + private Date refundTime; + + /** + * 三方订单号 + */ +// @ExcelProperty(value = "三方订单号") + @ExcelIgnore + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ +// @ExcelProperty(value = "是否三方订单", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + @ExcelIgnore + private Long isOut; + + + + /** + * 项目id + */ +// @ExcelProperty(value = "项目id") + @ExcelIgnore + private Long taskId; + + /** + * 项目编号 + */ +// @ExcelProperty(value = "项目编号") + @ExcelIgnore + private String taskNo; + + /** + * 结算中心id + */ +// @ExcelProperty(value = "结算中心id") + @ExcelIgnore + private Long sydId; + + /** + * 结算中心编号 + */ +// @ExcelProperty(value = "结算中心编号") + @ExcelIgnore + private String sydNo; + + /** + * 运营商编号 + */ +// @ExcelProperty(value = "运营商编号") + @ExcelIgnore + private String opNo; + + /** + * 运营商id + */ +// @ExcelProperty(value = "运营商id") + @ExcelIgnore + private Long opId; + + /** + * 代理商id + */ +// @ExcelProperty(value = "代理商id") + @ExcelIgnore + private Long channelId; + + /** + * 代理商编号 + */ +// @ExcelProperty(value = "代理商编号") + @ExcelIgnore + private String channelNo; + + /** + * 代理商上下级关系编码 + */ +// @ExcelProperty(value = "代理商上下级关系编码") + @ExcelIgnore + private String channelCode; + + /** + * 商户id + */ +// @ExcelProperty(value = "商户id") + @ExcelIgnore + private Long merId; + + /** + * 商户编号 + */ +// @ExcelProperty(value = "商户编号") + @ExcelIgnore + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ +// @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包")\ + @ExcelIgnore + private Integer busType; + + /** + * B2B回执单地址 + */ +// @ExcelProperty(value = "B2B回执单地址") + @ExcelIgnore + private String payReceiptB2b; + + @ExcelProperty(value = "计费模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=个人应得计费,2=开票金额计费") +// @ExcelIgnore + private Integer chargeMode; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") +// @ExcelIgnore + private String proNo; + + public String getShServiceChargeRateStr() { + return StringUtils.perStr(this.shServiceChargeRate); + } + + @ExcelProperty(value = "产品费率") + private String shServiceChargeRateStr; + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ +// @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") +//// @ExcelIgnore +// private Integer chargeMode; + + /** + * 运营商服务费率 + */ +// @ExcelProperty(value = "运营商服务费率") + @ExcelIgnore + private BigDecimal opServiceChargeRate; + + + public String getOpServiceChargeRateStr() { + return StringUtils.perStr(this.opServiceChargeRate); + } + + @ExcelProperty(value = "运营商服务费率") + private String opServiceChargeRateStr; + + /** + * 运营商分润(分) + */ +// @ExcelProperty(value = "运营商分润(分)") + @ExcelIgnore + private Long opServiceChargeMoney; + + public String getOpServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.opServiceChargeMoney); + } + @ExcelProperty(value = "运营商分润") + private String opServiceChargeMoneyStr ; + + /** + * 运营商名称 + */ + @ExcelProperty(value = "运营商名称") +// @ExcelIgnore + private String opName; + + /** + * 孵化中心名称 + */ + @ExcelProperty(value = "孵化中心名称") +// @ExcelIgnore + private String fhzxChannelName; + + /** + * 孵化中心服务费率 + */ +// @ExcelProperty(value = "孵化中心服务费率") + @ExcelIgnore + private BigDecimal fhzxServiceChargeRate; + + + public String getFhzxServiceChargeRateStr() { + return StringUtils.perStr(this.fhzxServiceChargeRate); + } + @ExcelProperty(value = "孵化中心服务费率") + private String fhzxServiceChargeRateStr; + + + /** + * 孵化中心收益(分) + */ +// @ExcelProperty(value = "孵化中心收益(分)") + @ExcelIgnore + private Long fhzxServiceChargeMoney; + + public String getFhzxServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.fhzxServiceChargeMoney); + } + @ExcelProperty(value = "孵化中心收益") + private String fhzxServiceChargeMoneyStr; + + /** + * 孵化中心id + */ +// @ExcelProperty(value = "孵化中心id") + @ExcelIgnore + private Long fhzxChannelId; + + + /** + * 总监名称 + */ + @ExcelProperty(value = "总监名称") +// @ExcelIgnore + private String zjChannelName; + + /** + * 总监服务费率 + */ +// @ExcelProperty(value = "总监服务费率") + @ExcelIgnore + private BigDecimal zjServiceChargeRate; + + public String getZjServiceChargeRateStr() { + return StringUtils.perStr(this.zjServiceChargeRate); + } + + @ExcelProperty(value = "总监服务费率") + private String zjServiceChargeRateStr; + + /** + * 总监收益(分) + */ +// @ExcelProperty(value = "总监收益(分)") + @ExcelIgnore + private Long zjServiceChargeMoney; + + public String getZjServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.zjServiceChargeMoney); + } + + @ExcelProperty(value = "总监收益") + private String zjServiceChargeMoneyStr; + + /** + * 总监id + */ +// @ExcelProperty(value = "总监id") + @ExcelIgnore + private Long zjChannelId; + + /** + * 业务员名称 + */ + @ExcelProperty(value = "业务员名称") +// @ExcelIgnore + private String ywyChannelName; + + + /** + * 业务员服务费率 + */ +// @ExcelProperty(value = "业务员服务费率") + @ExcelIgnore + private BigDecimal ywyServiceChargeRate; + + public String getYwyServiceChargeRateStr() { + return StringUtils.perStr(this.ywyServiceChargeRate); + } + @ExcelProperty(value = "业务员服务费率") + private String ywyServiceChargeRateStr; + + + /** + * 业务员收益(分) + */ +// @ExcelProperty(value = "业务员收益(分)") + @ExcelIgnore + private Long ywyServiceChargeMoney; + + + public String getYwyServiceChargeMoneyStr() { + return StringUtils.fenToYuanFormatter(this.ywyServiceChargeMoney); + } + + @ExcelProperty(value = "业务员收益") + private String ywyServiceChargeMoneyStr; + + /** + * 业务员id + */ +// @ExcelProperty(value = "业务员id") + @ExcelIgnore + private Long ywyChannelId; + + + /** + * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常) + */ +// @ExcelProperty(value = "分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常)") + @ExcelIgnore + private Integer channelHalveStatus; + + /** + * 转账附言 + */ + @ExcelProperty(value = "银行附言") + private String billRemark; + + /** + * 平台分润(分) + */ + @ExcelIgnore + private Long ptServiceChargeMoney; + + /** + * 平台分润状态(0:待支付 1:成功 2:失败 3:支付中) + */ + @ExcelIgnore + private Integer ptHalveStatus; + + /** + * 平台分润失败原因 + */ + @ExcelIgnore + private String ptHalveRemark; + + @ExcelIgnore + private BigDecimal shServiceChargeRate; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java new file mode 100644 index 0000000..efdd098 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/domain/vo/MerBillVo.java @@ -0,0 +1,448 @@ +package org.dromara.payment.bill.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.bill.domain.MerBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.common.domain.vo.BusOperLogVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 账单视图对象 mer_bill + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerBill.class) +public class MerBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + + /** + * 项目id + */ +// @ExcelProperty(value = "项目id") + @ExcelIgnore + private Long taskId; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + /** + * 批次号(商户编号YYYYMMDD-两位编号) + */ + @ExcelProperty(value = "批次号") + private String no; + + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String merName; + + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "产品类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=委托代征") + private Integer busType; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + + /** + * 服务费承担方式(1:用工企业承担 2:自由职业者承担) + */ + @ExcelProperty(value = "服务费承担方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=用工企业承担,2=自由职业者承担") + private Long serviceChargeType; + + + + /** + * 单月发放上限(分) + */ + @ExcelIgnore + private Long maxMonth; + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + @ExcelProperty(value = "单月发放上限") + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=增值税专用发票,2=增值税普通发票,3=差额票") + private Integer invoiceType; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=个人应得计费,2=开票金额计费") + private Integer chargeMode; + + + @ExcelIgnore + private String taskName; + + + /** + * 服务费比例 + */ + @ExcelProperty(value = "服务费率") + private BigDecimal serviceChargeRate; + + /** + * 账单总金额(分) + */ + + @ExcelIgnore + private Long money; + + + @ExcelProperty(value = "总金额") + private String amountEntStr; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + @ExcelProperty(value = "结算金额") + private String moneyStr; + + public String getAmountStr() { + return StringUtils.fenToYuanFormatter(this.amountEnt - this.serviceChargeAmount); + } + + @ExcelProperty(value="实际打款金额") + private String amountStr; + + + + /** + * 服务费金额(分) + */ + @ExcelIgnore + private Long serviceChargeAmount; + + public String getServiceChargeAmountStr() { + return StringUtils.fenToYuanFormatter(this.serviceChargeAmount); + } + + @ExcelProperty(value = "服务费") + private String serviceChargeAmountStr; + + public String getAmountEntStr() { + return StringUtils.fenToYuanFormatter(this.amountEnt); + } + + /** + * 结算金额(分) + */ + @ExcelIgnore + private Long amountEnt; + + + /** + * 账单状态(0:已提交,1:已接单 2:发放中 3:已发放:4:已撤消 5:已拒单) + */ + @ExcelProperty(value = "批次状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=已提交,1=已接单,2=发放中,3=发放成功,4=已撤消,5=已拒单,6=发放成功,7=发放失败,8=发放部分成功") + private Long status; + + /** + * 发放结果(0:初始状态,1:全部成功 2:全部失败 3:部分成功) + */ + @ExcelProperty(value = "发放结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:全部成功,2=:全部失败,3=:部分成功") + private Long payStatus; + + /** + * 支付完成时间 + */ + @ExcelProperty(value = "支付完成时间") + private Date payTime; + + /** + * 发放类型 + */ + @ExcelProperty(value = "发放类型") + private String giveUpType = "灵工业务"; + + /** + * 发放时间 + */ + @ExcelProperty(value = "发放时间") + private Date giveUpTime; + + /** + * 发放人 + */ + @ExcelProperty(value = "发放人") + private String giveUpBy; + + + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 商户审核状态(1:待审核 2:已拒绝 3:已通过) + */ + @ExcelProperty(value = "商户审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=待审核,2=已拒绝,3=已通过") + private Long verifyStatus; + + /** + * 商户审核人 + */ + @ExcelProperty(value = "商户审核人") + private String verifyBy; + + /** + * 商户审核时间 + */ + @ExcelProperty(value = "商户审核时间") + private Date verifyTime; + + /** + * 商户备注 + */ + @ExcelProperty(value = "商户备注") + private String verifyReason; + + + + /** + * 批次下账单明细数量 + */ + @ExcelProperty(value = "批次下账单明细数量") + private Long detailCount; + + /** + * 代理费是否出账(0:否 1:是) + */ + @ExcelProperty(value = "代理费是否出账", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=否,1=是") + private Long isAgencyFee; + + /** + * 完税税票号 + */ + @ExcelProperty(value = "完税税票号") + private String wssph; + + /** + * 委托代征个税税票号 + */ + @ExcelProperty(value = "委托代征个税税票号") + private String wtdzgssph; + + /** + * 税票号编辑时间 + */ + @ExcelProperty(value = "税票号编辑时间") + private Date sphTime; + + /** + * 税票号编辑人 + */ + @ExcelProperty(value = "税票号编辑人") + private String sphBy; + + /** + * 三方订单号 + */ + @ExcelProperty(value = "三方订单号") + private String outNo; + + /** + * 是否三方订单(0:否 1:是) + */ + @ExcelProperty(value = "是否三方订单", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=否,1=是") + private Long isOut; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + + + + + /** + * 产品id + */ +// @ExcelProperty(value = "产品id") + @ExcelIgnore + private Long proId; + + + /** + * 结算中心审核状态(1:待审核 2:已拒绝 3:已通过) + */ + @ExcelProperty(value = "结算中心审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=待审核,2=已拒绝,3=已通过") + private Integer sydVerifyStatus; + + /** + * 结算中心审核人 + */ +// @ExcelProperty(value = "结算中心审核人") + @ExcelIgnore + private String sydVerifyBy; + + /** + * 结算中心审核时间 + */ + //@ExcelProperty(value = "结算中心审核时间") + @ExcelIgnore + private Date sydVerifyTime; + + /** + * 结算中心备注 + */ + //@ExcelProperty(value = "结算中心备注") + @ExcelIgnore + private String sydVerifyReason; + + /** + * 开票状态(0:待开票 1:已开票) + */ + @ExcelProperty(value = "开票状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=待开票,1=已开票") + private Integer isInvoice; + + + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=到卡,2=余额") + private Integer settlementStyle; + /** + * 操作日志 + */ + @ExcelIgnore + private List logs; + + /** + * 业务备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java new file mode 100644 index 0000000..e3e4601 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/listener/BillImportListener.java @@ -0,0 +1,88 @@ +package org.dromara.payment.bill.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.core.IExcelListener; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.service.IMerBillService; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Map; + +/** + * 派单批量打款导入 + * + * @author Lion Li + */ +@Slf4j +public class BillImportListener extends AnalysisEventListener> implements IExcelListener,MerBillDetailBo> { + + private final IMerBillService billService; + + private AddBillBo bo; + + private ExcelResult result; + + private int row = 0; + + public BillImportListener(AddBillBo bo) { +// this.bo = MapstructUtils.convert(bo,AddBillBo.class); + this.bo = bo; + this.billService = SpringUtils.getBean(IMerBillService.class); + } + + @Override + public void invoke(Map data, AnalysisContext context) { + try { + if(row == 1){ + bo.setNo(data.get(1)); + }else if (row > 2){ + if(StringUtils.isNotBlank(data.get(0)) && StringUtils.isNotBlank(data.get(1)) && StringUtils.isNotBlank(data.get(2))){ + int size = data.size(); + if(bo.getDetails() == null){ + bo.setDetails(new ArrayList<>()); + } + if(bo.getDetails().size() >= 500){ + throw new ServiceException("单批次最大支持500条订单"); + } + MerBillDetailBo detail = new MerBillDetailBo(); + detail.setWorkerName(data.get(0)); + detail.setCardId(data.get(1)); + detail.setPassage(this.bo.getPassage()); + detail.setMoneyDecimal(new BigDecimal(data.get(2))); + if(size > 3){ + detail.setBankCard(data.get(3)); + } + if(size > 4){ + detail.setBankType(data.get(4)); + } + bo.getDetails().add(detail); + } + } + } catch (Exception e) { + log.error("第"+(row+2)+"行读取excel出错("+ JsonUtils.toJsonString(data) +"):", e); + throw e; + } + row++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + result = billService.onlinePaymentImport(bo); + } + + @Override + public ExcelResult getExcelResult() { + return result; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java new file mode 100644 index 0000000..7e7dc89 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillDetailMapper.java @@ -0,0 +1,28 @@ +package org.dromara.payment.bill.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.bill.domain.vo.MerBillVo; + +import java.util.List; + +/** + * 账单明细Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerBillDetailMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + List selectAmountByCards(List cardIds,Integer proId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java new file mode 100644 index 0000000..a08dcb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/mapper/MerBillMapper.java @@ -0,0 +1,26 @@ +package org.dromara.payment.bill.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydProduct; + +import java.util.List; + +/** + * 账单Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerBillMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + Integer queryListCount(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java new file mode 100644 index 0000000..b34f7d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillDetailService.java @@ -0,0 +1,85 @@ +package org.dromara.payment.bill.service; + +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 账单明细Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerBillDetailService { + + /** + * 查询账单明细 + */ + MerBillDetailVo queryById(Long id); + + /** + * 查询账单明细列表 + */ + TableDataInfo queryPageList(MerBillDetailBo bo, PageQuery pageQuery); + + /** + * 查询账单明细列表 + */ + List queryList(MerBillDetailBo bo); + + /** + * 新增账单明细 + */ + Boolean insertByBo(MerBillDetailBo bo); + + /** + * 修改账单明细 + */ + Boolean updateByBo(MerBillDetailBo bo); + + /** + * 校验并批量删除账单明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 退账单明细 + * @author 张涛 + * @date 2022年3月3日 + * @param busNo 账单明细编号 + * @param trxamt 交易金额 + * @param reason 原因 + * @return 是否退账单明细 + */ + public boolean refundBillDetail(String busNo,Long trxamt,String reason); + + /** + * 处理代发整体完成后的结果 + * @param billId + */ + public void billResult(long billId); + + /** + * 代发明细失败 + * @param billId 代发id + * @param id 代发明细id + * @param reason 失败原因 + * @param isRefund 是否退款(0:否 1:是) + * @param isOut 是否三方代发 + */ + Boolean failBillDetail(long billId,Long id,String reason,int isRefund,Long isOut); + + + /**** + * 补发失败的明细 + * @param bo + * @return + */ + int rePay(MerBillDetailBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java new file mode 100644 index 0000000..9280562 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/IMerBillService.java @@ -0,0 +1,139 @@ +package org.dromara.payment.bill.service; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; +import java.util.function.Supplier; + +/** + * 账单Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerBillService { + /** + * 查询账单 + */ + MerBillVo queryById(Long id); + + /** + * 查询账单 + */ + MerBillVo queryByNo(String no); + + /** + * 查询账单列表 + */ + TableDataInfo queryPageList(MerBillBo bo, PageQuery pageQuery); + + /** + * 查询账单列表 + */ + List queryList(MerBillBo bo); + + Integer queryListCount(MerBillBo bo); + + /** + * 在线打款导入验证 + * @param bo + * @return + */ + public ExcelResult onlinePaymentImport(AddBillBo bo); + + /** + * 抢单项目打款导入验证 + * @param bo + * @return + */ + public ExcelResult qdPaymentImport(AddBillBo bo); + + /** + * 新增账单 + */ + Boolean insertByBo(AddBillBo bo); + + /** + * 接单审核 + */ + Boolean orderApproval(MerBillBo bo); + + /** + * 出款审批 + */ + Boolean paymentApproval(MerBillBo bo); + + /** + * 修改账单 + */ + Boolean updateByBo(MerBillBo bo); + + /** + * 校验并批量删除账单信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 商户转账到服务商B2B + * @param billId + * @return + */ + Boolean paymentToService(int billId); + + /** + * 服务商转账到个人B2C + * @param billDetailId + * @return + */ + Boolean paymentToWorker(int billDetailId); + + /** + * 服务商转账到个人B2C + * @return + */ + Boolean paymentToWorkers(MerBillVo bill); + + /** + * 代发交易业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog billTransaction(TranLogVo tlog, TransactionLog tran); + + /** + * 代发交易业务回置单 + * @param tlog 交易记录 + * @param callback 回置单地址 + * @return + */ + Boolean billTransactionCallback(TranLogVo tlog, String callback); + + /** + * 验证支付密码 + * @param role 角色 + * @param busId 业务id(商户id或服务商id) + * @param supplier 验证密码结果函数 + */ + Boolean checkPayPassword(BusRole role, long busId, Supplier supplier); + + + /*** + * 服务商验证 + * @param bo + */ + + public void validateSysSyd(AddBillBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java new file mode 100644 index 0000000..41f31dd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillDetailServiceImpl.java @@ -0,0 +1,425 @@ +package org.dromara.payment.bill.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.enums.BusLogType; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.util.MoneyUtils; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.service.IUserWorkerAccountService; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 账单明细Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class MerBillDetailServiceImpl implements IMerBillDetailService { + + private final MerBillMapper billMapper; + + private final BusMerchantMapper shDao; + + private final MerBillDetailMapper baseMapper; + + private final BusMerchantMapper merchantMapper; + + private final IUserWorkerAccountService userWorkerAccountService; + + private final MerTaskEnrollMapper taskEnrollMapper; + + private final UserWorkerAccountMapper userWorkerAccountMapper; + + private final BusMerchantAccountMapper merchantAccountMapper; + + + private final BusOperLogMapper operLogMapper; + + private final StreamBridge streamBridge; + + + @DubboReference + private RemoteNoticeService noticeService; + + /** + * 查询账单明细 + */ + @Override + public MerBillDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询账单明细列表 + */ + @Override + public TableDataInfo queryPageList(MerBillDetailBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询账单明细列表 + */ + @Override + public List queryList(MerBillDetailBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerBillDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getCno()), "t.cno", bo.getCno()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), "t.bus_no", bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), "t.bill_no", bo.getBillNo()); + lqw.eq(bo.getBillId() != null, "t.bill_id", bo.getBillId()); + lqw.eq(bo.getWorkerId() != null, "t.worker_id", bo.getWorkerId()); + lqw.like(StringUtils.isNotBlank(bo.getWorkerName()), "t.worker_name", bo.getWorkerName()); + lqw.eq(StringUtils.isNotBlank(bo.getWorkerPhone()), "t.worker_phone", bo.getWorkerPhone()); + lqw.eq(bo.getWorkerEnrollId() != null, "t.worker_enroll_id", bo.getWorkerEnrollId()); + lqw.like(StringUtils.isNotBlank(bo.getCardId()), "t.card_id", bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "t.bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCheque()), "t.bank_cheque", bo.getBankCheque()); + lqw.eq(bo.getMoney() != null, "t.money", bo.getMoney()); + lqw.eq(bo.getRaise() != null, "t.raise", bo.getRaise()); + lqw.eq(bo.getAmount() != null, "t.amount", bo.getAmount()); + lqw.eq(bo.getPayStatus() != null, "t.pay_status", bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, "t.pay_time", bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), "t.pay_remark", bo.getPayRemark()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), "t.pay_receipt", bo.getPayReceipt()); + lqw.eq(bo.getServiceChargeMoney() != null, "t.service_charge_money", bo.getServiceChargeMoney()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), "t.bank_no", bo.getBankNo()); + lqw.eq(bo.getAgentMoney() != null, "t.agent_money", bo.getAgentMoney()); + lqw.eq(bo.getIsRefund() != null, "t.is_refund", bo.getIsRefund()); + lqw.eq(bo.getRefundTime() != null, "t.refund_time", bo.getRefundTime()); + lqw.eq(StringUtils.isNotBlank(bo.getOutNo()), "t.out_no", bo.getOutNo()); + lqw.eq(bo.getIsOut() != null, "t.is_out", bo.getIsOut()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "t.passage", bo.getPassage()); + lqw.eq(bo.getTaskId() != null, "t.task_id", bo.getTaskId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "t.task_no", bo.getTaskNo()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(bo.getBusType() != null, "t.bus_type", bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceiptB2b()), "t.pay_receipt_b2b", bo.getPayReceiptB2b()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), "t.pro_no", bo.getProNo()); + lqw.eq(bo.getChargeMode() != null, "t.charge_mode", bo.getChargeMode()); + lqw.eq(bo.getOpServiceChargeRate() != null, "t.op_service_charge_rate", bo.getOpServiceChargeRate()); + lqw.eq(bo.getOpServiceChargeMoney() != null, "t.op_service_charge_money", bo.getOpServiceChargeMoney()); + lqw.eq(bo.getFhzxServiceChargeRate() != null, "t.fhzx_service_charge_rate", bo.getFhzxServiceChargeRate()); + lqw.eq(bo.getFhzxServiceChargeMoney() != null, "t.fhzx_service_charge_money", bo.getFhzxServiceChargeMoney()); + lqw.eq(bo.getFhzxChannelId() != null, "t.fhzx_channel_id", bo.getFhzxChannelId()); + lqw.eq(bo.getZjServiceChargeRate() != null, "t.zj_service_charge_rate", bo.getZjServiceChargeRate()); + lqw.eq(bo.getZjServiceChargeMoney() != null, "t.zj_service_charge_money", bo.getZjServiceChargeMoney()); + lqw.eq(bo.getZjChannelId() != null, "t.zj_channel_id", bo.getZjChannelId()); + lqw.eq(bo.getYwyServiceChargeRate() != null, "t.ywy_service_charge_rate", bo.getYwyServiceChargeRate()); + lqw.eq(bo.getYwyServiceChargeMoney() != null, "t.ywy_service_charge_money", bo.getYwyServiceChargeMoney()); + lqw.eq(bo.getYwyChannelId() != null, "t.ywy_channel_id", bo.getYwyChannelId()); + lqw.eq(bo.getChannelHalveStatus() != null, "t.channel_halve_status", bo.getChannelHalveStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getBillRemark()), "t.bill_remark", bo.getBillRemark()); + lqw.in(StringUtils.isNotBlank(bo.getPayStatuStrs()),"t.pay_status",StringUtils.splitTo(bo.getPayStatuStrs(), Convert::toInt)); + lqw.in(StringUtils.isNotBlank(bo.getBillIds()),"t.bill_id",StringUtils.splitTo(bo.getBillIds(), Convert::toLong)); + lqw.in(StringUtils.isNotBlank(params.get("ids")),"t.id",StringUtils.splitTo((String)params.get("ids"), Convert::toLong)); + if(StringUtils.isNotBlank(params.get("begin_date")) && StringUtils.isNotBlank(params.get("end_date"))){ + lqw.between("t.add_time",bo.getParams().get("begin_date")+" 00:00:00",bo.getParams().get("end_date")+" 23:59:59"); + } + if(StringUtils.isNotBlank(params.get("syd_name"))){ + lqw.like("t2.gsmc",params.get("syd_name")); + } + if(StringUtils.isNotBlank(params.get("mer_name"))){ + lqw.like("t1.`name`",params.get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(params.get("op_name"))){ + lqw.like("t3.name",params.get("op_name")); + } + if(StringUtils.isNotBlank(params.get("fhzx_channel_name"))){ + lqw.like("t4.name",params.get("fhzx_channel_name")); + } + if(StringUtils.isNotBlank(params.get("zj_channel_name"))){ + lqw.like("t5.name",params.get("zj_channel_name")); + } + if(StringUtils.isNotBlank(params.get("ywy_channel_name"))){ + lqw.like("t6.name",params.get("ywy_channel_name")); + } + if(StringUtils.isNotBlank(params.get("fhzx_channel_no"))){ + lqw.eq("t4.no",params.get("fhzx_channel_no")); + } + if(StringUtils.isNotBlank(params.get("zj_channel_no"))){ + lqw.eq("t5.no",params.get("zj_channel_no")); + } + if(StringUtils.isNotBlank(params.get("ywy_channel_no"))){ + lqw.eq("t6.no",params.get("ywy_channel_no")); + } + + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 新增账单明细 + */ + @Override + public Boolean insertByBo(MerBillDetailBo bo) { + MerBillDetail add = MapstructUtils.convert(bo, MerBillDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改账单明细 + */ + @Override + public Boolean updateByBo(MerBillDetailBo bo) { + MerBillDetail update = MapstructUtils.convert(bo, MerBillDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerBillDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除账单明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 退账单明细 + * @author 张涛 + * @date 2022年3月3日 + * @param busNo 账单明细编号 + * @param trxamt 交易金额 + * @param reason 原因 + * @return 是否退账单明细 + */ + @Transactional(rollbackFor = Exception.class) + public boolean refundBillDetail(String busNo,Long trxamt,String reason) { + MerBillDetail billDetail = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBillDetail::getBusNo,busNo)); + if(billDetail != null && billDetail.getAmount().equals(trxamt)) { + if(billDetail.getPayStatus() != 1 && billDetail.getPayStatus() != 2) { + throw new ServiceException("订单["+busNo+"]处理中,退款操作["+reason+"]延后处理"); + } + if(billDetail.getPayStatus() == 1 && billDetail.getIsRefund() != 1) {//只退票已成功的 + //不用退服务费 + failBillDetail(billDetail.getBillId(),billDetail.getId(),reason,1,null); + } + return true; + } + return false; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean failBillDetail(long billId,Long id,String reason,int isRefund,Long isOut) { + if(id != null) { + MerBillDetail billDetail = baseMapper.selectById(id); + if(billDetail.getPayStatus() != 3){ + return false; + } + baseMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId, id) + .eq(MerBillDetail::getPayStatus, isRefund == 1 ? 1 : 3) + .set(MerBillDetail::getPayStatus, 2) + .set(MerBillDetail::getIsRefund,isRefund) + .set(MerBillDetail::getPayRemark, reason) + .set(MerBillDetail::getPayTime, new Date())); + if(billDetail.getWorkerEnrollId() != null && billDetail.getWorkerEnrollId() > 0) { + //如果是退款,则从成功转到待结算,如果是直接失败,则从结算中到待结算 + taskEnrollMapper.update(new LambdaUpdateWrapper().eq(MerTaskEnroll::getId,billDetail.getWorkerEnrollId()) + .eq(MerTaskEnroll::getSettlementStatus,isRefund == 1 ? 1 : 2) + .set(MerTaskEnroll::getSettlementStatus,0));//待结算 + } + }else { + baseMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, billId) + .eq(MerBillDetail::getPayStatus, isRefund == 1 ? 1 : 3) + .set(MerBillDetail::getPayStatus, 2) + .set(MerBillDetail::getIsRefund,isRefund) + .set(MerBillDetail::getPayRemark, reason) + .set(MerBillDetail::getPayTime, new Date())); + taskEnrollMapper.updateSettlementStatusByBillId(billId,isRefund == 1 ? 1 : 2,0); + } + billResult(billId); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int rePay(MerBillDetailBo bo) { + MerBillDetailVo merBillDetailVo = this.baseMapper.selectVoById(bo.getId()); + if(merBillDetailVo == null){ + throw new ServiceException("账单明细ID无效"); + } + + if(merBillDetailVo.getPayStatus() != 2){ + throw new ServiceException("账单明细状态不正确,不能进行补发!"); + } + SpringUtils.getBean(IMerBillService.class).checkPayPassword(BusRole.MERCHANT, merBillDetailVo.getMerId(), () -> { + BusMerchant merchant = merchantMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchant::getId,merBillDetailVo.getMerId())); + if(StringUtils.isBlank(merchant.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(merchant.getPayPassword()); + }); + + log.info("补发账单原始数据:"+ JsonUtils.toJsonString(merBillDetailVo)); + log.info("补发账单修改数据:"+ JsonUtils.toJsonString(bo)); + + + bo.setPayStatus(3); //支付中 + + UserWorkerAccountBo uwab = new UserWorkerAccountBo(); + uwab.setWorkId(merBillDetailVo.getWorkerId()); + uwab.setPassage(merBillDetailVo.getPassage()); + uwab.setBankCard(bo.getBankCard()); + uwab.setBankType(bo.getBankType()); + uwab.setPhone(merBillDetailVo.getWorkerPhone()); + + UserWorkerAccount uwa = this.userWorkerAccountService.rePayMdyWorkerBank(uwab); + if(uwa == null){ + throw new ServiceException("添加用户银行账户错误!"); + } + bo.setBankAccId(uwa.getAccId().intValue()); + String[] mns = merBillDetailVo.getMerNo().split("-"); + bo.setBusNo("T"+mns[mns.length - 1]+IdUtil.getSnowflakeNextIdStr()); + MerBillDetail update = MapstructUtils.convert(bo, MerBillDetail.class); + this.baseMapper.updateById(update); + operLogMapper.insert(new BusOperLog("商户提交补发出款指令,明细ID:"+bo.getId(), BusRole.MERCHANT,merBillDetailVo.getBillId(),BusLogType.BILL.getId())); + JSONObject queueParam = new JSONObject(); + queueParam.put("billDetailId", bo.getId()); + streamBridge.send("bill-out-0", MessageBuilder.withPayload(queueParam).build()); + return 1; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void billResult(long billId) { + MerBillDetail where = new MerBillDetail(); + where.setBillId(billId); + Long status = 3l;//账单状态(0:初始状态,1:待支付 2:支付中 3:已支付:4:已取消) + boolean existsSuccess = false;//是否存在成功的 + boolean existsFail = false;//是否存在失败的 + List details = baseMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,billId).in(MerBillDetail::getPayStatus,0,1,2,3)); + for (MerBillDetail d : details) { + if (d.getPayStatus() == 0 || d.getPayStatus() == 3) { + status = null; + break; + } + if (d.getPayStatus() == 1) { + existsSuccess = true; + } + if (d.getPayStatus() == 2) { + existsFail = true; + } + } + if (status != null) { + MerBill bill = billMapper.selectById(billId); + MerBill updBill = new MerBill(); + updBill.setId(billId); + updBill.setStatus(status); + //支付结果(0:初始状态,1:全部成功 2:全部失败 3:部分失败) + if (existsSuccess && existsFail) { + updBill.setPayStatus(3l); + }else if (!existsSuccess && existsFail) { + updBill.setPayStatus(2l); + }else if (existsSuccess && !existsFail) { + updBill.setPayStatus(1l); + } + if(bill.getPayTime() == null) { + updBill.setPayTime(new Date()); + } + billMapper.updateById(updBill); + if(bill.getPayTime() == null) { + BusMerchant merchant = shDao.selectById(bill.getMerId()); + String msg = String.format("%s商户在%s项目%s批次进行企业代付,支付金额%s元", merchant.getName(), bill.getTaskNo(), bill.getNo(), MoneyUtils.getMoneyFormatYuan(bill.getAmountEnt())); + if (existsFail) { + msg = msg + ",存在失败的"; + } + try{ + noticeService.addNotice(new RemoteSysNoticeVo("批次代发通知", msg, bill.getMerId().intValue(), BusRole.MERCHANT)); + noticeService.addNotice(new RemoteSysNoticeVo("批次代发通知", msg, bill.getSydId().intValue(), BusRole.SERVICE)); + }catch(Exception e){ + e.printStackTrace(); + } + } + if(updBill.getPayStatus() == 1) {//全部成功 + merchantAccountMapper.updateInvoiceSettlement(bill.getSydId(), bill.getMerId(), bill.getAmountEnt(), bill.getPassage()); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java new file mode 100644 index 0000000..0d83d99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/bill/service/impl/MerBillServiceImpl.java @@ -0,0 +1,1723 @@ +package org.dromara.payment.bill.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.IdcardUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.core.DefaultExcelResult; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.bo.AddBillBo; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.enums.BusLogType; +import org.dromara.payment.merchant.domain.*; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; +import org.dromara.payment.merchant.mapper.*; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.*; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.properties.PayPasswordProperties; +import org.dromara.payment.sys.domain.*; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.*; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.dromara.payment.util.MoneyUtils; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.payment.worker.service.IIdCardAndOtherService; +import org.dromara.payment.worker.service.IUserWorkerAccountService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.time.Duration; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * 账单Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class MerBillServiceImpl extends BaseService implements IMerBillService { + + private final MerBillMapper baseMapper; + + private final SysSydMapper sydMapper; + + private final MerTaskMapper taskMapper; + + private final BusAccountsMapper accountsMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusOperatorFlowsMapper operatorFlowsMapper; + + private final MerBillDetailMapper billDetailMapper; + + private final MerTaskEnrollMapper taskEnrollMapper; + + private final BusMerchantMapper merchantMapper; + + private final BusMerchantConfigMapper merchantConfigMapper; + + private final BusMerchantFlowsMapper merchantFlowsMapper; + + private final SysSydFlowsMapper sydFlowsMapper; + + private final UserWorkerMapper userWorkerMapper; + + private final BusMerchantMapper busMerchantMapper; + + private final UserWorkerAccountMapper workerAccountDao;//自雇者账户dao + + private final IUserWorkerAccountService userWorkerAccountService; //自雇者账户服务 + + private final BusMerchantAccountMapper merchantAccountMapper; + + private final IBusMerchantAccountService merchantAccountService; + + private final SysSydAccountMapper sydAccountDao;//结算中心账户dao + + private final ISysSydAccountService sydAccountService; + + private final SysSydConfigMapper sydConfigMapper; + + private final BusChannelMapper channelMapper; + + private final BusChannelProductMapper channelProductMapper; + + private final BusOperatorProductMapper operatorProductMapper; + + private final BusOperatorAccountMapper operatorAccountMapper; + + private final IBusOperatorAccountService operatorAccountService; + + private final BusChannelAccountMapper channelAccountMapper; + + private final IBusChannelAccountService channelAccountService; + + private final BusChannelFlowsMapper channelFlowsMapper; + + private final BusOperLogMapper operLogMapper; + + private final BusMerchantProductMapper busMerchantProductMapper; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final IMerBillDetailService billDetailService; + + private final ReProductInvoiceMapper reProductInvoiceMapper; + + private final MerBillDetailMapper merBillDetailMapper; + @Resource + private UserWorkerAccountMapper userWorkerAccountMapper; + + @Resource(name="tencentIdCardAndOtherServiceImpl") + public IIdCardAndOtherService tencentIdCardAndOtherService; + + @Resource + private SysSydProductMapper sysSydProductMapper; + + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + @Autowired + private PayPasswordProperties payPasswordProperties; + + @Autowired + private IXyjService xyjService; + /** + * 查询账单 + */ + @Override + public MerBillVo queryById(Long id){ + MerBillBo where = new MerBillBo(); + where.setId(id); + List details = baseMapper.queryList(buildQueryWrapper(where)); + MerBillVo detail = null; + if (details.size() > 0){ + detail = details.get(0); + detail.setLogs(operLogMapper.selectVoList(new LambdaQueryWrapper().eq(BusOperLog::getBusId,id).eq(BusOperLog::getBusType, BusLogType.BILL.getId()))); + } + return detail; + } + + + /** + * 查询账单 + */ + @Override + public MerBillVo queryByNo(String no){ + MerBillBo where = new MerBillBo(); + where.setNo(no); + List details = baseMapper.queryList(buildQueryWrapper(where)); + MerBillVo detail = null; + if (details.size() > 0){ + detail = details.get(0); + detail.setLogs(operLogMapper.selectVoList(new LambdaQueryWrapper().eq(BusOperLog::getBusId,detail.getId()).eq(BusOperLog::getBusType, BusLogType.BILL.getId()))); + } + return detail; + } + + /** + * 查询账单列表 + */ + @Override + public TableDataInfo queryPageList(MerBillBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询账单列表 + */ + @Override + public List queryList(MerBillBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + @Override + public Integer queryListCount(MerBillBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryListCount(lqw); + } + + private QueryWrapper buildQueryWrapper(MerBillBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getId() != null, "t.id", bo.getId()); + lqw.eq(bo.getTaskId() != null, "t.task_id", bo.getTaskId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "t.task_no", bo.getTaskNo()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "t.no", bo.getNo()); + lqw.eq(bo.getServiceChargeType() != null, "t.service_charge_type", bo.getServiceChargeType()); + lqw.eq(bo.getServiceChargeRate() != null, "t.service_charge_rate", bo.getServiceChargeRate()); + lqw.eq(bo.getMoney() != null, "t.money", bo.getMoney()); + lqw.eq(bo.getServiceChargeAmount() != null, "t.service_charge_amount", bo.getServiceChargeAmount()); + lqw.eq(bo.getAmountEnt() != null, "t.amount_ent", bo.getAmountEnt()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getPayStatus() != null, "t.pay_status", bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, "t.pay_time", bo.getPayTime()); + lqw.eq(bo.getGiveUpTime() != null, "t.give_up_time", bo.getGiveUpTime()); + lqw.eq(StringUtils.isNotBlank(bo.getGiveUpBy()), "t.give_up_by", bo.getGiveUpBy()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "t.add_by", bo.getAddBy()); + lqw.eq(bo.getVerifyStatus() != null, "t.verify_status", bo.getVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), "t.verify_by", bo.getVerifyBy()); + lqw.eq(bo.getVerifyTime() != null, "t.verify_time", bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), "t.verify_reason", bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "t.passage", bo.getPassage()); + lqw.eq(bo.getDetailCount() != null, "t.detailCount", bo.getDetailCount()); + lqw.eq(bo.getIsAgencyFee() != null, "t.is_agency_fee", bo.getIsAgencyFee()); + lqw.eq(StringUtils.isNotBlank(bo.getWssph()), "t.wssph", bo.getWssph()); + lqw.eq(StringUtils.isNotBlank(bo.getWtdzgssph()), "t.wtdzgssph", bo.getWtdzgssph()); + lqw.eq(bo.getSphTime() != null, "t.sph_time", bo.getSphTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSphBy()), "t.sph_by", bo.getSphBy()); + lqw.eq(StringUtils.isNotBlank(bo.getOutNo()), "t.out_no", bo.getOutNo()); + lqw.eq(bo.getIsOut() != null, "t.is_out", bo.getIsOut()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), "t.pro_no", bo.getProNo()); + lqw.eq(bo.getProId() != null, "t.pro_id", bo.getProId()); + lqw.eq(bo.getSydVerifyStatus() != null, "t.syd_verify_status", bo.getSydVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyBy()), "t.syd_verify_by", bo.getSydVerifyBy()); + lqw.eq(bo.getSydVerifyTime() != null, "t.syd_verify_time", bo.getSydVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyReason()), "t.syd_verify_reason", bo.getSydVerifyReason()); + lqw.eq(bo.getIsInvoice() != null, "t.is_invoice", bo.getIsInvoice()); + lqw.eq(bo.getBusType() != null, "t.bus_type", bo.getBusType()); + lqw.eq(bo.getSettlementStyle() != null, "t.settlement_style", bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, "t.max_month", bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, "t.invoice_type", bo.getInvoiceType()); + lqw.eq(bo.getChargeMode() != null, "t.charge_mode", bo.getChargeMode()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("syd_name"))){ + lqw.like("t2.gsmc",bo.getParams().get("syd_name")); + } + if(StringUtils.isNotBlank(bo.getParams().get("mer_name"))){ + lqw.like("t1.name",bo.getParams().get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(bo.getParams().get("bill_status"))){ + Integer billStatus = Integer.parseInt(bo.getParams().get("bill_status").toString()); + if(billStatus <= 5){ + lqw.eq("t.status",billStatus); + }else { + lqw.eq("t.status",3); + if(billStatus == 6){//发放成功 + lqw.eq("t.pay_status",1); + }else if(billStatus == 7){//发放失败 + lqw.eq("t.pay_status",2); + }else if(billStatus == 8){//发放部分成功 + lqw.eq("t.pay_status",3); + } + } + } + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 生成代发明细项目子编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @param merNo 商户编号(A10049-B10070-M11312,运营商编号-代理商编号-商户编号) + * @return + */ + public String genBillNo(int retry,int maxRetry,String merNo){ + String no = getBillNo(merNo,DateUtils.dateTimeNow(DateUtils.YYYYMMDD)+"-"+RandomUtil.randomNumbers(7)); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(MerBill::getNo,no); + MerBill exist = baseMapper.selectOne(lqw); + if(exist != null){ + if(retry > maxRetry){ + throw new ServiceException("代发批次号生成出错"); + }else { + no = genBillNo(retry + 1,maxRetry,merNo); + } + } + return no; + } + + @Override + public ExcelResult qdPaymentImport(AddBillBo bo) { + return valiPaymentImport(bo); + } + + @Override + public ExcelResult onlinePaymentImport(AddBillBo bo) { + String curDate = DateUtils.dateTimeNow(DateUtils.YYYYMMDD); + if(!bo.getNo().startsWith(curDate)){ + throw new ServiceException("批次号格式不正确!"); + } + + if(bo.getDetails() == null){ + throw new ServiceException("请录入打款信息"); + } + + MerBill exist = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getNo,getBillNo(bo.getMerNo(),bo.getNo()))); + if(exist != null){ + throw new ServiceException("批次号重复,请勿重复提交!"); + } + return valiPaymentImport(bo); + } + + public ExcelResult valiPaymentImport(AddBillBo bo) { + BusMerchantConfig merchantConfig = merchantConfigMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchantConfig::getMerId,bo.getMerId())); + if(merchantConfig == null){ + merchantConfig = new BusMerchantConfig(0,1,1000l,10000000l,120000000l); + merchantConfig.setIsNothing(0); + } + DefaultExcelResult rtn = new DefaultExcelResult<>(); + rtn.setAllRecords(bo.getDetails().size()); + List cardIds = bo.getDetails().stream().map(MerBillDetailBo::getCardId).distinct().collect(Collectors.toList()); + List workers = userWorkerMapper.selectByCardId(cardIds,bo.getPassage(),bo.getSydId(),bo.getMerId(),bo.getBusType()); + List cntBillAmountList = this.merBillDetailMapper.selectAmountByCards(cardIds,bo.getProId().intValue()); + SysSydProduct sysSydProduct = this.sysSydProductMapper.selectById(bo.getProId()); + if(sysSydProduct == null){ + this.invalidationParamsException("产品参数无效"); + } + //key:身份证号 value:自雇者 + Map cardIdMap = workers.stream().collect(Collectors.toMap(UserWorkerVo::getCardIdNoHide,userWorkerVo -> userWorkerVo)); + + Map cardIdAmoutMap = cntBillAmountList.stream().collect(Collectors.toMap(MerBillDetail::getCardId,merBillDetail -> merBillDetail)); + + for (MerBillDetailBo detail: + bo.getDetails()) { + + if(!IdcardUtil.isValidCard(detail.getCardId())){ + detail.setErrorMsg("身份证号无效!"); + rtn.getList().add(detail); + rtn.getErrorList().add("身份证号无效!"); + continue; + } + + + if(!cardIdMap.containsKey(detail.getCardId())){ + + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + + + //不认证,不签约 + try{ + this.tencentIdCardAndOtherService.cardId2(detail.getWorkerName(),detail.getCardId(),bo.getDomain()); + long id = IdUtil.getSnowflakeNextId(); + UserWorker userWorkerBo = new UserWorker(); + userWorkerBo.setId(id); + detail.setWorkerId(id); + userWorkerBo.setName(detail.getWorkerName()); + userWorkerBo.setCardId(detail.getCardId()); + userWorkerBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBo.setStatus(2); + userWorkerBo.setCreateTime(new Date()); + this.userWorkerMapper.insert(userWorkerBo); + detail.setWorkerId(userWorkerBo.getId()); + UserWorkerVo vo = BeanUtil.copyProperties(userWorkerBo,UserWorkerVo.class); + vo.setIsAuthentication(0L); + vo.setIsAuth(0L); + vo.setIsSign(0L); + cardIdMap.put(detail.getCardId(),vo); + + }catch(BaseException e ){ + rtn.getList().add(detail); + detail.setErrorMsg("身份证校验不通过"); + rtn.getErrorList().add("身份证校验不通过"); + continue; + }catch(Exception e){ + e.printStackTrace(); + rtn.getList().add(detail); + detail.setErrorMsg("身份证校验失败"); + rtn.getErrorList().add("身份证校验失败"); + continue; + } + + + + }else{ + detail.setErrorMsg("客户信息不存在!"); + rtn.getList().add(detail); + rtn.getErrorList().add("客户信息不存在!"); + continue; + } + + }else{ + detail.setWorkerId(cardIdMap.get(detail.getCardId()).getId()); + } + + + + if(!cardIdMap.get(detail.getCardId()).getName().equals(detail.getWorkerName())){ + rtn.getList().add(detail); + detail.setErrorMsg("名字、身份证号不匹配!"); + rtn.getErrorList().add("名字、身份证号不匹配!"); + continue; + } + + + + + if(cardIdAmoutMap.get(detail.getCardId()) !=null && !sysSydProduct.getMaxMonth().equals(0L)){ + + if((cardIdAmoutMap.get(detail.getCardId()).getAmount() + MoneyUtils.getMoneyFen(detail.getMoneyDecimal())) > sysSydProduct.getMaxMonth()){ + detail.setErrorMsg("每月代发金额不能大于"+MoneyUtils.getMoneyFormatYuan(sysSydProduct.getMaxMonth())+"元!"); + rtn.getList().add(detail); + rtn.getErrorList().add("单笔代发交易金额不能低于"+MoneyUtils.getMoneyFormatYuan(sysSydProduct.getMaxMonth())+"元!"); + continue; + } + } + + + + if(MoneyUtils.getMoneyFen(detail.getMoneyDecimal()) < merchantConfig.getMinMoney()){ + detail.setErrorMsg("单笔代发交易金额不能低于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMinMoney())+"元!"); + rtn.getList().add(detail); + rtn.getErrorList().add("单笔代发交易金额不能低于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMinMoney())+"元!"); + continue; + } + if(MoneyUtils.getMoneyFen(detail.getMoneyDecimal()) > merchantConfig.getMaxMoney()){ + detail.setErrorMsg("单笔代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoney())+"元!"); + rtn.getList().add(detail); + rtn.getErrorList().add("单笔代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoney())+"元!"); + continue; + } + if(StringUtils.isNotBlank(cardIdMap.get(detail.getCardId()).getMoneyYearDate())){ + String curYear = DateUtils.dateTimeNow(DateUtils.YYYY); + if(curYear.equals(cardIdMap.get(detail.getCardId()).getMoneyYearDate()) && cardIdMap.get(detail.getCardId()).getMoneyYear() + MoneyUtils.getMoneyFen(detail.getMoneyDecimal()) > merchantConfig.getMaxMoneyYear()){ + detail.setErrorMsg("年代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoneyYear())+"元!"); + + rtn.getList().add(detail); + rtn.getErrorList().add("年代发交易金额不能高于"+MoneyUtils.getMoneyFormatYuan(merchantConfig.getMaxMoneyYear())+"元!"); + continue; + } + } + if(cardIdMap.get(detail.getCardId()).getIsAuth() == 0){ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + + }else{ + detail.setErrorMsg("该会员未实名认证!"); + rtn.getList().add(detail); + rtn.getErrorList().add("该会员未实名认证!"); + continue; + } + + } + if(cardIdMap.get(detail.getCardId()).getIsAuthentication() == 0){ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + //未绑定银行卡 + if(StringUtils.isEmpty(detail.getBankCard())){ + detail.setErrorMsg("银行卡不能为空"); + rtn.getErrorList().add("银行卡不能为空"); + rtn.getList().add(detail); + continue; + } + + if(StringUtils.isEmpty(detail.getBankType())){ + rtn.getList().add(detail); + detail.setErrorMsg("所属银行不能为空"); + rtn.getErrorList().add("所属银行不能为空"); + continue; + } + if(addUserWorkerAccount(bo, detail, cardIdMap, rtn)) continue; + + }else{ + detail.setErrorMsg("该会员未绑定银行卡,会员号:"+cardIdMap.get(detail.getCardId()).getId()); + rtn.getList().add(detail); + rtn.getErrorList().add("该会员未绑定银行卡,会员号:"+cardIdMap.get(detail.getCardId()).getId()); + continue; + } + + }else{ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + //已绑定银行卡 + String bankCard = cardIdMap.get(detail.getCardId()).getBankCard(); + if(StringUtils.isNotEmpty(detail.getBankCard()) && !detail.getBankCard().equals(bankCard)){ + if(StringUtils.isEmpty(detail.getBankType())){ + rtn.getList().add(detail); + detail.setErrorMsg("所属银行不能为空"); + rtn.getErrorList().add("所属银行不能为空"); + continue; + } + if(addUserWorkerAccount(bo, detail, cardIdMap, rtn)) continue; + + } + } + + + } + + if(merchantConfig.getValiWorker() == 1 && cardIdMap.get(detail.getCardId()).getIsSign() == 0){ + if(merchantConfig.getIsNothing() != null && 1 == merchantConfig.getIsNothing()){ + + }else{ + detail.setErrorMsg("该会员未签约!"); + rtn.getList().add(detail); + rtn.getErrorList().add("该会员未签约!"); + continue; + } + + } + } + if(rtn.getErrorList().size() == 0) { + for (MerBillDetailBo detail: + bo.getDetails()) { + detail.setWorkerId(cardIdMap.get(detail.getCardId()).getId()); + detail.setWorkerPhone(cardIdMap.get(detail.getCardId()).getPhoneNoHide()); + detail.setBankType(cardIdMap.get(detail.getCardId()).getBankType()); + detail.setBankCard(cardIdMap.get(detail.getCardId()).getBankCard()); + detail.setBankAccId(cardIdMap.get(detail.getCardId()).getBankAccId()); + detail.setMoney(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())); + if(bo.getChargeMode() == 1){//个人应得计费 + if(bo.getServiceChargeType() == 1){//用工企业承担 + //企业支付 + BigDecimal qyzf = detail.getMoneyDecimal().multiply(new BigDecimal("1").add(getServiceChargeRate(bo.getServiceChargeRate()))).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(detail.getMoney()); + detail.setQyzf(MoneyUtils.getMoneyFen(qyzf)); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(qyzf)-detail.getAmount()); + }else if(bo.getServiceChargeType() == 2) {//自由职业者承担 + //个人实得 + BigDecimal grsd = detail.getMoneyDecimal().multiply(new BigDecimal("1").subtract(getServiceChargeRate(bo.getServiceChargeRate()))).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(MoneyUtils.getMoneyFen(grsd)); + detail.setQyzf(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())-detail.getAmount()); + } + }else if(bo.getChargeMode() == 2){//开票金额计费 + if(bo.getServiceChargeType() == 1){//用工企业承担 + //企业支付 + BigDecimal qyzf = detail.getMoneyDecimal().divide(new BigDecimal("1").subtract(getServiceChargeRate(bo.getServiceChargeRate())),2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(detail.getMoney()); + detail.setQyzf(MoneyUtils.getMoneyFen(qyzf)); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(qyzf)-detail.getAmount()); + }else if(bo.getServiceChargeType() == 2) {//自由职业者承担 + //个人实得 + BigDecimal grsd = detail.getMoneyDecimal().multiply(new BigDecimal("1").subtract(getServiceChargeRate(bo.getServiceChargeRate()))).setScale(2, RoundingMode.HALF_UP); + //实际到手金额 + detail.setAmount(MoneyUtils.getMoneyFen(grsd)); + detail.setQyzf(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())); + //服务费 + detail.setServiceChargeMoney(MoneyUtils.getMoneyFen(detail.getMoneyDecimal())-detail.getAmount()); + } + } + detail.setBillNo(bo.getNo()); + rtn.getList().add(detail); + } + } + return rtn; + } + + private boolean addUserWorkerAccount(AddBillBo bo, MerBillDetailBo detail, Map cardIdMap, DefaultExcelResult rtn) { + try{ + this.tencentIdCardAndOtherService.bankCard3(detail.getBankCard(), detail.getWorkerName(), detail.getCardId(), bo.getDomain()); +// Account bankAcc = new Account(); +// bankAcc.setType((short)2);//2:真实个人账户 +// bankAcc.setBankCard(detail.getBankCard()); +// bankAcc.setBankType(detail.getBankType()); +// bankAcc.setUnitId(0L); +// bankAcc.setName(detail.getWorkerName()); +// Result result = this.accountService.addAccount(bankAcc); +// Integer accountId = result.getRtnData().getId(); +// if(accountId == null){ +// this.invalidationParamsException("创建账号失败!"); +// } + + //添加银行卡 + UserWorkerAccountBo uwab = new UserWorkerAccountBo(); + uwab.setWorkId(detail.getWorkerId()); +// uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(detail.getBankCard()); + uwab.setPassage(detail.getPassage()); + uwab.setBankType(detail.getBankType()); + uwab.setCreateTime(new Date()); + uwab.setCreateBy(LoginHelper.getUserId()); + uwab.setIsDefault(1L); + UserWorkerAccount uwa = this.userWorkerAccountService.rePayMdyWorkerBank(uwab); + if(uwa == null){ + this.invalidationParamsException("创建会员账户失败"); + } + cardIdMap.get(detail.getCardId()).setBankCard(detail.getBankCard()); + cardIdMap.get(detail.getCardId()).setBankType(detail.getBankType()); + cardIdMap.get(detail.getCardId()).setBankAccId(uwa.getAccId().intValue()); + cardIdMap.get(detail.getCardId()).setIsAuthentication(1L); + + }catch(BaseException e ){ + e.printStackTrace(); + rtn.getList().add(detail); + detail.setErrorMsg("银行卡校验不通过"+e.getMessage()); + rtn.getErrorList().add("银行卡校验不通过"+e.getMessage()); + return true; +//// this.invalidationParamsException("银行卡校验不通过,"+e.getMessage()); +//// throw e; + }catch(Exception e){ + e.printStackTrace(); + rtn.getList().add(detail); + detail.setErrorMsg("银行卡校验失败,-"+e.getMessage()); + rtn.getErrorList().add("银行卡校验失败,-"+e.getMessage()); + return true; + } + return false; + } + + /** + * 获取服务费率(除100后的) + * @author 张涛 + * @date 2021年12月1日 + * @param rate 服务费率 + * @return + */ + private BigDecimal getServiceChargeRate(BigDecimal rate) { + String str = rate.doubleValue()+""; + int retainNum = 2; + if (str.indexOf(".") != -1) { + String scaleStr = str.substring(str.indexOf(".")+1); + if(Long.parseLong(scaleStr) > 0) { + retainNum = retainNum + scaleStr.length(); + } + } + return rate.divide(new BigDecimal(100), retainNum,RoundingMode.HALF_UP); + } + + /** + * 获取账单批次号 + * @param merNo 商户编号(A10049-B10070-M11312,运营商编号-代理商编号-商户编号) + * @param billNo 填写的批次号 + * @return + */ + private String getBillNo(String merNo,String billNo){ + String[] mns = merNo.split("-"); + return "P"+mns[mns.length -1]+billNo; + } + + /** + * 新增账单 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(AddBillBo bo) { +// MerBill add = MapstructUtils.convert(bo, MerBill.class); + + BusMerchantBo mer = new BusMerchantBo(); + mer.setNo(LoginHelper.getNo()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(mer); + + if(busOperAndAgentAndMer == null){ + this.invalidationParamsException("非法请求"); + } + QueryWrapper qw = Wrappers.query(); + qw.eq("bus_type",bo.getBusType()); + qw.eq("pro_id",bo.getProId()); + qw.eq("syd_id",bo.getSydId()); + qw.eq("mer_id",bo.getMerId()); + qw.eq("pro_status",1); + BusMerchantProduct bmp = this.busMerchantProductMapper.selectOne(qw); + + if(bmp == null){ + this.invalidationParamsException("非法请求"); + } + + bo.setServiceChargeRate(bmp.getServiceCharge()); + + bo.setChannelId(busOperAndAgentAndMer.getChannelId()); + bo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + bo.setOpId(busOperAndAgentAndMer.getOpId()); + bo.setOpNo(busOperAndAgentAndMer.getOpNo()); + + MerBill add = BeanUtil.copyProperties(bo, MerBill.class); + add.setVerifyStatus(1L); + add.setMoney(0l); + add.setServiceChargeAmount(0l); + add.setAmountEnt(0l); + add.setDetailCount(0l); + for (MerBillDetailBo detail: + bo.getDetails()) { + add.setMoney(add.getMoney()+detail.getMoney()); + add.setServiceChargeAmount(add.getServiceChargeAmount()+detail.getServiceChargeMoney()); + add.setAmountEnt(add.getAmountEnt()+detail.getServiceChargeMoney()+detail.getAmount()); + add.setDetailCount(add.getDetailCount()+1); + } + validEntityBeforeSave(add); + if(merchantAccountService.updateFrozen(add.getSydId(),add.getMerId(),add.getAmountEnt(),add.getPassage()) == 0){ + throw new ServiceException(add.getPassage()+"账户可用余额不足!"); + } + if(StringUtils.isNotBlank(bo.getNo())) { + add.setNo(getBillNo(bo.getMerNo(), bo.getNo())); + }else{ + add.setNo(genBillNo(0,10,bo.getMerNo())); + } + add.setAddTime(new Date()); + SysSydConfig sydConfig = sydConfigMapper.selectOne(new LambdaQueryWrapper().eq(SysSydConfig::getSydId,bo.getSydId())); + if(sydConfig == null){ + sydConfig = new SysSydConfig(0); + } + add.setSydVerifyStatus(1); + if(sydConfig.getAutoApprove() == 1){ + //服务商自动审批 + add.setStatus(1L); + add.setSydVerifyStatus(3); + add.setSydVerifyBy("自动审批"); + add.setSydVerifyTime(add.getAddTime()); + } + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("代发提交失败!"); + } + //商户总费率 + BigDecimal sh_service_rate = getServiceChargeRate(bo.getServiceChargeRate()); + //服务商费率 + BigDecimal fws_service_rate = null; + //运营商费率 + BigDecimal yys_service_rate = null; + //孵化中心费率 + BigDecimal fhzx_service_rate = null; + Long fhzx_id = null; + //总监费率 + BigDecimal zj_service_rate = null; + Long zj_id = null; + //业务员费率 + BigDecimal ywy_service_rate = null; + Long ywy_id = null; + //查询代理商 + BusChannel channel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,bo.getChannelId())); + //查询代理商产品 + BusChannelProduct channelProduct = channelProductMapper.selectOne(new LambdaQueryWrapper().eq(BusChannelProduct::getChannelId,bo.getChannelId()).eq(BusChannelProduct::getProStatus,1).eq(BusChannelProduct::getProId,bo.getProId())); + //查询运营商产品 + BusOperatorProduct operatorProduct = operatorProductMapper.selectOne(new LambdaQueryWrapper().eq(BusOperatorProduct::getOpId,bo.getOpId()).eq(BusOperatorProduct::getProStatus,1).eq(BusOperatorProduct::getProId,bo.getProId())); + if(channel.getDwLevel() == 1){//1:孵化中心 + fhzx_service_rate = getServiceChargeRate(channelProduct.getServiceCharge()); + fhzx_id = channel.getId(); + yys_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + fws_service_rate = getServiceChargeRate(operatorProduct.getCostServiceCharge()); + }else if(channel.getDwLevel() == 2){//2:总监 + zj_service_rate = getServiceChargeRate(channelProduct.getServiceCharge()); + zj_id = channel.getId(); + if(channel.getPId() != null && channel.getPId() > 0) { + fhzx_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + fhzx_id = channel.getPId(); + } + yys_service_rate = getServiceChargeRate(operatorProduct.getServiceCharge()); + fws_service_rate = getServiceChargeRate(operatorProduct.getCostServiceCharge()); + }else if(channel.getDwLevel() == 3){//3:业务员 + ywy_service_rate = getServiceChargeRate(channelProduct.getServiceCharge()); + ywy_id = channel.getId(); + if(channel.getPId() != null && channel.getPId() > 0) { + //上级代理商 + BusChannel upChannel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,channel.getPId())); + if(upChannel.getDwLevel() == 2) {//2:总监 + zj_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + zj_id = upChannel.getId(); + if(upChannel.getPId() != null && upChannel.getPId() > 0) { + BusChannelProduct zjChannelProduct = channelProductMapper.selectOne(new LambdaQueryWrapper().eq(BusChannelProduct::getChannelId, channel.getPId()).eq(BusChannelProduct::getProStatus, 1).eq(BusChannelProduct::getProId,bo.getProId())); + if(zjChannelProduct != null){ + fhzx_service_rate = getServiceChargeRate(zjChannelProduct.getCostServiceCharge()); + fhzx_id = upChannel.getPId(); + } + + } + }else if(upChannel.getDwLevel() == 1){//1:孵化中心 + fhzx_service_rate = getServiceChargeRate(channelProduct.getCostServiceCharge()); + fhzx_id = upChannel.getId(); + } + } + yys_service_rate = getServiceChargeRate(operatorProduct.getServiceCharge()); + fws_service_rate = getServiceChargeRate(operatorProduct.getCostServiceCharge()); + } + List details = new ArrayList<>(); + List cnos = new ArrayList<>();//已存在的子项目编号列表 + MerTaskVo taskVo = taskMapper.selectVoById(bo.getTaskId()); + for (MerBillDetailBo detail: + bo.getDetails()) { + detail.setId(null); + MerBillDetail d = MapstructUtils.convert(detail,MerBillDetail.class); + d.setPassage(bo.getPassage()); + + if(d.getWorkerEnrollId() != null && StringUtils.isBlank(d.getCno())){ + throw new ServiceException("项目子编码不能为空"); + } + if(d.getWorkerEnrollId() == null){ + d.setCno(genBillDetailCNo(0,10,cnos)); + cnos.add(d.getCno()); + MerTaskEnroll enroll = new MerTaskEnroll(d.getCno(),taskVo.getNo(),taskVo.getClassify(),taskVo.getId(),d.getWorkerId(),3l,bo.getAddBy(),new Date()); + enroll.setCost(d.getMoney()); + taskEnrollMapper.insert(enroll); + d.setWorkerEnrollId(enroll.getId()); + } + String[] mns = bo.getMerNo().split("-"); + d.setBusNo("T"+mns[mns.length - 1]+IdUtil.getSnowflakeNextIdStr()); + d.setBillNo(add.getNo()); + d.setBillId(add.getId()); + d.setAddTime(add.getAddTime()); + d.setPassage(bo.getPassage()); + d.setTaskId(bo.getTaskId()); + d.setTaskNo(bo.getTaskNo()); + d.bind(bo); + d.setBusType(bo.getBusType()); + d.setProNo(bo.getProNo()); + d.setChargeMode(bo.getChargeMode()); + //平台分润(元)=(运营商费率-服务商费率)*代发金额,四舍五入 + d.setPtServiceChargeMoney(MoneyUtils.getMoneyFen(yys_service_rate.subtract(fws_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + log.info(d.getBusNo()+"平台费率计算:"+yys_service_rate+","+fws_service_rate+","+MoneyUtils.getMoneyYuan(d.getMoney())+"結果:"+d.getPtServiceChargeMoney()); + //服务商分润(元)=商户总服务费-平台服务费-运营商总分润 + //服务商分润(元)=(服务商费率)*代发金额,四舍五入 + d.setSydServiceChargeMoney(MoneyUtils.getMoneyFen(fws_service_rate.multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + log.info(d.getBusNo()+"服务商费率计算:"+fws_service_rate+",结果:"+d.getSydServiceChargeMoney()); +// d.setSydServiceChargeMoney(d.getServiceChargeMoney()-d.getPtServiceChargeMoney()-MoneyUtils.getMoneyFen(yyszServiceChargeMoney)); + //运营商总分润(元)=(商户总费率-运营商费率)*代发金额,向上取整 + //运营商总分润(元)=商户总服务费-平台服务费-服务商总分润, +// BigDecimal yyszServiceChargeMoney = sh_service_rate.subtract(yys_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.CEILING); + BigDecimal yyszServiceChargeMoney = MoneyUtils.getMoneyYuan(d.getServiceChargeMoney()-d.getPtServiceChargeMoney()-d.getSydServiceChargeMoney()); + log.info(d.getBusNo()+"运营商总分润计算:"+yyszServiceChargeMoney); + d.setSydServiceChargeRate(fws_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + if(fhzx_service_rate != null) { + d.setFhzxChannelId(fhzx_id); + d.setFhzxServiceChargeRate(fhzx_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + if (zj_service_rate == null) { + if(ywy_service_rate != null){ + d.setFhzxServiceChargeMoney(MoneyUtils.getMoneyFen(ywy_service_rate.subtract(fhzx_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + }else{ + d.setFhzxServiceChargeMoney(MoneyUtils.getMoneyFen(sh_service_rate.subtract(fhzx_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } + + } else { + d.setFhzxServiceChargeMoney(MoneyUtils.getMoneyFen(zj_service_rate.subtract(fhzx_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } + }else{ + d.setFhzxServiceChargeMoney(0l); + } + if(zj_service_rate != null) { + d.setZjChannelId(zj_id); + d.setZjServiceChargeRate(zj_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + if (ywy_service_rate == null) { + d.setZjServiceChargeMoney(MoneyUtils.getMoneyFen(sh_service_rate.subtract(zj_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } else { + d.setZjServiceChargeMoney(MoneyUtils.getMoneyFen(ywy_service_rate.subtract(zj_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + } + }else{ + d.setZjServiceChargeMoney(0l); + } + if(ywy_service_rate != null) { + d.setYwyChannelId(ywy_id); + d.setYwyServiceChargeRate(ywy_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + d.setYwyServiceChargeMoney(MoneyUtils.getMoneyFen(sh_service_rate.subtract(ywy_service_rate).multiply(MoneyUtils.getMoneyYuan(d.getMoney())).setScale(2, RoundingMode.HALF_UP))); + }else{ + d.setYwyServiceChargeMoney(0l); + } + d.setShServiceChargeRate(sh_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + //运营商分润=运营商总分润-孵化中心收益-总监收益-业务员收益 + d.setOpServiceChargeMoney(MoneyUtils.getMoneyFen(yyszServiceChargeMoney)-d.getFhzxServiceChargeMoney()-d.getZjServiceChargeMoney()-d.getYwyServiceChargeMoney()); + d.setOpServiceChargeMoney(d.getOpServiceChargeMoney() < 0 ? 0 :d.getOpServiceChargeMoney()); + d.setOpServiceChargeRate(yys_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); +// d.setFhzxServiceChargeRate(fws_service_rate.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP)); + details.add(d); + } + billDetailMapper.insertBatch(details); + reProductInvoiceMapper.allocProduct(Arrays.asList(add.getProId()),Arrays.asList(add.getMerId()), BusRole.MERCHANT.getId(),add.getId(),11,add.getCreateBy(),new Date()); + List operLogs = new ArrayList<>();//操作日志 + operLogs.add(new BusOperLog("商户提交打款指令", BusRole.MERCHANT,add.getId(),BusLogType.BILL.getId())); + if(add.getSydVerifyStatus() != null){ + operLogs.add(new BusOperLog("服务商已接单", BusRole.SERVICE,add.getId(),BusLogType.BILL.getId())); + } + operLogMapper.insertBatch(operLogs); + return flag; + } + + /** + * 生成代发明细项目子编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @param exists 已生成的项目子编号 + * @return + */ + public String genBillDetailCNo(int retry,int maxRetry,List exists){ + String no = "ST"+RandomUtil.randomNumbers(11); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(MerBillDetail::getCno,no); + MerBillDetail exist = billDetailMapper.selectOne(lqw); + if(exist != null){ + if(retry > maxRetry){ + throw new ServiceException("项目子编号生成出错"); + }else { + no = genBillDetailCNo(retry + 1,maxRetry,exists); + } + }else if(exists != null && exists.contains(no)){ + no = genBillDetailCNo(retry + 1,maxRetry,exists); + } + return no; + } + + + public void validateSysSyd(AddBillBo bo){ + SysSydVo sydVo = this.sydMapper.selectVoById(bo.getSydId()); + if(sydVo == null){ + this.invalidationParamsException("无效服务商!"); + } + if(!(sydVo.getStatus() != null && sydVo.getStatus().intValue() == 1)){ + this.invalidationParamsException("服务商停止接单"); + } + } + + /** + * 修改账单 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(MerBillBo bo) { + MerBill update = MapstructUtils.convert(bo, MerBill.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean orderApproval(MerBillBo bo) { + MerBill bill = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getId,bo.getId())); + if(bill.getSydVerifyStatus() != 1){ + throw new ServiceException("该代发批次已审核,无法重复审核!"); + } + MerBill update = MapstructUtils.convert(bo, MerBill.class); + update.setSydVerifyTime(new Date()); + if(bo.getSydVerifyStatus() == 2) {//拒绝 + update.setStatus(5l); + //解冻代发金额 + if(merchantAccountMapper.updateFrozen(bill.getSydId(),bill.getMerId(),-bill.getAmountEnt(),bill.getPassage()) == 0){ + throw new ServiceException("商户余额解冻失败,请检查该代发批次是否已拒单!"); + } + operLogMapper.insert(new BusOperLog("服务商已拒单", BusRole.SERVICE,bo.getId(),BusLogType.BILL.getId())); + }else if(bo.getSydVerifyStatus() == 3) {//通过 + update.setStatus(1l); + operLogMapper.insert(new BusOperLog("服务商已接单", BusRole.SERVICE,bo.getId(),BusLogType.BILL.getId())); + } + return baseMapper.updateById(update) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentApproval(MerBillBo bo) { + MerBill bill = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getId,bo.getId())); + if(bill.getVerifyStatus() != 1){ + throw new ServiceException("该代发批次已审批,无法重复审批!"); + } + MerBill update = MapstructUtils.convert(bo, MerBill.class); + update.setVerifyTime(new Date()); + BusMerchant merchant = merchantMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchant::getId,bill.getMerId())); + if(bo.getVerifyStatus() == 2) {//拒绝 + update.setStatus(4l); + //解冻代发金额 + if(merchantAccountService.updateFrozen(bill.getSydId(),bill.getMerId(),-bill.getAmountEnt(),bill.getPassage()) == 0){ + throw new ServiceException("余额解冻失败,请检查该代发批次是否已撤消!"); + } + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getBillId,bill.getId()) + .set(MerBillDetail::getPayStatus,4) + .set(MerBillDetail::getChannelHalveStatus,4));//取消 + operLogMapper.insert(new BusOperLog("商户拒绝出款", BusRole.MERCHANT,bo.getId(),BusLogType.BILL.getId())); + }else if(bo.getVerifyStatus() == 3) {//通过 + if(StringUtils.isBlank(bo.getPassword())){ + throw new ServiceException("支付密码不为能空"); + } + checkPayPassword(BusRole.MERCHANT, bill.getMerId(), () -> { + if(StringUtils.isBlank(merchant.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(merchant.getPayPassword()); + }); + update.setStatus(2l); + update.setGiveUpBy(update.getVerifyBy()); + update.setGiveUpTime(update.getVerifyTime()); + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getBillId,bill.getId()) + .eq(MerBillDetail::getPayStatus,0) + .set(MerBillDetail::getPayStatus,3));//支付中 + operLogMapper.insert(new BusOperLog("商户提交出款指令", BusRole.MERCHANT,bo.getId(),BusLogType.BILL.getId())); + } + + SysSyd sysSyd = sydMapper.selectSysSydById(bill.getSydId()); + MerTask merTask = taskMapper.selectById(bill.getTaskId()); + BusMerchantAccount account = merchantAccountMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchantAccount::getMerId,bill.getMerId()).eq(BusMerchantAccount::getSydId,bill.getSydId()).eq(BusMerchantAccount::getBankType,bill.getPassage()).eq(BusMerchantAccount::getStatus,1)); + List merBillDetails = billDetailMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId())); + if(false){ + return xyjService.settleBatch(bill, merBillDetails, sysSyd, merchant, merTask, account); + }else{ + return baseMapper.updateById(update) > 0; + } + + } + + /** + * 验证支付密码 + */ + @Override + public Boolean checkPayPassword(BusRole role,long busId, Supplier supplier) { + String errorKey = "pwd_err_cnt:"+ role.getId() + ":" + busId; + Integer maxRetryCount = payPasswordProperties.getMaxRetryCount(); + Integer lockTime = payPasswordProperties.getLockTime(); + + // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip) + int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0); + // 锁定时间内登录 则踢出 + if (errorNumber >= maxRetryCount) { + throw new ServiceException("密码输入错误"+maxRetryCount+"次,帐户锁定"+lockTime+"分钟"); + } + + if (supplier.get()) { + // 错误次数递增 + errorNumber++; + RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); + // 达到规定错误次数 则锁定 + if (errorNumber >= maxRetryCount) { + throw new ServiceException("密码输入错误"+maxRetryCount+"次,帐户锁定"+lockTime+"分钟"); + } else { + // 未达到规定错误次数 + throw new ServiceException("密码错误,剩余"+(maxRetryCount - errorNumber)+"次输入机会!"); + } + } + + // 登录成功 清空错误次数 + RedisUtils.deleteObject(errorKey); + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerBill entity){ + //TODO 做一些数据校验,如唯一约束 + MerBill exist = baseMapper.selectOne(new LambdaQueryWrapper().eq(MerBill::getNo,getBillNo(entity.getMerNo(),entity.getNo()))); + if(exist != null){ + throw new ServiceException("批次号重复,请勿重复提交!"); + } + BusMerchantAccount account = merchantAccountMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchantAccount::getMerId,entity.getMerId()).eq(BusMerchantAccount::getSydId,entity.getSydId()).eq(BusMerchantAccount::getBankType,entity.getPassage()).eq(BusMerchantAccount::getStatus,1)); + if(account == null){ + throw new ServiceException(entity.getPassage()+"账户未开通!"); + } + if(account.getBalance()-account.getFrozen() ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToService(int billId) { + MerBill bill = baseMapper.selectById(billId); + String busDesc = "转账到服务商"; + if (bill == null) { + String msg = "代发批次不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billId+")"); + } + if (bill.getStatus().intValue() == 4) { + String msg = "代发批次已取消"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billId+")"); + } + + if (bill.getStatus().intValue() == 3) { + String msg = "代发批次已支付"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billId+")"); + } + List accs = merchantAccountMapper.selectByMerIdAndSydId(bill.getSydId(), bill.getMerId(),bill.getPassage()); + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(bill.getSydId(),null,bill.getPassage()); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + if (details.size() == 0) { + MerBill upd = new MerBill(); + upd.setId(bill.getId()); + upd.setStatus(3l); + upd.setPayStatus(2l); + upd.setPayTime(new Date()); + baseMapper.updateById(upd); + return false; + } + if (accs.size() == 0) { + String msg = "商户"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + if (sydAccs.size() == 0) { + String msg = "服务商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId()+")"); + } + if (accs.get(0).getFrozen() < bill.getAmountEnt()) { + String msg = "商户"+bill.getPassage()+"账户冻结金额不足"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + //商户转账到服务商B2B + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(1l); + backLog.setTranNo("TR1"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(bill.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,null).size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(accs.get(0).getAccId().intValue(), sydAccs.get(0).getAccId().intValue(),bill.getAmountEnt(), bill.getNo(), "B2B转账"); + String msg = "发送交易申请失败"; + if (backRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.MERCHANT.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.SERVICE.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getBillId,bill.getId()) + .eq(MerBillDetail::getPayStatus,3) + .set(MerBillDetail::getSydHalveStatus,3));//支付中 + operLogMapper.insert(new BusOperLog("企业转账服务商", BusRole.MERCHANT,bill.getId(),BusLogType.BILL.getId())); + } + return true; + } + + /** + * 服务商转账到运营商 + * @param bill + * @return + */ + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToOperator(MerBillVo bill) { + if (bill == null) { + throw new ServiceException("服务商转账到运营商,代发批次不存在"); + } + if (bill.getStatus().intValue() == 4) { + throw new ServiceException("服务商转账到运营商,代发批次已取消("+bill.getId()+")"); + } + + if (bill.getStatus().intValue() == 3) { + throw new ServiceException("服务商转账到运营商,代发批次已支付("+bill.getId()+")"); + } + BusOperatorAccountVo accs = operatorAccountMapper.selectVoOne(new LambdaQueryWrapper() + .eq(BusOperatorAccount::getSydId,bill.getSydId()) + .eq(BusOperatorAccount::getOpId,bill.getOpId()) + .eq(BusOperatorAccount::getBankType,bill.getPassage()) + .eq(BusOperatorAccount::getIsDefault,1)); + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(bill.getSydId(),null,bill.getPassage()); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + if (details.size() == 0) { + throw new ServiceException("服务商转账到运营商,代发明细不存在("+bill.getId()+")"); + } + if (accs == null) { + String msg = "运营商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId().intValue() +"," + bill.getOpId()+")"); + } + if (sydAccs.size() == 0) { + String msg = "服务商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId().intValue()+")"); + } + + //运营商总分润(分) + Long sumOpServiceChargeMoney = 0l; + for (MerBillDetailVo detail:details) { + sumOpServiceChargeMoney += detail.getOpServiceChargeMoney(); + sumOpServiceChargeMoney += detail.getFhzxServiceChargeMoney(); + sumOpServiceChargeMoney += detail.getZjServiceChargeMoney(); + sumOpServiceChargeMoney += detail.getYwyServiceChargeMoney(); + } + if (sydAccs.get(0).getFrozen() < sumOpServiceChargeMoney) { + String msg = "服务商"+bill.getPassage()+"账户冻结金额不足"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + //服务商转账到运营商 + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(2l); + backLog.setTranNo("T2"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(bill.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,null).size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(sydAccs.get(0).getAccId().intValue(), accs.getAccId().intValue(),sumOpServiceChargeMoney, bill.getNo(), "渠道推广费"); + if (backRtn.hasError()) { + String msg = "服务商转账到运营商,发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + String msg = "服务商转账到运营商,发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + String msg = "服务商转账到运营商,发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.OPERATOR.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .set(MerBillDetail::getOpHalveStatus, 3));//支付中 + operLogMapper.insert(new BusOperLog("服务商转账运营商", BusRole.SERVICE,bill.getId(),BusLogType.BILL.getId())); + } + return true; + } + + /** + * 服务商转账到平台 + * @param bill + * @return + */ + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToPlatform(MerBillVo bill) { + String busDesc = "服务商转账到平台"; + if (bill == null) { + throw new ServiceException(busDesc+",代发批次不存在"); + } + if (bill.getStatus().intValue() == 4) { + throw new ServiceException(busDesc+",代发批次已取消("+bill.getId()+")"); + } + + if (bill.getStatus().intValue() == 3) { + throw new ServiceException(busDesc+",代发批次已支付("+bill.getId()+")"); + } + BusAccountsVo accs = accountsMapper.selectVoOne(new LambdaQueryWrapper() + .eq(BusAccounts::getSydId,bill.getSydId()) + .eq(BusAccounts::getUnitId,0) + .eq(BusAccounts::getBankType,bill.getPassage()) + .eq(BusAccounts::getIsDefault,1)); + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(bill.getSydId(),null,bill.getPassage()); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + if (details.size() == 0) { + throw new ServiceException(busDesc+",代发明细不存在("+bill.getId()+")"); + } + if (accs == null) { + String msg = "平台"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getOpId()+")"); + } + if (sydAccs.size() == 0) { + String msg = "服务商"+bill.getPassage()+"账户不存在"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId()+")"); + } + //平台分润(分) + Long ptServiceChargeMoney = details.stream().mapToLong(MerBillDetailVo::getPtServiceChargeMoney).sum(); + if (sydAccs.get(0).getFrozen() < ptServiceChargeMoney) { + String msg = "服务商"+bill.getPassage()+"账户冻结金额不足"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + //服务商转账到运营商 + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(3l); + backLog.setTranNo("TR5"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(bill.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,null).size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(sydAccs.get(0).getAccId().intValue(), accs.getAccId().intValue(),ptServiceChargeMoney, bill.getNo(), "技术服务费"); + if (backRtn.hasError()) { + String msg = busDesc+",发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + String msg = busDesc+",发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + String msg = busDesc+",发送交易申请失败"; + throw new ServiceException(msg+"(代发批次id-"+bill.getId() + "," +bill.getSydId() +"," + bill.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.PLATFORM.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .set(MerBillDetail::getPtHalveStatus, 3));//支付中 + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToWorkers(MerBillVo bill) { + if (bill == null) { + throw new ServiceException("代发批次不存在"); + } + if (bill.getStatus().intValue() == 4) { + throw new ServiceException("代发批次已取消("+bill.getId()+")"); + } + if (bill.getStatus().intValue() == 3) { + throw new ServiceException("代发批次已支付("+bill.getId()+")"); + } + List details = billDetailMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + for (MerBillDetail billDetail: + details) { + singlePaymentToWorker(billDetail); + } + operLogMapper.insert(new BusOperLog("B2C代发", BusRole.MERCHANT,bill.getId(),BusLogType.BILL.getId())); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean paymentToWorker(int billDetailId) { + MerBillDetail billDetail = billDetailMapper.selectById(billDetailId); + return singlePaymentToWorker(billDetail); + } + + @Transactional(rollbackFor = Exception.class) + public Boolean singlePaymentToWorker(MerBillDetail billDetail) { + String busDesc = "服务商转账到个人B2C"; + if (billDetail == null) { + String msg = "代发批次明细不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg); + } + if (billDetail.getPayStatus() == 4) { + String msg = "代发批次明细已取消"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billDetail.getId()+")"); + } + if (billDetail.getPayStatus() != 0 && billDetail.getPayStatus() != 2 && billDetail.getPayStatus() != 3) { + String msg = "代发批次明细已支付或支付中"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"("+billDetail.getId()+")"); + } + List sydAccs = sydAccountDao.selectSysSydAccountBySydId(billDetail.getSydId(),null,billDetail.getPassage()); + if (sydAccs.size() == 0) { + String msg = "服务商"+billDetail.getPassage()+"账户不存在"; + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId().intValue()+")"); + } + if(billDetail.getWorkerId() == 0 && billDetail.getIsOut() == 1) {//开放平台-付款账户 + Account bankAcc = new Account(); + bankAcc.setBankType(StringUtils.isNotBlank(billDetail.getBankType()) ? billDetail.getBankType() : "开放平台"); + bankAcc.setBankCard(billDetail.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(billDetail.getWorkerName()); + bankAcc.setType((short)2);//2:真实个人账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + billDetailMapper.update(new LambdaUpdateWrapper().eq(MerBillDetail::getId,billDetail.getId()) + .set(MerBillDetail::getBankAccId,addRtn.getRtnData().getId())); + billDetail.setBankAccId(addRtn.getRtnData().getId()); + } + //服务商转账到个人B2C + TranLog backLog = new TranLog(); + backLog.setBusType(2l); + backLog.setBusItem(4l); + String no = DateUtils.dateTimeNow(DateUtils.YYYYMMDDHHMMSSSSS)+billDetail.getId(); + int randomLength = 22 - no.length(); + if(randomLength > 0){ + no += RandomUtil.randomNumbers(randomLength); + } + backLog.setTranNo(no); + backLog.setBuisId(billDetail.getId()); + boolean backOk = tranLogDao.selectByBus(backLog.getBusType().intValue(), backLog.getBuisId().intValue(), backLog.getBusItem()+"",null,"-1,1,2").size() == 0; + if(backOk) { + Result backRtn = accountService.applyTransfer(sydAccs.get(0).getAccId().intValue(), billDetail.getBankAccId(),billDetail.getAmount(), billDetail.getBusNo(), "B2C转账"); + String msg = "发送交易申请失败"; + if (backRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+"):"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+"(代发批次明细id-"+billDetail.getId() + "," +billDetail.getSydId() +"," + billDetail.getMerId()+")"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.WORKER.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + if(billDetail.getWorkerEnrollId() != null && billDetail.getWorkerEnrollId() > 0) { + taskEnrollMapper.update(new LambdaUpdateWrapper().eq(MerTaskEnroll::getId, billDetail.getWorkerEnrollId()) + .set(MerTaskEnroll::getSettlementStatus, 2));//结算中 + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog billTransaction(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + if (tran.getResult().intValue() == 2) {//支付成功 + if(tlog.getBusItem() == 4){//服务商转账到个人B2C + String busDesc = "服务商转账到个人B2C"; + MerBillDetail billDetail = billDetailMapper.selectById(tlog.getBuisId()); + if (billDetail == null) { + throw new ServiceException(busDesc+"时,账单详情不存在("+tlog.getBuisId()+")"); + } + if(billDetail.getPayStatus() != 3){ + //非支付中,直接返回 + return null; + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId, billDetail.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .set(MerBillDetail::getPayStatus, 1) + .set(MerBillDetail::getPayTime, new Date())) == 0){ + throw new ServiceException(busDesc+"时,已代发或已取消("+tlog.getBuisId()+")"); + } + if(billDetail.getWorkerEnrollId() != null && billDetail.getWorkerEnrollId() > 0) { + //已结算 + if(taskEnrollMapper.update(new LambdaUpdateWrapper().eq(MerTaskEnroll::getId, billDetail.getWorkerEnrollId()) + .eq(MerTaskEnroll::getSettlementStatus,2) + .set(MerTaskEnroll::getSettlementStatus, 1)) == 0){ + throw new ServiceException(busDesc+"时,已结算或已取消("+tlog.getBuisId()+","+billDetail.getWorkerEnrollId()+")"); + } + } + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+billDetail.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+billDetail.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + MerBillVo bill = baseMapper.selectVoById(billDetail.getBillId()); + SysSydVo syd = sydMapper.selectVoById(bill.getSydId()); + SysSydFlows sydFlow = new SysSydFlows(2,bill.getSydId(),1, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"B2C转账", bill.getNo(), bill.getId(), billDetail.getId(), tlog.getTranNo(), 2, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), billDetail.getWorkerId(), tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 2); + sydFlowsMapper.insertSelective(sydFlow); + billDetailService.billResult(bill.getId()); + }else{ + MerBillVo bill = baseMapper.selectVoById(tlog.getBuisId()); + if(bill == null){ + throw new ServiceException("服务商B2B时,代发批次不存在("+tlog.getBuisId()+")"); + } + if(bill.getStatus() != 2){ + //非发放中,直接返回 + return null; + } + SysSydVo syd = sydMapper.selectVoById(bill.getSydId()); + if(tlog.getBusItem() == 1){//商户转账到服务商B2B + if(merchantAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("商户转账到服务商B2B时,"+bill.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(merchantAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("商户转账到服务商B2B时,"+bill.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .eq(MerBillDetail::getSydHalveStatus, 3) + .set(MerBillDetail::getSydHalveStatus, 1)) == 0){ + throw new ServiceException("商户转账到服务商B2B时,非支付中("+tlog.getBuisId()+")"); + } + BusMerchantVo merchant = merchantMapper.selectVoById(bill.getMerId()); + BusMerchantFlows merchantFlow = new BusMerchantFlows(2,bill.getMerId(),bill.getSydId(),5, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"B2B转账", bill.getNo(), bill.getId(), null, tlog.getTranNo(), 1, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getMerId(), merchant.getName(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), bill.getSydId(), syd.getGsmc(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1, ""); + merchantFlowsMapper.insertAll(Arrays.asList(merchantFlow)); + sydAccountService.updateBalanceByAccId(tran.getTargetAccId(),tran.getAmount()); + sydAccountService.updateFrozenByAccId(tran.getTargetAccId(),tran.getAmount()); + sydFlowsMapper.insertSelective(new SysSydFlows(1,bill.getSydId(),merchantFlow.getBusType(),merchantFlow.getChannel(),merchantFlow.getBusNo(),merchantFlow.getBankNo(),tran.getAmount(),merchantFlow.getAddTime(),merchantFlow.getAddBy(),merchantFlow.getBusDesc(),merchantFlow.getBillNo(),merchantFlow.getBillId(),merchantFlow.getBillDetailId(),merchantFlow.getTranNo(),merchantFlow.getTranType(),merchantFlow.getTranStatus(),merchantFlow.getPayerType(),merchantFlow.getPayerId(),merchantFlow.getPayerName(),merchantFlow.getPayerAcc(),merchantFlow.getPayerAccId(),merchantFlow.getPayeeType(),merchantFlow.getPayeeId(),merchantFlow.getPayeeName(),merchantFlow.getPayeeAcc(),merchantFlow.getPayeeAccId(),merchantFlow.getBillNo(),merchantFlow.getPayReceiptType())); + paymentToOperator(bill); + }else if(tlog.getBusItem() == 2){//服务商转账到运营商 + BusOperatorVo operatorVo = operatorMapper.selectVoById(bill.getOpId()); + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到运营商时,"+bill.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到运营商时,"+bill.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .eq(MerBillDetail::getOpHalveStatus, 3) + .set(MerBillDetail::getOpHalveStatus, 1) + .set(MerBillDetail::getChannelHalveStatus,3)) == 0){ + throw new ServiceException("服务商转账到运营商时,非支付中("+tlog.getBuisId()+")"); + } + SysSydFlows sydFlow = new SysSydFlows(2,bill.getSydId(),4, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"渠道推广费", bill.getNo(), bill.getId(), null, tlog.getTranNo(), 1, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), bill.getOpId(), operatorVo.getName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1); + sydFlowsMapper.insertSelective(sydFlow); + List details = billDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + //运营商分润(分) + Long sumOpServiceChargeMoney = 0l; + //孵化中心收益(分) + Long sumFhzxServiceChargeMoney = 0l; + //总监收益(分) + Long sumZjServiceChargeMoney = 0l; + //业务员收益(分) + Long sumYwyServiceChargeMoney = 0l; + for(MerBillDetailVo detail : details){ + sumOpServiceChargeMoney += detail.getOpServiceChargeMoney(); + sumFhzxServiceChargeMoney += detail.getFhzxServiceChargeMoney(); + sumZjServiceChargeMoney += detail.getZjServiceChargeMoney(); + sumYwyServiceChargeMoney += detail.getYwyServiceChargeMoney(); + } + Long yysSumAll = sumOpServiceChargeMoney+sumFhzxServiceChargeMoney+sumZjServiceChargeMoney+sumYwyServiceChargeMoney; +// operatorAccountService.updateBalanceByAccId(tran.getTargetAccId(),sumOpServiceChargeMoney); +// operatorFlowsMapper.insertSelective(new BusOperatorFlows(1,bill.getOpId(),sydFlow.getBusType(),sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),sumOpServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayerType(),sydFlow.getPayerId(),sydFlow.getPayerName(),sydFlow.getPayerAcc(),sydFlow.getPayerAccId(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),sydFlow.getBillNo(),sydFlow.getPayReceiptType())); +// operatorAccountService.updateFrozenByAccId(tran.getTargetAccId(),sumOpServiceChargeMoney); +// operatorFlowsMapper.insertSelective(new BusOperatorFlows(0,bill.getOpId(),8,sydFlow.getChannel(),null,null,-sumOpServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),"F"+IdUtil.getSnowflakeNextIdStr(),5,sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),null,null,null,null,null,"",0)); + operatorAccountService.updateBalanceByAccId(tran.getTargetAccId(),yysSumAll); + operatorFlowsMapper.insertSelective(new BusOperatorFlows(1,bill.getOpId(),sydFlow.getBusType(),sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),yysSumAll,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayerType(),sydFlow.getPayerId(),sydFlow.getPayerName(),sydFlow.getPayerAcc(),sydFlow.getPayerAccId(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),sydFlow.getBillNo(),sydFlow.getPayReceiptType())); + operatorAccountService.updateFrozenByAccId(tran.getTargetAccId(),yysSumAll); + operatorFlowsMapper.insertSelective(new BusOperatorFlows(0,bill.getOpId(),8,sydFlow.getChannel(),null,null,-yysSumAll,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),"F"+IdUtil.getSnowflakeNextIdStr(),5,sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),null,null,null,null,null,"",0)); + if(sumFhzxServiceChargeMoney > 0) {//孵化中心收益 + Long channelId = details.get(0).getFhzxChannelId(); + BusChannel channel = channelMapper.selectById(channelId); + BusChannelAccount channelAccount = channelAccountMapper.selectOne(new LambdaQueryWrapper() + .eq(BusChannelAccount::getChannelId,channel.getId()) + .eq(BusChannelAccount::getIsDefault,1)); + channelAccountService.updateBalance(channelId, sumFhzxServiceChargeMoney); + //operatorFlowsMapper.insertSelective(new BusOperatorFlows(2,bill.getSydId(),12,sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),sydFlow.getBillNo(),0)); + channelFlowsMapper.insertSelective(new BusChannelFlows(1,channel.getId(),12,sydFlow.getBusNo(),sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranType(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),"")); + channelAccountService.updateFrozen(channelId, sumFhzxServiceChargeMoney); + channelFlowsMapper.insertSelective(new BusChannelFlows(0,channel.getId(),10,null,-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),5,BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),null, null,null,null,null,"")); + } + if(sumZjServiceChargeMoney > 0) {//总监收益 + Long channelId = details.get(0).getZjChannelId(); + BusChannel channel = channelMapper.selectById(channelId); + BusChannelAccount channelAccount = channelAccountMapper.selectOne(new LambdaQueryWrapper() + .eq(BusChannelAccount::getChannelId,channel.getId()) + .eq(BusChannelAccount::getIsDefault,1)); + channelAccountService.updateBalance(channelId, sumZjServiceChargeMoney); + //operatorFlowsMapper.insertSelective(new BusOperatorFlows(2,bill.getSydId(),12,sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),sydFlow.getBillNo(),0)); + channelFlowsMapper.insertSelective(new BusChannelFlows(1,channel.getId(),12,sydFlow.getBusNo(),sumZjServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranType(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),"")); + channelAccountService.updateFrozen(channelId, sumZjServiceChargeMoney); + channelFlowsMapper.insertSelective(new BusChannelFlows(0,channel.getId(),10,null,-sumZjServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),5,BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),null, null,null,null,null,"")); + } + if(sumYwyServiceChargeMoney > 0) {//业务员收益 + Long channelId = details.get(0).getYwyChannelId(); + BusChannel channel = channelMapper.selectById(channelId); + BusChannelAccount channelAccount = channelAccountMapper.selectOne(new LambdaQueryWrapper() + .eq(BusChannelAccount::getChannelId,channel.getId()) + .eq(BusChannelAccount::getIsDefault,1)); + channelAccountService.updateBalance(channelId, sumYwyServiceChargeMoney); + //operatorFlowsMapper.insertSelective(new BusOperatorFlows(2,bill.getSydId(),12,sydFlow.getChannel(),sydFlow.getBusNo(),sydFlow.getBankNo(),-sumFhzxServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranNo(),sydFlow.getTranType(),sydFlow.getTranStatus(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),sydFlow.getBillNo(),0)); + channelFlowsMapper.insertSelective(new BusChannelFlows(1,channel.getId(),12,sydFlow.getBusNo(),sumYwyServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),sydFlow.getBusDesc(),sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),sydFlow.getTranType(),sydFlow.getPayeeType(),sydFlow.getPayeeId(),sydFlow.getPayeeName(),sydFlow.getPayeeAcc(),sydFlow.getPayeeAccId(),BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),"")); + channelAccountService.updateFrozen(channelId, sumYwyServiceChargeMoney); + channelFlowsMapper.insertSelective(new BusChannelFlows(0,channel.getId(),10,null,-sumYwyServiceChargeMoney,sydFlow.getAddTime(),sydFlow.getAddBy(),"资金冻结",sydFlow.getBillNo(),sydFlow.getBillId(),sydFlow.getBillDetailId(),5,BusRole.AGENT.getId(), channelId,channel.getName(),channelAccount.getBankCard(),channelAccount.getAccId(),null, null,null,null,null,"")); + } + paymentToPlatform(bill); + }else if(tlog.getBusItem() == 3){//服务商转账到平台 + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到平台时,"+bill.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException("服务商转账到平台时,"+bill.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if(billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId, bill.getId()) + .eq(MerBillDetail::getPayStatus, 3) + .eq(MerBillDetail::getPtHalveStatus, 3) + .set(MerBillDetail::getPtHalveStatus, 1)) == 0){ + throw new ServiceException("服务商转账到平台时,非支付中("+tlog.getBuisId()+")"); + } + SysSydFlows sydFlow = new SysSydFlows(2,bill.getSydId(),3, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -tran.getAmount(), new Date(),bill.getAddBy(),"技术服务费", bill.getNo(), bill.getId(), null, tlog.getTranNo(), 1, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), 0l, tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1); + List details = billDetailMapper.selectList(new LambdaQueryWrapper().eq(MerBillDetail::getBillId,bill.getId()).eq(MerBillDetail::getPayStatus,3)); + //服务商分润(分) + Long sydServiceChargeMoney = details.stream().mapToLong(MerBillDetail::getSydServiceChargeMoney).sum(); + sydFlowsMapper.insertSelective(new SysSydFlows(0,bill.getSydId(),6, bill.getPassage(), bill.getNo(),tran.getTargetBankNo(), -sydServiceChargeMoney, new Date(),bill.getAddBy(),"资金冻结", bill.getNo(), bill.getId(), null, "F"+ IdUtil.getSnowflakeNextIdStr(), 5, tran.getResult().intValue(), tlog.getSourceAccType(), bill.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), null, null, null, null, null, "", 0)); + sydFlowsMapper.insertSelective(sydFlow); + accountsMapper.updateBalanceByAccId(tran.getTargetAccId(),tran.getAmount()); + paymentToWorkers(bill); + } + } + save = new TranLog(tlog.getId(), 2); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(tlog.getBusItem() == 4) {//服务商转账到个人B2C + String busDesc = "服务商转账到个人B2C"; + MerBillDetail billDetail = billDetailMapper.selectById(tlog.getBuisId()); + if (billDetail == null) { + throw new ServiceException(busDesc+"失败时,代发批次明细不存在("+tlog.getBuisId()+")"); + } + billDetailService.failBillDetail(billDetail.getBillId(),billDetail.getId(),tran.getReason(),0,null); + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + }else { + //记录最后一次失败的时间 + save = new TranLog(tlog.getId(),null,new Date()); + } + } + } + return save; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean billTransactionCallback(TranLogVo tlog, String callback) { + if(tlog.getBusItem() == 1){//商户转账到服务商B2B + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getBillId,tlog.getBuisId()) + .set(MerBillDetail::getPayReceiptB2b,callback)); + merchantFlowsMapper.update(new LambdaUpdateWrapper() + .eq(BusMerchantFlows::getTranNo,tlog.getTranNo()) + .set(BusMerchantFlows::getPayReceipt,callback)); + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + }else if(tlog.getBusItem() == 2){//服务商转账到运营商 + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + operatorFlowsMapper.update(new LambdaUpdateWrapper() + .eq(BusOperatorFlows::getTranNo,tlog.getTranNo()) + .set(BusOperatorFlows::getPayReceipt,callback)); + }else if(tlog.getBusItem() == 3){//服务商转账到平台 + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + }else if(tlog.getBusItem() == 4){//服务商转账到个人B2C + billDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId,tlog.getBuisId()) + .set(MerBillDetail::getPayReceipt,callback)); + sydFlowsMapper.update(new LambdaUpdateWrapper() + .eq(SysSydFlows::getTranNo,tlog.getTranNo()) + .set(SysSydFlows::getPayReceipt,callback)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java new file mode 100644 index 0000000..17e4f58 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountController.java @@ -0,0 +1,139 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商账户 + * 前端访问路由地址为:/payment/channelAccount + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelAccount") +public class BusChannelAccountController extends BaseController { + + private final IBusChannelAccountService busChannelAccountService; + + private final IBusChannelService channelService; + + private void bindDataPermission(BusChannelAccountBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.getParams().putAll(Map.of("level_channel_no",loginUser.getBusNo())); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.setChannelId(loginUser.getBusId()); + } + } + + /** + * 查询代理商账户列表 + */ +// @SaCheckPermission("payment:channelAccount:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelAccountBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + TableDataInfo rtn = busChannelAccountService.queryPageList(bo, pageQuery); +// if(rtn.getRows() != null && rtn.getRows().size() > 0){ +// BusChannelVo vo = channelService.queryById(loginUser.getBusId()); +// rtn.setRows(rtn.getRows().stream().peek(d -> d.setAccName(vo.getKhm())).collect(Collectors.toList())); +// } + return rtn; + } + + /** + * 导出代理商账户列表 + */ + @SaCheckPermission("payment:channelAccount:export") + @Log(title = "代理商账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelAccountBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = busChannelAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商账户", BusChannelAccountVo.class, response); + } + + /** + * 获取代理商账户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + + BusChannelAccountVo vo = busChannelAccountService.queryById(id); + BusChannelVo bc = this.channelService.queryById(LoginHelper.getBusId()); + vo.setBankCard(bc.getBankCard()); + return R.ok(vo); + } + + /** + * 新增代理商账户 + */ + @SaCheckPermission("payment:channelAccount:add") + @Log(title = "代理商账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelAccountBo bo) { + return toAjax(busChannelAccountService.insertByBo(bo)); + } + + /** + * 修改代理商账户 + */ + @SaCheckPermission("payment:channelAccount:edit") + @Log(title = "代理商账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelAccountBo bo) { + return toAjax(busChannelAccountService.updateByBo(bo)); + } + + /** + * 删除代理商账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelAccount:remove") + @Log(title = "代理商账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java new file mode 100644 index 0000000..7e4d9c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelAccountSynController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountSynBo; +import org.dromara.payment.channel.service.IBusChannelAccountSynService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商账户同步记录 + * 前端访问路由地址为:/payment/channelAccountSyn + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelAccountSyn") +public class BusChannelAccountSynController extends BaseController { + + private final IBusChannelAccountSynService busChannelAccountSynService; + + /** + * 查询代理商账户同步记录列表 + */ + @SaCheckPermission("payment:channelAccountSyn:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelAccountSynBo bo, PageQuery pageQuery) { + return busChannelAccountSynService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商账户同步记录列表 + */ + @SaCheckPermission("payment:channelAccountSyn:export") + @Log(title = "代理商账户同步记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelAccountSynBo bo, HttpServletResponse response) { + List list = busChannelAccountSynService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商账户同步记录", BusChannelAccountSynVo.class, response); + } + + /** + * 获取代理商账户同步记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelAccountSyn:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelAccountSynService.queryById(id)); + } + + /** + * 新增代理商账户同步记录 + */ + @SaCheckPermission("payment:channelAccountSyn:add") + @Log(title = "代理商账户同步记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelAccountSynBo bo) { + return toAjax(busChannelAccountSynService.insertByBo(bo)); + } + + /** + * 修改代理商账户同步记录 + */ + @SaCheckPermission("payment:channelAccountSyn:edit") + @Log(title = "代理商账户同步记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelAccountSynBo bo) { + return toAjax(busChannelAccountSynService.updateByBo(bo)); + } + + /** + * 删除代理商账户同步记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelAccountSyn:remove") + @Log(title = "代理商账户同步记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelAccountSynService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java new file mode 100644 index 0000000..86e53fa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelCashoutController.java @@ -0,0 +1,160 @@ +package org.dromara.payment.channel.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.channel.service.IBusChannelCashoutService; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 代理商提现记录 + * 前端访问路由地址为:/payment/channelCashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelCashout") +public class BusChannelCashoutController extends BaseController { + + private final IBusChannelCashoutService busChannelCashoutService; + + private final IBusChannelAccountService channelAccountService; + + private void bindDataPermission(BusChannelCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.setChannelId(loginUser.getBusId()); + } + } + + /** + * 查询代理商提现记录列表 + */ + @SaCheckPermission("payment:channelCashout:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelCashoutBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return busChannelCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商提现记录列表 + */ + @SaCheckPermission("payment:channelCashout:export") + @Log(title = "代理商提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelCashoutBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = busChannelCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商提现记录", BusChannelCashoutVo.class, response); + } + + /** + * 获取代理商提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelCashoutService.queryById(id)); + } + + /** + * 获取代理商提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(channelAccountService.getCashoutAccount(id)); + } + + /** + * 新增代理商提现记录 + */ + @SaCheckPermission("payment:channelCashout:add") + @Log(title = "代理商提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(busChannelCashoutService.insertByBo(bo)); + } + + /** + * 审批代理商提现记录 + */ + @Log(title = "审批代理商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/verifyCashout") + public R verifyCashout(@Positive(message = "提现记录id无效") long id,@Positive(message = "审核是否通过无效") long verifyStatus,@NotBlank(message = "支付凭证不能为空") String invoicePic,String verifyReason) { + LoginUser loginUser = LoginHelper.getLoginUser(); + BusChannelCashoutBo bo = new BusChannelCashoutBo(); + bo.setId(id); + bo.setVerifyStatus(verifyStatus); + bo.setVerifyReason(verifyReason); + bo.setInvoicePic(invoicePic); + bo.setVerifyBy(loginUser.getNickname()); + return toAjax(busChannelCashoutService.verifyCashout(bo)); + } + + /** + * 修改代理商提现记录 + */ + @SaCheckPermission("payment:channelCashout:edit") + @Log(title = "代理商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelCashoutBo bo) { + return toAjax(busChannelCashoutService.updateByBo(bo)); + } + + /** + * 删除代理商提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelCashout:remove") + @Log(title = "代理商提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java new file mode 100644 index 0000000..6e2f8bf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelController.java @@ -0,0 +1,155 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.channel.domain.vo.BaseCompInfo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.redisson.api.RList; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.domain.bo.BusChannelBo; +import org.dromara.payment.channel.service.IBusChannelService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商 + * 前端访问路由地址为:/payment/channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channel") +public class BusChannelController extends BaseController { + + private final IBusChannelService busChannelService; + + + + + /** + * 查询代理商列表 + */ + @SaCheckPermission("payment:channel:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelBo bo, PageQuery pageQuery) { + return busChannelService.queryPageList(bo, pageQuery); + } + + + /** + * 查询代理商列表 + */ +// @SaCheckPermission("payment:channel:listConfig") + @GetMapping("/listConfig") + public TableDataInfo listConfig(BusChannelBo bo, PageQuery pageQuery) { + return busChannelService.queryPageListProConfig(bo, pageQuery); + } + + /** + * 导出代理商列表 + */ + @SaCheckPermission("payment:channel:export") + @Log(title = "代理商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelBo bo, HttpServletResponse response) { + List list = busChannelService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商", BusChannelVo.class, response); + } + + /** + * 获取代理商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channel:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelService.queryById(id)); + } + + + + /** + * 获取代理商详细信息 + * + */ + @GetMapping("/getAgInfo") + @SaCheckPermission("payment:channel:getAgentInfo") + @Log(title = "根据登录用户获取代理商详情", businessType = BusinessType.SELECT) + public R getAgentInfo() { + return R.ok(busChannelService.getAgentInfo()); + } + + /** + * 新增代理商 + */ + @SaCheckPermission("payment:channel:add") + @Log(title = "代理商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelBo bo) { + return toAjax(busChannelService.insertByBo(bo)); + } + + /** + * 修改代理商 + */ + @SaCheckPermission("payment:channel:edit") + @Log(title = "代理商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelBo bo) { + return toAjax(busChannelService.updateByBo(bo)); + } + + /** + * 删除代理商 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channel:remove") + @Log(title = "代理商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 审核代理商 + */ +// @SaCheckPermission("payment:channel:check") + @Log(title = "审核代理商", businessType = BusinessType.UPDATE) + @PostMapping("/chk") + @SaCheckPermission("payment:channel:check") + public R chk(Long chId,Long checkType,String reason,String domain) { + return R.ok(this.busChannelService.checkChannel(chId,checkType,reason,domain)); + } + + + @Log(title = "获取代理商的级别", businessType = BusinessType.UPDATE) + @GetMapping("/getDwLevel") + public R> getDwLevel(){ + return R.ok(this.busChannelService.getDwLevel()); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java new file mode 100644 index 0000000..1f99f8c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelFlowsController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.domain.bo.BusChannelFlowsBo; +import org.dromara.payment.channel.service.IBusChannelFlowsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商流水 + * 前端访问路由地址为:/payment/channelFlows + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelFlows") +public class BusChannelFlowsController extends BaseController { + + private final IBusChannelFlowsService busChannelFlowsService; + + /** + * 查询代理商流水列表 + */ + @SaCheckPermission("payment:channelFlows:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelFlowsBo bo, PageQuery pageQuery) { + return busChannelFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商流水列表 + */ + @SaCheckPermission("payment:channelFlows:export") + @Log(title = "代理商流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelFlowsBo bo, HttpServletResponse response) { + List list = busChannelFlowsService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商流水", BusChannelFlowsVo.class, response); + } + + /** + * 获取代理商流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelFlowsService.queryById(id)); + } + + /** + * 新增代理商流水 + */ + @SaCheckPermission("payment:channelFlows:add") + @Log(title = "代理商流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusChannelFlowsBo bo) { + return toAjax(busChannelFlowsService.insertByBo(bo)); + } + + /** + * 修改代理商流水 + */ + @SaCheckPermission("payment:channelFlows:edit") + @Log(title = "代理商流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelFlowsBo bo) { + return toAjax(busChannelFlowsService.updateByBo(bo)); + } + + /** + * 删除代理商流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelFlows:remove") + @Log(title = "代理商流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java new file mode 100644 index 0000000..be4fbea --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelProductController.java @@ -0,0 +1,107 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.payment.channel.service.IBusChannelProductService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商产品 + * 前端访问路由地址为:/payment/channelProduct + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelProduct") +public class BusChannelProductController extends BaseController { + + private final IBusChannelProductService busChannelProductService; + + /** + * 查询代理商产品列表 + */ +// @SaCheckPermission("payment:channelProduct:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelProductBo bo, PageQuery pageQuery) { + return busChannelProductService.queryPageList(bo, pageQuery); + } + + /** + * 导出代理商产品列表 + */ + @SaCheckPermission("payment:channelProduct:export") + @Log(title = "代理商产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelProductBo bo, HttpServletResponse response) { + List list = busChannelProductService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商产品", BusChannelProductVo.class, response); + } + + /** + * 获取代理商产品详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelProductService.queryById(id)); + } + + /** + * 新增代理商产品 + */ + @SaCheckPermission("payment:channelProduct:add") + @Log(title = "代理商产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody JSONObject json ) { + return toAjax(busChannelProductService.insertByBo(json)); + } + + /** + * 修改代理商产品 + */ + @SaCheckPermission("payment:channelProduct:edit") + @Log(title = "代理商产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusChannelProductBo bo) { + return toAjax(busChannelProductService.updateByBo(bo)); + } + + /** + * 删除代理商产品 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelProduct:remove") + @Log(title = "代理商产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelProductService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java new file mode 100644 index 0000000..e6b6be1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/controller/BusChannelSalesmanController.java @@ -0,0 +1,132 @@ +package org.dromara.payment.channel.controller; + +import java.util.List; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.channel.mapper.BusChannelSalesmanMapper; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.payment.channel.service.IBusChannelSalesmanService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 代理商业务员 + * 前端访问路由地址为:/payment/channelSalesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/channelSalesman") +public class BusChannelSalesmanController extends BaseController { + + private final IBusChannelSalesmanService busChannelSalesmanService; + + private final BusChannelSalesmanMapper salesmanMapper; + + + + @RequestMapping("/test") + public R test(){ + R.ok(salesmanMapper.selectDataTest()); + return this.toAjax(1); + } + + /** + * 查询代理商业务员列表 + */ + @SaCheckPermission("payment:channelSalesman:list") + @GetMapping("/list") + public TableDataInfo list(BusChannelSalesmanBo bo, PageQuery pageQuery) { + return busChannelSalesmanService.selectSaleMans(bo, pageQuery); + } + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 11:41 + * 说明: 查询业务员集合不分页 + **/ + @GetMapping("/ywyList") + @SaCheckPermission("payment:channelSalesman:ywyList") + public R> list(BusChannelSalesmanBo bo) { + return R.ok(busChannelSalesmanService.queryList(bo)); + } + + + /** + * 导出代理商业务员列表 + */ + @SaCheckPermission("payment:channelSalesman:export") + @Log(title = "代理商业务员", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusChannelSalesmanBo bo, HttpServletResponse response) { + List list = busChannelSalesmanService.queryList(bo); + ExcelUtil.exportExcel(list, "代理商业务员", BusChannelSalesmanVo.class, response); + } + + /** + * 获取代理商业务员详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:channelSalesman:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busChannelSalesmanService.queryById(id)); + } + + /** + * 新增代理商业务员 + */ + @SaCheckPermission("payment:channelSalesman:add") + @Log(title = "代理商业务员", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) BusChannelSalesmanBo bo) { + return toAjax(busChannelSalesmanService.insertByBo(bo)); + } + + /** + * 修改代理商业务员 + */ + @SaCheckPermission("payment:channelSalesman:edit") + @Log(title = "代理商业务员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) BusChannelSalesmanBo bo) { + return toAjax(busChannelSalesmanService.updateByBo(bo)); + } + + /** + * 删除代理商业务员 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:channelSalesman:remove") + @Log(title = "代理商业务员", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busChannelSalesmanService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java new file mode 100644 index 0000000..2758a46 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannel.java @@ -0,0 +1,208 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel") +public class BusChannel extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商编号 + */ + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 代理商名称 + */ + private String name; + + /** + * 代理商级别(1:孵化中心 2:总监 3:业务员) + */ + private Integer dwLevel; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 父级代理商 + */ + private Long pId; + + /** + * 代理上下级关系编码 + */ + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + + private String operatorNo; + + + private String yyzz; + + private String khxkz ; + + private String payPassword; + + private Long createUnitId; + + private String createUnitNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java new file mode 100644 index 0000000..376f527 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccount.java @@ -0,0 +1,106 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商账户对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_account") +public class BusChannelAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 总收益(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + private Integer isDefault; + + /** + * 昨日收益(分) + */ + private Long yesterday; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + /** + * 昨天收益统计开始时间 + */ + private transient String flowsBeginTime; + + /** + * 昨天收益统计结束时间 + */ + private transient String flowsEndTime; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java new file mode 100644 index 0000000..9b4131e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelAccountSyn.java @@ -0,0 +1,51 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 代理商账户同步记录对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_account_syn") +public class BusChannelAccountSyn extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @TableId(value = "id") + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java new file mode 100644 index 0000000..c6010f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelCashout.java @@ -0,0 +1,150 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商提现记录对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_cashout") +public class BusChannelCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 支付凭证图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + + private String channelNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java new file mode 100644 index 0000000..a82fff2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelFlows.java @@ -0,0 +1,181 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商流水对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_flows") +public class BusChannelFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusChannelFlows(){} + + public BusChannelFlows(Integer direction,Long channelId, Integer busType, String busNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, Integer tranType, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark) { + this.channelId = channelId; + this.busType = busType; + this.busNo = busNo; + this.money = money; + this.direction = direction; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranType = tranType; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 流水方向(1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java new file mode 100644 index 0000000..9a76e70 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelProduct.java @@ -0,0 +1,122 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 代理商产品对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_product") +public class BusChannelProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + + + @TableField(exist = false) + private Long createDept; + + private Integer upIsOp; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java new file mode 100644 index 0000000..e93ea0e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/BusChannelSalesman.java @@ -0,0 +1,63 @@ +package org.dromara.payment.channel.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 代理商业务员对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_channel_salesman") +public class BusChannelSalesman extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 业务员名称 + */ + private String name; + + /** + * 业务员编号 + */ + private String no; + + + private String remarker; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java new file mode 100644 index 0000000..dddd252 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代理商账户业务对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelAccount.class, reverseConvertGenerate = false) +public class BusChannelAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型 + */ + @NotBlank(message = "银行类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 总收益(分) + */ + @NotNull(message = "总收益(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额(分) + */ + @NotNull(message = "冻结金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 已提现金额(分) + */ + @NotNull(message = "已提现金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isDefault; + + /** + * 昨日收益(分) + */ + @NotNull(message = "昨日收益(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long yesterday; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java new file mode 100644 index 0000000..47b1f75 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelAccountSynBo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 代理商账户同步记录业务对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelAccountSyn.class, reverseConvertGenerate = false) +public class BusChannelAccountSynBo extends BaseEntity { + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 同步顺序(倒序) + */ + @NotNull(message = "同步顺序(倒序)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @NotNull(message = "是否正在同步(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synLock; + + /** + * 最近同步批次 + */ + @NotBlank(message = "最近同步批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String synBatch; + + /** + * 最近同步的位置 + */ + @NotNull(message = "最近同步的位置不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java new file mode 100644 index 0000000..3cf3c29 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelBo.java @@ -0,0 +1,235 @@ +package org.dromara.payment.channel.domain.bo; + +import cn.hutool.core.date.DateUtil; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 代理商业务对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannel.class, reverseConvertGenerate = false) +public class BusChannelBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代理商编号 + */ + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + @NotNull(message = "代理商类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer dwType; + + /** + * 代理商名称 + */ + @NotBlank(message = "代理商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人身份证 + */ +// @NotBlank(message = "经办人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 开户名 + */ + @NotBlank(message = "开户名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户账号 + */ + @NotBlank(message = "开户账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开户支行 + */ + @NotBlank(message = "开户支行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @NotBlank(message = "法人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @NotBlank(message = "法人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 银行卡正面 + */ +// @NotBlank(message = "银行卡正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 父级代理商 + */ + private Long pId; + + /** + * 代理上下级关系编码 + */ + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ +// @NotNull(message = "审核状态(0:待审核、1:驳回、2:审核通过)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return endTime; + } + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + + private String yyzz; + + private String khxkz ; + + private Integer dwLevel; + + private Long createUnitId; + + private String createUnitNo; + + private Integer isProduct; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java new file mode 100644 index 0000000..8c1d8e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelCashoutBo.java @@ -0,0 +1,153 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代理商提现记录业务对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelCashout.class, reverseConvertGenerate = false) +public class BusChannelCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商账户id + */ + @NotNull(message = "代理商账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 支付凭证图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ +// @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java new file mode 100644 index 0000000..9a70d10 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelFlowsBo.java @@ -0,0 +1,170 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 代理商流水业务对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelFlows.class, reverseConvertGenerate = false) +public class BusChannelFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java new file mode 100644 index 0000000..8ac6113 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelProductBo.java @@ -0,0 +1,137 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 代理商产品业务对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelProduct.class, reverseConvertGenerate = false) +public class BusChannelProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 运营商服务费率(%) + */ + @NotNull(message = "运营商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ +// @NotNull(message = "代理商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ +// @NotBlank(message = "开票类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + + private Long chId; + + private Integer upIsOp; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java new file mode 100644 index 0000000..28700f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/bo/BusChannelSalesmanBo.java @@ -0,0 +1,78 @@ +package org.dromara.payment.channel.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 代理商业务员业务对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusChannelSalesman.class, reverseConvertGenerate = false) +public class BusChannelSalesmanBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + //代理商名称 + private String channelName; + + /** + * 业务员名称 + */ + @NotNull(message = "业务员名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + + private Date createTime; + + + + /** + * 业务员编号 + */ + private String no; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + private String remarker; + + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java new file mode 100644 index 0000000..a667eb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountSynVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelAccountSynVo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商账户同步记录Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelAccountSynVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java new file mode 100644 index 0000000..a65621c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelAccountVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商账户Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelAccountVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java new file mode 100644 index 0000000..ec83107 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelCashoutVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelCashoutVo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商提现记录Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelCashoutVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java new file mode 100644 index 0000000..342e01d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelFlowsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelFlowsVo; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商流水Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelFlowsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java new file mode 100644 index 0000000..2370304 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelProductVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelProductVo; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商产品Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelProductVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java new file mode 100644 index 0000000..72b4e29 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelSalesmanVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelSalesmanVo; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商业务员Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelSalesmanVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java new file mode 100644 index 0000000..cb625cd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/convert/BusChannelVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.channel.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.channel.api.domain.RemoteBusChannelVo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 代理商Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusChannelVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java new file mode 100644 index 0000000..5cd2f4a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BaseCompInfo.java @@ -0,0 +1,32 @@ +package org.dromara.payment.channel.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BaseCompInfo + * @description + * @create 2024-04-23 14:50 + */ +@Data +public class BaseCompInfo implements Serializable { + + @ExcelProperty("企业名称") + private String name; + + @ExcelProperty("统一社会信用代码") + private String xyCode; + + + @ExcelProperty("区域") + private String area; + + + @ExcelProperty("实际经营地址") + private String address; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java new file mode 100644 index 0000000..c38c376 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountSynVo.java @@ -0,0 +1,64 @@ +package org.dromara.payment.channel.domain.vo; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户同步记录视图对象 bus_channel_account_syn + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelAccountSyn.class) +public class BusChannelAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long id; + + /** + * 同步顺序(倒序) + */ + @ExcelProperty(value = "同步顺序", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "倒=序") + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @ExcelProperty(value = "是否正在同步", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long synLock; + + /** + * 最近同步批次 + */ + @ExcelProperty(value = "最近同步批次") + private String synBatch; + + /** + * 最近同步的位置 + */ + @ExcelProperty(value = "最近同步的位置") + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java new file mode 100644 index 0000000..074428b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelAccountVo.java @@ -0,0 +1,157 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商账户视图对象 bus_channel_account + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelAccount.class) +public class BusChannelAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商名称 + */ + @ExcelProperty(value = "代理商名称") + private String channelName; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型 + */ + @ExcelProperty(value = "银行类型") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 总收益(分) + */ + @ExcelProperty(value = "总收益(分)") + private Long balance; + + /** + * 冻结金额(分) + */ + @ExcelProperty(value = "冻结金额(分)") + private Long frozen; + + /** + * 已提现金额(分) + */ + @ExcelProperty(value = "已提现金额(分)") + private Long cashout; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isDefault; + + /** + * 昨日收益(分) + */ + @ExcelProperty(value = "昨日收益(分)") + private Long yesterday; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 归属账户方 + */ + private String accName; + + //开户支行 + private String khd; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java new file mode 100644 index 0000000..38e1b1c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelCashoutVo.java @@ -0,0 +1,194 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商提现记录视图对象 bus_channel_cashout + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelCashout.class) +public class BusChannelCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商名称 + */ + @ExcelProperty(value = "代理商名称") + private String channelName; + + /** + * 代理商账户id + */ + @ExcelProperty(value = "代理商账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 支付凭证图片 + */ + @ExcelProperty(value = "支付凭证图片") + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java new file mode 100644 index 0000000..2d4f35e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelFlowsVo.java @@ -0,0 +1,182 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商流水视图对象 bus_channel_flows + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelFlows.class) +public class BusChannelFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号(系统内部编号)") + private String busNo; + + /** + * 交易金额(分) + */ + @ExcelProperty(value = "交易金额(分)") + private Long money; + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额(分)") + private Long balance; + + /** + * 交易时间 + */ + @ExcelProperty(value = "交易时间") + private Date addTime; + + /** + * 交易人 + */ + @ExcelProperty(value = "交易人") + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "账单批次号") + private String billNo; + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单明细id + */ + @ExcelProperty(value = "账单明细id") + private Long billDetailId; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账,2=:代发,3=:提现,4=:退回,5=:冻结,6=:解冻,7=:充值") + private Integer tranType; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payerType; + + /** + * 付款方id + */ + @ExcelProperty(value = "付款方id") + private Long payerId; + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + /** + * 付款方账号id + */ + @ExcelProperty(value = "付款方账号id") + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payeeType; + + /** + * 收款方id + */ + @ExcelProperty(value = "收款方id") + private Long payeeId; + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + /** + * 收款方账号id + */ + @ExcelProperty(value = "收款方账号id") + private Long payeeAccId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java new file mode 100644 index 0000000..fca084d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelProductVo.java @@ -0,0 +1,159 @@ +package org.dromara.payment.channel.domain.vo; + +import java.math.BigDecimal; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.channel.domain.BusChannelProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商产品视图对象 bus_channel_product + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelProduct.class) +public class BusChannelProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 运营商服务费率(%) + */ + @ExcelProperty(value = "运营商服务费率(%)") + private BigDecimal costServiceCharge; + + /** + * 代理商服务费率(%) + */ + @ExcelProperty(value = "代理商服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架,2=:下架") + private Integer proStatus; + + + private String serviceName; + + private Long unId; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java new file mode 100644 index 0000000..ecf3f33 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelSalesmanVo.java @@ -0,0 +1,84 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商业务员视图对象 bus_channel_salesman + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannelSalesman.class) +public class BusChannelSalesmanVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelIgnore + private Long id; + + /** + * 代理商id + */ + @ExcelIgnore + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + @ExcelProperty(value = "代理商名称") + private String channelName; + + /** + * 业务员名称 + */ + @ExcelProperty(value = "业务员名称") + private String name; + + /** + * 业务员编号 + */ + @ExcelProperty(value = "业务员编号") + private String no; + + /** + * 添加时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 添加人 + */ + @ExcelIgnore + private String createBy; + + + @ExcelProperty(value = "备注") + private String remarker; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java new file mode 100644 index 0000000..70b2cd2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/domain/vo/BusChannelVo.java @@ -0,0 +1,251 @@ +package org.dromara.payment.channel.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.channel.domain.BusChannel; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 代理商视图对象 bus_channel + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusChannel.class) +public class BusChannelVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String no; + + /** + * 代理商类型(1:企业,:2:个人) + */ + @ExcelProperty(value = "代理商类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:企业,:2:个人") + private Integer dwType; + + /** + * 代理商名称 + */ + @ExcelProperty(value = "代理商名称") + private String name; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frSfz; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人身份证 + */ + @ExcelProperty(value = "经办人身份证") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户账号 + */ + @ExcelProperty(value = "开户账号") + private String bankCard; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @ExcelProperty(value = "法人身份证正面") + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @ExcelProperty(value = "法人身份证反面") + private String frSfzfm; + + /** + * 银行卡正面 + */ + @ExcelProperty(value = "银行卡正面") + private String bankZm; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 父级代理商 + */ + @ExcelProperty(value = "父级代理商") + private Long pId; + + /** + * 代理上下级关系编码 + */ + @ExcelProperty(value = "代理上下级关系编码") + private String levelCode; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + private String yyzz; + + private String khxkz ; + + private Integer dwLevel; + + private String verifyStatusName; + + private Date createTime; + + private Long createUnitId; + + private String createUnitNo; + + + public String getVerifyStatusName() { + if(this.verifyStatus == null){ + return "--"; + } + if(this.verifyStatus.equals(0L)){ + return "待审核"; + }else if(this.verifyStatus.equals(1L)){ + return "驳回"; + }else{ + return "审核通过"; + } + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java new file mode 100644 index 0000000..f96b72e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountMapper.java @@ -0,0 +1,60 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; + +import java.util.List; + +/** + * 代理商账户Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelAccountMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("channelId") Long channelId, @Param("amount") long amount); + + /** + * 递增或递减账户冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("channelId") Long channelId, @Param("amount") long amount); + + /** + * 递增或递减账户已提现金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateCashout(@Param("channelId") Long channelId, @Param("amount") long amount); + + /** + * 递增或递减账户昨日收益 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateYesterday(@Param("channelId") int channelId, @Param("amount") long amount); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java new file mode 100644 index 0000000..8bc9394 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelAccountSynMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.channel.mapper; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 代理商账户同步记录Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelAccountSynMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java new file mode 100644 index 0000000..48bbf5a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelCashoutMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.vo.BusAccountsVo; + +import java.util.List; + +/** + * 代理商提现记录Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelCashoutMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java new file mode 100644 index 0000000..695af59 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelFlowsMapper.java @@ -0,0 +1,16 @@ +package org.dromara.payment.channel.mapper; + +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.operator.domain.BusOperatorFlows; + +/** + * 代理商流水Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelFlowsMapper extends BaseMapperPlus { + public int insertSelective(BusChannelFlows flow); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java new file mode 100644 index 0000000..61dc5dd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelMapper.java @@ -0,0 +1,29 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 代理商Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelMapper extends BaseMapperPlus { + + + + @DataPermission({ + @DataColumn(key="colomField",value="t.no") + }) + Page selBusChannelLists(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java new file mode 100644 index 0000000..cbd7949 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelProductMapper.java @@ -0,0 +1,77 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 代理商产品Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelProductMapper extends BaseMapperPlus { + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 15:51 + * 说明:根据代理商信息查询代理商的产品信息 + **/ + + List selectAgentProInfos(Map map); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 15:51 + * 说明:根据运营商信息查询运营商的产品信息 + **/ + List selectOperProInfos(Map map); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 15:51 + * 说明:运营商分配-根据代理商信息查询代理商的产品信息 + **/ + Page selectOperAgentProList(@Param("bo")BusChannelProductBo bo, @Param("page") IPage page); + + + /*** + * 代理商分配-代理商分配产品 + * @param bo + * @param page + * @return + */ + Page selectAgentProList(@Param("bo")BusChannelProductBo bo, @Param("page") IPage page); + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 18:34 + * 说明:根据产品信息查询产品最小费率 + **/ + + BigDecimal selMinChargeFromChannelProByAgentInfo(Map map); + + + + int updateBusChannelCost(BusChannelProductBo busChannelProductBo); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java new file mode 100644 index 0000000..9b82fb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/mapper/BusChannelSalesmanMapper.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 代理商业务员Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusChannelSalesmanMapper extends BaseMapperPlus { + + + @DataPermission({ + @DataColumn(key="colomField",value="channel_no") + }) + public List selectDataTest(); + + + + @DataPermission({ + @DataColumn(key="colomField",value="t.channel_no") + }) + public Page selectSaleMans(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + @DataPermission({ + @DataColumn(key="colomField",value="channel_no") + }) + public List selectSaleMansList(); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java new file mode 100644 index 0000000..9693e5b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountService.java @@ -0,0 +1,75 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商账户Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelAccountService { + + /** + * 查询代理商账户 + */ + BusChannelAccountVo queryById(Long id); + + /** + * 查询代理商账户列表 + */ + TableDataInfo queryPageList(BusChannelAccountBo bo, PageQuery pageQuery); + + /** + * 查询代理商账户列表 + */ + List queryList(BusChannelAccountBo bo); + + /** + * 新增代理商账户 + */ + Boolean insertByBo(BusChannelAccountBo bo); + + /** + * 修改代理商账户 + */ + Boolean updateByBo(BusChannelAccountBo bo); + + /** + * 校验并批量删除代理商账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(long unitId,long amount); + + /** + * 递增或递减账户冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(long unitId,long amount); + + /** + * 查询代理商提现账户信息 + * @param id 资金账户id + * @return + */ + public BusChannelAccountVo getCashoutAccount(Long id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java new file mode 100644 index 0000000..c8547e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelAccountSynService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.payment.channel.domain.bo.BusChannelAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商账户同步记录Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelAccountSynService { + + /** + * 查询代理商账户同步记录 + */ + BusChannelAccountSynVo queryById(Long id); + + /** + * 查询代理商账户同步记录列表 + */ + TableDataInfo queryPageList(BusChannelAccountSynBo bo, PageQuery pageQuery); + + /** + * 查询代理商账户同步记录列表 + */ + List queryList(BusChannelAccountSynBo bo); + + /** + * 新增代理商账户同步记录 + */ + Boolean insertByBo(BusChannelAccountSynBo bo); + + /** + * 修改代理商账户同步记录 + */ + Boolean updateByBo(BusChannelAccountSynBo bo); + + /** + * 校验并批量删除代理商账户同步记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java new file mode 100644 index 0000000..1382f13 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelCashoutService.java @@ -0,0 +1,67 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商提现记录Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelCashoutService { + + /** + * 查询代理商提现记录 + */ + BusChannelCashoutVo queryById(Long id); + + /** + * 查询代理商提现记录列表 + */ + TableDataInfo queryPageList(BusChannelCashoutBo bo, PageQuery pageQuery); + + /** + * 查询代理商提现记录列表 + */ + List queryList(BusChannelCashoutBo bo); + + /** + * 新增代理商提现记录 + */ + Boolean insertByBo(BusChannelCashoutBo bo); + + /** + * 修改代理商提现记录 + */ + Boolean updateByBo(BusChannelCashoutBo bo); + + /** + * 校验并批量删除代理商提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 代理商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); + + /** + * 审批代理商提现记录 + * @param bo + * @return + */ + Boolean verifyCashout(BusChannelCashoutBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java new file mode 100644 index 0000000..eb28e73 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelFlowsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.domain.bo.BusChannelFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商流水Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelFlowsService { + + /** + * 查询代理商流水 + */ + BusChannelFlowsVo queryById(Long id); + + /** + * 查询代理商流水列表 + */ + TableDataInfo queryPageList(BusChannelFlowsBo bo, PageQuery pageQuery); + + /** + * 查询代理商流水列表 + */ + List queryList(BusChannelFlowsBo bo); + + /** + * 新增代理商流水 + */ + Boolean insertByBo(BusChannelFlowsBo bo); + + /** + * 修改代理商流水 + */ + Boolean updateByBo(BusChannelFlowsBo bo); + + /** + * 校验并批量删除代理商流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java new file mode 100644 index 0000000..2a3bc11 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelProductService.java @@ -0,0 +1,50 @@ +package org.dromara.payment.channel.service; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商产品Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelProductService { + + /** + * 查询代理商产品 + */ + BusChannelProductVo queryById(Long id); + + /** + * 查询代理商产品列表 + */ + TableDataInfo queryPageList(BusChannelProductBo bo, PageQuery pageQuery); + + /** + * 查询代理商产品列表 + */ + List queryList(BusChannelProductBo bo); + + /** + * 新增代理商产品 + */ + Boolean insertByBo(JSONObject bo); + + /** + * 修改代理商产品 + */ + Boolean updateByBo(BusChannelProductBo bo); + + /** + * 校验并批量删除代理商产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java new file mode 100644 index 0000000..5643667 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelSalesmanService.java @@ -0,0 +1,52 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商业务员Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelSalesmanService { + + + + TableDataInfo selectSaleMans(BusChannelSalesmanBo bo, PageQuery pageQuery); + /** + * 查询代理商业务员 + */ + BusChannelSalesmanVo queryById(Long id); + + /** + * 查询代理商业务员列表 + */ + TableDataInfo queryPageList(BusChannelSalesmanBo bo, PageQuery pageQuery); + + /** + * 查询代理商业务员列表 + */ + List queryList(BusChannelSalesmanBo bo); + + /** + * 新增代理商业务员 + */ + Boolean insertByBo(BusChannelSalesmanBo bo); + + /** + * 修改代理商业务员 + */ + Boolean updateByBo(BusChannelSalesmanBo bo); + + /** + * 校验并批量删除代理商业务员信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java new file mode 100644 index 0000000..ae741cc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/IBusChannelService.java @@ -0,0 +1,81 @@ +package org.dromara.payment.channel.service; + +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BaseCompInfo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.domain.bo.BusChannelBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.Collection; +import java.util.List; + +/** + * 代理商Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusChannelService { + + /** + * 查询代理商 + */ + BusChannelVo queryById(Long id); + + /** + * 查询代理商列表 + */ + TableDataInfo queryPageList(BusChannelBo bo, PageQuery pageQuery); + + + /*** + * 代理商产品配置-查询代理商列表 + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo queryPageListProConfig(BusChannelBo bo, PageQuery pageQuery); + + /** + * 查询代理商列表 + */ + List queryList(BusChannelBo bo); + + /** + * 新增代理商 + */ + Boolean insertByBo(BusChannelBo bo); + + /** + * 修改代理商 + */ + Boolean updateByBo(BusChannelBo bo); + + /** + * 校验并批量删除代理商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /** + * 根据登录用户获取代理商详情 + */ + BaseCompInfo getAgentInfo(); + + + /*** + * 审核代理商 + * @param chId 代理商id + * @param checkType 审核类型 + * @param reason 原因 + * @return + */ + boolean checkChannel(Long chId,Long checkType,String reason,String domain); + + + + List getDwLevel(); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java new file mode 100644 index 0000000..2f4f765 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountServiceImpl.java @@ -0,0 +1,184 @@ +package org.dromara.payment.channel.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商账户Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelAccountServiceImpl implements IBusChannelAccountService { + + private final BusChannelAccountMapper baseMapper; + + private final BusChannelMapper channelMapper; + + private final BusAccountsMapper accountsMapper; + + /** + * 查询代理商账户 + */ + @Override + public BusChannelAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商账户列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelAccountBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商账户列表 + */ + @Override + public List queryList(BusChannelAccountBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusChannelAccountBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper(new BusChannelAccount()); + lqw.eq(bo.getChannelId() != null,"t.channel_id",bo.getChannelId()); + lqw.eq(bo.getStatus() != null,"t.status",bo.getStatus()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("channel_name"))){ + lqw.like("t1.name",bo.getParams().get("channel_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.eq("t1.no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(params.get("level_channel_no"))){ + lqw.likeRight("t1.no",params.get("level_channel_no")); + } + if(StringUtils.isNotBlank(params.get("dw_level"))){ + lqw.eq("t1.dw_level",params.get("dw_level")); + } + String yesterday = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD,DateUtils.getEndDateByDays(new Date(),-1)); + lqw.getEntity().setFlowsBeginTime(yesterday+" 00:00:00"); + lqw.getEntity().setFlowsEndTime(yesterday+" 23:59:59"); + return lqw; + } + + /** + * 新增代理商账户 + */ + @Override + @Transactional + public Boolean insertByBo(BusChannelAccountBo bo) { + BusChannelAccount add = MapstructUtils.convert(bo, BusChannelAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + BusAccounts bab = new BusAccounts(); + bab.setAccId(0L); + bab.setIsDefault(1L); + bab.setUnitId(bo.getChannelId()); + bab.setAddYpe(7); + bab.setSydId(0L); + this.accountsMapper.insert(bab); + return flag; + } + + /** + * 修改代理商账户 + */ + @Override + public Boolean updateByBo(BusChannelAccountBo bo) { + BusChannelAccount update = MapstructUtils.convert(bo, BusChannelAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalance(long unitId, long amount) { + Integer baseNum = accountsMapper.updateBalance(0L,unitId,amount,null); + Integer curNum = baseMapper.updateBalance(unitId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozen(long unitId, long amount) { + Integer baseNum = accountsMapper.updateFrozen(0L,unitId,amount,null); + Integer curNum = baseMapper.updateFrozen(unitId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public BusChannelAccountVo getCashoutAccount(Long id) { + BusChannelAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + BusChannelVo vo = channelMapper.selectVoById(rtn.getChannelId()); + rtn.setAccName(vo.getKhm()); + rtn.setBankCard(vo.getBankCard()); + rtn.setKfd(vo.getKhd()); + rtn.setKfh(vo.getKhh()); + rtn.setKhhNo(vo.getKhhNo()); + rtn.setChannelNo(vo.getNo()); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java new file mode 100644 index 0000000..8fdfaad --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelAccountSynServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.payment.channel.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelAccountSynBo; +import org.dromara.payment.channel.domain.vo.BusChannelAccountSynVo; +import org.dromara.payment.channel.domain.BusChannelAccountSyn; +import org.dromara.payment.channel.mapper.BusChannelAccountSynMapper; +import org.dromara.payment.channel.service.IBusChannelAccountSynService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商账户同步记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelAccountSynServiceImpl implements IBusChannelAccountSynService { + + private final BusChannelAccountSynMapper baseMapper; + + /** + * 查询代理商账户同步记录 + */ + @Override + public BusChannelAccountSynVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商账户同步记录列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelAccountSynBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商账户同步记录列表 + */ + @Override + public List queryList(BusChannelAccountSynBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelAccountSynBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSort() != null, BusChannelAccountSyn::getSort, bo.getSort()); + lqw.eq(bo.getSynLock() != null, BusChannelAccountSyn::getSynLock, bo.getSynLock()); + lqw.eq(StringUtils.isNotBlank(bo.getSynBatch()), BusChannelAccountSyn::getSynBatch, bo.getSynBatch()); + lqw.eq(bo.getSynPosition() != null, BusChannelAccountSyn::getSynPosition, bo.getSynPosition()); + return lqw; + } + + /** + * 新增代理商账户同步记录 + */ + @Override + public Boolean insertByBo(BusChannelAccountSynBo bo) { + BusChannelAccountSyn add = MapstructUtils.convert(bo, BusChannelAccountSyn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改代理商账户同步记录 + */ + @Override + public Boolean updateByBo(BusChannelAccountSynBo bo) { + BusChannelAccountSyn update = MapstructUtils.convert(bo, BusChannelAccountSyn.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelAccountSyn entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商账户同步记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java new file mode 100644 index 0000000..5c4fe43 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelCashoutServiceImpl.java @@ -0,0 +1,391 @@ +package org.dromara.payment.channel.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.mapper.BusChannelCashoutMapper; +import org.dromara.payment.channel.service.IBusChannelCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 代理商提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelCashoutServiceImpl implements IBusChannelCashoutService { + + private final BusChannelCashoutMapper baseMapper; + + private final IBusChannelAccountService channelAccountService; + + private final BusChannelAccountMapper channelAccountMapper; + + private final BusChannelMapper channelMapper; + + private final IMerBillService billService; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final BusOperatorMapper operatorMapper; + + private final BusChannelFlowsMapper channelFlowsMapper; + + private final BusOperatorAccountMapper operatorAccountMapper; + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询代理商提现记录 + */ + @Override + public BusChannelCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商提现记录列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelCashoutBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商提现记录列表 + */ + @Override + public List queryList(BusChannelCashoutBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusChannelCashoutBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), "t.bus_no", bo.getBusNo()); + lqw.eq(bo.getAmount() != null, "t.amount", bo.getAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), "t.khh", bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), "t.khh_no", bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), "t.fr", bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), "t.khd", bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(bo.getVerifyStatus() != null, "t.verify_status", bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, "t.verify_time", bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), "t.verify_by", bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), "t.verify_reason", bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoicePic()), "t.invoice_pic", bo.getInvoicePic()); + lqw.eq(bo.getPayStatus() != null, "t.pay_status", bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, "t.pay_time", bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), "t.pay_remark", bo.getPayRemark()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "t.add_by", bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "t.passage", bo.getPassage()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), "t.pay_receipt", bo.getPayReceipt()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(bo.getParams().get("channel_name"))){ + lqw.like("t1.name",bo.getParams().get("channel_name")); + } + + lqw.orderByDesc("t.add_time"); + + return lqw; + } + + /** + * 新增代理商提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusChannelCashoutBo bo) { + BusChannelCashout add = MapstructUtils.convert(bo, BusChannelCashout.class); + validEntityBeforeSave(add); + BusChannelAccountVo vo = channelAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } +// BusChannel channel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,vo.getChannelId())); +// billService.checkPayPassword(BusRole.AGENT, vo.getChannelId(), () -> { +// if(StringUtils.isBlank(channel.getPayPassword())){ +// throw new ServiceException("请前往系统管理进行支付密码重置!"); +// } +// return bo.getPassword().equals(channel.getPayPassword()); +// }); + String busDesc = "代理商提现"; + if(channelAccountService.updateFrozen(vo.getChannelId(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setChannelId(vo.getChannelId()); + add.setChannelNo(vo.getChannelNo()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+ IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean verifyCashout(BusChannelCashoutBo bo) { + BusChannelCashoutVo vo = baseMapper.selectVoById(bo.getId()); + if(vo == null){ + throw new ServiceException("提现申请不存在,审核失败"); + } + if(vo.getVerifyStatus() != 0){ + throw new ServiceException("提现申请已审核"); + } + BusChannelCashout update = MapstructUtils.convert(bo, BusChannelCashout.class); + update.setVerifyTime(new Date()); + String busDesc = "代理商提现"; + if(update.getVerifyStatus() == 1){//驳回 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusChannelCashout::getId,bo.getId()) + .eq(BusChannelCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + if(channelAccountService.updateFrozen(vo.getChannelId(),-bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户可用余额不足"); + } + }else if(update.getVerifyStatus() == 2){//审批通过 +// update.setPayStatus(2l);//支付中 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusChannelCashout::getId,bo.getId()) + .eq(BusChannelCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + + this.cashoutResultOffline(bo); + +// BusChannel channel = channelMapper.selectOne(new LambdaQueryWrapper().eq(BusChannel::getId,vo.getChannelId())); +// Account bankAcc = new Account(); +// bankAcc.setBankType(vo.getPassage()); +// bankAcc.setBankCard(vo.getBankCard()); +// bankAcc.setUnitId(0l); +// bankAcc.setName(vo.getFr()); +// if(channel.getDwType() == 1) { +// bankAcc.setType((short) 3);//3:真实企业账户 +// }else if(channel.getDwType() == 2){ +// bankAcc.setType((short) 2);//2:真实个人账户 +// } +// Result addRtn = accountService.addAccount(bankAcc); +// String msg = "创建交易账号失败"; +// +// if (addRtn.hasError()) { +// throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); +// }else if (addRtn.hasTip()) { +// throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); +// }else if (addRtn.getRtnData() == null) { +// throw new ServiceException(msg); +// } + //代理商提现 +// TranLog backLog = new TranLog(); +// backLog.setBusType(3l); +// backLog.setBusItem(5l); +// backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); +// backLog.setBuisId(vo.getId()); +// BusOperator operator = operatorMapper.selectOne(new LambdaQueryWrapper().eq(BusOperator::getNo,channel.getOperatorNo())); +// if(operator == null){ +// throw new ServiceException("运营商不存在,提现失败"); +// } +// BusOperatorAccountVo opAcc = operatorAccountMapper.selectVoOne(new LambdaQueryWrapper() +// .eq(BusOperatorAccount::getSydId,vo.getSydId()) +// .eq(BusOperatorAccount::getOpId,operator.getId()) +// .eq(BusOperatorAccount::getBankType,vo.getPassage()) +// .eq(BusOperatorAccount::getIsDefault,1)); +// if(opAcc == null){ +// throw new ServiceException("运营商未开通资金账户,提现失败"); +// } +// Result backRtn = accountService.applyTransfer(opAcc.getAccId().intValue(), addRtn.getRtnData().getId(),bo.getAmount(), vo.getBusNo(), "提现"); +// if (backRtn.hasError()) { +// throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); +// }else if (backRtn.hasTip()) { +// throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); +// }else if (backRtn.getRtnData() == null) { +// throw new ServiceException(busDesc + ",发送交易申请失败"); +// } +// backLog.setTranId(backRtn.getRtnData().getId()); +// backLog.setAddTime(new Date()); +// backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); +// backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); +// backLog.setSourceAccType(BusRole.OPERATOR.getId()); +// backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); +// backLog.setTargetAccType(BusRole.AGENT.getId()); +// backLog.setIsCallback(0); +// tranLogDao.insert(backLog); + } + return true; + } + + + + @Transactional(rollbackFor = Exception.class) + public void cashoutResultOffline(BusChannelCashoutBo bo) { + String busDesc = "代理商提现"; + BusChannelCashoutVo vo = baseMapper.selectVoById(bo.getId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+bo.getId()+")"); + } + + if(channelAccountService.updateFrozen(vo.getChannelId(),-vo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+bo.getId()+")"); + } + if(channelAccountService.updateBalance(vo.getChannelId(),-vo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+bo.getId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusChannelCashout::getId,vo.getId()) + .eq(BusChannelCashout::getPayStatus,0) + .set(BusChannelCashout::getPayStatus,3) + .set(BusChannelCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+bo.getId()+")"); + } + channelAccountMapper.updateCashout(vo.getChannelId(),vo.getAmount()); + BusChannelVo channel = channelMapper.selectVoById(vo.getChannelId()); + BusOperatorVo operVo = operatorMapper.selectVoById(LoginHelper.getBusId()); + channelFlowsMapper.insertSelective(new BusChannelFlows(2,channel.getId(),15,vo.getBusNo(),-vo.getAmount(),new Date(),vo.getAddBy(),"提现",null,vo.getId(),null,3,BusRole.OPERATOR.getId(),operVo.getId(),operVo.getKhm(),operVo.getBankCard(),0l,BusRole.AGENT.getId(), channel.getId(),channel.getKhm(),vo.getBankCard(),null,"")); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "代理商提现"; + BusChannelCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(channelAccountService.updateFrozen(vo.getChannelId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(channelAccountService.updateBalance(vo.getChannelId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusChannelCashout::getId,vo.getId()) + .eq(BusChannelCashout::getPayStatus,2) + .set(BusChannelCashout::getPayStatus,3) + .set(BusChannelCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + channelAccountMapper.updateCashout(vo.getChannelId(),tran.getAmount()); + BusChannelVo channel = channelMapper.selectVoById(vo.getChannelId()); + channelFlowsMapper.insertSelective(new BusChannelFlows(2,channel.getId(),15,vo.getBusNo(),-tran.getAmount(),new Date(),vo.getAddBy(),"提现",null,vo.getId(),null,3,BusRole.AGENT.getId(),vo.getChannelId(),channel.getKhm(),tran.getTargetAccName(),0l,BusRole.AGENT.getId(), channel.getId(),channel.getKhm(),tran.getTargetCard(),tran.getTargetAccId().longValue(),"")); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusChannelCashout::getId,vo.getId()) + .eq(BusChannelCashout::getPayStatus,2) + .set(BusChannelCashout::getPayStatus,4) + .set(BusChannelCashout::getPayTime,new Date()) + .set(BusChannelCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } + + /** + * 修改代理商提现记录 + */ + @Override + public Boolean updateByBo(BusChannelCashoutBo bo) { + BusChannelCashout update = MapstructUtils.convert(bo, BusChannelCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java new file mode 100644 index 0000000..08d0e19 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelFlowsServiceImpl.java @@ -0,0 +1,132 @@ +package org.dromara.payment.channel.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelFlowsBo; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.service.IBusChannelFlowsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商流水Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelFlowsServiceImpl implements IBusChannelFlowsService { + + private final BusChannelFlowsMapper baseMapper; + + /** + * 查询代理商流水 + */ + @Override + public BusChannelFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商流水列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelFlowsBo bo, PageQuery pageQuery) { + bo.setChannelId(LoginHelper.getBusId()); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商流水列表 + */ + @Override + public List queryList(BusChannelFlowsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getChannelId() != null, BusChannelFlows::getChannelId, bo.getChannelId()); + lqw.eq(bo.getBusType() != null, BusChannelFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusChannelFlows::getBusNo, bo.getBusNo()); + lqw.eq(bo.getMoney() != null, BusChannelFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, BusChannelFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, BusChannelFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusChannelFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), BusChannelFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), BusChannelFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, BusChannelFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, BusChannelFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(bo.getTranType() != null, BusChannelFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getPayerType() != null, BusChannelFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, BusChannelFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), BusChannelFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), BusChannelFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, BusChannelFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, BusChannelFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, BusChannelFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), BusChannelFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), BusChannelFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, BusChannelFlows::getPayeeAccId, bo.getPayeeAccId()); + return lqw; + } + + /** + * 新增代理商流水 + */ + @Override + public Boolean insertByBo(BusChannelFlowsBo bo) { + BusChannelFlows add = MapstructUtils.convert(bo, BusChannelFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改代理商流水 + */ + @Override + public Boolean updateByBo(BusChannelFlowsBo bo) { + BusChannelFlows update = MapstructUtils.convert(bo, BusChannelFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java new file mode 100644 index 0000000..5020319 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelProductServiceImpl.java @@ -0,0 +1,275 @@ +package org.dromara.payment.channel.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelProductBo; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.channel.service.IBusChannelProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 代理商产品Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelProductServiceImpl extends BaseService implements IBusChannelProductService { + + private final BusChannelProductMapper baseMapper; + + private final BusMerchantProductMapper busMerchantProductMapper; + + /** + * 查询代理商产品 + */ + @Override + public BusChannelProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 给代理商分配产品,查询列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelProductBo bo, PageQuery pageQuery) { + if(bo.getChId() == null){ + this.invalidationParamsException("代理商ID不能为空"); + } + if(bo.getBusType() == null){ + this.invalidationParamsException("业务类型不能为空"); + } + bo.setChannelId(LoginHelper.getBusId()); + int burRole = LoginHelper.getLoginUser().getBusRole(); + Page result = null; + if(burRole == BusRole.AGENT.getId()){ + result = baseMapper.selectAgentProList(bo,pageQuery.build()); + }else if(burRole == BusRole.OPERATOR.getId()){ + result = baseMapper.selectOperAgentProList(bo,pageQuery.build()); + } + result.getRecords().forEach(item -> { + item.setUnId(IdUtil.getSnowflakeNextId()); + }); + return TableDataInfo.build(result); + } + + /** + * 查询代理商产品列表 + */ + @Override + public List queryList(BusChannelProductBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusChannelProduct::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusChannelProduct::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, BusChannelProduct::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), BusChannelProduct::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, BusChannelProduct::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusChannelProduct::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusChannelProduct::getOpId, bo.getOpId()); + lqw.eq(bo.getCostServiceCharge() != null, BusChannelProduct::getCostServiceCharge, bo.getCostServiceCharge()); + lqw.eq(bo.getServiceCharge() != null, BusChannelProduct::getServiceCharge, bo.getServiceCharge()); + lqw.eq(bo.getChannelId() != null, BusChannelProduct::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusChannelProduct::getChannelNo, bo.getChannelNo()); + lqw.eq(bo.getChargeMode() != null, BusChannelProduct::getChargeMode, bo.getChargeMode()); + lqw.eq(bo.getSettlementStyle() != null, BusChannelProduct::getSettlementStyle, bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, BusChannelProduct::getMaxMonth, bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, BusChannelProduct::getInvoiceType, bo.getInvoiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceItems()), BusChannelProduct::getInvoiceItems, bo.getInvoiceItems()); + lqw.eq(bo.getProStatus() != null, BusChannelProduct::getProStatus, bo.getProStatus()); + return lqw; + } + + /** + * 新增代理商产品 + */ + @Override + @Transactional + public Boolean insertByBo(JSONObject bo) { + Long chId = bo.getLong("chId"); + String chNo = bo.getString("chNo"); + Integer busType = bo.getInteger("busType"); + String proListStr = bo.getString("boList"); + + if(chId == null){ + this.invalidationParamsException("代理商ID不能为空"); + } + + if(chNo == null){ + this.invalidationParamsException("代理商编码不能为空"); + } + + if(busType == null){ + this.invalidationParamsException("业务类型不能为空"); + } + + if(StringUtils.isEmpty(proListStr)){ + this.invalidationParamsException("产品列表不能为空"); + } + + Map paraMap = new HashMap(); + paraMap.put("channel_no", LoginHelper.getNo()); + paraMap.put("bus_type",busType); + List agentList = new ArrayList(); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + agentList = this.baseMapper.selectAgentProInfos(paraMap); + if(agentList.size() == 0){ + this.invalidationParamsException("当前代理商未配置产品"); + } + }else if(busRole == BusRole.OPERATOR.getId()){ + agentList = this.baseMapper.selectOperProInfos(paraMap); + if(agentList.size() == 0){ + this.invalidationParamsException("当前运营商未配置产品"); + } + } + + List voList = JSONUtil.toList(bo.getJSONArray("boList").toJSONString(), BusChannelProductBo.class); + + List insertList = new ArrayList(); + List updateList = new ArrayList(); + for(BusChannelProductBo vo1 :voList){ + + BusChannelProductVo agentVo = agentList.stream().filter(t -> t.getProNo().equals(vo1.getProNo())).findFirst().orElse(null); + if(agentVo == null){ + this.invalidationParamsException("产品["+vo1.getProNo()+"]未配置"); + } + + + vo1.setSydId(agentVo.getSydId()); + vo1.setSydNo(agentVo.getSydNo()); + vo1.setProId(agentVo.getProId()); + vo1.setOpId(agentVo.getOpId()); + vo1.setOpNo(agentVo.getOpNo()); + vo1.setBusType(agentVo.getBusType()); + vo1.setChannelId(chId); + vo1.setChannelNo(chNo); + vo1.setCostServiceCharge(agentVo.getServiceCharge()); + vo1.setMaxMonth(agentVo.getMaxMonth()); + vo1.setCreateBy(LoginHelper.getUserId()); + vo1.setCreateTime(new Date()); + if(vo1.getServiceCharge() != null){ + if(vo1.getServiceCharge().compareTo(vo1.getCostServiceCharge()) < 0){ + vo1.setServiceCharge(vo1.getCostServiceCharge()); + } + Map pMap = new HashMap(); + pMap.put("channelNo",chNo); + pMap.put("busType",busType); + pMap.put("proNo",vo1.getProNo()); + BigDecimal merMinCharge = this.busMerchantProductMapper.selMinChargeByAgentAndBusType(pMap); + + pMap.put("channelNo",chNo+"-"); + pMap.put("channelId",chId); + BigDecimal chMinCharge = this.baseMapper.selMinChargeFromChannelProByAgentInfo(pMap); + BigDecimal min = merMinCharge; + + if(min != null && chMinCharge != null && chMinCharge.compareTo(min) < 0){ + min = chMinCharge; + }else if(min == null && chMinCharge != null){ + min = chMinCharge; + } + if(min != null && vo1.getServiceCharge().compareTo(min) > 0){ + this.invalidationParamsException("产品["+vo1.getProNo()+"]分配费率不能超过"+min.toString()+"请重新分配"); + } + } + ValidatorUtils.validate(vo1, AddGroup.class); + BusChannelProduct bp = MapstructUtils.convert(vo1, BusChannelProduct.class); + if(busRole == BusRole.OPERATOR.getId()){ + bp.setUpIsOp(1); + }else{ + bp.setUpIsOp(0); + } + bp.setCreateTime(new Date()); + bp.setCreateBy(LoginHelper.getUserId()); + if(vo1.getId() != null ){ + insertList.add(bp); + if(bp.getProStatus() == 1){ + updateList.add(bp); + } + }else{ + insertList.add(bp); + } + } + this.baseMapper.insertOrUpdateBatch(insertList); + + for(BusChannelProduct pro : updateList){ + BusMerchantProductBo proBo = new BusMerchantProductBo(); + proBo.setProNo(pro.getProNo()); + proBo.setCostServiceCharge(pro.getServiceCharge()); + proBo.setBusType(pro.getBusType()); + proBo.setChannelNo(chNo); + proBo.setUpdateBy(LoginHelper.getUserId()); + proBo.setUpdateTime(new Date()); + this.busMerchantProductMapper.updateMerProInfos(proBo); + + + BusChannelProductBo bpBo = new BusChannelProductBo(); + bpBo.setCostServiceCharge(pro.getServiceCharge()); + bpBo.setProNo(pro.getProNo()); + bpBo.setBusType(pro.getBusType()); + bpBo.setChannelId(chId); + bpBo.setChannelNo(chNo); + + this.baseMapper.updateBusChannelCost(bpBo); + + } + return true; + } + + /** + * 修改代理商产品 + */ + @Override + public Boolean updateByBo(BusChannelProductBo bo) { + BusChannelProduct update = MapstructUtils.convert(bo, BusChannelProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java new file mode 100644 index 0000000..c18f233 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelSalesmanServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.payment.channel.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.checkerframework.checker.units.qual.C; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelSalesmanBo; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.mapper.BusChannelSalesmanMapper; +import org.dromara.payment.channel.service.IBusChannelSalesmanService; + +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 代理商业务员Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelSalesmanServiceImpl extends BaseService implements IBusChannelSalesmanService { + + private final BusChannelSalesmanMapper baseMapper; + + @Override + public TableDataInfo selectSaleMans(BusChannelSalesmanBo bo, PageQuery pageQuery) { + + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null ,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.like(StringUtils.isNotEmpty(bo.getChannelName()),"t2.name",bo.getChannelName()); + lqw.orderByDesc("t.create_time"); + Page page = pageQuery.build(); + Page result = this.baseMapper.selectSaleMans(page, lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商业务员 + */ + @Override + public BusChannelSalesmanVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询代理商业务员列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelSalesmanBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商业务员列表 + */ + @Override + public List queryList(BusChannelSalesmanBo bo) { + return baseMapper.selectSaleMansList(); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelSalesmanBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getChannelId() != null, BusChannelSalesman::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusChannelSalesman::getChannelNo, bo.getChannelNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusChannelSalesman::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusChannelSalesman::getNo, bo.getNo()); + lqw.eq(bo.getCreateTime() != null, BusChannelSalesman::getCreateTime, bo.getCreateTime()); + lqw.eq(StringUtils.isNotBlank(bo.getCreateBy()), BusChannelSalesman::getCreateBy, bo.getCreateBy()); + lqw.orderByDesc(true, BusChannelSalesman::getCreateTime); + return lqw; + } + + public static void main(String[] args) { + for(int i = 0 ; i < 100 ;i++){ + System.out.println(getSalemano()); + } + } + + /** + * 新增代理商业务员 + */ + @Override + public Boolean insertByBo(BusChannelSalesmanBo bo) { + BusChannelSalesman add = MapstructUtils.convert(bo, BusChannelSalesman.class); + validEntityBeforeSave(add); + add.setChannelId(LoginHelper.getBusId()); + add.setChannelNo(LoginHelper.getNo()); + add.setCreateBy(LoginHelper.getUserId()); + add.setCreateTime(new Date()); + + if(StringUtils.isEmpty(add.getNo())){ + String no = getSalemano(); + add.setNo(no); + } + add.setChannelId(LoginHelper.getBusId()); + boolean flag = false; + try{ + flag = baseMapper.insert(add) > 0; + }catch (Exception e){ + e.printStackTrace(); + if(e instanceof DuplicateKeyException){ + String no = getSalemano(); + bo.setNo(no); + return this.insertByBo(bo); + }else{ + throw e; + } + } + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + public static String getSalemano() { + return RandomUtil.randomString("0123456789",6); + } + + /** + * 修改代理商业务员 + */ + @Override + public Boolean updateByBo(BusChannelSalesmanBo bo) { + if(bo.getId() == null){ + this.invalidationParamsException("业务员ID不能为空"); + } + if(StringUtils.isEmpty(bo.getName())){ + this.invalidationParamsException("业务员名称不能为空"); + } + BusChannelSalesman update = MapstructUtils.convert(bo, BusChannelSalesman.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannelSalesman entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商业务员 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java new file mode 100644 index 0000000..b9da659 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/channel/service/impl/BusChannelServiceImpl.java @@ -0,0 +1,511 @@ +package org.dromara.payment.channel.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.bo.BusChannelAccountBo; +import org.dromara.payment.channel.domain.vo.BaseCompInfo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.channel.domain.bo.BusChannelBo; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.channel.service.IBusChannelService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 代理商Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusChannelServiceImpl extends BaseService implements IBusChannelService { + + private final BusChannelMapper baseMapper; + + private final BusMerchantMapper busMerchantMapper; + + private final BusOperatorMapper busOperatorMapper; + + private final SysSydMapper sysSydMapper; + + private final IBusChannelAccountService busChannelAccountService; + @Resource + private ISysUnitService sysUnitService; + + @DubboReference + private RemoteUserService remoteUserService; + + @DubboReference + private RemoteSmsService remoteSmsService; + + + @DubboReference + private RemoteDictService remoteDictService; + + /** + * 查询代理商 + */ + @Override + public BusChannelVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + + public List getDwLevel(){ + List dictList = this.remoteDictService.selectDictDataByType("agent_level"); + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.PLATFORM.getId()){ + return dictList; + }else if(busRole == BusRole.OPERATOR.getId()){ + return dictList; + }else if(busRole == BusRole.AGENT.getId()){ + Long channelId = LoginHelper.getBusId(); + BusChannelVo bco = this.baseMapper.selectVoById(channelId); + List resultList = new ArrayList<>(); + dictList.forEach(item->{ + if(Integer.valueOf(item.getDictValue()) > bco.getDwLevel()){ + resultList.add(item); + } + }); + return resultList; + }else{ + return new ArrayList<>(); + } + + } + + + /** + * 查询代理商列表 + */ + @Override + public TableDataInfo queryPageList(BusChannelBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getDwType() != null,"t.dw_type",bo.getDwType()); + lqw.eq(bo.getDwLevel() != null,"t.dw_level",bo.getDwLevel()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.eq(bo.getVerifyStatus() != null,"t.verify_status",bo.getVerifyStatus()); + lqw.ne(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.no",LoginHelper.getNo() ); + if(bo.getIsProduct() != null && bo.getIsProduct() == 1){ + lqw.eq("t.create_unit_id",LoginHelper.getBusId()); + } + + + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selBusChannelLists(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + + /** + * 产品配置-查询代理商列表 + */ + @Override + public TableDataInfo queryPageListProConfig(BusChannelBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getDwType() != null,"t.dw_type",bo.getDwType()); + lqw.eq(bo.getDwLevel() != null,"t.dw_level",bo.getDwLevel()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.ne(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.no",LoginHelper.getNo() ); + int role = LoginHelper.getLoginUser().getBusRole(); + if(role == BusRole.AGENT.getId()){ + lqw.eq("t.p_id",LoginHelper.getBusId()); + }else if(role == BusRole.OPERATOR.getId()){ + lqw.isNull("t.p_id"); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selBusChannelLists(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询代理商列表 + */ + @Override + public List queryList(BusChannelBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusChannelBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusChannel::getNo, bo.getNo()); + lqw.eq(bo.getDwType() != null, BusChannel::getDwType, bo.getDwType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusChannel::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), BusChannel::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusChannel::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), BusChannel::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), BusChannel::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), BusChannel::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), BusChannel::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), BusChannel::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), BusChannel::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), BusChannel::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), BusChannel::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), BusChannel::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), BusChannel::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusChannel::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusChannel::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusChannel::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusChannel::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), BusChannel::getAlipayLogonId, bo.getAlipayLogonId()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), BusChannel::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), BusChannel::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankZm()), BusChannel::getBankZm, bo.getBankZm()); + lqw.eq(bo.getStatus() != null, BusChannel::getStatus, bo.getStatus()); + lqw.eq(bo.getPId() != null, BusChannel::getPId, bo.getPId()); + lqw.eq(StringUtils.isNotBlank(bo.getLevelCode()), BusChannel::getLevelCode, bo.getLevelCode()); + lqw.eq(bo.getVerifyStatus() != null, BusChannel::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, BusChannel::getVerifyTime, bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), BusChannel::getVerifyBy, bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), BusChannel::getVerifyReason, bo.getVerifyReason()); + lqw.between(bo.getStartTime() != null, BusChannel::getCreateTime, bo.getStartTime(), bo.getEndTime()); + return lqw; + } + + public static void main(String[] args) { + BusChannelBo bo = new BusChannelBo(); + + bo.setName("代理商名称"); + bo.setDwType(1); + bo.setDwLevel(1); + bo.setNsrSbh("统一社会信用代码"); + bo.setFr("法人"); + bo.setFrSfz("法人身份证"); + bo.setFrSjh("法人手机号"); + bo.setWtr("经办人姓名"); + bo.setWtrSjh("经办人手机号"); + bo.setWtrEmail("经办人邮件"); + bo.setAddress("实际经营地址"); + bo.setUnitArea("区域code"); + bo.setUnitAreaName("区域名"); + bo.setKhm("开户名"); + bo.setKhh("开户行"); + bo.setKhd("开户支行"); + bo.setKhhNo("开户行行号/银联号"); + bo.setBankCard("开户账号"); + bo.setYyzz("营业执照"); + bo.setKhxkz("开户许可证"); + bo.setFrSfzzm("法人身份证正面"); + bo.setFrSfzfm("法人身份证反面"); + bo.setBankZm("银行卡正面"); + + System.out.println(JSONUtil.toJsonStr(bo)); + + } + + /** + * 新增代理商 + */ + @Override + @Transactional + public Boolean insertByBo(BusChannelBo bo) { + + + if(bo.getDwType().intValue() == 1){ + + if(StringUtils.isEmpty(bo.getYyzz())){ + this.invalidationParamsException("营业执照不能为空"); + } + + if(StringUtils.isEmpty(bo.getKhxkz())){ + this.invalidationParamsException("开户许可证不能为空"); + } + + }else{ + if(StringUtils.isEmpty(bo.getBankZm())){ + this.invalidationParamsException("银行卡正面不能为空"); + } + } + + + if(StringUtils.isEmpty(bo.getNo())){ + bo.setNo(LoginHelper.getNo()+"-"+this.getAgentNo(bo)); + } + + + long id = IdUtil.getSnowflakeNextId(); + + BusChannel add = MapstructUtils.convert(bo, BusChannel.class); + add.setId(id); + add.setCreateTime(new Date()); + add.setCreateBy(LoginHelper.getUserId()); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + add.setPId(LoginHelper.getBusId()); + } + if(StringUtils.isNotEmpty(LoginHelper.getNo())){ + String[] pCodes = LoginHelper.getNo().split("-"); + add.setOperatorNo(pCodes[0]); + } + add.setVerifyStatus(0L); + add.setStatus(1L); + validEntityBeforeSave(add); + add.setCreateUnitId(LoginHelper.getBusId()); + add.setCreateUnitNo(LoginHelper.getNo()); + boolean flag = false; + try{ + flag = baseMapper.insert(add) > 0; + }catch(Exception e){ + if(e instanceof DuplicateKeyException){ + bo.setNo(LoginHelper.getNo()+"-"+this.getAgentNo(bo)); + return this.insertByBo(bo); + } + } + + if (flag) { + bo.setId(add.getId()); + } + + SysUnitBo sysUnitBo = new SysUnitBo(); + sysUnitBo.setName(bo.getName()); + sysUnitBo.setId(id); + sysUnitBo.setUnitType(BusRole.AGENT.getId()); + sysUnitBo.setNo(add.getNo()); + sysUnitBo.setCreateBy(add.getCreateBy()); + sysUnitBo.setCreateTime(add.getCreateTime()); + this.sysUnitService.insertByBo(sysUnitBo); + + return flag; + } + + private String getAgentNo(BusChannelBo bo) { + LoginUser user = LoginHelper.getLoginUser(); + int busRole = user.getBusRole().intValue(); + String rno = RandomUtil.randomString("0123456789",5); + if(bo.getDwLevel() != null){ + int level = bo.getDwLevel(); + if(level == 1){ + return "B"+rno; + }else if(level == 2){ + return "C"+rno; + }else if(level == 3){ + return "D"+rno; + } + } + return "CBD"+rno; + + } + + /** + * 修改代理商 + */ + @Override + public Boolean updateByBo(BusChannelBo bo) { + + BusChannelVo channelVo = this.queryById(bo.getId()); + + if(channelVo == null){ + this.invalidationParamsException("代理商不存在!"); + } + + if(channelVo.getVerifyStatus() == null || channelVo.getVerifyStatus().equals(2L)){ + this.invalidationParamsException("代理商信息不能修改!"); + } + bo.setVerifyStatus(0L); + BusChannel update = MapstructUtils.convert(bo, BusChannel.class); + validEntityBeforeSave(update); + update.setUpdateBy(LoginHelper.getUserId()); + update.setUpdateTime(new Date()); + update.setNo(null); + update.setOperatorNo(null); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusChannel entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除代理商 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public BaseCompInfo getAgentInfo() { + LoginUser user = LoginHelper.getLoginUser(); + Integer busRole = user.getBusRole(); + + BaseCompInfo info = new BaseCompInfo(); + if (busRole == BusRole.AGENT.getId()) { + BusChannelBo bo = new BusChannelBo(); + bo.setNo(LoginHelper.getNo()); + BusChannelVo result = this.baseMapper.selectVoOne(this.buildQueryWrapper(bo)); + if(result != null){ + info.setName(result.getName()); + info.setAddress(result.getAddress()); + info.setXyCode(result.getNsrSbh()); + info.setArea(result.getUnitAreaName()); + } + }else if(busRole == BusRole.MERCHANT.getId()){ + BusMerchantBo bo = new BusMerchantBo(); + bo.setNo(LoginHelper.getNo()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusMerchant::getNo, bo.getNo()); + BusMerchantVo result= this.busMerchantMapper.selectVoOne(lqw); + if(result != null){ + info.setName(result.getName()); + info.setAddress(result.getAddress()); + info.setXyCode(result.getNsrSbh()); + info.setArea(result.getUnitAreaName()); + } + }else if(busRole == BusRole.OPERATOR.getId()){ + BusOperatorBo bo = new BusOperatorBo(); + bo.setNo(LoginHelper.getNo()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusOperator::getNo, bo.getNo()); + BusOperatorVo result = this.busOperatorMapper.selectVoOne(lqw); + if(result != null){ + info.setName(result.getName()); + info.setAddress(result.getAddress()); + info.setXyCode(result.getNsrSbh()); + info.setArea(result.getUnitAreaName()); + } + }else if(busRole == BusRole.SERVICE.getId()){ + + SysSydVo sysSysVO = this.sysSydMapper.selectVoById(LoginHelper.getBusId()); + if(sysSysVO != null){ + info.setName(sysSysVO.getGsmc()); + info.setAddress(sysSysVO.getAddress()); + info.setXyCode(sysSysVO.getNsrSbh()); + info.setArea(sysSysVO.getUnitAreaName()); + } + } + return info; + } + + @Override + public boolean checkChannel(Long chId, Long checkType, String reason,String domain) { + + if(chId == null){ + this.invalidationParamsException("代理商ID不能为空"); + } + + if(checkType == null){ + this.invalidationParamsException("审核类型不能为空"); + } + + if(checkType.intValue() == 1 && StringUtils.isEmpty(reason)){ + this.invalidationParamsException("驳回原因不能为空"); + } + + if(StringUtils.isEmpty(domain)){ + this.invalidationParamsException("域名不能为空"); + } + + BusChannelVo bcv = this.baseMapper.selectVoById(chId); + + if(bcv == null){ + this.invalidationParamsException("代理商ID无效"); + } + + if(checkType.intValue() == 2){ + + BusChannelAccountBo bcab = new BusChannelAccountBo(); + bcab.setChannelId(chId); + bcab.setIsDefault(1); + bcab.setAddTime(new Date()); + bcab.setCreateTime(new Date()); + bcab.setAccId(0L); + bcab.setSydId(0L); + busChannelAccountService.insertByBo(bcab); + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(chId); + remoteUserBo.setBusNo(bcv.getNo()); + remoteUserBo.setRoleId(BusRole.AGENT.getId()); + remoteUserBo.setRoleName(BusRole.AGENT.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bcv.getName()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bcv.getWtrSjh()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("B"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addBusUser(remoteUserBo); + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.AGENT.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(domain,remoteUserBo.getPhonenumber(),SmsType.UNIT_OPEN,smsMap); + } + + BusChannel busChannel = new BusChannel(); + + busChannel.setVerifyStatus(checkType); + busChannel.setVerifyReason(reason); + busChannel.setVerifyTime(new Date()); + busChannel.setVerifyBy(LoginHelper.getUserId()+""); + busChannel.setId(chId); + this.baseMapper.updateById(busChannel); + + return true; + } + + private void addBusUser(RemoteUserBo remoteUserBo) { + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("B"+StringUtils.randmNumber(5)); + this.addBusUser(remoteUserBo); + } + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java new file mode 100644 index 0000000..51a7873 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusAccountsController.java @@ -0,0 +1,122 @@ +package org.dromara.payment.common.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.payment.common.service.IBusAccountsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 资金账户汇总 + * 前端访问路由地址为:/payment/accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/busaccounts") +public class BusAccountsController extends BaseController { + + private final IBusAccountsService busAccountsService; + + /** + * 查询资金账户汇总列表 + */ + //@SaCheckPermission("payment:accounts:list") + @GetMapping("/list") + @Log(title = "查询资金账户汇总列表", businessType = BusinessType.OTHER) + public TableDataInfo list(BusAccountsBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getBusRole() == BusRole.MERCHANT.getId()|| + loginUser.getBusRole() == BusRole.AGENT.getId() || + loginUser.getBusRole() == BusRole.OPERATOR.getId()){ + return new TableDataInfo<>(); + } + return busAccountsService.queryPageList(bo, pageQuery); + } + + /** + * 导出资金账户汇总列表 + */ + @SaCheckPermission("payment:accounts:export") + @Log(title = "资金账户汇总", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusAccountsBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId().longValue()); + List list = busAccountsService.queryList(bo); + ExcelUtil.exportExcel(list, "资金账户汇总", BusAccountsVo.class, response); + } + + /** + * 获取资金账户汇总详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:accounts:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busAccountsService.queryById(id)); + } + + /** + * 新增资金账户汇总 + */ + @SaCheckPermission("payment:accounts:add") + @Log(title = "资金账户汇总", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusAccountsBo bo) { + return toAjax(busAccountsService.insertByBo(bo)); + } + + /** + * 修改资金账户汇总 + */ + @SaCheckPermission("payment:accounts:edit") + @Log(title = "资金账户汇总", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusAccountsBo bo) { + return toAjax(busAccountsService.updateByBo(bo)); + } + + /** + * 删除资金账户汇总 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:accounts:remove") + @Log(title = "资金账户汇总", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busAccountsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java new file mode 100644 index 0000000..2922f1a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/BusOperLogController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.common.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.domain.bo.BusOperLogBo; +import org.dromara.payment.common.service.IBusOperLogService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 业务操作日志 + * 前端访问路由地址为:/payment/operLog + * + * @author LionLi + * @date 2024-04-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operLog") +public class BusOperLogController extends BaseController { + + private final IBusOperLogService busOperLogService; + + /** + * 查询业务操作日志列表 + */ + @SaCheckPermission("payment:operLog:list") + @GetMapping("/list") + public TableDataInfo list(BusOperLogBo bo, PageQuery pageQuery) { + return busOperLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出业务操作日志列表 + */ + @SaCheckPermission("payment:operLog:export") + @Log(title = "业务操作日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperLogBo bo, HttpServletResponse response) { + List list = busOperLogService.queryList(bo); + ExcelUtil.exportExcel(list, "业务操作日志", BusOperLogVo.class, response); + } + + /** + * 获取业务操作日志详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operLog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperLogService.queryById(id)); + } + + /** + * 新增业务操作日志 + */ + @SaCheckPermission("payment:operLog:add") + @Log(title = "业务操作日志", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperLogBo bo) { + return toAjax(busOperLogService.insertByBo(bo)); + } + + /** + * 修改业务操作日志 + */ + @SaCheckPermission("payment:operLog:edit") + @Log(title = "业务操作日志", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperLogBo bo) { + return toAjax(busOperLogService.updateByBo(bo)); + } + + /** + * 删除业务操作日志 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operLog:remove") + @Log(title = "业务操作日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperLogService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java new file mode 100644 index 0000000..6f4005a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/controller/TranLogController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.common.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.domain.bo.TranLogBo; +import org.dromara.payment.common.service.ITranLogService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 交易记录 + * 前端访问路由地址为:/payment/tranlog + * + * @author LionLi + * @date 2024-04-11 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tranlog") +public class TranLogController extends BaseController { + + private final ITranLogService tranLogService; + + /** + * 查询交易记录列表 + */ + @SaCheckPermission("payment:tranlog:list") + @GetMapping("/list") + public TableDataInfo list(TranLogBo bo, PageQuery pageQuery) { + return tranLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出交易记录列表 + */ + @SaCheckPermission("payment:tranlog:export") + @Log(title = "交易记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(TranLogBo bo, HttpServletResponse response) { + List list = tranLogService.queryList(bo); + ExcelUtil.exportExcel(list, "交易记录", TranLogVo.class, response); + } + + /** + * 获取交易记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:tranlog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tranLogService.queryById(id)); + } + + /** + * 新增交易记录 + */ + @SaCheckPermission("payment:tranlog:add") + @Log(title = "交易记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody TranLogBo bo) { + return toAjax(tranLogService.insertByBo(bo)); + } + + /** + * 修改交易记录 + */ + @SaCheckPermission("payment:tranlog:edit") + @Log(title = "交易记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody TranLogBo bo) { + return toAjax(tranLogService.updateByBo(bo)); + } + + /** + * 删除交易记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:tranlog:remove") + @Log(title = "交易记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tranLogService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java new file mode 100644 index 0000000..fb0cd2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusAccounts.java @@ -0,0 +1,121 @@ +package org.dromara.payment.common.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 资金账户汇总对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_accounts") +public class BusAccounts extends BaseEntity { + public BusAccounts(){} + + public BusAccounts(Long sydId, Long unitId, Long accId, String bankType, String bankCard, Long isDefault, Date addTime, Integer addYpe,String name, + String khh,String lhh) { + this.sydId = sydId; + this.unitId = unitId; + this.accId = accId; + this.bankType = bankType; + this.bankCard = bankCard; + this.isDefault = isDefault; + this.addTime = addTime; + this.addYpe = addYpe; + this.name = name; + this.khh = khh; + this.lhh = lhh; + } + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + private String name; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 企业id + */ + private Long unitId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + private Integer addYpe; + + /** + * 外卡卡号 + */ + private String outBankCard; + + /** + * 备注 + */ + private String remark; + + + private String khh; + + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java new file mode 100644 index 0000000..2a8c9cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusId.java @@ -0,0 +1,67 @@ +package org.dromara.payment.common.domain; + +import lombok.Data; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 业务id基类 + */ +@Data +public class BusId extends BaseEntity { + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + public void bind(BusId bus){ + setSydId(bus.getSydId()); + setSydNo(bus.getSydNo()); + setOpId(bus.getOpId()); + setOpNo(bus.getOpNo()); + setChannelId(bus.getChannelId()); + setChannelNo(bus.getChannelNo()); + setChannelCode(bus.getChannelCode()); + setMerId(bus.getMerId()); + setMerNo(bus.getMerNo()); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java new file mode 100644 index 0000000..f26a31c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/BusOperLog.java @@ -0,0 +1,65 @@ +package org.dromara.payment.common.domain; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 业务操作日志对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_oper_log") +public class BusOperLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusOperLog(){} + + public BusOperLog(String logDesc, BusRole role, Long busId, Integer busType) { + this.logDesc = logDesc; + this.createRoleId = role.getId(); + this.createRoleName = role.getName(); + this.busId = busId; + this.busType = busType; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 日志描述 + */ + private String logDesc; + + /** + * 角色id + */ + private Integer createRoleId; + + /** + * 角色名称 + */ + private String createRoleName; + + /** + * 业务id(任务id或账单批次id) + */ + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + private Integer busType; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java new file mode 100644 index 0000000..cc145da --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/CommonSelConditionEntity.java @@ -0,0 +1,70 @@ +package org.dromara.payment.common.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.dromara.common.core.utils.DateUtils; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title CommonSelConditionEntity + * @description + * @create 2024-04-26 15:21 + * 业务通用查询条件 + */ + +@Data +public class CommonSelConditionEntity implements Serializable { + + //开始时间 + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + //结束时间 + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + //企业名称 + private String busMerName; + + //服务商名称 + private String synName; + + //用工姓名 + private String workName; + + //工人身份证 + private String workIdCard; + + //用工手机号 + private String workPhone; + + //业务类型 + private Integer busType; + + //签约状态 + private Integer signStatus; + + //完税证明上传状态 + private Integer wsZmStatus; + + private Long merId; + + private Long sydId; + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java new file mode 100644 index 0000000..2e4f8cb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/TranLog.java @@ -0,0 +1,127 @@ +package org.dromara.payment.common.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 交易记录对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("tran_log") +public class TranLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public TranLog(){} + + + public TranLog(Long id, Integer tranResult) { + this.id = id; + this.tranResult = tranResult; + } + + + + public TranLog(Long id, Integer tranResult, Date tranTime) { + this.id = id; + this.tranResult = tranResult; + this.tranTime = tranTime; + } + + /** + * 交易记录id + */ + @TableId(value = "id") + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + private Long busItem; + + /** + * 交易场景 id扣除服务费:任务id 账单付款:账单明细id + */ + private Long buisId; + + /** + * 交易批次 + */ + private String busBatch; + + /** + * 交易id + */ + private Long tranId; + + /** + * 申请交易时间 + */ + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + private Integer tranResult; + + /** + * 待处理批次 + */ + private String tranBatch; + + /** + * 交易完成时间 + */ + private Date tranTime; + + /** + * 付款账户id + */ + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer sourceAccType; + + /** + * 收款账户id + */ + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + private Integer isCallback; + + /** + * 交易订单号 + */ + private String tranNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java new file mode 100644 index 0000000..3d0013d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusAccountsBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.common.domain.bo; + +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 资金账户汇总业务对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusAccounts.class, reverseConvertGenerate = false) +public class BusAccountsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 企业id + */ + @NotNull(message = "企业id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long unitId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型 + */ + @NotBlank(message = "银行类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额 + */ + @NotNull(message = "冻结金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + @NotNull(message = "状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + @NotNull(message = "开户类型(0:系统 6:服务商 9:商户 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer addYpe; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java new file mode 100644 index 0000000..f11fa99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/BusOperLogBo.java @@ -0,0 +1,60 @@ +package org.dromara.payment.common.domain.bo; + +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 业务操作日志业务对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperLog.class, reverseConvertGenerate = false) +public class BusOperLogBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 日志描述 + */ + @NotBlank(message = "日志描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logDesc; + + /** + * 角色id + */ + @NotNull(message = "角色id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long createRoleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String createRoleName; + + /** + * 业务id(任务id或账单批次id) + */ + @NotNull(message = "业务id(任务id或账单批次id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + @NotNull(message = "业务类型(1:项目 2:账单批次)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java new file mode 100644 index 0000000..dbad4a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/bo/TranLogBo.java @@ -0,0 +1,124 @@ +package org.dromara.payment.common.domain.bo; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 交易记录业务对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = TranLog.class, reverseConvertGenerate = false) +public class TranLogBo extends BaseEntity { + + /** + * 交易记录id + */ + @NotNull(message = "交易记录id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + @NotNull(message = "交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + @NotNull(message = "交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busItem; + + /** + * 交易场景id +扣除服务费:任务id +账单付款:账单明细id + */ + @NotNull(message = "交易场景id 扣除服务费:任务id 账单付款:账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long buisId; + + /** + * 交易批次 + */ + @NotBlank(message = "交易批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busBatch; + + /** + * 交易id + */ + @NotNull(message = "交易id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long tranId; + + /** + * 申请交易时间 + */ + @NotNull(message = "申请交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + @NotNull(message = "交易结果(-1:待处理 1:支付中 2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranResult; + + /** + * 待处理批次 + */ + @NotBlank(message = "待处理批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranBatch; + + /** + * 交易完成时间 + */ + @NotNull(message = "交易完成时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date tranTime; + + /** + * 付款账户id + */ + @NotNull(message = "付款账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer sourceAccType; + + /** + * 收款账户id + */ + @NotNull(message = "收款账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + @NotBlank(message = "交易号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + @NotNull(message = "回执状态(0:待回置 1:已回置)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isCallback; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java new file mode 100644 index 0000000..2ff7667 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusAccountsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.common.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.common.domain.RemoteBusAccountsVo; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 资金账户汇总Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusAccountsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java new file mode 100644 index 0000000..f509002 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/BusOperLogVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.common.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.common.api.domain.RemoteBusOperLogVo; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 业务操作日志Convert接口 + * + * @author LionLi + * @date 2024-04-10 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperLogVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java new file mode 100644 index 0000000..a27ba49 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/convert/TranLogVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.common.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.common.api.domain.RemoteTranLogVo; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 交易记录Convert接口 + * + * @author LionLi + * @date 2024-04-11 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface TranLogVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java new file mode 100644 index 0000000..1509c11 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusAccountsVo.java @@ -0,0 +1,150 @@ +package org.dromara.payment.common.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.BusAccounts; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 资金账户汇总视图对象 bus_accounts + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusAccounts.class) +public class BusAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 企业id + */ + @ExcelProperty(value = "企业id") + private Long unitId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型 + */ + @ExcelProperty(value = "银行类型") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private Long balance; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 状态(0:未开通 1:开通成功 2:冻结 3:开通中 4:开通失败) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未开通,1=:开通成功,2=:冻结,3=:开通中,4=:开通失败") + private Integer status; + + /** + * 开户类型(0:系统 6:服务商 9:商户 ) + */ + @ExcelProperty(value = "开户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:系统,6=:服务商,9=:商户") + private Integer addYpe; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String unitName; + + /** + * 企业编号 + */ + @ExcelProperty(value = "企业编号") + private String unitNo; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "角色类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户") + private String unitType; + + /** + * 平台客户号 + */ + @ExcelProperty(value = "平台客户号") + private String custNo; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java new file mode 100644 index 0000000..23669ba --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/BusOperLogVo.java @@ -0,0 +1,71 @@ +package org.dromara.payment.common.domain.vo; + +import org.dromara.payment.common.domain.BusOperLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 业务操作日志视图对象 bus_oper_log + * + * @author LionLi + * @date 2024-04-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperLog.class) +public class BusOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 日志描述 + */ + @ExcelProperty(value = "日志描述") + private String logDesc; + + /** + * 角色id + */ + @ExcelProperty(value = "角色id") + private Long createRoleId; + + /** + * 角色名称 + */ + @ExcelProperty(value = "角色名称") + private String createRoleName; + + private Date createTime; + + /** + * 业务id(任务id或账单批次id) + */ + @ExcelProperty(value = "业务id(任务id或账单批次id)") + private Long busId; + + /** + * 业务类型(1:项目 2:账单批次) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:项目,2=:账单批次") + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java new file mode 100644 index 0000000..d1116b3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/domain/vo/TranLogVo.java @@ -0,0 +1,141 @@ +package org.dromara.payment.common.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.common.domain.TranLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 交易记录视图对象 tran_log + * + * @author LionLi + * @date 2024-04-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = TranLog.class) +public class TranLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 交易记录id + */ + @ExcelProperty(value = "交易记录id") + private Long id; + + /** + * 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + */ + @ExcelProperty(value = "交易场景", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:任务,2=:账单,3=:代理商提现,4=:运营商提现,5=:服务商提现,6=:商户提现") + private Long busType; + + /** + * 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + */ + @ExcelProperty(value = "交易项", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:商户转账到服务商B2B,2=:服务商转账到运营商,3=:服务商转账到平台,4=:服务商转账到个人B2C,5=:提现") + private Long busItem; + + /** + * 交易场景id +扣除服务费:任务id +账单付款:账单明细id + */ + @ExcelProperty(value = "交易场景id 扣除服务费:任务id 账单付款:账单明细id") + private Long buisId; + + /** + * 交易批次 + */ + @ExcelProperty(value = "交易批次") + private String busBatch; + + /** + * 交易id + */ + @ExcelProperty(value = "交易id") + private Long tranId; + + /** + * 申请交易时间 + */ + @ExcelProperty(value = "申请交易时间") + private Date addTime; + + /** + * 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + */ + @ExcelProperty(value = "交易结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "-=1:待处理,1=:支付中,2=:成功,3=:失败") + private Integer tranResult; + + /** + * 待处理批次 + */ + @ExcelProperty(value = "待处理批次") + private String tranBatch; + + /** + * 交易完成时间 + */ + @ExcelProperty(value = "交易完成时间") + private Date tranTime; + + /** + * 付款账户id + */ + @ExcelProperty(value = "付款账户id") + private Long sourceAccId; + + /** + * 付款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款账户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer sourceAccType; + + /** + * 收款账户id + */ + @ExcelProperty(value = "收款账户id") + private Long targetAccId; + + /** + * 收款账户类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款账户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer targetAccType; + + /** + * 交易号(银行流水号) + */ + @ExcelProperty(value = "交易号(银行流水号)") + private String bankNo; + + /** + * 回执状态(0:待回置 1:已回置) + */ + @ExcelProperty(value = "回执状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待回置,1=:已回置") + private Integer isCallback; + + /** + * 交易订单号 + */ + private String tranNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java new file mode 100644 index 0000000..d8306f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusAccountsMapper.java @@ -0,0 +1,65 @@ +package org.dromara.payment.common.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydAccount; + +import java.util.List; + +/** + * 资金账户汇总Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusAccountsMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + public int insertSelective(BusAccounts account); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("sydId") Long sydId,@Param("unitId") long unitId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("sydId") Long sydId,@Param("unitId") long unitId,@Param("amount") long amount,@Param("bankType") String bankType); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId, @Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java new file mode 100644 index 0000000..892aeee --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/BusOperLogMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.common.mapper; + +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 业务操作日志Mapper接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface BusOperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java new file mode 100644 index 0000000..f60a276 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/mapper/TranLogMapper.java @@ -0,0 +1,68 @@ +package org.dromara.payment.common.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 交易记录Mapper接口 + * + * @author LionLi + * @date 2024-04-11 + */ +public interface TranLogMapper extends BaseMapperPlus { + /** + * 查询交易记录 + * @author 张涛 + * @date 2021年9月7日 + * @param batch 交易批次 + * @param result 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + * @param isCallback 回执状态(0:待回置 1:已回置) + * @param size 数量 + * @return + */ + public List selectTranLog(@Param("batch") String batch, @Param("result") int result, @Param("isCallback") Byte isCallback, @Param("size") Integer size); + + /** + * 根据业务场景查询交易记录 + * @author 张涛 + * @date 2021年9月8日 + * @param busType 交易场景(1:任务 2:账单 3:代理商提现 4:运营商提现 5:服务商提现 6:商户提现) + * @param buisId 交易场景id + * @param busItem 交易项(1:商户转账到服务商B2B 2:服务商转账到运营商 3:服务商转账到平台 4:服务商转账到个人B2C 5:提现) + * @param busBatch 交易批次 + * @param tranResult 交易结果(-1:待处理 1:支付中 2:成功 3:失败) + * @return + */ + public List selectByBus(@Param("busType") int busType,@Param("buisId") int buisId,@Param("busItem") String busItem,@Param("busBatch") String busBatch,@Param("tranResult") String tranResult); + + /** + * 分配交易的处理批次 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @return + */ + public Integer allotSyns(@Param("synBatch") String synBatch,@Param("result") int result,@Param("isCallback") Byte isCallback,@Param("minId") long minId,@Param("start") int start,@Param("size") int size); + + /** + * 取消交易处理 + * @author 张涛 + * @date 2021年9月6日 + * @param id 账户id + * @return + */ + public Integer cancelSyn(@Param("id") long id); + + /** + * 取消指定批次所有交易处理 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次 + * @return + */ + public Integer cancelSynByBatch(@Param("synBatch") String synBatch,@Param("result") int result); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java new file mode 100644 index 0000000..3e31de5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusAccountsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.common.service; + +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 资金账户汇总Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusAccountsService { + + /** + * 查询资金账户汇总 + */ + BusAccountsVo queryById(Long id); + + /** + * 查询资金账户汇总列表 + */ + TableDataInfo queryPageList(BusAccountsBo bo, PageQuery pageQuery); + + /** + * 查询资金账户汇总列表 + */ + List queryList(BusAccountsBo bo); + + /** + * 新增资金账户汇总 + */ + Boolean insertByBo(BusAccountsBo bo); + + /** + * 修改资金账户汇总 + */ + Boolean updateByBo(BusAccountsBo bo); + + /** + * 校验并批量删除资金账户汇总信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java new file mode 100644 index 0000000..6801518 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/IBusOperLogService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.common.service; + +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.domain.bo.BusOperLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 业务操作日志Service接口 + * + * @author LionLi + * @date 2024-04-10 + */ +public interface IBusOperLogService { + + /** + * 查询业务操作日志 + */ + BusOperLogVo queryById(Long id); + + /** + * 查询业务操作日志列表 + */ + TableDataInfo queryPageList(BusOperLogBo bo, PageQuery pageQuery); + + /** + * 查询业务操作日志列表 + */ + List queryList(BusOperLogBo bo); + + /** + * 新增业务操作日志 + */ + Boolean insertByBo(BusOperLogBo bo); + + /** + * 修改业务操作日志 + */ + Boolean updateByBo(BusOperLogBo bo); + + /** + * 校验并批量删除业务操作日志信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java new file mode 100644 index 0000000..2cdd8e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/ITranLogService.java @@ -0,0 +1,71 @@ +package org.dromara.payment.common.service; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.domain.bo.TranLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 交易记录Service接口 + * + * @author LionLi + * @date 2024-04-11 + */ +public interface ITranLogService { + + /** + * 查询交易记录 + */ + TranLogVo queryById(Long id); + + /** + * 查询交易记录列表 + */ + TableDataInfo queryPageList(TranLogBo bo, PageQuery pageQuery); + + /** + * 查询交易记录列表 + */ + List queryList(TranLogBo bo); + + /** + * 新增交易记录 + */ + Boolean insertByBo(TranLogBo bo); + + /** + * 修改交易记录 + */ + Boolean updateByBo(TranLogBo bo); + + /** + * 校验并批量删除交易记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 处理交易 + * @param accid 交易记录 + * @param syn 是否只同步结果 + * @return + */ + boolean transaction(TranLogVo accid,boolean syn); + + /** + * 解锁交易账户 + * @param accid 交易记录 + * @return + */ + boolean unlockTransaction(TranLogVo accid); + + /** + * 同步交易回置单 + * @param accid 交易记录 + * @return + */ + boolean synTransferCallBack(TranLogVo accid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java new file mode 100644 index 0000000..841784c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusAccountsServiceImpl.java @@ -0,0 +1,137 @@ +package org.dromara.payment.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.common.domain.bo.BusAccountsBo; +import org.dromara.payment.common.domain.vo.BusAccountsVo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.common.service.IBusAccountsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 资金账户汇总Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusAccountsServiceImpl implements IBusAccountsService { + + private final BusAccountsMapper baseMapper; + + /** + * 查询资金账户汇总 + */ + @Override + public BusAccountsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询资金账户汇总列表 + */ + @Override + public TableDataInfo queryPageList(BusAccountsBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询资金账户汇总列表 + */ + @Override + public List queryList(BusAccountsBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusAccountsBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getUnitId() != null, "t.unit_id", bo.getUnitId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "t.bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(bo.getBalance() != null, "t.balance", bo.getBalance()); + lqw.eq(bo.getFrozen() != null, "t.frozen", bo.getFrozen()); + lqw.eq(bo.getIsDefault() != null, "t.is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getAddYpe() != null, "t.add_ype", bo.getAddYpe()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), "t.out_bank_card", bo.getOutBankCard()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("syd_name"))){ + lqw.like("t2.gsmc",bo.getParams().get("syd_name")); + } + if(StringUtils.isNotBlank(bo.getParams().get("mer_name"))){ + lqw.like("t1.name",bo.getParams().get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + if(StringUtils.isNotBlank(bo.getParams().get("cust_no"))){ + lqw.eq("t1.cust_no",bo.getParams().get("cust_no")); + } + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 新增资金账户汇总 + */ + @Override + public Boolean insertByBo(BusAccountsBo bo) { + BusAccounts add = MapstructUtils.convert(bo, BusAccounts.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改资金账户汇总 + */ + @Override + public Boolean updateByBo(BusAccountsBo bo) { + BusAccounts update = MapstructUtils.convert(bo, BusAccounts.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusAccounts entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除资金账户汇总 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java new file mode 100644 index 0000000..abebf20 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/BusOperLogServiceImpl.java @@ -0,0 +1,113 @@ +package org.dromara.payment.common.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.common.domain.bo.BusOperLogBo; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.common.service.IBusOperLogService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 业务操作日志Service业务层处理 + * + * @author LionLi + * @date 2024-04-10 + */ +@RequiredArgsConstructor +@Service +public class BusOperLogServiceImpl implements IBusOperLogService { + + private final BusOperLogMapper baseMapper; + + /** + * 查询业务操作日志 + */ + @Override + public BusOperLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询业务操作日志列表 + */ + @Override + public TableDataInfo queryPageList(BusOperLogBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询业务操作日志列表 + */ + @Override + public List queryList(BusOperLogBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperLogBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getLogDesc()), BusOperLog::getLogDesc, bo.getLogDesc()); + lqw.eq(bo.getCreateRoleId() != null, BusOperLog::getCreateRoleId, bo.getCreateRoleId()); + lqw.like(StringUtils.isNotBlank(bo.getCreateRoleName()), BusOperLog::getCreateRoleName, bo.getCreateRoleName()); + lqw.eq(bo.getBusId() != null, BusOperLog::getBusId, bo.getBusId()); + lqw.eq(bo.getBusType() != null, BusOperLog::getBusType, bo.getBusType()); + return lqw; + } + + /** + * 新增业务操作日志 + */ + @Override + public Boolean insertByBo(BusOperLogBo bo) { + BusOperLog add = MapstructUtils.convert(bo, BusOperLog.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改业务操作日志 + */ + @Override + public Boolean updateByBo(BusOperLogBo bo) { + BusOperLog update = MapstructUtils.convert(bo, BusOperLog.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperLog entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除业务操作日志 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..d2d06ff --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.payment.common.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotEmpty(roleKey); + boolean permsExist = StringUtils.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java new file mode 100644 index 0000000..427efc6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/common/service/impl/TranLogServiceImpl.java @@ -0,0 +1,280 @@ +package org.dromara.payment.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.service.IBusChannelCashoutService; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.service.IBusMerchantCashoutService; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.service.IBusOperatorCashoutService; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.service.ISysSydCashoutService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.common.domain.bo.TranLogBo; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 交易记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-11 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class TranLogServiceImpl implements ITranLogService { + + private final TranLogMapper baseMapper; + + private final SysSydAccountMapper sydAccountDao; + + private final BusOperatorAccountMapper busOperatorAccountMapper; + + private final BusMerchantAccountMapper accountDao; + + private final IMerBillService billService; + + private final ISysSydCashoutService sydCashoutService; + + private final IBusMerchantCashoutService merchantCashoutService; + + private final IBusChannelCashoutService channelCashoutService; + + private final IBusOperatorCashoutService operatorCashoutService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询交易记录 + */ + @Override + public TranLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询交易记录列表 + */ + @Override + public TableDataInfo queryPageList(TranLogBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询交易记录列表 + */ + @Override + public List queryList(TranLogBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(TranLogBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getBusType() != null, "bus_type", bo.getBusType()); + lqw.eq(bo.getBusItem() != null, "bus_item", bo.getBusItem()); + lqw.eq(bo.getBuisId() != null, "buis_id", bo.getBuisId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusBatch()), "bus_batch", bo.getBusBatch()); + lqw.eq(bo.getTranId() != null, "tran_id", bo.getTranId()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(bo.getTranResult() != null, "tran_result", bo.getTranResult()); + lqw.eq(StringUtils.isNotBlank(bo.getTranBatch()), "tran_batch", bo.getTranBatch()); + lqw.eq(bo.getTranTime() != null, "tran_time", bo.getTranTime()); + lqw.eq(bo.getSourceAccId() != null, "source_acc_id", bo.getSourceAccId()); + lqw.eq(bo.getSourceAccType() != null, "source_acc_type", bo.getSourceAccType()); + lqw.eq(bo.getTargetAccId() != null, "target_acc_id", bo.getTargetAccId()); + lqw.eq(bo.getTargetAccType() != null, "target_acc_type", bo.getTargetAccType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), "bank_no", bo.getBankNo()); + lqw.eq(bo.getIsCallback() != null, "is_callback", bo.getIsCallback()); + return lqw; + } + + /** + * 新增交易记录 + */ + @Override + public Boolean insertByBo(TranLogBo bo) { + TranLog add = MapstructUtils.convert(bo, TranLog.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改交易记录 + */ + @Override + public Boolean updateByBo(TranLogBo bo) { + TranLog update = MapstructUtils.convert(bo, TranLog.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(TranLog entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除交易记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean synTransferCallBack(TranLogVo tlog) { + Result rtn = accountService.getTransferBankNo(tlog.getTranId()); + if (rtn.hasError()) { + throw new ServiceException("同步银行交易流水号出错:"+rtn.getResult()); + }else if (rtn.hasTip()) { + throw new ServiceException("同步银行交易流水号:"+rtn.getResult()); + }else if (StringUtils.isNotBlank(rtn.getRtnData())) { + tlog.setBankNo(rtn.getRtnData()); + rtn = accountService.getTransferCallBack(tlog.getTranId()); + if (rtn.hasError()) { + throw new ServiceException("同步银行交易回置单出错:"+rtn.getResult()); + }else if (rtn.hasTip()) { + throw new ServiceException("同步银行交易回置单结果:"+rtn.getResult()); + }else if (StringUtils.isNotBlank(rtn.getRtnData())) { + if (tlog.getBusType() == 2) {//账单 + billService.billTransactionCallback(tlog,rtn.getRtnData()); + } + if (StringUtils.isNotBlank(tlog.getBankNo())) { + TranLog upd = new TranLog(); + upd.setId(tlog.getId()); + upd.setBankNo(tlog.getBankNo()); + upd.setIsCallback(1); + baseMapper.updateById(upd); + } + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean transaction(TranLogVo accid,boolean syn) { + boolean lock = false; + if(accid.getSourceAccType() == BusRole.SERVICE.getId()){ + lock = sydAccountDao.lock(accid.getSourceAccId().intValue()) > 0; + }else if (accid.getSourceAccType() == BusRole.MERCHANT.getId()){ + lock = accountDao.lock(accid.getSourceAccId().intValue()) > 0; + }else if(accid.getSourceAccType() == BusRole.OPERATOR.getId()){ + lock = this.busOperatorAccountMapper.lock(accid.getSourceAccId().intValue()) > 0; + } + + if(lock) { + Result rtn = null; + if (syn){ + rtn = accountService.synTransfer(accid.getTranId()); + log.info("查询交易返回结果==>"+accid.getTranId()+","+JsonUtils.toJsonString(rtn)); + if (rtn.hasError()) { + throw new ServiceException("同步银行交易结果出错(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } else if (rtn.hasTip()) { + throw new ServiceException("同步银行交易结果提示(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } + if(rtn.getRtnData().getResult() == -1) { + //需要重新发起支付 + rtn.getRtnData().setResult((short)4); + } + }else { + rtn = accountService.transfer(accid.getTranId()); + log.info("交易返回结果==>"+accid.getTranId()+","+JsonUtils.toJsonString(rtn)); + if (rtn.hasError()) { + throw new ServiceException("银行交易出错(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } else if (rtn.hasTip()) { + throw new ServiceException("银行交易提示(" + JsonUtils.toJsonString(accid) + "):" + rtn.getResult()); + } + } + if (rtn.getRtnData() != null && rtn.getRtnData().getResult() > 0) { + TranLog save = null; + if(rtn.getRtnData().getResult() == 4) {//重新发起支付 + save = new TranLog(accid.getId(),-1); + }else if (rtn.getRtnData().getResult() == 1) {//支付中 + if(accid.getTranResult() < 1) { + save = new TranLog(accid.getId(), 1); + } + }else { + if (accid.getBusType() == 2) {//账单 + save = billService.billTransaction(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 5) {//服务商提现 + save = sydCashoutService.cashoutResult(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 6) {//商户提现 + save = merchantCashoutService.cashoutResult(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 3) {//代理商提现 + save = channelCashoutService.cashoutResult(accid, rtn.getRtnData()); + }else if (accid.getBusType() == 4) {//运营商提现 + save = operatorCashoutService.cashoutResult(accid, rtn.getRtnData()); + } + } + if (save != null) { + save.setBankNo(rtn.getRtnData().getTargetBankNo()); + baseMapper.updateById(save); + } + } + unlockTransaction(accid); + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean unlockTransaction(TranLogVo accid) { + if(accid.getSourceAccType() == BusRole.SERVICE.getId()){ + sydAccountDao.update(new LambdaUpdateWrapper().eq(SysSydAccount::getAccId,accid.getSourceAccId()) + .set(SysSydAccount::getStatus,1)); + }else if (accid.getSourceAccType() == BusRole.MERCHANT.getId()){ + accountDao.update(new LambdaUpdateWrapper().eq(BusMerchantAccount::getAccId,accid.getSourceAccId()) + .set(BusMerchantAccount::getStatus,1)); + }else if(accid.getSourceAccType() == BusRole.OPERATOR.getId()){ + busOperatorAccountMapper.update(new LambdaUpdateWrapper().eq(BusOperatorAccount::getAccId,accid.getSourceAccId()) + .set(BusOperatorAccount::getStatus,1)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java new file mode 100644 index 0000000..68d9572 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BankAccountStreamConsumer.java @@ -0,0 +1,124 @@ +package org.dromara.payment.consumer; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.service.ISysSydService; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +@Slf4j +@Component +@RequiredArgsConstructor +public class BankAccountStreamConsumer { + private final ISysSydService sydService; + + private final BusOperatorAccountMapper operatorAccountMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusMerchantAccountMapper merchantAccountMapper; + + private final BusMerchantMapper merchantMapper; + + @Bean + Consumer account2() { + log.info("订阅资金账户生成队列"); + return msg -> { + log.info("通过stream消费到资金账户生成消息 => {}", msg); + if (msg == null) { + return; + } + try { + Long unitId = null; + String gsmc = null; + Function saveFun = null; + Function existsFun = null; + if(msg.getInteger("accType") == BusRole.OPERATOR.getId()){ + //运营商 + BusOperatorVo vo = operatorMapper.selectVoById(msg.getInteger("accUnitId")); + if(vo != null){ + unitId = vo.getId(); + gsmc = vo.getName(); + } + saveFun = add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = operatorAccountMapper.insertAccount(new BusOperatorAccount(add.getId(),add.getUnitId(), add.getAccId(), add.getBankType(), add.getBankCard(), add.getBalance(),0l, (long)1, add.getAddTime(),add.getName(),add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }; + existsFun = bankType -> { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperatorAccount::getOpId,vo.getId()); + lqw.eq(BusOperatorAccount::getBankType,bankType); + List accs = operatorAccountMapper.selectVoList(lqw); + return accs.size() > 0 ? accs.get(0).getBankVirtualCard() : null; + }; + }else if(msg.getInteger("accType") == BusRole.MERCHANT.getId()){ + //商户 + BusMerchantVo vo = merchantMapper.selectVoById(msg.getInteger("accUnitId")); + if(vo != null){ + unitId = vo.getId(); + gsmc = vo.getName(); + } + saveFun = add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = merchantAccountMapper.insertAccount(new BusMerchantAccount(null,add.getId(),add.getUnitId(), add.getAccId(), add.getBankType(), add.getBankCard(), add.getBalance(),0l, (long)1, add.getAddTime(),add.getName(),add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }; + existsFun = bankType -> { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusMerchantAccount::getMerId,vo.getId()); + lqw.eq(BusMerchantAccount::getBankType,bankType); + List accs = merchantAccountMapper.selectVoList(lqw); + return accs.size() > 0 ? accs.get(0).getBankVirtualCard() : null; + }; + } + String sydIds = msg.getString("sydIds"); + if(unitId == null || StringUtils.isBlank(gsmc) || StringUtils.isBlank(sydIds)){ + throw new ServiceException("账户类型不支持"); + } + String[] sydIdArr = sydIds.split(","); + for (String sydId:sydIdArr + ) { + sydService.creatXNnum(Long.parseLong(sydId),unitId,gsmc,msg.getInteger("accType"),msg.getInteger("addAccType"), saveFun, existsFun); + } + } catch (Exception e) { + log.error("资金账户生成出错:("+msg+")",e); + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java new file mode 100644 index 0000000..3b88a89 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/consumer/BillPayStreamConsumer.java @@ -0,0 +1,99 @@ +package org.dromara.payment.consumer; + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +@Slf4j +@Component +@RequiredArgsConstructor +public class BillPayStreamConsumer { + + private final IMerBillService billService; + + private final IMerBillDetailService billDetailService; + + @Bean + Consumer bill() { + log.info("订阅代发任务队列"); + return param -> { + log.info("通过stream消费到代发任务消息 => {}", param); + if (!param.containsKey("billId") && !param.containsKey("billDetailId")) { + return; + } + Long billId = param.getLong("billId"); + Long billDetailId = null; + try { + if(param.containsKey("billDetailId")){ + billDetailId = param.getLong("billDetailId"); + billService.paymentToWorker(billDetailId.intValue()); + }else{ + billService.paymentToService(billId.intValue()); + } + } catch (Exception e) { + String errorType = "代发任务"; + if(e instanceof ServiceException){ + ServiceException ex = (ServiceException) e; + errorType += "-" + ex.getDetailMessage(); + try { + billDetailService.failBillDetail(billId,billDetailId,ex.getMessage(),0,null); + } catch (Exception exc) { + log.error("保存"+errorType+"失败结果出错:("+param.toJSONString()+")",exc); + } + } + log.error(errorType+"出错:("+param.toJSONString()+")",e); + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java new file mode 100644 index 0000000..9fc862e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/controller/CoverPageController.java @@ -0,0 +1,46 @@ +package org.dromara.payment.coverpage.controller; + +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; +import org.dromara.payment.coverpage.service.ICoverPageService; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * @Title CoverPageController + * @Description 首页接口 + * @Author wuchuang + * @Date 2024/5/29 16:12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cover") +public class CoverPageController extends BaseController { + + private final ICoverPageService coverPageService; + + /** + * 获取首页 金额信息 + * + */ +// @SaCheckPermission("payment:task:query") + @GetMapping("/getCoverInfo") + public R getCoverInfo(CoverPageBo bo) { + return R.ok(coverPageService.getCoverInfo(bo)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java new file mode 100644 index 0000000..99d6f32 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageBo.java @@ -0,0 +1,29 @@ +package org.dromara.payment.coverpage.domain; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.task.domain.MerTask; + +/** + * @Title CoverPageBo + * @Description + * @Author wuchuang + * @Date 2024/6/3 10:25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTask.class, reverseConvertGenerate = false) +public class CoverPageBo extends BaseEntity { + + private Long merId; + + private Long sydId; + + private Long opId; + + private Long channelId; + + private String channelNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java new file mode 100644 index 0000000..84d02eb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/CoverPageInfo.java @@ -0,0 +1,74 @@ +package org.dromara.payment.coverpage.domain; + +import lombok.Data; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.util.MoneyUtils; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @Title CoverPageInfo + * @Description + * @Author wuchuang + * @Date 2024/5/30 14:00 + */ +@Data +public class CoverPageInfo { + + + + private Long availableFee ;//账户可用余额(分) 可用收益余额(元) + + private Long monthTransactionAmount ;//本月代发总额(分) + private Long monthTransactionNumber ;//本月代发笔数(笔) + private Long dayTransactionAmount ;//今日交易(元) + + private Long dayTransactionNumber ;//今日交易笔数(笔) + + private Long yingshouFee ;//应收余额(元) + + private String[] days ; //最近30天交易统计图(万元) + + private BigDecimal[] costs;//最近30天交易统计图(万元) + + private List merBillList;//企业交易数据 + + + private int waitTask; + + private int waitBill; + + private int waitInvoice; + + private int waitTax; + + + private Long id; + + private Long merId; + + private Long sydId; + + private Long opId; + + private Long channelId; + + + public BigDecimal getAvailableFee() { + return MoneyUtils.getMoneyYuan(availableFee); + } + + + public BigDecimal getMonthTransactionAmount() { + return MoneyUtils.getMoneyYuan(monthTransactionAmount); + } + + public BigDecimal getDayTransactionAmount() { + return MoneyUtils.getMoneyYuan(dayTransactionAmount); + } + + public BigDecimal getYingshouFee() { + return MoneyUtils.getMoneyYuan(yingshouFee); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java new file mode 100644 index 0000000..5ec4636 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/domain/MerBillInfo.java @@ -0,0 +1,51 @@ +package org.dromara.payment.coverpage.domain; + +import lombok.Data; +import org.dromara.payment.util.MoneyUtils; + +import java.math.BigDecimal; + +/** + * @Title MerBillInfo + * @Description + * @Author wuchuang + * @Date 2024/5/31 9:33 + */ +@Data +public class MerBillInfo { + + private String name; + + private String payTime; + + private Long amountEnt; + + private Long merId; + + private Long yearTransactionAmount ;//年代发总额(分) + private Long yearTransactionNumber ;//年代发笔数(笔) + + private Long monthTransactionAmount ;//本月代发总额(分) + private Long monthTransactionNumber ;//本月代发笔数(笔) + private Long dayTransactionAmount ;//今日交易(元) + + private Long dayTransactionNumber ;//今日交易笔数(笔) + + public BigDecimal getAmountEnt() { + return MoneyUtils.getMoneyYuan(amountEnt); + } + + public BigDecimal getYearTransactionAmount() { + return MoneyUtils.getMoneyYuan(yearTransactionAmount); + } + + public BigDecimal getMonthTransactionAmount() { + return MoneyUtils.getMoneyYuan(monthTransactionAmount); + } + + public BigDecimal getDayTransactionAmount() { + return MoneyUtils.getMoneyYuan(dayTransactionAmount); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java new file mode 100644 index 0000000..22d2638 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/mapper/CoverPageMapper.java @@ -0,0 +1,32 @@ +package org.dromara.payment.coverpage.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; +import org.dromara.payment.coverpage.domain.MerBillInfo; + +import java.util.List; + +/** + * @Title CoverPageMapper + * @Description + * @Author wuchuang + * @Date 2024/5/31 10:35 + */ +public interface CoverPageMapper { + + CoverPageInfo selectMerCountInfo(@Param("merId") Long merId, @Param("sydId") Long sydId); + + CoverPageInfo selectOpCountInfo(@Param("opId") Long busId); + + CoverPageInfo selectChannelCountInfo(@Param("channelId") Long busId,@Param("channelNo")String busNo); + + CoverPageInfo selectSydCountInfo(@Param("sydId") Long busId); + + List selectMerTransactionListById(CoverPageBo bo); + + List select30DaysById(CoverPageBo bo); + + + CoverPageInfo selectAllCountInfo(); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java new file mode 100644 index 0000000..1f6677e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/ICoverPageService.java @@ -0,0 +1,15 @@ +package org.dromara.payment.coverpage.service; + +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; + +/** + * @Title ICoverPageService + * @Description + * @Author wuchuang + * @Date 2024/5/30 13:56 + */ +public interface ICoverPageService { + + CoverPageInfo getCoverInfo(CoverPageBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java new file mode 100644 index 0000000..8068eb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/coverpage/service/impl/CoverPageServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.payment.coverpage.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.coverpage.domain.CoverPageBo; +import org.dromara.payment.coverpage.domain.CoverPageInfo; +import org.dromara.payment.coverpage.domain.MerBillInfo; +import org.dromara.payment.coverpage.mapper.CoverPageMapper; +import org.dromara.payment.coverpage.service.ICoverPageService; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.util.DateTimeUtil; +import org.dromara.payment.util.MoneyUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.apache.commons.lang3.StringUtils.isNotBlank; + +/** + * @Title CoverPageServiceImpl + * @Description + * @Author wuchuang + * @Date 2024/5/30 13:56 + */ +@RequiredArgsConstructor +@Service +public class CoverPageServiceImpl implements ICoverPageService { + + + @Resource + private final CoverPageMapper coverPageMapper; + + @Override + public CoverPageInfo getCoverInfo(CoverPageBo bo) { + + CoverPageInfo info = new CoverPageInfo(); + //根据角色不同 查询不同得数据 + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + info = coverPageMapper.selectMerCountInfo(LoginHelper.getBusId(), bo.getSydId() ); + }else if(busRole == BusRole.OPERATOR.getId() ){ + info = coverPageMapper.selectOpCountInfo(LoginHelper.getBusId()); + + bo.setOpId(LoginHelper.getBusId()); + //查询30条收入数据 + List dayList = coverPageMapper.select30DaysById(bo); + //企业交易量汇总统计 + dealLineData(dayList,info); + List list = coverPageMapper.selectMerTransactionListById(bo); + info.setMerBillList(list); + + }else if(busRole == BusRole.AGENT.getId() ){ + info = coverPageMapper.selectChannelCountInfo(LoginHelper.getBusId(),LoginHelper.getNo()); + //企业交易量汇总统计 + bo.setChannelId(LoginHelper.getBusId()); + bo.setChannelNo(LoginHelper.getNo()); + + //查询30条收入数据 + List dayList = coverPageMapper.select30DaysById(bo); + //企业交易量汇总统计 + dealLineData(dayList,info); + + + List list = coverPageMapper.selectMerTransactionListById(bo); + info.setMerBillList(list); + }else if(busRole == BusRole.SERVICE.getId() ){ + info = coverPageMapper.selectSydCountInfo(LoginHelper.getBusId()); + + + }else if(busRole == BusRole.PLATFORM.getId() ){ + //查询所有数据 + info = coverPageMapper.selectAllCountInfo(); + //查询30条收入数据 + List dayList = coverPageMapper.select30DaysById(bo); + //企业交易量汇总统计 + dealLineData(dayList,info); + List list = coverPageMapper.selectMerTransactionListById(bo); + info.setMerBillList(list); + } + + return info; + } + + private void dealLineData(List dayList, CoverPageInfo info) { + List days = + DateTimeUtil.getDateList(DateTimeUtil.getPreviousMonthSameTime(DateTimeUtil.formatNow("yyyy-MM-dd HH:mm:ss")), + DateTimeUtil.formatNow("yyyy-MM-dd HH:mm:ss"),3,DateTimeUtil.YYYY_MM_DD); + info.setDays(days.toArray(new String[days.size()])); + + Map> grop + = dayList.stream().filter(iem -> isNotBlank(iem.getPayTime()) ) + .collect(Collectors.groupingBy(MerBillInfo::getPayTime)); + + List costList = new ArrayList<>(); + for(String day : days){ + if(null == grop.get(day)){ + costList.add(new BigDecimal("0.00")); + }else{ + costList.add(MoneyUtils.getMoneyWan(grop.get(day).get(0).getAmountEnt())); + } + } + + info.setCosts(costList.toArray(new BigDecimal[costList.size()])); + + } + + /** + * 判断角色查询条件 拒绝全部数据输出 + */ + private void valQueryContion(MerBillBo bo) { + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + bo.setMerId(LoginHelper.getBusId()); + if(null == bo.getSydId() ){ + throw new IllegalArgumentException("请选择服务商"); + } + }else if(busRole == BusRole.OPERATOR.getId() ){ + bo.setOpId(LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId() ){ + bo.setChannelId(LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId() ){ + bo.setSydId(LoginHelper.getBusId()); + }else if(busRole == BusRole.PLATFORM.getId() ){ + //查询所有数据 + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java new file mode 100644 index 0000000..f7ad7ec --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceAddressController.java @@ -0,0 +1,116 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceAddressBo; +import org.dromara.payment.invoice.service.IMerInvoiceAddressService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发票地址 + * 前端访问路由地址为:/payment/invoiceAddress + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceAddress") +public class MerInvoiceAddressController extends BaseController { + + private final IMerInvoiceAddressService merInvoiceAddressService; + + /** + * 查询发票地址列表 + */ + //@SaCheckPermission("payment:invoiceAddress:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceAddressBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId().longValue()); + return merInvoiceAddressService.queryPageList(bo, pageQuery); + } + + /** + * 导出发票地址列表 + */ + @SaCheckPermission("payment:invoiceAddress:export") + @Log(title = "发票地址", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceAddressBo bo, HttpServletResponse response) { + List list = merInvoiceAddressService.queryList(bo); + ExcelUtil.exportExcel(list, "发票地址", MerInvoiceAddressVo.class, response); + } + + /** + * 获取发票地址详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceAddress:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceAddressService.queryById(id)); + } + + /** + * 新增发票地址 + */ + //@SaCheckPermission("payment:invoiceAddress:add") + @Log(title = "发票地址", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceAddressBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId().longValue()); + bo.setMerNo(loginUser.getBusNo()); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merInvoiceAddressService.insertByBo(bo)); + } + + /** + * 修改发票地址 + */ + //@SaCheckPermission("payment:invoiceAddress:edit") + @Log(title = "发票地址", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceAddressBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId().longValue()); + return toAjax(merInvoiceAddressService.updateByBo(bo)); + } + + /** + * 删除发票地址 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceAddress:remove") + @Log(title = "发票地址", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceAddressService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java new file mode 100644 index 0000000..2930b0c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceBillController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.payment.invoice.service.IMerInvoiceBillService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发票明细 + * 前端访问路由地址为:/payment/invoiceBill + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceBill") +public class MerInvoiceBillController extends BaseController { + + private final IMerInvoiceBillService merInvoiceBillService; + + /** + * 查询发票明细列表 + */ + //@SaCheckPermission("payment:invoiceBill:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceBillBo bo, PageQuery pageQuery) { + return merInvoiceBillService.queryPageList(bo, pageQuery); + } + + /** + * 导出发票明细列表 + */ + @SaCheckPermission("payment:invoiceBill:export") + @Log(title = "发票明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceBillBo bo, HttpServletResponse response) { + List list = merInvoiceBillService.queryList(bo); + ExcelUtil.exportExcel(list, "发票明细", MerInvoiceBillVo.class, response); + } + + /** + * 获取发票明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceBill:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceBillService.queryById(id)); + } + + /** + * 新增发票明细 + */ + @SaCheckPermission("payment:invoiceBill:add") + @Log(title = "发票明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceBillBo bo) { + return toAjax(merInvoiceBillService.insertByBo(bo)); + } + + /** + * 修改发票明细 + */ + @SaCheckPermission("payment:invoiceBill:edit") + @Log(title = "发票明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceBillBo bo) { + return toAjax(merInvoiceBillService.updateByBo(bo)); + } + + /** + * 删除发票明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceBill:remove") + @Log(title = "发票明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceBillService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java new file mode 100644 index 0000000..2737752 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceController.java @@ -0,0 +1,268 @@ +package org.dromara.payment.invoice.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.bill.domain.bo.MerBillBo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.bo.UploadInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.invoice.service.IMerInvoiceService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 商户发票记录 + * 前端访问路由地址为:/payment/invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoice") +public class MerInvoiceController extends BaseController { + + private final IMerInvoiceService merInvoiceService; + + private final IMerBillService billService; + + private void bindDataPermission(MerInvoiceBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.SERVICE.getId()){ + bo.setSydId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + }else if(loginUser.getCurRoleId() == BusRole.AGENT.getId()){ + bo.getParams().putAll(Map.of("channel_no",loginUser.getBusNo())); + } + } + + /** + * 查询开票记录列表 + */ + //@SaCheckPermission("payment:invoice:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return merInvoiceService.queryPageList(bo, pageQuery); + } + + /** + * 查询快递发票记录列表 + */ + @GetMapping("/iogisticsList") + public TableDataInfo iogisticsList(MerInvoiceBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + bo.setStatus(2);//已开票 + return merInvoiceService.queryPageList(bo, pageQuery); + } + + /** + * 查询可开票代发批次列表 + * @param bo + * @param pageQuery + * @return + */ + @GetMapping("/canInvoicingList") + public TableDataInfo canInvoicingList(MerBillBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getBusRole() == BusRole.AGENT.getId() || loginUser.getBusRole() == BusRole.OPERATOR.getId() + || loginUser.getBusRole() == BusRole.SERVICE.getId()){ + return new TableDataInfo(); + } + if(loginUser.getBusRole() == BusRole.MERCHANT.getId()){ + bo.setMerId(loginUser.getBusId().longValue()); + bo.setSydId(loginUser.getSydId().longValue()); + } + + bo.setStatus(3l); + bo.setPayStatus(1l); + bo.setIsInvoice(0); + TableDataInfo rtn = billService.queryPageList(bo, pageQuery); + if(rtn.getRows() != null && rtn.getRows().size() > 0) { + rtn.setRows(rtn.getRows().stream().peek(b -> b.setRemark("灵工业务")).collect(Collectors.toList())); + } + return rtn; + } + + /** + * 导出商户发票记录列表 + */ + //@SaCheckPermission("payment:invoice:export") + @Log(title = "商户发票记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = merInvoiceService.queryList(bo); + ExcelUtil.exportExcel(list, "商户发票记录", MerInvoiceVo.class, response); + } + + /** + * 获取商户发票记录详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:invoice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceService.queryById(id)); + } + + + /** + * 获取商户发票记录详细信息 + * @param no 发票记录编码 + */ + //@SaCheckPermission("payment:invoice:query") + @GetMapping("/getInfo/{no}") + public R getInfo(@NotNull(message = "发票记录编码不能为空") + @PathVariable String no) { + return R.ok(merInvoiceService.queryByNo(no)); + } + /** + * 新增商户发票记录 + */ + //@SaCheckPermission("payment:invoice:add") + @Log(title = "商户发票记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merInvoiceService.insertByBo(bo)); + } + + /** + * 修改商户发票记录 + */ +// @SaCheckPermission("payment:invoice:edit") + @Log(title = "商户发票记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceBo bo) { + return toAjax(merInvoiceService.updateByBo(bo)); + } + + + + @Log(title = "更新快递信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editKd") + public R editKd(Long id ,String iogisticsCompany,String iogisticsNo) { + MerInvoiceBo mbo = new MerInvoiceBo(); + mbo.setId(id); + mbo.setIogisticsCompany(iogisticsCompany); + mbo.setIogisticsNo(iogisticsNo); + mbo.setIogisticsStatus(2); + mbo.setUpdateTime(new Date()); + mbo.setUpdateBy(LoginHelper.getUserId()); + return toAjax(merInvoiceService.updateByBo(mbo)); + } + + /** + * 删除商户发票记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoice:remove") + @Log(title = "商户发票记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 服务商驳回发票申请 + * @param id 发票申请id + * @param remark 驳回备注 + * @return + */ + @Log(title = "服务商驳回发票申请", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/reject") + public R reject(long id,String remark) { + LoginUser loginUser = LoginHelper.getLoginUser(); + MerInvoiceBo bo = new MerInvoiceBo(); + bo.setId(id); + bo.setCancelReason(remark); + bo.setCancelBy(loginUser.getNickname()); + return toAjax(merInvoiceService.reject(bo)); + } + + /** + * 服务商上传发票 + * @param bo + * @return + */ + @Log(title = "服务商上传发票", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/uploadInvoice") + public R uploadInvoice(@Validated(AddGroup.class) @RequestBody UploadInvoiceBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(merInvoiceService.uploadInvoice(bo)); + } + + /** + * 服务商添加或修改发票申请快递 + * @param id 发票申请id + * @param iogisticsNo 快递单号 + * @param iogisticsCompany 快递公司 + * @return + */ + @Log(title = "服务商添加或修改发票申请快递", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editIogistics") + public R editIogistics(long id,@NotBlank(message = "快递单号不能为空") String iogisticsNo,@NotBlank(message = "快递公司不能为空") String iogisticsCompany) { + LoginUser loginUser = LoginHelper.getLoginUser(); + MerInvoiceBo bo = new MerInvoiceBo(); + bo.setId(id); + bo.setIogisticsNo(iogisticsNo); + bo.setIogisticsCompany(iogisticsCompany); + bo.setIogisticsBy(loginUser.getNickname()); + return toAjax(merInvoiceService.editIogistics(bo)); + } + + /** + * 商户签收发票快递 + * @param id 发票申请id + * @return + */ + @Log(title = "商户签收发票快递", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/receivingIogistics") + public R receivingIogistics(long id) { + LoginUser loginUser = LoginHelper.getLoginUser(); + return toAjax(merInvoiceService.receivingIogistics(id,loginUser.getNickname())); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java new file mode 100644 index 0000000..71078f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceDetailController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.payment.invoice.service.IMerInvoiceDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 开票明细 + * 前端访问路由地址为:/payment/invoiceDetail + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceDetail") +public class MerInvoiceDetailController extends BaseController { + + private final IMerInvoiceDetailService merInvoiceDetailService; + + /** + * 查询开票明细列表 + */ + //@SaCheckPermission("payment:invoiceDetail:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceDetailBo bo, PageQuery pageQuery) { + return merInvoiceDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出开票明细列表 + */ + @SaCheckPermission("payment:invoiceDetail:export") + @Log(title = "开票明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceDetailBo bo, HttpServletResponse response) { + List list = merInvoiceDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "开票明细", MerInvoiceDetailVo.class, response); + } + + /** + * 获取开票明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceDetailService.queryById(id)); + } + + /** + * 新增开票明细 + */ + @SaCheckPermission("payment:invoiceDetail:add") + @Log(title = "开票明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceDetailBo bo) { + return toAjax(merInvoiceDetailService.insertByBo(bo)); + } + + /** + * 修改开票明细 + */ + //@SaCheckPermission("payment:invoiceDetail:edit") + @Log(title = "开票明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceDetailBo bo) { + return toAjax(merInvoiceDetailService.updateByBo(bo)); + } + + /** + * 删除开票明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceDetail:remove") + @Log(title = "开票明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java new file mode 100644 index 0000000..4bfd609 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/controller/MerInvoiceTypeController.java @@ -0,0 +1,148 @@ +package org.dromara.payment.invoice.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceTypeBo; +import org.dromara.payment.invoice.service.IMerInvoiceTypeService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 发票类目 + * 前端访问路由地址为:/payment/invoiceType + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/invoiceType") +public class MerInvoiceTypeController extends BaseController { + + private final IMerInvoiceTypeService merInvoiceTypeService; + + /** + * 查询发票类目列表(分页) + */ + @SaCheckPermission("payment:invoiceType:list") + @GetMapping("/list") + public TableDataInfo list(MerInvoiceTypeBo bo, PageQuery pageQuery) { + return merInvoiceTypeService.queryPageList(bo, pageQuery); + } + + /** + * 查询发票类目列表 + */ + @GetMapping("/getList") + public R> getList(MerInvoiceTypeBo bo) { + return R.ok(merInvoiceTypeService.queryList(bo)); + } + + + /** + * 查询发票类目列表 + */ + @GetMapping("/getListInvoice") + public R> getListInvoice(MerInvoiceTypeBo bo){ + return R.ok(this.merInvoiceTypeService.getListInvoice(bo)); + } + + + /** + * 查询发票类目列表 + */ + @GetMapping("/getListKpInvoice") + public R> getListInvoice(Integer proId){ + return R.ok(this.merInvoiceTypeService.kp(proId)); + } + + + /** + * 查询商户指定产品的开票类目 + * @param proId 产品id + * @param billIds 代发批次id(多个逗号分隔) + * @return + */ + @GetMapping("/types") + public R> types(int proId,String billIds) { + return R.ok(merInvoiceTypeService.selectList(11,billIds,proId)); + } + + /** + * 导出发票类目列表 + */ + @SaCheckPermission("payment:invoiceType:export") + @Log(title = "发票类目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerInvoiceTypeBo bo, HttpServletResponse response) { + List list = merInvoiceTypeService.queryList(bo); + ExcelUtil.exportExcel(list, "发票类目", MerInvoiceTypeVo.class, response); + } + + /** + * 获取发票类目详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:invoiceType:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merInvoiceTypeService.queryById(id)); + } + + /** + * 新增发票类目 + */ + @SaCheckPermission("payment:invoiceType:add") + @Log(title = "发票类目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerInvoiceTypeBo bo) { + return toAjax(merInvoiceTypeService.insertByBo(bo)); + } + + /** + * 修改发票类目 + */ + @SaCheckPermission("payment:invoiceType:edit") + @Log(title = "发票类目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerInvoiceTypeBo bo) { + return toAjax(merInvoiceTypeService.updateByBo(bo)); + } + + /** + * 删除发票类目 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:invoiceType:remove") + @Log(title = "发票类目", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merInvoiceTypeService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java new file mode 100644 index 0000000..bbfb186 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoice.java @@ -0,0 +1,241 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户发票记录对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice") +public class MerInvoice extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 申请开票流水号 + */ + private String no; + + /** + * 发票抬头 + */ + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Long type; + + /** + * 纳税人识别号 + */ + private String creditCode; + + /** + * 开户银行地址 + */ + private String bankAddress; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开票类目 + */ + private String category; + + /** + * 发票数量(张) + */ + private Long invNum; + + /** + * 开票总金额 + */ + private Long invAmount; + + /** + * 收件地址id + */ + private Long addId; + + /** + * 收件人姓名 + */ + private String addName; + + /** + * 收件人手机号 + */ + private String addPhone; + + /** + * 收件地址 + */ + private String addAddress; + + /** + * 邮箱地址 + */ + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + private Date iogisticsTime; + + /** + * 快递发件人 + */ + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + private Integer status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 取消或驳回人 + */ + private String cancelBy; + + /** + * 取消或驳回原因 + */ + private String cancelReason; + + /** + * 发票备注栏 + */ + private String invRemark; + + /** + * 备注 + */ + private String remark; + + /** + * 单位注册地址 + */ + private String dwzcdz; + + /** + * 单位电话 + */ + private String dwdh; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 快递签收时间 + */ + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + private String iogisticsReceivingBy; + + private String categoryOne; + + private String categoryTwo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java new file mode 100644 index 0000000..aaa114a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceAddress.java @@ -0,0 +1,108 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 发票地址对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_address") +public class MerInvoiceAddress extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 收件人姓名 + */ + private String name; + + /** + * 收件人手机号 + */ + private String phone; + + /** + * 收件地址 + */ + private String address; + + /** + * 邮箱地址 + */ + private String email; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 发票抬头 + */ + private String header; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 单位注册地址 + */ + private String unitAddress; + + /** + * 单位电话 + */ + private String unitPhone; + + /** + * 开户银行账号 + */ + private String bankCard; + + /** + * 开户行地址 + */ + private String bankAddress; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java new file mode 100644 index 0000000..eac380c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceBill.java @@ -0,0 +1,121 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发票明细对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_bill") +public class MerInvoiceBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 票据id + */ + private Long invId; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + private Long status; + + /** + * 账单金额(分) + */ + private Long money; + + /** + * 服务费金额(分) + */ + private Long serviceChargeAmount; + + /** + * 项目id + */ + private Long taskId; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单批次号 + */ + private String billNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java new file mode 100644 index 0000000..1c383f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceDetail.java @@ -0,0 +1,73 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 开票明细对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_detail") +public class MerInvoiceDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 票据申请id + */ + private Long invId; + + /** + * 票据申请编号 + */ + private String invNo; + + /** + * 开票金额(分) + */ + private Long invAmount; + + /** + * 发票编号 + */ + private String detailNo; + + /** + * 发票样张地址 + */ + private String invPic; + + /** + * 开票类目 + */ + private String category; + + /** + * 添加人 + */ + private String addBy; + + /** + * 添加时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java new file mode 100644 index 0000000..9c909fe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/MerInvoiceType.java @@ -0,0 +1,46 @@ +package org.dromara.payment.invoice.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发票类目对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_invoice_type") +public class MerInvoiceType extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 任务类型 + */ + private String parentType; + + /** + * 开票类目 + */ + private String type; + + /** + * 排序 + */ + private Long sort; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java new file mode 100644 index 0000000..4d81e97 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceAddressBo.java @@ -0,0 +1,116 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 发票地址业务对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceAddress.class, reverseConvertGenerate = false) +public class MerInvoiceAddressBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 收件人姓名 + */ + @NotBlank(message = "收件人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 收件人手机号 + */ + @NotBlank(message = "收件人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 收件地址 + */ + @NotBlank(message = "收件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 邮箱地址 + */ + private String email; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String header; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 单位注册地址 + */ + @NotBlank(message = "单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAddress; + + /** + * 单位电话 + */ + @NotBlank(message = "单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitPhone; + + /** + * 开户银行账号 + */ + @NotBlank(message = "开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开户行地址 + */ + @NotBlank(message = "开户行地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankAddress; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java new file mode 100644 index 0000000..35ae4fc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBillBo.java @@ -0,0 +1,128 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 发票明细业务对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceBill.class, reverseConvertGenerate = false) +public class MerInvoiceBillBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 票据id + */ + @NotNull(message = "票据id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invId; + + /** + * 开票金额(分) + */ + @NotNull(message = "开票金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + private Long status; + + /** + * 账单金额(分) + */ + @NotNull(message = "账单金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 服务费金额(分) + */ + @NotNull(message = "服务费金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long serviceChargeAmount; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long taskId; + + /** + * 项目编号 + */ + @NotBlank(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java new file mode 100644 index 0000000..8ecb797 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceBo.java @@ -0,0 +1,263 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户发票记录业务对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoice.class, reverseConvertGenerate = false) +public class MerInvoiceBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 申请开票流水号 + */ + private String no; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long type; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String creditCode; + + /** + * 开户银行地址 + */ + @NotBlank(message = "开户银行地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankAddress; + + /** + * 开户银行账号 + */ + @NotBlank(message = "开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开票类目 + */ + @NotBlank(message = "开票类目不能为空", groups = { AddGroup.class, EditGroup.class }) + private String category; + + /** + * 发票数量(张) + */ + private Long invNum; + + /** + * 开票总金额 + */ + private Long invAmount; + + /** + * 收件地址id + */ + @NotNull(message = "收件地址id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long addId; + + /** + * 收件人姓名 + */ + @NotBlank(message = "收件人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addName; + + /** + * 收件人手机号 + */ + @NotBlank(message = "收件人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addPhone; + + /** + * 收件地址 + */ + @NotBlank(message = "收件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addAddress; + + /** + * 邮箱地址 + */ + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + private Date iogisticsTime; + + /** + * 快递发件人 + */ + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + private Integer status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 取消或驳回人 + */ + private String cancelBy; + + /** + * 取消或驳回原因 + */ + private String cancelReason; + + /** + * 发票备注栏 + */ + private String invRemark; + + /** + * 备注 + */ + private String remark; + + /** + * 单位注册地址 + */ + @NotBlank(message = "单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String dwzcdz; + + /** + * 单位电话 + */ + @NotBlank(message = "单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String dwdh; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 快递签收时间 + */ + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + private String iogisticsReceivingBy; + + /** + * 发票相关的代发批次列表 + */ + private List bills; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java new file mode 100644 index 0000000..a51b6d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceDetailBo.java @@ -0,0 +1,77 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 开票明细业务对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceDetail.class, reverseConvertGenerate = false) +public class MerInvoiceDetailBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "开票明细id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 票据申请id + */ + private Long invId; + + /** + * 票据申请编号 + */ + @NotBlank(message = "票据申请编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invNo; + + /** + * 开票金额(分) + */ + @NotNull(message = "开票金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invAmount; + + /** + * 发票编号 + */ + @NotBlank(message = "发票编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String detailNo; + + /** + * 发票样张地址 + */ + @NotBlank(message = "发票样张地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invPic; + + /** + * 开票类目 + */ + @NotBlank(message = "开票类目不能为空", groups = { AddGroup.class, EditGroup.class }) + private String category; + + /** + * 添加人 + */ + private String addBy; + + /** + * 添加时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java new file mode 100644 index 0000000..7a94c85 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/MerInvoiceTypeBo.java @@ -0,0 +1,48 @@ +package org.dromara.payment.invoice.domain.bo; + +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 发票类目业务对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerInvoiceType.class, reverseConvertGenerate = false) +public class MerInvoiceTypeBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 任务类型 + */ + @NotBlank(message = "任务类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String parentType; + + /** + * 开票类目 + */ + @NotBlank(message = "开票类目不能为空", groups = { AddGroup.class, EditGroup.class }) + private String type; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java new file mode 100644 index 0000000..3fedeb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/bo/UploadInvoiceBo.java @@ -0,0 +1,43 @@ +package org.dromara.payment.invoice.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.invoice.domain.MerInvoice; + +import java.util.Date; +import java.util.List; + +/** + * 商户发票上传发票对象 + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class UploadInvoiceBo extends BaseEntity { + + /** + * 发票申请id + */ + @NotNull(message = "发票申请id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 添加人 + */ + private String addBy; + + /** + * 开票明细列表 + */ + @NotEmpty(message = "开票明细列表不能为空", groups = { AddGroup.class, EditGroup.class }) + private List details; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java new file mode 100644 index 0000000..e3ecabf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceAddressVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 发票地址Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceAddressVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java new file mode 100644 index 0000000..b26c488 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceBillVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceBillVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 发票明细Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceBillVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java new file mode 100644 index 0000000..9ef1b6a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceDetailVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 开票明细Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceDetailVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java new file mode 100644 index 0000000..07ae382 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceTypeVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 发票类目Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceTypeVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java new file mode 100644 index 0000000..6a5fa1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/convert/MerInvoiceVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.invoice.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.invoice.api.domain.RemoteMerInvoiceVo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户发票记录Convert接口 + * + * @author LionLi + * @date 2024-05-06 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerInvoiceVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java new file mode 100644 index 0000000..f614250 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceAddressVo.java @@ -0,0 +1,131 @@ +package org.dromara.payment.invoice.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票地址视图对象 mer_invoice_address + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceAddress.class) +public class MerInvoiceAddressVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 收件人姓名 + */ + @ExcelProperty(value = "收件人姓名") + private String name; + + /** + * 收件人手机号 + */ + @ExcelProperty(value = "收件人手机号") + private String phone; + + /** + * 收件地址 + */ + @ExcelProperty(value = "收件地址") + private String address; + + /** + * 邮箱地址 + */ + @ExcelProperty(value = "邮箱地址") + private String email; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String header; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String nsrSbh; + + /** + * 单位注册地址 + */ + @ExcelProperty(value = "单位注册地址") + private String unitAddress; + + /** + * 单位电话 + */ + @ExcelProperty(value = "单位电话") + private String unitPhone; + + /** + * 开户银行账号 + */ + @ExcelProperty(value = "开户银行账号") + private String bankCard; + + /** + * 开户行地址 + */ + @ExcelProperty(value = "开户行地址") + private String bankAddress; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java new file mode 100644 index 0000000..e13f935 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceBillVo.java @@ -0,0 +1,179 @@ +package org.dromara.payment.invoice.domain.vo; + +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票明细视图对象 mer_invoice_bill + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceBill.class) +public class MerInvoiceBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 票据id + */ + @ExcelProperty(value = "票据id") + private Long invId; + + /** + * 开票金额(分) + */ + @ExcelProperty(value = "开票金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long invAmount; + + /** + * 状态(1:正常 2:取消) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:取消") + private Long status; + + /** + * 账单金额(分) + */ + @ExcelProperty(value = "账单金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long money; + + /** + * 服务费金额(分) + */ + @ExcelProperty(value = "服务费金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long serviceChargeAmount; + + /** + * 项目id + */ + @ExcelProperty(value = "项目id") + private Long taskId; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "账单批次号") + private String billNo; + + /** + * 账单批次状态(1:发放成功) + */ + @ExcelProperty(value = "账单状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:发放成功") + private Long billStatus = 1l; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String merName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java new file mode 100644 index 0000000..9f11744 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceDetailVo.java @@ -0,0 +1,89 @@ +package org.dromara.payment.invoice.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 开票明细视图对象 mer_invoice_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceDetail.class) +public class MerInvoiceDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 票据申请id + */ + @ExcelProperty(value = "票据申请id") + private Long invId; + + /** + * 票据申请编号 + */ + @ExcelProperty(value = "票据申请编号") + private String invNo; + + /** + * 开票金额(分) + */ + @ExcelProperty(value = "开票金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long invAmount; + + /** + * 发票编号 + */ + @ExcelProperty(value = "发票编号") + private String detailNo; + + /** + * 发票样张地址 + */ + @ExcelProperty(value = "发票样张地址") + private String invPic; + + /** + * 开票类目 + */ + @ExcelProperty(value = "开票类目") + private String category; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java new file mode 100644 index 0000000..9d580a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceTypeVo.java @@ -0,0 +1,56 @@ +package org.dromara.payment.invoice.domain.vo; + +import org.dromara.payment.invoice.domain.MerInvoiceType; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 发票类目视图对象 mer_invoice_type + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoiceType.class) +public class MerInvoiceTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 任务类型 + */ + @ExcelProperty(value = "任务类型") + private String parentType; + + /** + * 开票类目 + */ + @ExcelProperty(value = "开票类目") + private String type; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java new file mode 100644 index 0000000..dd3480f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/domain/vo/MerInvoiceVo.java @@ -0,0 +1,313 @@ +package org.dromara.payment.invoice.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.invoice.domain.MerInvoice; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 商户发票记录视图对象 mer_invoice + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerInvoice.class) +public class MerInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 申请开票流水号 + */ + @ExcelProperty(value = "申请开票流水号") + private String no; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String header; + + /** + * 发票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "发票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Long type; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String creditCode; + + /** + * 开户银行地址 + */ + @ExcelProperty(value = "开户银行地址") + private String bankAddress; + + /** + * 开户银行账号 + */ + @ExcelProperty(value = "开户银行账号") + private String bankCard; + + /** + * 开票类目 + */ + @ExcelProperty(value = "开票类目") + private String category; + + /** + * 发票数量(张) + */ + @ExcelProperty(value = "发票数量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "张=") + private Long invNum; + + /** + * 开票总金额 + */ + @ExcelProperty(value = "开票总金额") + private Long invAmount; + + /** + * 收件地址id + */ + @ExcelProperty(value = "收件地址id") + private Long addId; + + /** + * 收件人姓名 + */ + @ExcelProperty(value = "收件人姓名") + private String addName; + + /** + * 收件人手机号 + */ + @ExcelProperty(value = "收件人手机号") + private String addPhone; + + /** + * 收件地址 + */ + @ExcelProperty(value = "收件地址") + private String addAddress; + + /** + * 邮箱地址 + */ + @ExcelProperty(value = "邮箱地址") + private String addEmail; + + /** + * 快递状态(1:未寄出 2:未签收 3:已签收) + */ + @ExcelProperty(value = "快递状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:未寄出,2=:未签收,3=:已签收") + private Integer iogisticsStatus; + + /** + * 快递时间 + */ + @ExcelProperty(value = "快递时间") + private Date iogisticsTime; + + /** + * 快递发件人 + */ + @ExcelProperty(value = "快递发件人") + private String iogisticsBy; + + /** + * 快递公司(字典值) + */ + @ExcelProperty(value = "快递公司", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String iogisticsCompany; + + /** + * 快递单号 + */ + @ExcelProperty(value = "快递单号") + private String iogisticsNo; + + /** + * 开票状态(1:待开票、2:已开票、3:已取消 4:驳回 5:开票中) + */ + @ExcelProperty(value = "开票状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:待开票、2:已开票、3:已取消,4=:驳回,5=:开票中") + private Integer status; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 取消时间 + */ + @ExcelProperty(value = "取消时间") + private Date cancelTime; + + /** + * 取消或驳回人 + */ + @ExcelProperty(value = "取消或驳回人") + private String cancelBy; + + /** + * 取消或驳回原因 + */ + @ExcelProperty(value = "取消或驳回原因") + private String cancelReason; + + /** + * 发票备注栏 + */ + @ExcelProperty(value = "发票备注栏") + private String invRemark; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 单位注册地址 + */ + @ExcelProperty(value = "单位注册地址") + private String dwzcdz; + + /** + * 单位电话 + */ + @ExcelProperty(value = "单位电话") + private String dwdh; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Integer busType; + + /** + * 快递签收时间 + */ + @ExcelProperty(value = "快递签收时间") + private Date iogisticsReceivingTime; + + /** + * 快递签收人 + */ + @ExcelProperty(value = "快递签收人") + private String iogisticsReceivingBy; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String merName; + + /** + * 打款批次号(多个逗号分隔) + */ + private String billNos; + + private Date createTime; + + /** + * 发票列表 + */ + private List details; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java new file mode 100644 index 0000000..245e507 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceAddressMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.invoice.mapper; + +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 发票地址Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceAddressMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java new file mode 100644 index 0000000..a066b61 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceBillMapper.java @@ -0,0 +1,58 @@ +package org.dromara.payment.invoice.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; + +import java.util.List; + +/** + * 发票明细Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceBillMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 修改代发批次开票状态 + * @param invId 发票申请id + * @param sourceStatus 源开票状态(0:待开票 1:已开票 2:已申请开票) + * @param targetStatus 新开票状态(0:待开票 1:已开票 2:已申请开票) + * @return + */ + Integer updateInvoiceStatus(@Param("invId") long invId,@Param("sourceStatus") int sourceStatus,@Param("targetStatus") int targetStatus); + + /** + * 查询发票中冻结的服务商代发批次流水 + * @param invId 发票申请id + * @return + */ + List selectFrozenSydFlows(@Param("invId") long invId); + + /** + * 查询发票中冻结的运营商代发批次流水 + * @param invId 发票申请id + * @return + */ + List selectFrozenOpFlows(@Param("invId") long invId); + + /** + * 查询发票中冻结的代理商代发批次流水 + * @param invId 发票申请id + * @return + */ + List selectFrozenChannelFlows(@Param("invId") long invId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java new file mode 100644 index 0000000..01d04da --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceDetailMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.invoice.mapper; + +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 开票明细Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceDetailMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java new file mode 100644 index 0000000..d7ecf44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceMapper.java @@ -0,0 +1,29 @@ +package org.dromara.payment.invoice.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 商户发票记录Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + MerInvoiceVo selectInvInfo(MerInvoiceBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java new file mode 100644 index 0000000..f4167c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/mapper/MerInvoiceTypeMapper.java @@ -0,0 +1,29 @@ +package org.dromara.payment.invoice.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 发票类目Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerInvoiceTypeMapper extends BaseMapperPlus { + /** + * 根据产品id查询发票类目 + * @param busType 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param busId 业务id(多个逗号分隔) + * @param proId 产品id + * @param num 业务id数量 + * @return + */ + List selectInvoiceByProId(@Param("busType") int busType, @Param("busId") String busId, @Param("proId") int proId,@Param("num") int num); + + + List selectInvoiceListByProId(@Param("proId") int proId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java new file mode 100644 index 0000000..01f7dd0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceAddressService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceAddressBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 发票地址Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceAddressService { + + /** + * 查询发票地址 + */ + MerInvoiceAddressVo queryById(Long id); + + /** + * 查询发票地址列表 + */ + TableDataInfo queryPageList(MerInvoiceAddressBo bo, PageQuery pageQuery); + + /** + * 查询发票地址列表 + */ + List queryList(MerInvoiceAddressBo bo); + + /** + * 新增发票地址 + */ + Boolean insertByBo(MerInvoiceAddressBo bo); + + /** + * 修改发票地址 + */ + Boolean updateByBo(MerInvoiceAddressBo bo); + + /** + * 校验并批量删除发票地址信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java new file mode 100644 index 0000000..0d4693d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceBillService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 发票明细Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceBillService { + + /** + * 查询发票明细 + */ + MerInvoiceBillVo queryById(Long id); + + /** + * 查询发票明细列表 + */ + TableDataInfo queryPageList(MerInvoiceBillBo bo, PageQuery pageQuery); + + /** + * 查询发票明细列表 + */ + List queryList(MerInvoiceBillBo bo); + + /** + * 新增发票明细 + */ + Boolean insertByBo(MerInvoiceBillBo bo); + + /** + * 修改发票明细 + */ + Boolean updateByBo(MerInvoiceBillBo bo); + + /** + * 校验并批量删除发票明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java new file mode 100644 index 0000000..e8b7931 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceDetailService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 开票明细Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceDetailService { + + /** + * 查询开票明细 + */ + MerInvoiceDetailVo queryById(Long id); + + /** + * 查询开票明细列表 + */ + TableDataInfo queryPageList(MerInvoiceDetailBo bo, PageQuery pageQuery); + + /** + * 查询开票明细列表 + */ + List queryList(MerInvoiceDetailBo bo); + + /** + * 新增开票明细 + */ + Boolean insertByBo(MerInvoiceDetailBo bo); + + /** + * 修改开票明细 + */ + Boolean updateByBo(MerInvoiceDetailBo bo); + + /** + * 校验并批量删除开票明细信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java new file mode 100644 index 0000000..f43fd44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceService.java @@ -0,0 +1,84 @@ +package org.dromara.payment.invoice.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.bo.UploadInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; + +import java.util.Collection; +import java.util.List; + +/** + * 商户发票记录Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceService { + + /** + * 查询商户发票记录 + */ + MerInvoiceVo queryById(Long id); + + /** + * 查询商户发票记录列表 + */ + TableDataInfo queryPageList(MerInvoiceBo bo, PageQuery pageQuery); + + /** + * 查询商户发票记录列表 + */ + List queryList(MerInvoiceBo bo); + + /** + * 新增商户发票记录 + */ + Boolean insertByBo(MerInvoiceBo bo); + + /** + * 修改商户发票记录 + */ + Boolean updateByBo(MerInvoiceBo bo); + + /** + * 校验并批量删除商户发票记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 服务商驳回发票申请 + * @return + */ + Boolean reject(MerInvoiceBo bo); + + /** + * 服务商上传发票 + * @param bo + * @return + */ + Boolean uploadInvoice(UploadInvoiceBo bo); + + /** + * 服务商添加或修改发票申请快递 + * @return + */ + Boolean editIogistics(MerInvoiceBo bo); + + /** + * 商户签收发票快递 + * @param invId 发票申请id + * @param oper 操作人 + * @return + */ + Boolean receivingIogistics(long invId,String oper); + + + /*** + * 根据发票流水号查询发票详情 + * @param no + * @return + */ + public MerInvoiceVo queryByNo(String no); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java new file mode 100644 index 0000000..05dc242 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/IMerInvoiceTypeService.java @@ -0,0 +1,66 @@ +package org.dromara.payment.invoice.service; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceTypeBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 发票类目Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerInvoiceTypeService { + + /** + * 查询发票类目 + */ + MerInvoiceTypeVo queryById(Long id); + + /** + * 查询发票类目列表 + */ + TableDataInfo queryPageList(MerInvoiceTypeBo bo, PageQuery pageQuery); + + /** + * 查询发票类目列表 + */ + List queryList(MerInvoiceTypeBo bo); + + /** + * 查询发票类目列表 + * @param busType 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param busId 业务id(多个逗号分隔) + * @param proId 产品id + * @return + */ + List selectList(int busType, String busId,int proId); + + /** + * 新增发票类目 + */ + Boolean insertByBo(MerInvoiceTypeBo bo); + + /** + * 修改发票类目 + */ + Boolean updateByBo(MerInvoiceTypeBo bo); + + /** + * 校验并批量删除发票类目信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List getListInvoice(MerInvoiceTypeBo bo); + + + public List kp(Integer proId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java new file mode 100644 index 0000000..4f76da6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceAddressServiceImpl.java @@ -0,0 +1,134 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSyd; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceAddressBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceAddressVo; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.mapper.MerInvoiceAddressMapper; +import org.dromara.payment.invoice.service.IMerInvoiceAddressService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 发票地址Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceAddressServiceImpl implements IMerInvoiceAddressService { + + private final MerInvoiceAddressMapper baseMapper; + + /** + * 查询发票地址 + */ + @Override + public MerInvoiceAddressVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询发票地址列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceAddressBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发票地址列表 + */ + @Override + public List queryList(MerInvoiceAddressBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceAddressBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), "address", bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getEmail()), "email", bo.getEmail()); + lqw.eq(bo.getIsDefault() != null, "is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "add_by", bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getHeader()), "header", bo.getHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), "nsr_sbh", bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitAddress()), "unit_address", bo.getUnitAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitPhone()), "unit_phone", bo.getUnitPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getBankAddress()), "bank_address", bo.getBankAddress()); + return lqw; + } + + /** + * 新增发票地址 + */ + @Override + public Boolean insertByBo(MerInvoiceAddressBo bo) { + MerInvoiceAddress add = MapstructUtils.convert(bo, MerInvoiceAddress.class); + validEntityBeforeSave(add); + add.setAddTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改发票地址 + */ + @Override + public Boolean updateByBo(MerInvoiceAddressBo bo) { + MerInvoiceAddress update = MapstructUtils.convert(bo, MerInvoiceAddress.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceAddress entity){ + //TODO 做一些数据校验,如唯一约束 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(MerInvoiceAddress::getMerId,entity.getMerId()); + MerInvoiceAddress exists = baseMapper.selectOne(lqw); + if(exists != null && (entity.getId() == null || entity.getId() != exists.getId())){ + throw new ServiceException("发票地址已存在"); + } + } + + /** + * 批量删除发票地址 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java new file mode 100644 index 0000000..d1e87b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceBillServiceImpl.java @@ -0,0 +1,127 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.mapper.MerInvoiceBillMapper; +import org.dromara.payment.invoice.service.IMerInvoiceBillService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 发票明细Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceBillServiceImpl implements IMerInvoiceBillService { + + private final MerInvoiceBillMapper baseMapper; + + /** + * 查询发票明细 + */ + @Override + public MerInvoiceBillVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询发票明细列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceBillBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发票明细列表 + */ + @Override + public List queryList(MerInvoiceBillBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceBillBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getInvId() != null, "t.inv_id", bo.getInvId()); + lqw.eq(bo.getInvAmount() != null, "t.inv_amount", bo.getInvAmount()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getMoney() != null, "t.money", bo.getMoney()); + lqw.eq(bo.getServiceChargeAmount() != null, "t.service_charge_amount", bo.getServiceChargeAmount()); + lqw.eq(bo.getTaskId() != null, "t.task_id", bo.getTaskId()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "t.task_no", bo.getTaskNo()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(bo.getBillId() != null, "t.bill_id", bo.getBillId()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), "t.bill_no", bo.getBillNo()); + return lqw; + } + + /** + * 新增发票明细 + */ + @Override + public Boolean insertByBo(MerInvoiceBillBo bo) { + MerInvoiceBill add = MapstructUtils.convert(bo, MerInvoiceBill.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改发票明细 + */ + @Override + public Boolean updateByBo(MerInvoiceBillBo bo) { + MerInvoiceBill update = MapstructUtils.convert(bo, MerInvoiceBill.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceBill entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除发票明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java new file mode 100644 index 0000000..540ad8d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceDetailServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.mapper.MerInvoiceDetailMapper; +import org.dromara.payment.invoice.service.IMerInvoiceDetailService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 开票明细Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceDetailServiceImpl implements IMerInvoiceDetailService { + + private final MerInvoiceDetailMapper baseMapper; + + /** + * 查询开票明细 + */ + @Override + public MerInvoiceDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询开票明细列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceDetailBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询开票明细列表 + */ + @Override + public List queryList(MerInvoiceDetailBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getInvId() != null, "inv_id", bo.getInvId()); + lqw.eq(StringUtils.isNotBlank(bo.getInvNo()), "inv_no", bo.getInvNo()); + lqw.eq(bo.getInvAmount() != null, "inv_amount", bo.getInvAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getDetailNo()), "detail_no", bo.getDetailNo()); + lqw.eq(StringUtils.isNotBlank(bo.getInvPic()), "inv_pic", bo.getInvPic()); + lqw.eq(StringUtils.isNotBlank(bo.getCategory()), "category", bo.getCategory()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "add_by", bo.getAddBy()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + return lqw; + } + + /** + * 新增开票明细 + */ + @Override + public Boolean insertByBo(MerInvoiceDetailBo bo) { + MerInvoiceDetail add = MapstructUtils.convert(bo, MerInvoiceDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改开票明细 + */ + @Override + public Boolean updateByBo(MerInvoiceDetailBo bo) { + MerInvoiceDetail update = MapstructUtils.convert(bo, MerInvoiceDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除开票明细 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java new file mode 100644 index 0000000..ffd732b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceServiceImpl.java @@ -0,0 +1,463 @@ +package org.dromara.payment.invoice.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.mapper.MerBillMapper; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.channel.domain.vo.BusChannelFlowsVo; +import org.dromara.payment.channel.mapper.BusChannelFlowsMapper; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.domain.MerInvoiceBill; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBillBo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceDetailBo; +import org.dromara.payment.invoice.domain.bo.UploadInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceBillVo; +import org.dromara.payment.invoice.mapper.MerInvoiceAddressMapper; +import org.dromara.payment.invoice.mapper.MerInvoiceBillMapper; +import org.dromara.payment.invoice.mapper.MerInvoiceDetailMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.mapper.BusOperatorFlowsMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydFlowsMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.mapper.MerInvoiceMapper; +import org.dromara.payment.invoice.service.IMerInvoiceService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商户发票记录Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceServiceImpl implements IMerInvoiceService { + + private final MerInvoiceMapper baseMapper; + + private final MerInvoiceBillMapper invoiceBillMapper; + + private final MerBillMapper billMapper; + + private final MerInvoiceDetailMapper invoiceDetailMapper; + + private final SysSydFlowsMapper sydFlowsMapper; + + private final ISysSydAccountService sydAccountService; + + private final BusOperatorFlowsMapper operatorFlowsMapper; + + private final IBusOperatorAccountService operatorAccountService; + + private final BusChannelFlowsMapper channelFlowsMapper; + + private final IBusChannelAccountService channelAccountService; + + private final MerInvoiceAddressMapper merInvoiceAddressMapper; + + private final SysSydMapper sydMapper; + + private final IXyjService xyjService; + + private final BusMerchantMapper merchantMapper; + /** + * 查询商户发票记录 + */ + @Override + public MerInvoiceVo queryById(Long id){ + MerInvoiceBo invoiceBo = new MerInvoiceBo(); + invoiceBo.setId(id); + MerInvoiceVo rtn = this.baseMapper.selectInvInfo(invoiceBo); + if(rtn != null) { + rtn.setDetails(invoiceDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerInvoiceDetail::getInvId, id))); + } + return rtn; + } + + /** + * 查询商户发票记录 + */ + @Override + public MerInvoiceVo queryByNo(String no){ + MerInvoiceBo invoiceBo = new MerInvoiceBo(); + invoiceBo.setNo(no); + MerInvoiceVo rtn = this.baseMapper.selectInvInfo(invoiceBo); + if(rtn != null) { + rtn.setDetails(invoiceDetailMapper.selectVoList(new LambdaQueryWrapper().eq(MerInvoiceDetail::getInvId, rtn.getId()))); + } + return rtn; + } + + /** + * 查询商户发票记录列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户发票记录列表 + */ + @Override + public List queryList(MerInvoiceBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "t.no", bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getHeader()), "t.header", bo.getHeader()); + lqw.eq(bo.getType() != null, "t.type", bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getCreditCode()), "t.credit_code", bo.getCreditCode()); + lqw.eq(StringUtils.isNotBlank(bo.getBankAddress()), "t.bank_address", bo.getBankAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getCategory()), "t.category", bo.getCategory()); + lqw.eq(bo.getInvNum() != null, "t.inv_num", bo.getInvNum()); + lqw.eq(bo.getInvAmount() != null, "t.inv_amount", bo.getInvAmount()); + lqw.eq(bo.getAddId() != null, "t.add_id", bo.getAddId()); + lqw.like(StringUtils.isNotBlank(bo.getAddName()), "t.add_name", bo.getAddName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddPhone()), "t.add_phone", bo.getAddPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getAddAddress()), "t.add_address", bo.getAddAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getAddEmail()), "t.add_email", bo.getAddEmail()); + lqw.eq(bo.getIogisticsStatus() != null, "t.iogistics_status", bo.getIogisticsStatus()); + lqw.eq(bo.getIogisticsTime() != null, "t.iogistics_time", bo.getIogisticsTime()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsBy()), "t.iogistics_by", bo.getIogisticsBy()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsCompany()), "t.iogistics_company", bo.getIogisticsCompany()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsNo()), "t.iogistics_no", bo.getIogisticsNo()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(bo.getAddTime() != null, "t.add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "t.add_by", bo.getAddBy()); + lqw.eq(bo.getCancelTime() != null, "t.cancel_time", bo.getCancelTime()); + lqw.eq(StringUtils.isNotBlank(bo.getCancelBy()), "t.cancel_by", bo.getCancelBy()); + lqw.eq(StringUtils.isNotBlank(bo.getCancelReason()), "t.cancel_reason", bo.getCancelReason()); + lqw.eq(StringUtils.isNotBlank(bo.getInvRemark()), "t.inv_remark", bo.getInvRemark()); + lqw.eq(StringUtils.isNotBlank(bo.getDwzcdz()), "t.dwzcdz", bo.getDwzcdz()); + lqw.eq(StringUtils.isNotBlank(bo.getDwdh()), "t.dwdh", bo.getDwdh()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "t.syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "t.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "t.channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "t.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "t.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "t.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "t.mer_no", bo.getMerNo()); + lqw.eq(bo.getBusType() != null, "t.bus_type", bo.getBusType()); + lqw.eq(bo.getIogisticsReceivingTime() != null, "t.iogistics_receiving_time", bo.getIogisticsReceivingTime()); + lqw.eq(StringUtils.isNotBlank(bo.getIogisticsReceivingBy()), "t.iogistics_receiving_by", bo.getIogisticsReceivingBy()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("syd_name"))){ + lqw.like("t2.gsmc",bo.getParams().get("syd_name")); + } + if(StringUtils.isNotBlank(bo.getParams().get("mer_name"))){ + lqw.like("t1.name",bo.getParams().get("mer_name")); + } + if(StringUtils.isNotBlank(params.get("channel_no"))){ + lqw.likeRight("t.channel_no",params.get("channel_no")); + } + return lqw; + } + + /** + * 新增商户发票记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(MerInvoiceBo bo) { + MerInvoice add = MapstructUtils.convert(bo, MerInvoice.class); + validEntityBeforeSave(add); + add.setNo("T"+ DateUtils.dateTimeNow(DateUtils.YYYYMMDDHHMMSSSSS)+ RandomUtil.randomNumbers(5)); + add.setAddTime(new Date()); + add.setInvAmount(0l); + add.setStatus(5);//开票中 + List bills = new ArrayList<>(); + List billIds = new ArrayList<>(); + for (MerInvoiceBillBo bill:bo.getBills() + ) { + MerInvoiceBill b = MapstructUtils.convert(bill,MerInvoiceBill.class); + b.setSydId(add.getSydId()); + b.setSydNo(add.getSydNo()); + b.setOpId(add.getOpId()); + b.setOpNo(add.getOpNo()); + b.setChannelId(add.getChannelId()); + b.setChannelNo(add.getChannelNo()); + b.setChannelCode(add.getChannelCode()); + b.setMerId(add.getMerId()); + b.setMerNo(add.getMerNo()); + add.setInvAmount(add.getInvAmount()+b.getInvAmount()); + bills.add(b); + billIds.add(b.getBillId()); + } + //发起了申请 + if(billMapper.update(new LambdaUpdateWrapper().in(MerBill::getId,billIds) + .eq(MerBill::getIsInvoice,0) + .set(MerBill::getIsInvoice,2)) != billIds.size()){ + throw new ServiceException("不允许重复申请,申请失败"); + } + + this.merInvoiceAddressMapper.update(new LambdaUpdateWrapper().eq(MerInvoiceAddress::getMerId,add.getMerId()) + .set(MerInvoiceAddress::getName,add.getAddName()).set(MerInvoiceAddress::getPhone,add.getAddPhone()) + .set(MerInvoiceAddress::getAddress,add.getAddAddress())); + SysSyd sysSyd = sydMapper.selectSysSydById(add.getSydId()); + BusMerchant busMerchant = merchantMapper.selectById(add.getMerId()); + boolean flag; + + if(false){ + flag = xyjService.applyInvoice(busMerchant,sysSyd,add); + }else{ + flag = baseMapper.insert(add) > 0; + } + + if (flag) { + bills = bills.stream().peek(b -> b.setInvId(add.getId())).collect(Collectors.toList()); + invoiceBillMapper.insertBatch(bills); + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户发票记录 + */ + @Override + public Boolean updateByBo(MerInvoiceBo bo) { + MerInvoice update = MapstructUtils.convert(bo, MerInvoice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoice entity){ + //TODO 做一些数据校验,如唯一约束 + + } + + /** + * 批量删除商户发票记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean reject(MerInvoiceBo bo) { + MerInvoice update = MapstructUtils.convert(bo, MerInvoice.class); + update.setCancelTime(new Date()); + update.setStatus(4);//驳回 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(MerInvoice::getId,bo.getId()) + .eq(MerInvoice::getStatus,5)) == 0){ + throw new ServiceException("不允许重复驳回,驳回失败"); + } + invoiceBillMapper.updateInvoiceStatus(bo.getId(),2,0); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean uploadInvoice(UploadInvoiceBo bo) { + MerInvoiceVo vo = baseMapper.selectVoById(bo.getId()); + if(vo == null){ + throw new ServiceException("发票申请不存在,提交失败"); + } + if(vo.getStatus() != 5){ + throw new ServiceException("发票已上传,提交失败"); + } + List details = new ArrayList<>(); + long invAmount = 0;//开票金额(分) + for (MerInvoiceDetailBo d:bo.getDetails() + ) { + MerInvoiceDetail detail = MapstructUtils.convert(d,MerInvoiceDetail.class); + detail.setInvId(bo.getId()); + detail.setInvNo(vo.getNo()); + detail.setAddBy(bo.getAddBy()); + detail.setAddTime(new Date()); + invAmount += detail.getInvAmount(); + details.add(detail); + } + if(vo.getInvAmount() != invAmount){ + throw new ServiceException("发票申请金额与开票金额不一致,请核对后提交!"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(MerInvoice::getId,bo.getId()) + .eq(MerInvoice::getStatus,5) + .set(MerInvoice::getStatus,2) + .set(MerInvoice::getInvNum,details.size())) == 0){ + throw new ServiceException("重复操作,提交失败"); + } + invoiceDetailMapper.insertBatch(details); + invoiceBillMapper.updateInvoiceStatus(bo.getId(),2,1); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean editIogistics(MerInvoiceBo bo) { + MerInvoiceVo vo = baseMapper.selectVoById(bo.getId()); + if(vo == null){ + throw new ServiceException("发票申请不存在,提交失败"); + } + if(vo.getStatus() != 2){ + throw new ServiceException("发票还未开出,提交失败"); + } + MerInvoice updater = MapstructUtils.convert(bo,MerInvoice.class); + if(vo.getIogisticsTime() == null){ + updater.setIogisticsTime(new Date()); + updater.setIogisticsStatus(2); + } + baseMapper.updateById(updater); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean receivingIogistics(long invId,String oper) { + MerInvoiceVo vo = baseMapper.selectVoById(invId); + if(vo == null){ + throw new ServiceException("发票申请不存在,提交失败"); + } + if(vo.getIogisticsStatus() != 2){ + throw new ServiceException("发票已签收或未到签收节点,提交失败"); + } + MerInvoice updater = new MerInvoice(); + updater.setId(invId); + updater.setIogisticsReceivingBy(oper); + updater.setIogisticsReceivingTime(new Date()); + updater.setIogisticsStatus(3); + if("系统".equals(oper)){ + updater.setRemark("自动签收发票"); + } + if(baseMapper.update(updater,new LambdaQueryWrapper().eq(MerInvoice::getId,invId) + .eq(MerInvoice::getIogisticsStatus,2)) == 0){ + throw new ServiceException("重复操作,签收失败"); + } + //解除冻结服务商的服务费 + List flows = invoiceBillMapper.selectFrozenSydFlows(invId); + if(flows.size() > 0) { + List newFlows = new ArrayList<>(); + //解除冻结的金额(分),key:账户id_结算通道 + Map moneyMap = new HashMap<>(); + for (SysSydFlowsVo flow : + flows) { + SysSydFlows ssf = new SysSydFlows(0, flow.getSydId(), 7, flow.getChannel(), flow.getBusNo(), flow.getBankNo(), Math.abs(flow.getMoney()), new Date(), oper, "资金解冻", flow.getBillNo(), flow.getBillId(), null, "UF" + IdUtil.getSnowflakeNextIdStr(), 6, 2, flow.getPayerType(), flow.getPayerId(), flow.getPayerName(), flow.getPayerAcc(), flow.getPayerAccId(), null, null, null, null, null, "解冻成功", 0); + String key = ssf.getPayerAccId() + "_" + ssf.getChannel(); + if(!moneyMap.containsKey(key)){ + SysSydAccount acc = new SysSydAccount(); + acc.setAccId(ssf.getPayerAccId()); + acc.setFrozen(0l); + acc.setBankType(ssf.getChannel()); + moneyMap.put(key,acc); + } + moneyMap.get(key).setFrozen(moneyMap.get(key).getFrozen()+ssf.getMoney()); + newFlows.add(ssf); + } + moneyMap.forEach((key,value)->{ + if (sydAccountService.updateFrozenByAccId(value.getAccId().intValue(), -value.getFrozen()) == 0) { + throw new ServiceException("服务商资金解冻时," + value.getBankType() + "账户冻结金额不足"); + } + }); + sydFlowsMapper.insertAll(newFlows); + } + //解除冻结运营商的服务费 + List opflows = invoiceBillMapper.selectFrozenOpFlows(invId); + if(opflows.size() > 0) { + List newFlows = new ArrayList<>(); + //解除冻结的金额(分),key:账户id_结算通道 + Map moneyMap = new HashMap<>(); + for (BusOperatorFlowsVo flow : + opflows) { + BusOperatorFlows ssf = new BusOperatorFlows(0,flow.getOpId(),9,flow.getChannel(),null,null,Math.abs(flow.getMoney()),new Date(),flow.getAddBy(),"资金解冻",flow.getBillNo(),flow.getBillId(),flow.getBillDetailId(),"UF"+IdUtil.getSnowflakeNextIdStr(),6,2,flow.getPayeeType(),flow.getPayerId(),flow.getPayerName(),flow.getPayerAcc(),flow.getPayerAccId(),null,null,null,null,null,"解冻成功",0); + String key = ssf.getPayerAccId() + "_" + ssf.getChannel(); + if(!moneyMap.containsKey(key)){ + SysSydAccount acc = new SysSydAccount(); + acc.setAccId(ssf.getPayerAccId()); + acc.setFrozen(0l); + acc.setBankType(ssf.getChannel()); + moneyMap.put(key,acc); + } + moneyMap.get(key).setFrozen(moneyMap.get(key).getFrozen()+ssf.getMoney()); + newFlows.add(ssf); + } + moneyMap.forEach((key,value)->{ + if (operatorAccountService.updateFrozenByAccId(value.getAccId().intValue(), -value.getFrozen()) == 0) { + throw new ServiceException("运营商资金解冻时," + value.getBankType() + "账户冻结金额不足"); + } + }); + operatorFlowsMapper.insertBatch(newFlows); + } + //解除冻结代理商的服务费 + List chflows = invoiceBillMapper.selectFrozenChannelFlows(invId); + if(chflows.size() > 0) { + List newFlows = new ArrayList<>(); + //解除冻结的金额(分),key:账户id + Map moneyMap = new HashMap<>(); + for (BusChannelFlowsVo flow : + chflows) { + BusChannelFlows ssf = new BusChannelFlows(0,flow.getChannelId(),11,null,Math.abs(flow.getMoney()),new Date(),flow.getAddBy(),"资金解冻",flow.getBillNo(),flow.getBillId(),flow.getBillDetailId(),6, flow.getPayerType(), flow.getPayerId(),flow.getPayerName(),flow.getPayerAcc(),flow.getPayerAccId(),null, null,null,null,null,"解冻成功"); + String key = ssf.getPayerId()+""; + if(!moneyMap.containsKey(key)){ + SysSydAccount acc = new SysSydAccount(); + acc.setAccId(ssf.getPayerId()); + acc.setFrozen(0l); + moneyMap.put(key,acc); + } + moneyMap.get(key).setFrozen(moneyMap.get(key).getFrozen()+ssf.getMoney()); + newFlows.add(ssf); + } + moneyMap.forEach((key,value)->{ + if (channelAccountService.updateFrozen(value.getAccId(), -value.getFrozen()) == 0) { + throw new ServiceException("代理商资金解冻时," + value.getBankType() + "账户冻结金额不足"); + } + }); + channelFlowsMapper.insertBatch(newFlows); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java new file mode 100644 index 0000000..5430c4c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/invoice/service/impl/MerInvoiceTypeServiceImpl.java @@ -0,0 +1,188 @@ +package org.dromara.payment.invoice.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.springframework.stereotype.Service; +import org.dromara.payment.invoice.domain.bo.MerInvoiceTypeBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceTypeVo; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.mapper.MerInvoiceTypeMapper; +import org.dromara.payment.invoice.service.IMerInvoiceTypeService; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 发票类目Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerInvoiceTypeServiceImpl implements IMerInvoiceTypeService { + + private final MerInvoiceTypeMapper baseMapper; + + /** + * 查询发票类目 + */ + @Override + public MerInvoiceTypeVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询发票类目列表 + */ + @Override + public TableDataInfo queryPageList(MerInvoiceTypeBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询发票类目列表 + */ + @Override + public List queryList(MerInvoiceTypeBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerInvoiceTypeBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getParentType()), "parent_type", bo.getParentType()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), "type", bo.getType()); + lqw.eq(bo.getSort() != null, "sort", bo.getSort()); + return lqw; + } + + /** + * 新增发票类目 + */ + @Override + public Boolean insertByBo(MerInvoiceTypeBo bo) { + MerInvoiceType add = MapstructUtils.convert(bo, MerInvoiceType.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改发票类目 + */ + @Override + public Boolean updateByBo(MerInvoiceTypeBo bo) { + MerInvoiceType update = MapstructUtils.convert(bo, MerInvoiceType.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerInvoiceType entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除发票类目 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + + public List kp(Integer proId){ + List list = this.baseMapper.selectInvoiceListByProId(proId); + + List resultMapList = new ArrayList<>(); + + list.stream().forEach(item->{ + boolean tag = true; + for(Map mp :resultMapList){ + if(item.getParentType().equals(mp.get("value"))){ + ((List)mp.get("children")).add(new HashMap<>(){ + { + put("value",item.getId()); + put("label",item.getType()); + } + }); + tag = false; + break; + } + } + + if(tag){ + resultMapList.add(new HashMap(){{ + put("value",item.getParentType()); + put("label",item.getParentType()); + put("children",new ArrayList<>()); + }}); + + } + }); + return resultMapList; + } + + + @Override + public List getListInvoice(MerInvoiceTypeBo bo) { + + List list = this.baseMapper.selectVoList(); + + List resultMapList = new ArrayList<>(); + + list.stream().forEach(item->{ + boolean tag = true; + for(Map mp :resultMapList){ + if(item.getParentType().equals(mp.get("value"))){ + ((List)mp.get("children")).add(new HashMap<>(){ + { + put("value",item.getId()); + put("label",item.getType()); + } + }); + tag = false; + break; + } + } + + if(tag){ + resultMapList.add(new HashMap(){{ + put("value",item.getParentType()); + put("label",item.getParentType()); + put("children",new ArrayList<>()); + }}); + + } + }); + return resultMapList; + } + + + + + @Override + public List selectList(int busType, String busId,int proId) { + return baseMapper.selectInvoiceByProId(busType,busId,proId,busId.split(",").length); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java new file mode 100644 index 0000000..1b11273 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountController.java @@ -0,0 +1,173 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantRechargeVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户资金账户 + * 前端访问路由地址为:/payment/merchantAccount + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantAccount") +public class BusMerchantAccountController extends BaseController { + + private final IBusMerchantAccountService busMerchantAccountService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询商户资金账户列表 + */ + //@SaCheckPermission("payment:merchantAccount:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantAccountBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setMerId(loginUser.getBusId()); + TableDataInfo rtn = busMerchantAccountService.queryPageList(bo, pageQuery); + if(rtn.getRows() != null && rtn.getRows().size() > 0){ + for (BusMerchantAccountVo vo:rtn.getRows() + ) { + Result rtnName = accountService.getAccountName(vo.getSydId(),vo.getBankType(),vo.getBankVirtualCard()); + vo.setAccName(rtnName.getRtnData()); + } + } + return rtn; + } + + @GetMapping("/listFp") + @Log(title = "结算账户分配查询", businessType = BusinessType.EXPORT) + public R getQueryList(BusMerchantAccountBo bo, PageQuery pageQuery){ + return R.ok(this.busMerchantAccountService.getMerAccountList(bo,pageQuery)); + } + + @PostMapping("/createXn") + @SaCheckPermission("payment:merchantAccount:createXn") + @Log(title = "创建运营商虚拟户", businessType = BusinessType.INSERT) + public R createXnAccount(Long sydId,Long merId,String merName,String bankType){ + return R.ok(this.busMerchantAccountService.createXnAccount(sydId,merId,merName,bankType)); + } + + + + + /** + * 查询商户资金账户的充值信息 + * @param id 资金账户id + * @return + */ + @GetMapping("/getRechargeAccount") + public R getRechargeAccount(int id) { + return R.ok(busMerchantAccountService.getRechargeAccount(id)); + } + + /** + * 查询商户资金账户列表 + * @param sydId 服务商id + * @return + */ + @GetMapping("/getAccounts") + public R> getAccounts(Long sydId) { + LoginUser loginUser = LoginHelper.getLoginUser(); + return R.ok(busMerchantAccountService.getAccByMerIdAndSydId(loginUser.getBusId(),sydId)); + } + + /** + * 查询商户默认资金账户 + * @return + */ + @GetMapping("/getDefaultAccount") + public R getDefaultAccount() { + LoginUser loginUser = LoginHelper.getLoginUser(); + return R.ok(busMerchantAccountService.getDefaultAccByMerIdAndSydId(loginUser.getBusId(),loginUser.getSydId())); + } + + /** + * 导出商户资金账户列表 + */ + @SaCheckPermission("payment:merchantAccount:export") + @Log(title = "商户资金账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantAccountBo bo, HttpServletResponse response) { + List list = busMerchantAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "商户资金账户", BusMerchantAccountVo.class, response); + } + + /** + * 获取商户资金账户详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:merchantAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantAccountService.queryById(id)); + } + + /** + * 新增商户资金账户 + */ + @SaCheckPermission("payment:merchantAccount:add") + @Log(title = "商户资金账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantAccountBo bo) { + return toAjax(busMerchantAccountService.insertByBo(bo)); + } + + /** + * 修改商户资金账户 + */ + @SaCheckPermission("payment:merchantAccount:edit") + @Log(title = "商户资金账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantAccountBo bo) { + return toAjax(busMerchantAccountService.updateByBo(bo)); + } + + /** + * 删除商户资金账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantAccount:remove") + @Log(title = "商户资金账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java new file mode 100644 index 0000000..03ac541 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAccountSynController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountSynBo; +import org.dromara.payment.merchant.service.IBusMerchantAccountSynService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户账户同步 + * 前端访问路由地址为:/payment/merchantAccountSyn + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantAccountSyn") +public class BusMerchantAccountSynController extends BaseController { + + private final IBusMerchantAccountSynService busMerchantAccountSynService; + + /** + * 查询商户账户同步列表 + */ + @SaCheckPermission("payment:merchantAccountSyn:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantAccountSynBo bo, PageQuery pageQuery) { + return busMerchantAccountSynService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户账户同步列表 + */ + @SaCheckPermission("payment:merchantAccountSyn:export") + @Log(title = "商户账户同步", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantAccountSynBo bo, HttpServletResponse response) { + List list = busMerchantAccountSynService.queryList(bo); + ExcelUtil.exportExcel(list, "商户账户同步", BusMerchantAccountSynVo.class, response); + } + + /** + * 获取商户账户同步详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantAccountSyn:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantAccountSynService.queryById(id)); + } + + /** + * 新增商户账户同步 + */ + @SaCheckPermission("payment:merchantAccountSyn:add") + @Log(title = "商户账户同步", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantAccountSynBo bo) { + return toAjax(busMerchantAccountSynService.insertByBo(bo)); + } + + /** + * 修改商户账户同步 + */ + @SaCheckPermission("payment:merchantAccountSyn:edit") + @Log(title = "商户账户同步", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantAccountSynBo bo) { + return toAjax(busMerchantAccountSynService.updateByBo(bo)); + } + + /** + * 删除商户账户同步 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantAccountSyn:remove") + @Log(title = "商户账户同步", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantAccountSynService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java new file mode 100644 index 0000000..dad306d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantAgreementController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAgreementBo; +import org.dromara.payment.merchant.service.IBusMerchantAgreementService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户协议 + * 前端访问路由地址为:/payment/merchantAgreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantAgreement") +public class BusMerchantAgreementController extends BaseController { + + private final IBusMerchantAgreementService busMerchantAgreementService; + + /** + * 查询商户协议列表 + */ + @SaCheckPermission("payment:merchantAgreement:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantAgreementBo bo, PageQuery pageQuery) { + return busMerchantAgreementService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户协议列表 + */ + @SaCheckPermission("payment:merchantAgreement:export") + @Log(title = "商户协议", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantAgreementBo bo, HttpServletResponse response) { + List list = busMerchantAgreementService.queryList(bo); + ExcelUtil.exportExcel(list, "商户协议", BusMerchantAgreementVo.class, response); + } + + /** + * 获取商户协议详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantAgreement:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantAgreementService.queryById(id)); + } + + /** + * 新增商户协议 + */ + @SaCheckPermission("payment:merchantAgreement:add") + @Log(title = "商户协议", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantAgreementBo bo) { + return toAjax(busMerchantAgreementService.insertByBo(bo)); + } + + /** + * 修改商户协议 + */ + @SaCheckPermission("payment:merchantAgreement:edit") + @Log(title = "商户协议", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantAgreementBo bo) { + return toAjax(busMerchantAgreementService.updateByBo(bo)); + } + + /** + * 删除商户协议 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantAgreement:remove") + @Log(title = "商户协议", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantAgreementService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java new file mode 100644 index 0000000..adacb95 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantCashoutController.java @@ -0,0 +1,126 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantCashoutBo; +import org.dromara.payment.merchant.service.IBusMerchantCashoutService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户提现记录 + * 前端访问路由地址为:/payment/merchantCashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantCashout") +public class BusMerchantCashoutController extends BaseController { + + private final IBusMerchantCashoutService busMerchantCashoutService; + + private final IBusMerchantAccountService merchantAccountService; + + /** + * 查询商户提现记录列表 + */ + @SaCheckPermission("payment:merchantCashout:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantCashoutBo bo, PageQuery pageQuery) { + return busMerchantCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户提现记录列表 + */ + @SaCheckPermission("payment:merchantCashout:export") + @Log(title = "商户提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantCashoutBo bo, HttpServletResponse response) { + List list = busMerchantCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "商户提现记录", BusMerchantCashoutVo.class, response); + } + + /** + * 获取商户提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantCashoutService.queryById(id)); + } + + /** + * 获取商户提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(merchantAccountService.getCashoutAccount(id)); + } + + /** + * 新增商户提现记录 + */ + //@SaCheckPermission("payment:merchantCashout:add") + @Log(title = "商户提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(busMerchantCashoutService.insertByBo(bo)); + } + + /** + * 修改商户提现记录 + */ + @SaCheckPermission("payment:merchantCashout:edit") + @Log(title = "商户提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantCashoutBo bo) { + return toAjax(busMerchantCashoutService.updateByBo(bo)); + } + + /** + * 删除商户提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantCashout:remove") + @Log(title = "商户提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java new file mode 100644 index 0000000..bb18769 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantConfigController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantConfigBo; +import org.dromara.payment.merchant.service.IBusMerchantConfigService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户配置 + * 前端访问路由地址为:/payment/merchantConfig + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantConfig") +public class BusMerchantConfigController extends BaseController { + + private final IBusMerchantConfigService busMerchantConfigService; + + /** + * 查询商户配置列表 + */ + @SaCheckPermission("payment:merchantConfig:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantConfigBo bo, PageQuery pageQuery) { + return busMerchantConfigService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户配置列表 + */ + @SaCheckPermission("payment:merchantConfig:export") + @Log(title = "商户配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantConfigBo bo, HttpServletResponse response) { + List list = busMerchantConfigService.queryList(bo); + ExcelUtil.exportExcel(list, "商户配置", BusMerchantConfigVo.class, response); + } + + /** + * 获取商户配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantConfig:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantConfigService.queryById(id)); + } + + /** + * 新增商户配置 + */ + @SaCheckPermission("payment:merchantConfig:add") + @Log(title = "商户配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantConfigBo bo) { + return toAjax(busMerchantConfigService.insertByBo(bo)); + } + + /** + * 修改商户配置 + */ + @SaCheckPermission("payment:merchantConfig:edit") + @Log(title = "商户配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantConfigBo bo) { + return toAjax(busMerchantConfigService.updateByBo(bo)); + } + + /** + * 删除商户配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantConfig:remove") + @Log(title = "商户配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantConfigService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java new file mode 100644 index 0000000..63d664b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantController.java @@ -0,0 +1,246 @@ +package org.dromara.payment.merchant.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.json.JSONUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.service.IBusMerchantService; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +/** + * 商户 + * 前端访问路由地址为:/payment/merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchant") +public class BusMerchantController extends BaseController { + + private final IBusMerchantService busMerchantService; + + private final ISysSydService sysSydService; + + /** + * 查询商户列表 + */ + @SaCheckPermission("payment:merchant:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantBo bo, PageQuery pageQuery) { + return busMerchantService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户列表 + */ + @SaCheckPermission("payment:merchant:export") + @Log(title = "商户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantBo bo, HttpServletResponse response) { + List list = busMerchantService.queryList(bo); + ExcelUtil.exportExcel(list, "商户", BusMerchantVo.class, response); + } + + /** + * 获取商户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantService.queryById(id)); + } + + /** + * 新增商户 + */ + @SaCheckPermission("payment:merchant:add") + @Log(title = "商户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantBo bo) { + return toAjax(busMerchantService.insertByBo(bo)); + } + + public static void main(String[] args) { + BusMerchantBo bo = new BusMerchantBo(); + bo.setName("企业名称"); + bo.setNameNc("企业简称"); + bo.setPassage("结算通道"); + bo.setNsrSbh("统一社会信用代码"); + bo.setFr("法人"); + bo.setFrSfz("法人身份证"); + bo.setFrSjh("法人手机号"); + bo.setWtr("经办人"); + bo.setWtrSfz("经办人身份证"); + bo.setWtrSjh("经办人手机号"); + bo.setWtrEmail("经办人身份证"); + bo.setUnitArea("区域编码"); + bo.setUnitAreaName("区域名称"); + bo.setAddress("实际经营地址"); + bo.setNo("123"); + bo.setYyzzBeginDate(new Date()); + bo.setYyzzEndDate(new Date()); + bo.setIndustryCode("行业编码"); + bo.setIndustry("行业名称"); + bo.setFrCardidBeginDate(new Date()); + bo.setFrCardidEndDate(new Date()); + bo.setJbrCardidBeginDate(new Date()); + bo.setJbrCardidEndDate(new Date()); + bo.setYwyId(1L); + bo.setKhm("账户名称"); + bo.setKhhCode("开户行code"); + bo.setKhh("开户行"); + bo.setKhd("开户支行"); + bo.setKhhNo("开户行行号/银联号"); + bo.setBankCard("银行账号"); + bo.setJbckzhbm("基本存款账户"); + bo.setInvoceHeader("发票抬头"); + bo.setInvoceCreditCode("发票纳税人识别号"); + bo.setInvoceBankName("发票开户银行"); + bo.setInvoceAddress("发票单位注册地址"); + bo.setInvoceBankCard("发票开户银行账号"); + bo.setInvoceDwdh("发票单位电话"); + bo.setYyzz("营业执照"); + bo.setFhxkzPic("开户许可证"); + bo.setFrSfzzm("法人身份证正面"); + bo.setFrSfzfm("法人身份证反面"); + bo.setJbrSfzzm("经办人身份证正面"); + bo.setJbrSfzfm("经办人身份证反面"); + bo.setMtqjzPic("门头照片"); + bo.setBgzp1Pic("办公照片1"); + bo.setBgzp2Pic("办公照片21"); + bo.setYwcjsm("业务场景说明"); + bo.setYwcjzsxcnh("业务场景真实性承诺函"); + bo.setFddsqxy("法大大授权协议"); + bo.setTshyxkz("特殊行业许可证"); + + System.out.println(JSONUtil.toJsonStr(bo)); + } + + /** + * 配置业务员 + */ + @SaCheckPermission("payment:merchant:setYwy") + @Log(title = "配置业务员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/setYwy") + public R setYwy(Long id,Long ywyId) { + return R.ok(busMerchantService.setYwy(id,ywyId)); + } + + + /** + * 解绑业务员 + */ + @SaCheckPermission("payment:merchant:unbindYwy") + @Log(title = "解绑业务员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/ubYwy") + public R unbindYwy(Long id,Long ywyId) { + return R.ok(busMerchantService.unbindYwy(id,ywyId)); + } + + + + + + + + /** + * 修改商户 + */ + @SaCheckPermission("payment:merchant:edit") + @Log(title = "商户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantBo bo) { + return toAjax(busMerchantService.updateByBo(bo)); + } + + /** + * 删除商户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchant:remove") + @Log(title = "商户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 根据用户名查询商户可用的服务商 + * @param userName 用户名 + * @return + */ + @PostMapping("/getSydByUserName") + public R> getSydByUserName(@NotEmpty(message = "用户名不能为空") String userName) { + return R.ok(sysSydService.getSydByUserName(userName)); + } + + /** + * 获取商户相关的服务商 + * @return + */ + @GetMapping("/getSyds") + public R> getSyds() { + LoginUser loginUser = LoginHelper.getLoginUser(); + return R.ok(sysSydService.selectSydByMerId(loginUser.getBusId())); + } + + + /** + * 审核代理商 + */ + @SaCheckPermission("payment:merchant:check") + @Log(title = "审核商户", businessType = BusinessType.UPDATE) + @PostMapping("/chk") + public R chk(Long merId,Long checkType,String reason,String domain) { + return R.ok(this.busMerchantService.checkMerChant(merId,checkType,reason,domain)); + } + + + + /** + * 切换服务商 + * @param sydId 服务商id + * @return + */ + @GetMapping("/switchSyd") + public R switchSyd(long sydId) { + LoginUser loginUser = LoginHelper.getLoginUser(); + loginUser.setSydId(sydId); + LoginHelper.updateLoginUser(loginUser); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java new file mode 100644 index 0000000..117bb2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantFlowsController.java @@ -0,0 +1,109 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantFlowsBo; +import org.dromara.payment.merchant.service.IBusMerchantFlowsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户流水 + * 前端访问路由地址为:/payment/merchantFlows + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantFlows") +public class BusMerchantFlowsController extends BaseController { + + private final IBusMerchantFlowsService busMerchantFlowsService; + + /** + * 查询商户流水列表 + */ + //@SaCheckPermission("payment:merchantFlows:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantFlowsBo bo, PageQuery pageQuery) { + return busMerchantFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户流水列表 + */ + //@SaCheckPermission("payment:merchantFlows:export") + @Log(title = "商户流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantFlowsBo bo, HttpServletResponse response) { + bo.setMerId(LoginHelper.getBusId()); + List list = busMerchantFlowsService.queryList(bo); + ExcelUtil.exportExcel(list, "商户流水", BusMerchantFlowsVo.class, response); + } + + /** + * 获取商户流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantFlowsService.queryById(id)); + } + + /** + * 新增商户流水 + */ + @SaCheckPermission("payment:merchantFlows:add") + @Log(title = "商户流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusMerchantFlowsBo bo) { + return toAjax(busMerchantFlowsService.insertByBo(bo)); + } + + /** + * 修改商户流水 + */ + @SaCheckPermission("payment:merchantFlows:edit") + @Log(title = "商户流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantFlowsBo bo) { + return toAjax(busMerchantFlowsService.updateByBo(bo)); + } + + /** + * 删除商户流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantFlows:remove") + @Log(title = "商户流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java new file mode 100644 index 0000000..b99faaf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductController.java @@ -0,0 +1,115 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.service.IBusMerchantProductService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户产品表 + * 前端访问路由地址为:/payment/merchantProduct + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantProduct") +public class BusMerchantProductController extends BaseController { + + private final IBusMerchantProductService busMerchantProductService; + + /** + * 查询商户产品表列表 + */ +// @SaCheckPermission("payment:merchantProduct:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantProductBo bo, PageQuery pageQuery) { + return busMerchantProductService.queryPageList(bo, pageQuery); + } + + @GetMapping("/queryList") + public R> queryList(BusMerchantProductBo bo) { + return R.ok(busMerchantProductService.queryList(bo)); + } + + /** + * 导出商户产品表列表 + */ + @SaCheckPermission("payment:merchantProduct:export") + @Log(title = "商户产品表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantProductBo bo, HttpServletResponse response) { + List list = busMerchantProductService.queryList(bo); + ExcelUtil.exportExcel(list, "商户产品表", BusMerchantProductVo.class, response); + } + + /** + * 获取商户产品表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchantProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantProductService.queryById(id)); + } + + /** + * 新增商户产品表 + */ +// @SaCheckPermission("payment:merchantProduct:add") + @Log(title = "商户产品表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody JSONObject boList) { + return toAjax(busMerchantProductService.insertByBo(boList)); + } + + /** + * 修改商户产品表 + */ + @SaCheckPermission("payment:merchantProduct:edit") + @Log(title = "商户产品表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantProductBo bo) { + return toAjax(busMerchantProductService.updateByBo(bo)); + } + + /** + * 删除商户产品表 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchantProduct:remove") + @Log(title = "商户产品表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantProductService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java new file mode 100644 index 0000000..8088eda --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/BusMerchantProductSydController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductSydBo; +import org.dromara.payment.merchant.service.IBusMerchantProductSydService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 企业产品服务商 + * 前端访问路由地址为:/merchant/merchantProductSyd + * + * @author LionLi + * @date 2024-04-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantProductSyd") +public class BusMerchantProductSydController extends BaseController { + + private final IBusMerchantProductSydService busMerchantProductSydService; + + /** + * 查询企业产品服务商列表 + */ + @SaCheckPermission("merchant:merchantProductSyd:list") + @GetMapping("/list") + public TableDataInfo list(BusMerchantProductSydBo bo, PageQuery pageQuery) { + return busMerchantProductSydService.queryPageList(bo, pageQuery); + } + + /** + * 导出企业产品服务商列表 + */ + @SaCheckPermission("merchant:merchantProductSyd:export") + @Log(title = "企业产品服务商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusMerchantProductSydBo bo, HttpServletResponse response) { + List list = busMerchantProductSydService.queryList(bo); + ExcelUtil.exportExcel(list, "企业产品服务商", BusMerchantProductSydVo.class, response); + } + + /** + * 获取企业产品服务商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("merchant:merchantProductSyd:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busMerchantProductSydService.queryById(id)); + } + + /** + * 新增企业产品服务商 + */ +// @SaCheckPermission("merchant:merchantProductSyd:add") + @Log(title = "企业产品服务商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) BusMerchantProductSydBo bo) { + return toAjax(busMerchantProductSydService.insertByBo(bo)); + } + + /** + * 修改企业产品服务商 + */ + @SaCheckPermission("merchant:merchantProductSyd:edit") + @Log(title = "企业产品服务商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusMerchantProductSydBo bo) { + return toAjax(busMerchantProductSydService.updateByBo(bo)); + } + + /** + * 删除企业产品服务商 + * + * @param ids 主键串 + */ + @SaCheckPermission("merchant:merchantProductSyd:remove") + @Log(title = "企业产品服务商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busMerchantProductSydService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java new file mode 100644 index 0000000..cbc259e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/PubMerchantController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.payment.merchant.domain.bo.PubMerchantBo; +import org.dromara.payment.merchant.service.IPubMerchantService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户申请表 + * 前端访问路由地址为:/payment/merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchant1") +public class PubMerchantController extends BaseController { + + private final IPubMerchantService pubMerchantService; + + /** + * 查询商户申请表列表 + */ + @SaCheckPermission("payment:merchant:list") + @GetMapping("/list") + public TableDataInfo list(PubMerchantBo bo, PageQuery pageQuery) { + return pubMerchantService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户申请表列表 + */ + @SaCheckPermission("payment:merchant:export") + @Log(title = "商户申请表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(PubMerchantBo bo, HttpServletResponse response) { + List list = pubMerchantService.queryList(bo); + ExcelUtil.exportExcel(list, "商户申请表", PubMerchantVo.class, response); + } + + /** + * 获取商户申请表详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:merchant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(pubMerchantService.queryById(id)); + } + + /** + * 新增商户申请表 + */ + @SaCheckPermission("payment:merchant:add") + @Log(title = "商户申请表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody PubMerchantBo bo) { + return toAjax(pubMerchantService.insertByBo(bo)); + } + + /** + * 修改商户申请表 + */ + @SaCheckPermission("payment:merchant:edit") + @Log(title = "商户申请表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/edit") + public R edit(@Validated(EditGroup.class) @RequestBody PubMerchantBo bo) { + return toAjax(pubMerchantService.updateByBo(bo)); + } + + /** + * 删除商户申请表 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:merchant:remove") + @Log(title = "商户申请表", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(pubMerchantService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java new file mode 100644 index 0000000..24b1d4c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillBo; +import org.dromara.payment.merchant.service.IVMerchantBillService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户账单汇总表 + * 前端访问路由地址为:/payment/merchantBill + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantBill") +public class VMerchantBillController extends BaseController { + + private final IVMerchantBillService vMerchantBillService; + + /** + * 查询商户账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBill:list") + @GetMapping("/list") + public TableDataInfo list(VMerchantBillBo bo, PageQuery pageQuery) { + return vMerchantBillService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBill:export") + @Log(title = "商户账单汇总表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(VMerchantBillBo bo, HttpServletResponse response) { + List list = vMerchantBillService.queryList(bo); + ExcelUtil.exportExcel(list, "商户账单汇总表", VMerchantBillVo.class, response); + } + + /** + * 获取商户账单汇总表详细信息 + * + * @param merId 主键 + */ + @SaCheckPermission("payment:merchantBill:query") + @GetMapping("/{merId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long merId) { + return R.ok(vMerchantBillService.queryById(merId)); + } + + /** + * 新增商户账单汇总表 + */ + @SaCheckPermission("payment:merchantBill:add") + @Log(title = "商户账单汇总表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody VMerchantBillBo bo) { + return toAjax(vMerchantBillService.insertByBo(bo)); + } + + /** + * 修改商户账单汇总表 + */ + @SaCheckPermission("payment:merchantBill:edit") + @Log(title = "商户账单汇总表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody VMerchantBillBo bo) { + return toAjax(vMerchantBillService.updateByBo(bo)); + } + + /** + * 删除商户账单汇总表 + * + * @param merIds 主键串 + */ + @SaCheckPermission("payment:merchantBill:remove") + @Log(title = "商户账单汇总表", businessType = BusinessType.DELETE) + @DeleteMapping("/{merIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] merIds) { + return toAjax(vMerchantBillService.deleteWithValidByIds(List.of(merIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java new file mode 100644 index 0000000..8968e7b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/controller/VMerchantBillDayController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.merchant.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillDayBo; +import org.dromara.payment.merchant.service.IVMerchantBillDayService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 商户日账单汇总表 + * 前端访问路由地址为:/payment/merchantBillDay + * + * @author LionLi + * @date 2024-04-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/merchantBillDay") +public class VMerchantBillDayController extends BaseController { + + private final IVMerchantBillDayService vMerchantBillDayService; + + /** + * 查询商户日账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBillDay:list") + @GetMapping("/list") + public TableDataInfo list(VMerchantBillDayBo bo, PageQuery pageQuery) { + return vMerchantBillDayService.queryPageList(bo, pageQuery); + } + + /** + * 导出商户日账单汇总表列表 + */ + @SaCheckPermission("payment:merchantBillDay:export") + @Log(title = "商户日账单汇总表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(VMerchantBillDayBo bo, HttpServletResponse response) { + List list = vMerchantBillDayService.queryList(bo); + ExcelUtil.exportExcel(list, "商户日账单汇总表", VMerchantBillDayVo.class, response); + } + + /** + * 获取商户日账单汇总表详细信息 + * + * @param merId 主键 + */ + @SaCheckPermission("payment:merchantBillDay:query") + @GetMapping("/{merId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long merId) { + return R.ok(vMerchantBillDayService.queryById(merId)); + } + + /** + * 新增商户日账单汇总表 + */ + @SaCheckPermission("payment:merchantBillDay:add") + @Log(title = "商户日账单汇总表", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody VMerchantBillDayBo bo) { + return toAjax(vMerchantBillDayService.insertByBo(bo)); + } + + /** + * 修改商户日账单汇总表 + */ + @SaCheckPermission("payment:merchantBillDay:edit") + @Log(title = "商户日账单汇总表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody VMerchantBillDayBo bo) { + return toAjax(vMerchantBillDayService.updateByBo(bo)); + } + + /** + * 删除商户日账单汇总表 + * + * @param merIds 主键串 + */ + @SaCheckPermission("payment:merchantBillDay:remove") + @Log(title = "商户日账单汇总表", businessType = BusinessType.DELETE) + @DeleteMapping("/{merIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] merIds) { + return toAjax(vMerchantBillDayService.deleteWithValidByIds(List.of(merIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java new file mode 100644 index 0000000..6bbf369 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchant.java @@ -0,0 +1,384 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant") +public class BusMerchant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户编号 + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + @TableField(exist = false) + private Date addTime; + + /** + * 添加人 + */ + @TableField(exist = false) + private String addBy; + + /** + * 编辑人 + */ + @TableField(exist = false) + private String editer; + + /** + * 编辑时间 + */ + @TableField(exist = false) + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + private String jbrSfzfm; + + /** + * 门头全景照 + */ + private String mtqjzPic; + + /** + * 办公照片1 + */ + private String bgzp1Pic; + + /** + * 办公照片2 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 企业规模 + */ + private String scale; + + /** + * 企业logo地址 + */ + private String logo; + + /** + * 企业介绍 + */ + private String introduce; + + /** + * 业务员id + */ + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ + private Integer isValiAcc; + + + private String agentNo; + + private String operatorNo; + + private String industryCode; + + private String khhCode; + + @TableField(exist = false) + private Long createDept; + + private Long createUnitId; + + private String createUnitNo; + + private String serviceTypeId; + + private String serviceTypeName; + + private String businessId; + + private String businessStatus; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java new file mode 100644 index 0000000..b76e23a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccount.java @@ -0,0 +1,147 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户资金账户对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_account") +public class BusMerchantAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusMerchantAccount() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param sydId + * @param accId + * @param bankType + * @param bankCard + * @param balance + * @param frozen + * @param isDefault + * @param addTime + */ + + public BusMerchantAccount(Long id,Long merId,Long sydId, Long accId,String bankType, String bankCard, Long balance, Long frozen, + Long isDefault, Date addTime,String name,String khh,String lhh) { + super(); + this.id = id; + this.merId = merId; + this.sydId = sydId; + this.accId = accId; + this.bankType = bankType; + this.bankVirtualCard = bankCard; + this.balance = balance; + this.frozen = frozen; + this.isDefault = isDefault; + this.addTime = addTime; + this.name = name; + this.khh = khh; + this.lhh = lhh; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 结算中心id + */ + private Long sydId; + + private String name; + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 可开票已结算金额 + */ + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + + //开户行 + private String khh; + + //联行号 + private String lhh; + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java new file mode 100644 index 0000000..f8b290d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAccountSyn.java @@ -0,0 +1,51 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户账户同步对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_account_syn") +public class BusMerchantAccountSyn extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @TableId(value = "id") + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java new file mode 100644 index 0000000..7a4ee8a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantAgreement.java @@ -0,0 +1,96 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户协议对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_agreement") +public class BusMerchantAgreement extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java new file mode 100644 index 0000000..7ff7eb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantCashout.java @@ -0,0 +1,123 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户提现记录对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_cashout") +public class BusMerchantCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java new file mode 100644 index 0000000..5e7fe9d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantConfig.java @@ -0,0 +1,63 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户配置对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_config") +public class BusMerchantConfig extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusMerchantConfig(){} + + public BusMerchantConfig(Integer autoApprove, Integer valiWorker, Long minMoney, Long maxMoney, Long maxMoneyYear) { + this.autoApprove = autoApprove; + this.valiWorker = valiWorker; + this.minMoney = minMoney; + this.maxMoney = maxMoney; + this.maxMoneyYear = maxMoneyYear; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + private Integer valiWorker; + + private Long minMoney; + + private Long maxMoney; + + private Long maxMoneyYear; + + //不实名,不认证,不签约,0否, 1 是 + private Integer isNothing; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java new file mode 100644 index 0000000..769ab10 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantFlows.java @@ -0,0 +1,231 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户流水对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_flows") +public class BusMerchantFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusMerchantFlows(){} + + public BusMerchantFlows(Integer direction,Long merId, Long sydId, Integer busType, String channel, String busNo, String bankNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, String tranNo, Integer tranType, Integer tranStatus, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark, Integer payReceiptType, String illustrate) { + this.direction = direction; + this.merId = merId; + this.sydId = sydId; + this.busType = busType; + this.channel = channel; + this.busNo = busNo; + this.bankNo = bankNo; + this.money = money; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranNo = tranNo; + this.tranType = tranType; + this.tranStatus = tranStatus; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + this.payReceiptType = payReceiptType; + this.illustrate = illustrate; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 商户id + */ + private Long merId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 流水方向(1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + /** + * 说明 + */ + private String illustrate; + + /** + * 之前的金额 + */ + private transient Long preMoney; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java new file mode 100644 index 0000000..59c9f98 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProduct.java @@ -0,0 +1,154 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 商户产品表对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_product") +public class BusMerchantProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + private BigDecimal serviceCharge; + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:04 + * 说明:修改后的服务费率(T+1 生效) + **/ + private BigDecimal mdyServiceCharge; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Integer chargeMode; + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java new file mode 100644 index 0000000..f93131f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/BusMerchantProductSyd.java @@ -0,0 +1,47 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 企业产品服务商对象 bus_merchant_product_syd + * + * @author LionLi + * @date 2024-04-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_merchant_product_syd") +public class BusMerchantProductSyd extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 企业ID + */ + private Long merId; + + /** + * 服务商ID + */ + private Long sydId; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java new file mode 100644 index 0000000..578ba32 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/PubMerchant.java @@ -0,0 +1,338 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户申请表对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("pub_merchant") +public class PubMerchant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + private String no; + + /** + * 所属行业(字典值) + */ + private String industry; + + /** + * 商户名称 + */ + private String name; + + /** + * 商户简称 + */ + private String nameNc; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人证件类型 + */ + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 法人证件号码 + */ + private String frSfz; + + /** + * 法人证件类型 + */ + private String frZjlx; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 营业执照有效期开始日期 + */ + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 基本存款账户编号 + */ + private String jbckzhbm; + + /** + * 结算通道 + */ + private String passage; + + /** + * 法人证件有效期开始日期 + */ + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + /** + * 开户许可证 + */ + private String fhxkzPic; + + /** + * 法人证件正面 + */ + private String frSfzzm; + + /** + * 法人证件反面 + */ + private String frSfzfm; + + /** + * 经办人证件正面 + */ + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + private String jbrSfzfm; + + /** + * 门牌照片 + */ + private String mtqjzPic; + + /** + * 前台照片 + */ + private String bgzp1Pic; + + /** + * 办公照片 + */ + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + private String ywcjsm; + + /** + * 法大大授权协议 + */ + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + private String tshyxkz; + + /** + * 流程确认函 + */ + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 主营业务 + */ + private String zyyw; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java new file mode 100644 index 0000000..2488f7b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBill.java @@ -0,0 +1,101 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 商户账单汇总表对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("v_merchant_bill") +public class VMerchantBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + @TableId(value = "mer_id") + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + private Long yearTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java new file mode 100644 index 0000000..0209973 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/VMerchantBillDay.java @@ -0,0 +1,87 @@ +package org.dromara.payment.merchant.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 商户日账单汇总表对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("v_merchant_bill_day") +public class VMerchantBillDay extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + private Long merId; + + /** + * 统计日期 + */ + private Date vDate; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + private Long dayTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java new file mode 100644 index 0000000..a9ebd23 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountBo.java @@ -0,0 +1,125 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户资金账户业务对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantAccount.class, reverseConvertGenerate = false) +public class BusMerchantAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行虚拟账号 + */ + @NotBlank(message = "银行虚拟账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankVirtualCard; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额 + */ + @NotNull(message = "冻结金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 已结算金额 + */ + @NotNull(message = "已结算金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long settlement; + + /** + * 可开票已结算金额 + */ + @NotNull(message = "可开票已结算金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + @NotNull(message = "已开票金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + + private String name; + + //开户行 + private String khh; + + //联行号 + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java new file mode 100644 index 0000000..3be91d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAccountSynBo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户账户同步业务对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantAccountSyn.class, reverseConvertGenerate = false) +public class BusMerchantAccountSynBo extends BaseEntity { + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 同步顺序(倒序) + */ + @NotNull(message = "同步顺序(倒序)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @NotNull(message = "是否正在同步(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synLock; + + /** + * 最近同步批次 + */ + @NotBlank(message = "最近同步批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String synBatch; + + /** + * 最近同步的位置 + */ + @NotNull(message = "最近同步的位置不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java new file mode 100644 index 0000000..ac1a8c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantAgreementBo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户协议业务对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantAgreement.class, reverseConvertGenerate = false) +public class BusMerchantAgreementBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @NotNull(message = "协议类型(1:线上 2:线下)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStyle; + + /** + * 协议标题 + */ + @NotBlank(message = "协议标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @NotNull(message = "签约状态(1:签约成功 2:签约失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 协议链接 + */ + @NotBlank(message = "协议链接不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileUrl; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java new file mode 100644 index 0000000..9d45eef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantBo.java @@ -0,0 +1,469 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 商户业务对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchant.class, reverseConvertGenerate = false) +public class BusMerchantBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户编号 + */ + private String no; + + /** + * 所属行业(字典值) + */ + @NotBlank(message = "所属行业不能为空", groups = { AddGroup.class, EditGroup.class }) + private String industry; + + /** + * 商户名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 商户简称 + */ + @NotBlank(message = "企业简称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameNc; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人身份证 + */ + @NotBlank(message = "经办人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 营业执照有效期开始日期 + */ +// @NotNull(message = "营业执照有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ +// @NotNull(message = "营业执照有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @NotBlank(message = "营业执照图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String yyzz; + + /** + * 支付密码 + */ +// @NotBlank(message = "支付密码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payPassword; + + /** + * 密码输入错误次数 + */ +// @NotNull(message = "密码输入错误次数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ +// @NotNull(message = "密码冻结结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ +// @NotNull(message = "状态(0:禁用 1:启用 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 添加时间 + */ +// @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ +// @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ +// @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ +// @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 开户名 + */ + @NotBlank(message = "账户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户支行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户银行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 基本存款账户编号 + */ + @NotBlank(message = "基本存款账户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbckzhbm; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + @NotNull(message = "法人身份证有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + @NotNull(message = "法人身份证有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + @NotNull(message = "经办人身份证有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + @NotNull(message = "经办人身份证有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + private Long ywyId; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @NotBlank(message = "发票纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @NotBlank(message = "发票开户银行名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @NotBlank(message = "发票开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @NotBlank(message = "发票单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceAddress; + + /** + * 发票单位电话 + */ + @NotBlank(message = "发票单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceDwdh; + + /** + * 开户许可证 + */ + @NotBlank(message = "开户许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + @NotBlank(message = "法人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @NotBlank(message = "法人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + @NotBlank(message = "经办人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + @NotBlank(message = "经办人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzfm; + + /** + * 门头全景照 + */ + @NotBlank(message = "门头全景照不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mtqjzPic; + + /** + * 办公照片1 + */ + @NotBlank(message = "办公照片1不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp1Pic; + + /** + * 办公照片2 + */ + @NotBlank(message = "办公照片2不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @NotBlank(message = "业务场景真实性承诺函不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @NotBlank(message = "业务场景说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjsm; + + /** + * 法大大授权协议 + */ +// @NotBlank(message = "法大大授权协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fddsqxy; + + /** + * 特殊行业许可证 + */ +// @NotBlank(message = "特殊行业许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ +// @NotNull(message = "审核状态(0:待审核、1:驳回、2:审核通过)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 审核时间 + */ +// @NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date verifyTime; + + /** + * 审核人 + */ +// @NotBlank(message = "审核人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyBy; + + /** + * 驳回原因 + */ +// @NotBlank(message = "驳回原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyReason; + + /** + * 企业规模 + */ +// @NotBlank(message = "企业规模不能为空", groups = { AddGroup.class, EditGroup.class }) + private String scale; + + /** + * 企业logo地址 + */ +// @NotBlank(message = "企业logo地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logo; + + /** + * 企业介绍 + */ +// @NotBlank(message = "企业介绍不能为空", groups = { AddGroup.class, EditGroup.class }) + private String introduce; + + /** + * 业务员id + */ +// @NotNull(message = "业务员id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ +// @NotNull(message = "是否验证资金账户(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isValiAcc; + + + private String agentNo; + + private String operatorNo; + + private String industryCode; + + private String khhCode; + + private Integer isProduct; + + + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + private String scaleName; + + + private Long createUnitId; + + private String createUnitNo; + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java new file mode 100644 index 0000000..3413740 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantCashoutBo.java @@ -0,0 +1,128 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户提现记录业务对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantCashout.class, reverseConvertGenerate = false) +public class BusMerchantCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户账户id + */ + @NotNull(message = "商户账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ + @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java new file mode 100644 index 0000000..ae52bef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantConfigBo.java @@ -0,0 +1,48 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户配置业务对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantConfig.class, reverseConvertGenerate = false) +public class BusMerchantConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + @NotNull(message = "是否自动审批(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + @NotNull(message = "是否验证用工签约(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer valiWorker; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java new file mode 100644 index 0000000..4560212 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantFlowsBo.java @@ -0,0 +1,218 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户流水业务对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantFlows.class, reverseConvertGenerate = false) +public class BusMerchantFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @NotBlank(message = "支付通道(招行,交行,手动)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @NotBlank(message = "三方流水号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易订单号 + */ + @NotBlank(message = "交易订单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @NotNull(message = "交易状态(2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 回执单地址 + */ + @NotBlank(message = "回执单地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @NotNull(message = "回执单类型(1:B2B 2:B2C)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payReceiptType; + + /** + * 说明 + */ + @NotBlank(message = "说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String illustrate; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java new file mode 100644 index 0000000..095b505 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductBo.java @@ -0,0 +1,203 @@ +package org.dromara.payment.merchant.domain.bo; + +import cn.hutool.json.JSONUtil; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 商户产品表业务对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantProduct.class, reverseConvertGenerate = false) +public class BusMerchantProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商服务费率(%) + */ + @NotNull(message = "代理商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式", groups = { AddGroup.class, EditGroup.class }) + private Integer chargeMode; + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ +// @NotBlank(message = "开票类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer proStatus; + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:04 + * 说明:修改后的服务费率(T+1 生效) + **/ + private BigDecimal mdyServiceCharge; + + + public static void main(String[] args) { + + Map map = new HashMap(); + map.put("merId",3); + map.put("merNo","A10109-B10534-M32085"); + map.put("busType",1); + + List list = new ArrayList(); + BusMerchantProductBo bo = new BusMerchantProductBo(); + + bo.setBusType(1L); + bo.setProNo("P1722211926"); + bo.setCostServiceCharge( new BigDecimal("1.00")); + bo.setServiceCharge( new BigDecimal("1.50")); + bo.setBusType(1L); + bo.setChargeMode(1); + bo.setInvoiceType(1); + bo.setMaxMonth(500000L); + bo.setProStatus(1); + bo.setSettlementStyle(1); + bo.setInvoiceItems("dsafdsa"); + + list.add(bo); + + map.put("boList",list); + + System.out.println(JSONUtil.toJsonStr(map)); + + + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java new file mode 100644 index 0000000..6acb11f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/BusMerchantProductSydBo.java @@ -0,0 +1,42 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 企业产品服务商业务对象 bus_merchant_product_syd + * + * @author LionLi + * @date 2024-04-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusMerchantProductSyd.class, reverseConvertGenerate = false) +public class BusMerchantProductSydBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 企业ID + */ + @NotNull(message = "企业ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 服务商ID + */ + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java new file mode 100644 index 0000000..8d18a3b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/PubMerchantBo.java @@ -0,0 +1,398 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户申请表业务对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = PubMerchant.class, reverseConvertGenerate = false) +public class PubMerchantBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + @NotBlank(message = "注册单号(示例:reg2024031916213007124782 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 所属行业(字典值) + */ + @NotBlank(message = "所属行业(字典值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String industry; + + /** + * 商户名称 + */ + @NotBlank(message = "商户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 商户简称 + */ + @NotBlank(message = "商户简称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameNc; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人证件类型 + */ + @NotBlank(message = "经办人证件类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + @NotBlank(message = "经办人证件号码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 法人证件号码 + */ + @NotBlank(message = "法人证件号码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人证件类型 + */ + @NotBlank(message = "法人证件类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frZjlx; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 营业执照有效期开始日期 + */ + @NotNull(message = "营业执照有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + @NotNull(message = "营业执照有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @NotBlank(message = "营业执照图片(多个逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + @NotNull(message = "状态(0:禁用 1:启用 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ + @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 开户名 + */ + @NotBlank(message = "开户名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户支行 + */ + @NotBlank(message = "开户支行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 基本存款账户编号 + */ + @NotBlank(message = "基本存款账户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbckzhbm; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + /** + * 法人证件有效期开始日期 + */ + @NotNull(message = "法人证件有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + @NotNull(message = "法人证件有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + @NotNull(message = "经办人证件有效期开始日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + @NotNull(message = "经办人证件有效期结束日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + @NotNull(message = "业务员id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long ywyId; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @NotBlank(message = "发票纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @NotBlank(message = "发票开户银行名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @NotBlank(message = "发票开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @NotBlank(message = "发票单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceAddress; + + /** + * 发票单位电话 + */ + @NotBlank(message = "发票单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceDwdh; + + /** + * 开户许可证 + */ + @NotBlank(message = "开户许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fhxkzPic; + + /** + * 法人证件正面 + */ + @NotBlank(message = "法人证件正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人证件反面 + */ + @NotBlank(message = "法人证件反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 经办人证件正面 + */ + @NotBlank(message = "经办人证件正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + @NotBlank(message = "经办人证件反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String jbrSfzfm; + + /** + * 门牌照片 + */ + @NotBlank(message = "门牌照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mtqjzPic; + + /** + * 前台照片 + */ + @NotBlank(message = "前台照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp1Pic; + + /** + * 办公照片 + */ + @NotBlank(message = "办公照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @NotBlank(message = "业务场景真实性承诺函不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @NotBlank(message = "业务场景说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ywcjsm; + + /** + * 法大大授权协议 + */ + @NotBlank(message = "法大大授权协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + @NotBlank(message = "特殊行业许可证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tshyxkz; + + /** + * 流程确认函 + */ + @NotBlank(message = "流程确认函不能为空", groups = { AddGroup.class, EditGroup.class }) + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @NotNull(message = "审核状态(0:待审核、1:驳回、2:审核通过)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long verifyStatus; + + /** + * 审核时间 + */ + @NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date verifyTime; + + /** + * 审核人 + */ + @NotBlank(message = "审核人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyBy; + + /** + * 驳回原因 + */ + @NotBlank(message = "驳回原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String verifyReason; + + /** + * 主营业务 + */ + @NotBlank(message = "主营业务不能为空", groups = { AddGroup.class, EditGroup.class }) + private String zyyw; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java new file mode 100644 index 0000000..84065b1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillBo.java @@ -0,0 +1,114 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 商户账单汇总表业务对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = VMerchantBill.class, reverseConvertGenerate = false) +public class VMerchantBillBo extends BaseEntity { + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @NotNull(message = "今日交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @NotNull(message = "今日交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + @NotNull(message = "本月交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + @NotNull(message = "本月交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + @NotNull(message = "本年交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + @NotNull(message = "本年交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long yearTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java new file mode 100644 index 0000000..49d5286 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/bo/VMerchantBillDayBo.java @@ -0,0 +1,98 @@ +package org.dromara.payment.merchant.domain.bo; + +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 商户日账单汇总表业务对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = VMerchantBillDay.class, reverseConvertGenerate = false) +public class VMerchantBillDayBo extends BaseEntity { + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { EditGroup.class }) + private Long merId; + + /** + * 统计日期 + */ + @NotNull(message = "统计日期不能为空", groups = { EditGroup.class }) + private Date vDate; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @NotNull(message = "今日交易笔数(笔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @NotNull(message = "今日交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dayTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java new file mode 100644 index 0000000..97221db --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountSynVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户账户同步Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantAccountSynVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java new file mode 100644 index 0000000..53cd8ca --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAccountVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户资金账户Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantAccountVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java new file mode 100644 index 0000000..57dfd83 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantAgreementVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户协议Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantAgreementVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java new file mode 100644 index 0000000..3b04020 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantCashoutVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户提现记录Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantCashoutVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java new file mode 100644 index 0000000..60e9f05 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantConfigVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantConfigVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户配置Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantConfigVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java new file mode 100644 index 0000000..5fc5808 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantFlowsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户流水Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantFlowsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java new file mode 100644 index 0000000..fb3df99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantProductVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantProductVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户产品表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantProductVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java new file mode 100644 index 0000000..fdb3056 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/BusMerchantVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusMerchantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java new file mode 100644 index 0000000..e359d0b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/PubMerchantVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemotePubMerchantVo; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户申请表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface PubMerchantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java new file mode 100644 index 0000000..7fae25c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillDayVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteVMerchantBillDayVo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户日账单汇总表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface VMerchantBillDayVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java new file mode 100644 index 0000000..2de4bdc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/convert/VMerchantBillVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.merchant.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.merchant.domain.RemoteVMerchantBillVo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 商户账单汇总表Convert接口 + * + * @author LionLi + * @date 2024-04-03 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface VMerchantBillVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java new file mode 100644 index 0000000..198c589 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountSynVo.java @@ -0,0 +1,64 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账户同步视图对象 bus_merchant_account_syn + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantAccountSyn.class) +public class BusMerchantAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long id; + + /** + * 同步顺序(倒序) + */ + @ExcelProperty(value = "同步顺序", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "倒=序") + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @ExcelProperty(value = "是否正在同步", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long synLock; + + /** + * 最近同步批次 + */ + @ExcelProperty(value = "最近同步批次") + private String synBatch; + + /** + * 最近同步的位置 + */ + @ExcelProperty(value = "最近同步的位置") + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java new file mode 100644 index 0000000..4f3a98f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAccountVo.java @@ -0,0 +1,166 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户资金账户视图对象 bus_merchant_account + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantAccount.class) +public class BusMerchantAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + private String merName; + + private String sydName; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 归属账户方 + */ + private String accName; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行虚拟账号 + */ + @ExcelProperty(value = "银行虚拟账号") + private String bankVirtualCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private Long balance; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 已结算金额 + */ + @ExcelProperty(value = "已结算金额") + private Long settlement; + + /** + * 可开票已结算金额 + */ + @ExcelProperty(value = "可开票已结算金额") + private Long invoiceSettlement; + + /** + * 已开票金额 + */ + @ExcelProperty(value = "已开票金额") + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + + + private String sydNo; + + private String merNo; + + private String name; + + //开户行 + private String khh; + + //联行号 + private String lhh; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java new file mode 100644 index 0000000..6e565bc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantAgreementVo.java @@ -0,0 +1,118 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户协议视图对象 bus_merchant_agreement + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantAgreement.class) +public class BusMerchantAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @ExcelProperty(value = "协议类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:线上,2=:线下") + private Integer signStyle; + + /** + * 协议标题 + */ + @ExcelProperty(value = "协议标题") + private String title; + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:签约成功,2=:签约失败") + private Integer status; + + /** + * 协议链接 + */ + @ExcelProperty(value = "协议链接") + private String fileUrl; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java new file mode 100644 index 0000000..354b41c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantCashoutVo.java @@ -0,0 +1,151 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户提现记录视图对象 bus_merchant_cashout + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantCashout.class) +public class BusMerchantCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户账户id + */ + @ExcelProperty(value = "商户账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java new file mode 100644 index 0000000..4f5349f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantConfigVo.java @@ -0,0 +1,58 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户配置视图对象 bus_merchant_config + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantConfig.class) +public class BusMerchantConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 是否自动审批(0:否 1:是) + */ + @ExcelProperty(value = "是否自动审批", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer autoApprove; + + /** + * 是否验证用工签约(0:否 1:是) + */ + @ExcelProperty(value = "是否验证用工签约", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer valiWorker; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java new file mode 100644 index 0000000..73793bb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantFlowsVo.java @@ -0,0 +1,285 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户流水视图对象 bus_merchant_flows + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantFlows.class) +public class BusMerchantFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + + /** + * 商户id + */ + @ExcelIgnore + private Long merId; + + /** + * 结算中心id + */ + @ExcelIgnore + private Long sydId; + + + /** + * 交易时间 + */ + @ExcelProperty(value = "交易时间") + private Date addTime; + + + /** + * 账单批次号 + */ + @ExcelProperty(value = "代发批次号") + private String billNo; + + + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号") + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @ExcelProperty(value = "三方流水号") + private String bankNo; + + + + /** + * 交易订单号 + */ + @ExcelProperty(value = "交易订单号") + private String tranNo; + + + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + + + + + + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ +// @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelIgnore + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @ExcelProperty(value = "支付通道") +// @ExcelDictFormat(readConverterExp = "招=行,交行,手动") + private String channel; + + + @ExcelProperty(value = "交易金额(元)") + private String moneyStr; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=转账,2=代发,3=提现,4=退回,5=冻结,6=解冻,7=充值") + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @ExcelProperty(value = "交易状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "2=成功,3=失败") + private Integer tranStatus; + + /** + * 交易金额(分) + */ + + @ExcelIgnore + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + + /** + * 余额(分) + */ +// @ExcelProperty(value = "余额(分)") + @ExcelIgnore + private Long balance; + + /** + * 交易人 + */ +// @ExcelProperty(value = "交易人") + @ExcelIgnore + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + + + /** + * 账单id + */ +// @ExcelProperty(value = "账单id") + @ExcelIgnore + private Long billId; + + /** + * 账单明细id + */ +// @ExcelProperty(value = "账单明细id") + @ExcelIgnore + private Long billDetailId; + + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ +// @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + @ExcelIgnore + private Integer payerType; + + /** + * 付款方id + */ +// @ExcelProperty(value = "付款方id") + @ExcelIgnore + private Long payerId; + + + /** + * 付款方账号id + */ +// @ExcelPropertyty(value = "付款方账号id") + @ExcelIgnore + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ +// @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + @ExcelIgnore + private Integer payeeType; + + /** + * 收款方id + */ +// @ExcelProperty(value = "收款方id") + @ExcelIgnore + private Long payeeId; + + + + /** + * 收款方账号id + */ +// @ExcelProperty(value = "收款方账号id") + @ExcelIgnore + private Long payeeAccId; + + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 回执单地址 + */ +// @ExcelProperty(value = "回执单地址") + @ExcelIgnore + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ +// @ExcelProperty(value = "回执单类型", converter = ExcelDictConvert.class) +// @ExcelDictFormat(readConverterExp = "1=:B2B,2=:B2C") + @ExcelIgnore + private Integer payReceiptType; + + /** + * 说明 + */ +// @ExcelProperty(value = "说明") + @ExcelIgnore + private String illustrate; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java new file mode 100644 index 0000000..6551cb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductSydVo.java @@ -0,0 +1,50 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 企业产品服务商视图对象 bus_merchant_product_syd + * + * @author LionLi + * @date 2024-04-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantProductSyd.class) +public class BusMerchantProductSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 企业ID + */ + @ExcelProperty(value = "企业ID") + private Long merId; + + /** + * 服务商ID + */ + @ExcelProperty(value = "服务商ID") + private Long sydId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java new file mode 100644 index 0000000..fb74387 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantProductVo.java @@ -0,0 +1,195 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.math.BigDecimal; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户产品表视图对象 bus_merchant_product + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchantProduct.class) +public class BusMerchantProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + + @ExcelProperty(value = "服务商名称") + private String serviceName; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + private String createTime; + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商服务费率(%) + */ + @ExcelProperty(value = "代理商服务费率(%)") + private BigDecimal costServiceCharge; + + /** + * 商户服务费率(%) + */ + @ExcelProperty(value = "商户服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Integer chargeMode; + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架,2=:下架") + private Integer proStatus; + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:04 + * 说明:修改后的服务费率(T+1 生效) + **/ + private BigDecimal mdyServiceCharge; + + + private String unId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java new file mode 100644 index 0000000..5c3f1a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantRechargeVo.java @@ -0,0 +1,39 @@ +package org.dromara.payment.merchant.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.settlement.api.domain.RechargeVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 商户充值账户视图对象 + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +public class BusMerchantRechargeVo extends RechargeVo { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户银行账号 + */ + private String merBankCard; + + /** + * 商户开户行 + */ + private String merKhh; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java new file mode 100644 index 0000000..29673a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusMerchantVo.java @@ -0,0 +1,477 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.merchant.domain.BusMerchant; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户视图对象 bus_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusMerchant.class) +public class BusMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String no; + + /** + * 所属行业(字典值) + */ + @ExcelProperty(value = "所属行业", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String industry; + + /** + * 商户名称 + */ + @ExcelProperty(value = "商户名称") + private String name; + + /** + * 商户简称 + */ + @ExcelProperty(value = "商户简称") + private String nameNc; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人身份证 + */ + @ExcelProperty(value = "经办人身份证") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frSfz; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 营业执照有效期开始日期 + */ + @ExcelProperty(value = "营业执照有效期开始日期") + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + @ExcelProperty(value = "营业执照有效期结束日期") + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @ExcelProperty(value = "营业执照图片", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "多=个逗号分隔") + private String yyzz; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 密码输入错误次数 + */ + @ExcelProperty(value = "密码输入错误次数") + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + @ExcelProperty(value = "密码冻结结束时间") + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 基本存款账户编号 + */ + @ExcelProperty(value = "基本存款账户编号") + private String jbckzhbm; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 法人身份证有效期开始日期 + */ + @ExcelProperty(value = "法人身份证有效期开始日期") + private Date frCardidBeginDate; + + /** + * 法人身份证有效期结束日期 + */ + @ExcelProperty(value = "法人身份证有效期结束日期") + private Date frCardidEndDate; + + /** + * 经办人身份证有效期开始日期 + */ + @ExcelProperty(value = "经办人身份证有效期开始日期") + private Date jbrCardidBeginDate; + + /** + * 经办人身份证有效期结束日期 + */ + @ExcelProperty(value = "经办人身份证有效期结束日期") + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + @ExcelProperty(value = "业务员id") + private Long ywyId; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @ExcelProperty(value = "发票纳税人识别号") + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @ExcelProperty(value = "发票开户银行名称") + private String invoceBankName; + + + private Date createTime; + + /** + * 发票开户银行账号 + */ + @ExcelProperty(value = "发票开户银行账号") + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @ExcelProperty(value = "发票单位注册地址") + private String invoceAddress; + + /** + * 发票单位电话 + */ + @ExcelProperty(value = "发票单位电话") + private String invoceDwdh; + + /** + * 开户许可证 + */ + @ExcelProperty(value = "开户许可证") + private String fhxkzPic; + + /** + * 法人身份证正面 + */ + @ExcelProperty(value = "法人身份证正面") + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @ExcelProperty(value = "法人身份证反面") + private String frSfzfm; + + /** + * 经办人身份证正面 + */ + @ExcelProperty(value = "经办人身份证正面") + private String jbrSfzzm; + + /** + * 经办人身份证反面 + */ + @ExcelProperty(value = "经办人身份证反面") + private String jbrSfzfm; + + /** + * 门头全景照 + */ + @ExcelProperty(value = "门头全景照") + private String mtqjzPic; + + /** + * 办公照片1 + */ + @ExcelProperty(value = "办公照片1") + private String bgzp1Pic; + + /** + * 办公照片2 + */ + @ExcelProperty(value = "办公照片2") + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @ExcelProperty(value = "业务场景真实性承诺函") + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @ExcelProperty(value = "业务场景说明") + private String ywcjsm; + + /** + * 法大大授权协议 + */ + @ExcelProperty(value = "法大大授权协议") + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + @ExcelProperty(value = "特殊行业许可证") + private String tshyxkz; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 企业规模 + */ + @ExcelProperty(value = "企业规模") + private String scale; + + /** + * 企业logo地址 + */ + @ExcelProperty(value = "企业logo地址") + private String logo; + + /** + * 企业介绍 + */ + @ExcelProperty(value = "企业介绍") + private String introduce; + + /** + * 业务员id + */ + @ExcelProperty(value = "业务员id") + private Long salesmanId; + + /** + * 是否验证资金账户(0:否 1:是) + */ + @ExcelProperty(value = "是否验证资金账户(0:否 1:是)") + private Integer isValiAcc; + + + + private String agentNo; + + private String operatorNo; + + private String agentName; + + private String operatorName; + + private String industryCode; + + private String khhCode; + + private String verifyStatusName; + + private String scaleName; + + private String scaleNo; + + private Long createUnitId; + + private String createUnitNo; + + private Integer isCanSetScale = 0; + + public String getVerifyStatusName() { + if(this.verifyStatus != null){ + if(this.verifyStatus.equals(0l)){ + return "待审核"; + }else if(this.verifyStatus.equals(1l)){ + return "驳回"; + }else if(this.verifyStatus.equals(2l)){ + return "审核通过"; + } + }else{ + return "--"; + } + return "--"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java new file mode 100644 index 0000000..46af21f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/BusOperAndAgentAndMer.java @@ -0,0 +1,38 @@ +package org.dromara.payment.merchant.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BusOperAndAgentAndMer + * @description + * @create 2024-04-28 17:59 + */ + + +@Data +public class BusOperAndAgentAndMer implements Serializable { + + + private Long sydId; + + private String sydNo; + + private Long opId; + + private String opNo; + + private Long channelId; + + private String channelNo; + + private String channelCode; + + private Long merId; + + private String merNo; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java new file mode 100644 index 0000000..51c3590 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/PubMerchantVo.java @@ -0,0 +1,410 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.PubMerchant; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户申请表视图对象 pub_merchant + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = PubMerchant.class) +public class PubMerchantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 注册单号(示例:reg2024031916213007124782 ) + */ + @ExcelProperty(value = "注册单号(示例:reg2024031916213007124782 )") + private String no; + + /** + * 所属行业(字典值) + */ + @ExcelProperty(value = "所属行业", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String industry; + + /** + * 商户名称 + */ + @ExcelProperty(value = "商户名称") + private String name; + + /** + * 商户简称 + */ + @ExcelProperty(value = "商户简称") + private String nameNc; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人证件类型 + */ + @ExcelProperty(value = "经办人证件类型") + private String wtrZjlx; + + /** + * 经办人证件号码 + */ + @ExcelProperty(value = "经办人证件号码") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 法人证件号码 + */ + @ExcelProperty(value = "法人证件号码") + private String frSfz; + + /** + * 法人证件类型 + */ + @ExcelProperty(value = "法人证件类型") + private String frZjlx; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 营业执照有效期开始日期 + */ + @ExcelProperty(value = "营业执照有效期开始日期") + private Date yyzzBeginDate; + + /** + * 营业执照有效期结束日期 + */ + @ExcelProperty(value = "营业执照有效期结束日期") + private Date yyzzEndDate; + + /** + * 营业执照图片(多个逗号分隔) + */ + @ExcelProperty(value = "营业执照图片", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "多=个逗号分隔") + private String yyzz; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 基本存款账户编号 + */ + @ExcelProperty(value = "基本存款账户编号") + private String jbckzhbm; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 法人证件有效期开始日期 + */ + @ExcelProperty(value = "法人证件有效期开始日期") + private Date frCardidBeginDate; + + /** + * 法人证件有效期结束日期 + */ + @ExcelProperty(value = "法人证件有效期结束日期") + private Date frCardidEndDate; + + /** + * 经办人证件有效期开始日期 + */ + @ExcelProperty(value = "经办人证件有效期开始日期") + private Date jbrCardidBeginDate; + + /** + * 经办人证件有效期结束日期 + */ + @ExcelProperty(value = "经办人证件有效期结束日期") + private Date jbrCardidEndDate; + + /** + * 业务员id + */ + @ExcelProperty(value = "业务员id") + private Long ywyId; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @ExcelProperty(value = "发票纳税人识别号") + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @ExcelProperty(value = "发票开户银行名称") + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @ExcelProperty(value = "发票开户银行账号") + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @ExcelProperty(value = "发票单位注册地址") + private String invoceAddress; + + /** + * 发票单位电话 + */ + @ExcelProperty(value = "发票单位电话") + private String invoceDwdh; + + /** + * 开户许可证 + */ + @ExcelProperty(value = "开户许可证") + private String fhxkzPic; + + /** + * 法人证件正面 + */ + @ExcelProperty(value = "法人证件正面") + private String frSfzzm; + + /** + * 法人证件反面 + */ + @ExcelProperty(value = "法人证件反面") + private String frSfzfm; + + /** + * 经办人证件正面 + */ + @ExcelProperty(value = "经办人证件正面") + private String jbrSfzzm; + + /** + * 经办人证件反面 + */ + @ExcelProperty(value = "经办人证件反面") + private String jbrSfzfm; + + /** + * 门牌照片 + */ + @ExcelProperty(value = "门牌照片") + private String mtqjzPic; + + /** + * 前台照片 + */ + @ExcelProperty(value = "前台照片") + private String bgzp1Pic; + + /** + * 办公照片 + */ + @ExcelProperty(value = "办公照片") + private String bgzp2Pic; + + /** + * 业务场景真实性承诺函 + */ + @ExcelProperty(value = "业务场景真实性承诺函") + private String ywcjzsxcnh; + + /** + * 业务场景说明 + */ + @ExcelProperty(value = "业务场景说明") + private String ywcjsm; + + /** + * 法大大授权协议 + */ + @ExcelProperty(value = "法大大授权协议") + private String fddsqxy; + + /** + * 特殊行业许可证 + */ + @ExcelProperty(value = "特殊行业许可证") + private String tshyxkz; + + /** + * 流程确认函 + */ + @ExcelProperty(value = "流程确认函") + private String lcqrh; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 主营业务 + */ + @ExcelProperty(value = "主营业务") + private String zyyw; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java new file mode 100644 index 0000000..66cf255 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillDayVo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.merchant.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户日账单汇总表视图对象 v_merchant_bill_day + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = VMerchantBillDay.class) +public class VMerchantBillDayVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 统计日期 + */ + @ExcelProperty(value = "统计日期") + private Date vDate; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @ExcelProperty(value = "今日交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @ExcelProperty(value = "今日交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long dayTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java new file mode 100644 index 0000000..2703a77 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/domain/vo/VMerchantBillVo.java @@ -0,0 +1,128 @@ +package org.dromara.payment.merchant.domain.vo; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 商户账单汇总表视图对象 v_merchant_bill + * + * @author LionLi + * @date 2024-04-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = VMerchantBill.class) +public class VMerchantBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 今日交易笔数(笔) + */ + @ExcelProperty(value = "今日交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long dayTranNum; + + /** + * 今日交易金额(分) + */ + @ExcelProperty(value = "今日交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long dayTranMoney; + + /** + * 本月交易笔数(笔) + */ + @ExcelProperty(value = "本月交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long monthTranNum; + + /** + * 本月交易金额(分) + */ + @ExcelProperty(value = "本月交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long monthTranMoney; + + /** + * 本年交易笔数(笔) + */ + @ExcelProperty(value = "本年交易笔数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "笔=") + private Long yearTranNum; + + /** + * 本年交易金额(分) + */ + @ExcelProperty(value = "本年交易金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long yearTranMoney; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java new file mode 100644 index 0000000..d45ca24 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/dubbo/RemoteMerchantServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.payment.merchant.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.payment.api.merchant.RemoteMerchantService; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.api.syd.RemoteSydService; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 商户服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteMerchantServiceImpl implements RemoteMerchantService { + private final IBusMerchantAccountService merchantAccountService; + + @Override + public RemoteBusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId, Long sydId) { + BusMerchantAccountVo accountVo = merchantAccountService.getDefaultAccByMerIdAndSydId(merId,sydId); + return accountVo != null ? MapstructUtils.convert(accountVo, RemoteBusMerchantAccountVo.class) : null; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java new file mode 100644 index 0000000..724ca91 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountMapper.java @@ -0,0 +1,189 @@ +package org.dromara.payment.merchant.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; + +import java.util.List; + +/** + * 商户资金账户Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantAccountMapper extends BaseMapperPlus { + /** + * 获取商户的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + public List getAccByMerIdAndSydId(@Param("merId") Long merId,@Param("sydId") Long sydId); + + /** + * 查询结算中心下商户默认的资金账户 + * @author 张涛 + * @date 2021年8月25日 + * @param sydId 结算中心id + * @param merId 商户id + * @return + */ + public List selectByMerIdAndSydId(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("bankType") String bankType); + + /** + * 查询资金账户 + * @author 张涛 + * @date 2021年9月9日 + * @param accId 银行账户id + * @return + */ + public BusMerchantAccountVo selectByAccId(@Param("accId") int accId); + + /** + * 新增虚拟银行账号 + * @return 结果 + */ + public int insertAccount(BusMerchantAccount account); + + /** + * 修改商户开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param sydId 结算中心id + * @param merId 商户id + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmount(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("invoice") long invoice,@Param("bankType") String bankType); + + /** + * 修改商户可开票已结算金额 + * @author 张涛 + * @date 2021年9月2日 + * @param sydId 结算中心id + * @param merId 商户id + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceSettlement(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("invoice") long invoice,@Param("bankType") String bankType); + + /** + * 根据银行账户id更新 + * @author 张涛 + * @date 2021年9月6日 + * @param record + * @return + */ + public Integer updateByAccId(BusMerchantAccount record); + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @return + */ + public Integer lockByMerId(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("bankType") String bankType); + + /** + * 银行账户解锁 + * @author 张涛 + * @date 2021年9月6日 + * @return + */ + public Integer unlockByMerId(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("bankType") String bankType); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlement(@Param("sydId") Long sydId,@Param("merId") long merId,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 修改商户开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmountByAccId(@Param("accId") int accId,@Param("invoice") long invoice); + + /** + * 修改商户可开票已结算金额 + * @author 张涛 + * @date 2021年9月2日 + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceSettlementByAccId(@Param("accId") int accId,@Param("invoice") long invoice); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlementByAccId(@Param("accId") int accId,@Param("amount") long amount); + + + + + public List selectMerAccountLists(@Param("bo") BusMerchantAccountBo bo, @Param("page") Page page); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java new file mode 100644 index 0000000..9613bb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAccountSynMapper.java @@ -0,0 +1,71 @@ +package org.dromara.payment.merchant.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 商户账户同步Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantAccountSynMapper extends BaseMapperPlus { + /** + * 补全不存在同步记录的账户 + * @author 张涛 + * @date 2021年9月6日 + * @return + */ + public Integer autoNotExist(); + + /** + * 分配账户的同步批次 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @return + */ + public Integer allotSyns(@Param("synBatch") String synBatch,@Param("minId") int minId,@Param("start") int start,@Param("size") int size); + + /** + * 取消账户同步 + * @author 张涛 + * @date 2021年9月6日 + * @param id 账户id + * @return + */ + public Integer cancelSyn(@Param("id") int id); + + /** + * 取消指定批次所有账户同步 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次 + * @return + */ + public Integer cancelSynByBatch(@Param("synBatch") String synBatch); + + /** + * 查询待同步的账户id + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @param size 数量 + * @return + */ + public List selectSyn(@Param("synBatch") String synBatch, @Param("size") Integer size); + + /** + * 账户加同步锁 + * @author 张涛 + * @date 2021年9月6日 + * @param synBatch 批次号 + * @param id 账户id + * @return + */ + public Integer lock(@Param("synBatch") String synBatch, @Param("id") int id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java new file mode 100644 index 0000000..b3d0b35 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantAgreementMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户协议Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantAgreementMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java new file mode 100644 index 0000000..aff83a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantCashoutMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户提现记录Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantCashoutMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java new file mode 100644 index 0000000..b410a79 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantConfigMapper.java @@ -0,0 +1,17 @@ +package org.dromara.payment.merchant.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户配置Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantConfigMapper extends BaseMapperPlus { + + BusMerchantConfig selectByMerId(@Param("merId") Long merId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java new file mode 100644 index 0000000..3dbaec9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantFlowsMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.merchant.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 商户流水Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantFlowsMapper extends BaseMapperPlus { + /** + * 批量插入 + * @author 张涛 + * @date 2016年6月23日 + * @param list + * @return + */ + public int insertAll(@Param("list") List list); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java new file mode 100644 index 0000000..c0fb01a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantMapper.java @@ -0,0 +1,54 @@ +package org.dromara.payment.merchant.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; + +import java.util.List; + +/** + * 商户Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantMapper extends BaseMapperPlus { + + + int setAndUnbindYwy(BusMerchant vo); + + + @DataPermission({ + @DataColumn(key="colomField",value="t.no") + }) + Page selectMerchantList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 查询企业列表 + * @param wrapper + * @return + */ + @DataPermission({ + @DataColumn(key="colomField",value="t.no") + }) + List selectMerchantListByRole(@Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 根据企业信息查询对应的渠道商,运营商 + * @param busMerchantBo + * @return + */ + BusOperAndAgentAndMer selOpAndAgentInfosByMerInfo(BusMerchantBo busMerchantBo); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java new file mode 100644 index 0000000..a752c54 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductMapper.java @@ -0,0 +1,68 @@ +package org.dromara.payment.merchant.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.List; + +/** + * 商户产品表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface BusMerchantProductMapper extends BaseMapperPlus { + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 14:40 + * 说明:代理商 - 企业产品配置查询 + **/ + Page selBusMerProByTypeList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 根据商户,服务商查询产品信息 + * @param wrapper + * @return + */ + List selBusMerProList(@Param(Constants.WRAPPER) Wrapper wrapper); + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 18:16 + * 说明:根据产品编码,代理商编码,业务类型,查询最小的代理商服务费率 + **/ + + BigDecimal selMinChargeByAgentAndBusType(Map map); + + + int updateMerProInfos(BusMerchantProductBo bo); + + + /*** + * + * @return + */ + int updateMerProInfosService(); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java new file mode 100644 index 0000000..9643af7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/BusMerchantProductSydMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 企业产品服务商Mapper接口 + * + * @author LionLi + * @date 2024-04-25 + */ +public interface BusMerchantProductSydMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java new file mode 100644 index 0000000..d9f7d99 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/PubMerchantMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户申请表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface PubMerchantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java new file mode 100644 index 0000000..d6c2324 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillDayMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户日账单汇总表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface VMerchantBillDayMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java new file mode 100644 index 0000000..fe00528 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/mapper/VMerchantBillMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.merchant.mapper; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 商户账单汇总表Mapper接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface VMerchantBillMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java new file mode 100644 index 0000000..9f1f8bf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountService.java @@ -0,0 +1,146 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.common.core.domain.R; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.payment.merchant.domain.vo.BusMerchantRechargeVo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; + +import java.util.Collection; +import java.util.List; + +/** + * 商户资金账户Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantAccountService { + + /** + * 查询商户资金账户 + */ + BusMerchantAccountVo queryById(Long id); + + /** + * 查询商户资金账户列表 + */ + TableDataInfo queryPageList(BusMerchantAccountBo bo, PageQuery pageQuery); + + /** + * 查询商户资金账户列表 + */ + List queryList(BusMerchantAccountBo bo); + + /** + * 新增商户资金账户 + */ + Boolean insertByBo(BusMerchantAccountBo bo); + + /** + * 修改商户资金账户 + */ + Boolean updateByBo(BusMerchantAccountBo bo); + + /** + * 校验并批量删除商户资金账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取商户的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + List getAccByMerIdAndSydId(Long merId, Long sydId); + + /** + * 获取商户默认的资金账户 + * @param merId 商户id + * @param sydId 服务商id + * @return + */ + + BusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId,Long sydId); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(Long sydId,long unitId,long amount,String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(Long sydId,long unitId,long amount,String bankType); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(int accId,long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(int accId,long amount); + + /** + * 查询商户资金账户的充值信息 + * @param id 资金账户id + * @return + */ + public BusMerchantRechargeVo getRechargeAccount(int id); + + /** + * 查询服务商提现账户信息 + * @param id 资金账户id + * @return + */ + public BusMerchantAccountVo getCashoutAccount(Long id); + + + /*** + * 获取企业结算账户列表 + * @param bo + * @param pageQuery + * @return + */ + public List getMerAccountList(BusMerchantAccountBo bo, PageQuery pageQuery); + + + + /*** + * 创建企业虚拟户 + * @param sydId + * @param merId + * @param merName + * @param bankType + * @return + */ + Boolean createXnAccount(Long sydId, Long merId, String merName, String bankType); + + + public Boolean createThirdXnAccount(Long sydId, Long merId, String merName, String bankType,String bankCard,String accName); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java new file mode 100644 index 0000000..bb0ceef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAccountSynService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户账户同步Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantAccountSynService { + + /** + * 查询商户账户同步 + */ + BusMerchantAccountSynVo queryById(Long id); + + /** + * 查询商户账户同步列表 + */ + TableDataInfo queryPageList(BusMerchantAccountSynBo bo, PageQuery pageQuery); + + /** + * 查询商户账户同步列表 + */ + List queryList(BusMerchantAccountSynBo bo); + + /** + * 新增商户账户同步 + */ + Boolean insertByBo(BusMerchantAccountSynBo bo); + + /** + * 修改商户账户同步 + */ + Boolean updateByBo(BusMerchantAccountSynBo bo); + + /** + * 校验并批量删除商户账户同步信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java new file mode 100644 index 0000000..3bcb031 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantAgreementService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantAgreementBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户协议Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantAgreementService { + + /** + * 查询商户协议 + */ + BusMerchantAgreementVo queryById(Long id); + + /** + * 查询商户协议列表 + */ + TableDataInfo queryPageList(BusMerchantAgreementBo bo, PageQuery pageQuery); + + /** + * 查询商户协议列表 + */ + List queryList(BusMerchantAgreementBo bo); + + /** + * 新增商户协议 + */ + Boolean insertByBo(BusMerchantAgreementBo bo); + + /** + * 修改商户协议 + */ + Boolean updateByBo(BusMerchantAgreementBo bo); + + /** + * 校验并批量删除商户协议信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java new file mode 100644 index 0000000..2acb41b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantCashoutService.java @@ -0,0 +1,60 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 商户提现记录Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantCashoutService { + + /** + * 查询商户提现记录 + */ + BusMerchantCashoutVo queryById(Long id); + + /** + * 查询商户提现记录列表 + */ + TableDataInfo queryPageList(BusMerchantCashoutBo bo, PageQuery pageQuery); + + /** + * 查询商户提现记录列表 + */ + List queryList(BusMerchantCashoutBo bo); + + /** + * 新增商户提现记录 + */ + Boolean insertByBo(BusMerchantCashoutBo bo); + + /** + * 修改商户提现记录 + */ + Boolean updateByBo(BusMerchantCashoutBo bo); + + /** + * 校验并批量删除商户提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 服务商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java new file mode 100644 index 0000000..a18e8dd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantConfigService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantConfigBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户配置Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantConfigService { + + /** + * 查询商户配置 + */ + BusMerchantConfigVo queryById(Long id); + + /** + * 查询商户配置列表 + */ + TableDataInfo queryPageList(BusMerchantConfigBo bo, PageQuery pageQuery); + + /** + * 查询商户配置列表 + */ + List queryList(BusMerchantConfigBo bo); + + /** + * 新增商户配置 + */ + Boolean insertByBo(BusMerchantConfigBo bo); + + /** + * 修改商户配置 + */ + Boolean updateByBo(BusMerchantConfigBo bo); + + /** + * 校验并批量删除商户配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java new file mode 100644 index 0000000..e8330f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantFlowsService.java @@ -0,0 +1,53 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.AccountSyn; + +import java.util.Collection; +import java.util.List; + +/** + * 商户流水Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantFlowsService { + + /** + * 查询商户流水 + */ + BusMerchantFlowsVo queryById(Long id); + + /** + * 查询商户流水列表 + */ + TableDataInfo queryPageList(BusMerchantFlowsBo bo, PageQuery pageQuery); + + /** + * 查询商户流水列表 + */ + List queryList(BusMerchantFlowsBo bo); + + /** + * 新增商户流水 + */ + Boolean insertByBo(BusMerchantFlowsBo bo); + + /** + * 修改商户流水 + */ + Boolean updateByBo(BusMerchantFlowsBo bo); + + /** + * 校验并批量删除商户流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Long saveFlows(BusMerchantAccountVo acc, AccountSyn syn); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java new file mode 100644 index 0000000..a960f27 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductService.java @@ -0,0 +1,51 @@ +package org.dromara.payment.merchant.service; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 商户产品表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantProductService { + + /** + * 查询商户产品表 + */ + BusMerchantProductVo queryById(Long id); + + /** + * 查询商户产品表列表 + */ + TableDataInfo queryPageList(BusMerchantProductBo bo, PageQuery pageQuery); + + /** + * 查询商户产品表列表 + */ + List queryList(BusMerchantProductBo bo); + + /** + * 新增商户产品表 + */ + Boolean insertByBo(JSONObject bo); + + /** + * 修改商户产品表 + */ + Boolean updateByBo(BusMerchantProductBo bo); + + /** + * 校验并批量删除商户产品表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java new file mode 100644 index 0000000..ef27ad2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantProductSydService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductSydBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 企业产品服务商Service接口 + * + * @author LionLi + * @date 2024-04-25 + */ +public interface IBusMerchantProductSydService { + + /** + * 查询企业产品服务商 + */ + BusMerchantProductSydVo queryById(Long id); + + /** + * 查询企业产品服务商列表 + */ + TableDataInfo queryPageList(BusMerchantProductSydBo bo, PageQuery pageQuery); + + /** + * 查询企业产品服务商列表 + */ + List queryList(BusMerchantProductSydBo bo); + + /** + * 新增企业产品服务商 + */ + Boolean insertByBo(BusMerchantProductSydBo bo); + + /** + * 修改企业产品服务商 + */ + Boolean updateByBo(BusMerchantProductSydBo bo); + + /** + * 校验并批量删除企业产品服务商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java new file mode 100644 index 0000000..793d7fe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IBusMerchantService.java @@ -0,0 +1,79 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IBusMerchantService { + + /** + * 查询商户 + */ + BusMerchantVo queryById(Long id); + + /** + * 查询商户列表 + */ + TableDataInfo queryPageList(BusMerchantBo bo, PageQuery pageQuery); + + /** + * 查询商户列表 + */ + List queryList(BusMerchantBo bo); + + /** + * 新增商户 + */ + Boolean insertByBo(BusMerchantBo bo); + + /** + * 修改商户 + */ + Boolean updateByBo(BusMerchantBo bo); + + /** + * 校验并批量删除商户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * @Param id:企业id,ywyId:业务员id + * @Return + * @Author sunzexing + * @Date 2024-04-20 16:01 + * 说明:设置业务员 + **/ + int setYwy(Long id, Long ywyId); + + + /** + * @Param id:企业id,ywyId:业务员id + * @Return + * @Author sunzexing + * @Date 2024-04-20 16:04 + * 说明:解绑业务员 + **/ + + Integer unbindYwy(Long id, Long ywyId); + + /*** + * 商户审核 + * @param merId + * @param checkType + * @param reason + * @param domain + * @return + */ + Boolean checkMerChant(Long merId, Long checkType, String reason, String domain); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java new file mode 100644 index 0000000..d705adf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IPubMerchantService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.payment.merchant.domain.bo.PubMerchantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户申请表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IPubMerchantService { + + /** + * 查询商户申请表 + */ + PubMerchantVo queryById(Long id); + + /** + * 查询商户申请表列表 + */ + TableDataInfo queryPageList(PubMerchantBo bo, PageQuery pageQuery); + + /** + * 查询商户申请表列表 + */ + List queryList(PubMerchantBo bo); + + /** + * 新增商户申请表 + */ + Boolean insertByBo(PubMerchantBo bo); + + /** + * 修改商户申请表 + */ + Boolean updateByBo(PubMerchantBo bo); + + /** + * 校验并批量删除商户申请表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java new file mode 100644 index 0000000..d13bb28 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillDayService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillDayBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户日账单汇总表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IVMerchantBillDayService { + + /** + * 查询商户日账单汇总表 + */ + VMerchantBillDayVo queryById(Long merId); + + /** + * 查询商户日账单汇总表列表 + */ + TableDataInfo queryPageList(VMerchantBillDayBo bo, PageQuery pageQuery); + + /** + * 查询商户日账单汇总表列表 + */ + List queryList(VMerchantBillDayBo bo); + + /** + * 新增商户日账单汇总表 + */ + Boolean insertByBo(VMerchantBillDayBo bo); + + /** + * 修改商户日账单汇总表 + */ + Boolean updateByBo(VMerchantBillDayBo bo); + + /** + * 校验并批量删除商户日账单汇总表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java new file mode 100644 index 0000000..553cd52 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/IVMerchantBillService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.merchant.service; + +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.payment.merchant.domain.bo.VMerchantBillBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 商户账单汇总表Service接口 + * + * @author LionLi + * @date 2024-04-03 + */ +public interface IVMerchantBillService { + + /** + * 查询商户账单汇总表 + */ + VMerchantBillVo queryById(Long merId); + + /** + * 查询商户账单汇总表列表 + */ + TableDataInfo queryPageList(VMerchantBillBo bo, PageQuery pageQuery); + + /** + * 查询商户账单汇总表列表 + */ + List queryList(VMerchantBillBo bo); + + /** + * 新增商户账单汇总表 + */ + Boolean insertByBo(VMerchantBillBo bo); + + /** + * 修改商户账单汇总表 + */ + Boolean updateByBo(VMerchantBillBo bo); + + /** + * 校验并批量删除商户账单汇总表信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java new file mode 100644 index 0000000..30f6034 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountServiceImpl.java @@ -0,0 +1,337 @@ +package org.dromara.payment.merchant.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.api.merchant.domain.RemoteBusMerchantAccountVo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.vo.BusMerchantRechargeVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户资金账户Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantAccountServiceImpl extends BaseService implements IBusMerchantAccountService { + + private final BusMerchantAccountMapper baseMapper; + + private final BusAccountsMapper accountsMapper; + + private final BusMerchantMapper merchantMapper; + + private final SysSydMapper sydMapper; + + private final IBusOperatorAccountService busOperatorAccountService; + + @DubboReference + private RemoteAccountService accountService; + + @Autowired + private BusAccountsMapper busAccountsMapper; + + /** + * 查询商户资金账户 + */ + @Override + public BusMerchantAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户资金账户列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantAccountBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户资金账户列表 + */ + @Override + public List queryList(BusMerchantAccountBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getMerId() != null, BusMerchantAccount::getMerId, bo.getMerId()); + lqw.eq(bo.getSydId() != null, BusMerchantAccount::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, BusMerchantAccount::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), BusMerchantAccount::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankVirtualCard()), BusMerchantAccount::getBankVirtualCard, bo.getBankVirtualCard()); + lqw.eq(bo.getBalance() != null, BusMerchantAccount::getBalance, bo.getBalance()); + lqw.eq(bo.getFrozen() != null, BusMerchantAccount::getFrozen, bo.getFrozen()); + lqw.eq(bo.getIsDefault() != null, BusMerchantAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, BusMerchantAccount::getAddTime, bo.getAddTime()); + lqw.eq(bo.getSettlement() != null, BusMerchantAccount::getSettlement, bo.getSettlement()); + lqw.eq(bo.getInvoiceSettlement() != null, BusMerchantAccount::getInvoiceSettlement, bo.getInvoiceSettlement()); + lqw.eq(bo.getInvoice() != null, BusMerchantAccount::getInvoice, bo.getInvoice()); + lqw.eq(bo.getStatus() != null, BusMerchantAccount::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), BusMerchantAccount::getOutBankCard, bo.getOutBankCard()); + return lqw; + } + + /** + * 新增商户资金账户 + */ + @Override + public Boolean insertByBo(BusMerchantAccountBo bo) { + BusMerchantAccount add = MapstructUtils.convert(bo, BusMerchantAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户资金账户 + */ + @Override + public Boolean updateByBo(BusMerchantAccountBo bo) { + BusMerchantAccount update = MapstructUtils.convert(bo, BusMerchantAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户资金账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List getAccByMerIdAndSydId(Long merId, Long sydId) { + return baseMapper.getAccByMerIdAndSydId(merId,sydId); + } + + @Override + public BusMerchantAccountVo getDefaultAccByMerIdAndSydId(Long merId, Long sydId) { + List list = baseMapper.getAccByMerIdAndSydId(merId,sydId); + for (BusMerchantAccountVo acc: + list) { + if(acc.getIsDefault() == 1){ + return acc; + } + } + return list.size() > 0 ? list.get(0) : null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalance(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateBalance(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateBalance(sydId,unitId,amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozen(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateFrozen(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateFrozen(sydId,unitId,amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalanceByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateBalanceByAccId(accId,amount); + Integer curNum = baseMapper.updateBalanceByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozenByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateFrozenByAccId(accId,amount); + Integer curNum = baseMapper.updateFrozenByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public BusMerchantRechargeVo getRechargeAccount(int id) { + BusMerchantRechargeVo rtn = new BusMerchantRechargeVo(); + BusMerchantAccountVo acc = baseMapper.selectByAccId(id); + if(acc != null){ + BusMerchantVo merVo = merchantMapper.selectVoById(acc.getMerId()); + SysSydVo sydVo = sydMapper.selectVoById(acc.getSydId()); + rtn.setMerBankCard(merVo.getBankCard()); + rtn.setMerKhh(merVo.getKhh()); + rtn.setBankCard(acc.getBankVirtualCard()); + if (acc.getBankType().equals("支付宝")) { + rtn.setAccName(merVo.getKhm()); + rtn.setBankType("支付机构备付金集中存管账户"); + rtn.setKhh("支付宝-备付金账户"); + rtn.setKhd("上海市-上海市"); + rtn.setKhhNo("991290000015"); + }else{ +// rtn.setAccName(sydVo.getGsmc()); +// rtn.setBankType(acc.getBankType()); +// rtn.setKhh(sydVo.getKfh()); +// rtn.setKhd(sydVo.getKfd()); +// rtn.setKhhNo(sydVo.getKhhNo()); + + rtn.setAccName(acc.getName()); + rtn.setBankType(acc.getBankType()); + rtn.setKhh(acc.getKhh()); +// rtn.setKhd(sydVo.getKfd()); + rtn.setKhhNo(acc.getLhh()); + } + } + return rtn; + } + + @Override + public BusMerchantAccountVo getCashoutAccount(Long id) { + BusMerchantAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + BusMerchantVo vo = merchantMapper.selectVoById(rtn.getMerId()); + rtn.setAccName(vo.getKhm()); + rtn.setBankVirtualCard(vo.getBankCard()); + rtn.setKfd(vo.getKhd()); + rtn.setKfh(vo.getKhh()); + rtn.setKhhNo(vo.getKhhNo()); + } + return rtn; + } + + @Override + public List getMerAccountList(BusMerchantAccountBo bo, PageQuery pageQuery) { + if(bo.getMerId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + if(StringUtils.isEmpty(bo.getBankType())){ + this.invalidationParamsException("银行通道不能为空"); + } + return this.baseMapper.selectMerAccountLists(bo,pageQuery.build()); + } + + @Override + public Boolean createXnAccount(Long sydId, Long merId, String merName, String bankType) { + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + if(merId == null){ + this.invalidationParamsException("运营商ID不能为空"); + } + if(StringUtils.isEmpty(merName)){ + this.invalidationParamsException("企业名称不能为空"); + } + if(StringUtils.isEmpty(bankType)){ + this.invalidationParamsException("银行类型不能为空"); + } + List accs = this.baseMapper.selectByMerIdAndSydId(sydId,merId,bankType); + if(!accs.isEmpty()){ + return true; + } + Boolean sydRtn = busOperatorAccountService.creatXNnum(sydId,merId,merName, BusRole.MERCHANT.getId(),BusRole.PLATFORM.getId(),bankType, add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = this.baseMapper.insertAccount(new BusMerchantAccount(null,merId,sydId,add.getAccId(),add.getBankType(), add.getBankCard(),0L,0L,1L, add.getAddTime(),add.getName(), + add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }, bankType1 -> { + List accs1 = this.baseMapper.selectByMerIdAndSydId(sydId,merId,bankType); + return accs1.size() > 0 ? accs1.get(0).getBankVirtualCard() : null; + }); + return sydRtn; + } + + @Override + public Boolean createThirdXnAccount(Long sydId, Long merId, String merName, String bankType,String bankCard,String accName) { + + List accs = this.baseMapper.selectByMerIdAndSydId(sydId,merId,bankType); + if(!accs.isEmpty()){ + return true; + } + + Account bankAcc = new Account(); + bankAcc.setType((short)1);//2:真实个人账户 + bankAcc.setBankCard(bankCard); + bankAcc.setBankType(bankType); + bankAcc.setUnitId(merId); + bankAcc.setName(accName); + bankAcc.setBankName(bankType); + bankAcc.setStatus((short)1); + Result addAccount = this.accountService.addAccount(bankAcc); + + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,merId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,BusRole.PLATFORM.getId(),rtnData.getName(), + rtnData.getBankName(), rtnData.getBankNo()); + busAccountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + + if(add.getId() > 0) { + Integer num = this.baseMapper.insertAccount(new BusMerchantAccount(null,merId,sydId,add.getAccId(),add.getBankType(), add.getBankCard(),0L,0L,1L, add.getAddTime(),add.getName(), + add.getKhh(),add.getLhh())); + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java new file mode 100644 index 0000000..227c0f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAccountSynServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantAccountSynBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.mapper.BusMerchantAccountSynMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountSynService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户账户同步Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantAccountSynServiceImpl implements IBusMerchantAccountSynService { + + private final BusMerchantAccountSynMapper baseMapper; + + /** + * 查询商户账户同步 + */ + @Override + public BusMerchantAccountSynVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户账户同步列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantAccountSynBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户账户同步列表 + */ + @Override + public List queryList(BusMerchantAccountSynBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantAccountSynBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSort() != null, BusMerchantAccountSyn::getSort, bo.getSort()); + lqw.eq(bo.getSynLock() != null, BusMerchantAccountSyn::getSynLock, bo.getSynLock()); + lqw.eq(StringUtils.isNotBlank(bo.getSynBatch()), BusMerchantAccountSyn::getSynBatch, bo.getSynBatch()); + lqw.eq(bo.getSynPosition() != null, BusMerchantAccountSyn::getSynPosition, bo.getSynPosition()); + return lqw; + } + + /** + * 新增商户账户同步 + */ + @Override + public Boolean insertByBo(BusMerchantAccountSynBo bo) { + BusMerchantAccountSyn add = MapstructUtils.convert(bo, BusMerchantAccountSyn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户账户同步 + */ + @Override + public Boolean updateByBo(BusMerchantAccountSynBo bo) { + BusMerchantAccountSyn update = MapstructUtils.convert(bo, BusMerchantAccountSyn.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantAccountSyn entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户账户同步 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java new file mode 100644 index 0000000..aadd4f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantAgreementServiceImpl.java @@ -0,0 +1,121 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantAgreementBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAgreementVo; +import org.dromara.payment.merchant.domain.BusMerchantAgreement; +import org.dromara.payment.merchant.mapper.BusMerchantAgreementMapper; +import org.dromara.payment.merchant.service.IBusMerchantAgreementService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户协议Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantAgreementServiceImpl implements IBusMerchantAgreementService { + + private final BusMerchantAgreementMapper baseMapper; + + /** + * 查询商户协议 + */ + @Override + public BusMerchantAgreementVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户协议列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantAgreementBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户协议列表 + */ + @Override + public List queryList(BusMerchantAgreementBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantAgreementBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusMerchantAgreement::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusMerchantAgreement::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusMerchantAgreement::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusMerchantAgreement::getOpId, bo.getOpId()); + lqw.eq(bo.getSignStyle() != null, BusMerchantAgreement::getSignStyle, bo.getSignStyle()); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), BusMerchantAgreement::getTitle, bo.getTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusMerchantAgreement::getNo, bo.getNo()); + lqw.eq(bo.getStatus() != null, BusMerchantAgreement::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getFileUrl()), BusMerchantAgreement::getFileUrl, bo.getFileUrl()); + lqw.eq(bo.getChannelId() != null, BusMerchantAgreement::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusMerchantAgreement::getChannelNo, bo.getChannelNo()); + lqw.eq(bo.getMerId() != null, BusMerchantAgreement::getMerId, bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), BusMerchantAgreement::getMerNo, bo.getMerNo()); + return lqw; + } + + /** + * 新增商户协议 + */ + @Override + public Boolean insertByBo(BusMerchantAgreementBo bo) { + BusMerchantAgreement add = MapstructUtils.convert(bo, BusMerchantAgreement.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户协议 + */ + @Override + public Boolean updateByBo(BusMerchantAgreementBo bo) { + BusMerchantAgreement update = MapstructUtils.convert(bo, BusMerchantAgreement.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantAgreement entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户协议 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java new file mode 100644 index 0000000..fcefa6a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantCashoutServiceImpl.java @@ -0,0 +1,280 @@ +package org.dromara.payment.merchant.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantFlowsMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantCashoutBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantCashoutVo; +import org.dromara.payment.merchant.domain.BusMerchantCashout; +import org.dromara.payment.merchant.mapper.BusMerchantCashoutMapper; +import org.dromara.payment.merchant.service.IBusMerchantCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商户提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantCashoutServiceImpl implements IBusMerchantCashoutService { + + private final BusMerchantCashoutMapper baseMapper; + + private final BusMerchantMapper merchantMapper; + + private final IBusMerchantAccountService busMerchantAccountService; + + private final IMerBillService billService; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final BusMerchantFlowsMapper merchantFlowsMapper; + + private final IBusMerchantAccountService merchantAccountService; + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询商户提现记录 + */ + @Override + public BusMerchantCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户提现记录列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantCashoutBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户提现记录列表 + */ + @Override + public List queryList(BusMerchantCashoutBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantCashoutBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusMerchantCashout::getSydId, bo.getSydId()); + lqw.eq(bo.getMerId() != null, BusMerchantCashout::getMerId, bo.getMerId()); + lqw.eq(bo.getAccId() != null, BusMerchantCashout::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusMerchantCashout::getBusNo, bo.getBusNo()); + lqw.eq(bo.getAmount() != null, BusMerchantCashout::getAmount, bo.getAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusMerchantCashout::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusMerchantCashout::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusMerchantCashout::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusMerchantCashout::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusMerchantCashout::getBankCard, bo.getBankCard()); + lqw.eq(bo.getPayStatus() != null, BusMerchantCashout::getPayStatus, bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, BusMerchantCashout::getPayTime, bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), BusMerchantCashout::getPayRemark, bo.getPayRemark()); + lqw.eq(bo.getAddTime() != null, BusMerchantCashout::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusMerchantCashout::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), BusMerchantCashout::getPassage, bo.getPassage()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), BusMerchantCashout::getPayReceipt, bo.getPayReceipt()); + return lqw; + } + + /** + * 新增商户提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusMerchantCashoutBo bo) { + BusMerchantCashout add = MapstructUtils.convert(bo, BusMerchantCashout.class); + validEntityBeforeSave(add); + BusMerchantAccountVo vo = busMerchantAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } + billService.checkPayPassword(BusRole.MERCHANT, vo.getMerId(), () -> { + BusMerchant merchant = merchantMapper.selectOne(new LambdaQueryWrapper().eq(BusMerchant::getId,vo.getMerId())); + if(StringUtils.isBlank(merchant.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(merchant.getPayPassword()); + }); + String busDesc = "商户提现"; + if(merchantAccountService.updateFrozenByAccId(vo.getAccId().intValue(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setMerId(vo.getMerId()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankVirtualCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + add.setPayStatus(2l);//支付中 + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + Account bankAcc = new Account(); +// bankAcc.setBankType(add.getPassage()); + bankAcc.setBankType(add.getKhh()); + bankAcc.setBankCard(add.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(add.getFr()); + bankAcc.setType((short)3);//3:真实企业账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + //商户提现 + TranLog backLog = new TranLog(); + backLog.setBusType(6l); + backLog.setBusItem(5l); + backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(add.getId()); + Result backRtn = accountService.applyTransfer(vo.getAccId().intValue(), addRtn.getRtnData().getId(),bo.getAmount(), add.getBusNo(), "提现"); + if (backRtn.hasError()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(busDesc + ",发送交易申请失败"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.MERCHANT.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.MERCHANT.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + } + return flag; + } + + /** + * 修改商户提现记录 + */ + @Override + public Boolean updateByBo(BusMerchantCashoutBo bo) { + BusMerchantCashout update = MapstructUtils.convert(bo, BusMerchantCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "商户提现"; + BusMerchantCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(merchantAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(merchantAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusMerchantCashout::getId,vo.getId()) + .eq(BusMerchantCashout::getPayStatus,2) + .set(BusMerchantCashout::getPayStatus,3) + .set(BusMerchantCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + BusMerchantVo merchant = merchantMapper.selectVoById(vo.getMerId()); + BusMerchantFlows merchantFlow = new BusMerchantFlows(2,vo.getMerId(),vo.getSydId(),14, vo.getPassage(), null,tran.getTargetBankNo(), -tran.getAmount(), new Date(),vo.getAddBy(),"提现", null, vo.getId(), null, tlog.getTranNo(), 3, tran.getResult().intValue(), tlog.getSourceAccType(), vo.getMerId(), merchant.getName(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), 0l, merchant.getName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1, ""); + merchantFlowsMapper.insertAll(Arrays.asList(merchantFlow)); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusMerchantCashout::getId,vo.getId()) + .eq(BusMerchantCashout::getPayStatus,2) + .set(BusMerchantCashout::getPayStatus,4) + .set(BusMerchantCashout::getPayTime,new Date()) + .set(BusMerchantCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java new file mode 100644 index 0000000..2332a48 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantConfigServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantConfigBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantConfigVo; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.mapper.BusMerchantConfigMapper; +import org.dromara.payment.merchant.service.IBusMerchantConfigService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户配置Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantConfigServiceImpl implements IBusMerchantConfigService { + + private final BusMerchantConfigMapper baseMapper; + + /** + * 查询商户配置 + */ + @Override + public BusMerchantConfigVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户配置列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户配置列表 + */ + @Override + public List queryList(BusMerchantConfigBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getMerId() != null, BusMerchantConfig::getMerId, bo.getMerId()); + lqw.eq(bo.getAutoApprove() != null, BusMerchantConfig::getAutoApprove, bo.getAutoApprove()); + lqw.eq(bo.getValiWorker() != null, BusMerchantConfig::getValiWorker, bo.getValiWorker()); + return lqw; + } + + /** + * 新增商户配置 + */ + @Override + public Boolean insertByBo(BusMerchantConfigBo bo) { + BusMerchantConfig add = MapstructUtils.convert(bo, BusMerchantConfig.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户配置 + */ + @Override + public Boolean updateByBo(BusMerchantConfigBo bo) { + BusMerchantConfig update = MapstructUtils.convert(bo, BusMerchantConfig.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantConfig entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java new file mode 100644 index 0000000..941b55c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantFlowsServiceImpl.java @@ -0,0 +1,218 @@ +package org.dromara.payment.merchant.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.service.IMerBillDetailService; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.BusMerchantAccountSyn; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantAccountSynMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.settlement.api.domain.AccountLog; +import org.dromara.settlement.api.domain.AccountSyn; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantFlowsBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantFlowsVo; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.mapper.BusMerchantFlowsMapper; +import org.dromara.payment.merchant.service.IBusMerchantFlowsService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商户流水Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantFlowsServiceImpl implements IBusMerchantFlowsService { + + private final BusMerchantFlowsMapper baseMapper; + + private final BusMerchantAccountMapper merchantAccountMapper; + + private final IBusMerchantAccountService merchantAccountService; + + private final BusMerchantAccountSynMapper merchantAccountSynMapper; + + private final IMerBillDetailService billDetailService; + + /** + * 查询商户流水 + */ + @Override + public BusMerchantFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户流水列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantFlowsBo bo, PageQuery pageQuery) { + bo.setMerId(LoginHelper.getBusId()); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户流水列表 + */ + @Override + public List queryList(BusMerchantFlowsBo bo) { + + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getMerId() != null, BusMerchantFlows::getMerId, bo.getMerId()); + lqw.eq(bo.getSydId() != null, BusMerchantFlows::getSydId, bo.getSydId()); + lqw.eq(bo.getBusType() != null, BusMerchantFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getChannel()), BusMerchantFlows::getChannel, bo.getChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusMerchantFlows::getBusNo, bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), BusMerchantFlows::getBankNo, bo.getBankNo()); + lqw.eq(bo.getMoney() != null, BusMerchantFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, BusMerchantFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, BusMerchantFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusMerchantFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), BusMerchantFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), BusMerchantFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, BusMerchantFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, BusMerchantFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(StringUtils.isNotBlank(bo.getTranNo()), BusMerchantFlows::getTranNo, bo.getTranNo()); + lqw.eq(bo.getTranType() != null, BusMerchantFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getTranStatus() != null, BusMerchantFlows::getTranStatus, bo.getTranStatus()); + lqw.eq(bo.getPayerType() != null, BusMerchantFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, BusMerchantFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), BusMerchantFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), BusMerchantFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, BusMerchantFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, BusMerchantFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, BusMerchantFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), BusMerchantFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), BusMerchantFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, BusMerchantFlows::getPayeeAccId, bo.getPayeeAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), BusMerchantFlows::getPayReceipt, bo.getPayReceipt()); + lqw.eq(bo.getPayReceiptType() != null, BusMerchantFlows::getPayReceiptType, bo.getPayReceiptType()); + lqw.eq(StringUtils.isNotBlank(bo.getIllustrate()), BusMerchantFlows::getIllustrate, bo.getIllustrate()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between(BusMerchantFlows::getAddTime,bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("acc_id"))){ + BusMerchantAccountVo acc = merchantAccountMapper.selectVoById(Long.parseLong(bo.getParams().get("acc_id").toString())); + lqw.and(i -> i.eq(BusMerchantFlows::getPayeeAccId,acc.getAccId()).or().eq(BusMerchantFlows::getPayerAccId,acc.getAccId())); + } + + lqw.orderByDesc(BusMerchantFlows::getId); + return lqw; + } + + /** + * 新增商户流水 + */ + @Override + public Boolean insertByBo(BusMerchantFlowsBo bo) { + BusMerchantFlows add = MapstructUtils.convert(bo, BusMerchantFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户流水 + */ + @Override + public Boolean updateByBo(BusMerchantFlowsBo bo) { + BusMerchantFlows update = MapstructUtils.convert(bo, BusMerchantFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long saveFlows(BusMerchantAccountVo acc, AccountSyn syn) { + Long addAmount = 0l; + List flows = new ArrayList(); + Long preMoney = 0l; + for (AccountLog log : syn.getLogs()) { + if(log.getTrxdir().intValue() == 1) { + boolean isRecharge = true;//是否充值 + //订单退票,过滤账单明细和提现业务 + if (StringUtils.isNotBlank(log.getNarinn()) && log.getNarinn().startsWith("bus")) { + //账单代发退回 + isRecharge = !billDetailService.refundBillDetail(log.getNarinn(),log.getTrxamt(),log.getTrxtxt()); + } + if(isRecharge) { + BusMerchantFlows flow = new BusMerchantFlows(); + flow.setDirection(1);//流水方向(1:收入 2:支出) + flow.setAddBy("系统"); + flow.setAddTime(new Date()); + flow.setBankNo(log.getTrxnbr()); + flow.setBusType(2);//商户充值 + flow.setChannel(syn.getBankType()); + flow.setMerId(acc.getMerId()); + flow.setMoney(log.getTrxamt()); + flow.setPreMoney(preMoney); + flow.setSydId(acc.getSydId()); + flow.setBusDesc("充值"); + flow.setTranStatus(2); + flow.setPayerName(log.getRpynam()); + flow.setPayerAcc(log.getRpyacc()); + flow.setTranType(7);//充值交易 + flow.setPayeeType(BusRole.MERCHANT.getId()); + flow.setPayeeId(acc.getMerId()); + flow.setPayeeName(acc.getMerName()); + flow.setPayeeAcc(acc.getBankVirtualCard()); + flow.setPayeeAccId(acc.getAccId()); + flows.add(flow); + preMoney += flow.getMoney(); + addAmount += flow.getMoney(); + } + } + } + baseMapper.insertAll(flows); + merchantAccountService.updateBalance(acc.getSydId(),acc.getMerId(), addAmount,acc.getBankType()); + merchantAccountSynMapper.update(new LambdaUpdateWrapper().eq(BusMerchantAccountSyn::getId,acc.getAccId()) + .set(BusMerchantAccountSyn::getSynPosition,syn.getLogs().get(syn.getLogs().size()-1).getId())); + return addAmount; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java new file mode 100644 index 0000000..dfb4a85 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductServiceImpl.java @@ -0,0 +1,235 @@ +package org.dromara.payment.merchant.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.vo.BusChannelProductVo; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.dromara.payment.merchant.service.IBusMerchantProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商户产品表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantProductServiceImpl extends BaseService implements IBusMerchantProductService { + + private final BusMerchantProductMapper baseMapper; + + private final BusChannelProductMapper busChannelProductMapper; + + private final BusMerchantMapper busMerchantMapper; + + private final IXyjService xyjService; + + /** + * 查询商户产品表 + */ + @Override + public BusMerchantProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户产品表列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantProductBo bo, PageQuery pageQuery) { + + if(bo.getBusType() == null){ + this.invalidationParamsException("业务类型不能为空"); + } + + if(bo.getMerId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t1.bus_type",bo.getBusType()); + lqw.eq("t.mer_id",bo.getMerId()); + lqw.eq("t3.pro_status",1); + lqw.eq("t1.pro_status",1); + lqw.eq("t1.channel_id",LoginHelper.getBusId()); + + + Page result = baseMapper.selBusMerProByTypeList(pageQuery.build(), lqw); + result.getRecords().forEach(item->{ + item.setUnId(IdUtil.getSnowflakeNextId()+""); + }); + return TableDataInfo.build(result); + } + + /** + * 查询商户产品表列表 + */ + @Override + public List queryList(BusMerchantProductBo bo) { + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.pro_status",1); + lqw.eq("t3.pro_status",1); + lqw.eq("t.bus_type",bo.getBusType()); + lqw.eq("t.mer_id",LoginHelper.getBusId()); + lqw.eq("t.syd_id",bo.getSydId()); + lqw.orderByDesc("t.create_time"); + List list = this.baseMapper.selBusMerProList(lqw); + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusMerchantProduct::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusMerchantProduct::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, BusMerchantProduct::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), BusMerchantProduct::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, BusMerchantProduct::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusMerchantProduct::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusMerchantProduct::getOpId, bo.getOpId()); + lqw.eq(bo.getCostServiceCharge() != null, BusMerchantProduct::getCostServiceCharge, bo.getCostServiceCharge()); + lqw.eq(bo.getServiceCharge() != null, BusMerchantProduct::getServiceCharge, bo.getServiceCharge()); + lqw.eq(bo.getChannelId() != null, BusMerchantProduct::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), BusMerchantProduct::getChannelNo, bo.getChannelNo()); + lqw.eq(bo.getMerId() != null, BusMerchantProduct::getMerId, bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), BusMerchantProduct::getMerNo, bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), BusMerchantProduct::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getChargeMode() != null, BusMerchantProduct::getChargeMode, bo.getChargeMode()); + lqw.eq(bo.getSettlementStyle() != null, BusMerchantProduct::getSettlementStyle, bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, BusMerchantProduct::getMaxMonth, bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, BusMerchantProduct::getInvoiceType, bo.getInvoiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceItems()), BusMerchantProduct::getInvoiceItems, bo.getInvoiceItems()); + lqw.eq(bo.getProStatus() != null, BusMerchantProduct::getProStatus, bo.getProStatus()); + return lqw; + } + + /** + * 新增商户产品表 + */ + @Override + @Transactional + public Boolean insertByBo(JSONObject map) { + + String boListStr = map.getString("boList"); + Long bus_type = map.getLong("busType"); + Long mer_id = map.getLong("merId"); + String merNo = map.getString("merNo"); + if(bus_type == null){ + this.invalidationParamsException("业务类型不能为空"); + } + if(mer_id == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(StringUtils.isEmpty(merNo)){ + this.invalidationParamsException("企业编码不能为空"); + } + if(StringUtils.isEmpty(boListStr)){ + this.invalidationParamsException("请先配置产品"); + } + boListStr = map.getJSONArray("boList").toJSONString(); + Map paraMap = new HashMap(); + paraMap.put("channel_no", LoginHelper.getNo()); + paraMap.put("bus_type",bus_type); + List agentList = this.busChannelProductMapper.selectAgentProInfos(paraMap); + if(agentList.size() == 0){ + this.invalidationParamsException("当前代理商未配置产品"); + } + List voList = JSONUtil.toList(boListStr, BusMerchantProductBo.class); + List insertList = new ArrayList(); + for(BusMerchantProductBo vo :voList){ + if (vo.getProNo().equals("P9490811577")){ + BusMerchant busMerchant = busMerchantMapper.selectById(mer_id); + xyjService.addMerchant(busMerchant,vo.getSydId()); + } + BusChannelProductVo agentVo = agentList.stream().filter(t -> t.getProNo().equals(vo.getProNo())).findFirst().orElse(null); + if(agentVo == null){ + this.invalidationParamsException("产品编码"+vo.getProNo()+"未配置"); + } + vo.setSydId(agentVo.getSydId()); + vo.setSydNo(agentVo.getSydNo()); + vo.setProId(agentVo.getProId()); + vo.setOpId(agentVo.getOpId()); + vo.setOpNo(agentVo.getOpNo()); + vo.setMerId(mer_id); + vo.setMerNo(merNo); + vo.setChannelId(agentVo.getChannelId()); + vo.setChannelNo(agentVo.getChannelNo()); + vo.setMaxMonth(agentVo.getMaxMonth()); +// vo.setInvoiceItems(agentVo.getInvoiceItems()); + vo.setCostServiceCharge(agentVo.getServiceCharge()); + + ValidatorUtils.validate(vo, AddGroup.class); + if(vo.getServiceCharge() != null && vo.getServiceCharge().compareTo(vo.getCostServiceCharge()) < 0){ + vo.setServiceCharge(vo.getCostServiceCharge()); + } + vo.setBusType(bus_type); + vo.setMerId(mer_id); + if(vo.getId() != null){ + vo.setMdyServiceCharge(vo.getServiceCharge()); + vo.setServiceCharge(null); + BusMerchantProduct update = MapstructUtils.convert(vo, BusMerchantProduct.class); + insertList.add(update); + }else{ + BusMerchantProduct add = MapstructUtils.convert(vo, BusMerchantProduct.class); + insertList.add(add); + } + + } + this.baseMapper.insertOrUpdateBatch(insertList); + return true; + } + + /** + * 修改商户产品表 + */ + @Override + public Boolean updateByBo(BusMerchantProductBo bo) { + BusMerchantProduct update = MapstructUtils.convert(bo, BusMerchantProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户产品表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java new file mode 100644 index 0000000..5612532 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantProductSydServiceImpl.java @@ -0,0 +1,115 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductSydBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductSydVo; +import org.dromara.payment.merchant.domain.BusMerchantProductSyd; +import org.dromara.payment.merchant.mapper.BusMerchantProductSydMapper; +import org.dromara.payment.merchant.service.IBusMerchantProductSydService; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 企业产品服务商Service业务层处理 + * + * @author LionLi + * @date 2024-04-25 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantProductSydServiceImpl implements IBusMerchantProductSydService { + + private final BusMerchantProductSydMapper baseMapper; + + /** + * 查询企业产品服务商 + */ + @Override + public BusMerchantProductSydVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询企业产品服务商列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantProductSydBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询企业产品服务商列表 + */ + @Override + public List queryList(BusMerchantProductSydBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusMerchantProductSydBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + return lqw; + } + + /** + * 新增企业产品服务商 + */ + @Override + public Boolean insertByBo(BusMerchantProductSydBo bo) { + BusMerchantProductSyd add = MapstructUtils.convert(bo, BusMerchantProductSyd.class); + validEntityBeforeSave(add); + add.setCreateBy(LoginHelper.getUserId()); + add.setCreateTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改企业产品服务商 + */ + @Override + public Boolean updateByBo(BusMerchantProductSydBo bo) { + BusMerchantProductSyd update = MapstructUtils.convert(bo, BusMerchantProductSyd.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchantProductSyd entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除企业产品服务商 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java new file mode 100644 index 0000000..08ca499 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/BusMerchantServiceImpl.java @@ -0,0 +1,417 @@ +package org.dromara.payment.merchant.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.vo.BusChannelVo; +import org.dromara.payment.invoice.domain.MerInvoiceAddress; +import org.dromara.payment.invoice.mapper.MerInvoiceAddressMapper; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.mapper.BusMerchantConfigMapper; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 商户Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class BusMerchantServiceImpl extends BaseService implements IBusMerchantService { + + private final BusMerchantMapper baseMapper; + + private final BusMerchantConfigMapper merchantConfigMapper; + + private final MerInvoiceAddressMapper merInvoiceAddressMapper; + + @Resource + private ISysUnitService sysUnitService; + + + @DubboReference + private RemoteUserService remoteUserService; + + @DubboReference + private RemoteSmsService remoteSmsService; + + + /** + * 查询商户 + */ + @Override + public BusMerchantVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户列表 + */ + @Override + public TableDataInfo queryPageList(BusMerchantBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t.name",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t.no",bo.getNo()); + lqw.like(StringUtils.isNotEmpty(bo.getScaleName()),"s.name",bo.getScaleName()); + if(bo.getIsProduct() != null && bo.getIsProduct() == 1){ + lqw.eq("t.create_unit_id",LoginHelper.getBusId()); + } + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.SERVICE.getId()){ + lqw.inSql("t.id","select distinct mer_id from bus_merchant_product tt where tt.syd_id ="+LoginHelper.getBusId()); + } + + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selectMerchantList(pageQuery.build(), lqw); + + result.getRecords().forEach(item->{ + item.setPayPassword(null); + if(item.getCreateUnitId() != null && item.getCreateUnitId().equals(LoginHelper.getBusId())){ + item.setIsCanSetScale(1); + } + }); + return TableDataInfo.build(result); + } + + /** + * 查询商户列表 + */ + @Override + public List queryList(BusMerchantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusMerchantBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusMerchant::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), BusMerchant::getIndustry, bo.getIndustry()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusMerchant::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameNc()), BusMerchant::getNameNc, bo.getNameNc()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), BusMerchant::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), BusMerchant::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), BusMerchant::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), BusMerchant::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), BusMerchant::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), BusMerchant::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), BusMerchant::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), BusMerchant::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), BusMerchant::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusMerchant::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusMerchant::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), BusMerchant::getAddress, bo.getAddress()); + lqw.eq(bo.getYyzzBeginDate() != null, BusMerchant::getYyzzBeginDate, bo.getYyzzBeginDate()); + lqw.eq(bo.getYyzzEndDate() != null, BusMerchant::getYyzzEndDate, bo.getYyzzEndDate()); + lqw.eq(StringUtils.isNotBlank(bo.getYyzz()), BusMerchant::getYyzz, bo.getYyzz()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), BusMerchant::getPayPassword, bo.getPayPassword()); + lqw.eq(bo.getPassErrorNum() != null, BusMerchant::getPassErrorNum, bo.getPassErrorNum()); + lqw.eq(bo.getPassFrozenTime() != null, BusMerchant::getPassFrozenTime, bo.getPassFrozenTime()); + lqw.eq(bo.getStatus() != null, BusMerchant::getStatus, bo.getStatus()); + lqw.eq(bo.getAddTime() != null, BusMerchant::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusMerchant::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), BusMerchant::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, BusMerchant::getEditTime, bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), BusMerchant::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusMerchant::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusMerchant::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusMerchant::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getJbckzhbm()), BusMerchant::getJbckzhbm, bo.getJbckzhbm()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), BusMerchant::getPassage, bo.getPassage()); + lqw.eq(bo.getFrCardidBeginDate() != null, BusMerchant::getFrCardidBeginDate, bo.getFrCardidBeginDate()); + lqw.eq(bo.getFrCardidEndDate() != null, BusMerchant::getFrCardidEndDate, bo.getFrCardidEndDate()); + lqw.eq(bo.getJbrCardidBeginDate() != null, BusMerchant::getJbrCardidBeginDate, bo.getJbrCardidBeginDate()); + lqw.eq(bo.getJbrCardidEndDate() != null, BusMerchant::getJbrCardidEndDate, bo.getJbrCardidEndDate()); + lqw.eq(bo.getYwyId() != null, BusMerchant::getYwyId, bo.getYwyId()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceHeader()), BusMerchant::getInvoceHeader, bo.getInvoceHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceCreditCode()), BusMerchant::getInvoceCreditCode, bo.getInvoceCreditCode()); + lqw.like(StringUtils.isNotBlank(bo.getInvoceBankName()), BusMerchant::getInvoceBankName, bo.getInvoceBankName()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceBankCard()), BusMerchant::getInvoceBankCard, bo.getInvoceBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceAddress()), BusMerchant::getInvoceAddress, bo.getInvoceAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceDwdh()), BusMerchant::getInvoceDwdh, bo.getInvoceDwdh()); + lqw.eq(StringUtils.isNotBlank(bo.getFhxkzPic()), BusMerchant::getFhxkzPic, bo.getFhxkzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), BusMerchant::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), BusMerchant::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzzm()), BusMerchant::getJbrSfzzm, bo.getJbrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzfm()), BusMerchant::getJbrSfzfm, bo.getJbrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getMtqjzPic()), BusMerchant::getMtqjzPic, bo.getMtqjzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp1Pic()), BusMerchant::getBgzp1Pic, bo.getBgzp1Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp2Pic()), BusMerchant::getBgzp2Pic, bo.getBgzp2Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjzsxcnh()), BusMerchant::getYwcjzsxcnh, bo.getYwcjzsxcnh()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjsm()), BusMerchant::getYwcjsm, bo.getYwcjsm()); + lqw.eq(StringUtils.isNotBlank(bo.getFddsqxy()), BusMerchant::getFddsqxy, bo.getFddsqxy()); + lqw.eq(StringUtils.isNotBlank(bo.getTshyxkz()), BusMerchant::getTshyxkz, bo.getTshyxkz()); + lqw.eq(bo.getVerifyStatus() != null, BusMerchant::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, BusMerchant::getVerifyTime, bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), BusMerchant::getVerifyBy, bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), BusMerchant::getVerifyReason, bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getScale()), BusMerchant::getScale, bo.getScale()); + lqw.eq(StringUtils.isNotBlank(bo.getLogo()), BusMerchant::getLogo, bo.getLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getIntroduce()), BusMerchant::getIntroduce, bo.getIntroduce()); + lqw.eq(bo.getSalesmanId() != null, BusMerchant::getSalesmanId, bo.getSalesmanId()); + lqw.eq(bo.getIsValiAcc() != null, BusMerchant::getIsValiAcc, bo.getIsValiAcc()); + return lqw; + } + + /** + * 新增商户 + */ + @Override + @Transactional + public Boolean insertByBo(BusMerchantBo bo) { + + Long id = IdUtil.getSnowflakeNextId(); + + bo.setId(id); + bo.setCreateBy(LoginHelper.getUserId()); + bo.setCreateTime(new Date()); + bo.setSalesmanId(bo.getYwyId()); + bo.setVerifyStatus(0L); + if(StringUtils.isEmpty(bo.getNo())){ + bo.setNo(LoginHelper.getNo()+"-"+this.getMerNo()); + } + String pCode = LoginHelper.getNo(); + if(StringUtils.isNotEmpty(pCode)){ + String[] pcs = pCode.split("-"); + bo.setOperatorNo(pcs[0]); + if(pcs.length >= 2){ + bo.setAgentNo(pCode); + } + } + BusMerchant add = MapstructUtils.convert(bo, BusMerchant.class); + validEntityBeforeSave(add); + add.setCreateUnitId(LoginHelper.getBusId()); + add.setCreateUnitNo(LoginHelper.getNo()); + + boolean flag = false; + try{ + flag = baseMapper.insert(add) > 0; + }catch (Exception e){ + if( e instanceof DuplicateKeyException){ + bo.setNo(LoginHelper.getNo()+"-"+this.getMerNo()); + return this.insertByBo(bo); + } + throw e; + } + if (flag) { + bo.setId(add.getId()); + } + + SysUnitBo sysUnitBo = new SysUnitBo(); + sysUnitBo.setName(bo.getName()); + sysUnitBo.setId(id); + sysUnitBo.setUnitType(BusRole.MERCHANT.getId()); + sysUnitBo.setNo(add.getNo()); + sysUnitBo.setCreateBy(add.getCreateBy()); + sysUnitBo.setCreateTime(add.getCreateTime()); + this.sysUnitService.insertByBo(sysUnitBo); + + + BusMerchantConfig busMerchantConfig = new BusMerchantConfig(); + busMerchantConfig.setMerId(add.getId()); + busMerchantConfig.setAutoApprove(1); + busMerchantConfig.setValiWorker(1); + busMerchantConfig.setCreateTime(new Date()); + + this.merchantConfigMapper.insert(busMerchantConfig); + + + + return flag; + } + + private String getMerNo() { + return "M"+RandomUtil.randomString("0123456789",5); + } + + /** + * 修改商户 + */ + @Override + public Boolean updateByBo(BusMerchantBo bo) { + + BusMerchantVo vo = this.baseMapper.selectVoById(bo.getId()); + if(vo == null){ + this.invalidationParamsException("无效主键!"); + } + + if(vo.getVerifyStatus() == null || vo.getVerifyStatus().equals(2L)){ + this.invalidationParamsException("此状态下不能修改企业信息"); + } + BusMerchant update = MapstructUtils.convert(bo, BusMerchant.class); + update.setNo(null); + update.setVerifyStatus(0L); + update.setAgentNo(null); + update.setOperatorNo(null); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusMerchant entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public int setYwy(Long id, Long ywyId) { + + if(id == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(ywyId == null){ + this.invalidationParamsException("业务员ID不能为空"); + } + BusMerchant bm = new BusMerchant(); + bm.setYwyId(ywyId); + bm.setSalesmanId(bm.getYwyId()); + bm.setUpdateBy(LoginHelper.getUserId()); + bm.setUpdateTime(new Date()); + bm.setId(id); + this.baseMapper.setAndUnbindYwy(bm); + return 1; + } + + @Override + public Boolean checkMerChant(Long merId, Long checkType, String reason, String domain) { + + if(merId == null){ + this.invalidationParamsException("商户ID不能为空"); + } + + if(checkType == null){ + this.invalidationParamsException("审核类型不能为空"); + } + + if(checkType.intValue() == 1 && StringUtils.isEmpty(reason)){ + this.invalidationParamsException("驳回原因不能为空"); + } + + if(StringUtils.isEmpty(domain)){ + this.invalidationParamsException("域名不能为空"); + } + + BusMerchantVo bcv = this.baseMapper.selectVoById(merId); + + if(bcv == null){ + this.invalidationParamsException("商户ID无效"); + } + + if(checkType.intValue() == 2){ + + MerInvoiceAddress invoiceAddress = new MerInvoiceAddress(); + invoiceAddress.setMerId(bcv.getId()); + invoiceAddress.setMerNo(bcv.getNo()); + invoiceAddress.setBankCard(bcv.getBankCard()); + invoiceAddress.setHeader(bcv.getName()); + invoiceAddress.setBankAddress(bcv.getKhd()); + invoiceAddress.setNsrSbh(bcv.getInvoceCreditCode()); + invoiceAddress.setUnitAddress(bcv.getInvoceAddress()); + invoiceAddress.setUnitPhone(bcv.getInvoceDwdh()); + this.merInvoiceAddressMapper.insert(invoiceAddress); + + + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(merId); + remoteUserBo.setBusNo(bcv.getNo()); + remoteUserBo.setRoleId(BusRole.MERCHANT.getId()); + remoteUserBo.setRoleName(BusRole.MERCHANT.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bcv.getName()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bcv.getWtrSjh()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("M"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addBusUser(remoteUserBo); + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.MERCHANT.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(domain,remoteUserBo.getPhonenumber(), SmsType.UNIT_OPEN,smsMap); + } + + BusMerchant busMerchant = new BusMerchant(); + busMerchant.setVerifyStatus(checkType); + busMerchant.setVerifyReason(reason); + busMerchant.setVerifyTime(new Date()); + busMerchant.setVerifyBy(LoginHelper.getUserId()+""); + busMerchant.setId(merId); + this.baseMapper.updateById(busMerchant); + return true; + } + + + private void addBusUser(RemoteUserBo remoteUserBo) { + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("M"+StringUtils.randmNumber(5)); + this.addBusUser(remoteUserBo); + } + } + @Override + public Integer unbindYwy(Long id, Long ywyId) { + + + if(id == null){ + this.invalidationParamsException("主键ID不能为空"); + } + + + BusMerchant bm = new BusMerchant(); + bm.setYwyId(null); + bm.setSalesmanId(null); + bm.setUpdateBy(LoginHelper.getUserId()); + bm.setUpdateTime(new Date()); + bm.setId(id); + this.baseMapper.setAndUnbindYwy(bm); + return 1; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java new file mode 100644 index 0000000..79b39f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/PubMerchantServiceImpl.java @@ -0,0 +1,169 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.PubMerchantBo; +import org.dromara.payment.merchant.domain.vo.PubMerchantVo; +import org.dromara.payment.merchant.domain.PubMerchant; +import org.dromara.payment.merchant.mapper.PubMerchantMapper; +import org.dromara.payment.merchant.service.IPubMerchantService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户申请表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class PubMerchantServiceImpl implements IPubMerchantService { + + private final PubMerchantMapper baseMapper; + + /** + * 查询商户申请表 + */ + @Override + public PubMerchantVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询商户申请表列表 + */ + @Override + public TableDataInfo queryPageList(PubMerchantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户申请表列表 + */ + @Override + public List queryList(PubMerchantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(PubMerchantBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), PubMerchant::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), PubMerchant::getIndustry, bo.getIndustry()); + lqw.like(StringUtils.isNotBlank(bo.getName()), PubMerchant::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameNc()), PubMerchant::getNameNc, bo.getNameNc()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), PubMerchant::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), PubMerchant::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), PubMerchant::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), PubMerchant::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrZjlx()), PubMerchant::getWtrZjlx, bo.getWtrZjlx()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), PubMerchant::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), PubMerchant::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), PubMerchant::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), PubMerchant::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), PubMerchant::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFrZjlx()), PubMerchant::getFrZjlx, bo.getFrZjlx()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), PubMerchant::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), PubMerchant::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), PubMerchant::getAddress, bo.getAddress()); + lqw.eq(bo.getYyzzBeginDate() != null, PubMerchant::getYyzzBeginDate, bo.getYyzzBeginDate()); + lqw.eq(bo.getYyzzEndDate() != null, PubMerchant::getYyzzEndDate, bo.getYyzzEndDate()); + lqw.eq(StringUtils.isNotBlank(bo.getYyzz()), PubMerchant::getYyzz, bo.getYyzz()); + lqw.eq(bo.getStatus() != null, PubMerchant::getStatus, bo.getStatus()); + lqw.eq(bo.getAddTime() != null, PubMerchant::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), PubMerchant::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), PubMerchant::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, PubMerchant::getEditTime, bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), PubMerchant::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), PubMerchant::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), PubMerchant::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), PubMerchant::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getJbckzhbm()), PubMerchant::getJbckzhbm, bo.getJbckzhbm()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), PubMerchant::getPassage, bo.getPassage()); + lqw.eq(bo.getFrCardidBeginDate() != null, PubMerchant::getFrCardidBeginDate, bo.getFrCardidBeginDate()); + lqw.eq(bo.getFrCardidEndDate() != null, PubMerchant::getFrCardidEndDate, bo.getFrCardidEndDate()); + lqw.eq(bo.getJbrCardidBeginDate() != null, PubMerchant::getJbrCardidBeginDate, bo.getJbrCardidBeginDate()); + lqw.eq(bo.getJbrCardidEndDate() != null, PubMerchant::getJbrCardidEndDate, bo.getJbrCardidEndDate()); + lqw.eq(bo.getYwyId() != null, PubMerchant::getYwyId, bo.getYwyId()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceHeader()), PubMerchant::getInvoceHeader, bo.getInvoceHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceCreditCode()), PubMerchant::getInvoceCreditCode, bo.getInvoceCreditCode()); + lqw.like(StringUtils.isNotBlank(bo.getInvoceBankName()), PubMerchant::getInvoceBankName, bo.getInvoceBankName()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceBankCard()), PubMerchant::getInvoceBankCard, bo.getInvoceBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceAddress()), PubMerchant::getInvoceAddress, bo.getInvoceAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceDwdh()), PubMerchant::getInvoceDwdh, bo.getInvoceDwdh()); + lqw.eq(StringUtils.isNotBlank(bo.getFhxkzPic()), PubMerchant::getFhxkzPic, bo.getFhxkzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), PubMerchant::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), PubMerchant::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzzm()), PubMerchant::getJbrSfzzm, bo.getJbrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getJbrSfzfm()), PubMerchant::getJbrSfzfm, bo.getJbrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getMtqjzPic()), PubMerchant::getMtqjzPic, bo.getMtqjzPic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp1Pic()), PubMerchant::getBgzp1Pic, bo.getBgzp1Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getBgzp2Pic()), PubMerchant::getBgzp2Pic, bo.getBgzp2Pic()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjzsxcnh()), PubMerchant::getYwcjzsxcnh, bo.getYwcjzsxcnh()); + lqw.eq(StringUtils.isNotBlank(bo.getYwcjsm()), PubMerchant::getYwcjsm, bo.getYwcjsm()); + lqw.eq(StringUtils.isNotBlank(bo.getFddsqxy()), PubMerchant::getFddsqxy, bo.getFddsqxy()); + lqw.eq(StringUtils.isNotBlank(bo.getTshyxkz()), PubMerchant::getTshyxkz, bo.getTshyxkz()); + lqw.eq(StringUtils.isNotBlank(bo.getLcqrh()), PubMerchant::getLcqrh, bo.getLcqrh()); + lqw.eq(bo.getVerifyStatus() != null, PubMerchant::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(bo.getVerifyTime() != null, PubMerchant::getVerifyTime, bo.getVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), PubMerchant::getVerifyBy, bo.getVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyReason()), PubMerchant::getVerifyReason, bo.getVerifyReason()); + lqw.eq(StringUtils.isNotBlank(bo.getZyyw()), PubMerchant::getZyyw, bo.getZyyw()); + return lqw; + } + + /** + * 新增商户申请表 + */ + @Override + public Boolean insertByBo(PubMerchantBo bo) { + PubMerchant add = MapstructUtils.convert(bo, PubMerchant.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改商户申请表 + */ + @Override + public Boolean updateByBo(PubMerchantBo bo) { + PubMerchant update = MapstructUtils.convert(bo, PubMerchant.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(PubMerchant entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户申请表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java new file mode 100644 index 0000000..2f9bb3d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillDayServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.VMerchantBillDayBo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillDayVo; +import org.dromara.payment.merchant.domain.VMerchantBillDay; +import org.dromara.payment.merchant.mapper.VMerchantBillDayMapper; +import org.dromara.payment.merchant.service.IVMerchantBillDayService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户日账单汇总表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class VMerchantBillDayServiceImpl implements IVMerchantBillDayService { + + private final VMerchantBillDayMapper baseMapper; + + /** + * 查询商户日账单汇总表 + */ + @Override + public VMerchantBillDayVo queryById(Long merId){ + return baseMapper.selectVoById(merId); + } + + /** + * 查询商户日账单汇总表列表 + */ + @Override + public TableDataInfo queryPageList(VMerchantBillDayBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户日账单汇总表列表 + */ + @Override + public List queryList(VMerchantBillDayBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(VMerchantBillDayBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), VMerchantBillDay::getMerNo, bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), VMerchantBillDay::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), VMerchantBillDay::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, VMerchantBillDay::getOpId, bo.getOpId()); + lqw.eq(bo.getChannelId() != null, VMerchantBillDay::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), VMerchantBillDay::getChannelNo, bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), VMerchantBillDay::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getDayTranNum() != null, VMerchantBillDay::getDayTranNum, bo.getDayTranNum()); + lqw.eq(bo.getDayTranMoney() != null, VMerchantBillDay::getDayTranMoney, bo.getDayTranMoney()); + return lqw; + } + + /** + * 新增商户日账单汇总表 + */ + @Override + public Boolean insertByBo(VMerchantBillDayBo bo) { + VMerchantBillDay add = MapstructUtils.convert(bo, VMerchantBillDay.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setMerId(add.getMerId()); + } + return flag; + } + + /** + * 修改商户日账单汇总表 + */ + @Override + public Boolean updateByBo(VMerchantBillDayBo bo) { + VMerchantBillDay update = MapstructUtils.convert(bo, VMerchantBillDay.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(VMerchantBillDay entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户日账单汇总表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java new file mode 100644 index 0000000..6918082 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/merchant/service/impl/VMerchantBillServiceImpl.java @@ -0,0 +1,122 @@ +package org.dromara.payment.merchant.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.merchant.domain.bo.VMerchantBillBo; +import org.dromara.payment.merchant.domain.vo.VMerchantBillVo; +import org.dromara.payment.merchant.domain.VMerchantBill; +import org.dromara.payment.merchant.mapper.VMerchantBillMapper; +import org.dromara.payment.merchant.service.IVMerchantBillService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 商户账单汇总表Service业务层处理 + * + * @author LionLi + * @date 2024-04-03 + */ +@RequiredArgsConstructor +@Service +public class VMerchantBillServiceImpl implements IVMerchantBillService { + + private final VMerchantBillMapper baseMapper; + + /** + * 查询商户账单汇总表 + */ + @Override + public VMerchantBillVo queryById(Long merId){ + return baseMapper.selectVoById(merId); + } + + /** + * 查询商户账单汇总表列表 + */ + @Override + public TableDataInfo queryPageList(VMerchantBillBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询商户账单汇总表列表 + */ + @Override + public List queryList(VMerchantBillBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(VMerchantBillBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), VMerchantBill::getMerNo, bo.getMerNo()); + lqw.eq(bo.getSydId() != null, VMerchantBill::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), VMerchantBill::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), VMerchantBill::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, VMerchantBill::getOpId, bo.getOpId()); + lqw.eq(bo.getChannelId() != null, VMerchantBill::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), VMerchantBill::getChannelNo, bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), VMerchantBill::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getDayTranNum() != null, VMerchantBill::getDayTranNum, bo.getDayTranNum()); + lqw.eq(bo.getDayTranMoney() != null, VMerchantBill::getDayTranMoney, bo.getDayTranMoney()); + lqw.eq(bo.getMonthTranNum() != null, VMerchantBill::getMonthTranNum, bo.getMonthTranNum()); + lqw.eq(bo.getMonthTranMoney() != null, VMerchantBill::getMonthTranMoney, bo.getMonthTranMoney()); + lqw.eq(bo.getYearTranNum() != null, VMerchantBill::getYearTranNum, bo.getYearTranNum()); + lqw.eq(bo.getYearTranMoney() != null, VMerchantBill::getYearTranMoney, bo.getYearTranMoney()); + return lqw; + } + + /** + * 新增商户账单汇总表 + */ + @Override + public Boolean insertByBo(VMerchantBillBo bo) { + VMerchantBill add = MapstructUtils.convert(bo, VMerchantBill.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setMerId(add.getMerId()); + } + return flag; + } + + /** + * 修改商户账单汇总表 + */ + @Override + public Boolean updateByBo(VMerchantBillBo bo) { + VMerchantBill update = MapstructUtils.convert(bo, VMerchantBill.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(VMerchantBill entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除商户账单汇总表 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java new file mode 100644 index 0000000..b9af600 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAccountController.java @@ -0,0 +1,136 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商资金账户 + * 前端访问路由地址为:/payment/operatorAccount + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorAccount") +public class BusOperatorAccountController extends BaseController { + + private final IBusOperatorAccountService busOperatorAccountService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询运营商资金账户列表 + */ + @SaCheckPermission("payment:operatorAccount:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorAccountBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + TableDataInfo rtn = busOperatorAccountService.queryPageList(bo, pageQuery); + return rtn; + } + + + + @GetMapping("/listFp") + @Log(title = "结算账户分配查询", businessType = BusinessType.EXPORT) + public R getQueryList(BusOperatorAccountBo bo, PageQuery pageQuery){ + return R.ok(this.busOperatorAccountService.queryListFp(bo,pageQuery)); + } + + + @PostMapping("/createXn") + @Log(title = "创建运营商虚拟户", businessType = BusinessType.INSERT) + public R createXnAccount(Long sydId,Long opId,String opName,String bankType){ + return R.ok(this.busOperatorAccountService.createXnAccount(sydId,opId,opName,bankType)); + } + + + /** + * 导出运营商资金账户列表 + */ + @SaCheckPermission("payment:operatorAccount:export") + @Log(title = "运营商资金账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorAccountBo bo, HttpServletResponse response) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + List list = busOperatorAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商资金账户", BusOperatorAccountVo.class, response); + } + + /** + * 获取运营商资金账户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorAccountService.queryById(id)); + } + + /** + * 新增运营商资金账户 + */ + @SaCheckPermission("payment:operatorAccount:add") + @Log(title = "运营商资金账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorAccountBo bo) { + return toAjax(busOperatorAccountService.insertByBo(bo)); + } + + /** + * 修改运营商资金账户 + */ + @SaCheckPermission("payment:operatorAccount:edit") + @Log(title = "运营商资金账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorAccountBo bo) { + return toAjax(busOperatorAccountService.updateByBo(bo)); + } + + /** + * 删除运营商资金账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorAccount:remove") + @Log(title = "运营商资金账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java new file mode 100644 index 0000000..9f05d6b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorAgreementController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAgreementBo; +import org.dromara.payment.operator.service.IBusOperatorAgreementService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商协议 + * 前端访问路由地址为:/payment/operatorAgreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorAgreement") +public class BusOperatorAgreementController extends BaseController { + + private final IBusOperatorAgreementService busOperatorAgreementService; + + /** + * 查询运营商协议列表 + */ + @SaCheckPermission("payment:operatorAgreement:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorAgreementBo bo, PageQuery pageQuery) { + return busOperatorAgreementService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商协议列表 + */ + @SaCheckPermission("payment:operatorAgreement:export") + @Log(title = "运营商协议", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorAgreementBo bo, HttpServletResponse response) { + List list = busOperatorAgreementService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商协议", BusOperatorAgreementVo.class, response); + } + + /** + * 获取运营商协议详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorAgreement:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorAgreementService.queryById(id)); + } + + /** + * 新增运营商协议 + */ + @SaCheckPermission("payment:operatorAgreement:add") + @Log(title = "运营商协议", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorAgreementBo bo) { + return toAjax(busOperatorAgreementService.insertByBo(bo)); + } + + /** + * 修改运营商协议 + */ + @SaCheckPermission("payment:operatorAgreement:edit") + @Log(title = "运营商协议", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorAgreementBo bo) { + return toAjax(busOperatorAgreementService.updateByBo(bo)); + } + + /** + * 删除运营商协议 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorAgreement:remove") + @Log(title = "运营商协议", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorAgreementService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java new file mode 100644 index 0000000..5b069df --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorCashoutController.java @@ -0,0 +1,154 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.bo.BusOperatorCashoutBo; +import org.dromara.payment.operator.service.IBusOperatorCashoutService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商提现记录 + * 前端访问路由地址为:/payment/operatorCashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorCashout") +public class BusOperatorCashoutController extends BaseController { + + private final IBusOperatorCashoutService busOperatorCashoutService; + + private final IBusOperatorAccountService operatorAccountService; + + private void bindDataPermission(BusOperatorCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + if(loginUser.getCurRoleId() == BusRole.OPERATOR.getId()){ + bo.setOpId(loginUser.getBusId()); + } + } + + /** + * 查询运营商提现记录列表 + */ + @SaCheckPermission("payment:operatorCashout:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorCashoutBo bo, PageQuery pageQuery) { + bindDataPermission(bo); + return busOperatorCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商提现记录列表 + */ + @SaCheckPermission("payment:operatorCashout:export") + @Log(title = "运营商提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorCashoutBo bo, HttpServletResponse response) { + bindDataPermission(bo); + List list = busOperatorCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商提现记录", BusOperatorCashoutVo.class, response); + } + + /** + * 获取运营商提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorCashoutService.queryById(id)); + } + + /** + * 获取运营商提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(operatorAccountService.getCashoutAccount(id)); + } + + /** + * 新增运营商提现记录 + */ +// @SaCheckPermission("payment:operatorCashout:add") + @Log(title = "运营商提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(busOperatorCashoutService.insertByBo(bo)); + } + + /** + * 审批运营商提现记录 + */ + @Log(title = "审批运营商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/verifyCashout") + public R verifyCashout(@Positive(message = "提现记录id无效") long id,@Positive(message = "审核是否通过无效") long verifyStatus,String verifyReason) { + LoginUser loginUser = LoginHelper.getLoginUser(); + BusOperatorCashoutBo bo = new BusOperatorCashoutBo(); + bo.setId(id); + bo.setVerifyStatus(verifyStatus); + bo.setVerifyReason(verifyReason); + bo.setVerifyBy(loginUser.getNickname()); + return toAjax(busOperatorCashoutService.verifyCashout(bo)); + } + + /** + * 修改运营商提现记录 + */ + @SaCheckPermission("payment:operatorCashout:edit") + @Log(title = "运营商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorCashoutBo bo) { + return toAjax(busOperatorCashoutService.updateByBo(bo)); + } + + /** + * 删除运营商提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorCashout:remove") + @Log(title = "运营商提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java new file mode 100644 index 0000000..af72af8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorController.java @@ -0,0 +1,129 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.service.IBusOperatorService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商 + * 前端访问路由地址为:/payment/operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operator") +public class BusOperatorController extends BaseController { + + private final IBusOperatorService busOperatorService; + + /** + * 查询运营商列表 + */ + @SaCheckPermission("payment:operator:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorBo bo, PageQuery pageQuery) { + return busOperatorService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商列表 + */ + @SaCheckPermission("payment:operator:export") + @Log(title = "运营商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorBo bo, HttpServletResponse response) { + List list = busOperatorService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商", BusOperatorVo.class, response); + } + + /** + * 获取运营商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operator:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorService.queryById(id)); + } + + /** + * 新增运营商 + */ + @SaCheckPermission("payment:operator:add") + @Log(title = "运营商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setCreateBy(loginUser.getUserId()); + return toAjax(busOperatorService.insertByBo(bo)); + } + + /** + * 修改运营商 + */ + @SaCheckPermission("payment:operator:edit") + @Log(title = "运营商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setUpdateBy(loginUser.getUserId()); + return toAjax(busOperatorService.updateByBo(bo)); + } + + /** + * 删除运营商 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operator:remove") + @Log(title = "运营商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorService.deleteWithValidByIds(List.of(ids), true)); + } + + + /**** + * 得到运营商的银行信息 + * @return + */ + @GetMapping("/getBank") + @Log(title = "获取运营商的公户银行信息", businessType = BusinessType.DELETE) + public R getOperatorBankInfo(){ + BusOperatorVo resultVo = new BusOperatorVo(); + BusOperatorVo operatorVo = this.busOperatorService.queryById(LoginHelper.getBusId()); + resultVo.setBankCard(operatorVo.getBankCard()); + resultVo.setKhd(operatorVo.getKhd()); + return R.ok(resultVo); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java new file mode 100644 index 0000000..e506645 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorFlowsController.java @@ -0,0 +1,119 @@ +package org.dromara.payment.operator.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.domain.bo.BusOperatorFlowsBo; +import org.dromara.payment.operator.service.IBusOperatorFlowsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商流水 + * 前端访问路由地址为:/payment/operatorFlows + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorFlows") +public class BusOperatorFlowsController extends BaseController { + + private final IBusOperatorFlowsService busOperatorFlowsService; + + /** + * 查询运营商流水列表 + */ + @SaCheckPermission("payment:operatorFlows:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorFlowsBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + return busOperatorFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出运营商流水列表 + */ + @SaCheckPermission("payment:operatorFlows:export") + @Log(title = "运营商流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorFlowsBo bo, HttpServletResponse response,String fields) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setOpId(loginUser.getBusId()); + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + List list = busOperatorFlowsService.queryList(bo); + ExcelUtil.exportExcelInclude(list, "运营商流水", BusOperatorFlowsVo.class, response,fieldList); + } + + /** + * 获取运营商流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorFlowsService.queryById(id)); + } + + /** + * 新增运营商流水 + */ + @SaCheckPermission("payment:operatorFlows:add") + @Log(title = "运营商流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorFlowsBo bo) { + return toAjax(busOperatorFlowsService.insertByBo(bo)); + } + + /** + * 修改运营商流水 + */ + @SaCheckPermission("payment:operatorFlows:edit") + @Log(title = "运营商流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorFlowsBo bo) { + return toAjax(busOperatorFlowsService.updateByBo(bo)); + } + + /** + * 删除运营商流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorFlows:remove") + @Log(title = "运营商流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java new file mode 100644 index 0000000..e9cac45 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/BusOperatorProductController.java @@ -0,0 +1,134 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.payment.operator.domain.bo.BusOperatorProductBo; +import org.dromara.payment.operator.service.IBusOperatorProductService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 运营商产品 + * 前端访问路由地址为:/payment/operatorProduct + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operatorProduct") +public class BusOperatorProductController extends BaseController { + + private final IBusOperatorProductService busOperatorProductService; + + /** + * 查询运营商产品列表 + */ + @SaCheckPermission("payment:operatorProduct:list") + @GetMapping("/list") + public TableDataInfo list(BusOperatorProductBo bo, PageQuery pageQuery) { + return busOperatorProductService.queryPageList(bo, pageQuery); + } + + + + /** + * 查询运营商产品列表 + */ + @SaCheckPermission("payment:operatorProduct:list") + @GetMapping("/listNew") + public TableDataInfo listNew(BusOperatorProductBo bo, PageQuery pageQuery) { + return busOperatorProductService.queryPageListNew(bo, pageQuery); + } + + + + + + + /** + * 导出运营商产品列表 + */ + @SaCheckPermission("payment:operatorProduct:export") + @Log(title = "运营商产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusOperatorProductBo bo, HttpServletResponse response) { + List list = busOperatorProductService.queryList(bo); + ExcelUtil.exportExcel(list, "运营商产品", BusOperatorProductVo.class, response); + } + + /** + * 获取运营商产品详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:operatorProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busOperatorProductService.queryById(id)); + } + + /** + * 新增运营商产品 + */ + @SaCheckPermission("payment:operatorProduct:add") + @Log(title = "运营商产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusOperatorProductBo bo) { + return toAjax(busOperatorProductService.insertByBo(bo)); + } + + /** + * 修改运营商产品 + */ + @SaCheckPermission("payment:operatorProduct:edit") + @Log(title = "运营商产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusOperatorProductBo bo) { + return toAjax(busOperatorProductService.updateByBo(bo)); + } + + /** + * 删除运营商产品 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:operatorProduct:remove") + @Log(title = "运营商产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busOperatorProductService.deleteWithValidByIds(List.of(ids), true)); + } + + @Log(title = "给运营商分配产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/allocOperatorProduct") + public R allocOperatorProduct(@Validated() @RequestBody AllocOperatorProductBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setCreateBy(loginUser.getUserId()); + return toAjax(busOperatorProductService.allocOperatorProduct(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java new file mode 100644 index 0000000..bbf6327 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/controller/ReProductInvoiceController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.operator.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.operator.service.IReProductInvoiceService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 产品开票类目 + * 前端访问路由地址为:/payment/productInvoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/productInvoice") +public class ReProductInvoiceController extends BaseController { + + private final IReProductInvoiceService reProductInvoiceService; + + /** + * 查询产品开票类目列表 + */ + @SaCheckPermission("payment:productInvoice:list") + @GetMapping("/list") + public TableDataInfo list(ReProductInvoiceBo bo, PageQuery pageQuery) { + return reProductInvoiceService.queryPageList(bo, pageQuery); + } + + /** + * 导出产品开票类目列表 + */ + @SaCheckPermission("payment:productInvoice:export") + @Log(title = "产品开票类目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ReProductInvoiceBo bo, HttpServletResponse response) { + List list = reProductInvoiceService.queryList(bo); + ExcelUtil.exportExcel(list, "产品开票类目", ReProductInvoiceVo.class, response); + } + + /** + * 获取产品开票类目详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:productInvoice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(reProductInvoiceService.queryById(id)); + } + + /** + * 新增产品开票类目 + */ + @SaCheckPermission("payment:productInvoice:add") + @Log(title = "产品开票类目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ReProductInvoiceBo bo) { + return toAjax(reProductInvoiceService.insertByBo(bo)); + } + + /** + * 修改产品开票类目 + */ + @SaCheckPermission("payment:productInvoice:edit") + @Log(title = "产品开票类目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ReProductInvoiceBo bo) { + return toAjax(reProductInvoiceService.updateByBo(bo)); + } + + /** + * 删除产品开票类目 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:productInvoice:remove") + @Log(title = "产品开票类目", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(reProductInvoiceService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java new file mode 100644 index 0000000..40a4cf3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperator.java @@ -0,0 +1,206 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator") +public class BusOperator extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.INPUT) + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + private Integer dwType; + + /** + * 运营商名称 + */ + private String name; + + /** + * 统一社会信用代码 + */ + private String nsrSbh; + + /** + * 法人姓名 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frSfz; + + /** + * 法人手机号 + */ + private String frSjh; + + /** + * 经办人姓名 + */ + private String wtr; + + /** + * 经办人手机号 + */ + private String wtrSjh; + + /** + * 经办人身份证 + */ + private String wtrSfz; + + /** + * 经办人邮件 + */ + private String wtrEmail; + + /** + * 所属行政区编码 + */ + private String unitArea; + + /** + * 行政区名称 + */ + private String unitAreaName; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 开户名 + */ + private String khm; + + /** + * 开户账号 + */ + private String bankCard; + + /** + * 开户支行 + */ + private String khd; + + /** + * 开户行 + */ + private String khh; + + /** + * 开户行行号/银联号 + */ + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + private String frSfzzm; + + /** + * 法人身份证反面 + */ + private String frSfzfm; + + /** + * 银行卡正面 + */ + private String bankZm; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + private Long status; + + /** + * 发票抬头 + */ + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + private String invoceAddress; + + /** + * 发票单位电话 + */ + private String invoceDwdh; + + private String yyzz; + + private String khxkz; + + private String jbrSfzzm; + + private String jbrSfzfm; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java new file mode 100644 index 0000000..cd88962 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAccount.java @@ -0,0 +1,139 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商资金账户对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_account") +public class BusOperatorAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusOperatorAccount() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param sydId + * @param accId + * @param bankType + * @param bankCard + * @param balance + * @param frozen + * @param isDefault + * @param addTime + */ + + public BusOperatorAccount(Long id,Long sydId, Long accId,String bankType, String bankCard, Long balance, Long frozen, + Long isDefault, Date addTime,String name,String khh,String lhh) { + super(); + this.opId = id; + this.sydId = sydId; + this.accId = accId; + this.bankType = bankType; + this.bankVirtualCard = bankCard; + this.balance = balance; + this.frozen = frozen; + this.isDefault = isDefault; + this.addTime = addTime; + this.name = name; + this.khh = khh; + this.lhh = lhh; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 运营商id + */ + private Long opId; + + private String name; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行虚拟账号 + */ + private String bankVirtualCard; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 冻结金额(分) + */ + private Long frozen; + + /** + * 已提现金额(分) + */ + private Long cashout; + + /** + * 提现中金额(分) + */ + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + //开户行 + private String khh; + + //联行号 + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java new file mode 100644 index 0000000..f779781 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorAgreement.java @@ -0,0 +1,76 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 运营商协议对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_agreement") +public class BusOperatorAgreement extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + private Integer signStyle; + + /** + * 协议标题 + */ + private String title; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + private Integer status; + + /** + * 协议链接 + */ + private String fileUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java new file mode 100644 index 0000000..bf12ac5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorCashout.java @@ -0,0 +1,158 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商提现记录对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_cashout") +public class BusOperatorCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 快递公司(字典值) + */ + private String iogisticsCompany; + + /** + * 快递单号 + */ + private String iogisticsNo; + + /** + * 发票图片 + */ + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java new file mode 100644 index 0000000..ea350e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorFlows.java @@ -0,0 +1,216 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 运营商流水对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_flows") +public class BusOperatorFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public BusOperatorFlows(){} + + public BusOperatorFlows(Integer direction,Long opId, Integer busType, String channel, String busNo, String bankNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, String tranNo, Integer tranType, Integer tranStatus, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark, Integer payReceiptType) { + this.opId = opId; + this.busType = busType; + this.channel = channel; + this.busNo = busNo; + this.bankNo = bankNo; + this.money = money; + this.direction = direction; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranNo = tranNo; + this.tranType = tranType; + this.tranStatus = tranStatus; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + this.payReceiptType = payReceiptType; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 运营商id + */ + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 流水方向(1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java new file mode 100644 index 0000000..c4d6d54 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/BusOperatorProduct.java @@ -0,0 +1,107 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 运营商产品对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_operator_product") +public class BusOperatorProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 服务商服务费率(%) + */ + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + private Integer proStatus; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java new file mode 100644 index 0000000..cf749f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/ReProductInvoice.java @@ -0,0 +1,61 @@ +package org.dromara.payment.operator.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 产品开票类目对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("re_product_invoice") +public class ReProductInvoice extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + private Long proType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + private Long invoiceTypeId; + + /** + * 业务id(结算中心id或运营商id) + */ + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java new file mode 100644 index 0000000..d7bb52b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/AllocOperatorProductBo.java @@ -0,0 +1,18 @@ +package org.dromara.payment.operator.domain.bo; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorProductVo; + +import java.util.List; + +/** + * 运营商分配产品业务对象 + */ +@Data +public class AllocOperatorProductBo extends BaseEntity { + + @NotEmpty(message = "产品列表不能为空") + private List products; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java new file mode 100644 index 0000000..e4edf52 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAccountBo.java @@ -0,0 +1,120 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商资金账户业务对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorAccount.class, reverseConvertGenerate = false) +public class BusOperatorAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行虚拟账号 + */ + @NotBlank(message = "银行虚拟账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankVirtualCard; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额(分) + */ + @NotNull(message = "冻结金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 已提现金额(分) + */ + @NotNull(message = "已提现金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cashout; + + /** + * 提现中金额(分) + */ + @NotNull(message = "提现中金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + + private String name; + + //开户行 + private String khh; + + //联行号 + private String lhh; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java new file mode 100644 index 0000000..18f86c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorAgreementBo.java @@ -0,0 +1,84 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 运营商协议业务对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorAgreement.class, reverseConvertGenerate = false) +public class BusOperatorAgreementBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @NotNull(message = "协议类型(1:线上 2:线下)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStyle; + + /** + * 协议标题 + */ + @NotBlank(message = "协议标题不能为空", groups = { AddGroup.class, EditGroup.class }) + private String title; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @NotNull(message = "签约状态(1:签约成功 2:签约失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 协议链接 + */ + @NotBlank(message = "协议链接不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java new file mode 100644 index 0000000..8fe7b07 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorBo.java @@ -0,0 +1,239 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商业务对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperator.class, reverseConvertGenerate = false) +public class BusOperatorBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + //@NotBlank(message = "运营商编号(示例:A10049)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + @NotNull(message = "运营商类型(1:企业,:2:个人)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer dwType; + + /** + * 运营商名称 + */ + @NotBlank(message = "运营商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 统一社会信用代码 + */ + @NotBlank(message = "统一社会信用代码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人姓名 + */ + @NotBlank(message = "法人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfz; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSjh; + + /** + * 经办人姓名 + */ + @NotBlank(message = "经办人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtr; + + /** + * 经办人手机号 + */ + @NotBlank(message = "经办人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSjh; + + /** + * 经办人身份证 + */ + @NotBlank(message = "经办人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrSfz; + + /** + * 经办人邮件 + */ + @NotBlank(message = "经办人邮件不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @NotBlank(message = "所属行政区编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitArea; + + /** + * 行政区名称 + */ + @NotBlank(message = "行政区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unitAreaName; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 开户名 + */ + @NotBlank(message = "开户名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khm; + + /** + * 开户账号 + */ + @NotBlank(message = "开户账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 开户支行 + */ + @NotBlank(message = "开户支行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khh; + + /** + * 开户行行号/银联号 + */ + @NotBlank(message = "开户行行号/银联号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ +// @NotBlank(message = "支付宝登录号(支持邮箱和手机号格式)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @NotBlank(message = "法人身份证正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @NotBlank(message = "法人身份证反面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frSfzfm; + + /** + * 银行卡正面 + */ +// @NotBlank(message = "银行卡正面不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankZm; + + /** + * 支付密码 + */ + //@NotBlank(message = "支付密码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payPassword; + + /** + * 密码输入错误次数 + */ + //@NotNull(message = "密码输入错误次数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + //@NotNull(message = "密码冻结结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + //@NotNull(message = "状态(0:禁用 1:启用 )不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 发票抬头 + */ + @NotBlank(message = "发票抬头不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @NotBlank(message = "发票纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @NotBlank(message = "发票开户银行名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @NotBlank(message = "发票开户银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @NotBlank(message = "发票单位注册地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceAddress; + + /** + * 发票单位电话 + */ + @NotBlank(message = "发票单位电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoceDwdh; + + + private String domain; + + private String yyzz; + + private String khxkz; + + private String jbrSfzzm; + + private String jbrSfzfm; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java new file mode 100644 index 0000000..e0852a9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorCashoutBo.java @@ -0,0 +1,166 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商提现记录业务对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorCashout.class, reverseConvertGenerate = false) +public class BusOperatorCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商账户id + */ + @NotNull(message = "运营商账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + private Long verifyStatus; + + /** + * 审核时间 + */ + private Date verifyTime; + + /** + * 审核人 + */ + private String verifyBy; + + /** + * 驳回原因 + */ + private String verifyReason; + + /** + * 快递公司(字典值) + */ + @NotBlank(message = "快递公司(字典值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String iogisticsCompany; + + /** + * 快递单号 + */ + @NotBlank(message = "快递单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String iogisticsNo; + + /** + * 发票图片 + */ + @NotBlank(message = "发票图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ + @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java new file mode 100644 index 0000000..b3c190b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorFlowsBo.java @@ -0,0 +1,206 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 运营商流水业务对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorFlows.class, reverseConvertGenerate = false) +public class BusOperatorFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @NotBlank(message = "支付通道(招行,交行,手动)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @NotBlank(message = "三方流水号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易订单号 + */ + @NotBlank(message = "交易订单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @NotNull(message = "交易状态(2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 回执单地址 + */ + @NotBlank(message = "回执单地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @NotNull(message = "回执单类型(1:B2B 2:B2C)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java new file mode 100644 index 0000000..ccd621d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/BusOperatorProductBo.java @@ -0,0 +1,123 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 运营商产品业务对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusOperatorProduct.class, reverseConvertGenerate = false) +public class BusOperatorProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String proNo; + + /** + * 产品id + */ + @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long proId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 服务商服务费率(%) + */ + @NotNull(message = "服务商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + @NotNull(message = "运营商服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式(1:个人应得计费、2:开票金额计费)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式(1:到卡 2:余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @NotBlank(message = "开票类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @NotNull(message = "状态(1:上架 2:下架)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer proStatus; + + + private String sydName; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java new file mode 100644 index 0000000..85d07b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/bo/ReProductInvoiceBo.java @@ -0,0 +1,64 @@ +package org.dromara.payment.operator.domain.bo; + +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 产品开票类目业务对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ReProductInvoice.class, reverseConvertGenerate = false) +public class ReProductInvoiceBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + private Long proType; + + /** + * 产品编号 + */ + private String proNo; + + /** + * 产品id + */ + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + @NotNull(message = "开票类目id(mer_invoice_type表id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoiceTypeId; + + @NotNull(message = "开票类目名称(mer_invoice_type表type)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceTypeName; + + /** + * 业务id(结算中心id或运营商id) + */ + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java new file mode 100644 index 0000000..7934b9b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAccountVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商资金账户Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorAccountVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java new file mode 100644 index 0000000..c64d083 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorAgreementVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorAgreementVo; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商协议Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorAgreementVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java new file mode 100644 index 0000000..146150d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorCashoutVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorCashoutVo; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商提现记录Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorCashoutVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java new file mode 100644 index 0000000..4d48868 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorFlowsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorFlowsVo; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商流水Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorFlowsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java new file mode 100644 index 0000000..9f1ed73 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorProductVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorProductVo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商产品Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorProductVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java new file mode 100644 index 0000000..5603fbf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/BusOperatorVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 运营商Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface BusOperatorVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java new file mode 100644 index 0000000..ae5bfa8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/convert/ReProductInvoiceVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.operator.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.operator.domain.RemoteReProductInvoiceVo; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 产品开票类目Convert接口 + * + * @author LionLi + * @date 2024-03-28 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface ReProductInvoiceVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java new file mode 100644 index 0000000..8a60da9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAccountVo.java @@ -0,0 +1,173 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商资金账户视图对象 bus_operator_account + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorAccount.class) +public class BusOperatorAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行虚拟账号 + */ + @ExcelProperty(value = "银行虚拟账号") + private String bankVirtualCard; + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long balance; + + /** + * 冻结金额(分) + */ + @ExcelProperty(value = "冻结金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long frozen; + + /** + * 已提现金额(分) + */ + @ExcelProperty(value = "已提现金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long cashout; + + /** + * 提现中金额(分) + */ + @ExcelProperty(value = "提现中金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long cashouting; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 归属账户方 + */ + private String accName; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + + /** + * 附属企业名称 + */ + @ExcelProperty(value = "附属企业名称") + private String sydName; + + /** + * 附属企业编号 + */ + @ExcelProperty(value = "附属企业编号") + private String sydNo; + + + private String opName; + + //虚拟户名 + private String name; + + + //开户行 + private String khh; + + //联行号 + private String lhh; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java new file mode 100644 index 0000000..c8d223d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorAgreementVo.java @@ -0,0 +1,94 @@ +package org.dromara.payment.operator.domain.vo; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商协议视图对象 bus_operator_agreement + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorAgreement.class) +public class BusOperatorAgreementVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 协议类型(1:线上 2:线下) + */ + @ExcelProperty(value = "协议类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:线上,2=:线下") + private Integer signStyle; + + /** + * 协议标题 + */ + @ExcelProperty(value = "协议标题") + private String title; + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String no; + + /** + * 签约状态(1:签约成功 2:签约失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:签约成功,2=:签约失败") + private Integer status; + + /** + * 协议链接 + */ + @ExcelProperty(value = "协议链接") + private String fileUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java new file mode 100644 index 0000000..025c444 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorCashoutVo.java @@ -0,0 +1,217 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商提现记录视图对象 bus_operator_cashout + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorCashout.class) +public class BusOperatorCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 运营商账户id + */ + @ExcelProperty(value = "运营商账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 审核状态(0:待审核、1:驳回、2:审核通过) + */ + @ExcelProperty(value = "审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待审核、1:驳回、2:审核通过") + private Long verifyStatus; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date verifyTime; + + /** + * 审核人 + */ + @ExcelProperty(value = "审核人") + private String verifyBy; + + /** + * 驳回原因 + */ + @ExcelProperty(value = "驳回原因") + private String verifyReason; + + /** + * 快递公司(字典值) + */ + @ExcelProperty(value = "快递公司", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典值") + private String iogisticsCompany; + + /** + * 快递单号 + */ + @ExcelProperty(value = "快递单号") + private String iogisticsNo; + + /** + * 发票图片 + */ + @ExcelProperty(value = "发票图片") + private String invoicePic; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + /** + * 运营商名称 + */ + @ExcelProperty(value = "运营商名称") + private String opName; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 服务商名称 + */ + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 服务商编号 + */ + @ExcelProperty(value = "服务商编号") + private String sydNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java new file mode 100644 index 0000000..73cbdb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorFlowsVo.java @@ -0,0 +1,249 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商流水视图对象 bus_operator_flows + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorFlows.class) +public class BusOperatorFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 交易时间 + */ + @ExcelProperty(value = "创建时间") + private Date addTime; + + /** + * 账单批次号 + */ + @ExcelProperty(value = "代发批次号") + private String billNo; + + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号") + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @ExcelProperty(value = "三方流水号") + private String bankNo; + + + /** + * 交易订单号 + */ + @ExcelProperty(value = "交易订单号") + private String tranNo; + + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @ExcelProperty(value = "支付通道") + private String channel; + + + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=转账,2=代发,3=提现,4=退回,5=冻结,6=解冻,7=充值") + private Integer tranType; + + + /** + * 交易金额(分) + */ + @ExcelProperty(value = "交易金额(分)") + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + @ExcelProperty(value = "交易金额") + private String moneyStr; + + + /** + * 交易状态(2:成功 3:失败) + */ + @ExcelProperty(value = "交易状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "2=成功,3=失败") + private Integer tranStatus; + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额(分)") + private Long balance; + + + + /** + * 交易人 + */ + @ExcelProperty(value = "交易人") + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单明细id + */ + @ExcelProperty(value = "账单明细id") + private Long billDetailId; + + + + + + + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payerType; + + /** + * 付款方id + */ + @ExcelProperty(value = "付款方id") + private Long payerId; + + + /** + * 付款方账号id + */ + @ExcelProperty(value = "付款方账号id") + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payeeType; + + /** + * 收款方id + */ + @ExcelProperty(value = "收款方id") + private Long payeeId; + + /** + * 收款方账号id + */ + @ExcelProperty(value = "收款方账号id") + private Long payeeAccId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @ExcelProperty(value = "回执单类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:B2B,2=:B2C") + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java new file mode 100644 index 0000000..d465ce3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorProductVo.java @@ -0,0 +1,147 @@ +package org.dromara.payment.operator.domain.vo; + +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商产品视图对象 bus_operator_product + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperatorProduct.class) +public class BusOperatorProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + + private String sydName; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 服务商服务费率(%) + */ + @ExcelProperty(value = "服务商服务费率(%)") + private BigDecimal costServiceCharge; + + /** + * 运营商服务费率(%) + */ + @ExcelProperty(value = "运营商服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + @ExcelIgnore + private String maxMonthStr; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + /** + * 状态(1:上架 2:下架) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架,2=:下架") + private Integer proStatus; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java new file mode 100644 index 0000000..6616abb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/BusOperatorVo.java @@ -0,0 +1,251 @@ +package org.dromara.payment.operator.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.operator.domain.BusOperator; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 运营商视图对象 bus_operator + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusOperator.class) +public class BusOperatorVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 运营商编号(示例:A10049) + */ + @ExcelProperty(value = "运营商编号(示例:A10049)") + private String no; + + /** + * 运营商类型(1:企业,:2:个人) + */ + @ExcelProperty(value = "运营商类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:企业,:2:个人") + private Integer dwType; + + /** + * 运营商名称 + */ + @ExcelProperty(value = "运营商名称") + private String name; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String nsrSbh; + + /** + * 法人姓名 + */ + @ExcelProperty(value = "法人姓名") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frSfz; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frSjh; + + /** + * 经办人姓名 + */ + @ExcelProperty(value = "经办人姓名") + private String wtr; + + /** + * 经办人手机号 + */ + @ExcelProperty(value = "经办人手机号") + private String wtrSjh; + + /** + * 经办人身份证 + */ + @ExcelProperty(value = "经办人身份证") + private String wtrSfz; + + /** + * 经办人邮件 + */ + @ExcelProperty(value = "经办人邮件") + private String wtrEmail; + + /** + * 所属行政区编码 + */ + @ExcelProperty(value = "所属行政区编码") + private String unitArea; + + /** + * 行政区名称 + */ + @ExcelProperty(value = "行政区名称") + private String unitAreaName; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 开户名 + */ + @ExcelProperty(value = "开户名") + private String khm; + + /** + * 开户账号 + */ + @ExcelProperty(value = "开户账号") + private String bankCard; + + /** + * 开户支行 + */ + @ExcelProperty(value = "开户支行") + private String khd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String khh; + + /** + * 开户行行号/银联号 + */ + @ExcelProperty(value = "开户行行号/银联号") + private String khhNo; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 法人身份证正面 + */ + @ExcelProperty(value = "法人身份证正面") + private String frSfzzm; + + /** + * 法人身份证反面 + */ + @ExcelProperty(value = "法人身份证反面") + private String frSfzfm; + + /** + * 银行卡正面 + */ + @ExcelProperty(value = "银行卡正面") + private String bankZm; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 密码输入错误次数 + */ + @ExcelProperty(value = "密码输入错误次数") + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + @ExcelProperty(value = "密码冻结结束时间") + private Date passFrozenTime; + + /** + * 状态(0:禁用 1:启用 ) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:禁用,1=:启用") + private Long status; + + /** + * 发票抬头 + */ + @ExcelProperty(value = "发票抬头") + private String invoceHeader; + + /** + * 发票纳税人识别号 + */ + @ExcelProperty(value = "发票纳税人识别号") + private String invoceCreditCode; + + /** + * 发票开户银行名称 + */ + @ExcelProperty(value = "发票开户银行名称") + private String invoceBankName; + + /** + * 发票开户银行账号 + */ + @ExcelProperty(value = "发票开户银行账号") + private String invoceBankCard; + + /** + * 发票单位注册地址 + */ + @ExcelProperty(value = "发票单位注册地址") + private String invoceAddress; + + /** + * 发票单位电话 + */ + @ExcelProperty(value = "发票单位电话") + private String invoceDwdh; + + + + private Date createTime; + + private String yyzz; + + private String khxkz; + + private String jbrSfzzm; + + private String jbrSfzfm; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java new file mode 100644 index 0000000..0013bb9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/domain/vo/ReProductInvoiceVo.java @@ -0,0 +1,75 @@ +package org.dromara.payment.operator.domain.vo; + +import org.dromara.payment.operator.domain.ReProductInvoice; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 产品开票类目视图对象 re_product_invoice + * + * @author LionLi + * @date 2024-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ReProductInvoice.class) +public class ReProductInvoiceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册) + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册)") + private Long proType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String proNo; + + /** + * 产品id + */ + @ExcelProperty(value = "产品id") + private Long proId; + + /** + * 开票类目id(mer_invoice_type表id) + */ + @ExcelProperty(value = "开票类目id(mer_invoice_type表id)") + private Long invoiceTypeId; + + /** + * 业务id(结算中心id或运营商id) + */ + @ExcelProperty(value = "业务id(结算中心id或运营商id)") + private Long busId; + + /** + * 业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "6=:服务商,7=:运营商,8=:代理商,9=:商户,1=1:账单批次") + private Integer busType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java new file mode 100644 index 0000000..caafab5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAccountMapper.java @@ -0,0 +1,88 @@ +package org.dromara.payment.operator.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydAccount; + +import java.util.List; + +/** + * 运营商资金账户Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorAccountMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 新增虚拟银行账号 + * @return 结果 + */ + public int insertAccount(BusOperatorAccount account); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId, @Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减已提现金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateCashoutByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减提现申请金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateCashoutingByAccId(@Param("accId") int accId,@Param("amount") long amount); + + + /*** + * 查询运营商不同银行的虚拟户 + * @param bo + * @param page + * @return + */ + public List selectOperatorAccountLists(@Param("bo") BusOperatorAccountBo bo,@Param("page") Page page); + + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java new file mode 100644 index 0000000..902a951 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorAgreementMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.operator.mapper; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运营商协议Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorAgreementMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java new file mode 100644 index 0000000..486ccfb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorCashoutMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.operator.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 运营商提现记录Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorCashoutMapper extends BaseMapperPlus { + Page queryPageList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + List queryList(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java new file mode 100644 index 0000000..1c2ad67 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorFlowsMapper.java @@ -0,0 +1,16 @@ +package org.dromara.payment.operator.mapper; + +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.sys.domain.SysSydFlows; + +/** + * 运营商流水Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorFlowsMapper extends BaseMapperPlus { + public int insertSelective(BusOperatorFlows flow); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java new file mode 100644 index 0000000..2d92a21 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.operator.mapper; + +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 运营商Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java new file mode 100644 index 0000000..1b56499 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/BusOperatorProductMapper.java @@ -0,0 +1,60 @@ +package org.dromara.payment.operator.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 运营商产品Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface BusOperatorProductMapper extends BaseMapperPlus { + /** + * 给运营商分配产品 + * @param bo + * @return + */ + public Integer allocOperatorProduct(AllocOperatorProductBo bo); + + + + + public Integer insertOperatorProduct(AllocOperatorProductBo bo); + /*** + * 根据运营商的信息,查询直接下级代理服务商的最新基本费率 + * @param paraMap + * @return + */ + public List selectChannelProductMin(Map paraMap); + + + /*** + * 更新渠道商的成本费率 + * @param proList + * @return + */ + public Integer updateChannelProCostCharge(List proList); + + + /*** + * 运营商分配产品查询 + * @param page + * @param wrapper + * @param opId + * @return + */ + Page setingOpratorProductList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper,@Param("opId") Long opId); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java new file mode 100644 index 0000000..922455e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/mapper/ReProductInvoiceMapper.java @@ -0,0 +1,30 @@ +package org.dromara.payment.operator.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.Date; +import java.util.List; + +/** + * 产品开票类目Mapper接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface ReProductInvoiceMapper extends BaseMapperPlus { + /** + * 分配产品开票类目 + * @param proIds 产品id列表 + * @param busIds 引用业务id列表(结算中心id或运营商id) + * @param busType 引用业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param newBusId 接收业务id列表(结算中心id或运营商id) + * @param newBusType 接收业务类型(6:服务商 7:运营商 8:代理商 9:商户 11:账单批次) + * @param operBy 操作人id + * @param operTime 操作时间 + * @return + */ + Integer allocProduct(@Param("proIds") List proIds, @Param("busIds") List busIds, @Param("busType") int busType, @Param("newBusId") Long newBusId, @Param("newBusType") int newBusType, @Param("operBy") Long operBy, @Param("operTime") Date operTime); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java new file mode 100644 index 0000000..8a91394 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAccountService.java @@ -0,0 +1,96 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.function.Function; + +/** + * 运营商资金账户Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorAccountService { + + + + public List queryListFp(BusOperatorAccountBo bo, PageQuery pageQuery); + + /** + * 查询运营商资金账户 + */ + BusOperatorAccountVo queryById(Long id); + + /** + * 查询运营商资金账户列表 + */ + TableDataInfo queryPageList(BusOperatorAccountBo bo, PageQuery pageQuery); + + /** + * 查询运营商资金账户列表 + */ + List queryList(BusOperatorAccountBo bo); + + /** + * 新增运营商资金账户 + */ + Boolean insertByBo(BusOperatorAccountBo bo); + + /** + * 修改运营商资金账户 + */ + Boolean updateByBo(BusOperatorAccountBo bo); + + /** + * 校验并批量删除运营商资金账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(int accId,long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(int accId,long amount); + + /** + * 查询运营商提现账户信息 + * @param id 资金账户id + * @return + */ + public BusOperatorAccountVo getCashoutAccount(Long id); + + /*** + * 创建运营商虚拟户 + * @param sydId + * @param opId + * @param opName + * @param bankType + * @return + */ + Boolean createXnAccount(Long sydId, Long opId, String opName, String bankType); + + + + public Boolean creatXNnum(Long sydId, Long unitId, String gsmc, int roleType, int addRoleType, String bankType1, Function saveFun, Function existsFun); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java new file mode 100644 index 0000000..2c6b793 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorAgreementService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.payment.operator.domain.bo.BusOperatorAgreementBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商协议Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorAgreementService { + + /** + * 查询运营商协议 + */ + BusOperatorAgreementVo queryById(Long id); + + /** + * 查询运营商协议列表 + */ + TableDataInfo queryPageList(BusOperatorAgreementBo bo, PageQuery pageQuery); + + /** + * 查询运营商协议列表 + */ + List queryList(BusOperatorAgreementBo bo); + + /** + * 新增运营商协议 + */ + Boolean insertByBo(BusOperatorAgreementBo bo); + + /** + * 修改运营商协议 + */ + Boolean updateByBo(BusOperatorAgreementBo bo); + + /** + * 校验并批量删除运营商协议信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java new file mode 100644 index 0000000..2243ddf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorCashoutService.java @@ -0,0 +1,68 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.channel.domain.bo.BusChannelCashoutBo; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.bo.BusOperatorCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商提现记录Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorCashoutService { + + /** + * 查询运营商提现记录 + */ + BusOperatorCashoutVo queryById(Long id); + + /** + * 查询运营商提现记录列表 + */ + TableDataInfo queryPageList(BusOperatorCashoutBo bo, PageQuery pageQuery); + + /** + * 查询运营商提现记录列表 + */ + List queryList(BusOperatorCashoutBo bo); + + /** + * 新增运营商提现记录 + */ + Boolean insertByBo(BusOperatorCashoutBo bo); + + /** + * 审批运营商提现记录 + * @param bo + * @return + */ + Boolean verifyCashout(BusOperatorCashoutBo bo); + + /** + * 修改运营商提现记录 + */ + Boolean updateByBo(BusOperatorCashoutBo bo); + + /** + * 校验并批量删除运营商提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 运营商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java new file mode 100644 index 0000000..505c4d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorFlowsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.domain.bo.BusOperatorFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商流水Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorFlowsService { + + /** + * 查询运营商流水 + */ + BusOperatorFlowsVo queryById(Long id); + + /** + * 查询运营商流水列表 + */ + TableDataInfo queryPageList(BusOperatorFlowsBo bo, PageQuery pageQuery); + + /** + * 查询运营商流水列表 + */ + List queryList(BusOperatorFlowsBo bo); + + /** + * 新增运营商流水 + */ + Boolean insertByBo(BusOperatorFlowsBo bo); + + /** + * 修改运营商流水 + */ + Boolean updateByBo(BusOperatorFlowsBo bo); + + /** + * 校验并批量删除运营商流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java new file mode 100644 index 0000000..e448861 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorProductService.java @@ -0,0 +1,69 @@ +package org.dromara.payment.operator.service; + +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.payment.operator.domain.bo.BusOperatorProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商产品Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorProductService { + + /** + * 查询运营商产品 + */ + BusOperatorProductVo queryById(Long id); + + /** + * 查询运营商产品列表 + */ + TableDataInfo queryPageList(BusOperatorProductBo bo, PageQuery pageQuery); + + /** + * 查询运营商产品列表 + */ + List queryList(BusOperatorProductBo bo); + + /** + * 新增运营商产品 + */ + Boolean insertByBo(BusOperatorProductBo bo); + + /** + * 修改运营商产品 + */ + Boolean updateByBo(BusOperatorProductBo bo); + + /** + * 校验并批量删除运营商产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /** + * 给运营商分配产品 + * @param bo + * @return + */ + public boolean allocOperatorProduct(AllocOperatorProductBo bo); + + + + TableDataInfo queryPageListNew(BusOperatorProductBo bo, PageQuery pageQuery); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java new file mode 100644 index 0000000..02bcbd1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IBusOperatorService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 运营商Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IBusOperatorService { + + /** + * 查询运营商 + */ + BusOperatorVo queryById(Long id); + + /** + * 查询运营商列表 + */ + TableDataInfo queryPageList(BusOperatorBo bo, PageQuery pageQuery); + + /** + * 查询运营商列表 + */ + List queryList(BusOperatorBo bo); + + /** + * 新增运营商 + */ + Boolean insertByBo(BusOperatorBo bo); + + /** + * 修改运营商 + */ + Boolean updateByBo(BusOperatorBo bo); + + /** + * 校验并批量删除运营商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java new file mode 100644 index 0000000..08b3360 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/IReProductInvoiceService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.operator.service; + +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 产品开票类目Service接口 + * + * @author LionLi + * @date 2024-03-28 + */ +public interface IReProductInvoiceService { + + /** + * 查询产品开票类目 + */ + ReProductInvoiceVo queryById(Long id); + + /** + * 查询产品开票类目列表 + */ + TableDataInfo queryPageList(ReProductInvoiceBo bo, PageQuery pageQuery); + + /** + * 查询产品开票类目列表 + */ + List queryList(ReProductInvoiceBo bo); + + /** + * 新增产品开票类目 + */ + Boolean insertByBo(ReProductInvoiceBo bo); + + /** + * 修改产品开票类目 + */ + Boolean updateByBo(ReProductInvoiceBo bo); + + /** + * 校验并批量删除产品开票类目信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java new file mode 100644 index 0000000..8cef6e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAccountServiceImpl.java @@ -0,0 +1,329 @@ +package org.dromara.payment.operator.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.service.impl.BankAccountServiceTransactionImpl; +import org.dromara.payment.sys.service.impl.SysSydServiceTransactionImpl; +import org.slf4j.Logger; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorAccountBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.function.Function; + +/** + * 运营商资金账户Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class BusOperatorAccountServiceImpl extends BaseService implements IBusOperatorAccountService { + + + private final BusOperatorAccountMapper baseMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusAccountsMapper accountsMapper; + + private final SysSydServiceTransactionImpl transactionImpl; + + private final BankAccountServiceTransactionImpl bankAccountTransactionImpl; + + /** + * 查询运营商资金账户 + */ + @Override + public BusOperatorAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + + + + + @Override + public List queryListFp(BusOperatorAccountBo bo, PageQuery pageQuery){ + if(bo.getOpId() == null){ + this.invalidationParamsException("运营商ID不能为空"); + } + + if(StringUtils.isEmpty(bo.getBankType())){ + this.invalidationParamsException("银行通道不能为空"); + } + return this.baseMapper.selectOperatorAccountLists(bo,pageQuery.build()); + } + + + /** + * 查询运营商资金账户列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorAccountBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper2(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商资金账户列表 + */ + @Override + public List queryList(BusOperatorAccountBo bo) { + QueryWrapper lqw = buildQueryWrapper2(bo); + return baseMapper.queryList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOpId() != null, BusOperatorAccount::getOpId, bo.getOpId()); + lqw.eq(bo.getSydId() != null, BusOperatorAccount::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, BusOperatorAccount::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), BusOperatorAccount::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankVirtualCard()), BusOperatorAccount::getBankVirtualCard, bo.getBankVirtualCard()); + lqw.eq(bo.getBalance() != null, BusOperatorAccount::getBalance, bo.getBalance()); + lqw.eq(bo.getFrozen() != null, BusOperatorAccount::getFrozen, bo.getFrozen()); + lqw.eq(bo.getCashout() != null, BusOperatorAccount::getCashout, bo.getCashout()); + lqw.eq(bo.getCashouting() != null, BusOperatorAccount::getCashouting, bo.getCashouting()); + lqw.eq(bo.getIsDefault() != null, BusOperatorAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, BusOperatorAccount::getAddTime, bo.getAddTime()); + lqw.eq(bo.getStatus() != null, BusOperatorAccount::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), BusOperatorAccount::getOutBankCard, bo.getOutBankCard()); + return lqw; + } + + + private QueryWrapper buildQueryWrapper2(BusOperatorAccountBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = Wrappers.query(); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "t.bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankVirtualCard()), "t.bank_virtual_card", bo.getBankVirtualCard()); + lqw.eq(bo.getBalance() != null, "t.balance", bo.getBalance()); + lqw.eq(bo.getFrozen() != null, "t.frozen", bo.getFrozen()); + lqw.eq(bo.getCashout() != null, "t.cashout", bo.getCashout()); + lqw.eq(bo.getCashouting() != null, "t.cashouting", bo.getCashouting()); + lqw.eq(bo.getIsDefault() != null,"t.is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null,"t.add_time", bo.getAddTime()); + lqw.eq(bo.getStatus() != null, "t.status", bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), "t.out_bank_card", bo.getOutBankCard()); + return lqw; + } + + /** + * 新增运营商资金账户 + */ + @Override + public Boolean insertByBo(BusOperatorAccountBo bo) { + BusOperatorAccount add = MapstructUtils.convert(bo, BusOperatorAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商资金账户 + */ + @Override + public Boolean updateByBo(BusOperatorAccountBo bo) { + BusOperatorAccount update = MapstructUtils.convert(bo, BusOperatorAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商资金账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalanceByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateBalanceByAccId(accId,amount); + Integer curNum = baseMapper.updateBalanceByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozenByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateFrozenByAccId(accId,amount); + Integer curNum = baseMapper.updateFrozenByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public BusOperatorAccountVo getCashoutAccount(Long id) { + BusOperatorAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + BusOperatorVo vo = operatorMapper.selectVoById(rtn.getOpId()); + rtn.setAccName(vo.getKhm()); + rtn.setBankVirtualCard(vo.getBankCard()); + rtn.setKfd(vo.getKhd()); + rtn.setKfh(vo.getKhh()); + rtn.setKhhNo(vo.getKhhNo()); + } + return rtn; + } + + @Override + public Boolean createXnAccount(Long sydId, Long opId, String opName, String bankType) { + + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + if(opId == null){ + this.invalidationParamsException("运营商ID不能为空"); + } + if(StringUtils.isEmpty(opName)){ + this.invalidationParamsException("运营商名称不能为空"); + } + if(StringUtils.isEmpty(bankType)){ + this.invalidationParamsException("银行类型不能为空"); + } + + QueryWrapper qw = Wrappers.query(); + qw.eq("t.syd_id",sydId); + qw.eq("t.op_id",opId); + qw.eq("t.bank_type",bankType); + qw.eq("t.is_default",1); + List accs = this.baseMapper.queryList(qw); + if(!accs.isEmpty()){ + return true; + } + Boolean sydRtn = creatXNnum(sydId,opId,opName, BusRole.OPERATOR.getId(),BusRole.PLATFORM.getId(),bankType, add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = this.baseMapper.insertAccount(new BusOperatorAccount(opId,sydId,add.getAccId(),add.getBankType(), add.getBankCard(),0L,0L,1L, add.getAddTime(),add.getName(), + add.getKhh(),add.getLhh())); + return num > 0; + } + return true; + } + return false; + }, bankType1 -> { + QueryWrapper qw1 = Wrappers.query(); + qw1.eq("t.syd_id",sydId); + qw1.eq("t.op_id",opId); + qw1.eq("t.bank_type",bankType); + qw1.eq("t.is_default",1); + List accs1 = this.baseMapper.queryList(qw1); +// List accs = sysSydAccountMapper.selectSysSydAccountBySydId(id.intValue(), (short) 0, bankType1); + return accs1.size() > 0 ? accs1.get(0).getBankVirtualCard() : null; + }); + + return true; + } + + + public Boolean creatXNnum(Long sydId, Long unitId, String gsmc, int roleType, int addRoleType,String bankType1, Function saveFun, Function existsFun) { + String failBank = ""; + try { + if("招商银行".equals(bankType1)){ + try { + transactionImpl.addZhaoShangAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "招商银行"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + }else if("交通银行".equals(bankType1)){ + try { + transactionImpl.addJiaoTongAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun,existsFun); + } catch (Exception e) { + String bankType = "交通银行"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + }else if("支付宝".equals(bankType1)){ + try { + transactionImpl.addZhiFuBaoAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "支付宝"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + }else if("民生银行".equals(bankType1)){ + try { + transactionImpl.addMinShengAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "民生银行"; + log.error(""+gsmc+ bankType + "虚拟户账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + } + if (StringUtils.isNotEmpty(failBank)) { + throw new ServiceException("开通账户失败[" + failBank + "]"); + } + return true; + } catch (Exception e) { + String msgStr = "开虚拟户失败!"; + log.error(msgStr, e); + if (e instanceof ServiceException) { + throw new ServiceException(e.getMessage()); + } else { + throw new ServiceException(msgStr); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java new file mode 100644 index 0000000..9234a91 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorAgreementServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.operator.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorAgreementBo; +import org.dromara.payment.operator.domain.vo.BusOperatorAgreementVo; +import org.dromara.payment.operator.domain.BusOperatorAgreement; +import org.dromara.payment.operator.mapper.BusOperatorAgreementMapper; +import org.dromara.payment.operator.service.IBusOperatorAgreementService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运营商协议Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorAgreementServiceImpl implements IBusOperatorAgreementService { + + private final BusOperatorAgreementMapper baseMapper; + + /** + * 查询运营商协议 + */ + @Override + public BusOperatorAgreementVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商协议列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorAgreementBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商协议列表 + */ + @Override + public List queryList(BusOperatorAgreementBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorAgreementBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusOperatorAgreement::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusOperatorAgreement::getSydNo, bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusOperatorAgreement::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusOperatorAgreement::getOpId, bo.getOpId()); + lqw.eq(bo.getSignStyle() != null, BusOperatorAgreement::getSignStyle, bo.getSignStyle()); + lqw.eq(StringUtils.isNotBlank(bo.getTitle()), BusOperatorAgreement::getTitle, bo.getTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusOperatorAgreement::getNo, bo.getNo()); + lqw.eq(bo.getStatus() != null, BusOperatorAgreement::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getFileUrl()), BusOperatorAgreement::getFileUrl, bo.getFileUrl()); + return lqw; + } + + /** + * 新增运营商协议 + */ + @Override + public Boolean insertByBo(BusOperatorAgreementBo bo) { + BusOperatorAgreement add = MapstructUtils.convert(bo, BusOperatorAgreement.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商协议 + */ + @Override + public Boolean updateByBo(BusOperatorAgreementBo bo) { + BusOperatorAgreement update = MapstructUtils.convert(bo, BusOperatorAgreement.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorAgreement entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商协议 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java new file mode 100644 index 0000000..0d3d9e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorCashoutServiceImpl.java @@ -0,0 +1,320 @@ +package org.dromara.payment.operator.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelCashout; +import org.dromara.payment.channel.domain.vo.BusChannelAccountVo; +import org.dromara.payment.channel.domain.vo.BusChannelCashoutVo; +import org.dromara.payment.channel.service.IBusChannelAccountService; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorAccount; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorAccountVo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorAccountMapper; +import org.dromara.payment.operator.mapper.BusOperatorFlowsMapper; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorAccountService; +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorCashoutBo; +import org.dromara.payment.operator.domain.vo.BusOperatorCashoutVo; +import org.dromara.payment.operator.domain.BusOperatorCashout; +import org.dromara.payment.operator.mapper.BusOperatorCashoutMapper; +import org.dromara.payment.operator.service.IBusOperatorCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运营商提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorCashoutServiceImpl implements IBusOperatorCashoutService { + + private final BusOperatorCashoutMapper baseMapper; + + private final IBusOperatorAccountService operatorAccountService; + + private final BusOperatorAccountMapper operatorAccountMapper; + + private final BusOperatorMapper operatorMapper; + + private final BusOperatorFlowsMapper operatorFlowsMapper; + + private final IMerBillService billService; + + private final TranLogMapper tranLogDao;//交易日志dao + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询运营商提现记录 + */ + @Override + public BusOperatorCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商提现记录列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorCashoutBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.queryPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商提现记录列表 + */ + @Override + public List queryList(BusOperatorCashoutBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.queryList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusOperatorCashoutBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "t.syd_id", bo.getSydId()); + lqw.eq(bo.getOpId() != null, "t.op_id", bo.getOpId()); + lqw.eq(bo.getAccId() != null, "t.acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "t.bank_card", bo.getBankCard()); + lqw.eq(bo.getVerifyStatus() != null, "t.verify_status", bo.getVerifyStatus()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between("t.add_time",bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("op_name"))){ + lqw.like("t1.name",bo.getParams().get("op_name")); + } + + lqw.orderByDesc("t.add_time"); + return lqw; + } + + /** + * 新增运营商提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusOperatorCashoutBo bo) { + BusOperatorCashout add = MapstructUtils.convert(bo, BusOperatorCashout.class); + validEntityBeforeSave(add); + BusOperatorAccountVo vo = operatorAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } + BusOperator operator = operatorMapper.selectOne(new LambdaQueryWrapper().eq(BusOperator::getId,vo.getOpId())); + billService.checkPayPassword(BusRole.OPERATOR, vo.getOpId(), () -> { + if(StringUtils.isBlank(operator.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(operator.getPayPassword()); + }); + String busDesc = "运营商提现"; + if(operatorAccountService.updateFrozenByAccId(vo.getAccId().intValue(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setOpId(vo.getOpId()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankVirtualCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+ IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean verifyCashout(BusOperatorCashoutBo bo) { + BusOperatorCashoutVo vo = baseMapper.selectVoById(bo.getId()); + BusOperatorAccountVo boavo = this.operatorAccountService.getCashoutAccount(vo.getAccId()); + if(vo == null){ + throw new ServiceException("提现申请不存在,审核失败"); + } + if(vo.getVerifyStatus() != 0){ + throw new ServiceException("提现申请已审核"); + } + BusOperatorCashout update = MapstructUtils.convert(bo, BusOperatorCashout.class); + update.setVerifyTime(new Date()); + String busDesc = "运营商提现"; + if(update.getVerifyStatus() == 1){//驳回 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusOperatorCashout::getId,bo.getId()) + .eq(BusOperatorCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + if(operatorAccountService.updateFrozenByAccId(vo.getAccId().intValue(),-bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户可用余额不足"); + } + }else if(update.getVerifyStatus() == 2){//审批通过 + update.setPayStatus(2l);//支付中 + if(baseMapper.update(update,new LambdaQueryWrapper().eq(BusOperatorCashout::getId,bo.getId()) + .eq(BusOperatorCashout::getVerifyStatus,0)) == 0){ + throw new ServiceException("提现申请已审核"); + } + + Account bankAcc = new Account(); + bankAcc.setBankType(vo.getKhh()); + bankAcc.setBankCard(vo.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(vo.getFr()); + bankAcc.setType((short) 3);//3:真实企业账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + //运营商提现 + TranLog backLog = new TranLog(); + backLog.setBusType(4l); + backLog.setBusItem(5l); + backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(vo.getId()); + Result backRtn = accountService.applyTransfer(boavo.getAccId().intValue(), addRtn.getRtnData().getId(),vo.getAmount(), vo.getBusNo(), "提现"); + if (backRtn.hasError()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(busDesc + ",发送交易申请失败"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.OPERATOR.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.OPERATOR.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + operatorAccountMapper.updateCashoutingByAccId(backRtn.getRtnData().getSourceAccId(),backRtn.getRtnData().getAmount()); + } + return true; + } + + /** + * 修改运营商提现记录 + */ + @Override + public Boolean updateByBo(BusOperatorCashoutBo bo) { + BusOperatorCashout update = MapstructUtils.convert(bo, BusOperatorCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "运营商提现"; + BusOperatorCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(operatorAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(operatorAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusOperatorCashout::getId,vo.getId()) + .eq(BusOperatorCashout::getPayStatus,2) + .set(BusOperatorCashout::getPayStatus,3) + .set(BusOperatorCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + operatorAccountMapper.updateCashoutByAccId(tran.getSourceAccId(),tran.getAmount()); + BusOperatorVo op = operatorMapper.selectVoById(vo.getOpId()); + BusOperatorFlows flow = new BusOperatorFlows(2,vo.getOpId(),16,vo.getPassage(),null,tran.getTargetBankNo(),-tran.getAmount(),new Date(),vo.getAddBy(),"提现",null,vo.getId(),null,tlog.getTranNo(),3,tran.getResult().intValue(), tlog.getSourceAccType(), vo.getSydId(),op.getName(),tran.getSourceCard(), tran.getSourceAccId().longValue(),tlog.getTargetAccType(), 0l, tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(),"",1); + operatorFlowsMapper.insertSelective(flow); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(BusOperatorCashout::getId,vo.getId()) + .eq(BusOperatorCashout::getPayStatus,2) + .set(BusOperatorCashout::getPayStatus,4) + .set(BusOperatorCashout::getPayTime,new Date()) + .set(BusOperatorCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java new file mode 100644 index 0000000..e42c618 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorFlowsServiceImpl.java @@ -0,0 +1,140 @@ +package org.dromara.payment.operator.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorFlowsBo; +import org.dromara.payment.operator.domain.vo.BusOperatorFlowsVo; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.mapper.BusOperatorFlowsMapper; +import org.dromara.payment.operator.service.IBusOperatorFlowsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 运营商流水Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorFlowsServiceImpl implements IBusOperatorFlowsService { + + private final BusOperatorFlowsMapper baseMapper; + + /** + * 查询运营商流水 + */ + @Override + public BusOperatorFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商流水列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorFlowsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商流水列表 + */ + @Override + public List queryList(BusOperatorFlowsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOpId() != null, BusOperatorFlows::getOpId, bo.getOpId()); + lqw.eq(bo.getBusType() != null, BusOperatorFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getChannel()), BusOperatorFlows::getChannel, bo.getChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), BusOperatorFlows::getBusNo, bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), BusOperatorFlows::getBankNo, bo.getBankNo()); + lqw.eq(bo.getMoney() != null, BusOperatorFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, BusOperatorFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, BusOperatorFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), BusOperatorFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), BusOperatorFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), BusOperatorFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, BusOperatorFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, BusOperatorFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(StringUtils.isNotBlank(bo.getTranNo()), BusOperatorFlows::getTranNo, bo.getTranNo()); + lqw.eq(bo.getTranType() != null, BusOperatorFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getTranStatus() != null, BusOperatorFlows::getTranStatus, bo.getTranStatus()); + lqw.eq(bo.getPayerType() != null, BusOperatorFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, BusOperatorFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), BusOperatorFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), BusOperatorFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, BusOperatorFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, BusOperatorFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, BusOperatorFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), BusOperatorFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), BusOperatorFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, BusOperatorFlows::getPayeeAccId, bo.getPayeeAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), BusOperatorFlows::getPayReceipt, bo.getPayReceipt()); + lqw.eq(bo.getPayReceiptType() != null, BusOperatorFlows::getPayReceiptType, bo.getPayReceiptType()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between(BusOperatorFlows::getAddTime,bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + lqw.orderByDesc(BusOperatorFlows::getId); + return lqw; + } + + /** + * 新增运营商流水 + */ + @Override + public Boolean insertByBo(BusOperatorFlowsBo bo) { + BusOperatorFlows add = MapstructUtils.convert(bo, BusOperatorFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商流水 + */ + @Override + public Boolean updateByBo(BusOperatorFlowsBo bo) { + BusOperatorFlows update = MapstructUtils.convert(bo, BusOperatorFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java new file mode 100644 index 0000000..5a2c671 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorProductServiceImpl.java @@ -0,0 +1,242 @@ +package org.dromara.payment.operator.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.api.operator.domain.RemoteBusOperatorProductVo; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.bo.AllocOperatorProductBo; +import org.dromara.payment.operator.mapper.ReProductInvoiceMapper; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorProductBo; +import org.dromara.payment.operator.domain.vo.BusOperatorProductVo; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.mapper.BusOperatorProductMapper; +import org.dromara.payment.operator.service.IBusOperatorProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 运营商产品Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorProductServiceImpl extends BaseService implements IBusOperatorProductService { + + private final BusOperatorProductMapper baseMapper; + + private final ReProductInvoiceMapper reProductInvoiceMapper; + + private final StreamBridge streamBridge; + /** + * 查询运营商产品 + */ + @Override + public BusOperatorProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商产品列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorProductBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商产品列表 + */ + @Override + public List queryList(BusOperatorProductBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorProductBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, BusOperatorProduct::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), BusOperatorProduct::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, BusOperatorProduct::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), BusOperatorProduct::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, BusOperatorProduct::getProId, bo.getProId()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), BusOperatorProduct::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, BusOperatorProduct::getOpId, bo.getOpId()); + lqw.eq(bo.getCostServiceCharge() != null, BusOperatorProduct::getCostServiceCharge, bo.getCostServiceCharge()); + lqw.eq(bo.getServiceCharge() != null, BusOperatorProduct::getServiceCharge, bo.getServiceCharge()); + lqw.eq(bo.getChargeMode() != null, BusOperatorProduct::getChargeMode, bo.getChargeMode()); + lqw.eq(bo.getSettlementStyle() != null, BusOperatorProduct::getSettlementStyle, bo.getSettlementStyle()); + lqw.eq(bo.getMaxMonth() != null, BusOperatorProduct::getMaxMonth, bo.getMaxMonth()); + lqw.eq(bo.getInvoiceType() != null, BusOperatorProduct::getInvoiceType, bo.getInvoiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceItems()), BusOperatorProduct::getInvoiceItems, bo.getInvoiceItems()); + lqw.eq(bo.getProStatus() != null, BusOperatorProduct::getProStatus, bo.getProStatus()); + return lqw; + } + + /** + * 新增运营商产品 + */ + @Override + public Boolean insertByBo(BusOperatorProductBo bo) { + BusOperatorProduct add = MapstructUtils.convert(bo, BusOperatorProduct.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改运营商产品 + */ + @Override + public Boolean updateByBo(BusOperatorProductBo bo) { + BusOperatorProduct update = MapstructUtils.convert(bo, BusOperatorProduct.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperatorProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除运营商产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean allocOperatorProduct(AllocOperatorProductBo bo) { + bo.setCreateTime(new Date()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + + Long opId = bo.getProducts().get(0).getOpId(); + String opNo = bo.getProducts().get(0).getOpNo(); + if(opId == null){ + this.invalidationParamsException("运营商ID[opId]不能为空"); + } + if(StringUtils.isEmpty(opNo)){ + this.invalidationParamsException("运营商编码[opNo]不能为空"); + } + + Long busType = bo.getProducts().get(0).getBusType(); + List proIds = StreamUtils.toList(bo.getProducts(), RemoteBusOperatorProductVo::getProId); + lqw.eq(BusOperatorProduct::getOpId,opId); + lqw.in(BusOperatorProduct::getProId,proIds); + + + Map selOperPros = new HashMap(); + Map paraMap = new HashMap(); + paraMap.put("busType",busType); + paraMap.put("opId",opId); + + List busProList = this.baseMapper.selectChannelProductMin(paraMap); + + //查询已经分配的产品费率 + if(busProList != null && !busProList.isEmpty()){ + for(BusChannelProduct bopd: busProList){ + selOperPros.put(bopd.getProNo(),bopd); + } + } + + //验证产品费率 + List remoteBusProList = bo.getProducts(); + + List updateList = new ArrayList(); + + for(RemoteBusOperatorProductVo opv : remoteBusProList){ + opv.setCreateTime(new Date()); + opv.setCreateBy(LoginHelper.getUserId()); +// opv.setCostServiceCharge(opv.getServiceCharge()); + if(opv.getServiceCharge() != null ){ + +// opv.setServiceCharge(opv.getServiceCharge()); + if(opv.getServiceCharge().compareTo(opv.getCostServiceCharge()) < 0){ + this.invalidationParamsException("产品编号["+opv.getProNo() + "]的配置服务费率不能小于成本费率"); + } + BusChannelProduct bopd = (BusChannelProduct)selOperPros.get(opv.getProNo()); + if(bopd != null && bopd.getServiceCharge() != null){ + if(bopd.getServiceCharge() != null){ + if(opv.getServiceCharge().compareTo(bopd.getServiceCharge()) > 0){ + this.invalidationParamsException("产品编号["+opv.getProNo() + "]的配置服务费率不能大于成本费率["+bopd.getServiceCharge()+"]"); + }else{ + if(opv.getProStatus() == 1){ + Map upMap = new HashMap(); + upMap.put("cost_service_charge",opv.getServiceCharge()); + upMap.put("op_id",opId); + upMap.put("pro_id",opv.getProId()); + updateList.add(upMap); + } + } + } + } + } + } + baseMapper.delete(lqw); +// baseMapper.allocOperatorProduct(bo); + baseMapper.insertOperatorProduct(bo); + if(!updateList.isEmpty()){ + this.baseMapper.updateChannelProCostCharge(updateList); + } + reProductInvoiceMapper.delete(new LambdaQueryWrapper().eq(ReProductInvoice::getBusId,opId).eq(ReProductInvoice::getBusType,BusRole.OPERATOR.getId())); + List sydIds = bo.getProducts().stream().map(RemoteBusOperatorProductVo::getSydId).distinct().collect(Collectors.toList()); + reProductInvoiceMapper.allocProduct(proIds,sydIds, BusRole.SERVICE.getId(),opId,BusRole.OPERATOR.getId(),bo.getCreateBy(),new Date()); + JSONObject queueParam = new JSONObject(); + queueParam.put("accType", BusRole.OPERATOR.getId()); + queueParam.put("addAccType", BusRole.PLATFORM.getId()); + queueParam.put("accUnitId", opId); + queueParam.put("sydIds",sydIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + streamBridge.send("account-out-0", MessageBuilder.withPayload(queueParam).build()); + return true; + } + + @Override + public TableDataInfo queryPageListNew(BusOperatorProductBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.pro_status",1); + lqw.like(StringUtils.isNotEmpty(bo.getSydName()),"t2.gsmc",bo.getSydName()); + lqw.eq("t.bus_type",bo.getBusType()); + lqw.isNotNull("t2.id"); + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.setingOpratorProductList(pageQuery.build(), lqw,bo.getOpId()); + return TableDataInfo.build(result); + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java new file mode 100644 index 0000000..878daf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/BusOperatorServiceImpl.java @@ -0,0 +1,247 @@ +package org.dromara.payment.operator.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.payment.sys.mapper.SysUnitMapper; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 运营商Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class BusOperatorServiceImpl implements IBusOperatorService { + + private final BusOperatorMapper baseMapper; + + private final SysUnitMapper sysUnitMapper; + + @DubboReference + private RemoteUserService remoteUserService; + + + @DubboReference + private RemoteSmsService remoteSmsService; + + /** + * 查询运营商 + */ + @Override + public BusOperatorVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询运营商列表 + */ + @Override + public TableDataInfo queryPageList(BusOperatorBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询运营商列表 + */ + @Override + public List queryList(BusOperatorBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusOperatorBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), BusOperator::getNo, bo.getNo()); + lqw.eq(bo.getDwType() != null, BusOperator::getDwType, bo.getDwType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), BusOperator::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), BusOperator::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), BusOperator::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfz()), BusOperator::getFrSfz, bo.getFrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSjh()), BusOperator::getFrSjh, bo.getFrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtr()), BusOperator::getWtr, bo.getWtr()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSjh()), BusOperator::getWtrSjh, bo.getWtrSjh()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrSfz()), BusOperator::getWtrSfz, bo.getWtrSfz()); + lqw.eq(StringUtils.isNotBlank(bo.getWtrEmail()), BusOperator::getWtrEmail, bo.getWtrEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getUnitArea()), BusOperator::getUnitArea, bo.getUnitArea()); + lqw.like(StringUtils.isNotBlank(bo.getUnitAreaName()), BusOperator::getUnitAreaName, bo.getUnitAreaName()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), BusOperator::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getKhm()), BusOperator::getKhm, bo.getKhm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), BusOperator::getBankCard, bo.getBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), BusOperator::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), BusOperator::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), BusOperator::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), BusOperator::getAlipayLogonId, bo.getAlipayLogonId()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzzm()), BusOperator::getFrSfzzm, bo.getFrSfzzm()); + lqw.eq(StringUtils.isNotBlank(bo.getFrSfzfm()), BusOperator::getFrSfzfm, bo.getFrSfzfm()); + lqw.eq(StringUtils.isNotBlank(bo.getBankZm()), BusOperator::getBankZm, bo.getBankZm()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), BusOperator::getPayPassword, bo.getPayPassword()); + lqw.eq(bo.getPassErrorNum() != null, BusOperator::getPassErrorNum, bo.getPassErrorNum()); + lqw.eq(bo.getPassFrozenTime() != null, BusOperator::getPassFrozenTime, bo.getPassFrozenTime()); + lqw.eq(bo.getStatus() != null, BusOperator::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceHeader()), BusOperator::getInvoceHeader, bo.getInvoceHeader()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceCreditCode()), BusOperator::getInvoceCreditCode, bo.getInvoceCreditCode()); + lqw.like(StringUtils.isNotBlank(bo.getInvoceBankName()), BusOperator::getInvoceBankName, bo.getInvoceBankName()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceBankCard()), BusOperator::getInvoceBankCard, bo.getInvoceBankCard()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceAddress()), BusOperator::getInvoceAddress, bo.getInvoceAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoceDwdh()), BusOperator::getInvoceDwdh, bo.getInvoceDwdh()); + lqw.orderByDesc(BusOperator::getCreateTime); + return lqw; + } + + /** + * 新增运营商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(BusOperatorBo bo) { + BusOperator add = MapstructUtils.convert(bo, BusOperator.class); + validEntityBeforeSave(add); + String no = genNo(0,10); + SysUnit sysUnit = new SysUnit(); + sysUnit.setId(IdUtil.getSnowflakeNextId()); + sysUnit.setNo(no); + sysUnit.setUnitType(BusRole.OPERATOR.getId()); + sysUnit.setName(add.getName()); + sysUnit.setCustNo(no.substring(1)); + sysUnitMapper.insert(sysUnit); + add.setId(sysUnit.getId()); + add.setNo(no); + add.setCreateBy(bo.getCreateBy()); + add.setCreateTime(new Date()); + add.setUpdateBy(bo.getCreateBy()); + add.setUpdateTime(bo.getCreateTime()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(bo.getId()); + remoteUserBo.setBusNo(add.getNo()); + remoteUserBo.setRoleId(BusRole.OPERATOR.getId()); + remoteUserBo.setRoleName(BusRole.OPERATOR.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bo.getName()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bo.getWtrSjh()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("A"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addUser(remoteUserBo); + + + + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.OPERATOR.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(bo.getDomain(),remoteUserBo.getPhonenumber(), SmsType.UNIT_OPEN,smsMap); + return flag; + } + + private void addUser(RemoteUserBo remoteUserBo) { + + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("A"+StringUtils.randmNumber(5)); + this.addUser(remoteUserBo); + } + } + + /** + * 生成运营商编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @return + */ + public String genNo(int retry,int maxRetry){ + String no = "A"+ RandomUtil.randomNumbers(5); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperator::getNo,no); + BusOperator exists = baseMapper.selectOne(lqw); + if(exists != null){ + if(retry > maxRetry){ + throw new ServiceException("运营商编号生成出错"); + }else { + no = genNo(retry + 1,maxRetry); + } + } + return no; + } + + /** + * 修改运营商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(BusOperatorBo bo) { + BusOperator update = MapstructUtils.convert(bo, BusOperator.class); + validEntityBeforeSave(update); + update.setUpdateBy(bo.getUpdateBy()); + update.setUpdateTime(new Date()); + sysUnitMapper.update(new LambdaUpdateWrapper() + .set(SysUnit::getName, update.getName()) + .eq(SysUnit::getId, update.getId())); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusOperator entity){ + //TODO 做一些数据校验,如唯一约束 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperator::getName,entity.getName()); + BusOperator exists = baseMapper.selectOne(lqw); + if(exists != null && (entity.getId() == null || entity.getId() != exists.getId())){ + throw new ServiceException("运营商已存在"); + } + } + + /** + * 批量删除运营商 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + sysUnitMapper.deleteBatchIds(ids); + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java new file mode 100644 index 0000000..223c571 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/operator/service/impl/ReProductInvoiceServiceImpl.java @@ -0,0 +1,114 @@ +package org.dromara.payment.operator.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.operator.domain.vo.ReProductInvoiceVo; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.mapper.ReProductInvoiceMapper; +import org.dromara.payment.operator.service.IReProductInvoiceService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 产品开票类目Service业务层处理 + * + * @author LionLi + * @date 2024-03-28 + */ +@RequiredArgsConstructor +@Service +public class ReProductInvoiceServiceImpl implements IReProductInvoiceService { + + private final ReProductInvoiceMapper baseMapper; + + /** + * 查询产品开票类目 + */ + @Override + public ReProductInvoiceVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询产品开票类目列表 + */ + @Override + public TableDataInfo queryPageList(ReProductInvoiceBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询产品开票类目列表 + */ + @Override + public List queryList(ReProductInvoiceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ReProductInvoiceBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getProType() != null, ReProductInvoice::getProType, bo.getProType()); + lqw.eq(StringUtils.isNotBlank(bo.getProNo()), ReProductInvoice::getProNo, bo.getProNo()); + lqw.eq(bo.getProId() != null, ReProductInvoice::getProId, bo.getProId()); + lqw.eq(bo.getInvoiceTypeId() != null, ReProductInvoice::getInvoiceTypeId, bo.getInvoiceTypeId()); + lqw.eq(bo.getBusId() != null, ReProductInvoice::getBusId, bo.getBusId()); + lqw.eq(bo.getBusType() != null, ReProductInvoice::getBusType, bo.getBusType()); + return lqw; + } + + /** + * 新增产品开票类目 + */ + @Override + public Boolean insertByBo(ReProductInvoiceBo bo) { + ReProductInvoice add = MapstructUtils.convert(bo, ReProductInvoice.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改产品开票类目 + */ + @Override + public Boolean updateByBo(ReProductInvoiceBo bo) { + ReProductInvoice update = MapstructUtils.convert(bo, ReProductInvoice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ReProductInvoice entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除产品开票类目 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java new file mode 100644 index 0000000..f157b49 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PayPasswordProperties.java @@ -0,0 +1,29 @@ +package org.dromara.payment.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 支付密码配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "pay.password") +public class PayPasswordProperties { + + /** + * 密码最大错误次数 + */ + private Integer maxRetryCount; + + /** + * 密码锁定时间(默认10分钟) + */ + private Integer lockTime; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java new file mode 100644 index 0000000..31ee016 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/properties/PlatformProperties.java @@ -0,0 +1,45 @@ +package org.dromara.payment.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 平台账户配置 + * + * @author Lion Li + */ +@Data +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "pay.platform") +public class PlatformProperties { + + /** + * 开户名(例:上海沪歆商务服务有限公司) + */ + private String khm; + + /** + * 开户账号(例:121919712610506) + */ + private String bankCard; + + /** + * 开户支行(例:上海源深支行) + */ + private String khd; + + /** + * 开户行(例:招商银行) + */ + private String khh; + + /** + * 开户行行号/银联号(例:308290003441) + */ + private String khhNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java new file mode 100644 index 0000000..1bd823f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/AccAccountsController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.service.IAccAccountsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 线下银行账户 + * 前端访问路由地址为:/payment/accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +//@RequestMapping("/accounts") +public class AccAccountsController extends BaseController { + + private final IAccAccountsService accAccountsService; + + /** + * 查询线下银行账户列表 + */ + @SaCheckPermission("payment:accounts:list") + @GetMapping("/list") + public TableDataInfo list(AccAccountsBo bo, PageQuery pageQuery) { + return accAccountsService.queryPageList(bo, pageQuery); + } + + /** + * 导出线下银行账户列表 + */ + @SaCheckPermission("payment:accounts:export") + @Log(title = "线下银行账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(AccAccountsBo bo, HttpServletResponse response) { + List list = accAccountsService.queryList(bo); + ExcelUtil.exportExcel(list, "线下银行账户", AccAccountsVo.class, response); + } + + /** + * 获取线下银行账户详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:accounts:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(accAccountsService.queryById(id)); + } + + /** + * 新增线下银行账户 + */ + @SaCheckPermission("payment:accounts:add") + @Log(title = "线下银行账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody AccAccountsBo bo) { + return toAjax(accAccountsService.insertByBo(bo)); + } + + /** + * 修改线下银行账户 + */ + @SaCheckPermission("payment:accounts:edit") + @Log(title = "线下银行账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody AccAccountsBo bo) { + return toAjax(accAccountsService.updateByBo(bo)); + } + + /** + * 删除线下银行账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:accounts:remove") + @Log(title = "线下银行账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(accAccountsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java new file mode 100644 index 0000000..f18da3f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/BusDownloadsController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.payment.sys.domain.bo.BusDownloadsBo; +import org.dromara.payment.sys.service.IBusDownloadsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 异步下载 + * 前端访问路由地址为:/sys/downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/downloads") +public class BusDownloadsController extends BaseController { + + private final IBusDownloadsService busDownloadsService; + + /** + * 查询异步下载列表 + */ +// @SaCheckPermission("sys:downloads:list") + @GetMapping("/list") + public TableDataInfo list(BusDownloadsBo bo, PageQuery pageQuery) { + return busDownloadsService.queryPageList(bo, pageQuery); + } + + /** + * 导出异步下载列表 + */ + @SaCheckPermission("sys:downloads:export") + @Log(title = "异步下载", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusDownloadsBo bo, HttpServletResponse response) { + List list = busDownloadsService.queryList(bo); + ExcelUtil.exportExcel(list, "异步下载", BusDownloadsVo.class, response); + } + + /** + * 获取异步下载详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sys:downloads:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busDownloadsService.queryById(id)); + } + + /** + * 新增异步下载 + */ + @SaCheckPermission("sys:downloads:add") + @Log(title = "异步下载", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusDownloadsBo bo) { + return toAjax(busDownloadsService.insertByBo(bo)); + } + + /** + * 修改异步下载 + */ + @SaCheckPermission("sys:downloads:edit") + @Log(title = "异步下载", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusDownloadsBo bo) { + return toAjax(busDownloadsService.updateByBo(bo)); + } + + /** + * 删除异步下载 + * + * @param ids 主键串 + */ +// @SaCheckPermission("sys:downloads:remove") + @Log(title = "异步下载", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busDownloadsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java new file mode 100644 index 0000000..752fef0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnController.java @@ -0,0 +1,53 @@ +//package org.dromara.payment.sys.controller; +// +// +//import org.dromara.common.log.enums.BusinessType; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//@RestController +//@RequestMapping({"/business/early_warn"}) +//public class LgEarlyWarnController extends BaseController { +// @Autowired +// private ILgEarlyWarnService lgEarlyWarnService; +// +// @ApiOperation(value = "后台-查询风控预警设置列表", response = LgEarlyWarnListDtlVO.class) +// @PreAuthorize("@ss.hasPermi('business:early_warn:list')") +// @GetMapping({"/list"}) +// public TableDataInfo list(LgEarlyWarnListQuery query) { +// YFListVO list = this.lgEarlyWarnService.selectLgEarlyWarnList(query); +// return getDataTable(list.getList(), list.getTotal().longValue()); +// } +// +// @ApiOperation(value = "后台-获取风控预警设置详细信息", response = LgEarlyWarnInfoVO.class) +// @PreAuthorize("@ss.hasPermi('business:early_warn:query')") +// @GetMapping({"/getInfo/{id}"}) +// public AjaxResult getInfo(@PathVariable("id") Integer id) { +// return AjaxResult.success(this.lgEarlyWarnService.selectLgEarlyWarnById(id)); +// } +// +// @ApiOperation("后台-新增风控预警设置") +// @PreAuthorize("@ss.hasPermi('business:early_warn:add')") +// @Log(title = "后台-风控预警设置", businessType = BusinessType.INSERT) +// @PostMapping({"/add"}) +// public AjaxResult add(@RequestBody LgEarlyWarnSaveDTO dto) { +// this.lgEarlyWarnService.insertLgEarlyWarn(dto); +// return AjaxResult.success(); +// } +// +// @ApiOperation("后台-修改风控预警设置") +// @PreAuthorize("@ss.hasPermi('business:early_warn:edit')") +// @Log(title = "后台-风控预警设置", businessType = BusinessType.UPDATE) +// @PutMapping({"/edit"}) +// public AjaxResult edit(@RequestBody LgEarlyWarnUpdateDTO lgEarlyWarn) { +// return toAjax(this.lgEarlyWarnService.updateLgEarlyWarn(lgEarlyWarn)); +// } +// +// @ApiOperation("删除风控预警设置") +// @PreAuthorize("@ss.hasPermi('business:early_warn:remove')") +// @Log(title = "风控预警设置", businessType = BusinessType.DELETE) +// @DeleteMapping({"/remove/{ids}"}) +// public AjaxResult remove(@PathVariable Long[] ids) { +// return toAjax(this.lgEarlyWarnService.deleteLgEarlyWarnByIds(ids)); +// } +//} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java new file mode 100644 index 0000000..1a8bbbe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/LgEarlyWarnDtlController.java @@ -0,0 +1,16 @@ +//package org.dromara.payment.sys.controller; +// +//import com.ruoyi.business.service.ILgEarlyWarnDtlService; +//import com.ruoyi.common.core.controller.BaseController; +//import io.swagger.annotations.Api; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping({"/business/early_warn_dtl"}) +//@Api(tags = {"风控预警设置明细"}) +//public class LgEarlyWarnDtlController extends BaseController { +// @Autowired +// private ILgEarlyWarnDtlService lgEarlyWarnDtlService; +//} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java new file mode 100644 index 0000000..1cdd04f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/ProInfoCommonController.java @@ -0,0 +1,130 @@ +package org.dromara.payment.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.IProInfoCommonService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonController + * @description + * @create 2024-04-24 17:42 + */ + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/proInfo") +public class ProInfoCommonController extends BaseController { + + + @Resource + private IProInfoCommonService commonService; + + + /** + * 查询不同角色-产品列表 + */ +// @SaCheckPermission("payment:proInfo:list") + @GetMapping("/list") + @Log(title = "查询不同角色-产品列表", businessType = BusinessType.OTHER) + public TableDataInfo list(ProInfoCommonBo bo, PageQuery pageQuery) { + return commonService.queryPageList(bo, pageQuery); + } + + /** + * 查询不同角色-企业列表 + */ +// @SaCheckPermission("payment:proInfo:list") + @GetMapping("/listMer") + @Log(title = "查询不同角色-企业列表", businessType = BusinessType.OTHER) + public R> listMer(ProInfoCommonBo bo) { + return R.ok(commonService.selectMerchantList(bo)); + } + + + + + + @GetMapping("/listServ") + @Log(title = "根据企业查询对应的服务商", businessType = BusinessType.OTHER) + public R> selServiceInfoByMerInfo(BusMerchantVo merchantVo){ + return R.ok(commonService.selectServiceInfoByMerInfo(merchantVo)); + } + + + + /*** + * 查询不同角色的业务类型 + * @return + */ + @GetMapping("/selBusType") + @Log(title = "查询不同角色的业务类型", businessType = BusinessType.OTHER) + public R> selDifRoleBusType(){ + return R.ok(commonService.selDifRoleBusType()); + } + + + + + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 9:46 + * 说明:给企业分配产品,对应的服务商查询,过滤已经分配过的服务商 + **/ + @GetMapping("/selAgentService") + @Log(title = "给企业分配产品,对应的服务商查询,过滤已经分配过的服务商", businessType = BusinessType.OTHER) + public R> selectAgentService(ProInfoCommonBo commonBo){ + return R.ok(commonService.selectAgentService(commonBo)); + + } + + + + @GetMapping("/selBtByMs") + @Log(title = "根据企业,服务商信息查询对应的业务类型", businessType = BusinessType.OTHER) + public R> selectBusTypeByMerSerInfo(Long merId, Long sydId){ + return R.ok(commonService.selectBusTypeByMerSerInfo(merId,sydId)); + } + + + + @GetMapping("/selBtByMsName") + @Log(title = "根据企业,服务商信息查询对应的业务类型", businessType = BusinessType.OTHER) + public R> selectBusTypeByMerSerInfoName(Long merId, Long sydId){ + if(merId == null && sydId == null){ + return R.ok(new ArrayList<>()); + } + return R.ok(commonService.selectBusTypeByMerSerInfoName(merId,sydId)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java new file mode 100644 index 0000000..7459047 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysPayPwdController.java @@ -0,0 +1,58 @@ +package org.dromara.payment.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.sys.domain.bo.SysPayPwdBo; +import org.dromara.payment.sys.service.ISysPayPwdService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdController + * @description + * @create 2024-05-13 11:28 + */ +@RestController +@RequestMapping("/sys/") +public class SysPayPwdController extends BaseController { + + @Resource + public ISysPayPwdService sysPayPwdService; + + + /**** + * 修改支付密码 + * @param bo + * @return + */ + + @ApiEncrypt + @SaCheckPermission("payment:sys:updPayPwd") + @PutMapping("/updPayPwd") + @Log(title = "修改支付密码", businessType = BusinessType.UPDATE) + public R updPayPwd(@Validated @RequestBody SysPayPwdBo bo){ + return R.ok(sysPayPwdService.updPayPwd(bo)); + } + + + /**** + * 发送支付密码短信 + * @param domain + * @return + */ + @GetMapping("/sendPayPwd") + @Log(title = "发送修改支付密码短信", businessType = BusinessType.UPDATE) + public R sendPaySms(String domain){ + return R.ok(this.sysPayPwdService.sendSmsCode(domain)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java new file mode 100644 index 0000000..fc75286 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountController.java @@ -0,0 +1,134 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.model.LoginUser; +import org.redisson.api.RList; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商账户 + * 前端访问路由地址为:/payment/sydAccount + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydAccount") +public class SysSydAccountController extends BaseController { + + private final ISysSydAccountService sysSydAccountService; + + private final ISysSydService sysSydService; + + @DubboReference + private RemoteAccountService accountService; + + /** + * 查询服务商账户列表 + */ + //@SaCheckPermission("payment:sydAccount:list") + @GetMapping("/list") + public TableDataInfo list(SysSydAccountBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + TableDataInfo rtn = sysSydAccountService.queryPageList(bo, pageQuery); + if(rtn.getRows() != null && rtn.getRows().size() > 0){ + SysSydVo vo = sysSydService.queryById(loginUser.getBusId()); + rtn.setRows(rtn.getRows().stream().peek(d -> d.setAccName(vo.getGsmc())).collect(Collectors.toList())); + } + return rtn; + } + + /** + * 导出服务商账户列表 + */ + @SaCheckPermission("payment:sydAccount:export") + @Log(title = "服务商账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydAccountBo bo, HttpServletResponse response) { + List list = sysSydAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商账户", SysSydAccountVo.class, response); + } + + /** + * 获取服务商账户详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:sydAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + LoginUser loginUser = LoginHelper.getLoginUser(); + SysSydVo vo = sysSydService.queryById(loginUser.getBusId()); + SysSydAccountVo sydAccountVo = sysSydAccountService.queryById(id); + sydAccountVo.setAccName(vo.getGsmc()); + return R.ok(sydAccountVo); + } + + /** + * 新增服务商账户 + */ + @SaCheckPermission("payment:sydAccount:add") + @Log(title = "服务商账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydAccountBo bo) { + return toAjax(sysSydAccountService.insertByBo(bo)); + } + + /** + * 修改服务商账户 + */ + @SaCheckPermission("payment:sydAccount:edit") + @Log(title = "服务商账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydAccountBo bo) { + return toAjax(sysSydAccountService.updateByBo(bo)); + } + + /** + * 删除服务商账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydAccount:remove") + @Log(title = "服务商账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydAccountService.deleteWithValidByIds(List.of(ids), true)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java new file mode 100644 index 0000000..3a545df --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydAccountSynController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.payment.sys.service.ISysSydAccountSynService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商账户同步 + * 前端访问路由地址为:/payment/sydAccountSyn + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydAccountSyn") +public class SysSydAccountSynController extends BaseController { + + private final ISysSydAccountSynService sysSydAccountSynService; + + /** + * 查询服务商账户同步列表 + */ + @SaCheckPermission("payment:sydAccountSyn:list") + @GetMapping("/list") + public TableDataInfo list(SysSydAccountSynBo bo, PageQuery pageQuery) { + return sysSydAccountSynService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商账户同步列表 + */ + @SaCheckPermission("payment:sydAccountSyn:export") + @Log(title = "服务商账户同步", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydAccountSynBo bo, HttpServletResponse response) { + List list = sysSydAccountSynService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商账户同步", SysSydAccountSynVo.class, response); + } + + /** + * 获取服务商账户同步详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydAccountSyn:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydAccountSynService.queryById(id)); + } + + /** + * 新增服务商账户同步 + */ + @SaCheckPermission("payment:sydAccountSyn:add") + @Log(title = "服务商账户同步", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydAccountSynBo bo) { + return toAjax(sysSydAccountSynService.insertByBo(bo)); + } + + /** + * 修改服务商账户同步 + */ + @SaCheckPermission("payment:sydAccountSyn:edit") + @Log(title = "服务商账户同步", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydAccountSynBo bo) { + return toAjax(sysSydAccountSynService.updateByBo(bo)); + } + + /** + * 删除服务商账户同步 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydAccountSyn:remove") + @Log(title = "服务商账户同步", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydAccountSynService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java new file mode 100644 index 0000000..7022cb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydCashoutController.java @@ -0,0 +1,130 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.bo.SysSydCashoutBo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.sys.service.ISysSydCashoutService; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商提现记录 + * 前端访问路由地址为:/payment/sydCashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydCashout") +public class SysSydCashoutController extends BaseController { + + private final ISysSydCashoutService sysSydCashoutService; + + private final ISysSydAccountService sysSydAccountService; + + private final ISysSydService sysSydService; + + /** + * 查询服务商提现记录列表 + */ + @SaCheckPermission("payment:sydCashout:list") + @GetMapping("/list") + public TableDataInfo list(SysSydCashoutBo bo, PageQuery pageQuery) { + return sysSydCashoutService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商提现记录列表 + */ + @SaCheckPermission("payment:sydCashout:export") + @Log(title = "服务商提现记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydCashoutBo bo, HttpServletResponse response) { + List list = sysSydCashoutService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商提现记录", SysSydCashoutVo.class, response); + } + + /** + * 获取服务商提现记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydCashout:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydCashoutService.queryById(id)); + } + + /** + * 获取服务商提现账户信息 + * + * @param id 资金账户id + */ + @GetMapping("/account/{id}") + public R getCashoutAccount(@NotNull(message = "资金账户id不能为空") + @PathVariable Long id) { + return R.ok(sysSydAccountService.getCashoutAccount(id)); + } + + /** + * 新增服务商提现记录 + */ + //@SaCheckPermission("payment:sydCashout:add") + @Log(title = "服务商提现记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydCashoutBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + bo.setAddBy(loginUser.getNickname()); + return toAjax(sysSydCashoutService.insertByBo(bo)); + } + + /** + * 修改服务商提现记录 + */ + @SaCheckPermission("payment:sydCashout:edit") + @Log(title = "服务商提现记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydCashoutBo bo) { + return toAjax(sysSydCashoutService.updateByBo(bo)); + } + + /** + * 删除服务商提现记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydCashout:remove") + @Log(title = "服务商提现记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydCashoutService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java new file mode 100644 index 0000000..5a6db6f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydConfigController.java @@ -0,0 +1,175 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.payment.sys.domain.bo.SysSydConfigBo; +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.dromara.payment.sys.service.ISysSydConfigService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商配置 + * 前端访问路由地址为:/payment/sydConfig + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydConfig") +public class SysSydConfigController extends BaseController { + + private final ISysSydConfigService sysSydConfigService; + + @DubboReference + private RemoteConfigService configService; + + /** + * 查询服务商配置列表 + */ + @SaCheckPermission("payment:sydConfig:list") + @GetMapping("/list") + public TableDataInfo list(SysSydConfigBo bo, PageQuery pageQuery) { + return sysSydConfigService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商配置列表 + */ + @SaCheckPermission("payment:sydConfig:export") + @Log(title = "服务商配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydConfigBo bo, HttpServletResponse response) { + List list = sysSydConfigService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商配置", SysSydConfigVo.class, response); + } + + /** + * 获取服务商配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydConfig:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydConfigService.queryById(id)); + } + + /** + * 新增服务商配置 + */ + @SaCheckPermission("payment:sydConfig:add") + @Log(title = "服务商配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydConfigBo bo) { + return toAjax(sysSydConfigService.insertByBo(bo)); + } + + /** + * 修改服务商配置 + */ + @SaCheckPermission("payment:sydConfig:edit") + @Log(title = "服务商配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydConfigBo bo) { + return toAjax(sysSydConfigService.updateByBo(bo)); + } + + /** + * 删除服务商配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydConfig:remove") + @Log(title = "服务商配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydConfigService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取配置大类下面的组信息 + * @param unit_id 服务商id + * @param class_alias 固定值(settlement.type) + * @return + */ + @GetMapping(value = "/getConfGroupByUnit/{unit_id}/{class_alias}") + public R> getConfGroupByUnit(@PathVariable(value = "unit_id", required = true) Long unit_id,@PathVariable(value = "class_alias", required = true) String class_alias) + { + Result> result = configService.getConfGroupByUnit(unit_id,class_alias); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + return R.ok(result.getRtnData()); + } + return R.fail("获取配置组失败"); + } + + /** + * 根据配置组查询配置项明细 + * @param unit_id 服务商id + * @param conf_group 配置组名称 + * @return + */ + @GetMapping(value = "/getConfDetailByUnit/{unit_id}/{conf_group}") + public R> getConfDetailByUnit(@PathVariable(value = "unit_id", required = true) Long unit_id,@PathVariable(value = "conf_group", required = true) String conf_group) + { + Result> result = configService.getConfDetailByUnit(unit_id,conf_group); + if(result.getRtnCode()== ResultCodeEnum.SUCCESS.Code()) { + return R.ok(result.getRtnData()); + } + return R.fail("获取配置项明细失败"); + } + + + /** + * 编辑配置项明细 + * @param map + * @return + */ + @PostMapping(value = "/editConfDetail") + public R editConfDetail(@RequestBody Map map) + { + String confs = map.get("confs").toString(); + try { + List lendReco = JSONObject.parseArray(confs, UnitConfDetail.class); + Result result = configService.editConfDetail(lendReco); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + if(result.getRtnData()) { + return R.ok("保存成功"); + } + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return R.fail("保存失败"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java new file mode 100644 index 0000000..8c9232e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydController.java @@ -0,0 +1,187 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商 + * 前端访问路由地址为:/payment/syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/syd") +public class SysSydController extends BaseController { + + private final ISysSydService sysSydService; + + /** + * 查询服务商列表 + */ + @SaCheckPermission("payment:syd:list") + @GetMapping("/list") + public TableDataInfo list(SysSydBo bo, PageQuery pageQuery) { + return sysSydService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商列表 + */ + @SaCheckPermission("payment:syd:export") + @Log(title = "服务商", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydBo bo, HttpServletResponse response) { + List list = sysSydService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商", SysSydVo.class, response); + } + + /** + * 获取服务商详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:syd:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydService.queryById(id)); + } + + /** + * 新增服务商 + */ + @SaCheckPermission("payment:syd:add") + @Log(title = "服务商", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydBo bo) throws Exception { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setAddBy(loginUser.getNickname()); + return toAjax(sysSydService.insertByBo(bo)); + } + + /** + * 修改服务商 + */ + @SaCheckPermission("payment:syd:edit") + @Log(title = "服务商", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setEditer(loginUser.getNickname()); + return toAjax(sysSydService.updateByBo(bo)); + } + + /** + * 删除服务商 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:syd:remove") + @Log(title = "服务商", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydService.deleteWithValidByIds(List.of(ids), true)); + } + + @Log(title = "开通虚拟户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/creatXNnum") + public R creatXNnum(@NotNull(message = "服务商id不能为空") Long id,@NotEmpty(message = "服务商名称不能为空") String gsmc) { + return toAjax(sysSydService.creatSydXNnum(id,gsmc)); + } + + /** + * 验证是否配置结算中心 + * @author 张涛 + * @date 2021年9月9日 + * @param sydId 结算中心id + * @return + */ + @PostMapping("/valiConfig") + public R valiConfig(@NotNull(message = "服务商id") Long sydId,@NotEmpty(message = "结算通道") String passage) { + return R.ok(sysSydService.valiConfig(sydId,passage)!=null); + } + + /** + * 获取结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + @PostMapping("/getWorkerSignInfo") + public R getWorkerSignInfo(@NotEmpty(message = "服务商id") int sydId) { + return R.ok(sysSydService.getWorkerSignInfo(sydId)); + } + + /** + * 保存结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @return + */ + @Log(title = "保存结算中心的签约信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/saveWorkerSignInfo") + public R saveWorkerSignInfo(@Validated(EditGroup.class) @RequestBody SysSydSignContent sign) { + return toAjax(sysSydService.saveWorkerSignInfo(sign)); + } + + /** + * 获取结算中心的支付宝签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + @PostMapping("/getSignInfo") + public R getSignInfo(@NotNull(message = "服务商id") Long sydId, @NotEmpty(message = "结算通道") String passage) { + return R.ok(sysSydService.getSignInfo(sydId,passage)); + } + + + + @GetMapping("/getInvInfo") + @Log(title = "获取服务商的开票信息", businessType = BusinessType.SELECT) + public R getSydInvInfo(Long sydId){ + SysSydVo resultVo = new SysSydVo(); + SysSydVo sydVo = this.sysSydService.queryById(sydId); + resultVo.setGsmc(sydVo.getGsmc()); + resultVo.setBankCard(sydVo.getBankCard()); + resultVo.setAddress(sydVo.getAddress()); + resultVo.setNsrSbh(sydVo.getNsrSbh()); + resultVo.setKfh(sydVo.getKfh()); + resultVo.setConPhone(sydVo.getConPhone()); + return R.ok(resultVo); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java new file mode 100644 index 0000000..902f9ca --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydFlowsController.java @@ -0,0 +1,156 @@ +package org.dromara.payment.sys.controller; + +import java.io.IOException; +import java.util.*; + +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.bo.MerBillDetailBo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.service.ISysSydFlowsService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商流水 + * 前端访问路由地址为:/payment/sydFlows + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydFlows") +public class SysSydFlowsController extends BaseController { + + private final ISysSydFlowsService sysSydFlowsService; + + /** + * 查询服务商流水列表 + */ + //@SaCheckPermission("payment:sydFlows:list") + @GetMapping("/list") + public TableDataInfo list(SysSydFlowsBo bo, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + return sysSydFlowsService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商流水列表 + */ + //@SaCheckPermission("payment:sydFlows:export") + @Log(title = "服务商流水", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydFlowsBo bo, HttpServletResponse response,String fields) { + LoginUser loginUser = LoginHelper.getLoginUser(); + bo.setSydId(loginUser.getBusId()); + List fieldList = new ArrayList(); + if(StringUtils.isNotBlank(fields)){ + fieldList = Arrays.asList(fields.split(",")); + } + List list = sysSydFlowsService.queryList(bo); + ExcelUtil.exportExcelInclude(list, "服务商流水", SysSydFlowsVo.class, response,fieldList); + } + + /** + * 导出服务商交易流水B2B回单 + * @param ids 交易流水id(多个逗号分隔) + */ + @Log(title = "导出服务商交易流水B2B回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2B") + public void exportB2B(@NotBlank(message = "交易流水id不能为空") String ids, HttpServletResponse response) throws IOException { + SysSydFlowsBo where = new SysSydFlowsBo(); + where.setPayReceiptType(1); + where.setParams(new HashMap<>()); + where.getParams().put("ids",ids); + List details = sysSydFlowsService.queryList(where); + List b2bs = StreamUtils.toList(details,SysSydFlowsVo::getPayReceipt, b2b -> StringUtils.isNotBlank(b2b)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2bs); + } + + /** + * 导出服务商交易流水B2C回单 + * @param ids 交易流水id(多个逗号分隔) + */ + @Log(title = "导出服务商交易流水B2C回单", businessType = BusinessType.EXPORT) + @PostMapping("/exportB2C") + public void exportB2C(@NotBlank(message = "交易流水id不能为空") String ids, HttpServletResponse response) throws IOException { + SysSydFlowsBo where = new SysSydFlowsBo(); + where.setPayReceiptType(2); + where.setParams(new HashMap<>()); + where.getParams().put("ids",ids); + List details = sysSydFlowsService.queryList(where); + List b2cs = StreamUtils.toList(details,SysSydFlowsVo::getPayReceipt, b2c -> StringUtils.isNotBlank(b2c)); + FileUtils.downloadZip(DateUtils.dateTimeNow()+ RandomUtil.randomNumbers(8),response,b2cs); + } + + /** + * 获取服务商流水详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydFlows:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydFlowsService.queryById(id)); + } + + /** + * 新增服务商流水 + */ + @SaCheckPermission("payment:sydFlows:add") + @Log(title = "服务商流水", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydFlowsBo bo) { + return toAjax(sysSydFlowsService.insertByBo(bo)); + } + + /** + * 修改服务商流水 + */ + @SaCheckPermission("payment:sydFlows:edit") + @Log(title = "服务商流水", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydFlowsBo bo) { + return toAjax(sysSydFlowsService.updateByBo(bo)); + } + + /** + * 删除服务商流水 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydFlows:remove") + @Log(title = "服务商流水", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydFlowsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java new file mode 100644 index 0000000..566ab98 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydLogController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.bo.SysSydLogBo; +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.payment.sys.service.ISysSydLogService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商变动记录 + * 前端访问路由地址为:/payment/sydLog + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydLog") +public class SysSydLogController extends BaseController { + + private final ISysSydLogService sysSydLogService; + + /** + * 查询服务商变动记录列表 + */ + @SaCheckPermission("payment:sydLog:list") + @GetMapping("/list") + public TableDataInfo list(SysSydLogBo bo, PageQuery pageQuery) { + return sysSydLogService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商变动记录列表 + */ + @SaCheckPermission("payment:sydLog:export") + @Log(title = "服务商变动记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydLogBo bo, HttpServletResponse response) { + List list = sysSydLogService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商变动记录", SysSydLogVo.class, response); + } + + /** + * 获取服务商变动记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydLog:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydLogService.queryById(id)); + } + + /** + * 新增服务商变动记录 + */ + @SaCheckPermission("payment:sydLog:add") + @Log(title = "服务商变动记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydLogBo bo) { + return toAjax(sysSydLogService.insertByBo(bo)); + } + + /** + * 修改服务商变动记录 + */ + @SaCheckPermission("payment:sydLog:edit") + @Log(title = "服务商变动记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydLogBo bo) { + return toAjax(sysSydLogService.updateByBo(bo)); + } + + /** + * 删除服务商变动记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydLog:remove") + @Log(title = "服务商变动记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydLogService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java new file mode 100644 index 0000000..9005a3b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydProductController.java @@ -0,0 +1,127 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.dromara.payment.sys.service.ISysSydProductService; +import org.dromara.system.api.model.LoginUser; +import org.redisson.api.RList; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商产品 + * 前端访问路由地址为:/payment/sydProduct + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydProduct") +public class SysSydProductController extends BaseController { + + private final ISysSydProductService sysSydProductService; + + /** + * 查询服务商产品列表 + */ + //@SaCheckPermission("payment:sydProduct:list") + @GetMapping("/list") + public TableDataInfo list(SysSydProductBo bo, PageQuery pageQuery) { + return sysSydProductService.queryPageList(bo, pageQuery); + } + + @GetMapping("/queryList") + public R> queryList(SysSydProductBo bo) { + return R.ok(sysSydProductService.queryList(bo)); + } + + /** + * 导出服务商产品列表 + */ + //@SaCheckPermission("payment:sydProduct:export") + @Log(title = "服务商产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydProductBo bo, HttpServletResponse response) { + List list = sysSydProductService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商产品", SysSydProductVo.class, response); + } + + /** + * 获取服务商产品详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("payment:sydProduct:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydProductService.queryById(id)); + } + + /** + * 新增服务商产品 + */ + //@SaCheckPermission("payment:sydProduct:add") + @Log(title = "服务商产品", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydProductBo bo) { + LoginUser loginUser = LoginHelper.getLoginUser(); +// bo.setSydId(loginUser.getBusId()); +// bo.setSydNo(loginUser.getBusNo()); + return toAjax(sysSydProductService.insertByBo(bo)); + } + + /** + * 修改服务商产品 + */ + //@SaCheckPermission("payment:sydProduct:edit") + @Log(title = "服务商产品", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydProductBo bo) { + return toAjax(sysSydProductService.updateByBo(bo)); + } + + /** + * 删除服务商产品 + * + * @param ids 主键串 + */ + //@SaCheckPermission("payment:sydProduct:remove") + @Log(title = "服务商产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydProductService.deleteWithValidByIds(List.of(ids), true)); + } + + + + + + @PutMapping("/upDown") + @Log(title = "服务商产品上下架", businessType = BusinessType.UPDATE) + public R upDown(Long id,Integer status){ + return R.ok(this.sysSydProductService.upDown(id,status)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java new file mode 100644 index 0000000..412c550 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysSydSignContentController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.sys.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.dromara.payment.sys.service.ISysSydSignContentService; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.sys.domain.bo.SysSydSignContentBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 服务商协议内容 + * 前端访问路由地址为:/payment/sydSignContent + * + * @author LionLi + * @date 2024-03-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sydSignContent") +public class SysSydSignContentController extends BaseController { + + private final ISysSydSignContentService sysSydSignContentService; + + /** + * 查询服务商协议内容列表 + */ + @SaCheckPermission("payment:sydSignContent:list") + @GetMapping("/list") + public TableDataInfo list(SysSydSignContentBo bo, PageQuery pageQuery) { + return sysSydSignContentService.queryPageList(bo, pageQuery); + } + + /** + * 导出服务商协议内容列表 + */ + @SaCheckPermission("payment:sydSignContent:export") + @Log(title = "服务商协议内容", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysSydSignContentBo bo, HttpServletResponse response) { + List list = sysSydSignContentService.queryList(bo); + ExcelUtil.exportExcel(list, "服务商协议内容", SysSydSignContentVo.class, response); + } + + /** + * 获取服务商协议内容详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:sydSignContent:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysSydSignContentService.queryById(id)); + } + + /** + * 新增服务商协议内容 + */ + @SaCheckPermission("payment:sydSignContent:add") + @Log(title = "服务商协议内容", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysSydSignContentBo bo) { + return toAjax(sysSydSignContentService.insertByBo(bo)); + } + + /** + * 修改服务商协议内容 + */ + @SaCheckPermission("payment:sydSignContent:edit") + @Log(title = "服务商协议内容", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysSydSignContentBo bo) { + return toAjax(sysSydSignContentService.updateByBo(bo)); + } + + /** + * 删除服务商协议内容 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:sydSignContent:remove") + @Log(title = "服务商协议内容", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysSydSignContentService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java new file mode 100644 index 0000000..36df069 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/controller/SysUnitController.java @@ -0,0 +1,144 @@ +package org.dromara.payment.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 单位基础信息 + * 前端访问路由地址为:/payment/unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/unit") +public class SysUnitController extends BaseController { + + private final ISysUnitService sysUnitService; + + /** + * 查询单位基础信息列表 + */ + @SaCheckPermission("payment:unit:list") + @GetMapping("/list") + public TableDataInfo list(SysUnitBo bo, PageQuery pageQuery) { + return sysUnitService.queryPageList(bo, pageQuery); + } + + /** + * 导出单位基础信息列表 + */ + @SaCheckPermission("payment:unit:export") + @Log(title = "单位基础信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysUnitBo bo, HttpServletResponse response) { + List list = sysUnitService.queryList(bo); + ExcelUtil.exportExcel(list, "单位基础信息", SysUnitVo.class, response); + } + + /** + * 获取单位基础信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("payment:unit:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysUnitService.queryById(id)); + } + + /** + * 新增单位基础信息 + */ + @SaCheckPermission("payment:unit:add") + @Log(title = "单位基础信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysUnitBo bo) { + return toAjax(sysUnitService.insertByBo(bo)); + } + + /** + * 修改单位基础信息 + */ + @SaCheckPermission("payment:unit:edit") + @Log(title = "单位基础信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysUnitBo bo) { + return toAjax(sysUnitService.updateByBo(bo)); + } + + /** + * 删除单位基础信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:unit:remove") + @Log(title = "单位基础信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysUnitService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取单位配置大类下面的组信息 + * @param unit_id + * @param class_alias + * @return + */ + @GetMapping(value = "/getConfGroupByUnit/{unit_id}/{class_alias}") + public R> getConfGroupByUnit(@NotEmpty(message = "单位id不能为空") @PathVariable Long unit_id, @NotEmpty(message = "配置类别不能为空") @PathVariable String class_alias) { + return R.ok(sysUnitService.getConfGroupByUnit(unit_id,class_alias)); + } + + /** + * 根据配置组查询单位配置项明细 + * @param unit_id + * @param conf_group + * @return + */ + @GetMapping(value = "/getConfDetailByUnit/{unit_id}/{conf_group}") + public R> getConfDetailByUnit(@NotEmpty(message = "单位id不能为空") @PathVariable Long unit_id, @NotEmpty(message = "配置组不能为空") @PathVariable String conf_group) { + return R.ok(sysUnitService.getConfDetailByUnit(unit_id,conf_group)); + } + + @Log(title = "编辑单位配置项", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/editConfDetail") + public R editConfDetail(@RequestBody Map map) { + List lendReco = JSONObject.parseArray(map.get("confs").toString(),UnitConfDetail.class); + return toAjax(sysUnitService.editConfDetail(lendReco)); + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java new file mode 100644 index 0000000..b7ea3e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/AccAccounts.java @@ -0,0 +1,101 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 线下银行账户对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("acc_accounts") +public class AccAccounts extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public AccAccounts() {} + + + + public AccAccounts(String bankType, String bankCard, Short useObj, Long useObjId, String useObjName,String bankArgNo) { + this.bankType = bankType; + this.bankCard = bankCard; + this.useObj = useObj; + this.useObjId = useObjId; + this.useObjName = useObjName; + this.bankArgNo = bankArgNo; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 银行账户名称 + */ + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Short useObj; + + /** + * 使用对象id + */ + private Long useObjId; + + /** + * 使用对象名称 + */ + private String useObjName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java new file mode 100644 index 0000000..e72a869 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/BusDownloads.java @@ -0,0 +1,47 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 异步下载对象 bus_downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_downloads") +public class BusDownloads extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 业务类型(1 用户身份证) + */ + private Integer busType; + + /** + * 附件地址 + */ + private String url; + + + private Long ossId; + + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java new file mode 100644 index 0000000..22f2357 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSyd.java @@ -0,0 +1,223 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd") +public class SysSyd extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id",type = IdType.INPUT) + private Long id; + + /** + * 结算中心编号 + */ + private String no; + + /** + * 结算中心名称 + */ + private String gsmc; + + /** + * 开户地 + */ + private String kfd; + + /** + * 开户行 + */ + private String kfh; + + /** + * 开户行行号 + */ + private String khhNo; + + /** + * 银行类型 + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 基本税率(%) + */ + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 法人 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frCardid; + + /** + * 法人手机号 + */ + private String frPhone; + + /** + * 联系人姓名 + */ + private String conName; + + /** + * 联系人手机号 + */ + private String conPhone; + + /** + * 联系人身份证 + */ + private String conCardid; + + /** + * 联系人邮箱 + */ + private String conEmail; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + @TableField(exist = false) + private transient Short signMode; + @TableField(exist = false) + private transient Integer signValidTime; + + + private String unitArea; + + + private String unitAreaName; + + + private String yyzz; + + private String khxkz; + + private String frSfzzm; + + private String frSfzfm; + + private Integer status = 1; + + private Long threeId; + + private Long parkId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java new file mode 100644 index 0000000..dc217f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccount.java @@ -0,0 +1,141 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商账户对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_account") +public class SysSydAccount extends BaseEntity { + + /** + * + */ + public SysSydAccount() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param sydId + * @param accId + * @param bankType + * @param bankCard + * @param balance + * @param frozen + * @param isDefault + * @param addTime + */ + + public SysSydAccount(Long id,Long sydId, Long accId,Integer accType, String bankType, String bankCard, Long balance, Long frozen, + Long isDefault, Date addTime,String khh,String lhh,String name) { + super(); + this.id = id; + this.sydId = sydId; + this.accId = accId; + this.bankType = bankType; + this.bankCard = bankCard; + this.balance = balance; + this.frozen = frozen; + this.isDefault = isDefault; + this.addTime = addTime; + this.accType = accType; + this.khh = khh; + this.lhh = lhh; + this.name = name; + + } + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 税源地id + */ + private Long sydId; + + /** + * 账户id + */ + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + private Integer accType; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 余额 + */ + private Long balance; + + /** + * 冻结金额 + */ + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 已结算金额 + */ + private Long settlement; + + /** + * 已开票金额 + */ + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + private Integer status; + + /** + * 外卡卡号 + */ + private String outBankCard; + + + private String lhh; + + private String khh; + + private String name; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java new file mode 100644 index 0000000..526c323 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydAccountSyn.java @@ -0,0 +1,51 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 服务商账户同步对象 sys_syd_account_syn + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_account_syn") +public class SysSydAccountSyn extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @TableId(value = "id") + private Long id; + + /** + * 同步顺序(倒序) + */ + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + private Long synLock; + + /** + * 最近同步批次 + */ + private String synBatch; + + /** + * 最近同步的位置 + */ + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java new file mode 100644 index 0000000..405adaa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydCashout.java @@ -0,0 +1,118 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商提现记录对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_cashout") +public class SysSydCashout extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心账户id + */ + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java new file mode 100644 index 0000000..f8c53dc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydConfig.java @@ -0,0 +1,71 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 服务商配置对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_config") +public class SysSydConfig extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public SysSydConfig(){} + + public SysSydConfig(Integer autoApprove) { + this.autoApprove = autoApprove; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + private Integer end; + + /** + * 税率(%) + */ + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + private Long calStyle; + + /** + * 是否自动审批(0:否 1:是) + */ + private Integer autoApprove; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java new file mode 100644 index 0000000..9dc92c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydFlows.java @@ -0,0 +1,216 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商流水对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_flows") +public class SysSydFlows extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public SysSydFlows(){} + + public SysSydFlows(Integer direction,Long sydId, Integer busType, String channel, String busNo, String bankNo, Long money, Date addTime, String addBy, String busDesc, String billNo, Long billId, Long billDetailId, String tranNo, Integer tranType, Integer tranStatus, Integer payerType, Long payerId, String payerName, String payerAcc, Long payerAccId, Integer payeeType, Long payeeId, String payeeName, String payeeAcc, Long payeeAccId, String remark, Integer payReceiptType) { + this.sydId = sydId; + this.busType = busType; + this.channel = channel; + this.busNo = busNo; + this.bankNo = bankNo; + this.money = money; + this.direction = direction; + this.addTime = addTime; + this.addBy = addBy; + this.busDesc = busDesc; + this.billNo = billNo; + this.billId = billId; + this.billDetailId = billDetailId; + this.tranNo = tranNo; + this.tranType = tranType; + this.tranStatus = tranStatus; + this.payerType = payerType; + this.payerId = payerId; + this.payerName = payerName; + this.payerAcc = payerAcc; + this.payerAccId = payerAccId; + this.payeeType = payeeType; + this.payeeId = payeeId; + this.payeeName = payeeName; + this.payeeAcc = payeeAcc; + this.payeeAccId = payeeAccId; + this.remark = remark; + this.payReceiptType = payReceiptType; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + private String bankNo; + + /** + * 交易金额(分) + */ + private Long money; + + /** + * 余额(分) + */ + private Long balance; + + /** + * 流水方向(0:无变动 1:收入 2:支出) + */ + private transient Integer direction; + + /** + * 交易时间 + */ + private Date addTime; + + /** + * 交易人 + */ + private String addBy; + + /** + * 业务描述 + */ + private String busDesc; + + /** + * 账单批次号 + */ + private String billNo; + + /** + * 账单id + */ + private Long billId; + + /** + * 账单明细id + */ + private Long billDetailId; + + /** + * 交易订单号 + */ + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payerType; + + /** + * 付款方id + */ + private Long payerId; + + /** + * 付款方名称 + */ + private String payerName; + + /** + * 付款方账号 + */ + private String payerAcc; + + /** + * 付款方账号id + */ + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + private Integer payeeType; + + /** + * 收款方id + */ + private Long payeeId; + + /** + * 收款方名称 + */ + private String payeeName; + + /** + * 收款方账号 + */ + private String payeeAcc; + + /** + * 收款方账号id + */ + private Long payeeAccId; + + /** + * 备注 + */ + private String remark; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java new file mode 100644 index 0000000..4e4da43 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydLog.java @@ -0,0 +1,204 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商变动记录对象 sys_syd_log + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_log") +public class SysSydLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String no; + + /** + * 结算中心名称 + */ + private String gsmc; + + /** + * 开户地 + */ + private String kfd; + + /** + * 开户行 + */ + private String kfh; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 基本税率(%) + */ + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + private String nsrSbh; + + /** + * 法人 + */ + private String fr; + + /** + * 法人身份证 + */ + private String frCardid; + + /** + * 法人手机号 + */ + private String frPhone; + + /** + * 联系人姓名 + */ + private String conName; + + /** + * 联系人手机号 + */ + private String conPhone; + + /** + * 联系人身份证 + */ + private String conCardid; + + /** + * 联系人邮箱 + */ + private String conEmail; + + /** + * 实际经营地址 + */ + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额) + */ + private Long limitAmount; + + /** + * 自雇者签约模式(0:不用签约 1:需要签约 2:共享签约) + */ + private Integer signMode; + + /** + * 自雇者签约有效期(年) + */ + private Long signValidTime; + + /** + * 记录时间 + */ + private Date logTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java new file mode 100644 index 0000000..1e1fb01 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydProduct.java @@ -0,0 +1,92 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + +import java.io.Serial; + +/** + * 服务商产品对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_product") +public class SysSydProduct extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Long busType; + + /** + * 产品编号 + */ + private String no; + + /** + * 配置服务费率(%) + */ + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + + private String invoiceIds; + + + private transient Long opId; + + + private BigDecimal setingServiceCharge; + + + private Integer proStatus; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java new file mode 100644 index 0000000..a3bc3e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysSydSignContent.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 服务商协议内容对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_syd_sign_content") +public class SysSydSignContent extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 结算中心id + */ + @TableId(value = "id") + private Integer id; + + /** + * 协议内容 + */ + private String content; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + private Short signMode; + + private Integer signValidTime; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java new file mode 100644 index 0000000..f735117 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/SysUnit.java @@ -0,0 +1,51 @@ +package org.dromara.payment.sys.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位基础信息对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_unit") +public class SysUnit extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 企业名称 + */ + private String name; + + /** + * 企业编号 + */ + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Integer unitType; + + /** + * 平台客户号 + */ + private String custNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java new file mode 100644 index 0000000..b29aab7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/AccAccountsBo.java @@ -0,0 +1,97 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; + +/** + * 线下银行账户业务对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = AccAccounts.class, reverseConvertGenerate = false) +public class AccAccountsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 银行账户名称 + */ + @NotBlank(message = "银行账户名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + @NotBlank(message = "账户协议编号(交通银行:代发操作)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + @NotNull(message = "是否使用(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer useObj; + + /** + * 使用对象id + */ + @NotNull(message = "使用对象id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long useObjId; + + /** + * 使用对象名称 + */ + @NotBlank(message = "使用对象名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String useObjName; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java new file mode 100644 index 0000000..cd949a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/BusDownloadsBo.java @@ -0,0 +1,45 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 异步下载业务对象 bus_downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusDownloads.class, reverseConvertGenerate = false) +public class BusDownloadsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 业务类型(1 用户身份证) + */ + @NotNull(message = "业务类型(1 用户身份证)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 附件地址 + */ + @NotBlank(message = "附件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String url; + + + private Long ossId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java new file mode 100644 index 0000000..7461e8d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/ProInfoCommonBo.java @@ -0,0 +1,53 @@ +package org.dromara.payment.sys.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.dromara.common.core.utils.DateUtils; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonBo + * @description + * @create 2024-04-24 17:12 + */ +@Data +public class ProInfoCommonBo implements Serializable { + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return endTime; + } + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + + //服务商名称 + private String name; + + //服务商编号 + private String no; + + //产品编号 + private String proNo; + + //企业ID + private Long merchantId; + + //运营商或者代理商编码 + + private Long busId; +} + diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java new file mode 100644 index 0000000..b1efb48 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysPayPwdBo.java @@ -0,0 +1,29 @@ +package org.dromara.payment.sys.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdBo + * @description + * @create 2024-05-13 11:30 + */ +@Data +public class SysPayPwdBo implements Serializable { + + //支付密码 + @NotBlank(message = "支付密码不能为空") + private String payPwd; + + //短信验证码 + @NotBlank(message = "短信验证码不能为空") + private String smsCode; + + //域名 + private String domain; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java new file mode 100644 index 0000000..5a4cf37 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商账户业务对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydAccount.class, reverseConvertGenerate = false) +public class SysSydAccountBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 税源地id + */ + @NotNull(message = "税源地id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + @NotNull(message = "账户类型(0:主账户 1:个人服务费账户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accType; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 余额 + */ + @NotNull(message = "余额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 冻结金额 + */ + @NotNull(message = "冻结金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @NotNull(message = "是否默认(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDefault; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 已结算金额 + */ + @NotNull(message = "已结算金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long settlement; + + /** + * 已开票金额 + */ + @NotNull(message = "已开票金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @NotNull(message = "状态(1:正常 2:冻结)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 外卡卡号 + */ + @NotBlank(message = "外卡卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String outBankCard; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java new file mode 100644 index 0000000..7e2bd54 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydAccountSynBo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 服务商账户同步业务对象 sys_syd_account_syn + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydAccountSyn.class, reverseConvertGenerate = false) +public class SysSydAccountSynBo extends BaseEntity { + + /** + * 账户id + */ + @NotNull(message = "账户id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 同步顺序(倒序) + */ + @NotNull(message = "同步顺序(倒序)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @NotNull(message = "是否正在同步(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synLock; + + /** + * 最近同步批次 + */ + @NotBlank(message = "最近同步批次不能为空", groups = { AddGroup.class, EditGroup.class }) + private String synBatch; + + /** + * 最近同步的位置 + */ + @NotNull(message = "最近同步的位置不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java new file mode 100644 index 0000000..53dea2e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydBo.java @@ -0,0 +1,234 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 服务商业务对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSyd.class, reverseConvertGenerate = false) +public class SysSydBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 结算中心名称 + */ + @NotBlank(message = "结算中心名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String gsmc; + + /** + * 开户地 + */ + @NotBlank(message = "开户地不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfh; + + /** + * 开户行行号 + */ + @NotBlank(message = "开户行行号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String khhNo; + + /** + * 银行类型(字典) + */ + @NotNull(message = "银行类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + + private BigDecimal jbsl; + + /** + * 引用数量 + */ + private Long quoteNum; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 省id + */ + private Long provinceId; + + /** + * 省名称 + */ + private String provinceName; + + /** + * 市id + */ + private Long cityId; + + /** + * 市名称 + */ + private String cityName; + + /** + * 县区id + */ + private Long countyId; + + /** + * 县区名称 + */ + private String countyName; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人 + */ + @NotBlank(message = "法人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frCardid; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frPhone; + + /** + * 联系人姓名 + */ + @NotBlank(message = "联系人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conName; + + /** + * 联系人手机号 + */ + @NotBlank(message = "联系人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conPhone; + + /** + * 联系人身份证 + */ + @NotBlank(message = "联系人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conCardid; + + /** + * 联系人邮箱 + */ + @NotBlank(message = "联系人邮箱不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conEmail; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 经营范围 + */ + private String business; + + /** + * 税源地简称 + */ + private String abridge; + + /** + * 支付密码 + */ + private String payPassword; + + /** + * 密码输入错误次数 + */ + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + private Date passFrozenTime; + + + private String unitArea; + + + private String unitAreaName; + + + private String domain; + + private String yyzz; + + private String khxkz; + + private String frSfzzm; + + private String frSfzfm; + + + private Integer status = 1; + + private Long threeId; + + private Long parkId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java new file mode 100644 index 0000000..4fc3a20 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydCashoutBo.java @@ -0,0 +1,123 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商提现记录业务对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydCashout.class, reverseConvertGenerate = false) +public class SysSydCashoutBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心账户id + */ + @NotNull(message = "结算中心账户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long accId; + + /** + * 业务编号 + */ + private String busNo; + + /** + * 提现金额 + */ + @NotNull(message = "提现金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 提现备注 + */ + private String remark; + + /** + * 提现开户行 + */ + private String khh; + + /** + * 提现开户行行号 + */ + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + private String fr; + + /** + * 提现开户支行 + */ + private String khd; + + /** + * 提现账户(银行账号) + */ + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + private Long payStatus; + + /** + * 支付时间 + */ + private Date payTime; + + /** + * 支付结果备注 + */ + private String payRemark; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 结算通道 + */ + private String passage; + + /** + * 回执单地址 + */ + private String payReceipt; + + /** + * 支付密码 + */ + @NotNull(message = "支付密码不能为空", groups = { AddGroup.class }) + private String password; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java new file mode 100644 index 0000000..2b955f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydConfigBo.java @@ -0,0 +1,68 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydConfig; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; + +/** + * 服务商配置业务对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydConfig.class, reverseConvertGenerate = false) +public class SysSydConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + @NotNull(message = "结算中心id(0:默认配置)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + @NotNull(message = "收税开始范围(单位:分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + @NotNull(message = "收税结束范围(单位:分,-1无限大)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer end; + + /** + * 税率(%) + */ + @NotNull(message = "税率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + @NotNull(message = "是否能使用临时税务登记证(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + @NotNull(message = "计算方式(1:普通 2:逆向)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long calStyle; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java new file mode 100644 index 0000000..27f6122 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydFlowsBo.java @@ -0,0 +1,204 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商流水业务对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydFlows.class, reverseConvertGenerate = false) +public class SysSydFlowsBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @NotNull(message = "业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @NotBlank(message = "支付通道(招行,交行,手动)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channel; + + /** + * 业务流水号(系统内部编号) + */ + @NotBlank(message = "业务流水号(系统内部编号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @NotBlank(message = "三方流水号(银行流水号)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankNo; + + /** + * 交易金额(分) + */ + @NotNull(message = "交易金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long money; + + /** + * 余额(分) + */ + @NotNull(message = "余额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long balance; + + /** + * 交易时间 + */ + @NotNull(message = "交易时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 交易人 + */ + @NotBlank(message = "交易人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 业务描述 + */ + @NotBlank(message = "业务描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String busDesc; + + /** + * 账单批次号 + */ + @NotBlank(message = "账单批次号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String billNo; + + /** + * 账单id + */ + @NotNull(message = "账单id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billId; + + /** + * 账单明细id + */ + @NotNull(message = "账单明细id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long billDetailId; + + /** + * 交易订单号 + */ + @NotBlank(message = "交易订单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tranNo; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @NotNull(message = "交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranType; + + /** + * 交易状态(2:成功 3:失败) + */ + @NotNull(message = "交易状态(2:成功 3:失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer tranStatus; + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payerType; + + /** + * 付款方id + */ + @NotNull(message = "付款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerId; + + /** + * 付款方名称 + */ + @NotBlank(message = "付款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerName; + + /** + * 付款方账号 + */ + @NotBlank(message = "付款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payerAcc; + + /** + * 付款方账号id + */ + @NotNull(message = "付款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @NotNull(message = "收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payeeType; + + /** + * 收款方id + */ + @NotNull(message = "收款方id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeId; + + /** + * 收款方名称 + */ + @NotBlank(message = "收款方名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeName; + + /** + * 收款方账号 + */ + @NotBlank(message = "收款方账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payeeAcc; + + /** + * 收款方账号id + */ + @NotNull(message = "收款方账号id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payeeAccId; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 回执单地址 + */ + @NotBlank(message = "回执单地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @NotNull(message = "回执单类型(1:B2B 2:B2C)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer payReceiptType; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java new file mode 100644 index 0000000..0d8d248 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydLogBo.java @@ -0,0 +1,237 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydLog; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 服务商变动记录业务对象 sys_syd_log + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydLog.class, reverseConvertGenerate = false) +public class SysSydLogBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 结算中心名称 + */ + @NotBlank(message = "结算中心名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String gsmc; + + /** + * 开户地 + */ + @NotBlank(message = "开户地不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfd; + + /** + * 开户行 + */ + @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String kfh; + + /** + * 银行类型(字典) + */ + @NotNull(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 基本税率(%) + */ + @NotNull(message = "基本税率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal jbsl; + + /** + * 引用数量 + */ + @NotNull(message = "引用数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quoteNum; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ + @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 省id + */ + @NotNull(message = "省id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long provinceId; + + /** + * 省名称 + */ + @NotBlank(message = "省名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String provinceName; + + /** + * 市id + */ + @NotNull(message = "市id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long cityId; + + /** + * 市名称 + */ + @NotBlank(message = "市名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cityName; + + /** + * 县区id + */ + @NotNull(message = "县区id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long countyId; + + /** + * 县区名称 + */ + @NotBlank(message = "县区名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String countyName; + + /** + * 纳税人识别号 + */ + @NotBlank(message = "纳税人识别号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nsrSbh; + + /** + * 法人 + */ + @NotBlank(message = "法人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fr; + + /** + * 法人身份证 + */ + @NotBlank(message = "法人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frCardid; + + /** + * 法人手机号 + */ + @NotBlank(message = "法人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String frPhone; + + /** + * 联系人姓名 + */ + @NotBlank(message = "联系人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conName; + + /** + * 联系人手机号 + */ + @NotBlank(message = "联系人手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conPhone; + + /** + * 联系人身份证 + */ + @NotBlank(message = "联系人身份证不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conCardid; + + /** + * 联系人邮箱 + */ + @NotBlank(message = "联系人邮箱不能为空", groups = { AddGroup.class, EditGroup.class }) + private String conEmail; + + /** + * 实际经营地址 + */ + @NotBlank(message = "实际经营地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 经营范围 + */ + @NotBlank(message = "经营范围不能为空", groups = { AddGroup.class, EditGroup.class }) + private String business; + + /** + * 税源地简称 + */ + @NotBlank(message = "税源地简称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String abridge; + + /** + * 限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额) + */ + @NotNull(message = "限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long limitAmount; + + /** + * 自雇者签约模式(0:不用签约 1:需要签约 2:共享签约) + */ + @NotNull(message = "自雇者签约模式(0:不用签约 1:需要签约 2:共享签约)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signMode; + + /** + * 自雇者签约有效期(年) + */ + @NotNull(message = "自雇者签约有效期(年)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long signValidTime; + + /** + * 记录时间 + */ + @NotNull(message = "记录时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date logTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java new file mode 100644 index 0000000..b836dfc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydProductBo.java @@ -0,0 +1,107 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.sys.domain.SysSydProduct; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 服务商产品业务对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydProduct.class, reverseConvertGenerate = false) +public class SysSydProductBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + //@NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + //@NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 产品编号 + */ + //@NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 配置服务费率(%) + */ + @NotNull(message = "配置服务费率(%)不能为空", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal serviceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @NotNull(message = "计费模式(1:个人应得计费、2:开票金额计费)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @NotNull(message = "结算方式(1:到卡 2:余额)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @NotNull(message = "单月发放上限(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @NotNull(message = "开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer invoiceType; + + /** + * 开票类目名称 + */ + private String invoiceItems; + + /** + * 运营商id + */ + private Long opId; + + /** + * 开票类目列表 + */ + private List invoiceItemList; + + + private BigDecimal setingServiceCharge; + + private String invoiceIds; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java new file mode 100644 index 0000000..b8022d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysSydSignContentBo.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.domain.bo; + +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 服务商协议内容业务对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSydSignContent.class, reverseConvertGenerate = false) +public class SysSydSignContentBo extends BaseEntity { + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 协议内容 + */ + @NotBlank(message = "协议内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String content; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java new file mode 100644 index 0000000..43101f1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/bo/SysUnitBo.java @@ -0,0 +1,59 @@ +package org.dromara.payment.sys.domain.bo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +/** + * 单位基础信息业务对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUnit.class, reverseConvertGenerate = false) +public class SysUnitBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 企业编号 + */ + @NotBlank(message = "企业编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @NotNull(message = "企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer unitType; + + /** + * 平台客户号 + */ + @NotBlank(message = "平台客户号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String custNo; + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java new file mode 100644 index 0000000..7287207 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/AccAccountsVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.sys.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.syd.domain.syd.RemoteAccAccountsVo; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 线下银行账户Convert接口 + * + * @author LionLi + * @date 2024-03-27 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface AccAccountsVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java new file mode 100644 index 0000000..ef7de92 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysSydVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.payment.sys.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.syd.domain.syd.RemoteSysSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 用户信息转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysSydVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java new file mode 100644 index 0000000..de0f1cb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/convert/SysUnitVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.sys.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; +import org.dromara.payment.api.syd.domain.RemoteSysUnitVo; + +/** + * 单位基础信息Convert接口 + * + * @author LionLi + * @date 2024-03-27 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUnitVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java new file mode 100644 index 0000000..c0e6bd4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/AccAccountsVo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.AccAccounts; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 线下银行账户视图对象 acc_accounts + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = AccAccounts.class) +public class AccAccountsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 银行账户名称 + */ + @ExcelProperty(value = "银行账户名称") + private String bankAccName; + + /** + * 账户协议编号(交通银行:代发操作) + */ + @ExcelProperty(value = "账户协议编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "交=通银行:代发操作") + private String bankArgNo; + + /** + * 是否使用(0:否 1:是) + */ + @ExcelProperty(value = "是否使用", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isUse; + + /** + * 使用对象(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "使用对象", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer useObj; + + /** + * 使用对象id + */ + @ExcelProperty(value = "使用对象id") + private Long useObjId; + + /** + * 使用对象名称 + */ + @ExcelProperty(value = "使用对象名称") + private String useObjName; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java new file mode 100644 index 0000000..5bec61a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/BusDownloadsVo.java @@ -0,0 +1,56 @@ +package org.dromara.payment.sys.domain.vo; + +import org.dromara.payment.sys.domain.BusDownloads; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 异步下载视图对象 bus_downloads + * + * @author LionLi + * @date 2024-06-21 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusDownloads.class) +public class BusDownloadsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 业务类型(1 用户身份证) + */ + @ExcelProperty(value = "业务类型(1 用户身份证)") + private Integer busType; + + /** + * 附件地址 + */ + @ExcelProperty(value = "附件地址") + private String url; + + + private Long ossId; + + + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java new file mode 100644 index 0000000..3d34647 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/ProInfoCommonVo.java @@ -0,0 +1,75 @@ +package org.dromara.payment.sys.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonVo + * @description + * @create 2024-04-24 17:05 + */ + +@Data +public class ProInfoCommonVo implements Serializable { + + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty("产品编号") + private String proNo; + + @ExcelProperty("代理商名称") + private String channelName; + + @ExcelProperty("服务商名称") + private String serviceName; + + @ExcelProperty("服务商编号") + private String serviceNo; + + @ExcelProperty("业务类型") + private Integer busType; + + @ExcelProperty("开票类型") + private Integer invoiceType; + + @ExcelProperty("开票项目") + private String invoiceItems; + + @ExcelProperty("费率(%)") + private BigDecimal serviceCharge; + + @ExcelProperty("计费模式") + private Integer chargeMode; + + @ExcelProperty("到账方式") + private Integer settlementStyle; + + private Long maxMonth; + + + @ExcelProperty("单月发放上限(元)") + private String maxMonthStr; + + @ExcelProperty("上架状态") + private Integer proStatus; + + public String getMaxMonthStr() { + if(maxMonth != null) { + return StringUtils.fenToYuanFormatter(maxMonth); + }else { + return "--"; + } + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java new file mode 100644 index 0000000..fcc8c7b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SelectSydVo.java @@ -0,0 +1,21 @@ +package org.dromara.payment.sys.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class SelectSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long merId; + + private Long sydId; + + private String sydName; + + private String sydNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java new file mode 100644 index 0000000..d6956c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountSynVo.java @@ -0,0 +1,62 @@ +package org.dromara.payment.sys.domain.vo; + +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商账户同步视图对象 sys_syd_account_syn + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydAccountSyn.class) +public class SysSydAccountSynVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long id; + + /** + * 同步顺序(倒序) + */ + @ExcelProperty(value = "同步顺序", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "倒=序") + private Long sort; + + /** + * 是否正在同步(0:否 1:是) + */ + @ExcelProperty(value = "是否正在同步", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long synLock; + + /** + * 最近同步批次 + */ + @ExcelProperty(value = "最近同步批次") + private String synBatch; + + /** + * 最近同步的位置 + */ + @ExcelProperty(value = "最近同步的位置") + private Long synPosition; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java new file mode 100644 index 0000000..f3a53aa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydAccountVo.java @@ -0,0 +1,141 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商账户视图对象 sys_syd_account + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydAccount.class) +public class SysSydAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 税源地id + */ + @ExcelProperty(value = "税源地id") + private Long sydId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 账户类型(0:主账户 1:个人服务费账户) + */ + @ExcelProperty(value = "账户类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:主账户,1=:个人服务费账户") + private Long accType; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 余额 + */ + @ExcelProperty(value = "余额") + private Long balance; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozen; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 已结算金额 + */ + @ExcelProperty(value = "已结算金额") + private Long settlement; + + /** + * 已开票金额 + */ + @ExcelProperty(value = "已开票金额") + private Long invoice; + + /** + * 状态(1:正常 2:冻结) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:冻结") + private Integer status; + + /** + * 外卡卡号 + */ + @ExcelProperty(value = "外卡卡号") + private String outBankCard; + + /** + * 归属账户方 + */ + private String accName; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java new file mode 100644 index 0000000..58e4b51 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydCashoutVo.java @@ -0,0 +1,143 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydCashout; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商提现记录视图对象 sys_syd_cashout + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydCashout.class) +public class SysSydCashoutVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心账户id + */ + @ExcelProperty(value = "结算中心账户id") + private Long accId; + + /** + * 业务编号 + */ + @ExcelProperty(value = "业务编号") + private String busNo; + + /** + * 提现金额 + */ + @ExcelProperty(value = "提现金额") + private Long amount; + + /** + * 提现备注 + */ + @ExcelProperty(value = "提现备注") + private String remark; + + /** + * 提现开户行 + */ + @ExcelProperty(value = "提现开户行") + private String khh; + + /** + * 提现开户行行号 + */ + @ExcelProperty(value = "提现开户行行号") + private String khhNo; + + /** + * 提现账户名(运营商名称) + */ + @ExcelProperty(value = "提现账户名", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "运=营商名称") + private String fr; + + /** + * 提现开户支行 + */ + @ExcelProperty(value = "提现开户支行") + private String khd; + + /** + * 提现账户(银行账号) + */ + @ExcelProperty(value = "提现账户", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "银=行账号") + private String bankCard; + + /** + * 支付结果(0:初始状态,1:待支付 2:支付中 3:支付成功 4:支付失败) + */ + @ExcelProperty(value = "支付结果", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:初始状态,1:待支付,2=:支付中,3=:支付成功,4=:支付失败") + private Long payStatus; + + /** + * 支付时间 + */ + @ExcelProperty(value = "支付时间") + private Date payTime; + + /** + * 支付结果备注 + */ + @ExcelProperty(value = "支付结果备注") + private String payRemark; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java new file mode 100644 index 0000000..208983b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydConfigVo.java @@ -0,0 +1,78 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; +import org.dromara.payment.sys.domain.SysSydConfig; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商配置视图对象 sys_syd_config + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydConfig.class) +public class SysSydConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id(0:默认配置) + */ + @ExcelProperty(value = "结算中心id(0:默认配置)") + private Long sydId; + + /** + * 收税开始范围(单位:分) + */ + @ExcelProperty(value = "收税开始范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:分") + private Integer begin; + + /** + * 收税结束范围(单位:分,-1无限大) + */ + @ExcelProperty(value = "收税结束范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:分,-1无限大") + private Integer end; + + /** + * 税率(%) + */ + @ExcelProperty(value = "税率", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "%=") + private BigDecimal rate; + + /** + * 是否能使用临时税务登记证(0:否 1:是) + */ + @ExcelProperty(value = "是否能使用临时税务登记证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isTaxCertificate; + + /** + * 计算方式(1:普通 2:逆向) + */ + @ExcelProperty(value = "计算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:普通,2=:逆向") + private Long calStyle; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java new file mode 100644 index 0000000..f28781b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydFlowsVo.java @@ -0,0 +1,244 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.sys.domain.SysSydFlows; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商流水视图对象 sys_syd_flows + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydFlows.class) +public class SysSydFlowsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 交易时间 + */ + @ExcelProperty(value = "交易时间") + private Date addTime; + + + + /** + * 账单批次号 + */ + @ExcelProperty(value = "代发批次号") + private String billNo; + + + /** + * 业务流水号(系统内部编号) + */ + @ExcelProperty(value = "业务流水号") + private String busNo; + + /** + * 三方流水号(银行流水号) + */ + @ExcelProperty(value = "三方流水号") + private String bankNo; + + /** + * 交易订单号 + */ + @ExcelProperty(value = "交易订单号") + private String tranNo; + + + /** + * 付款方名称 + */ + @ExcelProperty(value = "付款方名称") + private String payerName; + + /** + * 付款方账号 + */ + @ExcelProperty(value = "付款方账号") + private String payerAcc; + + + /** + * 收款方名称 + */ + @ExcelProperty(value = "收款方名称") + private String payeeName; + + /** + * 收款方账号 + */ + @ExcelProperty(value = "收款方账号") + private String payeeAcc; + + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 业务类型(1:转账到个人、2:充值 3:转账到平台 4:转账到运营商 5:转账到服务商 6:服务商资金冻结 7:服务商资金解冻 8:运营商资金冻结 9:运营商资金解冻 10:代理商资金冻结 11:代理商资金解冻 12:转账到代理商余额) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:转账到个人、2:充值,3=:转账到平台,4=:转账到运营商,5=:转账到服务商,6=:服务商资金冻结,7=:服务商资金解冻,8=:运营商资金冻结,9=:运营商资金解冻,1=0:代理商资金冻结,1=1:代理商资金解冻,1=2:转账到代理商余额") + private Integer busType; + + /** + * 支付通道(招行,交行,手动) + */ + @ExcelProperty(value = "支付通道", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "招=行,交行,手动") + private String channel; + + /** + * 交易类型(1:转账 2:代发 3:提现 4:退回 5:冻结 6:解冻 7:充值) + */ + @ExcelProperty(value = "交易类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=转账,2=代发,3=提现,4=退回,5=冻结,6=解冻,7=充值") + private Integer tranType; + + @ExcelProperty(value = "交易金额(元)") + private String moneyStr; + + + /** + * 交易状态(2:成功 3:失败) + */ + @ExcelProperty(value = "交易状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "2=成功,3=失败") + private Integer tranStatus; + + + /** + * 交易金额(分) + */ + @ExcelProperty(value = "交易金额(分)") + private Long money; + + public String getMoneyStr() { + return StringUtils.fenToYuanFormatter(this.money); + } + + + + /** + * 余额(分) + */ + @ExcelProperty(value = "余额(分)") + private Long balance; + + + + /** + * 交易人 + */ + @ExcelProperty(value = "交易人") + private String addBy; + + /** + * 业务描述 + */ + @ExcelProperty(value = "业务描述") + private String busDesc; + + + /** + * 账单id + */ + @ExcelProperty(value = "账单id") + private Long billId; + + /** + * 账单明细id + */ + @ExcelProperty(value = "账单明细id") + private Long billDetailId; + + + + + /** + * 付款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "付款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payerType; + + /** + * 付款方id + */ + @ExcelProperty(value = "付款方id") + private Long payerId; + + /** + * 付款方账号id + */ + @ExcelProperty(value = "付款方账号id") + private Long payerAccId; + + /** + * 收款方(5:平台 6:服务商 7:运营商 8:代理商 9:商户 10:自雇者) + */ + @ExcelProperty(value = "收款方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户,1=0:自雇者") + private Integer payeeType; + + /** + * 收款方id + */ + @ExcelProperty(value = "收款方id") + private Long payeeId; + + + /** + * 收款方账号id + */ + @ExcelProperty(value = "收款方账号id") + private Long payeeAccId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 回执单地址 + */ + @ExcelProperty(value = "回执单地址") + private String payReceipt; + + /** + * 回执单类型(1:B2B 2:B2C) + */ + @ExcelProperty(value = "回执单类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:B2B,2=:B2C") + private Integer payReceiptType; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java new file mode 100644 index 0000000..bfa4460 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydLogVo.java @@ -0,0 +1,247 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商变动记录视图对象 sys_syd_log + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydLog.class) +public class SysSydLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String no; + + /** + * 结算中心名称 + */ + @ExcelProperty(value = "结算中心名称") + private String gsmc; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 基本税率(%) + */ + @ExcelProperty(value = "基本税率(%)") + private BigDecimal jbsl; + + /** + * 引用数量 + */ + @ExcelProperty(value = "引用数量") + private Long quoteNum; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 省id + */ + @ExcelProperty(value = "省id") + private Long provinceId; + + /** + * 省名称 + */ + @ExcelProperty(value = "省名称") + private String provinceName; + + /** + * 市id + */ + @ExcelProperty(value = "市id") + private Long cityId; + + /** + * 市名称 + */ + @ExcelProperty(value = "市名称") + private String cityName; + + /** + * 县区id + */ + @ExcelProperty(value = "县区id") + private Long countyId; + + /** + * 县区名称 + */ + @ExcelProperty(value = "县区名称") + private String countyName; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String nsrSbh; + + /** + * 法人 + */ + @ExcelProperty(value = "法人") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frCardid; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frPhone; + + /** + * 联系人姓名 + */ + @ExcelProperty(value = "联系人姓名") + private String conName; + + /** + * 联系人手机号 + */ + @ExcelProperty(value = "联系人手机号") + private String conPhone; + + /** + * 联系人身份证 + */ + @ExcelProperty(value = "联系人身份证") + private String conCardid; + + /** + * 联系人邮箱 + */ + @ExcelProperty(value = "联系人邮箱") + private String conEmail; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 经营范围 + */ + @ExcelProperty(value = "经营范围") + private String business; + + /** + * 税源地简称 + */ + @ExcelProperty(value = "税源地简称") + private String abridge; + + /** + * 限制金额(0:不限 其它:同结算中心下单自雇者单月实际到手金额) + */ + @ExcelProperty(value = "限制金额", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:不限,其=它:同结算中心下单自雇者单月实际到手金额") + private Long limitAmount; + + /** + * 自雇者签约模式(0:不用签约 1:需要签约 2:共享签约) + */ + @ExcelProperty(value = "自雇者签约模式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:不用签约,1=:需要签约,2=:共享签约") + private Integer signMode; + + /** + * 自雇者签约有效期(年) + */ + @ExcelProperty(value = "自雇者签约有效期", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "年=") + private Long signValidTime; + + /** + * 记录时间 + */ + @ExcelProperty(value = "记录时间") + private Date logTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java new file mode 100644 index 0000000..8e3a8b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydProductVo.java @@ -0,0 +1,270 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.sys.domain.SysSydProduct; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商产品视图对象 sys_syd_product + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydProduct.class) +public class SysSydProductVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 服务商id + */ + @ExcelProperty(value = "服务商id") + private Long sydId; + + /** + * 服务商编号 + */ + @ExcelProperty(value = "服务商编号") + private String sydNo; + + @ExcelProperty(value = "服务商名称") + private String sydName; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Long busType; + + /** + * 产品编号 + */ + @ExcelProperty(value = "产品编号") + private String no; + + /** + * 配置服务费率(%) + */ + @ExcelProperty(value = "配置服务费率(%)") + private BigDecimal serviceCharge; + + /** + * 运营商配置服务费率(%) + */ + private BigDecimal setingServiceCharge; + + /** + * 计费模式(1:个人应得计费、2:开票金额计费) + */ + @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)") + private Long chargeMode; + + /** + * 结算方式(1:到卡 2:余额) + */ + @ExcelProperty(value = "结算方式", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:到卡,2=:余额") + private Integer settlementStyle; + + /** + * 单月发放上限(分) + */ + @ExcelProperty(value = "单月发放上限", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=") + private Long maxMonth; + + /** + * 开票类型(1:增值税专用发票 2:增值税普通发票 3:差额票) + */ + @ExcelProperty(value = "开票类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:增值税专用发票,2=:增值税普通发票,3=:差额票") + private Integer invoiceType; + + /** + * 开票类目名称 + */ + @ExcelProperty(value = "开票类目名称") + private String invoiceItems; + + + @ExcelIgnore + private Integer proStatus; + + @ExcelIgnore + private Long proId; + + @ExcelIgnore + private String proNo; + + @ExcelIgnore + private String maxMonthStr; + + + private String invoiceIds; + + + public String getInvoiceIds() { + return invoiceIds; + } + + public void setInvoiceIds(String invoiceIds) { + this.invoiceIds = invoiceIds; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSydId() { + return sydId; + } + + public void setSydId(Long sydId) { + this.sydId = sydId; + } + + public String getSydNo() { + return sydNo; + } + + public void setSydNo(String sydNo) { + this.sydNo = sydNo; + } + + public String getSydName() { + return sydName; + } + + public void setSydName(String sydName) { + this.sydName = sydName; + } + + public Long getBusType() { + return busType; + } + + public void setBusType(Long busType) { + this.busType = busType; + } + + public String getNo() { + return no; + } + + public void setNo(String no) { + this.no = no; + } + + public BigDecimal getServiceCharge() { + return serviceCharge; + } + + public void setServiceCharge(BigDecimal serviceCharge) { + this.serviceCharge = serviceCharge; + } + + public BigDecimal getSetingServiceCharge() { + return setingServiceCharge; + } + + public void setSetingServiceCharge(BigDecimal setingServiceCharge) { + this.setingServiceCharge = setingServiceCharge; + } + + public Long getChargeMode() { + return chargeMode; + } + + public void setChargeMode(Long chargeMode) { + this.chargeMode = chargeMode; + } + + public Integer getSettlementStyle() { + return settlementStyle; + } + + public void setSettlementStyle(Integer settlementStyle) { + this.settlementStyle = settlementStyle; + } + + public Long getMaxMonth() { + return maxMonth; + } + + public void setMaxMonth(Long maxMonth) { + this.maxMonth = maxMonth; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public String getInvoiceItems() { + return invoiceItems; + } + + public void setInvoiceItems(String invoiceItems) { + this.invoiceItems = invoiceItems; + } + + public Integer getProStatus() { + return proStatus; + } + + public void setProStatus(Integer proStatus) { + this.proStatus = proStatus; + } + + public Long getProId() { + return proId; + } + + public void setProId(Long proId) { + this.proId = proId; + } + + public String getProNo() { + return proNo; + } + + public void setProNo(String proNo) { + this.proNo = proNo; + } + + public String getMaxMonthStr() { + return StringUtils.fenToYuanFormatter(this.maxMonth); + } + + public void setMaxMonthStr(String maxMonthStr) { + this.maxMonthStr = maxMonthStr; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java new file mode 100644 index 0000000..ff05391 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydSignContentVo.java @@ -0,0 +1,54 @@ +package org.dromara.payment.sys.domain.vo; + +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSydSignContent; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商协议内容视图对象 sys_syd_sign_content + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSydSignContent.class) +public class SysSydSignContentVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long id; + + /** + * 协议内容 + */ + @ExcelProperty(value = "协议内容") + private String content; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java new file mode 100644 index 0000000..461cf08 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysSydVo.java @@ -0,0 +1,259 @@ +package org.dromara.payment.sys.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; + +import org.dromara.payment.sys.domain.SysSyd; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务商视图对象 sys_syd + * + * @author LionLi + * @date 2024-03-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSyd.class) +public class SysSydVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String no; + + /** + * 结算中心名称 + */ + @ExcelProperty(value = "结算中心名称") + private String gsmc; + + /** + * 开户地 + */ + @ExcelProperty(value = "开户地") + private String kfd; + + /** + * 开户行 + */ + @ExcelProperty(value = "开户行") + private String kfh; + + /** + * 开户行行号 + */ + @ExcelProperty(value = "开户行行号") + private String khhNo; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 基本税率(%) + */ + @ExcelProperty(value = "基本税率(%)") + private BigDecimal jbsl; + + /** + * 引用数量 + */ + @ExcelProperty(value = "引用数量") + private Long quoteNum; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 省id + */ + @ExcelProperty(value = "省id") + private Long provinceId; + + /** + * 省名称 + */ + @ExcelProperty(value = "省名称") + private String provinceName; + + /** + * 市id + */ + @ExcelProperty(value = "市id") + private Long cityId; + + /** + * 市名称 + */ + @ExcelProperty(value = "市名称") + private String cityName; + + /** + * 县区id + */ + @ExcelProperty(value = "县区id") + private Long countyId; + + /** + * 县区名称 + */ + @ExcelProperty(value = "县区名称") + private String countyName; + + /** + * 纳税人识别号 + */ + @ExcelProperty(value = "纳税人识别号") + private String nsrSbh; + + /** + * 法人 + */ + @ExcelProperty(value = "法人") + private String fr; + + /** + * 法人身份证 + */ + @ExcelProperty(value = "法人身份证") + private String frCardid; + + /** + * 法人手机号 + */ + @ExcelProperty(value = "法人手机号") + private String frPhone; + + /** + * 联系人姓名 + */ + @ExcelProperty(value = "联系人姓名") + private String conName; + + /** + * 联系人手机号 + */ + @ExcelProperty(value = "联系人手机号") + private String conPhone; + + /** + * 联系人身份证 + */ + @ExcelProperty(value = "联系人身份证") + private String conCardid; + + /** + * 联系人邮箱 + */ + @ExcelProperty(value = "联系人邮箱") + private String conEmail; + + /** + * 实际经营地址 + */ + @ExcelProperty(value = "实际经营地址") + private String address; + + /** + * 经营范围 + */ + @ExcelProperty(value = "经营范围") + private String business; + + /** + * 税源地简称 + */ + @ExcelProperty(value = "税源地简称") + private String abridge; + + /** + * 支付密码 + */ + @ExcelProperty(value = "支付密码") + private String payPassword; + + /** + * 密码输入错误次数 + */ + @ExcelProperty(value = "密码输入错误次数") + private Long passErrorNum; + + /** + * 密码冻结结束时间 + */ + @ExcelProperty(value = "密码冻结结束时间") + private Date passFrozenTime; + + + private String unitArea; + + + private String unitAreaName; + + + private String yyzz; + + private String khxkz; + + private String frSfzzm; + + private String frSfzfm; + + private String fwf; + + private Integer status = 1; + + private Long threeId; + + private Long parkId; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java new file mode 100644 index 0000000..57f92ee --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/domain/vo/SysUnitVo.java @@ -0,0 +1,63 @@ +package org.dromara.payment.sys.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.payment.sys.domain.SysUnit; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 单位基础信息视图对象 sys_unit + * + * @author LionLi + * @date 2024-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUnit.class) +public class SysUnitVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String name; + + /** + * 企业编号 + */ + @ExcelProperty(value = "企业编号") + private String no; + + /** + * 企业类型(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "企业类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "5=:平台,6=:服务商,7=:运营商,8=:代理商,9=:商户") + private Integer unitType; + + /** + * 平台客户号 + */ + @ExcelProperty(value = "平台客户号") + private String custNo; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java new file mode 100644 index 0000000..eea790b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/dubbo/RemoteSydServiceImpl.java @@ -0,0 +1,18 @@ +package org.dromara.payment.sys.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.payment.api.syd.RemoteSydService; +import org.springframework.stereotype.Service; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSydServiceImpl implements RemoteSydService { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java new file mode 100644 index 0000000..fdadaa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/AccAccountsMapper.java @@ -0,0 +1,49 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 线下银行账户Mapper接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface AccAccountsMapper extends BaseMapperPlus { + /** + * 查询未使用的银行账户 + * @author 张涛 + * @date 2022年7月8日 + * @param sydId 结算中心id + * @param bankType 账户类型 + * @return + */ + public List selectNoUseBySydId(@Param("sydId") long sydId, @Param("bankType") String bankType); + + /** + * 查询账户信息 + * @author 张涛 + * @date 2022年7月8日 + * @param bankCard 账户卡号 + * @param bankType 账户类型 + * @return + */ + public AccAccounts selectByCardAndType(@Param("bankCard") String bankCard,@Param("bankType") String bankType); + + /** + * 使用账户 + * @author 张涛 + * @date 2022年7月8日 + * @param acc + * @return + */ + public Integer useAccount(AccAccounts acc); + + int updateByPrimaryKeySelective(AccAccounts record); + + int insertSelective(AccAccounts record); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java new file mode 100644 index 0000000..9d18184 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/BusDownloadsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 异步下载Mapper接口 + * + * @author LionLi + * @date 2024-06-21 + */ +public interface BusDownloadsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java new file mode 100644 index 0000000..600d79f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/ProInfoCommnoMapper.java @@ -0,0 +1,93 @@ +package org.dromara.payment.sys.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; + +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommnoMapper + * @description + * @create 2024-04-24 17:31 + */ +public interface ProInfoCommnoMapper { + + + Page selectCommonProListAgent(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + Page selectCommonProListMer(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + Page selectCommonProListOper(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-24 18:52 + * 说明:查询代理商业务类型 + **/ + + List selectAgentBusType( @Param(Constants.WRAPPER) Wrapper wrapper); + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-24 18:52 + * 说明:查询运营商业务类型 + **/ + List selectOperBusType( @Param(Constants.WRAPPER) Wrapper wrapper); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 9:45 + * 说明:给企业分配产品,查询服务商 + **/ + + List selectAgentService(ProInfoCommonBo commonBo); + + + + + /*** + * 根据企业信息,查询企业对应的服务商 + * @param merchantVo + * @return + */ + List selectServiceInfoByMerInfo(BusMerchantVo merchantVo); + + + /*** + * 根据企业信息,服务商信息,查询对应的业务类型 + * @param map + * @return + */ + List selectBusTypeByMerSerInfo(Map map); + + + /*** + * 查询服务商对应的企业 + * @param id + * @return + */ + List selectMerListByServiceId(Long id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java new file mode 100644 index 0000000..fed2b7a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysPayPwdMapper.java @@ -0,0 +1,25 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.operator.domain.BusOperator; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdMapper + * @description + * @create 2024-05-13 13:55 + */ +public interface SysPayPwdMapper { + + + /*** + * 更改代理商的支付密码 + * @param busOperator + * @return + */ + int updateBusOperatorPayPwd(BusOperator busOperator); + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java new file mode 100644 index 0000000..667cf44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountMapper.java @@ -0,0 +1,177 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 服务商账户Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydAccountMapper extends BaseMapperPlus { + /** + * 查询税源地虚拟银行账号 + * + * @param id 税源地虚拟银行账号ID + * @return 税源地虚拟银行账号 + */ + public SysSydAccount selectSysSydAccountById(Long id); + + /** + * 查询税源地虚拟银行账号列表 + * + * @param sysSydAccount 税源地虚拟银行账号 + * @return 税源地虚拟银行账号集合 + */ + public List selectSysSydAccountList(SysSydAccount sysSydAccount); + + /** + * 新增税源地虚拟银行账号 + * + * @param sysSydAccount 税源地虚拟银行账号 + * @return 结果 + */ + public int insertSysSydAccount(SysSydAccount sysSydAccount); + + /** + * 修改税源地虚拟银行账号 + * + * @param sysSydAccount 税源地虚拟银行账号 + * @return 结果 + */ + public int updateSysSydAccount(SysSydAccount sysSydAccount); + + /** + * 删除税源地虚拟银行账号 + * + * @param id 税源地虚拟银行账号ID + * @return 结果 + */ + public int deleteSysSydAccountById(Long id); + + /** + * 批量删除税源地虚拟银行账号 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteSysSydAccountByIds(String[] ids); + + /** + * 修改结算中心开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmount(@Param("sydId") Integer sydId, @Param("accType") short accType, @Param("invoice") long invoice, @Param("bankType") String bankType); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(@Param("sydId") Long sydId,@Param("accType") short accType,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlement(@Param("sydId") Long sydId,@Param("accType") short accType,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(@Param("sydId") Long sydId,@Param("accType") short accType,@Param("amount") long amount,@Param("bankType") String bankType); + + /** + * 查询结算中心的默认账户 + * @author 张涛 + * @date 2021年9月9日 + * @param sydId 结算中心id + * @param accType 账户类型(0:主账户 1:个人服务费账户) + * @return + */ + public List selectSysSydAccountBySydId(@Param("sydId") Long sydId,@Param("accType") Short accType,@Param("bankType") String bankType); + + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + + /** + * 根据银行账户id更新 + * @author 张涛 + * @date 2021年9月6日 + * @param record + * @return + */ + public Integer updateByAccId(SysSydAccount record); + + /** + * 修改结算中心开票金额 + * @author 张涛 + * @date 2021年9月2日 + * @param invoice 开票金额 + * @return + */ + public Integer updateInvoiceAmountByAccId(@Param("accId") int accId, @Param("invoice") long invoice); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减已结算金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateSettlementByAccId(@Param("accId") int accId,@Param("amount") long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(@Param("accId") int accId,@Param("amount") long amount); + + + public Long selectSysdAccount(Map map); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java new file mode 100644 index 0000000..f40f124 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydAccountSynMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商账户同步Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydAccountSynMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java new file mode 100644 index 0000000..2dc8fe1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydCashoutMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商提现记录Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydCashoutMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java new file mode 100644 index 0000000..eaa1fa3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydConfigMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydConfig; +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商配置Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java new file mode 100644 index 0000000..080aae8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydFlowsMapper.java @@ -0,0 +1,28 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 服务商流水Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydFlowsMapper extends BaseMapperPlus { + + public int insertSelective(SysSydFlows flow); + /** + * 批量插入 + * @author 张涛 + * @date 2016年6月23日 + * @param list + * @return + */ + public int insertAll(@Param("list") List list); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java new file mode 100644 index 0000000..0a2a89a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydLogMapper.java @@ -0,0 +1,18 @@ +package org.dromara.payment.sys.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.SysSydLog; +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.Date; + +/** + * 服务商变动记录Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydLogMapper extends BaseMapperPlus { + public Integer insertSysSydLog(@Param("sydId") long sydId,@Param("curTime") Date curTime); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java new file mode 100644 index 0000000..3d31452 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydMapper.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 服务商Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydMapper extends BaseMapperPlus { + /** + * 查询税源地 + * + * @param id 税源地ID + * @return 税源地 + */ + public SysSyd selectSysSydById(Long id); + + /** + * 修改税源地 + * + * @param sysSyd 税源地 + * @return 结果 + */ + public int updateSysSyd(SysSyd sysSyd); + + /** + * 查询商户可用的服务商 + * @param merId 商户id + * @return + */ + public List selectSydByMerId(Long merId); + + + + Page selectSydList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java new file mode 100644 index 0000000..a9302fc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydProductMapper.java @@ -0,0 +1,30 @@ +package org.dromara.payment.sys.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.sys.domain.SysSydProduct; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 服务商产品Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydProductMapper extends BaseMapperPlus { + + Page queryPageList(@Param("page") Page page, @Param("where") SysSydProductBo where); + + List queryList(@Param("where") SysSydProductBo where); + + BigDecimal selMinServiceChargeByproId(Long proId); + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java new file mode 100644 index 0000000..1be9363 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysSydSignContentMapper.java @@ -0,0 +1,19 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 服务商协议内容Mapper接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface SysSydSignContentMapper extends BaseMapperPlus { + int insertSelective(SysSydSignContent record); + + SysSydSignContent selectByPrimaryKey(Integer id); + + int updateByPrimaryKeySelective(SysSydSignContent record); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java new file mode 100644 index 0000000..c192d6c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/mapper/SysUnitMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.sys.mapper; + +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 单位基础信息Mapper接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface SysUnitMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java new file mode 100644 index 0000000..98fb747 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IAccAccountsService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 线下银行账户Service接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface IAccAccountsService { + + /** + * 查询线下银行账户 + */ + AccAccountsVo queryById(Long id); + + /** + * 查询线下银行账户列表 + */ + TableDataInfo queryPageList(AccAccountsBo bo, PageQuery pageQuery); + + /** + * 查询线下银行账户列表 + */ + List queryList(AccAccountsBo bo); + + /** + * 新增线下银行账户 + */ + Boolean insertByBo(AccAccountsBo bo); + + /** + * 修改线下银行账户 + */ + Boolean updateByBo(AccAccountsBo bo); + + /** + * 校验并批量删除线下银行账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java new file mode 100644 index 0000000..6501b0b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IBusDownloadsService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.payment.sys.domain.bo.BusDownloadsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 异步下载Service接口 + * + * @author LionLi + * @date 2024-06-21 + */ +public interface IBusDownloadsService { + + /** + * 查询异步下载 + */ + BusDownloadsVo queryById(Long id); + + /** + * 查询异步下载列表 + */ + TableDataInfo queryPageList(BusDownloadsBo bo, PageQuery pageQuery); + + /** + * 查询异步下载列表 + */ + List queryList(BusDownloadsBo bo); + + /** + * 新增异步下载 + */ + Boolean insertByBo(BusDownloadsBo bo); + + /** + * 修改异步下载 + */ + Boolean updateByBo(BusDownloadsBo bo); + + /** + * 校验并批量删除异步下载信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java new file mode 100644 index 0000000..8e48ce9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/IProInfoCommonService.java @@ -0,0 +1,75 @@ +package org.dromara.payment.sys.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; + +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title IProInfoCommonService + * @description + * @create 2024-04-24 17:34 + */ +public interface IProInfoCommonService { + + + TableDataInfo queryPageList(ProInfoCommonBo bo, PageQuery pageQuery); + + + /*** + * 查询不同角色的业务类型 + * @return + */ + List selDifRoleBusType(); + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-25 9:46 + * 说明:给企业分配产品,对应的服务商查询,过滤已经分配过的服务商 + **/ + + List selectAgentService(ProInfoCommonBo commonBo); + + + /*** + * 根据不同的角色查询企业列表 + * @param commonBo + * @return + */ + List selectMerchantList(ProInfoCommonBo commonBo); + + + /*** + * 根据企业信息查询对应的服务商 + * @param merchantVo + * @return + */ + List selectServiceInfoByMerInfo(BusMerchantVo merchantVo); + + + /*** + * 根据企业信息,服务商信息,查询对应的业务类型 + * @param merId + * @param sydId + * @return + */ + List selectBusTypeByMerSerInfo(Long merId,Long sydId); + + + public List selectBusTypeByMerSerInfoName(Long merId, Long sydId); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java new file mode 100644 index 0000000..0826e47 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysPayPwdService.java @@ -0,0 +1,29 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.bo.SysPayPwdBo; + +/** + * @author sunzexing + * @version 1.0 + * @title ISysPayPwdService + * @description + * @create 2024-05-13 11:29 + */ +public interface ISysPayPwdService { + + + /*** + * 修改支付密码 + * @param bo + * @return + */ + public String updPayPwd(SysPayPwdBo bo); + + + /*** + * 发送短信密码 + * @param domain + * @return + */ + public boolean sendSmsCode(String domain); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java new file mode 100644 index 0000000..b79f3b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountService.java @@ -0,0 +1,95 @@ +package org.dromara.payment.sys.service; + +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.sys.domain.bo.SysSydAccountBo; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商账户Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydAccountService { + + /** + * 查询服务商账户 + */ + SysSydAccountVo queryById(Long id); + + /** + * 查询服务商账户列表 + */ + TableDataInfo queryPageList(SysSydAccountBo bo, PageQuery pageQuery); + + /** + * 查询服务商账户列表 + */ + List queryList(SysSydAccountBo bo); + + /** + * 新增服务商账户 + */ + Boolean insertByBo(SysSydAccountBo bo); + + /** + * 修改服务商账户 + */ + Boolean updateByBo(SysSydAccountBo bo); + + /** + * 校验并批量删除服务商账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalance(Long sydId,long unitId,long amount,String bankType); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozen(Long sydId,long unitId,long amount,String bankType); + + + /** + * 递增或递减账户余额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateBalanceByAccId(int accId,long amount); + + /** + * 递增或递减冻结金额 + * @author 张涛 + * @date 2021年9月7日 + * @param amount 变动金额(减为复数) + * @return + */ + public Integer updateFrozenByAccId(int accId,long amount); + + /** + * 查询服务商提现账户信息 + * @param id 资金账户id + * @return + */ + public SysSydAccountVo getCashoutAccount(Long id); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java new file mode 100644 index 0000000..01b7822 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydAccountSynService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.payment.sys.domain.bo.SysSydAccountSynBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商账户同步Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydAccountSynService { + + /** + * 查询服务商账户同步 + */ + SysSydAccountSynVo queryById(Long id); + + /** + * 查询服务商账户同步列表 + */ + TableDataInfo queryPageList(SysSydAccountSynBo bo, PageQuery pageQuery); + + /** + * 查询服务商账户同步列表 + */ + List queryList(SysSydAccountSynBo bo); + + /** + * 新增服务商账户同步 + */ + Boolean insertByBo(SysSydAccountSynBo bo); + + /** + * 修改服务商账户同步 + */ + Boolean updateByBo(SysSydAccountSynBo bo); + + /** + * 校验并批量删除服务商账户同步信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java new file mode 100644 index 0000000..97e9d93 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydCashoutService.java @@ -0,0 +1,59 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.bo.SysSydCashoutBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.TransactionLog; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商提现记录Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydCashoutService { + + /** + * 查询服务商提现记录 + */ + SysSydCashoutVo queryById(Long id); + + /** + * 查询服务商提现记录列表 + */ + TableDataInfo queryPageList(SysSydCashoutBo bo, PageQuery pageQuery); + + /** + * 查询服务商提现记录列表 + */ + List queryList(SysSydCashoutBo bo); + + /** + * 提现记录 + */ + Boolean insertByBo(SysSydCashoutBo bo); + + /** + * 修改服务商提现记录 + */ + Boolean updateByBo(SysSydCashoutBo bo); + + /** + * 校验并批量删除服务商提现记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 服务商提现业务 + * @param tlog 交易记录 + * @param tran 本次交易结果 + * @return + */ + TranLog cashoutResult(TranLogVo tlog, TransactionLog tran); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java new file mode 100644 index 0000000..666f8fc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydConfigService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.dromara.payment.sys.domain.bo.SysSydConfigBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商配置Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydConfigService { + + /** + * 查询服务商配置 + */ + SysSydConfigVo queryById(Long id); + + /** + * 查询服务商配置列表 + */ + TableDataInfo queryPageList(SysSydConfigBo bo, PageQuery pageQuery); + + /** + * 查询服务商配置列表 + */ + List queryList(SysSydConfigBo bo); + + /** + * 新增服务商配置 + */ + Boolean insertByBo(SysSydConfigBo bo); + + /** + * 修改服务商配置 + */ + Boolean updateByBo(SysSydConfigBo bo); + + /** + * 校验并批量删除服务商配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java new file mode 100644 index 0000000..7e374af --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydFlowsService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.domain.bo.SysSydFlowsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商流水Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydFlowsService { + + /** + * 查询服务商流水 + */ + SysSydFlowsVo queryById(Long id); + + /** + * 查询服务商流水列表 + */ + TableDataInfo queryPageList(SysSydFlowsBo bo, PageQuery pageQuery); + + /** + * 查询服务商流水列表 + */ + List queryList(SysSydFlowsBo bo); + + /** + * 新增服务商流水 + */ + Boolean insertByBo(SysSydFlowsBo bo); + + /** + * 修改服务商流水 + */ + Boolean updateByBo(SysSydFlowsBo bo); + + /** + * 校验并批量删除服务商流水信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java new file mode 100644 index 0000000..ab350cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydLogService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.payment.sys.domain.bo.SysSydLogBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商变动记录Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydLogService { + + /** + * 查询服务商变动记录 + */ + SysSydLogVo queryById(Long id); + + /** + * 查询服务商变动记录列表 + */ + TableDataInfo queryPageList(SysSydLogBo bo, PageQuery pageQuery); + + /** + * 查询服务商变动记录列表 + */ + List queryList(SysSydLogBo bo); + + /** + * 新增服务商变动记录 + */ + Boolean insertByBo(SysSydLogBo bo); + + /** + * 修改服务商变动记录 + */ + Boolean updateByBo(SysSydLogBo bo); + + /** + * 校验并批量删除服务商变动记录信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java new file mode 100644 index 0000000..e4a3d1f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydProductService.java @@ -0,0 +1,50 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商产品Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydProductService { + + /** + * 查询服务商产品 + */ + SysSydProductVo queryById(Long id); + + /** + * 查询服务商产品列表 + */ + TableDataInfo queryPageList(SysSydProductBo bo, PageQuery pageQuery); + + /** + * 查询服务商产品列表 + */ + List queryList(SysSydProductBo bo); + + /** + * 新增服务商产品 + */ + Boolean insertByBo(SysSydProductBo bo); + + /** + * 修改服务商产品 + */ + Boolean updateByBo(SysSydProductBo bo); + + /** + * 校验并批量删除服务商产品信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + String upDown(Long id, Integer status); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java new file mode 100644 index 0000000..a991924 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydService.java @@ -0,0 +1,128 @@ +package org.dromara.payment.sys.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.settlement.api.domain.SignZhifubao; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 服务商Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydService { + + /** + * 查询服务商 + */ + SysSydVo queryById(Long id); + + /** + * 查询服务商列表 + */ + TableDataInfo queryPageList(SysSydBo bo, PageQuery pageQuery); + + /** + * 查询服务商列表 + */ + List queryList(SysSydBo bo); + + /** + * 新增服务商 + */ + Boolean insertByBo(SysSydBo bo) throws Exception; + + /** + * 修改服务商 + */ + Boolean updateByBo(SysSydBo bo); + + /** + * 校验并批量删除服务商信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 开通服务商虚拟户 + * @param id + * @param gsmc + * @return + */ + public Boolean creatSydXNnum(Long id, String gsmc); + + /** + * 开通虚拟户 + * @param sydId 服务商id + * @param unitId 单位id + * @param gsmc 虚拟户名称 + * @param roleType 虚拟户角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + * @param addRoleType 经办角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + * @param saveFun<添加的虚拟户,业务资金账户是否添加成功> + * @param existsFun<验证的虚拟户类型,已存在的虚拟户卡号> + * @return + */ + public Boolean creatXNnum(Long sydId, Long unitId, String gsmc, int roleType, int addRoleType, Function saveFun, Function existsFun); + + /** + * 验证是否配置结算中心 + * @author 张涛 + * @date 2021年9月9日 + * @param sydId 结算中心id + * @return + */ + public Map valiConfig(Long sydId,String passage); + + /** + * 获取结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + public SysSydSignContent getWorkerSignInfo(int sydId); + + /** + * 保存结算中心的自雇者签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + public Boolean saveWorkerSignInfo(SysSydSignContent sign); + + /** + * 获取结算中心的支付宝签约信息 + * @author 张涛 + * @date 2022年9月8日 + * @param sydId 结算中心id + * @return + */ + public SignZhifubao getSignInfo(Long sydId,String passage); + + /** + * 根据用户名查询商户可用的服务商 + * @param userName 用户名 + * @return + */ + public List getSydByUserName(String userName); + + /** + * 查询商户可用的服务商 + * @param merId 商户id + * @return + */ + public List selectSydByMerId(Long merId); + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java new file mode 100644 index 0000000..f029c5a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysSydSignContentService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.dromara.payment.sys.domain.bo.SysSydSignContentBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 服务商协议内容Service接口 + * + * @author LionLi + * @date 2024-03-26 + */ +public interface ISysSydSignContentService { + + /** + * 查询服务商协议内容 + */ + SysSydSignContentVo queryById(Long id); + + /** + * 查询服务商协议内容列表 + */ + TableDataInfo queryPageList(SysSydSignContentBo bo, PageQuery pageQuery); + + /** + * 查询服务商协议内容列表 + */ + List queryList(SysSydSignContentBo bo); + + /** + * 新增服务商协议内容 + */ + Boolean insertByBo(SysSydSignContentBo bo); + + /** + * 修改服务商协议内容 + */ + Boolean updateByBo(SysSydSignContentBo bo); + + /** + * 校验并批量删除服务商协议内容信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java new file mode 100644 index 0000000..b1d373e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/ISysUnitService.java @@ -0,0 +1,73 @@ +package org.dromara.payment.sys.service; + +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; + +import java.util.Collection; +import java.util.List; + +/** + * 单位基础信息Service接口 + * + * @author LionLi + * @date 2024-03-27 + */ +public interface ISysUnitService { + + /** + * 查询单位基础信息 + */ + SysUnitVo queryById(Long id); + + /** + * 查询单位基础信息列表 + */ + TableDataInfo queryPageList(SysUnitBo bo, PageQuery pageQuery); + + /** + * 查询单位基础信息列表 + */ + List queryList(SysUnitBo bo); + + /** + * 新增单位基础信息 + */ + Boolean insertByBo(SysUnitBo bo); + + /** + * 修改单位基础信息 + */ + Boolean updateByBo(SysUnitBo bo); + + /** + * 校验并批量删除单位基础信息信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取单位配置大类下面的组信息 + * @param unit_id + * @param class_alias + * @return + */ + public List getConfGroupByUnit(Long unit_id, String class_alias); + + /** + * 根据配置组查询单位配置项明细 + * @param unit_id + * @param conf_group + * @return + */ + public List getConfDetailByUnit(Long unit_id, String conf_group); + + /** + * 编辑单位配置项明细 + * @param lendReco + * @return + */ + public Boolean editConfDetail(List lendReco); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java new file mode 100644 index 0000000..9b7a94f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/AccAccountsServiceImpl.java @@ -0,0 +1,118 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.bo.AccAccountsBo; +import org.dromara.payment.sys.service.IAccAccountsService; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.vo.AccAccountsVo; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.mapper.AccAccountsMapper; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 线下银行账户Service业务层处理 + * + * @author LionLi + * @date 2024-03-27 + */ +@RequiredArgsConstructor +@Service +public class AccAccountsServiceImpl implements IAccAccountsService { + + private final AccAccountsMapper baseMapper; + + /** + * 查询线下银行账户 + */ + @Override + public AccAccountsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询线下银行账户列表 + */ + @Override + public TableDataInfo queryPageList(AccAccountsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询线下银行账户列表 + */ + @Override + public List queryList(AccAccountsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(AccAccountsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, AccAccounts::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), AccAccounts::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), AccAccounts::getBankCard, bo.getBankCard()); + lqw.like(StringUtils.isNotBlank(bo.getBankAccName()), AccAccounts::getBankAccName, bo.getBankAccName()); + lqw.eq(StringUtils.isNotBlank(bo.getBankArgNo()), AccAccounts::getBankArgNo, bo.getBankArgNo()); + lqw.eq(bo.getIsUse() != null, AccAccounts::getIsUse, bo.getIsUse()); + lqw.eq(bo.getUseObj() != null, AccAccounts::getUseObj, bo.getUseObj()); + lqw.eq(bo.getUseObjId() != null, AccAccounts::getUseObjId, bo.getUseObjId()); + lqw.like(StringUtils.isNotBlank(bo.getUseObjName()), AccAccounts::getUseObjName, bo.getUseObjName()); + lqw.eq(bo.getAddTime() != null, AccAccounts::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增线下银行账户 + */ + @Override + public Boolean insertByBo(AccAccountsBo bo) { + AccAccounts add = MapstructUtils.convert(bo, AccAccounts.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改线下银行账户 + */ + @Override + public Boolean updateByBo(AccAccountsBo bo) { + AccAccounts update = MapstructUtils.convert(bo, AccAccounts.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(AccAccounts entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除线下银行账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java new file mode 100644 index 0000000..43a5857 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BankAccountServiceTransactionImpl.java @@ -0,0 +1,164 @@ +package org.dromara.payment.sys.service.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.mapper.AccAccountsMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +public class BankAccountServiceTransactionImpl +{ + private static final Logger log = LoggerFactory.getLogger(BankAccountServiceTransactionImpl.class); + + @Autowired + private AccAccountsMapper accountsDao;//银行账户dao + + @DubboReference + private RemoteAccountService accountService;//银行账户 + + @DubboReference + private RemoteConfigService wConfigService;// 配置 + + @Transactional + public void useAccount(AccAccounts acc) { + AccAccounts exist = accountsDao.selectByCardAndType(acc.getBankCard(), acc.getBankType()); + if (exist == null) { + throw new ServiceException("账户不存在"); + } + if (exist.getIsUse() == 1) { + throw new ServiceException("账户已被使用"); + } + AccAccounts upd = new AccAccounts(); + upd.setId(exist.getId()); + upd.setIsUse(1); + upd.setUseObj(acc.getUseObj()); + upd.setUseObjId(acc.getUseObjId()); + upd.setUseObjName(acc.getUseObjName()); + upd.setBankArgNo(acc.getBankArgNo()); + Integer num = accountsDao.useAccount(upd); + if (num == 0) { + throw new ServiceException("账户已被使用"); + } + } + + @Transactional + public void updateAccountArgNo(AccAccounts acc) { + String bankType = "交通银行"; + if(acc.getBankType().equals(bankType)) { + Map configMap = existsBank(acc.getSydId(), bankType); + if (configMap != null) { + AccAccounts exist = accountsDao.selectByCardAndType(acc.getBankCard(), acc.getBankType()); + if (exist == null) { + throw new ServiceException("账户不存在"); + } + Account bankAcc = new Account(); + bankAcc.setBankType(bankType); + bankAcc.setBankCard(acc.getBankCard()); + bankAcc.setUnitId(acc.getSydId()); + bankAcc.setName(acc.getBankAccName()); + bankAcc.setBankArgNo(acc.getBankArgNo()); + bankAcc.setType((short)1);//1:云账户 + Result accountRtn = accountService.addAccount(bankAcc); + if (accountRtn.hasError() || accountRtn.hasTip() || accountRtn.getRtnData() == null) { + throw new RuntimeException("修改交通银行虚拟户协议编号失败:"+accountRtn.getResult()); + } + AccAccounts upd = new AccAccounts(); + upd.setId(exist.getId()); + upd.setBankArgNo(acc.getBankArgNo()); + accountsDao.updateByPrimaryKeySelective(upd); + } + } + } + + /** + * 验证银行类型是否可用 + * @author 张涛 + * @date 2022年7月8日 + * @param sydId 结算中心id + * @param bankType 银行类型 + * @return + */ + public Map existsBank(long sydId,String bankType) { + String bankClass = ""; + if (bankType.equals("招商银行")) { + bankClass = "settlement.zhaoshang"; + } else if (bankType.equals("交通银行")) { + bankClass = "settlement.jiaotong"; + } else if (bankType.equals("支付宝")) { + bankClass = "settlement.zhifubao"; + } else if (bankType.equals("民生银行")) { + bankClass = "settlement.minsheng"; + } + Result> bankConfigRtn = wConfigService.getConfDetailByUnit(sydId, bankClass); + if (bankConfigRtn.hasError()) { + throw new RuntimeException(bankConfigRtn.getResult()); + } + boolean exists = false; + //配置明细 + Map configMap = new HashMap(); + if (bankConfigRtn.getRtnData() != null) { + for (UnitConfDetail ucd : bankConfigRtn.getRtnData()) { + if(bankType.equals("招商银行")) { + if (ucd.getConf_item().equals("zhaoshang_prikey") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + }else if (bankType.equals("交通银行")) { + if (ucd.getConf_item().equals("jiaotong_super_acc") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + }else if (bankType.equals("支付宝")) { + if (ucd.getConf_item().equals("zhifubao_bank_appid") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + } else if (bankType.equals("民生银行")) { + if (ucd.getConf_item().equals("minsheng_bank_merchantNum") && StringUtils.isNotBlank(ucd.getConf_value())) { + exists = true; + } + } + configMap.put(ucd.getConf_item(), ucd.getConf_value()); + } + } + return exists ? configMap : null; + } + + /** + * 创建虚拟银行账号 + * @author 张涛 + * @date 2021年8月18日 + * @param unitId 税源地id + * @param userId 用户id(单位id或自雇者id或税源地id) + * @param userName 用户名称(单位名称或自雇者姓名或税源地名称) + * @return + */ + public AccAccounts addAccount(long unitId,Long userId,String userName,String bankType){ + Result accountRtn = accountService.addAccount(unitId, 1,userId,userName,bankType,null); + if (accountRtn.hasError()) { + throw new RuntimeException(accountRtn.getResult()); + }else if (accountRtn.hasTip()) { + throw new ServiceException(accountRtn.getResult()); + } + AccAccounts newAcc = new AccAccounts(); + newAcc.setSydId(unitId); + newAcc.setBankType(accountRtn.getRtnData().getBankType()); + newAcc.setBankCard(accountRtn.getRtnData().getBankCard()); + newAcc.setBankAccName(accountRtn.getRtnData().getName()); + accountsDao.insertSelective(newAcc); + return newAcc; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java new file mode 100644 index 0000000..0aadda6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/BusDownloadsServiceImpl.java @@ -0,0 +1,116 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.BusDownloadsBo; +import org.dromara.payment.sys.domain.vo.BusDownloadsVo; +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.mapper.BusDownloadsMapper; +import org.dromara.payment.sys.service.IBusDownloadsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 异步下载Service业务层处理 + * + * @author LionLi + * @date 2024-06-21 + */ +@RequiredArgsConstructor +@Service +public class BusDownloadsServiceImpl implements IBusDownloadsService { + + private final BusDownloadsMapper baseMapper; + + /** + * 查询异步下载 + */ + @Override + public BusDownloadsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询异步下载列表 + */ + @Override + public TableDataInfo queryPageList(BusDownloadsBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUserId()); + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询异步下载列表 + */ + @Override + public List queryList(BusDownloadsBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(BusDownloadsBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getBusType() != null, "bus_type", bo.getBusType()); + lqw.eq(bo.getCreateBy() !=null,"create_by",bo.getCreateBy()); + lqw.eq(bo.getBusType() != null,"bus_type",bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), "url", bo.getUrl()); + lqw.orderByDesc("create_time"); + return lqw; + } + + /** + * 新增异步下载 + */ + @Override + public Boolean insertByBo(BusDownloadsBo bo) { + BusDownloads add = MapstructUtils.convert(bo, BusDownloads.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改异步下载 + */ + @Override + public Boolean updateByBo(BusDownloadsBo bo) { + BusDownloads update = MapstructUtils.convert(bo, BusDownloads.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusDownloads entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除异步下载 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java new file mode 100644 index 0000000..d46c8d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/ProInfoCommonServiceImpl.java @@ -0,0 +1,201 @@ +package org.dromara.payment.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.channel.domain.BusChannelSalesman; +import org.dromara.payment.channel.domain.vo.BusChannelSalesmanVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; +import org.dromara.payment.sys.domain.vo.ProInfoCommonVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.ProInfoCommnoMapper; +import org.dromara.payment.sys.service.IProInfoCommonService; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title ProInfoCommonServiceImpl + * @description + * @create 2024-04-24 17:36 + */ + +@Service +public class ProInfoCommonServiceImpl extends BaseService implements IProInfoCommonService { + + + @Resource + private ProInfoCommnoMapper proInfoCommnoMapper; + + @Resource + private BusMerchantMapper busMerchantMapper; + + @DubboReference + private RemoteDictService remoteDictService; + @Override + public TableDataInfo queryPageList(ProInfoCommonBo bo, PageQuery pageQuery) { + QueryWrapper lqw = Wrappers.query(); + lqw.between(bo.getStartTime() != null ,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getName()),"t2.gsmc",bo.getName()); + lqw.like(StringUtils.isNotEmpty(bo.getNo()),"t2.no",bo.getNo()); + lqw.like(StringUtils.isNotEmpty(bo.getProNo()),"t1.no",bo.getProNo()); + lqw.eq("t1.pro_status",1); + lqw.orderByDesc("t.create_time"); + Page result = null; + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.channel_no",LoginHelper.getNo()); + lqw.eq("t.pro_status",1); + result = this.proInfoCommnoMapper.selectCommonProListAgent( pageQuery.build(), lqw); + }else if(busRole == BusRole.MERCHANT.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.mer_no",LoginHelper.getNo()); + lqw.eq("t.pro_status",1); + result = this.proInfoCommnoMapper.selectCommonProListMer( pageQuery.build(), lqw); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.op_no",LoginHelper.getNo()); + lqw.eq("t.pro_status",1); + result = this.proInfoCommnoMapper.selectCommonProListOper( pageQuery.build(), lqw); + }else{ + result = new Page(); + } + return TableDataInfo.build(result); + + } + + + /*** + * 获取不同角色业务类型 + * @return + */ + @Override + public List selDifRoleBusType() { + List result = null; + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.pro_status",1); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + lqw.eq("t1.pro_status",1); + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.channel_no",LoginHelper.getNo()); + result =this.proInfoCommnoMapper.selectAgentBusType(lqw); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("t1.pro_status",1); + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.op_no",LoginHelper.getNo()); + result =this.proInfoCommnoMapper.selectOperBusType(lqw); + }else if(busRole == BusRole.SERVICE.getId()){ + lqw.eq(StringUtils.isNotEmpty(LoginHelper.getNo()),"t.syd_id",LoginHelper.getBusId()); + result =this.proInfoCommnoMapper.selectOperBusType(lqw); + } + return result; + } + + @Override + public List selectAgentService(ProInfoCommonBo commonBo) { + if(commonBo.getMerchantId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.AGENT.getId()){ + commonBo.setBusId(LoginHelper.getBusId()); + return this.proInfoCommnoMapper.selectAgentService(commonBo); + }else if(busRole == BusRole.OPERATOR.getId()){ + + } + return null; + } + + + + + + + public List selectMerchantList(ProInfoCommonBo commonBo){ + + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.SERVICE.getId()){ + return this.proInfoCommnoMapper.selectMerListByServiceId(LoginHelper.getBusId()); + }else{ + QueryWrapper lqw = Wrappers.query(); + lqw.eq("t.verify_status",2); + lqw.orderByDesc("t.create_time"); + + return busMerchantMapper.selectMerchantListByRole(lqw); + } + + } + + + /*** + * 根据企业信息查询对应的服务商 + * @param merchantVo + * @return + */ + @Override + public List selectServiceInfoByMerInfo(BusMerchantVo merchantVo) { + if(merchantVo.getId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + return this.proInfoCommnoMapper.selectServiceInfoByMerInfo(merchantVo); + } + + + /*** + * 根据企业信息、服务商信息,查询对应的业务类型 + * @param merId + * @param sydId + * @return + */ + @Override + public List selectBusTypeByMerSerInfo(Long merId, Long sydId) { + + if(merId == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + + Map paraMap = new HashMap(); + paraMap.put("merId",merId); + paraMap.put("sydId",sydId); + + return this.proInfoCommnoMapper.selectBusTypeByMerSerInfo(paraMap); + + } + + + @Override + public List selectBusTypeByMerSerInfoName(Long merId, Long sydId){ + List busTypeList = this.selectBusTypeByMerSerInfo(merId,sydId); + List list = remoteDictService.selectDictDataByType("wxfe_bus_type"); + List result = new ArrayList(); + for(Integer bs :busTypeList){ + for(RemoteDictDataVo rd : list){ + if(bs.equals(Integer.valueOf(rd.getDictValue()))){ + result.add(rd); + break; + } + } + } + + return result; + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java new file mode 100644 index 0000000..12c1780 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysPayPwdServiceImpl.java @@ -0,0 +1,204 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.util.RandomUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantService; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.bo.BusOperatorBo; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.operator.mapper.BusOperatorMapper; +import org.dromara.payment.operator.service.IBusOperatorService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.SysPayPwdBo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysPayPwdMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysPayPwdService; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.Date; +import java.util.LinkedHashMap; + +/** + * @author sunzexing + * @version 1.0 + * @title SysPayPwdServiceImpl + * @description + * @create 2024-05-13 12:08 + */ +@Service +public class SysPayPwdServiceImpl extends BaseService implements ISysPayPwdService { + + @Resource + public IBusMerchantService busMerchantService; + + @Resource + public SysPayPwdMapper sysPayPwdMapper; + + @Resource + public IBusOperatorService busOperatorService; + + + @Resource + public ISysSydService sysSydService; + + + @DubboReference + public RemoteSmsService remoteSmsService; + + + @DubboReference + public RemoteUserService remoteUserService; + + + @Resource + public BusOperatorMapper busOperatorMapper; + + + @Resource + public BusMerchantMapper busMerchantMapper; + + + @Resource + public SysSydMapper sysSydMapper; + + + + + /**** + * 修改支付密码 + * @param bo + * @return + */ + @Override + public String updPayPwd(SysPayPwdBo bo) { + + Integer busRole = LoginHelper.getBusRole(); + String phone = ""; + if(busRole == BusRole.MERCHANT.getId() ){ + //商户 + BusMerchantVo bmv = this.busMerchantService.queryById(LoginHelper.getBusId()); + phone = bmv.getWtrSjh(); + + }else if(busRole == BusRole.OPERATOR.getId()){ + //运营商 + BusOperatorVo bov = this.busOperatorService.queryById(LoginHelper.getBusId()); + phone = bov.getWtrSjh(); + + }else if(busRole == BusRole.SERVICE.getId()){ + //服务商 + SysSydVo sysVo = this.sysSydService.queryById(LoginHelper.getBusId()); + phone = sysVo.getConPhone(); + + } + String key = GlobalConstants.CAPTCHA_PAY_PWD_PHONE_CODE_KEY+ SmsType.RESET_PAY_PWD.getIType() + phone; + String cacheCode = RedisUtils.getCacheObject(key); + if(StringUtils.isEmpty(cacheCode)){ + this.invalidationParamsException("验证码无效"); + } + + if(!cacheCode.equals(bo.getSmsCode())){ + this.invalidationParamsException("验证码无效"); + } + + if(busRole == BusRole.MERCHANT.getId() ){ + //商户 + BusMerchant busBo = new BusMerchant(); + busBo.setId(LoginHelper.getBusId()); + busBo.setPayPassword(bo.getPayPwd()); + busBo.setCreateTime(new Date()); + busBo.setUpdateBy(LoginHelper.getUserId()); + this.busMerchantMapper.updateById(busBo); + updateUserResetPayTag(); + + }else if(busRole == BusRole.OPERATOR.getId()){ + //运营商 + BusOperator busOperatorBo = new BusOperator(); + busOperatorBo.setId(LoginHelper.getBusId()); + busOperatorBo.setPayPassword(bo.getPayPwd()); + busOperatorBo.setCreateTime(new Date()); + busOperatorBo.setUpdateBy(LoginHelper.getUserId()); + this.busOperatorMapper.updateById(busOperatorBo); + updateUserResetPayTag(); + + }else if(busRole == BusRole.SERVICE.getId()){ + //服务商 + SysSyd sysSydVo = new SysSyd(); + sysSydVo.setId(LoginHelper.getBusId()); + sysSydVo.setPayPassword(bo.getPayPwd()); + sysSydVo.setUpdateTime(new Date()); + sysSydVo.setUpdateBy(LoginHelper.getUserId()); + this.sysSydMapper.updateById(sysSydVo); + updateUserResetPayTag(); + + }else{ + this.invalidationParamsException("此用户不能修改支付密码"); + } + return "1"; + } + + private void updateUserResetPayTag() { + this.remoteUserService.updateUserResetPayTag(LoginHelper.getUserId()); + + } + + + @Override + public boolean sendSmsCode(String domain) { + Integer busRole = LoginHelper.getBusRole(); + String phone = null; + if(busRole == BusRole.MERCHANT.getId() ){ + //商户 + BusMerchantVo bmv = this.busMerchantService.queryById(LoginHelper.getBusId()); + phone = bmv.getWtrSjh(); + }else if(busRole == BusRole.OPERATOR.getId()){ + //运营商 + BusOperatorVo bov = this.busOperatorService.queryById(LoginHelper.getBusId()); + phone = bov.getWtrSjh(); + }else if(busRole == BusRole.SERVICE.getId()){ + //服务商 + SysSydVo sov = this.sysSydService.queryById(LoginHelper.getBusId()); + phone = sov.getConPhone(); + }else{ + this.invalidationParamsException("此用户不能修改支付密码"); + } + + if(StringUtils.isEmpty(phone)){ + this.invalidationParamsException("经办人手机号不能为空"); + } + String key = GlobalConstants.CAPTCHA_PAY_PWD_PHONE_CODE_KEY+ SmsType.RESET_PAY_PWD.getIType() + phone; + String cacheCode = RedisUtils.getCacheObject(key); + if(StringUtils.isNotEmpty(cacheCode)){ + this.invalidationParamsException("2分钟内不能重复发送"); + } + String code = RandomUtil.randomNumbers(4); + // RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + RemoteSms sms = this.remoteSmsService.send(domain, phone, SmsType.RESET_PAY_PWD, map); + if(sms != null){ + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(2)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java new file mode 100644 index 0000000..c832cb7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydAccountBo; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商账户Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydAccountServiceImpl implements ISysSydAccountService { + + private final SysSydAccountMapper baseMapper; + + private final BusAccountsMapper accountsMapper; + + private final SysSydMapper sydMapper; + + /** + * 查询服务商账户 + */ + @Override + public SysSydAccountVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商账户列表 + */ + @Override + public TableDataInfo queryPageList(SysSydAccountBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商账户列表 + */ + @Override + public List queryList(SysSydAccountBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydAccountBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydAccount::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, SysSydAccount::getAccId, bo.getAccId()); + lqw.eq(bo.getAccType() != null, SysSydAccount::getAccType, bo.getAccType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), SysSydAccount::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSydAccount::getBankCard, bo.getBankCard()); + lqw.eq(bo.getBalance() != null, SysSydAccount::getBalance, bo.getBalance()); + lqw.eq(bo.getFrozen() != null, SysSydAccount::getFrozen, bo.getFrozen()); + lqw.eq(bo.getIsDefault() != null, SysSydAccount::getIsDefault, bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, SysSydAccount::getAddTime, bo.getAddTime()); + lqw.eq(bo.getSettlement() != null, SysSydAccount::getSettlement, bo.getSettlement()); + lqw.eq(bo.getInvoice() != null, SysSydAccount::getInvoice, bo.getInvoice()); + lqw.eq(bo.getStatus() != null, SysSydAccount::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getOutBankCard()), SysSydAccount::getOutBankCard, bo.getOutBankCard()); + return lqw; + } + + /** + * 新增服务商账户 + */ + @Override + public Boolean insertByBo(SysSydAccountBo bo) { + SysSydAccount add = MapstructUtils.convert(bo, SysSydAccount.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商账户 + */ + @Override + public Boolean updateByBo(SysSydAccountBo bo) { + SysSydAccount update = MapstructUtils.convert(bo, SysSydAccount.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalance(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateBalance(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateBalance(sydId,Short.parseShort(unitId+""),amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozen(Long sydId, long unitId, long amount, String bankType) { + Integer baseNum = accountsMapper.updateFrozen(sydId,unitId,amount,bankType); + Integer curNum = baseMapper.updateFrozen(sydId,Short.parseShort(unitId+""),amount,bankType); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateBalanceByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateBalanceByAccId(accId,amount); + Integer curNum = baseMapper.updateBalanceByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateFrozenByAccId(int accId, long amount) { + Integer baseNum = accountsMapper.updateFrozenByAccId(accId,amount); + Integer curNum = baseMapper.updateFrozenByAccId(accId,amount); + return baseNum > 0 && curNum > 0 ? 1 : 0; + } + + @Override + public SysSydAccountVo getCashoutAccount(Long id) { + SysSydAccountVo rtn = baseMapper.selectVoById(id); + if(rtn != null){ + SysSydVo vo = sydMapper.selectVoById(rtn.getSydId()); + rtn.setAccName(vo.getGsmc()); + rtn.setBankCard(vo.getBankCard()); + rtn.setKfd(vo.getKfd()); + rtn.setKfh(vo.getKfh()); + rtn.setKhhNo(vo.getKhhNo()); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java new file mode 100644 index 0000000..912444c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydAccountSynServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSydAccountSyn; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydAccountSynBo; +import org.dromara.payment.sys.domain.vo.SysSydAccountSynVo; +import org.dromara.payment.sys.mapper.SysSydAccountSynMapper; +import org.dromara.payment.sys.service.ISysSydAccountSynService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商账户同步Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydAccountSynServiceImpl implements ISysSydAccountSynService { + + private final SysSydAccountSynMapper baseMapper; + + /** + * 查询服务商账户同步 + */ + @Override + public SysSydAccountSynVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商账户同步列表 + */ + @Override + public TableDataInfo queryPageList(SysSydAccountSynBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商账户同步列表 + */ + @Override + public List queryList(SysSydAccountSynBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydAccountSynBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSort() != null, SysSydAccountSyn::getSort, bo.getSort()); + lqw.eq(bo.getSynLock() != null, SysSydAccountSyn::getSynLock, bo.getSynLock()); + lqw.eq(StringUtils.isNotBlank(bo.getSynBatch()), SysSydAccountSyn::getSynBatch, bo.getSynBatch()); + lqw.eq(bo.getSynPosition() != null, SysSydAccountSyn::getSynPosition, bo.getSynPosition()); + return lqw; + } + + /** + * 新增服务商账户同步 + */ + @Override + public Boolean insertByBo(SysSydAccountSynBo bo) { + SysSydAccountSyn add = MapstructUtils.convert(bo, SysSydAccountSyn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商账户同步 + */ + @Override + public Boolean updateByBo(SysSydAccountSynBo bo) { + SysSydAccountSyn update = MapstructUtils.convert(bo, SysSydAccountSyn.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydAccountSyn entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商账户同步 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java new file mode 100644 index 0000000..db48e57 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydCashoutServiceImpl.java @@ -0,0 +1,294 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.bill.service.IMerBillService; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.domain.BusChannelAccount; +import org.dromara.payment.channel.domain.BusChannelFlows; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.enums.BusLogType; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.operator.domain.BusOperatorFlows; +import org.dromara.payment.operator.domain.vo.BusOperatorVo; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.domain.vo.SysSydAccountVo; +import org.dromara.payment.sys.domain.vo.SysSydCashoutVo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydFlowsMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydAccountService; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydCashoutBo; +import org.dromara.payment.sys.domain.SysSydCashout; +import org.dromara.payment.sys.mapper.SysSydCashoutMapper; +import org.dromara.payment.sys.service.ISysSydCashoutService; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Duration; +import java.util.*; +import java.util.function.Supplier; + +/** + * 服务商提现记录Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydCashoutServiceImpl implements ISysSydCashoutService { + + private final SysSydCashoutMapper baseMapper; + + private final SysSydAccountMapper sydAccountMapper; + + private final ISysSydAccountService sydAccountService; + + private final SysSydFlowsMapper sydFlowsMapper; + + private final SysSydMapper sydMapper; + + private final TranLogMapper tranLogDao;//交易日志dao + + private final IMerBillService billService; + + @DubboReference + private RemoteAccountService accountService;//银行账户业务 + + /** + * 查询服务商提现记录 + */ + @Override + public SysSydCashoutVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商提现记录列表 + */ + @Override + public TableDataInfo queryPageList(SysSydCashoutBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商提现记录列表 + */ + @Override + public List queryList(SysSydCashoutBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydCashoutBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydCashout::getSydId, bo.getSydId()); + lqw.eq(bo.getAccId() != null, SysSydCashout::getAccId, bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), SysSydCashout::getBusNo, bo.getBusNo()); + lqw.eq(bo.getAmount() != null, SysSydCashout::getAmount, bo.getAmount()); + lqw.eq(StringUtils.isNotBlank(bo.getKhh()), SysSydCashout::getKhh, bo.getKhh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), SysSydCashout::getKhhNo, bo.getKhhNo()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), SysSydCashout::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getKhd()), SysSydCashout::getKhd, bo.getKhd()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSydCashout::getBankCard, bo.getBankCard()); + lqw.eq(bo.getPayStatus() != null, SysSydCashout::getPayStatus, bo.getPayStatus()); + lqw.eq(bo.getPayTime() != null, SysSydCashout::getPayTime, bo.getPayTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayRemark()), SysSydCashout::getPayRemark, bo.getPayRemark()); + lqw.eq(bo.getAddTime() != null, SysSydCashout::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSydCashout::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), SysSydCashout::getPassage, bo.getPassage()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), SysSydCashout::getPayReceipt, bo.getPayReceipt()); + return lqw; + } + + /** + * 新增服务商提现记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysSydCashoutBo bo) { + SysSydCashout add = MapstructUtils.convert(bo, SysSydCashout.class); + validEntityBeforeSave(add); + SysSydAccountVo vo = sydAccountService.getCashoutAccount(bo.getAccId()); + if(vo == null){ + throw new ServiceException("资金账户不存在,提现失败"); + } + if(vo.getBalance() - vo.getFrozen() < bo.getAmount()){ + throw new ServiceException("资金账户可用余额不足,提现失败"); + } + billService.checkPayPassword(BusRole.SERVICE, vo.getSydId(), () -> { + SysSydVo syd = sydMapper.selectVoById(vo.getSydId()); + if(StringUtils.isBlank(syd.getPayPassword())){ + throw new ServiceException("请前往系统管理进行支付密码重置!"); + } + return !bo.getPassword().equals(syd.getPayPassword()); + }); + String busDesc = "服务商提现"; + if(sydAccountService.updateFrozenByAccId(vo.getAccId().intValue(),bo.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getBankType()+"账户可用余额不足"); + } + add.setSydId(vo.getSydId()); + add.setKhd(vo.getKfd()); + add.setKhh(vo.getKfh()); + add.setKhhNo(vo.getKhhNo()); + add.setFr(vo.getAccName()); + add.setBankCard(vo.getBankCard()); + add.setPassage(vo.getBankType()); + add.setBusNo("PW"+IdUtil.getSnowflakeNextIdStr()); + add.setAddTime(new Date()); + add.setPayStatus(2l);//支付中 + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + Account bankAcc = new Account(); + bankAcc.setBankType(add.getKhh()); + bankAcc.setBankCard(add.getBankCard()); + bankAcc.setUnitId(0l); + bankAcc.setName(add.getFr()); + bankAcc.setType((short)3);//3:真实企业账户 + Result addRtn = accountService.addAccount(bankAcc); + String msg = "创建交易账号失败"; + + if (addRtn.hasError()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.hasTip()) { + throw new ServiceException(msg).setDetailMessage(busDesc+","+msg+":"+addRtn.getResult()); + }else if (addRtn.getRtnData() == null) { + throw new ServiceException(msg); + } + //服务商提现 + TranLog backLog = new TranLog(); + backLog.setBusType(5l); + backLog.setBusItem(5l); + backLog.setTranNo("WI"+IdUtil.getSnowflakeNextIdStr()); + backLog.setBuisId(add.getId()); + Result backRtn = accountService.applyTransfer(vo.getAccId().intValue(), addRtn.getRtnData().getId(),bo.getAmount(), add.getBusNo(), "提现"); + if (backRtn.hasError()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.hasTip()) { + throw new ServiceException(busDesc + ",发送交易申请失败:"+backRtn.getResult()); + }else if (backRtn.getRtnData() == null) { + throw new ServiceException(busDesc + ",发送交易申请失败"); + } + backLog.setTranId(backRtn.getRtnData().getId()); + backLog.setAddTime(new Date()); + backLog.setTranResult(backRtn.getRtnData().getResult().intValue()); + backLog.setSourceAccId(backRtn.getRtnData().getSourceAccId().longValue()); + backLog.setSourceAccType(BusRole.SERVICE.getId()); + backLog.setTargetAccId(backRtn.getRtnData().getTargetAccId().longValue()); + backLog.setTargetAccType(BusRole.SERVICE.getId()); + backLog.setIsCallback(0); + tranLogDao.insert(backLog); + } + return flag; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TranLog cashoutResult(TranLogVo tlog, TransactionLog tran) { + TranLog save = null; + if (tran.getResult().intValue() == 2 || tran.getResult().intValue() == 3){ + String busDesc = "服务商提现"; + SysSydCashoutVo vo = baseMapper.selectVoById(tlog.getBuisId()); + if (vo == null) { + throw new ServiceException(busDesc+"时,提现记录不存在("+tlog.getBuisId()+")"); + } + if(vo.getPayStatus() != 2){ + //非支付中,直接返回 + return null; + } + if(sydAccountService.updateFrozenByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户冻结金额不足("+tlog.getBuisId()+")"); + } + if (tran.getResult().intValue() == 2) {//支付成功 + if(sydAccountService.updateBalanceByAccId(tran.getSourceAccId(),-tran.getAmount()) == 0){ + throw new ServiceException(busDesc+"时,"+vo.getPassage()+"账户余额不足("+tlog.getBuisId()+")"); + } + if(baseMapper.update(new LambdaUpdateWrapper().eq(SysSydCashout::getId,vo.getId()) + .eq(SysSydCashout::getPayStatus,2) + .set(SysSydCashout::getPayStatus,3) + .set(SysSydCashout::getPayTime,new Date()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + SysSydVo syd = sydMapper.selectVoById(vo.getSydId()); + SysSydFlows sydFlow = new SysSydFlows(2,vo.getSydId(),13, vo.getPassage(), null,tran.getTargetBankNo(), -tran.getAmount(), new Date(),vo.getAddBy(),"提现", null, vo.getId(), null, tlog.getTranNo(), 3, tran.getResult().intValue(), tlog.getSourceAccType(), vo.getSydId(), syd.getGsmc(), tran.getSourceCard(), tran.getSourceAccId().longValue(), tlog.getTargetAccType(), 0l, tran.getTargetAccName(), tran.getTargetCard(), tran.getTargetAccId().longValue(), "", 1); + sydFlowsMapper.insertSelective(sydFlow); + }else if (tran.getResult().intValue() == 3) {//支付失败 + if(baseMapper.update(new LambdaUpdateWrapper().eq(SysSydCashout::getId,vo.getId()) + .eq(SysSydCashout::getPayStatus,2) + .set(SysSydCashout::getPayStatus,4) + .set(SysSydCashout::getPayTime,new Date()) + .set(SysSydCashout::getPayRemark,tran.getReason()) + ) == 0){ + throw new ServiceException(busDesc+"时,重复处理提现结果("+tlog.getBuisId()+")"); + } + save = new TranLog(tlog.getId(),tran.getResult().intValue(),new Date()); + } + } + return save; + } + + /** + * 修改服务商提现记录 + */ + @Override + public Boolean updateByBo(SysSydCashoutBo bo) { + SysSydCashout update = MapstructUtils.convert(bo, SysSydCashout.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydCashout entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商提现记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java new file mode 100644 index 0000000..0b1a535 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydConfigServiceImpl.java @@ -0,0 +1,113 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSydConfig; +import org.dromara.payment.sys.domain.vo.SysSydConfigVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydConfigBo; +import org.dromara.payment.sys.mapper.SysSydConfigMapper; +import org.dromara.payment.sys.service.ISysSydConfigService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商配置Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydConfigServiceImpl implements ISysSydConfigService { + + private final SysSydConfigMapper baseMapper; + + /** + * 查询服务商配置 + */ + @Override + public SysSydConfigVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商配置列表 + */ + @Override + public TableDataInfo queryPageList(SysSydConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商配置列表 + */ + @Override + public List queryList(SysSydConfigBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydConfig::getSydId, bo.getSydId()); + lqw.eq(bo.getBegin() != null, SysSydConfig::getBegin, bo.getBegin()); + lqw.eq(bo.getEnd() != null, SysSydConfig::getEnd, bo.getEnd()); + lqw.eq(bo.getRate() != null, SysSydConfig::getRate, bo.getRate()); + lqw.eq(bo.getIsTaxCertificate() != null, SysSydConfig::getIsTaxCertificate, bo.getIsTaxCertificate()); + lqw.eq(bo.getCalStyle() != null, SysSydConfig::getCalStyle, bo.getCalStyle()); + return lqw; + } + + /** + * 新增服务商配置 + */ + @Override + public Boolean insertByBo(SysSydConfigBo bo) { + SysSydConfig add = MapstructUtils.convert(bo, SysSydConfig.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商配置 + */ + @Override + public Boolean updateByBo(SysSydConfigBo bo) { + SysSydConfig update = MapstructUtils.convert(bo, SysSydConfig.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydConfig entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java new file mode 100644 index 0000000..c1bb8a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydFlowsServiceImpl.java @@ -0,0 +1,145 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.convert.Convert; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.merchant.domain.BusMerchantFlows; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydFlowsBo; +import org.dromara.payment.sys.domain.vo.SysSydFlowsVo; +import org.dromara.payment.sys.domain.SysSydFlows; +import org.dromara.payment.sys.mapper.SysSydFlowsMapper; +import org.dromara.payment.sys.service.ISysSydFlowsService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商流水Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydFlowsServiceImpl implements ISysSydFlowsService { + + private final SysSydFlowsMapper baseMapper; + + /** + * 查询服务商流水 + */ + @Override + public SysSydFlowsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商流水列表 + */ + @Override + public TableDataInfo queryPageList(SysSydFlowsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商流水列表 + */ + @Override + public List queryList(SysSydFlowsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydFlowsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydFlows::getSydId, bo.getSydId()); + lqw.eq(bo.getBusType() != null, SysSydFlows::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getChannel()), SysSydFlows::getChannel, bo.getChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getBusNo()), SysSydFlows::getBusNo, bo.getBusNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), SysSydFlows::getBankNo, bo.getBankNo()); + lqw.eq(bo.getMoney() != null, SysSydFlows::getMoney, bo.getMoney()); + lqw.eq(bo.getBalance() != null, SysSydFlows::getBalance, bo.getBalance()); + lqw.eq(bo.getAddTime() != null, SysSydFlows::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSydFlows::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getBusDesc()), SysSydFlows::getBusDesc, bo.getBusDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNo()), SysSydFlows::getBillNo, bo.getBillNo()); + lqw.eq(bo.getBillId() != null, SysSydFlows::getBillId, bo.getBillId()); + lqw.eq(bo.getBillDetailId() != null, SysSydFlows::getBillDetailId, bo.getBillDetailId()); + lqw.eq(StringUtils.isNotBlank(bo.getTranNo()), SysSydFlows::getTranNo, bo.getTranNo()); + lqw.eq(bo.getTranType() != null, SysSydFlows::getTranType, bo.getTranType()); + lqw.eq(bo.getTranStatus() != null, SysSydFlows::getTranStatus, bo.getTranStatus()); + lqw.eq(bo.getPayerType() != null, SysSydFlows::getPayerType, bo.getPayerType()); + lqw.eq(bo.getPayerId() != null, SysSydFlows::getPayerId, bo.getPayerId()); + lqw.like(StringUtils.isNotBlank(bo.getPayerName()), SysSydFlows::getPayerName, bo.getPayerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayerAcc()), SysSydFlows::getPayerAcc, bo.getPayerAcc()); + lqw.eq(bo.getPayerAccId() != null, SysSydFlows::getPayerAccId, bo.getPayerAccId()); + lqw.eq(bo.getPayeeType() != null, SysSydFlows::getPayeeType, bo.getPayeeType()); + lqw.eq(bo.getPayeeId() != null, SysSydFlows::getPayeeId, bo.getPayeeId()); + lqw.like(StringUtils.isNotBlank(bo.getPayeeName()), SysSydFlows::getPayeeName, bo.getPayeeName()); + lqw.eq(StringUtils.isNotBlank(bo.getPayeeAcc()), SysSydFlows::getPayeeAcc, bo.getPayeeAcc()); + lqw.eq(bo.getPayeeAccId() != null, SysSydFlows::getPayeeAccId, bo.getPayeeAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getPayReceipt()), SysSydFlows::getPayReceipt, bo.getPayReceipt()); + lqw.eq(bo.getPayReceiptType() != null, SysSydFlows::getPayReceiptType, bo.getPayReceiptType()); + if(StringUtils.isNotBlank(bo.getParams().get("begin_time")) && StringUtils.isNotBlank(bo.getParams().get("end_time"))){ + lqw.between(SysSydFlows::getAddTime,bo.getParams().get("begin_time")+" 00:00:00",bo.getParams().get("end_time")+" 23:59:59"); + } + if(StringUtils.isNotBlank(bo.getParams().get("ids"))){ + lqw.in(SysSydFlows::getId,StringUtils.splitTo(bo.getParams().get("ids").toString(), Convert::toLong)); + } + lqw.orderByDesc(SysSydFlows::getAddTime); + return lqw; + } + + /** + * 新增服务商流水 + */ + @Override + public Boolean insertByBo(SysSydFlowsBo bo) { + SysSydFlows add = MapstructUtils.convert(bo, SysSydFlows.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商流水 + */ + @Override + public Boolean updateByBo(SysSydFlowsBo bo) { + SysSydFlows update = MapstructUtils.convert(bo, SysSydFlows.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydFlows entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商流水 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java new file mode 100644 index 0000000..ce895cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydLogServiceImpl.java @@ -0,0 +1,142 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydLogBo; +import org.dromara.payment.sys.domain.vo.SysSydLogVo; +import org.dromara.payment.sys.domain.SysSydLog; +import org.dromara.payment.sys.mapper.SysSydLogMapper; +import org.dromara.payment.sys.service.ISysSydLogService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商变动记录Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydLogServiceImpl implements ISysSydLogService { + + private final SysSydLogMapper baseMapper; + + /** + * 查询服务商变动记录 + */ + @Override + public SysSydLogVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商变动记录列表 + */ + @Override + public TableDataInfo queryPageList(SysSydLogBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商变动记录列表 + */ + @Override + public List queryList(SysSydLogBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydLogBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSydId() != null, SysSydLog::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), SysSydLog::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getGsmc()), SysSydLog::getGsmc, bo.getGsmc()); + lqw.eq(StringUtils.isNotBlank(bo.getKfd()), SysSydLog::getKfd, bo.getKfd()); + lqw.eq(StringUtils.isNotBlank(bo.getKfh()), SysSydLog::getKfh, bo.getKfh()); + lqw.eq(bo.getBankType() != null, SysSydLog::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSydLog::getBankCard, bo.getBankCard()); + lqw.eq(bo.getJbsl() != null, SysSydLog::getJbsl, bo.getJbsl()); + lqw.eq(bo.getQuoteNum() != null, SysSydLog::getQuoteNum, bo.getQuoteNum()); + lqw.eq(bo.getAddTime() != null, SysSydLog::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSydLog::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), SysSydLog::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, SysSydLog::getEditTime, bo.getEditTime()); + lqw.eq(bo.getProvinceId() != null, SysSydLog::getProvinceId, bo.getProvinceId()); + lqw.like(StringUtils.isNotBlank(bo.getProvinceName()), SysSydLog::getProvinceName, bo.getProvinceName()); + lqw.eq(bo.getCityId() != null, SysSydLog::getCityId, bo.getCityId()); + lqw.like(StringUtils.isNotBlank(bo.getCityName()), SysSydLog::getCityName, bo.getCityName()); + lqw.eq(bo.getCountyId() != null, SysSydLog::getCountyId, bo.getCountyId()); + lqw.like(StringUtils.isNotBlank(bo.getCountyName()), SysSydLog::getCountyName, bo.getCountyName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), SysSydLog::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), SysSydLog::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrCardid()), SysSydLog::getFrCardid, bo.getFrCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getFrPhone()), SysSydLog::getFrPhone, bo.getFrPhone()); + lqw.like(StringUtils.isNotBlank(bo.getConName()), SysSydLog::getConName, bo.getConName()); + lqw.eq(StringUtils.isNotBlank(bo.getConPhone()), SysSydLog::getConPhone, bo.getConPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getConCardid()), SysSydLog::getConCardid, bo.getConCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getConEmail()), SysSydLog::getConEmail, bo.getConEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysSydLog::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getBusiness()), SysSydLog::getBusiness, bo.getBusiness()); + lqw.eq(StringUtils.isNotBlank(bo.getAbridge()), SysSydLog::getAbridge, bo.getAbridge()); + lqw.eq(bo.getLimitAmount() != null, SysSydLog::getLimitAmount, bo.getLimitAmount()); + lqw.eq(bo.getSignMode() != null, SysSydLog::getSignMode, bo.getSignMode()); + lqw.eq(bo.getSignValidTime() != null, SysSydLog::getSignValidTime, bo.getSignValidTime()); + lqw.eq(bo.getLogTime() != null, SysSydLog::getLogTime, bo.getLogTime()); + return lqw; + } + + /** + * 新增服务商变动记录 + */ + @Override + public Boolean insertByBo(SysSydLogBo bo) { + SysSydLog add = MapstructUtils.convert(bo, SysSydLog.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改服务商变动记录 + */ + @Override + public Boolean updateByBo(SysSydLogBo bo) { + SysSydLog update = MapstructUtils.convert(bo, SysSydLog.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydLog entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商变动记录 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java new file mode 100644 index 0000000..869b3e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydProductServiceImpl.java @@ -0,0 +1,224 @@ +package org.dromara.payment.sys.service.impl; + +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.channel.domain.BusChannelProduct; +import org.dromara.payment.channel.mapper.BusChannelProductMapper; +import org.dromara.payment.merchant.domain.BusMerchantProduct; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.dromara.payment.operator.domain.BusOperator; +import org.dromara.payment.operator.domain.BusOperatorProduct; +import org.dromara.payment.operator.domain.ReProductInvoice; +import org.dromara.payment.operator.domain.bo.ReProductInvoiceBo; +import org.dromara.payment.operator.mapper.BusOperatorProductMapper; +import org.dromara.payment.operator.mapper.ReProductInvoiceMapper; +import org.dromara.payment.sys.domain.SysSydProduct; +import org.dromara.payment.sys.domain.vo.SysSydProductVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydProductBo; +import org.dromara.payment.sys.mapper.SysSydProductMapper; +import org.dromara.payment.sys.service.ISysSydProductService; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务商产品Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydProductServiceImpl extends BaseService implements ISysSydProductService { + + private final SysSydProductMapper baseMapper; + + private final ReProductInvoiceMapper reProductInvoiceMapper; + + @Autowired + private BusOperatorProductMapper busOperatorProductMapper; + + @Autowired + private BusChannelProductMapper busChannelProductMapper; + + @Autowired + private BusMerchantProductMapper busMerchantProductMapper; + + /** + * 查询服务商产品 + */ + @Override + public SysSydProductVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商产品列表 + */ + @Override + public TableDataInfo queryPageList(SysSydProductBo bo, PageQuery pageQuery) { + Page result = baseMapper.queryPageList(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 查询服务商产品列表 + */ + @Override + public List queryList(SysSydProductBo bo) { + return baseMapper.queryList(bo); + } + + /** + * 新增服务商产品 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysSydProductBo bo) { + SysSydProduct add = MapstructUtils.convert(bo, SysSydProduct.class); + validEntityBeforeSave(add); + add.setNo(genNo(0,10)); + if(bo.getInvoiceItemList() != null){ + bo.setInvoiceItems(StreamUtils.join(bo.getInvoiceItemList(),ReProductInvoiceBo::getInvoiceTypeName)); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + if(bo.getInvoiceItemList() != null && bo.getInvoiceItemList().size() > 0){ + List invoiceItems = new ArrayList<>(); + for (ReProductInvoiceBo ibo:bo.getInvoiceItemList()) { + ReProductInvoice obj = MapstructUtils.convert(ibo,ReProductInvoice.class); + obj.setProType(bo.getBusType()); + obj.setProNo(bo.getNo()); + obj.setProId(add.getId()); + obj.setBusId(bo.getSydId()); + obj.setBusType(BusRole.SERVICE.getId()); + invoiceItems.add(obj); + } + reProductInvoiceMapper.insertBatch(invoiceItems); + } + } + return flag; + } + + /** + * 生成产品编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @return + */ + public String genNo(int retry,int maxRetry){ + String no = "P"+ RandomUtil.randomNumbers(10); + QueryWrapper lqw = Wrappers.query(); + lqw.eq("no",no); + SysSydProduct exists = baseMapper.selectOne(lqw); + if(exists != null){ + if(retry > maxRetry){ + throw new ServiceException("产品编号生成出错"); + }else { + no = genNo(retry + 1,maxRetry); + } + } + return no; + } + + /** + * 修改服务商产品 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysSydProductBo bo) { + SysSydProduct update = MapstructUtils.convert(bo, SysSydProduct.class); + validEntityBeforeSave(update); + SysSydProductVo selObj = this.baseMapper.selectVoById(bo.getId()); + if(selObj == null){ + this.invalidationParamsException("参数无效,无此产品"); + } + + BigDecimal minBigDecimal = this.baseMapper.selMinServiceChargeByproId(bo.getId()); + if(minBigDecimal != null ){ + + if(minBigDecimal.compareTo(bo.getSetingServiceCharge()) < 0){ + this.invalidationParamsException("产品费率不能大于"+minBigDecimal); + } + } + + reProductInvoiceMapper.delete(new LambdaQueryWrapper().eq(ReProductInvoice::getBusId,bo.getSydId()).eq(ReProductInvoice::getBusType,BusRole.SERVICE.getId())); + if(bo.getInvoiceItemList() != null && bo.getInvoiceItemList().size() > 0){ + bo.setInvoiceItems(StreamUtils.join(bo.getInvoiceItemList(),ReProductInvoiceBo::getInvoiceTypeName)); + List invoiceItems = new ArrayList<>(); + for (ReProductInvoiceBo ibo:bo.getInvoiceItemList()) { + ReProductInvoice obj = MapstructUtils.convert(ibo,ReProductInvoice.class); + obj.setProType(bo.getBusType()); + obj.setProNo(bo.getNo()); + obj.setProId(bo.getId()); + obj.setBusId(bo.getSydId()); + obj.setBusType(BusRole.SERVICE.getId()); + invoiceItems.add(obj); + } + reProductInvoiceMapper.insertBatch(invoiceItems); + }else{ + bo.setInvoiceItems(""); + } + + if(selObj.getInvoiceItems() == null || !selObj.getInvoiceItems().equals(bo.getInvoiceItems())){ + + this.busOperatorProductMapper.update(null,new LambdaUpdateWrapper() + .set(BusOperatorProduct::getInvoiceItems, bo.getInvoiceItems()) + .eq(BusOperatorProduct::getProId, bo.getId())); + this.busChannelProductMapper.update(null,new LambdaUpdateWrapper() + .set(BusChannelProduct::getInvoiceItems, bo.getInvoiceItems()) + .eq(BusChannelProduct::getProId, bo.getId())); + this.busMerchantProductMapper.update(null,new LambdaUpdateWrapper() + .set(BusMerchantProduct::getInvoiceItems, bo.getInvoiceItems()) + .eq(BusMerchantProduct::getProId, bo.getId())); + } + + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydProduct entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商产品 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public String upDown(Long id, Integer status) { + if(id == null || status == null){ + this.invalidationParamsException("参数无效"); + } + this.baseMapper.update(null,new LambdaUpdateWrapper().set(SysSydProduct::getProStatus,status).eq(SysSydProduct::getId,id)); + return "true"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java new file mode 100644 index 0000000..847c816 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceImpl.java @@ -0,0 +1,536 @@ +package org.dromara.payment.sys.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.properties.PayPasswordProperties; +import org.dromara.payment.properties.PlatformProperties; +import org.dromara.payment.sys.domain.*; +import org.dromara.payment.sys.domain.vo.SelectSydVo; +import org.dromara.payment.sys.mapper.*; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.payment.sys.service.ISysSydService; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.*; +import java.util.function.Function; + +/** + * 服务商Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysSydServiceImpl implements ISysSydService { + + private final SysSydMapper baseMapper; + + private final SysSydLogMapper sydLogMapper; + + private final SysUnitMapper sysUnitMapper; + + private final BusAccountsMapper accountsMapper; + + private final SysSydServiceTransactionImpl transactionImpl; + + private final BankAccountServiceTransactionImpl bankAccountTransactionImpl; + + private final SysSydConfigMapper sysSydConfigMapper; + @DubboReference + private RemoteAccountService accountService;//银行账户 + + private final SysSydSignContentMapper signContentDao;//结算中心协议dao + + private final SysSydAccountMapper sysSydAccountMapper; + + @DubboReference + private RemoteSmsService remoteSmsService; + + @DubboReference + private RemoteJzqService remoteJzqService; + + @Autowired + private PlatformProperties platformProperties; + + @DubboReference + private RemoteUserService remoteUserService; + + /** + * 查询服务商 + */ + @Override + public SysSydVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商列表 + */ + @Override + public TableDataInfo queryPageList(SysSydBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectSydList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商列表 + */ + @Override + public List queryList(SysSydBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), SysSyd::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getGsmc()), SysSyd::getGsmc, bo.getGsmc()); + lqw.eq(StringUtils.isNotBlank(bo.getKfd()), SysSyd::getKfd, bo.getKfd()); + lqw.eq(StringUtils.isNotBlank(bo.getKfh()), SysSyd::getKfh, bo.getKfh()); + lqw.eq(StringUtils.isNotBlank(bo.getKhhNo()), SysSyd::getKhhNo, bo.getKhhNo()); + lqw.eq(bo.getBankType() != null, SysSyd::getBankType, bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), SysSyd::getBankCard, bo.getBankCard()); + lqw.eq(bo.getJbsl() != null, SysSyd::getJbsl, bo.getJbsl()); + lqw.eq(bo.getQuoteNum() != null, SysSyd::getQuoteNum, bo.getQuoteNum()); + lqw.eq(bo.getAddTime() != null, SysSyd::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), SysSyd::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), SysSyd::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, SysSyd::getEditTime, bo.getEditTime()); + lqw.eq(bo.getProvinceId() != null, SysSyd::getProvinceId, bo.getProvinceId()); + lqw.like(StringUtils.isNotBlank(bo.getProvinceName()), SysSyd::getProvinceName, bo.getProvinceName()); + lqw.eq(bo.getCityId() != null, SysSyd::getCityId, bo.getCityId()); + lqw.like(StringUtils.isNotBlank(bo.getCityName()), SysSyd::getCityName, bo.getCityName()); + lqw.eq(bo.getCountyId() != null, SysSyd::getCountyId, bo.getCountyId()); + lqw.like(StringUtils.isNotBlank(bo.getCountyName()), SysSyd::getCountyName, bo.getCountyName()); + lqw.eq(StringUtils.isNotBlank(bo.getNsrSbh()), SysSyd::getNsrSbh, bo.getNsrSbh()); + lqw.eq(StringUtils.isNotBlank(bo.getFr()), SysSyd::getFr, bo.getFr()); + lqw.eq(StringUtils.isNotBlank(bo.getFrCardid()), SysSyd::getFrCardid, bo.getFrCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getFrPhone()), SysSyd::getFrPhone, bo.getFrPhone()); + lqw.like(StringUtils.isNotBlank(bo.getConName()), SysSyd::getConName, bo.getConName()); + lqw.eq(StringUtils.isNotBlank(bo.getConPhone()), SysSyd::getConPhone, bo.getConPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getConCardid()), SysSyd::getConCardid, bo.getConCardid()); + lqw.eq(StringUtils.isNotBlank(bo.getConEmail()), SysSyd::getConEmail, bo.getConEmail()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysSyd::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getBusiness()), SysSyd::getBusiness, bo.getBusiness()); + lqw.eq(StringUtils.isNotBlank(bo.getAbridge()), SysSyd::getAbridge, bo.getAbridge()); + lqw.eq(StringUtils.isNotBlank(bo.getPayPassword()), SysSyd::getPayPassword, bo.getPayPassword()); + lqw.eq(bo.getPassErrorNum() != null, SysSyd::getPassErrorNum, bo.getPassErrorNum()); + lqw.eq(bo.getPassFrozenTime() != null, SysSyd::getPassFrozenTime, bo.getPassFrozenTime()); + lqw.orderByDesc(SysSyd::getAddTime); + return lqw; + } + + + + + /** + * 新增服务商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysSydBo bo) throws Exception { + + String email = bo.getConEmail(); + String name = bo.getConName(); + Integer organizationType = 0; + Integer identificationType = 1; + String organizationRegNo = bo.getNsrSbh(); + String saveDir = "/www/wwwroot"; + // 保存的文件名 + String fileName = "downloaded_image.jpeg"; + File organizationRegImg = createFileFromURL(bo.getYyzz(), saveDir, fileName); + + + + String legalName = bo.getFr(); + String legalIdentityCard = bo.getFrCardid(); + String legalMobile = bo.getFrPhone(); + + String s = remoteJzqService.organizationCreate(email, name, organizationType, identificationType, organizationRegNo, + organizationRegImg, legalName, legalIdentityCard, legalMobile); + + JSONObject parse = JSONObject.parseObject(s); + if (parse.getString("success").equals("false")) { + throw new ServiceException(parse.getString("msg")); + } + + SysSyd add = MapstructUtils.convert(bo, SysSyd.class); + validEntityBeforeSave(add); + String no = genNo(0,10); + SysUnit sysUnit = new SysUnit(); + sysUnit.setNo(no); + sysUnit.setId(IdUtil.getSnowflakeNextId()); + sysUnit.setUnitType(BusRole.SERVICE.getId()); + sysUnit.setName(add.getGsmc()); + sysUnit.setCustNo(no.substring(1)); + sysUnitMapper.insert(sysUnit); + add.setId(sysUnit.getId()); + add.setNo(no); + add.setAddBy(bo.getAddBy()); + add.setAddTime(new Date()); + add.setEditer(bo.getAddBy()); + add.setEditTime(bo.getAddTime()); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + + SysSydConfig sysSydConfig = new SysSydConfig(); + sysSydConfig.setSydId(add.getId()); + sysSydConfig.setAutoApprove(1); + sysSydConfig.setCreateTime(new Date()); + sysSydConfig.setCreateBy(LoginHelper.getUserId()); + sysSydConfigMapper.insert(sysSydConfig); + + + + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setBusId(bo.getId()); + remoteUserBo.setBusNo(add.getNo()); + remoteUserBo.setRoleId(BusRole.SERVICE.getId()); + remoteUserBo.setRoleName(BusRole.SERVICE.getName()); + remoteUserBo.setRoleDataRange(1); + remoteUserBo.setNickName(bo.getGsmc()); + remoteUserBo.setCreateTime(new Date()); + remoteUserBo.setPhonenumber(bo.getConPhone()); + remoteUserBo.setCreateBy(LoginHelper.getUserId()); + remoteUserBo.setUserName("S"+StringUtils.randmNumber(5)); + String pwd = StringUtils.randmNumber(6); + remoteUserBo.setPassword(BCrypt.hashpw(pwd)); + this.addUser(remoteUserBo); + + LinkedHashMap smsMap = new LinkedHashMap(); + smsMap.put("type",BusRole.SERVICE.getName()); + smsMap.put("name",remoteUserBo.getUserName()); + smsMap.put("pwd",pwd); + this.remoteSmsService.send(bo.getDomain(),remoteUserBo.getPhonenumber(), SmsType.UNIT_OPEN,smsMap); + + return flag; + } + + + public static File createFileFromURL(String fileUrl, String saveDir, String fileName) throws Exception { + // 确保保存目录存在 + File savePath = new File(saveDir); + if (!savePath.exists()) { + savePath.mkdirs(); + } + + // 创建目标文件 + File file = new File(saveDir, fileName); + + // 从URL下载文件并保存到本地 + try (InputStream inputStream = new URL(fileUrl).openStream(); + FileOutputStream outputStream = new FileOutputStream(file)) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + + return file; + } + + private void addUser(RemoteUserBo remoteUserBo){ + int result = this.remoteUserService.insertBusUser(remoteUserBo); + if(result == -1){ + remoteUserBo.setUserName("S"+StringUtils.randmNumber(5)); + this.addUser(remoteUserBo); + } + + } + + /** + * 生成服务商编号 + * @param retry 当前重试次数 + * @param maxRetry 最大重试次数 + * @return + */ + public String genNo(int retry,int maxRetry){ + String no = "S"+ RandomUtil.randomNumbers(5); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysSyd::getNo,no); + SysSyd exists = baseMapper.selectOne(lqw); + if(exists != null){ + if(retry > maxRetry){ + throw new ServiceException("服务商编号生成出错"); + }else { + no = genNo(retry + 1,maxRetry); + } + } + return no; + } + + /** + * 修改服务商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysSydBo bo) { + SysSyd update = MapstructUtils.convert(bo, SysSyd.class); + validEntityBeforeSave(update); + update.setEditer(bo.getEditer()); + update.setEditTime(new Date()); + sysUnitMapper.update(new LambdaUpdateWrapper() + .set(SysUnit::getName, update.getGsmc()) + .eq(SysUnit::getId, update.getId())); + sydLogMapper.insertSysSydLog(update.getId(),new Date()); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSyd entity){ + //TODO 做一些数据校验,如唯一约束 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysSyd::getGsmc,entity.getGsmc()); + SysSyd exists = baseMapper.selectOne(lqw); + if(exists != null && (entity.getId() == null || !entity.getId().equals(exists.getId()))){ + throw new ServiceException("服务商已存在"); + } + } + + /** + * 批量删除服务商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + sysUnitMapper.deleteBatchIds(ids); + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean creatSydXNnum(Long id, String gsmc) { + //服务商账户 + Map paraMap= new HashMap(); + + paraMap.put("sydId",id); + paraMap.put("accType",0); + paraMap.put("bankType",id); + + + Boolean sydRtn = creatXNnum(id,id,gsmc,BusRole.SERVICE.getId(),BusRole.PLATFORM.getId(), add -> { + if(add != null) { + if(add.getId() > 0) { + Integer num = sysSydAccountMapper.insertSysSydAccount(new SysSydAccount(null, add.getUnitId(), add.getAccId(), 0, add.getBankType(), add.getBankCard(), 0l, 0l, (long) 1, add.getAddTime(), + add.getKhh(),add.getLhh(),add.getName())); + return num > 0; + } + return true; + } + return false; + }, bankType -> { + List accs = sysSydAccountMapper.selectSysSydAccountBySydId(id, (short) 0, bankType); + return accs.size() > 0 ? accs.get(0).getBankCard() : null; + }); + //平台账户 + Boolean platformRtn = creatXNnum(id,0l,platformProperties.getKhm(),BusRole.PLATFORM.getId(),BusRole.PLATFORM.getId(), add -> { + if(add != null) { + return true; + } + return false; + }, bankType -> { + List accs = accountsMapper.selectList(new LambdaQueryWrapper() + .eq(BusAccounts::getSydId,id) + .eq(BusAccounts::getUnitId,0) + .eq(BusAccounts::getIsDefault,1) + .eq(BusAccounts::getBankType,bankType)); + return accs.size() > 0 ? accs.get(0).getBankCard() : null; + }); + return sydRtn && platformRtn; + } + + @Override + public Boolean creatXNnum(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun, Function existsFun) { + String failBank = ""; + try { + try { + transactionImpl.addZhaoShangAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "招商银行"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + try { + transactionImpl.addJiaoTongAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun,existsFun); + } catch (Exception e) { + String bankType = "交通银行"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + try { + transactionImpl.addZhiFuBaoAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "支付宝"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + try { + transactionImpl.addMinShengAccount(sydId,unitId, gsmc,roleType,addRoleType,saveFun); + } catch (Exception e) { + String bankType = "民生银行"; + log.error("结算中心" + bankType + "服务费账户开通出错:" + e.getMessage(), e); + if (StringUtils.isNotEmpty(failBank)) { + failBank += "、"; + } + failBank += bankType; + } + if (StringUtils.isNotEmpty(failBank)) { + throw new ServiceException("开通服务费账户失败[" + failBank + "]"); + } + return true; + } catch (Exception e) { + String msgStr = "开虚拟户失败!"; + log.error(msgStr, e); + if (e instanceof ServiceException) { + throw new ServiceException(e.getMessage()); + } else { + throw new ServiceException(msgStr); + } + } + } + + @Override + public Map valiConfig(Long sydId, String passage) { + if (StringUtils.isBlank(passage)) { + throw new ServiceException("bankType不能为空"); + } + try { + return bankAccountTransactionImpl.existsBank(sydId, passage); + } catch (Exception e) { + String msgStr = "验证银行类型是否可用出错:("+sydId+","+passage+")"; + log.error(msgStr,e); + } + return null; + } + + @Override + public SysSydSignContent getWorkerSignInfo(int sydId) { + try { + SysSydSignContent rtn = signContentDao.selectByPrimaryKey(sydId); + if (rtn != null) { + SysSyd syd = baseMapper.selectSysSydById(Long.parseLong(sydId+"")); + rtn.setSignMode(syd.getSignMode()); + rtn.setSignValidTime(syd.getSignValidTime()); + } + return rtn; + } catch (Exception e) { + String msgStr = "查询结算中心的签约内容出错:("+sydId+")"; + log.error(msgStr,e); + } + return null; + } + + @Override + public Boolean saveWorkerSignInfo(SysSydSignContent sign) { + try { + sign.setEditTime(new Date()); + transactionImpl.saveWorkerSignInfo(sign); + return true; + } catch (Exception e) { + String msgStr = "保存结算中心的自雇者签约信息出错:("+ JSONObject.toJSONString(sign)+")"; + log.error(msgStr,e); + if(e instanceof ServiceException) + throw new ServiceException(e.getMessage()); + } + return false; + } + + @Override + public SignZhifubao getSignInfo(Long sydId, String passage) { + try { + SysSyd syd = baseMapper.selectSysSydById(Long.parseLong(sydId+"")); + if (syd == null) { + throw new ServiceException("结算中心已不存在"); + } + Result signRtn = accountService.getSignInfo(syd.getId(), syd.getGsmc(), passage); + if (signRtn.hasError()) { + throw new RuntimeException(signRtn.getResult()); + }else if (signRtn.hasTip()) { + throw new ServiceException(signRtn.getResult()); + }else if (signRtn.getRtnData() == null) { + throw new ServiceException("该结算中心无需签约"); + } + return signRtn.getRtnData(); + } catch (Exception e) { + String msgStr = "获取结算中心的签约信息出错:("+sydId+","+passage+")"; + log.error(msgStr,e); + if(e instanceof ServiceException) + throw new ServiceException(e.getMessage()); + } + return null; + } + + @Override + public List selectSydByMerId(Long merId) { + return baseMapper.selectSydByMerId(merId); + } + + + + @Override + public List getSydByUserName(String userName) { + List rtn = null; + RemoteSysUserVo user = remoteUserService.selectUserByName(userName); + if(user != null && user.getCurRoleId() == BusRole.MERCHANT.getId()){ + rtn = baseMapper.selectSydByMerId(user.getBusId()); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java new file mode 100644 index 0000000..5c96360 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydServiceTransactionImpl.java @@ -0,0 +1,206 @@ +package org.dromara.payment.sys.service.impl; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.common.domain.BusAccounts; +import org.dromara.payment.common.mapper.BusAccountsMapper; +import org.dromara.payment.sys.domain.AccAccounts; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.mapper.SysSydSignContentMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.ResultCodeEnum; +import org.dromara.system.api.RemoteOrderNumService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +/** + * 税源地Service业务层处理 + * + * @author ruoyi + * @date 2021-08-18 + */ +@Service +@Slf4j +public class SysSydServiceTransactionImpl +{ + @DubboReference + private RemoteAccountService accountService; + + @Autowired + private BusAccountsMapper accountsMapper; + + @Autowired + private SysSydMapper sydDao; + + @Autowired + private SysSydSignContentMapper signDao; + + @Autowired + private BankAccountServiceTransactionImpl bankAccountService;//银行账户业务 + + + @DubboReference + private RemoteOrderNumService remoteOrderNumService; + + private String getOrderKey(int roleType){ + + if(BusRole.SERVICE.getId() == roleType){ + return "service"; + }else if(BusRole.MERCHANT.getId() == roleType){ + return "merchant"; + }else if(BusRole.OPERATOR.getId() == roleType){ + return "operator"; + }else if(BusRole.PLATFORM.getId() == roleType){ + return "platform"; + }else{ + return "default"; + } + + + } + + @Transactional + public void addZhaoShangAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun) { + String bankType = "招商银行"; + Map configMap = bankAccountService.existsBank(sydId, bankType); + if (configMap != null) { + //开招商银行虚拟户 + Long code = this.remoteOrderNumService.getOrderNum(sydId+this.getOrderKey(roleType),5); + log.info(roleType +"- 生成编号:"+code); + if(code == null){ + throw new ServiceException("生成编号出错"); + } + Result addAccount = accountService.addAccount(sydId, roleType, unitId,gsmc,bankType,code); + if(addAccount !=null&&addAccount.getRtnCode() == ResultCodeEnum.SUCCESS.Code()){ + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(), + rtnData.getBankName(), rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + saveFun.apply(add); + }else { + throw new ServiceException("招商银行开虚拟户失败:"+addAccount.getResult()); + } + } + } + + @Transactional + public void addZhiFuBaoAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun) { + String bankType = "支付宝"; + Map configMap = bankAccountService.existsBank(sydId, bankType); + if (configMap != null) { + //开支付宝记账本 + Result addAccount = accountService.addAccount(sydId,roleType, unitId,gsmc,bankType,null); + if(addAccount !=null&&addAccount.getRtnCode() == ResultCodeEnum.SUCCESS.Code()){ + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(),rtnData.getBankName(),rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + saveFun.apply(add); + }else { + throw new ServiceException("支付宝开虚拟户失败:"+addAccount.getResult()); + } + } + } + + @Transactional + public void addJiaoTongAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun, Function existsFun) { + //开交通银行虚拟户 + Map configMap = bankAccountService.existsBank(sydId, "交通银行"); + if (configMap != null) { + Account bankAcc = new Account(); + bankAcc.setBankType("交通银行"); + bankAcc.setBankCard(configMap.get("jiaotong_cloud_acc1")); + bankAcc.setBankArgNo(configMap.get("jiaotong_cloud_acc1_busi_no")); + bankAcc.setUnitId(sydId); + bankAcc.setName(configMap.get("jiaotong_super_acc_name")); + bankAcc.setType((short)1);//1:云账户 + Result addAccount = accountService.addAccount(bankAcc); + if (addAccount.hasError() || addAccount.hasTip() || addAccount.getRtnData() == null) { + throw new RuntimeException("交通银行开虚拟户失败:"+addAccount.getResult()); + }else { + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + String existsCard = existsFun.apply(rtnData.getBankTypeName()); + if (StringUtils.isBlank(existsCard)) { + bankAccountService.useAccount(new AccAccounts(rtnData.getBankTypeName(), rtnData.getBankCard(), (short) roleType, unitId, gsmc, rtnData.getBankArgNo())); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(),rtnData.getBankName(),rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + if (!saveFun.apply(add)) { + throw new RuntimeException("不允许更换结算云账户"); + } + } else { + if (!existsCard.equals(rtnData.getBankCard())) { + throw new RuntimeException("不允许更换结算云账户"); + } + } + } + } + } + + @Transactional + public void addMinShengAccount(Long sydId,Long unitId, String gsmc,int roleType,int addRoleType, Function saveFun) { + String bankType = "民生银行"; + Map configMap = bankAccountService.existsBank(sydId, bankType); + if (configMap != null) { + //开招商银行虚拟户 + SysSyd syd = sydDao.selectSysSydById(sydId); + String bindAcctNo = syd.getBankCard(); + String bindAcctName = configMap.get("minsheng_bank_acctName"); + Result addAccount = accountService.addAccount(sydId, roleType, unitId, gsmc, bankType, bindAcctNo, bindAcctName,null); + if (addAccount != null && addAccount.getRtnCode() == ResultCodeEnum.SUCCESS.Code()) { + Date createTime = new Date(); + Account rtnData = addAccount.getRtnData(); + BusAccounts add = new BusAccounts(sydId,unitId,(long)rtnData.getId(),rtnData.getBankTypeName(), rtnData.getBankCard(),1l,createTime,addRoleType,rtnData.getName(),rtnData.getBankName(),rtnData.getBankNo()); + accountsMapper.insertSelective(add); + if(add.getId() == null){ + add.setId(0l); + } + saveFun.apply(add); + } else { + throw new ServiceException(bankType + "开虚拟户失败:" + addAccount.getResult()); + } + } + } + + @Transactional + public void saveWorkerSignInfo(SysSydSignContent sign) { + SysSyd syd = new SysSyd(); + syd.setId(sign.getId().longValue()); + syd.setSignMode(sign.getSignMode()); + syd.setSignValidTime(sign.getSignValidTime()); + sydDao.updateSysSyd(syd); + SysSydSignContent old = signDao.selectByPrimaryKey(sign.getId()); + if (old != null) { + signDao.updateByPrimaryKeySelective(sign); + } else { + signDao.insertSelective(sign); + } + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java new file mode 100644 index 0000000..f148d24 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysSydSignContentServiceImpl.java @@ -0,0 +1,111 @@ +package org.dromara.payment.sys.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysSydSignContent; +import org.dromara.payment.sys.domain.vo.SysSydSignContentVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.sys.domain.bo.SysSydSignContentBo; +import org.dromara.payment.sys.mapper.SysSydSignContentMapper; +import org.dromara.payment.sys.service.ISysSydSignContentService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 服务商协议内容Service业务层处理 + * + * @author LionLi + * @date 2024-03-26 + */ +@RequiredArgsConstructor +@Service +public class SysSydSignContentServiceImpl implements ISysSydSignContentService { + + private final SysSydSignContentMapper baseMapper; + + /** + * 查询服务商协议内容 + */ + @Override + public SysSydSignContentVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询服务商协议内容列表 + */ + @Override + public TableDataInfo queryPageList(SysSydSignContentBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询服务商协议内容列表 + */ + @Override + public List queryList(SysSydSignContentBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSydSignContentBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getContent()), SysSydSignContent::getContent, bo.getContent()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), SysSydSignContent::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, SysSydSignContent::getEditTime, bo.getEditTime()); + return lqw; + } + + /** + * 新增服务商协议内容 + */ + @Override + public Boolean insertByBo(SysSydSignContentBo bo) { + SysSydSignContent add = MapstructUtils.convert(bo, SysSydSignContent.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId().longValue()); + } + return flag; + } + + /** + * 修改服务商协议内容 + */ + @Override + public Boolean updateByBo(SysSydSignContentBo bo) { + SysSydSignContent update = MapstructUtils.convert(bo, SysSydSignContent.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSydSignContent entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除服务商协议内容 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java new file mode 100644 index 0000000..3a61edc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/sys/service/impl/SysUnitServiceImpl.java @@ -0,0 +1,165 @@ +package org.dromara.payment.sys.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.payment.sys.domain.SysUnit; +import org.dromara.payment.sys.domain.bo.SysUnitBo; +import org.dromara.payment.sys.domain.vo.SysUnitVo; +import org.dromara.payment.sys.mapper.SysUnitMapper; +import org.dromara.payment.sys.service.ISysUnitService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.ResultCodeEnum; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 单位基础信息Service业务层处理 + * + * @author LionLi + * @date 2024-03-27 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysUnitServiceImpl implements ISysUnitService { + + private final SysUnitMapper baseMapper; + + private RemoteConfigService configService; + + /** + * 查询单位基础信息 + */ + @Override + public SysUnitVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询单位基础信息列表 + */ + @Override + public TableDataInfo queryPageList(SysUnitBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询单位基础信息列表 + */ + @Override + public List queryList(SysUnitBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysUnitBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getName()), SysUnit::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), SysUnit::getNo, bo.getNo()); + lqw.eq(bo.getUnitType() != null, SysUnit::getUnitType, bo.getUnitType()); + lqw.eq(StringUtils.isNotBlank(bo.getCustNo()), SysUnit::getCustNo, bo.getCustNo()); + return lqw; + } + + /** + * 新增单位基础信息 + */ + @Override + public Boolean insertByBo(SysUnitBo bo) { + SysUnit add = MapstructUtils.convert(bo, SysUnit.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改单位基础信息 + */ + @Override + public Boolean updateByBo(SysUnitBo bo) { + SysUnit update = MapstructUtils.convert(bo, SysUnit.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysUnit entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除单位基础信息 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List getConfGroupByUnit(Long unit_id, String class_alias) { + try { + Result> result = configService.getConfGroupByUnit(unit_id,class_alias); + if(result.getRtnCode()== ResultCodeEnum.SUCCESS.Code()) { + return result.getRtnData(); + } + }catch(Exception ex) { + String msgStr = "获取单位配置大类下面的组信息异常"; + log.error(msgStr,ex); + } + return null; + } + + @Override + public List getConfDetailByUnit(Long unit_id, String conf_group) { + try { + Result> result = configService.getConfDetailByUnit(unit_id,conf_group); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + return result.getRtnData(); + } + }catch(Exception ex) { + String msgStr = "根据配置组查询单位配置项明细异常"; + log.error(msgStr,ex); + } + return null; + } + + @Override + public Boolean editConfDetail(List lendReco) { + try { + Result result = configService.editConfDetail(lendReco); + if(result.getRtnCode()==ResultCodeEnum.SUCCESS.Code()) { + if(result.getRtnData()) { + return true; + } + } + }catch(Exception ex) { + String msgStr = "编辑单位配置项明细异常"; + log.error(msgStr,ex); + } + return false; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java new file mode 100644 index 0000000..f901d4c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskController.java @@ -0,0 +1,177 @@ +package org.dromara.payment.task.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.merchant.domain.bo.BusMerchantProductBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantProductVo; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.service.IMerTaskService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 任务 + * 前端访问路由地址为:/payment/task + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/task") +public class MerTaskController extends BaseController { + + private final IMerTaskService merTaskService; + + /** + * 查询任务列表 商户角色 查看自己发起得; 运营商 查询自己得; 服务商接口 + */ +// @SaCheckPermission("payment:task:list") + @GetMapping("/list") + public TableDataInfo list(MerTaskBo bo, PageQuery pageQuery) { + return merTaskService.queryPageList(bo, pageQuery); + } + + /** + * @description 运营商审核列表, 服务商审核列表 + * @author wuchuang + * @param + * @return + * @time 2024/5/17 9:40 + */ +// @SaCheckPermission("payment:task:checkList") + @GetMapping("/checkList") + public TableDataInfo checkList(MerTaskBo bo, PageQuery pageQuery) { + return merTaskService.queryCheckList(bo, pageQuery); + } + + + /** + * 获取任务详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:task:query") + @GetMapping("/{id}") + public R queryById(@NotNull(message = "主键不能为空") + @PathVariable Long id, PageQuery pageQuery) { + return R.ok(merTaskService.queryById(id,pageQuery)); + } + + /** + * 新增任务 + */ +// @SaCheckPermission("payment:task:add") + @Log(title = "任务新建", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.insertByBo(bo)); + } + + /** + * 修改任务 发布上线接口 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "商户编辑、发布", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/edit") + public R edit(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.updateByBo(bo)); + } + + /** + * 修改基本信息 服务商 运营商 角色使用 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "任务修改信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/editInfo") + public R editInfo(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.updateInfoByBo(bo)); + } + + + /** + * 任务审核 提交 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "任务审核", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/check") + public R check(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.checkInfoByBo(bo)); + } + + + /** + * 商户驳回提交 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "被驳回后提交", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/rejectCommit") + public R rejectCommit(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.rejectCommitByBo(bo)); + } + + + @GetMapping("/queryList") + public R> queryList(MerTaskBo bo) { + return R.ok(merTaskService.queryList(bo)); + } + + /** + * 上架下架 + */ +// @SaCheckPermission("payment:task:edit") + @Log(title = "任务上架下架", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/ups") + public R ups(@Validated(EditGroup.class) @RequestBody MerTaskBo bo) { + return toAjax(merTaskService.updateStateByBo(bo)); + } + + + /** + * 导出任务列表 + */ + @SaCheckPermission("payment:task:export") + @Log(title = "任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaskBo bo, HttpServletResponse response) { + List list = merTaskService.queryList(bo); + ExcelUtil.exportExcel(list, "任务", MerTaskVo.class, response); + } + + + /** + * 删除任务 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:task:remove") + @Log(title = "任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaskService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java new file mode 100644 index 0000000..44e3a4d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/controller/MerTaskEnrollController.java @@ -0,0 +1,144 @@ +package org.dromara.payment.task.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 任务的报名 + * 前端访问路由地址为:/payment/taskEnroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/taskEnroll") +public class MerTaskEnrollController extends BaseController { + + private final IMerTaskEnrollService merTaskEnrollService; + + /** + * 查询任务的报名列表 + */ +// @SaCheckPermission("payment:taskEnroll:list") + @GetMapping("/list") + public TableDataInfo list(MerTaskEnrollBo bo, PageQuery pageQuery) { + return merTaskEnrollService.queryPageList(bo, pageQuery); + } + + /** + * @description 交付查询 成功接单的用户 + * @author wuchuang + * @param + * @return + * @time 2024/5/23 16:12 + */ + // @SaCheckPermission("payment:taskEnroll:successlist") + @GetMapping("/successlist") + public TableDataInfo successlist(MerTaskEnrollBo bo, PageQuery pageQuery) { + return merTaskEnrollService.queryPageSuccessList(bo, pageQuery); + } + + /** + * 获取完工报告 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:taskEnroll:query") + @GetMapping("/queryConfirmation") + public R queryConfirmation(@RequestParam(value = "id", required = true) Long id) { + return R.ok(merTaskEnrollService.queryById(id)); + } + + + /** + * 审核 竞标人 + */ +// @SaCheckPermission("payment:taskEnroll:check") + @Log(title = "任务审核竞标人", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/check") + public R check(@Validated(EditGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.checkEnrollByBo(bo)); + } + + /** + * 验收 + */ +// @SaCheckPermission("payment:taskEnroll:acceptance") + @Log(title = "任务验收", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/acceptance") + public R acceptance(@Validated(EditGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.acceptanceEnrollByBo(bo)); + } + + + /** + * 导出任务的报名列表 + */ + @SaCheckPermission("payment:taskEnroll:export") + @Log(title = "任务的报名", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaskEnrollBo bo, HttpServletResponse response) { + List list = merTaskEnrollService.queryList(bo); + ExcelUtil.exportExcel(list, "任务的报名", MerTaskEnrollVo.class, response); + } + + + + /** + * 新增任务的报名 + */ + @SaCheckPermission("payment:taskEnroll:add") + @Log(title = "任务的报名", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.insertByBo(bo)); + } + + /** + * 修改任务的报名 + */ + @SaCheckPermission("payment:taskEnroll:edit") + @Log(title = "任务的报名", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerTaskEnrollBo bo) { + return toAjax(merTaskEnrollService.updateByBo(bo)); + } + + /** + * 删除任务的报名 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:taskEnroll:remove") + @Log(title = "任务的报名", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaskEnrollService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java new file mode 100644 index 0000000..85499a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTask.java @@ -0,0 +1,273 @@ +package org.dromara.payment.task.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 任务对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_task") +public class MerTask extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long classify; + + /** + * 项目编码 + */ + private String no; + + /** + * 项目标题 + */ + private String name; + + /** + * 最小项目总金额(分) + */ + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + private Long costMax; + + /** + * 所属行业 + */ + private String industry; + + /** + * 所属行业 + */ + private String industryName; + + /** + * 项目内容 + */ + private String proContent; + + /** + * 用工人数(0:不限) + */ + private Long limitNum; + + /** + * 报名截至日期 + */ + private Date jiezhiDate; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + private Long costUnit; + + /** + * 任务开始日期 + */ + private Date beginDate; + + /** + * 任务结束日期 + */ + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + private Integer status; + + /** + * 上线时间 + */ + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + private Integer taskStatus; + + /** + * 提交审核时间 + */ + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过) + */ + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + private String opVerifyReason; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 冻结金额 + */ + private Long frozenAmount; + + /** + * 实发金额 + */ + private Long relAmount; + + /** + * 最新结算时间 + */ + private Date relAmountTime; + + /** + * 已开票金额 + */ + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + private Integer isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + private String sydVerifyReason; + + + private String itemTypeId; + + private String taskTypeId; + + private String itemTypeName; + + private String taskTypeName; + + private String itemId; + + private String taskId; + + private Long ossId; + + private String url; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java new file mode 100644 index 0000000..2884db0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskDetail.java @@ -0,0 +1,26 @@ +package org.dromara.payment.task.domain; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.vo.MerTaskVo; + +import java.util.List; + +/** + * @Title MerTaskDetail + * @Description + * @Author wuchuang + * @Date 2024/5/17 14:40 + */ +@Data +public class MerTaskDetail { + + private MerTaskVo merTask; + + private List logRecords; + + private Page enrolls; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java new file mode 100644 index 0000000..11dec83 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/MerTaskEnroll.java @@ -0,0 +1,128 @@ +package org.dromara.payment.task.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 任务的报名对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_task_enroll") +public class MerTaskEnroll extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public MerTaskEnroll(){} + + public MerTaskEnroll(String no, String taskNo, Long taskClassify, Long taskId, Long workId, Long verifyStatus, String verifyBy, Date verifyTime) { + this.no = no; + this.taskNo = taskNo; + this.taskClassify = taskClassify; + this.taskId = taskId; + this.workId = workId; + this.verifyStatus = verifyStatus; + this.verifyBy = verifyBy; + this.verifyTime = verifyTime; + } + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long taskClassify; + + private Long cost; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java new file mode 100644 index 0000000..4c216ac --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskBo.java @@ -0,0 +1,277 @@ +package org.dromara.payment.task.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 任务业务对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTask.class, reverseConvertGenerate = false) +public class MerTaskBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + private Long classify; + + /** + * 项目编码 + */ + private String no; + + /** + * 项目标题 + */ + private String name; + + /** + * 最小项目总金额(分) + */ + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + private Long costMax; + + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date jiezhiDate; + + /** + * 项目内容 + */ + private String proContent; + + /** + * 所属行业 + */ + private String industry; + + private String industryName; + + + /** + * 用工人数(0:不限) + */ + private Long limitNum; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + private Long costUnit; + + /** + * 任务开始日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date beginDate; + + public Date getEndDate() { + if(this.endDate != null){ + return DateUtils.addOneDay(this.endDate); + } + return endDate; + } + + /** + * 任务结束日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + private Integer status; + + /** + * 上线时间 + */ + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + private Integer taskStatus; + + private List taskStatusList; + + /** + * 提交审核时间 + */ + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + private String opVerifyReason; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 冻结金额 + */ + private Long frozenAmount; + + /** + * 实发金额 + */ + private Long relAmount; + + /** + * 最新结算时间 + */ + private Date relAmountTime; + + /** + * 已开票金额 + */ + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + private Integer isOut; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 商户名称 + */ + private String merName; + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + private String sydVerifyReason; + + private Long ossId; + + private String url; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java new file mode 100644 index 0000000..8e92844 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/bo/MerTaskEnrollBo.java @@ -0,0 +1,110 @@ +package org.dromara.payment.task.domain.bo; + +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 任务的报名业务对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaskEnroll.class, reverseConvertGenerate = false) +public class MerTaskEnrollBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + + private Long[] ids; + + + /** + * 项目子编号 + */ + private String no; + + /** + * 项目编号 + */ + private String taskNo; + + /** + * 任务id + */ + private Long taskId; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 自雇者微信openid + */ + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + private Long verifyStatus; + + /** + * 选定审核人 + */ + private String verifyBy; + + /** + * 选定审核时间 + */ + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + private Integer taskStatus; + + /** + * 验收备注 + */ + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + private String taskConfirmFile; + + /** + * 交付内容 + */ + private String taskDesc; + + /** + * 交付图片 + */ + private String taskPic; + + /** + * 报名时间 + */ + private Date addTime; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java new file mode 100644 index 0000000..ba1754a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskEnrollVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.task.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.task.domain.RemoteMerTaskEnrollVo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 任务的报名Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerTaskEnrollVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java new file mode 100644 index 0000000..718459f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/convert/MerTaskVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.payment.task.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.payment.api.task.domain.RemoteMerTaskVo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 任务Convert接口 + * + * @author LionLi + * @date 2024-04-08 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface MerTaskVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java new file mode 100644 index 0000000..401a29f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskEnrollVo.java @@ -0,0 +1,168 @@ +package org.dromara.payment.task.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.task.domain.MerTaskEnroll; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务的报名视图对象 mer_task_enroll + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaskEnroll.class) +public class MerTaskEnrollVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + private Long cost; + + + /** + * 项目子编号 + */ + @ExcelProperty(value = "项目子编号") + private String no; + + /** + * 项目编号 + */ + @ExcelProperty(value = "项目编号") + private String taskNo; + + + private String name; + + private String phone; + + private String cardId; + + private Integer isHide; + + public String getPhone() { + + if(isHide != null){ + return StringUtils.phoneHide(phone); + } + return phone; + + } + + public String getCardId() { + if(isHide != null){ + return StringUtils.idcardHide(cardId); + } + return cardId; + } + + /** + * 任务id + */ + @ExcelProperty(value = "任务id") + private Long taskId; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 自雇者微信openid + */ + @ExcelProperty(value = "自雇者微信openid") + private String workOpenid; + + /** + * 竞标状态(1:竞标中 2:竞标失败 3:竞标成功) + */ + @ExcelProperty(value = "竞标状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:竞标中,2=:竞标失败,3=:竞标成功") + private Long verifyStatus; + + /** + * 选定审核人 + */ + @ExcelProperty(value = "选定审核人") + private String verifyBy; + + /** + * 选定审核时间 + */ + @ExcelProperty(value = "选定审核时间") + private Date verifyTime; + + /** + * 完工状态(0:未完成 1:已完成 2:验收驳回 3:验收通过 ) + */ + @ExcelProperty(value = "完工状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未完成,1=:已完成,2=:验收驳回,3=:验收通过") + private Integer taskStatus; + + /** + * 验收备注 + */ + @ExcelProperty(value = "验收备注") + private String taskRemark; + + /** + * 结算状态(0:待结算 1:已结算) + */ + @ExcelProperty(value = "结算状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待结算,1=:已结算") + private Integer settlementStatus; + + /** + * 任务确认书文件地址 + */ + @ExcelProperty(value = "任务确认书文件地址") + private String taskConfirmFile; + + /** + * 交付内容 + */ + @ExcelProperty(value = "交付内容") + private String taskDesc; + + /** + * 交付图片 + */ + @ExcelProperty(value = "交付图片") + private String taskPic; + + /** + * 报名时间 + */ + @ExcelProperty(value = "报名时间") + private Date addTime; + + + private String workerName; + + @ExcelIgnore + private Integer payStatus; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java new file mode 100644 index 0000000..9c821e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/domain/vo/MerTaskVo.java @@ -0,0 +1,329 @@ +package org.dromara.payment.task.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.task.domain.MerTask; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 任务视图对象 mer_task + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTask.class) +public class MerTaskVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 项目类型:(1:派单、2:抢单) + */ + @ExcelProperty(value = "项目类型:", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:派单、2:抢单") + private Long classify; + + /** + * 项目编码 + */ + @ExcelProperty(value = "项目编码") + private String no; + + /** + * 所属行业 + */ + private String industryName; + + /** + * 项目内容 + */ + private String proContent; + + /** + * 报名截至日期 + */ + private Date jiezhiDate; + + /** + * 项目标题 + */ + @ExcelProperty(value = "项目标题") + private String name; + + @ExcelProperty(value = "服务商名称") + private String gsmc; + + + @ExcelProperty(value = "商户名称") + private String merchantName; + + /** + * 最小项目总金额(分) + */ + @ExcelProperty(value = "最小项目总金额(分)") + private Long cost; + + /** + * 最大项目总金额(分),用于派单任务 + */ + @ExcelProperty(value = "最大项目总金额(分),用于派单任务") + private Long costMax; + + /** + * 所属行业 + */ + @ExcelProperty(value = "所属行业") + private String industry; + + /** + * 用工人数(0:不限) + */ + @ExcelProperty(value = "用工人数", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:不限") + private Long limitNum; + + /** + * 任务费用/人(众包任务) 应得(分) + */ + @ExcelProperty(value = "任务费用/人(众包任务) 应得(分)") + private Long costUnit; + + /** + * 任务开始日期 + */ + @ExcelProperty(value = "任务开始日期") + private Date beginDate; + + /** + * 任务结束日期 + */ + @ExcelProperty(value = "任务结束日期") + private Date endDate; + + /** + * 上架状态(1:上架、2:下架) + */ + @ExcelProperty(value = "上架状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:上架、2:下架") + private Integer status; + + /** + * 上线时间 + */ + @ExcelProperty(value = "上线时间") + private Date publicTime; + + /** + * 是否自动下架(0:否 1:是) + */ + @ExcelProperty(value = "是否自动下架", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isOffline; + + /** + * 项目状态(0:待发布 1:发布上线 2:平台审核成功 3:平台审核拒绝 4:服务商接包 5:服务商拒绝接单 6:任务发布 7:任务开始 8:任务结束) + */ + @ExcelProperty(value = "项目状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待发布,1=:发布上线,2=:平台审核成功,3=:平台审核拒绝,4=:服务商接包,5=:服务商拒绝接单,6=:任务发布,7=:任务开始,8=:任务结束") + private Integer taskStatus; + + /** + * 提交审核时间 + */ + @ExcelProperty(value = "提交审核时间") + private Date submitTime; + + /** + * 运营商审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + @ExcelProperty(value = "运营商审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待提交,1=:待审核、2:审核未通过、3:审核通过,4:审核中") + private Integer opVerifyStatus; + + /** + * 运营商审核时间 + */ + @ExcelProperty(value = "运营商审核时间") + private Date opVerifyTime; + + /** + * 运营商审核人 + */ + @ExcelProperty(value = "运营商审核人") + private String opVerifyBy; + + /** + * 运营商驳回原因 + */ + @ExcelProperty(value = "运营商驳回原因") + private String opVerifyReason; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 冻结金额 + */ + @ExcelProperty(value = "冻结金额") + private Long frozenAmount; + + /** + * 实发金额 + */ + @ExcelProperty(value = "实发金额") + private Long relAmount; + + /** + * 最新结算时间 + */ + @ExcelProperty(value = "最新结算时间") + private Date relAmountTime; + + /** + * 已开票金额 + */ + @ExcelProperty(value = "已开票金额") + private Long invoiceAmount; + + /** + * 是否三方(0:否 1:是) + */ + @ExcelProperty(value = "是否三方", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Integer isOut; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包") + private Integer busType; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 结算中心审核状态(0:待提交 1:待审核、2:审核未通过、3:审核通过,4:审核中) + */ + @ExcelProperty(value = "结算中心审核状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待提交,1=:待审核、2:审核未通过、3:审核通过,4:审核中") + private Integer sydVerifyStatus; + + /** + * 结算中心审核时间 + */ + @ExcelProperty(value = "结算中心审核时间") + private Date sydVerifyTime; + + /** + * 结算中心审核人 + */ + @ExcelProperty(value = "结算中心审核人") + private String sydVerifyBy; + + /** + * 结算中心驳回原因 + */ + @ExcelProperty(value = "结算中心驳回原因") + private String sydVerifyReason; + + + //运营商 + private String opName; + + private Long ossId; + + private String url; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java new file mode 100644 index 0000000..376f60a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskEnrollMapper.java @@ -0,0 +1,36 @@ +package org.dromara.payment.task.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 任务的报名Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerTaskEnrollMapper extends BaseMapperPlus { + /** + * 修改代发批次结算中的结算状态 + * @param billId 代发批次id + * @param sourceSettlementStatus 源结算状态 + * @param settlementStatus 结算状态 + * @return + */ + public Integer updateSettlementStatusByBillId(@Param("billId") long billId,@Param("sourceSettlementStatus") int sourceSettlementStatus, @Param("settlementStatus") int settlementStatus); + + Page selectPageList(@Param("page") Page build, @Param("ew") Wrapper lqw); + + int updateTaskEnrollCheckStatusSuccess(MerTaskEnrollBo bo); + + void updateTaskEnrollCheckStatusFailed(MerTaskEnrollBo bo); + + int updateTaskEnrollTaskStatus(MerTaskEnrollBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java new file mode 100644 index 0000000..232a7c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/mapper/MerTaskMapper.java @@ -0,0 +1,24 @@ +package org.dromara.payment.task.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 任务Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface MerTaskMapper extends BaseMapperPlus { + + + Page selectPageList(@Param("page") Page build, @Param("ew") QueryWrapper lqw); + + MerTaskVo selectMerTaskById(@Param("id") Long id); + + int updateEndById(MerTask task); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java new file mode 100644 index 0000000..166529a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskEnrollService.java @@ -0,0 +1,55 @@ +package org.dromara.payment.task.service; + +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 任务的报名Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerTaskEnrollService { + + /** + * 查询任务的报名 + */ + MerTaskEnrollVo queryById(Long id); + + /** + * 查询任务的报名列表 + */ + TableDataInfo queryPageList(MerTaskEnrollBo bo, PageQuery pageQuery); + + /** + * 查询任务的报名列表 + */ + List queryList(MerTaskEnrollBo bo); + + /** + * 新增任务的报名 + */ + Boolean insertByBo(MerTaskEnrollBo bo); + + /** + * 修改任务的报名 + */ + Boolean updateByBo(MerTaskEnrollBo bo); + + /** + * 校验并批量删除任务的报名信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Boolean checkEnrollByBo(MerTaskEnrollBo bo); + + TableDataInfo queryPageSuccessList(MerTaskEnrollBo bo, PageQuery pageQuery); + + Boolean acceptanceEnrollByBo(MerTaskEnrollBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java new file mode 100644 index 0000000..75036de --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/IMerTaskService.java @@ -0,0 +1,66 @@ +package org.dromara.payment.task.service; + +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 任务Service接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface IMerTaskService { + + /** + * 查询任务 + */ + MerTaskDetail queryById(Long id, PageQuery pageQuery); + + /** + * 查询任务列表 + */ + TableDataInfo queryPageList(MerTaskBo bo, PageQuery pageQuery); + + /** + * @description 项目审核列表 + * @author wuchuang + * @param + * @return + * @time 2024/5/17 9:41 + */ + TableDataInfo queryCheckList(MerTaskBo bo, PageQuery pageQuery); + + + /** + * 新增任务 + */ + Boolean insertByBo(MerTaskBo bo); + + /** + * 修改任务 + */ + Boolean updateByBo(MerTaskBo bo); + + /** + * 校验并批量删除任务信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + Boolean updateStateByBo(MerTaskBo bo); + + Boolean updateInfoByBo(MerTaskBo bo); + + Boolean checkInfoByBo(MerTaskBo bo); + + Boolean rejectCommitByBo(MerTaskBo bo); + + List queryList(MerTaskBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java new file mode 100644 index 0000000..dd53b23 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskEnrollServiceImpl.java @@ -0,0 +1,298 @@ +package org.dromara.payment.task.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.vo.UserWorkerBusinessVo; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.springframework.stereotype.Service; +import org.dromara.payment.task.domain.bo.MerTaskEnrollBo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 任务的报名Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Service +public class MerTaskEnrollServiceImpl implements IMerTaskEnrollService { + + @Resource + private final MerTaskEnrollMapper baseMapper; + + @Resource + private final MerTaskMapper merTaskMapper; + + @Resource + private final BusOperLogMapper busOperLogMapper; + + @Resource + private final UserWorkerBusinessMapper userWorkerBusinessMapper; + + /** + * 查询任务的报名 + */ + @Override + public MerTaskEnrollVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询任务的报名列表 + */ + @Override + public TableDataInfo queryPageList(MerTaskEnrollBo bo, PageQuery pageQuery) { + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + /** + * 查询任务的报名列表 + */ + @Override + public TableDataInfo queryPageSuccessList(MerTaskEnrollBo bo, PageQuery pageQuery) { + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + bo.setVerifyStatus(Long.valueOf(3)); + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + @Override + @Transactional + public Boolean checkEnrollByBo(MerTaskEnrollBo bo) { + MerTaskEnroll update = MapstructUtils.convert(bo, MerTaskEnroll.class); + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + if(null == bo.getIds() || bo.getIds().length == 0){ + throw new IllegalArgumentException("子项目ID不能为空"); + } + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.SERVICE.getId() + && busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("当前用户没有审核项目权限,请联系管理员"); + } + bo.setVerifyBy(LoginHelper.getUsername()); + baseMapper.updateTaskEnrollCheckStatusFailed(bo); + MerTask task = new MerTask(); + task.setId(bo.getTaskId()); + task.setTaskStatus(7); + merTaskMapper.updateById(task); + BusOperLog log = new BusOperLog("任务开始", BusRole.getRole(LoginHelper.getBusRole()), bo.getTaskId(), 1); + busOperLogMapper.insert(log); + this.addUserWorkerBiz(bo); + return baseMapper.updateTaskEnrollCheckStatusSuccess(bo) > 0; + } + + private void addUserWorkerBiz(MerTaskEnrollBo bo){ + + MerTaskVo taskVo = this.merTaskMapper.selectMerTaskById(bo.getTaskId()); + int busType = taskVo.getBusType(); + long sydId = taskVo.getSydId(); + long merId = taskVo.getMerId(); + + Map paraMap = new HashMap(); + paraMap.put("merId",merId); + paraMap.put("sydId",sydId); + paraMap.put("busType",busType); + paraMap.put("workIds",bo.getIds()); + + List uwList = this.userWorkerBusinessMapper.selUserWorkBizByCon(paraMap); + Map map = uwList.stream() + .collect(Collectors.toMap(UserWorkerBusinessVo::getWorkId, obj -> obj)); + + List uwbList = new ArrayList<>(); + for(Long wordId: bo.getIds()){ + if(map.get(wordId) == null){ + UserWorkerBusiness uwb = new UserWorkerBusiness(); + uwb.setWorkId(wordId); + uwb.setBusType(busType); + uwb.setMerId(merId); + uwb.setSydId(sydId); + uwb.setMerNo(taskVo.getMerNo()); + uwb.setSydNo(taskVo.getSydNo()); + uwb.setOpId(taskVo.getOpId()); + uwb.setOpNo(taskVo.getOpNo()); + uwb.setChannelId(taskVo.getChannelId()); + uwb.setChannelNo(taskVo.getChannelNo()); + uwb.setSignStatus(0); + uwb.setCreateTime(new Date()); + uwb.setCreateBy(LoginHelper.getUserId()); + uwbList.add(uwb); + } + } + if(!uwbList.isEmpty()){ + this.userWorkerBusinessMapper.insertBatch(uwbList); + } + } + + /** + * 查询任务的报名列表 + */ + @Override + public Boolean acceptanceEnrollByBo(MerTaskEnrollBo bo) { + MerTaskEnroll update = MapstructUtils.convert(bo, MerTaskEnroll.class); + if(null == bo.getTaskId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + if(null == bo.getId() ){ + throw new IllegalArgumentException("子项目ID不能为空"); + } + + if(null == bo.getTaskStatus() ){ + throw new IllegalArgumentException("完工状态不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.SERVICE.getId() + && busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("当前用户没有审核项目权限,请联系管理员"); + } + + boolean result = baseMapper.updateTaskEnrollTaskStatus(bo) > 0; + + if(3 == bo.getTaskStatus()){ + //判断是否项目结束 + MerTask task = new MerTask(); + task.setId(bo.getTaskId()); + + if(merTaskMapper.updateEndById(task) > 0){ + BusOperLog log = new BusOperLog("任务结束", BusRole.getRole(LoginHelper.getBusRole()), bo.getTaskId(), 1); + busOperLogMapper.insert(log); + } + } + return result; + } + + + /** + * 查询任务的报名列表 + */ + @Override + public List queryList(MerTaskEnrollBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper2(MerTaskEnrollBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = Wrappers.query(); + + lqw.eq(bo.getId() != null, "mer_task_enroll.id", bo.getId()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "mer_task_enroll.no", bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), "mer_task_enroll.task_no", bo.getTaskNo()); + lqw.eq(bo.getTaskId() != null, "mer_task_enroll.task_id", bo.getTaskId()); + lqw.eq(bo.getWorkId() != null, "mer_task_enroll.work_id", bo.getWorkId()); + lqw.eq(bo.getVerifyStatus() != null, "mer_task_enroll.verify_status", bo.getVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), "mer_task_enroll.verify_by", bo.getVerifyBy()); + lqw.eq(bo.getTaskStatus() != null, "mer_task_enroll.task_status", bo.getTaskStatus()); + lqw.eq(bo.getSettlementStatus() != null, "mer_task_enroll.settlement_status", bo.getSettlementStatus()); + lqw.eq(bo.getAddTime() != null, "mer_task_enroll.add_time", bo.getAddTime()); + return lqw; + } + + private LambdaQueryWrapper buildQueryWrapper(MerTaskEnrollBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), MerTaskEnroll::getNo, bo.getNo()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskNo()), MerTaskEnroll::getTaskNo, bo.getTaskNo()); + lqw.eq(bo.getTaskId() != null, MerTaskEnroll::getTaskId, bo.getTaskId()); + lqw.eq(bo.getWorkId() != null, MerTaskEnroll::getWorkId, bo.getWorkId()); + lqw.eq(StringUtils.isNotBlank(bo.getWorkOpenid()), MerTaskEnroll::getWorkOpenid, bo.getWorkOpenid()); + lqw.eq(bo.getVerifyStatus() != null, MerTaskEnroll::getVerifyStatus, bo.getVerifyStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getVerifyBy()), MerTaskEnroll::getVerifyBy, bo.getVerifyBy()); + lqw.eq(bo.getVerifyTime() != null, MerTaskEnroll::getVerifyTime, bo.getVerifyTime()); + lqw.eq(bo.getTaskStatus() != null, MerTaskEnroll::getTaskStatus, bo.getTaskStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskRemark()), MerTaskEnroll::getTaskRemark, bo.getTaskRemark()); + lqw.eq(bo.getSettlementStatus() != null, MerTaskEnroll::getSettlementStatus, bo.getSettlementStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskConfirmFile()), MerTaskEnroll::getTaskConfirmFile, bo.getTaskConfirmFile()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskDesc()), MerTaskEnroll::getTaskDesc, bo.getTaskDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskPic()), MerTaskEnroll::getTaskPic, bo.getTaskPic()); + lqw.eq(bo.getAddTime() != null, MerTaskEnroll::getAddTime, bo.getAddTime()); + return lqw; + } + + /** + * 新增任务的报名 + */ + @Override + public Boolean insertByBo(MerTaskEnrollBo bo) { + MerTaskEnroll add = MapstructUtils.convert(bo, MerTaskEnroll.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改任务的报名 + */ + @Override + public Boolean updateByBo(MerTaskEnrollBo bo) { + MerTaskEnroll update = MapstructUtils.convert(bo, MerTaskEnroll.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + + + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTaskEnroll entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除任务的报名 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java new file mode 100644 index 0000000..5c3374a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/task/service/impl/MerTaskServiceImpl.java @@ -0,0 +1,696 @@ +package org.dromara.payment.task.service.impl; + +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.common.domain.BusOperLog; +import org.dromara.payment.common.domain.vo.BusOperLogVo; +import org.dromara.payment.common.mapper.BusOperLogMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantConfig; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; +import org.dromara.payment.merchant.mapper.BusMerchantConfigMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.task.domain.MerTaskDetail; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.BeanUtils; +import org.springframework.cloud.commons.util.IdUtils; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; +import org.dromara.payment.task.domain.bo.MerTaskBo; +import org.dromara.payment.task.domain.vo.MerTaskVo; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.task.service.IMerTaskService; + +import javax.annotation.Resource; +import java.security.SecureRandom; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 项目Service业务层处理 + * + * @author LionLi + * @date 2024-04-08 + */ +@RequiredArgsConstructor +@Service +public class MerTaskServiceImpl extends BaseService implements IMerTaskService { + + @Resource + private final MerTaskMapper baseMapper; + + @Resource + private final MerTaskEnrollMapper merTaskEnrollMapper; + + @Resource + private final BusOperLogMapper busOperLogMapper; + + @Resource + private final SysSydMapper sysSydMapper; + + + @Resource + private final BusMerchantMapper busMerchantMapper; + + + @Resource + private final BusMerchantConfigMapper merchantConfigMapperConfig; + + @Resource + private final IXyjService xyjService; + + /** + * 查询项目 + */ + @Override + public MerTaskDetail queryById(Long id, PageQuery pageQuery){ + MerTaskDetail detail = new MerTaskDetail(); + detail.setMerTask(baseMapper.selectMerTaskById(id)); + + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(BusOperLog::getBusId, id); + lqw.eq(BusOperLog::getBusType, 1); + lqw.orderBy(true, true, BusOperLog::getCreateTime); + detail.setLogRecords(busOperLogMapper.selectVoList( lqw)); + + detail.setEnrolls(merTaskEnrollMapper.selectPageList(pageQuery.build(),Wrappers.query(MerTaskEnroll.class).eq("mer_task_enroll.task_id", id))); + return detail; + } + + /** + * 查询项目列表 + */ + @Override + public TableDataInfo queryPageList(MerTaskBo bo, PageQuery pageQuery) { + //数据权限控制 + valQueryContion(bo); + //判断角色 + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 判断角色查询条件 拒绝全部数据输出 + */ + private void valQueryContion(MerTaskBo bo) { + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + bo.setMerId(LoginHelper.getBusId()); + if(null == bo.getSydId() ){ + throw new IllegalArgumentException("请选择服务商"); + } + }else if(busRole == BusRole.OPERATOR.getId() ){ + bo.setOpId(LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId() ){ + bo.setChannelNo(LoginHelper.getNo()); +// bo.setChannelId(LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId() ){ + bo.setSydId(LoginHelper.getBusId()); + }else if(busRole == BusRole.PLATFORM.getId() ){ + + + } + } + + /** + * 查询审核数据 + */ + @Override + public TableDataInfo queryCheckList(MerTaskBo bo, PageQuery pageQuery) { + //判断角色 + Integer busRole = LoginHelper.getBusRole(); + + //数据权限控制 + String phone = ""; + if(busRole == BusRole.OPERATOR.getId() ){ + bo.setOpId(LoginHelper.getBusId()); + bo.setTaskStatus(1); + }else if(busRole == BusRole.SERVICE.getId() ){ + bo.setSydId(LoginHelper.getBusId()); + }else if(busRole == BusRole.PLATFORM.getId() ){ + //查询所有数据 + }else if(busRole == BusRole.MERCHANT.getId()){ + bo.setMerId(LoginHelper.getBusId()); + }else{ + throw new IllegalArgumentException("当前账号没有权限,请联系管理员"); + } + + + QueryWrapper lqw = buildQueryWrapper2(bo); + + Page result = baseMapper.selectPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询项目列表 + */ + @Override + public List queryList(MerTaskBo bo) { + //判断角色 + valQueryContion(bo); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper2(MerTaskBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = Wrappers.query(); + + lqw.eq(bo.getId() != null, "mer_task.id", bo.getId()); + lqw.eq(bo.getClassify() != null, "mer_task.classify", bo.getClassify()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "mer_task.no", bo.getNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "mer_task.name", bo.getName()); + lqw.eq(bo.getCost() != null, "mer_task.cost", bo.getCost()); + lqw.eq(bo.getCostMax() != null, "mer_task.cost_max", bo.getCostMax()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), "mer_task.industry", bo.getIndustry()); + lqw.eq(bo.getLimitNum() != null, "mer_task.limit_num", bo.getLimitNum()); + lqw.eq(bo.getStatus() != null, "mer_task.Status", bo.getStatus()); + lqw.eq(bo.getPublicTime() != null, "mer_task.public_time", bo.getPublicTime()); + lqw.eq(bo.getTaskStatus() != null, "mer_task.task_status", bo.getTaskStatus()); + lqw.eq(bo.getSubmitTime() != null, "mer_task.submit_time", bo.getSubmitTime()); + lqw.eq(bo.getOpVerifyStatus() != null, "mer_task.op_verify_status", bo.getOpVerifyStatus()); + lqw.eq(bo.getOpVerifyTime() != null, "mer_task.op_verify_time", bo.getOpVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getOpVerifyBy()), "mer_task.op_verify_by", bo.getOpVerifyBy()); + lqw.eq(bo.getEditTime() != null, "mer_task.edit_time", bo.getEditTime()); + lqw.eq(bo.getFrozenAmount() != null, "mer_task.frozen_amount", bo.getFrozenAmount()); + lqw.eq(bo.getRelAmount() != null, "mer_task.rel_amount", bo.getRelAmount()); + lqw.eq(bo.getRelAmountTime() != null, "mer_task.rel_amount_time", bo.getRelAmountTime()); + lqw.eq(bo.getInvoiceAmount() != null, "mer_task.invoice_amount", bo.getInvoiceAmount()); + lqw.eq(bo.getIsOut() != null, "mer_task.is_out", bo.getIsOut()); + lqw.eq(bo.getSydId() != null, "mer_task.syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "mer_task.syd_no", bo.getSydNo()); + lqw.eq(bo.getBusType() != null, "mer_task.bus_type", bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "mer_task.op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "mer_task.op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "mer_task.channel_id", bo.getChannelId()); + lqw.likeRight(StringUtils.isNotBlank(bo.getChannelNo()), "mer_task.channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "mer_task.channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_task.mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_task.mer_no", bo.getMerNo()); + lqw.eq(bo.getSydVerifyStatus() != null, "mer_task.syd_verify_status", bo.getSydVerifyStatus()); + lqw.eq(bo.getSydVerifyTime() != null, "mer_task.syd_verify_time", bo.getSydVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyBy()), "mer_task.syd_verify_by", bo.getSydVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyReason()), "mer_task.syd_verify_reason", bo.getSydVerifyReason()); + lqw.like(StringUtils.isNotEmpty(bo.getMerName()),"bus_merchant.name",bo.getMerName()); + lqw.between(bo.getBeginDate() != null, "mer_task.add_time", bo.getBeginDate(), bo.getEndDate()); + lqw.in(bo.getTaskStatusList() != null && bo.getTaskStatusList().size() > 0, "mer_task.task_status" ,bo.getTaskStatusList()); + return lqw; + } + + private LambdaQueryWrapper buildQueryWrapper(MerTaskBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getClassify() != null, MerTask::getClassify, bo.getClassify()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), MerTask::getNo, bo.getNo()); + lqw.like(StringUtils.isNotBlank(bo.getName()), MerTask::getName, bo.getName()); + lqw.eq(bo.getCost() != null, MerTask::getCost, bo.getCost()); + lqw.eq(bo.getCostMax() != null, MerTask::getCostMax, bo.getCostMax()); + lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), MerTask::getIndustry, bo.getIndustry()); + lqw.eq(bo.getLimitNum() != null, MerTask::getLimitNum, bo.getLimitNum()); + lqw.eq(bo.getCostUnit() != null, MerTask::getCostUnit, bo.getCostUnit()); + lqw.eq(bo.getBeginDate() != null, MerTask::getBeginDate, bo.getBeginDate()); + lqw.eq(bo.getEndDate() != null, MerTask::getEndDate, bo.getEndDate()); + lqw.eq(bo.getStatus() != null, MerTask::getStatus, bo.getStatus()); + lqw.eq(bo.getPublicTime() != null, MerTask::getPublicTime, bo.getPublicTime()); + lqw.eq(bo.getIsOffline() != null, MerTask::getIsOffline, bo.getIsOffline()); + lqw.eq(bo.getTaskStatus() != null, MerTask::getTaskStatus, bo.getTaskStatus()); + lqw.eq(bo.getSubmitTime() != null, MerTask::getSubmitTime, bo.getSubmitTime()); + lqw.eq(bo.getOpVerifyStatus() != null, MerTask::getOpVerifyStatus, bo.getOpVerifyStatus()); + lqw.eq(bo.getOpVerifyTime() != null, MerTask::getOpVerifyTime, bo.getOpVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getOpVerifyBy()), MerTask::getOpVerifyBy, bo.getOpVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getOpVerifyReason()), MerTask::getOpVerifyReason, bo.getOpVerifyReason()); + lqw.eq(bo.getAddTime() != null, MerTask::getAddTime, bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), MerTask::getAddBy, bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), MerTask::getEditer, bo.getEditer()); + lqw.eq(bo.getEditTime() != null, MerTask::getEditTime, bo.getEditTime()); + lqw.eq(bo.getFrozenAmount() != null, MerTask::getFrozenAmount, bo.getFrozenAmount()); + lqw.eq(bo.getRelAmount() != null, MerTask::getRelAmount, bo.getRelAmount()); + lqw.eq(bo.getRelAmountTime() != null, MerTask::getRelAmountTime, bo.getRelAmountTime()); + lqw.eq(bo.getInvoiceAmount() != null, MerTask::getInvoiceAmount, bo.getInvoiceAmount()); + lqw.eq(bo.getIsOut() != null, MerTask::getIsOut, bo.getIsOut()); + lqw.eq(bo.getSydId() != null, MerTask::getSydId, bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), MerTask::getSydNo, bo.getSydNo()); + lqw.eq(bo.getBusType() != null, MerTask::getBusType, bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), MerTask::getOpNo, bo.getOpNo()); + lqw.eq(bo.getOpId() != null, MerTask::getOpId, bo.getOpId()); + lqw.eq(bo.getChannelId() != null, MerTask::getChannelId, bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), MerTask::getChannelNo, bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), MerTask::getChannelCode, bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, MerTask::getMerId, bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), MerTask::getMerNo, bo.getMerNo()); + lqw.eq(bo.getSydVerifyStatus() != null, MerTask::getSydVerifyStatus, bo.getSydVerifyStatus()); + lqw.eq(bo.getSydVerifyTime() != null, MerTask::getSydVerifyTime, bo.getSydVerifyTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyBy()), MerTask::getSydVerifyBy, bo.getSydVerifyBy()); + lqw.eq(StringUtils.isNotBlank(bo.getSydVerifyReason()), MerTask::getSydVerifyReason, bo.getSydVerifyReason()); + lqw.in(bo.getTaskStatusList() != null && bo.getTaskStatusList().size() > 0, MerTask::getTaskStatus,bo.getTaskStatusList()); + return lqw; + } + + /** + * 新增项目 + */ + @Override + public Boolean insertByBo(MerTaskBo bo) { + MerTask add = MapstructUtils.convert(bo, MerTask.class); + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId() ){ + bo.setMerId(LoginHelper.getBusId()); + if(null == bo.getSydId() ){ + throw new IllegalArgumentException("请选择服务商"); + } + + SysSydVo sydVo = this.sysSydMapper.selectVoById(bo.getSydId()); + if(sydVo == null){ + this.invalidationParamsException("无效服务商!"); + } + if(!(sydVo.getStatus() != null && sydVo.getStatus().intValue() == 1)){ + this.invalidationParamsException("服务商停止接单"); + } + + }else{ + throw new IllegalArgumentException("只有企业角色才能发布项目"); + } + validEntityBeforeSave(add); + add.setNo("S" + getNo()); //mer + add.setAddBy(LoginHelper.getUsername()); + add.setAddTime(new Date()); + add.setCreateTime(add.getAddTime()); + + BusMerchantBo mer = new BusMerchantBo(); + mer.setNo(LoginHelper.getNo()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(mer); + + add.setOpId(busOperAndAgentAndMer.getOpId()); + add.setOpNo(busOperAndAgentAndMer.getOpNo()); + add.setSydId(bo.getSydId()); + add.setSydNo(bo.getSydNo()); + add.setChannelId(busOperAndAgentAndMer.getChannelId()); + add.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + add.setChannelCode(busOperAndAgentAndMer.getChannelCode()); + add.setMerNo(LoginHelper.getNo()); + add.setStatus(1); //保存的话 是不会上架 + + if(0 == add.getTaskStatus()){ + add.setOpVerifyStatus(0); + add.setSydVerifyStatus(0); + } + + + BusOperLog merLog = new BusOperLog(); + BusOperLog opLog = new BusOperLog(); + BusOperLog sydLog = new BusOperLog(); + //自动审核 + BusMerchantConfig merchantConfig = merchantConfigMapperConfig.selectByMerId(bo.getMerId()); + + // 项目状态 0 待发布 1 保存并发布 + if(1 == add.getTaskStatus()){ + add.setPublicTime(new Date()); + + add.setTaskStatus(1); + add.setOpVerifyStatus(1);//发布完 可以 运营商审核 + //判断是否自动审核 + merLog = new BusOperLog("发布上线", BusRole.MERCHANT, add.getId(), 1); + + if(1 == merchantConfig.getAutoApprove()){ + add.setSubmitTime(new Date()); + + //插入 运营商日志 服务商日志 + opLog = new BusOperLog("运营商审核成功", BusRole.OPERATOR, add.getId(), 1); + add.setTaskStatus(2); + add.setOpVerifyStatus(3); + add.setOpVerifyTime(new Date()); + add.setOpVerifyBy(busOperAndAgentAndMer.getOpId() + ""); + add.setOpVerifyReason("自动审核通过"); + + add.setStatus(1); + //抢单需要 人员抢单 + if(add.getClassify().intValue() == 2){ + sydLog = new BusOperLog("项目发布", BusRole.SERVICE, add.getId(), 1); + add.setTaskStatus(6); + add.setSydVerifyStatus(3); + add.setSydVerifyReason("自动审核通过"); + } + + //派单 服务商审核完 直接开始 + if(add.getClassify().intValue() == 1){ + sydLog = new BusOperLog("项目开始", BusRole.SERVICE, add.getId(), 1); + add.setTaskStatus(7); + add.setSydVerifyStatus(3); + add.setBeginDate(new Date()); + add.setSydVerifyReason("自动审核通过"); + } + } + } + boolean flag = false; + if(false){ + BusMerchant merchant = new BusMerchant(); + BeanUtils.copyProperties(merchant, bo); + flag = xyjService.createProjectTask(add, merchant); + }else { + flag = this.insertTask(add) > 0; + } + if (flag) { + if(1 == add.getTaskStatus()){ + merLog.setBusId(add.getId()); + busOperLogMapper.insert(merLog); + if(1 == merchantConfig.getAutoApprove()){ + opLog.setBusId(add.getId()); + busOperLogMapper.insert(opLog); + sydLog.setBusId(add.getId()); + busOperLogMapper.insert(sydLog); + } + } + } + + return flag; + } + + private int insertTask(MerTask addTask){ + try{ + return baseMapper.insert(addTask); + }catch(Exception e){ + if( e instanceof DuplicateKeyException){ + addTask.setNo("S" + getNo()); + return this.baseMapper.insert(addTask); + } + throw e; + } + } + + /** + * 发布上线 + */ + @Override + public Boolean updateByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); + validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("只有企业角色才能发布项目"); + } + + BusMerchantBo mer = new BusMerchantBo(); + mer.setNo(LoginHelper.getNo()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(mer); + + BusOperLog merLog = new BusOperLog(); + BusOperLog opLog = new BusOperLog(); + BusOperLog sydLog = new BusOperLog(); + + if(1 == entity.getTaskStatus()){ + entity.setOpVerifyStatus(0); + entity.setSydVerifyStatus(0); + } + + // 项目状态 0 待发布 1 保存并发布 + if(1 == entity.getTaskStatus()){ + entity.setPublicTime(new Date()); + + entity.setTaskStatus(1); + //判断是否自动审核 + merLog = new BusOperLog("发布上线", BusRole.MERCHANT, entity.getId(), 1); + busOperLogMapper.insert(merLog); + + //自动审核 + BusMerchantConfig merchantConfig = merchantConfigMapperConfig.selectByMerId(bo.getMerId()); + if(1 == merchantConfig.getAutoApprove()){ + entity.setSubmitTime(new Date()); + + //插入 运营商日志 服务商日志 + opLog = new BusOperLog("运营商审核成功", BusRole.OPERATOR, entity.getId(), 1); + busOperLogMapper.insert(opLog); + + entity.setTaskStatus(2); + entity.setOpVerifyStatus(3); + entity.setOpVerifyTime(new Date()); + entity.setOpVerifyBy(busOperAndAgentAndMer.getOpId() + ""); + entity.setOpVerifyReason("自动审核通过"); + + entity.setStatus(1); + //抢单需要 人员抢单 + if(entity.getClassify().intValue() == 2){ + sydLog = new BusOperLog("项目发布", BusRole.SERVICE, entity.getId(), 1); + entity.setTaskStatus(6); + entity.setSydVerifyReason("自动审核通过"); + } + + //派单 服务商审核完 直接开始 + if(entity.getClassify().intValue() == 1){ + sydLog = new BusOperLog("项目开始", BusRole.SERVICE, entity.getId(), 1); + entity.setTaskStatus(7); + entity.setBeginDate(new Date()); + entity.setSydVerifyReason("自动审核通过"); + } + busOperLogMapper.insert(sydLog); + } + } + return baseMapper.updateById(entity) > 0; + } + + @Override + public Boolean updateInfoByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); + validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + return baseMapper.updateById(entity) > 0; + } + + + @Override + public Boolean checkInfoByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); +// validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.SERVICE.getId() + && busRole != BusRole.OPERATOR.getId() ){ + throw new IllegalArgumentException("当前用户没有审核项目权限,请联系管理员"); + } + + if(busRole == BusRole.OPERATOR.getId()) { + entity.setOpVerifyTime(new Date()); + entity.setOpVerifyBy(LoginHelper.getUsername() + ""); + + BusOperLog opLog = new BusOperLog("", BusRole.OPERATOR, entity.getId(), 1); + //通过 + if(3 == entity.getOpVerifyStatus()){ + entity.setTaskStatus(2); + opLog.setLogDesc("运营商审核通过"); + entity.setSydVerifyStatus(1);// 运营商神完成 待服务商审核 + }else{ + //驳回 + entity.setTaskStatus(3); + opLog.setLogDesc("运营商审核拒绝"); + } + busOperLogMapper.insert(opLog); + } + + if(busRole == BusRole.SERVICE.getId()) { + BusOperLog sydLog = new BusOperLog("", BusRole.SERVICE, entity.getId(), 1); + entity.setOpVerifyTime(new Date()); + entity.setOpVerifyBy(LoginHelper.getUsername() + ""); + //通过 + if(3 == entity.getSydVerifyStatus()){ + entity.setTaskStatus(4); + + if(2 == entity.getClassify()){ + sydLog.setLogDesc("项目发布"); + entity.setTaskStatus(6); + } + //派单 服务商审核完 直接开始 + if(entity.getClassify().intValue() == 1){ + sydLog.setLogDesc("项目开始"); + entity.setTaskStatus(7); + } + }else{ + //驳回 + entity.setTaskStatus(5); + sydLog.setLogDesc("服务商拒绝转包"); + } + busOperLogMapper.insert(sydLog); + } + + return baseMapper.updateById(entity) > 0; + } + + + + @Override + public Boolean rejectCommitByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); +// validEntityBeforeSave(entity); + + if(null == entity.getId()){ + throw new IllegalArgumentException("项目ID不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.MERCHANT.getId()){ + throw new IllegalArgumentException("当前用户没有该操作权限,请联系管理员"); + } + + if(2 == entity.getOpVerifyStatus()) { + BusOperLog opLog = new BusOperLog("", BusRole.MERCHANT, entity.getId(), 1); + entity.setOpVerifyStatus(1); + opLog.setLogDesc("提交运营商审核"); + busOperLogMapper.insert(opLog); + } + if(2 == entity.getSydVerifyStatus()) { + BusOperLog opLog = new BusOperLog("", BusRole.MERCHANT, entity.getId(), 1); + entity.setSydVerifyStatus(1); + opLog.setLogDesc("提交服务商审核"); + busOperLogMapper.insert(opLog); + } + return baseMapper.updateById(entity) > 0; + } + + public Boolean updateStateByBo(MerTaskBo bo) { + MerTask entity = MapstructUtils.convert(bo, MerTask.class); + if (null == entity.getId()) { + throw new IllegalArgumentException("项目ID不能为空"); + } + if (null == entity.getMerId()) { + throw new IllegalArgumentException("企业ID不能为空"); + } + if (null == entity.getStatus()) { + throw new IllegalArgumentException("上架状态不能为空"); + } + Integer busRole = LoginHelper.getBusRole(); + if(busRole != BusRole.MERCHANT.getId() ){ + throw new IllegalArgumentException("只有企业角色才能上架下架项目"); + } + + if(!entity.getMerId().equals(LoginHelper.getBusId() )){ + throw new IllegalArgumentException("只能操作自己企业的数据"); + } + + BusOperLog merLog = new BusOperLog("", BusRole.MERCHANT, entity.getId(), 1); + if(1 == bo.getStatus()){ + merLog.setLogDesc("项目下架"); + }else if(2 == bo.getStatus()){ + merLog.setLogDesc("项目上架"); + } + busOperLogMapper.insert(merLog); + + return baseMapper.updateById(entity) > 0; + } + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTask entity){ + if(null == entity.getBusType()){ + throw new IllegalArgumentException("请选择业务类型"); + } + if(StringUtils.isEmpty(entity.getName())){ + throw new IllegalArgumentException("请填写项目名称"); + } + if(StringUtils.isEmpty(entity.getIndustry())){ + throw new IllegalArgumentException("请选择所属行业"); + } + if(StringUtils.isEmpty(entity.getIndustryName())){ + throw new IllegalArgumentException("请选择所属行业"); + } + if(null == entity.getClassify()){ + throw new IllegalArgumentException("请选择项目类型"); + } + + if(null == entity.getSydId()){ + throw new IllegalArgumentException("请选择服务商"); + } + + if(StringUtils.isEmpty(entity.getSydNo())){ + throw new IllegalArgumentException("请选择服务商"); + } + + //派单类型 1:派单、2:抢单 + if(entity.getClassify().intValue() == 1){ + if(null == entity.getCost()){ + throw new IllegalArgumentException("请填写最小项目总金额(分)"); + } + if(null == entity.getCostMax()){ + throw new IllegalArgumentException("请填写最大项目总金额(分)"); + } + + } + if(entity.getClassify().intValue() == 2){ + if(null == entity.getCost()){ + throw new IllegalArgumentException("请填写项目总金额(分)"); + } + + if(null == entity.getLimitNum()){ + throw new IllegalArgumentException("请填写用工人数"); + } + if(null == entity.getJiezhiDate()){ + throw new IllegalArgumentException("请选择报名截至日期"); + } + } + + + if(null == entity.getProContent()){ + throw new IllegalArgumentException("请填写项目内容"); + } + + } + + /** + * 批量删除项目 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + private String getNo(){ + // 创建SecureRandom对象,更安全的随机数生成器 + SecureRandom secureRandom = new SecureRandom(); + + // 生成16位的随机数字,范围是0到9999999999999999L 130652799162 + long randomNumber = secureRandom.nextLong(1000000000000L); + + // 打印随机数,确保是16位,不足前面补0 + String formattedNumber = String.format("%012d", randomNumber); + System.out.println("随机12位数字: " + formattedNumber); + return formattedNumber; + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java new file mode 100644 index 0000000..faaa437 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsController.java @@ -0,0 +1,195 @@ +package org.dromara.payment.taxRecords.controller; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsBo; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 完税证明 + * 前端访问路由地址为:/taxRecords/taxRecords + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/taxRecords") +public class MerTaxRecordsController extends BaseController { + + private final IMerTaxRecordsService merTaxRecordsService; + + /** + * 查询完税证明列表 + */ +// @SaCheckPermission("taxRecords:taxRecords:list") + @GetMapping("/list") + public TableDataInfo list(CommonSelConditionEntity bo, PageQuery pageQuery) { + return merTaxRecordsService.queryPageList(bo, pageQuery); + } + + /** + * 导出完税证明列表 + */ + @SaCheckPermission("taxRecords:taxRecords:export") + @Log(title = "完税证明", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaxRecordsBo bo, HttpServletResponse response) { + List list = merTaxRecordsService.queryList(bo); + ExcelUtil.exportExcel(list, "完税证明", MerTaxRecordsVo.class, response); + } + + /** + * 获取完税证明详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("taxRecords:taxRecords:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merTaxRecordsService.queryById(id)); + } + + /** + * 新增完税证明 + */ +// @SaCheckPermission("taxRecords:taxRecords:add") + @Log(title = "完税证明", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerTaxRecordsBo bo) { + return toAjax(merTaxRecordsService.insertByBo(bo)); + } + + /** + * 修改完税证明 + */ +// @SaCheckPermission("taxRecords:taxRecords:edit") + @Log(title = "上传完税证明", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerTaxRecordsBo bo) { + return toAjax(merTaxRecordsService.updateByBo(bo)); + } + + /** + * 删除完税证明 + * + * @param ids 主键串 + */ + @SaCheckPermission("taxRecords:taxRecords:remove") + @Log(title = "完税证明", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaxRecordsService.deleteWithValidByIds(List.of(ids), true)); + } + + + /*** + * 下载身份证 + * @param trId + * @return + * @throws Exception + */ +// @SaCheckPermission("taxRecords:taxRecords:downLoadSfz") + @Log(title = "下载身份证", businessType = BusinessType.OTHER) + @GetMapping("/downLoadSfz") + public R downLoadSfz(Long trId)throws Exception{ + return R.ok(merTaxRecordsService.downLoadUserworkSfz(trId)); + } + + + /*** + * 下载合同 + * @param trId + * @return + * @throws Exception + */ +// @SaCheckPermission("taxRecords:taxRecords:downLoadHt") + @Log(title = "下载合同", businessType = BusinessType.OTHER) + @GetMapping("/downLoadHt") + public R downLoadHt(Long trId)throws Exception{ + return R.ok(merTaxRecordsService.downLoadUserworkHt(trId)); + } + + + /*** + * 下载支付凭证 + * @param trId + * @return + * @throws Exception + */ +// @SaCheckPermission("taxRecords:taxRecords:downLoadPayCer") + @Log(title = "下载支付凭证", businessType = BusinessType.OTHER) + @GetMapping("/downLoadPayCer") + public R downLoadPay(Long trId)throws Exception{ + return R.ok(merTaxRecordsService.downLoadUserworkPayCer(trId)); + } + + + @Log(title = "根据账单编号获取账单详情", businessType = BusinessType.OTHER) + @GetMapping("/getMerBillInfo") + public R getMerBillInfo(String billNo){ + return R.ok(this.merTaxRecordsService.getMerBillInfo(billNo)); + } + + + + +// @SaCheckPermission("taxRecords:taxRecords:list") + @Log(title = "根据账单编号获取账单明细", businessType = BusinessType.OTHER) +// @GetMapping("/getMbDetailList") + public TableDataInfo getMerBillDetailList(String billNo, PageQuery pageQuery) { + return merTaxRecordsService.getMerBillDetailList(billNo, pageQuery); + } + + + + + @Log(title = "根据开票流水号获取开票详情", businessType = BusinessType.OTHER) + @GetMapping("/getInvInfo") + public R getInvInfo(String invNo){ + return R.ok(this.merTaxRecordsService.getInvInfo(invNo)); + } + + + +// / @SaCheckPermission("taxRecords:taxRecords:list") + @Log(title = "根据开票流水号分页获取发票明细", businessType = BusinessType.OTHER) + @GetMapping("/getMbDetailList") + public TableDataInfo getInvDetailList(String invNo, PageQuery pageQuery) { + return merTaxRecordsService.getInvDetailList(invNo, pageQuery); + } + + + + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java new file mode 100644 index 0000000..8d81009 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/MerTaxRecordsDetailController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.taxRecords.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsDetailService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 完税证明 + * 前端访问路由地址为:/taxRecords/taxRecordsDetail + * + * @author LionLi + * @date 2024-05-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/taxRecordsDetail") +public class MerTaxRecordsDetailController extends BaseController { + + private final IMerTaxRecordsDetailService merTaxRecordsDetailService; + + /** + * 查询完税证明列表 + */ +// @SaCheckPermission("taxRecords:taxRecordsDetail:list") + @GetMapping("/list") + public TableDataInfo list(MerTaxRecordsDetailBo bo, PageQuery pageQuery) { + return merTaxRecordsDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出完税证明列表 + */ +// @SaCheckPermission("taxRecords:taxRecordsDetail:export") + @Log(title = "完税证明", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MerTaxRecordsDetailBo bo, HttpServletResponse response) { + List list = merTaxRecordsDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "报税汇总金额", MerTaxRecordsDetailVo.class, response); + } + + /** + * 获取完税证明详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(merTaxRecordsDetailService.queryById(id)); + } + + /** + * 新增完税证明 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:add") + @Log(title = "完税证明", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody MerTaxRecordsDetailBo bo) { + return toAjax(merTaxRecordsDetailService.insertByBo(bo)); + } + + /** + * 修改完税证明 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:edit") + @Log(title = "完税证明", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody MerTaxRecordsDetailBo bo) { + return toAjax(merTaxRecordsDetailService.updateByBo(bo)); + } + + /** + * 删除完税证明 + * + * @param ids 主键串 + */ + @SaCheckPermission("taxRecords:taxRecordsDetail:remove") + @Log(title = "完税证明", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(merTaxRecordsDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java new file mode 100644 index 0000000..1863082 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/controller/SwMonitorController.java @@ -0,0 +1,85 @@ +package org.dromara.payment.taxRecords.controller; + +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.payment.taxRecords.domain.bo.SwMonitorBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; +import org.dromara.payment.taxRecords.service.ISwMonitorService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorController + * @description 税务监控 + * @create 2024-06-24 10:22 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/swMonitor") +public class SwMonitorController extends BaseController { + + + + @Resource + public ISwMonitorService swMonitorService; + + + /** + * 查询完税务监控 + */ +// @SaCheckPermission("swMonitor:swMonitor:list") + @GetMapping("/list") + @Log(title = "查询税务监控", businessType = BusinessType.SELECT) + public TableDataInfo list(SwMonitorBo bo, PageQuery pageQuery) { + return this.swMonitorService.queryPageList(bo, pageQuery); + } + + + + + @Log(title = "查询税务附件", businessType = BusinessType.SELECT) + @GetMapping("/getUrl") + public R getFileUrl(Long tailId,String tailNo,String subNo, Integer type,Long workId,Integer busType,Long sydId,Long merId)throws Exception { + return R.ok( null,this.swMonitorService.getFileUrl(tailId,tailNo,subNo,type,workId,busType,sydId,merId)); + } + + + /** + * 导出发票 + */ +// @SaCheckPermission("taxRecords:taxRecordsDetail:export") + @Log(title = "下载发票", businessType = BusinessType.EXPORT) + @PostMapping("/exportInv") + public void export(String bo, HttpServletResponse response)throws Exception { + this.swMonitorService.exportInv(bo,response); + } + + @Log(title = "根据项目自编码查询完工信息", businessType = BusinessType.SELECT) + @GetMapping("/getTaskEnroll") + public R selTaskEnroll(String proSubNo)throws Exception{ + return R.ok(this.swMonitorService.getTaskEnrollVo(proSubNo)); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java new file mode 100644 index 0000000..da03358 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecords.java @@ -0,0 +1,117 @@ +package org.dromara.payment.taxRecords.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 完税证明对象 mer_tax_records + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_tax_records") +public class MerTaxRecords extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 所属月份 + */ + private String month; + + /** + * 开票流水号(多个逗号分隔) + */ + private String invoiceNos; + + /** + * 账单批次流水号(多个逗号分隔) + */ + private String billNos; + + /** + * 账单批次id(多个逗号分隔) + */ + private String billIds; + + /** + * 完税证明上传状态(0:未上传 1:已上传) + */ + private Integer taxStatus; + + /** + * 完税证明zip文件路径 + */ + private String taxFile; + + /** + * 完税证明备注 + */ + private String taxRemark; + + + private String sfzZip; + + private String htZip; + + private String payZip; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java new file mode 100644 index 0000000..348d7b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/MerTaxRecordsDetail.java @@ -0,0 +1,123 @@ +package org.dromara.payment.taxRecords.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 完税证明对象 mer_tax_records_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mer_tax_records_detail") +public class MerTaxRecordsDetail extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 完税证明记录id + */ + private Long trId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 待完税月份 + */ + private String month; + + /** + * 自雇者id + */ + private Long workerId; + + /** + * 姓名 + */ + private String workerName; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 收入金额(分) + */ + private Long amount; + + + private Integer busType; + + + private Long workerBus; + + @TableField(exist = false) + private Long billId; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java new file mode 100644 index 0000000..955549c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsBo.java @@ -0,0 +1,117 @@ +package org.dromara.payment.taxRecords.domain.bo; + +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 完税证明业务对象 mer_tax_records + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaxRecords.class, reverseConvertGenerate = false) +public class MerTaxRecordsBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "ID不能为空", groups = {AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 所属月份 + */ + private String month; + + /** + * 开票流水号(多个逗号分隔) + */ + private String invoiceNos; + + /** + * 账单批次流水号(多个逗号分隔) + */ + private String billNos; + + /** + * 账单批次id(多个逗号分隔) + */ + private String billIds; + + /** + * 完税证明上传状态(0:未上传 1:已上传) + */ + private Integer taxStatus; + + /** + * 完税证明zip文件路径 + */ + @NotNull(message = "完税证明不能为空", groups = {AddGroup.class, EditGroup.class }) + private String taxFile; + + /** + * 完税证明备注 + */ + private String taxRemark; + + private String sfzZip; + + private String hTzip; + + private String payZip; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java new file mode 100644 index 0000000..0f875ce --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/MerTaxRecordsDetailBo.java @@ -0,0 +1,132 @@ +package org.dromara.payment.taxRecords.domain.bo; + +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 完税证明业务对象 mer_tax_records_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MerTaxRecordsDetail.class, reverseConvertGenerate = false) +public class MerTaxRecordsDetailBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 完税证明记录id + */ + @NotNull(message = "完税证明记录id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long trId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 待完税月份 + */ + @NotBlank(message = "待完税月份不能为空", groups = { AddGroup.class, EditGroup.class }) + private String month; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workerId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String workerName; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 收入金额(分) + */ + @NotNull(message = "收入金额(分)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java new file mode 100644 index 0000000..d9cdc7a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/bo/SwMonitorBo.java @@ -0,0 +1,41 @@ +package org.dromara.payment.taxRecords.domain.bo; + +import lombok.Data; +import org.dromara.payment.sys.domain.bo.ProInfoCommonBo; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorBo + * @description + * @create 2024-06-24 10:32 + */ + + +@Data +public class SwMonitorBo extends ProInfoCommonBo { + + //项目编码 + private String proNo; + + + //子项目编码 + private String proSubNo; + + + //收款人 + private String workName; + + + //企业名称 + private String merName; + + + //业务类型 + private String busType; + + + //服务商名称 + private String sydName; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java new file mode 100644 index 0000000..05aabbf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsDetailVo.java @@ -0,0 +1,76 @@ +package org.dromara.payment.taxRecords.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 完税证明视图对象 mer_tax_records_detail + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaxRecordsDetail.class) +public class MerTaxRecordsDetailVo implements Serializable { + + + + @ExcelProperty(value = "创建时间") + private Date createTime; + + + + /** + * 待完税月份 + */ + @ExcelProperty(value = "日期") + private String month; + + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String workerName; + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行卡号") + private String bankCard; + + /** + * 收入金额(分) + */ + @ExcelIgnore + private Long amount; + + public String getAmountStr() { + return StringUtils.fenToYuanFormatter(this.amount); + } + + @ExcelProperty(value = "金额(元)") + private String amountStr; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java new file mode 100644 index 0000000..1e55aaa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/MerTaxRecordsVo.java @@ -0,0 +1,183 @@ +package org.dromara.payment.taxRecords.domain.vo; + +import cn.hutool.core.util.StrUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 完税证明视图对象 mer_tax_records + * + * @author LionLi + * @date 2024-05-06 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MerTaxRecords.class) +public class MerTaxRecordsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 结算中心id + */ + @ExcelProperty(value = "结算中心id") + private Long sydId; + + /** + * 结算中心编号 + */ + @ExcelProperty(value = "结算中心编号") + private String sydNo; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 代理商id + */ + @ExcelProperty(value = "代理商id") + private Long channelId; + + /** + * 代理商编号 + */ + @ExcelProperty(value = "代理商编号") + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @ExcelProperty(value = "代理商上下级关系编码") + private String channelCode; + + /** + * 商户id + */ + @ExcelProperty(value = "商户id") + private Long merId; + + /** + * 商户编号 + */ + @ExcelProperty(value = "商户编号") + private String merNo; + + /** + * 所属月份 + */ + @ExcelProperty(value = "所属月份") + private String month; + + /** + * 开票流水号(多个逗号分隔) + */ + @ExcelProperty(value = "开票流水号(多个逗号分隔)") + private String invoiceNos; + + /** + * 账单批次流水号(多个逗号分隔) + */ + @ExcelProperty(value = "账单批次流水号(多个逗号分隔)") + private String billNos; + + /** + * 账单批次id(多个逗号分隔) + */ + @ExcelProperty(value = "账单批次id(多个逗号分隔)") + private String billIds; + + /** + * 完税证明上传状态(0:未上传 1:已上传) + */ + @ExcelProperty(value = "完税证明上传状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:未上传,1=:已上传") + private Integer taxStatus; + + public String getTaxStatusStr() { + + if(this.taxStatus != null){ + if( this.taxStatus == 1){ + taxStatusStr = "未上传"; + }else{ + taxStatusStr = "未上传"; + } + }else{ + return "--"; + } + + return taxStatusStr; + } + + private String taxStatusStr; + + + /** + * 完税证明zip文件路径 + */ + @ExcelProperty(value = "完税证明zip文件路径") + private String taxFile; + + + public String getOssId() { + if(StringUtils.isNotEmpty(this.taxFile)){ + return StringUtils.getOssIdDomainFileName(this.taxFile); + }else{ + return ""; + } + } + + private String ossId; + + /** + * 完税证明备注 + */ + @ExcelProperty(value = "完税证明备注") + private String taxRemark; + + private Date createTime; + + + private String sydName; + + + private String merName; + + + + private String sfzZip; + + private String hTzip; + + private String payZip; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java new file mode 100644 index 0000000..21d7230 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/domain/vo/SwMonitorVo.java @@ -0,0 +1,66 @@ +package org.dromara.payment.taxRecords.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorVo + * @description + * @create 2024-06-24 10:35 + */ +@Data +public class SwMonitorVo implements Serializable { + + + //创建时间 + private Date createTime; + + + //企业名称 + private String merName; + + + //服务商名称 + private String syName; + + + //业务类型 + private Integer busType; + + + //项目编码 + private String proNo; + + //项目子编码 + private String proSubNo; + + //收款人 + private String workName; + + private Long workId; + + //项目ID + private Long proId; + + //完税证明 + private String wsFile; + + //企业ID + private Long merId; + + //服务商ID + private Long sydId; + + //账单明细ID + private Long id; + + //账单批次号 + private String billNo; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java new file mode 100644 index 0000000..34316f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsDetailMapper.java @@ -0,0 +1,76 @@ +package org.dromara.payment.taxRecords.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 完税证明Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerTaxRecordsDetailMapper extends BaseMapperPlus { + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,查询完税证明明细 + **/ + Page selTaxRecordDetails(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,导出完税证明明细 + **/ + List selTaxRecordDetails(@Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,查询身份证信息 + **/ + List selTaxRecordWorkInfo(Long trId); + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-05-06 15:39 + * 说明:根据记录id,查询合同信息 + **/ + List selTaxRecordWorkHtInfo(Map map); + + + /**** + * 说明:根据记录id,查询支付凭证信息 + * @param map + * @return + */ + List selTaxRecordWorkPayCerInfo(Map map); + + + List selectCreateTxRecordDetails(Map map); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java new file mode 100644 index 0000000..deed6db --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/MerTaxRecordsMapper.java @@ -0,0 +1,41 @@ +package org.dromara.payment.taxRecords.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 完税证明Mapper接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface MerTaxRecordsMapper extends BaseMapperPlus { + + + /*** + * 查询企业完税证明列表 + * @param page + * @param wrapper + * @return + */ + @DataPermission({ + @DataColumn(key="colomField",value="t.mer_no") + }) + Page selTaxRecordsList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + List selectCreateTxRecords(Map map); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java new file mode 100644 index 0000000..28a3026 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/mapper/SwMonitorMapper.java @@ -0,0 +1,41 @@ +package org.dromara.payment.taxRecords.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorMapper + * @description 税务监控 + * @create 2024-06-24 10:41 + */ +public interface SwMonitorMapper { + + + Page selSwMonitorList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 根据账单号查询发票样张 + * @param billNo + * @return + */ + public List selInvoceInfoByBillNo(String billNo); + + + /*** + * 查询自雇者完工情况 + * @param proSubNo + * @return + */ + public MerTaskEnrollVo selTaskEnRollBySubBo(String proSubNo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java new file mode 100644 index 0000000..827f31f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsDetailService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.taxRecords.service; + +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 完税证明Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerTaxRecordsDetailService { + + /** + * 查询完税证明 + */ + MerTaxRecordsDetailVo queryById(Long id); + + /** + * 查询完税证明列表 + */ + TableDataInfo queryPageList(MerTaxRecordsDetailBo bo, PageQuery pageQuery); + + /** + * 查询完税证明列表 + */ + List queryList(MerTaxRecordsDetailBo bo); + + /** + * 新增完税证明 + */ + Boolean insertByBo(MerTaxRecordsDetailBo bo); + + /** + * 修改完税证明 + */ + Boolean updateByBo(MerTaxRecordsDetailBo bo); + + /** + * 校验并批量删除完税证明信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java new file mode 100644 index 0000000..6a1dda9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/IMerTaxRecordsService.java @@ -0,0 +1,108 @@ +package org.dromara.payment.taxRecords.service; + +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 完税证明Service接口 + * + * @author LionLi + * @date 2024-05-06 + */ +public interface IMerTaxRecordsService { + + /** + * 查询完税证明 + */ + MerTaxRecordsVo queryById(Long id); + + /** + * 查询完税证明列表 + */ + TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery); + + /** + * 查询完税证明列表 + */ + List queryList(MerTaxRecordsBo bo); + + /** + * 新增完税证明 + */ + Boolean insertByBo(MerTaxRecordsBo bo); + + /** + * 修改完税证明 + */ + Boolean updateByBo(MerTaxRecordsBo bo); + + /** + * 校验并批量删除完税证明信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /*** + * 下载用户身份证信息 + * @param trId + * @return + */ + Map downLoadUserworkSfz(Long trId) throws Exception; + + /*** + * 下载合同信息 + * @param trId + * @return + */ + Map downLoadUserworkHt(Long trId) throws Exception; + + /*** + * 下载支付凭证信息 + * @param trId + * @return + */ + Map downLoadUserworkPayCer(Long trId) throws Exception; + + + /*** + * 根据账单编码获取账单详情 + * @param billNo + * @return + */ + MerBillVo getMerBillInfo(String billNo); + + + /**** + * 根据账单编码获取账单明细 + * @param billNo + * @param pageQuery + * @return + */ + TableDataInfo getMerBillDetailList(String billNo, PageQuery pageQuery); + + /*** + * 根据开票流水获取开票详情 + * @param invNo + * @param pageQuery + * @return + */ + TableDataInfo getInvDetailList(String invNo, PageQuery pageQuery); + + + /*** + * 根据开票流水号获取开票详情 + * @param invNo + * @return + */ + String getInvInfo(String invNo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java new file mode 100644 index 0000000..cb27b2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/ISwMonitorService.java @@ -0,0 +1,47 @@ +package org.dromara.payment.taxRecords.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.taxRecords.domain.bo.SwMonitorBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; + +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title ISwMonitorService + * @description + * @create 2024-06-24 10:42 + */ +public interface ISwMonitorService { + + + + public TableDataInfo queryPageList(SwMonitorBo bo, PageQuery pageQuery) ; + + + /**** + * 查询完工信息 + * @param proSubNo ,子项目编码 + * @return + */ + public MerTaskEnrollVo getTaskEnrollVo(String proSubNo); + + String getFileUrl(Long tailId, String tailNo, String subNo, Integer type,Long workId,Integer busType,Long syId,Long merId); + + + + void exportInv(String bo, HttpServletResponse response) throws Exception; + + + /*** + * 生成月份的完税证明 + * @param createDate + */ + void createSwRecords(Date createDate); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java new file mode 100644 index 0000000..ee22a7c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/AsyncTaxRecordsService.java @@ -0,0 +1,164 @@ +package org.dromara.payment.taxRecords.service.impl; + +import cn.hutool.core.date.DateUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteResultZip; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.sys.domain.BusDownloads; +import org.dromara.payment.sys.mapper.BusDownloadsMapper; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsDetailMapper; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title AsyncTaxRecordsService + * @description + * @create 2024-05-06 19:37 + */ + +@Service +public class AsyncTaxRecordsService { + + + @Resource + private MerTaxRecordsMapper merTaxRecordsMapper; + + + @Resource + private MerTaxRecordsDetailMapper merTaxRecordsDetailMapper; + + @Resource + private UserWorkerMapper userWorkerMapper; + + + @Resource + private BusDownloadsMapper busDownloadsMapper; + + + @DubboReference + private RemoteUserWokerService remoteUserWokerService; + + + /**** + * 根据用工者ID,生成用工着身份证信息 + * @param workIds + * @throws Exception + */ + @Async + public void createSfzZipByUserInfos(List workIds,Long createBy,Integer busType)throws Exception{ + + List< UserWorker> uw = this.userWorkerMapper.selectBatchIds(workIds); + List zipUserVoList = new ArrayList(); + for(UserWorker u : uw){ + RemoteUserWorkerZipVo ruz = new RemoteUserWorkerZipVo(); + ruz.setWorkId(u.getId()); + ruz.setWorkName(u.getName()); + ruz.setCardBack(u.getCardBack()); + ruz.setCardPositive(u.getCardPositive()); + zipUserVoList.add(ruz); + } + RemoteResultZip result = this.remoteUserWokerService.createWorkerSfzZip(zipUserVoList); + if(result != null ){ + + BusDownloads busDownloads = new BusDownloads(); + busDownloads.setOssId(result.getOssId()); + busDownloads.setBusType(busType); + busDownloads.setCreateBy(createBy); + busDownloads.setUrl(result.getUrl()); + busDownloads.setCreateTime(new Date()); + this.busDownloadsMapper.insert(busDownloads); + } + } + + + /*** + * 获取身份证压缩包 + * @return + */ + @Async + public void getSfzZip(Long trId)throws Exception{ + + List userList = merTaxRecordsDetailMapper.selTaxRecordWorkInfo(trId); + RemoteResultZip result = this.remoteUserWokerService.createWorkerSfzZip(userList); + + if(result != null && StringUtils.isNotEmpty(result.getUrl())){ + MerTaxRecords merTaxRecords = new MerTaxRecords(); + merTaxRecords.setId(trId); + merTaxRecords.setSfzZip(result.getUrl()); + this.merTaxRecordsMapper.updateById(merTaxRecords); + } + } + + + + /*** + * 获取合同压缩包 + * @return + */ + @Async + public void getHtZip(Long trId)throws Exception{ + + MerTaxRecordsVo vo = this.merTaxRecordsMapper.selectVoById(trId); + Date startTime = DateUtil.beginOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + Date endTime = DateUtil.endOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + + Map paraMap = new HashMap(); + paraMap.put("merId",vo.getMerId()); + paraMap.put("startTime",startTime); + paraMap.put("endTime",endTime); + paraMap.put("trId",trId); + + List userList = merTaxRecordsDetailMapper.selTaxRecordWorkHtInfo(paraMap); + RemoteResultZip result = this.remoteUserWokerService.createWorkerHtZip(userList); + + if( result!= null && StringUtils.isNotEmpty(result.getUrl())){ + MerTaxRecords merTaxRecords = new MerTaxRecords(); + merTaxRecords.setId(trId); + merTaxRecords.setHtZip(result.getUrl()); + this.merTaxRecordsMapper.updateById(merTaxRecords); + } + } + + + + /*** + * 获取支付凭证 + * @return + */ + @Async + public void getPayCerZip(Long trId)throws Exception{ + + MerTaxRecordsVo vo = this.merTaxRecordsMapper.selectVoById(trId); + Date startTime = DateUtil.beginOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + Date endTime = DateUtil.endOfMonth(DateUtil.parse(vo.getMonth()+"-01")).toJdkDate(); + + Map paraMap = new HashMap(); + paraMap.put("merId",vo.getMerId()); + paraMap.put("startTime",startTime); + paraMap.put("endTime",endTime); + paraMap.put("trId",trId); + + List userList = merTaxRecordsDetailMapper.selTaxRecordWorkPayCerInfo(paraMap); + RemoteResultZip result = this.remoteUserWokerService.createWorkerPayCerZip(userList); + + if(result != null &&StringUtils.isNotEmpty(result.getUrl())){ + MerTaxRecords merTaxRecords = new MerTaxRecords(); + merTaxRecords.setId(trId); + merTaxRecords.setPayZip(result.getUrl()); + this.merTaxRecordsMapper.updateById(merTaxRecords); + } + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java new file mode 100644 index 0000000..353d8ed --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsDetailServiceImpl.java @@ -0,0 +1,130 @@ +package org.dromara.payment.taxRecords.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsDetailBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsDetailVo; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsDetailMapper; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsDetailService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 完税证明Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerTaxRecordsDetailServiceImpl implements IMerTaxRecordsDetailService { + + private final MerTaxRecordsDetailMapper baseMapper; + + /** + * 查询完税证明 + */ + @Override + public MerTaxRecordsDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询完税证明列表 + */ + @Override + public TableDataInfo queryPageList(MerTaxRecordsDetailBo bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq("t.tr_id",bo.getTrId()); + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selTaxRecordDetails(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询完税证明列表 + */ + @Override + public List queryList(MerTaxRecordsDetailBo bo) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq("t.tr_id",bo.getTrId()); + lqw.orderByDesc("t.create_time"); + return baseMapper.selTaxRecordDetails(lqw); + } + + private QueryWrapper buildQueryWrapper(MerTaxRecordsDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getTrId() != null, "tr_id", bo.getTrId()); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getMonth()), "month", bo.getMonth()); + lqw.eq(bo.getWorkerId() != null, "worker_id", bo.getWorkerId()); + lqw.like(StringUtils.isNotBlank(bo.getWorkerName()), "worker_name", bo.getWorkerName()); + lqw.eq(StringUtils.isNotBlank(bo.getCardId()), "card_id", bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(bo.getAmount() != null, "amount", bo.getAmount()); + return lqw; + } + + /** + * 新增完税证明 + */ + @Override + public Boolean insertByBo(MerTaxRecordsDetailBo bo) { + MerTaxRecordsDetail add = MapstructUtils.convert(bo, MerTaxRecordsDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改完税证明 + */ + @Override + public Boolean updateByBo(MerTaxRecordsDetailBo bo) { + MerTaxRecordsDetail update = MapstructUtils.convert(bo, MerTaxRecordsDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTaxRecordsDetail entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除完税证明 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java new file mode 100644 index 0000000..8b0df58 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/MerTaxRecordsServiceImpl.java @@ -0,0 +1,240 @@ +package org.dromara.payment.taxRecords.service.impl; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.domain.vo.MerBillVo; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.springframework.stereotype.Service; +import org.dromara.payment.taxRecords.domain.bo.MerTaxRecordsBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.taxRecords.service.IMerTaxRecordsService; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 完税证明Service业务层处理 + * + * @author LionLi + * @date 2024-05-06 + */ +@RequiredArgsConstructor +@Service +public class MerTaxRecordsServiceImpl implements IMerTaxRecordsService { + + private final MerTaxRecordsMapper baseMapper; + + + @Resource + private AsyncTaxRecordsService asyncTaxRecordsService; + @Resource + private SysSydMapper sydMapper; + @Resource + private IXyjService xyjService; + @Resource + private BusMerchantMapper merchantMapper; + + /** + * 查询完税证明 + */ + @Override + public MerTaxRecordsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询完税证明列表 + */ + @Override + public TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getBusMerName()),"t1.name",bo.getBusMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getSynName()),"t2.gsmc",bo.getSynName()); + lqw.eq(bo.getWsZmStatus() != null,"t.tax_status",bo.getWsZmStatus()); + if(LoginHelper.getBusRole() == BusRole.SERVICE.getId()){ + lqw.eq("t.syd_id",LoginHelper.getBusId()); + }else if(LoginHelper.getBusRole() == BusRole.AGENT.getId()){ + lqw.likeRight("t.channel_no",LoginHelper.getNo()); + }else if(LoginHelper.getBusRole() == BusRole.OPERATOR.getId()){ + lqw.eq("t.op_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selTaxRecordsList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询完税证明列表 + */ + @Override + public List queryList(MerTaxRecordsBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(MerTaxRecordsBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "syd_no", bo.getSydNo()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getMonth()), "month", bo.getMonth()); + lqw.eq(StringUtils.isNotBlank(bo.getInvoiceNos()), "invoice_nos", bo.getInvoiceNos()); + lqw.eq(StringUtils.isNotBlank(bo.getBillNos()), "bill_nos", bo.getBillNos()); + lqw.eq(StringUtils.isNotBlank(bo.getBillIds()), "bill_ids", bo.getBillIds()); + lqw.eq(bo.getTaxStatus() != null, "tax_status", bo.getTaxStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getTaxFile()), "tax_file", bo.getTaxFile()); + lqw.eq(StringUtils.isNotBlank(bo.getTaxRemark()), "tax_remark", bo.getTaxRemark()); + return lqw; + } + + /** + * 新增完税证明 + */ + @Override + public Boolean insertByBo(MerTaxRecordsBo bo) { + MerTaxRecords add = MapstructUtils.convert(bo, MerTaxRecords.class); + validEntityBeforeSave(add); + SysSyd sysSyd = sydMapper.selectSysSydById(add.getSydId()); + BusMerchant busMerchant = merchantMapper.selectById(add.getMerId()); + boolean flag; + if(false) { + flag = xyjService.taxpayDownLoad(busMerchant,sysSyd,bo.getMonth()); + }else { + flag = baseMapper.insert(add) > 0; + } + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改完税证明 + */ + @Override + public Boolean updateByBo(MerTaxRecordsBo bo) { + MerTaxRecords update = MapstructUtils.convert(bo, MerTaxRecords.class); + update.setTaxStatus(1); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(MerTaxRecords entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除完税证明 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + + + @Override + public Map downLoadUserworkSfz(Long trId)throws Exception { + Map resultMap = new HashMap(); + MerTaxRecordsVo records = this.baseMapper.selectVoById(trId); + resultMap.put("isUrl",2); + if(records != null && StringUtils.isNotEmpty(records.getSfzZip())){ + resultMap.put("isUrl",1); + resultMap.put("url",records.getSfzZip()); + }else{ + resultMap.put("msg","正在生成中,请稍后下载"); + this.asyncTaxRecordsService.getSfzZip(trId); + } + return resultMap; + } + + @Override + public Map downLoadUserworkHt(Long trId) throws Exception { + Map resultMap = new HashMap(); + MerTaxRecordsVo records = this.baseMapper.selectVoById(trId); + resultMap.put("isUrl",2); + if(records != null && StringUtils.isNotEmpty(records.getHTzip())){ + resultMap.put("isUrl",1); + resultMap.put("url",records.getHTzip()); + }else{ + resultMap.put("msg","正在生成中,请稍后下载"); + this.asyncTaxRecordsService.getHtZip(trId); + } + return resultMap; + } + + @Override + public Map downLoadUserworkPayCer(Long trId) throws Exception { + Map resultMap = new HashMap(); + MerTaxRecordsVo records = this.baseMapper.selectVoById(trId); + resultMap.put("isUrl",2); + if(records != null && StringUtils.isNotEmpty(records.getPayZip())){ + resultMap.put("isUrl",1); + resultMap.put("url",records.getPayZip()); + }else{ + resultMap.put("msg","正在生成中,请稍后下载"); + this.asyncTaxRecordsService.getPayCerZip(trId); + } + return resultMap; + } + + + + + + @Override + public MerBillVo getMerBillInfo(String billNo) { + return null; + } + + @Override + public TableDataInfo getMerBillDetailList(String billNo, PageQuery pageQuery) { + return null; + } + + @Override + public TableDataInfo getInvDetailList(String invNo, PageQuery pageQuery) { + return null; + } + + @Override + public String getInvInfo(String invNo) { + return null; + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java new file mode 100644 index 0000000..0716c19 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/taxRecords/service/impl/SwMonitorServiceImpl.java @@ -0,0 +1,234 @@ +package org.dromara.payment.taxRecords.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.bill.domain.vo.MerBillDetailVo; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.invoice.domain.vo.MerInvoiceDetailVo; +import org.dromara.payment.task.domain.MerTaskEnroll; +import org.dromara.payment.task.domain.vo.MerTaskEnrollVo; +import org.dromara.payment.task.mapper.MerTaskEnrollMapper; +import org.dromara.payment.task.service.IMerTaskEnrollService; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.MerTaxRecordsDetail; +import org.dromara.payment.taxRecords.domain.bo.SwMonitorBo; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.domain.vo.SwMonitorVo; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsDetailMapper; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.taxRecords.mapper.SwMonitorMapper; +import org.dromara.payment.taxRecords.service.ISwMonitorService; +import org.dromara.payment.worker.domain.vo.UserWorkerBusinessVo; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title SwMonitorServiceImpl + * @description + * @create 2024-06-24 10:42 + */ + +@Service +public class SwMonitorServiceImpl extends BaseService implements ISwMonitorService { + + + @Resource + private SwMonitorMapper baseMapper; + + @Resource + private MerTaskEnrollMapper merTaskEnrollMapper; + + @Resource + private MerBillDetailMapper billDetailMapper; + + @Resource + private UserWorkerBusinessMapper userWorkerBusinessMapper; + + @Resource + private MerTaxRecordsMapper merTaxRecordsMapper; + + + @Resource + private MerTaxRecordsDetailMapper merTaxRecordsDetailMapper; + @DubboReference + private RemoteUserWokerService remoteUserWokerService; + + + + @Override + public TableDataInfo queryPageList(SwMonitorBo bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getProNo()),"t4.no",bo.getProNo()); + lqw.like(StringUtils.isNotEmpty(bo.getProSubNo()),"t.cno",bo.getProSubNo()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t.worker_name",bo.getWorkName()); + lqw.like(StringUtils.isNotEmpty(bo.getMerName()),"t1.name",bo.getMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getSydName()),"t2.gsmc",bo.getSydName()); + lqw.eq("t.pay_status",1); + lqw.eq(bo.getBusType() !=null,"t.bus_type",bo.getBusType()); + int busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("t.op_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selSwMonitorList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + + @Override + public MerTaskEnrollVo getTaskEnrollVo(String proSubNo){ + return this.baseMapper.selTaskEnRollBySubBo(proSubNo); + } + + + /*** + * @param tailId 账单明细ID + * @param tailNo 账单号 + * @param subNo 子项目编码 + * @param type 类型 + * @return + */ + @Override + public String getFileUrl(Long tailId, String tailNo, String subNo, Integer type,Long workId,Integer busType,Long syId,Long merId) { + switch(type){ + case 1: + //b2c凭证 + MerBillDetailVo vo = this.billDetailMapper.selectVoById(tailId); + return vo.getPayReceipt(); + case 2: + //b2b凭证 + vo = this.billDetailMapper.selectVoById(tailId); + return vo.getPayReceiptB2b(); + case 3: +// //发票 + List list = this.baseMapper.selInvoceInfoByBillNo(tailNo); + String result = "-1"; + for(MerInvoiceDetailVo vo1 : list){ + if(StringUtils.isNotEmpty(vo1.getInvPic())){ + result = "1"; + break; + } + } + return result; + case 4: + //完税证明 + QueryWrapper qw1 = Wrappers.query(); + qw1.likeRight("bill_nos",tailNo+","); +// qw.apply("FIND_IN_SET(bill_nos,#{billNo}) > 0",tailNo); + MerTaxRecordsVo mtrv = this.merTaxRecordsMapper.selectVoOne(qw1); + if(mtrv == null){ + return null; + }else{ + return mtrv.getTaxFile(); + } + case 5: + //查看个人合同 + QueryWrapper qw = Wrappers.query(); + qw.eq("bus_type",busType); + qw.eq("work_id",workId); + qw.eq("mer_id",merId); + qw.eq("syd_id",syId); + qw.eq("sign_status",1); + UserWorkerBusinessVo uwb = this.userWorkerBusinessMapper.selectVoOne(qw); + if(uwb == null){ + return null; + }else{ + return uwb.getSignFileUrl(); + } + } + return null; + } + + @Override + public void exportInv(String bo, HttpServletResponse response) throws Exception { + + List invList = this.baseMapper.selInvoceInfoByBillNo(bo); + List zipList = new ArrayList(); + if(invList != null && !invList.isEmpty()){ + for(MerInvoiceDetailVo vo : invList){ + if(StringUtils.isNotEmpty(vo.getInvPic())){ + RemoteUserWorkerZipVo zipVo = new RemoteUserWorkerZipVo(); + zipVo.setInvNo(vo.getInvNo()); + zipVo.setInvPic(vo.getInvPic()); + zipList.add(zipVo); + } + } + } + + if(zipList.isEmpty()){ + this.invalidationParamsException("未上传发票"); + } + byte[] zipByte = this.remoteUserWokerService.downLoadInvZip(zipList); + response.reset(); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.addHeader("Content-Length", "" + zipByte.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + FileUtils.setAttachmentResponseHeader(response,"发票信息.zip"); + IoUtil.write(response.getOutputStream(), false, zipByte); + + } + + + /*** + * 生成完税证明数据 + * @param createDate + */ + @Override + @Transactional + public void createSwRecords(Date createDate) { + + + String month = DateUtil.format(createDate,"yyyy-MM"); + Date firstDay = DateUtil.beginOfMonth(createDate); + Date lastDay = DateUtil.endOfMonth(createDate); + + Map paraMap = new HashMap(); + paraMap.put("startTime",firstDay); + paraMap.put("endtime",lastDay); + + List recordsList = this.merTaxRecordsMapper.selectCreateTxRecords(paraMap); + List detailList = this.merTaxRecordsDetailMapper.selectCreateTxRecordDetails(paraMap); + + for(MerTaxRecords records : recordsList){ + Long id = IdUtil.getSnowflakeNextId(); + records.setId(id); + records.setMonth(month); + records.setCreateTime(new Date()); + + for(MerTaxRecordsDetail detail: detailList){ + detail.setMonth(month); + if(records.getBillIds().contains(detail.getBillId()+"")){ + detail.setTrId(records.getId()); + } + } + } + + this.merTaxRecordsMapper.insertBatch(recordsList); + this.merTaxRecordsDetailMapper.insertBatch(detailList); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java new file mode 100644 index 0000000..41e1df4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/IBaseBusinessFlowService.java @@ -0,0 +1,16 @@ +package org.dromara.payment.thirdPlatform.base; + +/** + * @author sunzexing + * @version 1.0 + * @title IBaseBusinessFlowService + * @description + * @create 2025-03-26 9:17 + */ +public interface IBaseBusinessFlowService { + + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java new file mode 100644 index 0000000..df96345 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/controller/SysThirdPlatformController.java @@ -0,0 +1,29 @@ +package org.dromara.payment.thirdPlatform.base.controller; + + +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; +import org.dromara.payment.thirdPlatform.base.mapper.SysThirdPlatformMapper; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/sysThirdPlatform") +public class SysThirdPlatformController { + @Resource + private SysThirdPlatformMapper sysThirdPlatformMapper; + + @GetMapping("/list") + public List list(){ + List sysThirdPlatforms = this.sysThirdPlatformMapper.selectList(); + List platformNames = sysThirdPlatforms.stream() + .map(SysThirdPlatform::getPlatformName) + .collect(Collectors.toList()); + return platformNames; + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java new file mode 100644 index 0000000..2fc79ed --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/SysThirdPlatform.java @@ -0,0 +1,62 @@ +package org.dromara.payment.thirdPlatform.base.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 第三方平台对象 sys_third_platform + * + * @author LionLi + * @date 2025-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_third_platform") +public class SysThirdPlatform extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 第三方平台名称 + */ + private String platformName; + + /** + * APPID + */ + private String appId; + + /** + * json格式 + */ + private String otherParams; + + /** + * 联系人姓名 + */ + private String contactName; + + /** + * 联系人电话 + */ + private String contactTel; + + /** + * BeanName + */ + private String beanName; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java new file mode 100644 index 0000000..9357580 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/bo/SysThirdPlatformBo.java @@ -0,0 +1,67 @@ +package org.dromara.payment.thirdPlatform.base.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; + +/** + * 第三方平台业务对象 sys_third_platform + * + * @author LionLi + * @date 2025-03-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysThirdPlatform.class, reverseConvertGenerate = false) +public class SysThirdPlatformBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 第三方平台名称 + */ + @NotBlank(message = "第三方平台名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String platformName; + + /** + * APPID + */ + @NotBlank(message = "APPID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String appId; + + /** + * json格式 + */ + @NotBlank(message = "json格式不能为空", groups = { AddGroup.class, EditGroup.class }) + private String otherParams; + + /** + * 联系人姓名 + */ + @NotBlank(message = "联系人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactName; + + /** + * 联系人电话 + */ + @NotBlank(message = "联系人电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactTel; + + /** + * BeanName + */ + @NotBlank(message = "BeanName不能为空", groups = { AddGroup.class, EditGroup.class }) + private String beanName; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java new file mode 100644 index 0000000..7784049 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/domain/vo/SysThirdPlatformVo.java @@ -0,0 +1,70 @@ +package org.dromara.payment.thirdPlatform.base.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 第三方平台视图对象 sys_third_platform + * + * @author LionLi + * @date 2025-03-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysThirdPlatform.class) +public class SysThirdPlatformVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 第三方平台名称 + */ + @ExcelProperty(value = "第三方平台名称") + private String platformName; + + /** + * APPID + */ + @ExcelProperty(value = "APPID") + private String appId; + + /** + * json格式 + */ + @ExcelProperty(value = "json格式") + private String otherParams; + + /** + * 联系人姓名 + */ + @ExcelProperty(value = "联系人姓名") + private String contactName; + + /** + * 联系人电话 + */ + @ExcelProperty(value = "联系人电话") + private String contactTel; + + /** + * BeanName + */ + @ExcelProperty(value = "BeanName") + private String beanName; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java new file mode 100644 index 0000000..1436eea --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/base/mapper/SysThirdPlatformMapper.java @@ -0,0 +1,20 @@ +package org.dromara.payment.thirdPlatform.base.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; +import org.dromara.payment.thirdPlatform.base.domain.vo.SysThirdPlatformVo; + +/** + * 第三方平台Mapper接口 + * + * @author LionLi + * @date 2025-03-28 + */ +public interface SysThirdPlatformMapper extends BaseMapperPlus { + + + public SysThirdPlatform selectThirdAppInfo(Long sydId); + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java new file mode 100644 index 0000000..65b9ba2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentAccountBeanBase.java @@ -0,0 +1,130 @@ +package org.dromara.payment.thirdPlatform.utils; + +public class PaymentAccountBeanBase extends PaymentConfigBase +{ + private String configName; + private String accountName; + private String accountId; + private Long paymentConfigId; + + public String getConfigName() { + return this.configName; + } + + public String getAccountName() { + return this.accountName; + } + + public String getAccountId() { + return this.accountId; + } + + public Long getPaymentConfigId() { + return this.paymentConfigId; + } + + public void setConfigName(final String configName) { + this.configName = configName; + } + + public void setAccountName(final String accountName) { + this.accountName = accountName; + } + + public void setAccountId(final String accountId) { + this.accountId = accountId; + } + + public void setPaymentConfigId(final Long paymentConfigId) { + this.paymentConfigId = paymentConfigId; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof PaymentAccountBeanBase)) { + return false; + } + final PaymentAccountBeanBase other = (PaymentAccountBeanBase)o; + if (!other.canEqual(this)) { + return false; + } + final Object this$paymentConfigId = this.getPaymentConfigId(); + final Object other$paymentConfigId = other.getPaymentConfigId(); + Label_0065: { + if (this$paymentConfigId == null) { + if (other$paymentConfigId == null) { + break Label_0065; + } + } + else if (this$paymentConfigId.equals(other$paymentConfigId)) { + break Label_0065; + } + return false; + } + final Object this$configName = this.getConfigName(); + final Object other$configName = other.getConfigName(); + Label_0102: { + if (this$configName == null) { + if (other$configName == null) { + break Label_0102; + } + } + else if (this$configName.equals(other$configName)) { + break Label_0102; + } + return false; + } + final Object this$accountName = this.getAccountName(); + final Object other$accountName = other.getAccountName(); + Label_0139: { + if (this$accountName == null) { + if (other$accountName == null) { + break Label_0139; + } + } + else if (this$accountName.equals(other$accountName)) { + break Label_0139; + } + return false; + } + final Object this$accountId = this.getAccountId(); + final Object other$accountId = other.getAccountId(); + if (this$accountId == null) { + if (other$accountId == null) { + return true; + } + } + else if (this$accountId.equals(other$accountId)) { + return true; + } + return false; + } + + @Override + protected boolean canEqual(final Object other) { + return other instanceof PaymentAccountBeanBase; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $paymentConfigId = this.getPaymentConfigId(); + result = result * 59 + (($paymentConfigId == null) ? 43 : $paymentConfigId.hashCode()); + final Object $configName = this.getConfigName(); + result = result * 59 + (($configName == null) ? 43 : $configName.hashCode()); + final Object $accountName = this.getAccountName(); + result = result * 59 + (($accountName == null) ? 43 : $accountName.hashCode()); + final Object $accountId = this.getAccountId(); + result = result * 59 + (($accountId == null) ? 43 : $accountId.hashCode()); + return result; + } + + @Override + public String toString() { + return "PaymentAccountBeanBase(configName=" + this.getConfigName() + ", accountName=" + this.getAccountName() + ", accountId=" + this.getAccountId() + ", paymentConfigId=" + this.getPaymentConfigId() + ")"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java new file mode 100644 index 0000000..45a9d19 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigBase.java @@ -0,0 +1,83 @@ +package org.dromara.payment.thirdPlatform.utils; + +public class PaymentConfigBase +{ + boolean sub; + String tax; + boolean auto; + + public boolean isSub() { + return this.sub; + } + + public String getTax() { + return this.tax; + } + + public boolean isAuto() { + return this.auto; + } + + public void setSub(final boolean sub) { + this.sub = sub; + } + + public void setTax(final String tax) { + this.tax = tax; + } + + public void setAuto(final boolean auto) { + this.auto = auto; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof PaymentConfigBase)) { + return false; + } + final PaymentConfigBase other = (PaymentConfigBase)o; + if (!other.canEqual(this)) { + return false; + } + if (this.isSub() != other.isSub()) { + return false; + } + if (this.isAuto() != other.isAuto()) { + return false; + } + final Object this$tax = this.getTax(); + final Object other$tax = other.getTax(); + if (this$tax == null) { + if (other$tax == null) { + return true; + } + } + else if (this$tax.equals(other$tax)) { + return true; + } + return false; + } + + protected boolean canEqual(final Object other) { + return other instanceof PaymentConfigBase; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * 59 + (this.isSub() ? 79 : 97); + result = result * 59 + (this.isAuto() ? 79 : 97); + final Object $tax = this.getTax(); + result = result * 59 + (($tax == null) ? 43 : $tax.hashCode()); + return result; + } + + @Override + public String toString() { + return "PaymentConfigBase(sub=" + this.isSub() + ", tax=" + this.getTax() + ", auto=" + this.isAuto() + ")"; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java new file mode 100644 index 0000000..e783829 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/utils/PaymentConfigUtils.java @@ -0,0 +1,47 @@ +package org.dromara.payment.thirdPlatform.utils; + + + +import cn.hutool.core.lang.Assert; +import org.dromara.payment.thirdPlatform.xinyujian.config.XinyujianAccountBean; +import org.dromara.payment.thirdPlatform.xinyujian.config.XinyujianConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +@Service +public class PaymentConfigUtils { + private static final Logger log = LoggerFactory.getLogger(PaymentConfigUtils.class); + + + + @Resource + private XinyujianConfig xinyujianConfig; + + + + public XinyujianAccountBean getXyjAccountBean(Long paymentConfigId) { + XinyujianAccountBean accountBean = (XinyujianAccountBean)this.xinyujianConfig.getAccounts().get(paymentConfigId); + Assert.isNull(accountBean, "益零工配置不存在"); + accountBean.setPaymentConfigId(paymentConfigId); + return accountBean; + } + + public List listXyjAccountBeans() { + List list = new ArrayList<>(); + Map map = this.xinyujianConfig.getAccounts(); + for (Long paymentConfigId : map.keySet()) { + XinyujianAccountBean bean = map.get(paymentConfigId); + bean.setPaymentConfigId(paymentConfigId); + list.add(bean); + } + return list; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java new file mode 100644 index 0000000..82b5639 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianAccountBean.java @@ -0,0 +1,26 @@ +package org.dromara.payment.thirdPlatform.xinyujian.config; + +import lombok.EqualsAndHashCode; +import org.dromara.payment.thirdPlatform.utils.PaymentAccountBeanBase; + +@EqualsAndHashCode +public class XinyujianAccountBean extends PaymentAccountBeanBase { + private String endpoint; + + public String toString() { + return "XinyujianAccountBean(endpoint=" + getEndpoint() + ")"; + } + + + protected boolean canEqual(Object other) { + return other instanceof XinyujianAccountBean; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + public String getEndpoint() { + return this.endpoint; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java new file mode 100644 index 0000000..c49f5f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XinyujianConfig.java @@ -0,0 +1,31 @@ +package org.dromara.payment.thirdPlatform.xinyujian.config; + + +import lombok.EqualsAndHashCode; +import org.dromara.payment.thirdPlatform.utils.PaymentConfigBase; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.Map; + +@EqualsAndHashCode +@Configuration +@ConfigurationProperties(prefix = "payment.xinyujian") +public class XinyujianConfig extends PaymentConfigBase { + Map accounts; + + public String toString() { + return "XinyujianConfig(accounts=" + getAccounts() + ")"; + } + protected boolean canEqual(Object other) { + return other instanceof XinyujianConfig; + } + + public void setAccounts(Map accounts) { + this.accounts = accounts; + } + + public Map getAccounts() { + return this.accounts; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java new file mode 100644 index 0000000..afc70f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/config/XyjConfig.java @@ -0,0 +1,27 @@ +package org.dromara.payment.thirdPlatform.xinyujian.config; + +import lombok.Data; + +/** + * @author sunzexing + * @version 1.0 + * @title XyjConfig + * @description + * @create 2025-03-28 15:29 + */ + +@Data +public class XyjConfig { + + private Long id; + + private String appid; + + private String otherPublicKey ; + + private String myPrivateKey ; + + private String baseUrl; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java new file mode 100644 index 0000000..c0dc0b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/controller/XyjCallbackController.java @@ -0,0 +1,101 @@ +package org.dromara.payment.thirdPlatform.xinyujian.controller; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.payment.thirdPlatform.xinyujian.service.IXyjService; +import org.dromara.payment.thirdPlatform.xinyujian.sign.BaseDataVo; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title XyjCallbackController + * @description 薪遇见回调接口 + * @create 2025-03-28 15:30 + */ +@Slf4j +@Data +@RestController +@RequestMapping("/thirdApi/v1/xyj/") +public class XyjCallbackController { + + + @Resource + private IXyjService xyjService; + + + + /** + * 处理商户回调请求 + * 该方法用于处理来自合作伙伴系统的商户回调,以实现特定的业务逻辑 + * @param bdvo 包含回调数据的基类对象,通过请求体自动解析获得 + * @param sydId 税源地ID,从请求的URL中提取,用于标识和处理特定商户的回调 + */ + @RequestMapping("addMerchantCallback/{sydId}") + public R addMerchantCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + xyjService.addMerchantCallback(bdvo, sydId); + return R.ok(); + } + + + + + @RequestMapping("addTaskCallback/{sydId}") + public R addTaskCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + xyjService.addTaskCallback(bdvo, sydId); + return R.ok(); + } + + + + + + @RequestMapping("addSignCallback/{sydId}") + public R addSignCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + xyjService.addSignCallback(bdvo, sydId); + return R.ok(); + } + + + + + /** + * 处理充值回调请求 + * 当用户完成充值后,第三方支付平台会调用此接口通知系统充值结果 + * 该方法负责接收充值回调信息并进行处理 + * + * @param bdvo 包含充值回调数据的请求体,包括但不限于订单号、支付状态等信息 + * @return 返回一个表示操作结果的响应对象,用于告知调用者处理结果 + */ + @RequestMapping("rechargeCallback") + public R rechargeCallback(@RequestBody BaseDataVo bdvo) { + // 调用服务层方法处理充值回调逻辑 + xyjService.rechargeCallback(bdvo); + // 返回操作成功响应 + return R.ok(); + } + + + @RequestMapping("invoiceCallback/{sydId}") + public R invoiceCallback(@RequestBody BaseDataVo bdvo, @PathVariable(value = "sydId", required = true) Long sydId) { + // 调用服务层方法处理充值回调逻辑 + xyjService.invoiceCallback(bdvo,sydId); + // 返回操作成功响应 + return R.ok(); + } + + + + + + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java new file mode 100644 index 0000000..049ed2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/ThirdItemTaskTypes.java @@ -0,0 +1,87 @@ +package org.dromara.payment.thirdPlatform.xinyujian.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 三方平台企业的项目任务类型对象 third_item_task_types + * + * @author LionLi + * @date 2025-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("third_item_task_types") +public class ThirdItemTaskTypes extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * + */ + private String businessId; + + /** + * + */ + private Long parkId; + + /** + * + */ + private String itemType; + + /** + * + */ + private String itemTypeName; + + /** + * + */ + private String taskType; + + /** + * + */ + private String taskTypeName; + + /** + * 发票一级类目名称 + */ + private String invoiceOneName; + + /** + * 发票二级类目名称 + */ + private String invoiceTwoName; + + /** + * 服务类型 + */ + private String serviceType; + + /** + * json + */ + private String deliveries; + + /** + * 是否可用 1是,0否 + */ + private Integer isUse; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java new file mode 100644 index 0000000..1da52f0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/bo/ThirdItemTaskTypesBo.java @@ -0,0 +1,97 @@ +package org.dromara.payment.thirdPlatform.xinyujian.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; + +/** + * 三方平台企业的项目任务类型业务对象 third_item_task_types + * + * @author LionLi + * @date 2025-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ThirdItemTaskTypes.class, reverseConvertGenerate = false) +public class ThirdItemTaskTypesBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String businessId; + + /** + * + */ + @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long parkId; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String itemType; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String itemTypeName; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskType; + + /** + * + */ + @NotBlank(message = "不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taskTypeName; + + /** + * 发票一级类目名称 + */ + @NotBlank(message = "发票一级类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceOneName; + + /** + * 发票二级类目名称 + */ + @NotBlank(message = "发票二级类目名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String invoiceTwoName; + + /** + * 服务类型 + */ + @NotBlank(message = "服务类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String serviceType; + + /** + * json + */ + @NotBlank(message = "json不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deliveries; + + /** + * 是否可用 1是,0否 + */ + @NotNull(message = "是否可用 1是,0否不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java new file mode 100644 index 0000000..982d540 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/domain/vo/ThirdItemTaskTypesVo.java @@ -0,0 +1,100 @@ +package org.dromara.payment.thirdPlatform.xinyujian.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 三方平台企业的项目任务类型视图对象 third_item_task_types + * + * @author LionLi + * @date 2025-03-30 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ThirdItemTaskTypes.class) +public class ThirdItemTaskTypesVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * + */ + @ExcelProperty(value = "") + private String businessId; + + /** + * + */ + @ExcelProperty(value = "") + private Long parkId; + + /** + * + */ + @ExcelProperty(value = "") + private String itemType; + + /** + * + */ + @ExcelProperty(value = "") + private String itemTypeName; + + /** + * + */ + @ExcelProperty(value = "") + private String taskType; + + /** + * + */ + @ExcelProperty(value = "") + private String taskTypeName; + + /** + * 发票一级类目名称 + */ + @ExcelProperty(value = "发票一级类目名称") + private String invoiceOneName; + + /** + * 发票二级类目名称 + */ + @ExcelProperty(value = "发票二级类目名称") + private String invoiceTwoName; + + /** + * 服务类型 + */ + @ExcelProperty(value = "服务类型") + private String serviceType; + + /** + * json + */ + @ExcelProperty(value = "json") + private String deliveries; + + /** + * 是否可用 1是,0否 + */ + @ExcelProperty(value = "是否可用 1是,0否") + private Integer isUse; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java new file mode 100644 index 0000000..4c5e273 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/mapper/ThirdItemTaskTypesMapper.java @@ -0,0 +1,15 @@ +package org.dromara.payment.thirdPlatform.xinyujian.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; + +/** + * 三方平台企业的项目任务类型Mapper接口 + * + * @author LionLi + * @date 2025-03-30 + */ +public interface ThirdItemTaskTypesMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java new file mode 100644 index 0000000..7de412f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IThirdItemTaskTypesService.java @@ -0,0 +1,48 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.bo.ThirdItemTaskTypesBo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; + +import java.util.Collection; +import java.util.List; + +/** + * 三方平台企业的项目任务类型Service接口 + * + * @author LionLi + * @date 2025-03-30 + */ +public interface IThirdItemTaskTypesService { + + /** + * 查询三方平台企业的项目任务类型 + */ + ThirdItemTaskTypesVo queryById(Long id); + + /** + * 查询三方平台企业的项目任务类型列表 + */ + TableDataInfo queryPageList(ThirdItemTaskTypesBo bo, PageQuery pageQuery); + + /** + * 查询三方平台企业的项目任务类型列表 + */ + List queryList(ThirdItemTaskTypesBo bo); + + /** + * 新增三方平台企业的项目任务类型 + */ + Boolean insertByBo(ThirdItemTaskTypesBo bo); + + /** + * 修改三方平台企业的项目任务类型 + */ + Boolean updateByBo(ThirdItemTaskTypesBo bo); + + /** + * 校验并批量删除三方平台企业的项目任务类型信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java new file mode 100644 index 0000000..d1edadc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/IXyjService.java @@ -0,0 +1,144 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.thirdPlatform.base.IBaseBusinessFlowService; +import org.dromara.payment.thirdPlatform.xinyujian.sign.BaseDataVo; +import org.dromara.payment.worker.domain.UserWorker; + +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title IXyjService + * @description + * @create 2025-03-28 14:26 + */ +public interface IXyjService extends IBaseBusinessFlowService { + + + boolean addMerchant(BusMerchant busMerchant, Long sydId); + + boolean createProjectTask(MerTask task, BusMerchant merchant); + + boolean createTask(MerTask task, BusMerchant merchant); + + boolean recruitBatch(MerBill bill, List detailList, BusMerchant merchant, SysSyd syd, + MerTask task); + + boolean recruitOne(MerBill bill); + + boolean settleBatch(MerBill bill, List detailList, SysSyd syd, BusMerchant merchant, MerTask task, + BusMerchantAccount account); + + boolean signFind(BusMerchant merchant, SysSyd syd, UserWorker userWorker); + + boolean applyInvoice(BusMerchant busMerchant, SysSyd syd, MerInvoice invoice); + + /**** + * 企业入驻回调 + * @param bdvo + * @param sydId + * @return + */ + public boolean addMerchantCallback(BaseDataVo bdvo, Long sydId); + + + /**** + * 添加任务审核 + * @param bdvo + * @param sydId + * @return + */ + public boolean addTaskCallback(BaseDataVo bdvo, Long sydId); + + + /**** + * 添加任务审核 + * @param bdvo + * @param sydId + * @return + */ + public boolean addSignCallback(BaseDataVo bdvo, Long sydId); + + + + + + + /*** + * 根据企业id,同步企业任务类型 + * @param businessId + * @return + */ + public boolean synQueryTaskTypes(String businessId, Long sydId); + + + /**** + * 根据企业id,查询企业入驻结果 + * @param businessId + * @param sydId + * @return + */ + public boolean addMerchantResultSel(String businessId,Long sydId); + + + /******* + * 查询税源地信息 + * @param businessId + * @param sydId + * @return + */ + public boolean queryPark(String businessId,Long sydId); + + + /*** + * 查询批量认领的结果 + * @param merchant + * @param syd + * @param task + * @param bill + * @param detail + * @return + */ + public Boolean queryBatchSel(BusMerchant merchant, SysSyd syd, MerTask task, MerBill bill, List detail); + + + /********** + * 结算批量结算的结果查询 + * @param merchant + * @param syd + * @param bill + * @param detail + * @return + */ + public Boolean settleQueryBatchSel(BusMerchant merchant,SysSyd syd,MerBill bill,List detail); + + + /****** + * 充值回调 + * @param bdvo + */ + void rechargeCallback(BaseDataVo bdvo); + + + + public Boolean settleRetreat(BusMerchant merchant,Long sydId,String startTime,String endTime); + + void invoiceCallback(BaseDataVo bdvo, Long sydId); + + /**** + * 完税证明下载 + * @param merchant + * @param syd + * @param month + * @return + */ + public Boolean taxpayDownLoad(BusMerchant merchant,SysSyd syd,String month); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java new file mode 100644 index 0000000..149d919 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/ThirdItemTaskTypesServiceImpl.java @@ -0,0 +1,117 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; +import org.dromara.payment.thirdPlatform.xinyujian.domain.bo.ThirdItemTaskTypesBo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; +import org.dromara.payment.thirdPlatform.xinyujian.mapper.ThirdItemTaskTypesMapper; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 三方平台企业的项目任务类型Service业务层处理 + * + * @author LionLi + * @date 2025-03-30 + */ +@RequiredArgsConstructor +@Service +public class ThirdItemTaskTypesServiceImpl implements IThirdItemTaskTypesService { + + private final ThirdItemTaskTypesMapper baseMapper; + + /** + * 查询三方平台企业的项目任务类型 + */ + @Override + public ThirdItemTaskTypesVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询三方平台企业的项目任务类型列表 + */ + @Override + public TableDataInfo queryPageList(ThirdItemTaskTypesBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询三方平台企业的项目任务类型列表 + */ + @Override + public List queryList(ThirdItemTaskTypesBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(ThirdItemTaskTypesBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getBusinessId()), "business_id", bo.getBusinessId()); + lqw.eq(bo.getParkId() != null, "park_id", bo.getParkId()); + lqw.eq(StringUtils.isNotBlank(bo.getItemType()), "item_type", bo.getItemType()); + lqw.like(StringUtils.isNotBlank(bo.getItemTypeName()), "item_type_name", bo.getItemTypeName()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskType()), "task_type", bo.getTaskType()); + lqw.like(StringUtils.isNotBlank(bo.getTaskTypeName()), "task_type_name", bo.getTaskTypeName()); + lqw.like(StringUtils.isNotBlank(bo.getInvoiceOneName()), "invoice_one_name", bo.getInvoiceOneName()); + lqw.like(StringUtils.isNotBlank(bo.getInvoiceTwoName()), "invoice_two_name", bo.getInvoiceTwoName()); + lqw.eq(StringUtils.isNotBlank(bo.getServiceType()), "service_type", bo.getServiceType()); + lqw.eq(StringUtils.isNotBlank(bo.getDeliveries()), "deliveries", bo.getDeliveries()); + lqw.eq(bo.getIsUse() != null, "is_use", bo.getIsUse()); + return lqw; + } + + /** + * 新增三方平台企业的项目任务类型 + */ + @Override + public Boolean insertByBo(ThirdItemTaskTypesBo bo) { + ThirdItemTaskTypes add = MapstructUtils.convert(bo, ThirdItemTaskTypes.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改三方平台企业的项目任务类型 + */ + @Override + public Boolean updateByBo(ThirdItemTaskTypesBo bo) { + ThirdItemTaskTypes update = MapstructUtils.convert(bo, ThirdItemTaskTypes.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ThirdItemTaskTypes entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除三方平台企业的项目任务类型 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java new file mode 100644 index 0000000..cec7765 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/service/XyjServerImpl.java @@ -0,0 +1,1001 @@ +package org.dromara.payment.thirdPlatform.xinyujian.service; + +import cn.hutool.core.lang.UUID; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.esotericsoftware.kryo.kryo5.minlog.Log; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.dromara.common.core.service.BaseService; +import org.dromara.payment.bill.domain.MerBill; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.invoice.domain.MerInvoice; +import org.dromara.payment.invoice.domain.MerInvoiceDetail; +import org.dromara.payment.invoice.mapper.MerInvoiceDetailMapper; +import org.dromara.payment.invoice.mapper.MerInvoiceMapper; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.BusMerchantAccount; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantAccountService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.payment.sys.domain.bo.SysSydBo; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.sys.service.ISysSydService; +import org.dromara.payment.task.domain.MerTask; +import org.dromara.payment.task.mapper.MerTaskMapper; +import org.dromara.payment.taxRecords.domain.MerTaxRecords; +import org.dromara.payment.taxRecords.domain.vo.MerTaxRecordsVo; +import org.dromara.payment.taxRecords.mapper.MerTaxRecordsMapper; +import org.dromara.payment.thirdPlatform.base.domain.SysThirdPlatform; +import org.dromara.payment.thirdPlatform.base.mapper.SysThirdPlatformMapper; +import org.dromara.payment.thirdPlatform.xinyujian.config.XyjConfig; +import org.dromara.payment.thirdPlatform.xinyujian.domain.ThirdItemTaskTypes; +import org.dromara.payment.thirdPlatform.xinyujian.domain.bo.ThirdItemTaskTypesBo; +import org.dromara.payment.thirdPlatform.xinyujian.domain.vo.ThirdItemTaskTypesVo; +import org.dromara.payment.thirdPlatform.xinyujian.mapper.ThirdItemTaskTypesMapper; +import org.dromara.payment.thirdPlatform.xinyujian.sign.BaseDataVo; +import org.dromara.payment.thirdPlatform.xinyujian.sign.MyRSA; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title XyjServerImpl + * @description + * @create 2025-03-28 14:27 + */ + +@Slf4j +@Data +@Service +public class XyjServerImpl extends BaseService implements IXyjService { + + @Resource + public SysThirdPlatformMapper sysThirdPlatformMapper; + + @Resource + public ThirdItemTaskTypesMapper thirdItemTaskTypesMapper; + + @Resource + public UserWorkerBusinessMapper userWorkerBusinessMapper; + + @Resource + public MerBillDetailMapper merBillDetailMapper; + + @Resource + public MerInvoiceDetailMapper merInvoiceDetailMapper; + + @Resource + public SysSydMapper sysSydMapper; + + @Resource + public MerInvoiceMapper merInvoiceMapper; + + @Resource + public UserWorkerMapper userWorkerMapper; + + @Resource + public MerTaskMapper merTaskMapper; + + @Resource + public BusMerchantMapper busMerchantMapper; + + @Resource + public ISysSydService sysSydService; + + @Resource + public IBusMerchantAccountService busMerchantAccountService; + + @Resource + public IThirdItemTaskTypesService thirdItemTaskTypesService;; + + @Resource + public MerTaxRecordsMapper merTaxRecordsMapper; + + @Override + public boolean addMerchant(BusMerchant busMerchant,Long sydId) { + XyjConfig config = this.getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("companyName", busMerchant.getName()); + //企业社会统一信用代码 + data.put("creditCode", busMerchant.getName()); + //企业地址 + data.put("companyAddr", busMerchant.getName()); + //企业电话 + data.put("companyMobile", busMerchant.getName()); + //灵活用工场景编码 + data.put("serviceTypeId", busMerchant.getName()); + //注册资本(单位:万 + //元) + data.put("registeredAssets", busMerchant.getName()); + //注册时间 + data.put("regdate", busMerchant.getName()); + //企业开户行 + data.put("bankName", busMerchant.getName()); + //企业银行账户 + data.put("bankAcct", busMerchant.getName()); + //企业联系人 + data.put("contactName", busMerchant.getName()); + //企业联系人手机号 + data.put("contactMobile", busMerchant.getName()); + //法人姓名 + data.put("legalPersonName", busMerchant.getName()); + //法人身份证号 + data.put("idNo", busMerchant.getName()); + //营业执照照片 + data.put("businessLicense", busMerchant.getName()); + //基本存款账号信息表 + data.put("accountLicense", busMerchant.getName()); + //办公场地门头照 + //注册时间小于6个月必传 + data.put("houseNumberImg", busMerchant.getName()); + //办公场地场所照 + //注册时间小于6个月必传 + data.put("officeSpaceImg", busMerchant.getName()); + //办公场地前台照 + //注册时间小于6个月必传 + data.put("receptionImg", busMerchant.getName()); + //入驻回调通知URL + data.put("callBackUrl", busMerchant.getName()); + //来账通知回调地址 + data.put("bookedNoticeUrl", busMerchant.getName()); + //短信签约回调地址 用户 + //签约成功后通过该地址 + //回调 + data.put("SignChangeNoticeUrl", busMerchant.getName()); + String paramStr = JSON.toJSONString(data); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), paramStr); + log.info("企业注入新遇见平台,参数:{}", paramStr); + log.info("企业注入新遇见平台,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/company/register",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("企业注入新遇见平台,result:{}", JSON.toJSONString(vo)); + + JSONObject resultJson = (JSONObject)vo.getData(); + if(resultJson != null){ + String status = resultJson.getString("status"); + String businessId = resultJson.getString("businessId"); + BusMerchant busMerchant1 = new BusMerchant(); + busMerchant1.setBusinessId(businessId); + busMerchant1.setId(busMerchant.getId()); + busMerchant1.setBusinessStatus(status); + this.busMerchantMapper.updateById(busMerchant1); + if("11".equals(status)){ + this.addMerchantResultSel(businessId, sydId); + } + } + + return true; + } + + + + + + @Override + public boolean createProjectTask(MerTask task,BusMerchant merchant) { + XyjConfig config = this.getXyjAppInfo(task.getSydId()); + SysSyd sysSyd = sysSydMapper.selectSysSydById(task.getSydId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",merchant.getBusinessId()); + jsonObject.put("parkId",sysSyd.getParkId()); + jsonObject.put("itemTitle",task.getName()); + jsonObject.put("itemTypeId",task.getItemTypeId()); + jsonObject.put("commissionType","04"); + jsonObject.put("commissionLow",task.getCost()); + jsonObject.put("commissionHigh",task.getCostMax()); + jsonObject.put("itemPeriod","04"); + jsonObject.put("checkRequire","02"); + List taskObjectList = new ArrayList<>(); + JSONObject taskObject = new JSONObject(); + taskObject.put("taskTitle",task.getName()); + taskObject.put("taskTypeId",task.getTaskTypeId()); + taskObject.put("commissionType","01"); + taskObject.put("commissionLow",task.getCost()); + taskObject.put("commissionHigh",task.getCostMax()); + taskObject.put("taskPeriod","04"); + taskObject.put("checkRequire","02"); + taskObject.put("deliveryType","2"); + taskObjectList.add(taskObject); + jsonObject.put("taskInfo",taskObjectList); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + log.info("企业注入新遇见平台创建项目和任务,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/item/create",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("企业注入新遇见平台创建项目和任务,result:{}", JSON.toJSONString(vo)); + + if(!this.checkSuccess(vo)){ + throw new RuntimeException("创建项目失败"); + } + JSONObject resultJson = (JSONObject)vo.getData(); + if(resultJson != null){ + String itemId = resultJson.getString("itemId"); + JSONArray taskInfo = resultJson.getJSONArray("taskInfo"); + if(taskInfo != null){ + String taskId = ((JSONObject)taskInfo.get(0)).getString("taskId"); + MerTask merTask = new MerTask(); + merTask.setId(task.getId()); + merTask.setTaskId(taskId); + merTask.setItemId(itemId); + this.merTaskMapper.updateById(merTask); + }else{ + throw new RuntimeException("创建任务失败"); + } + } + return true; + } + + @Override + public boolean createTask(MerTask task,BusMerchant merchant) { + return false; + } + + @Override + public boolean recruitBatch(MerBill bill, List detailList, BusMerchant merchant, SysSyd syd, + MerTask task) { + XyjConfig config = this.getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",merchant.getBusinessId()); + jsonObject.put("taskId",task.getTaskId()); + jsonObject.put("outBatchNo",bill.getId()); + jsonObject.put("total",detailList.size()); + List freelancers = new ArrayList<>(); + for(MerBillDetail detail : detailList){ + JSONObject detailObj = new JSONObject(); + detailObj.put("outSeqNo",detail.getId()); + detailObj.put("name",detail.getWorkerName()); + detailObj.put("idno",detail.getCardId()); + detailObj.put("mobile",detail.getWorkerPhone()); + freelancers.add(detailObj); + } + + jsonObject.put("freelancers",freelancers); + + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + Log.info("企业新遇见平台任务认领,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/recruitBatch",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + return false; + } + + @Override + public boolean recruitOne(MerBill bill) { + return false; + } + + @Override + public boolean settleBatch(MerBill bill, List detailList, SysSyd syd, BusMerchant merchant, MerTask task, + BusMerchantAccount account) { + + XyjConfig config = this.getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",merchant.getBusinessId()); + jsonObject.put("taskId",task.getTaskId()); + jsonObject.put("acctNo",account.getBankVirtualCard()); + jsonObject.put("outBatchNo",bill.getId()); + jsonObject.put("totalSettleFee",bill.getMoney()); + jsonObject.put("total",detailList.size()); + List freelancers = new ArrayList<>(); + detailList.forEach(item -> { + JSONObject detailObj = new JSONObject(); + detailObj.put("outSeqNo",item.getId()); + detailObj.put("name",item.getWorkerName()); + detailObj.put("idno",item.getCardId()); + detailObj.put("acctNo",item.getBankCard()); + detailObj.put("settleFee",item.getAmount()); + freelancers.add(detailObj); + }); + jsonObject.put("freelancers",freelancers); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + Log.info("企业新遇见平台批量结算,加密后信息:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/settleBatch",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("企业新遇见平台批量结算,result:{}", JSON.toJSONString(vo)); + if (!this.checkSuccess(vo)){ + throw new RuntimeException("提交薪遇见结算失败"); + } + return true; + } + + @Override + public boolean signFind(BusMerchant merchant, SysSyd syd, UserWorker userWorker) { + + XyjConfig config = this.getXyjAppInfo(syd.getId()); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("idNo", userWorker.getCardId()); + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + log.info("签约查询:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/signFind ",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + if(vo.getData() != null ){ + JSONObject resultJson = (JSONObject)vo.getData(); + String sign = resultJson.getString("sign"); + String signUrl = resultJson.getString("signUrl"); + String signDownloadUrl = resultJson.getString("signDownloadUrl"); + if("1".equals(sign)){ + //已签约 + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId, userWorker.getId()) + .eq(UserWorkerBusiness::getSydId, syd.getId()) + .set(UserWorkerBusiness::getSignStatus, 1) + .set(UserWorkerBusiness::getSignFileUrl, signDownloadUrl) + ); + }else if("0".equals(sign)){ + //未签约 + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId, userWorker.getId()) + .eq(UserWorkerBusiness::getSydId, syd.getId()) + .set(UserWorkerBusiness::getSignStatus, 0) + .set(UserWorkerBusiness::getSignUrl, signUrl) + ); + } + } + return true; + } + + @Override + public boolean applyInvoice(BusMerchant busMerchant, SysSyd syd, MerInvoice invoice) { + XyjConfig config = this.getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId",busMerchant.getBusinessId()); + jsonObject.put("outOrderNo",invoice.getId()); + jsonObject.put("parkId",syd.getParkId()); + jsonObject.put("oneObjectName",invoice.getCategoryOne()); + jsonObject.put("twoObjectName",invoice.getCategoryTwo()); + jsonObject.put("invoiceTotalFee",invoice.getInvAmount()); + //增值税普通发票 1 增值税专用发票 2 增值税普通电子发票 3 增值税专用电子发票 4 + jsonObject.put("invoiceType",invoice.getType().intValue() == 1 ? 2: 1); + jsonObject.put("invoiceAddress",busMerchant.getName()); + jsonObject.put("invoicePhone",invoice.getAddPhone()); + jsonObject.put("invoiceAcctNo",invoice.getBankCard()); + jsonObject.put("invoiceBankName",invoice.getBankAddress()); + jsonObject.put("callBackUrl","");//回调地址 + + String sendMsg = createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(),JSON.toJSONString(jsonObject)); + log.info("申请发票:{}",sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/invoice/apply",sendMsg); + BaseDataVo vo = decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("申请发票,result:{}", JSON.toJSONString(vo)); + if(!this.checkSuccess(vo)){ + throw new RuntimeException("开票失败"); + } + return true; + } + + + /** + * 组装发送消息体 + * 该方法用于创建一个发送消息的请求体,包括必要的头部信息和加密签名的数据 + * + * @param appId 应用ID,用于标识消息的发送方 + * @param otherPublicKey 对方的公钥,用于加密数据 + * @param myPrivateKey 我方的私钥,用于生成签名 + * @param data 需要发送的原始数据 + * @return 返回组装好的、经过加密和签名的消息体的JSON字符串 + */ + private String createSendMsg(String appId, String otherPublicKey, String myPrivateKey, String data) { + // 创建一个基础数据对象,用于承载发送消息所需的所有信息 + BaseDataVo vo = new BaseDataVo(); + // 设置应用ID + vo.setAppid(appId); + // 生成一个20位的随机字符串作为nonceStr,用于防止重放攻击 + vo.setNonceStr(RandomStringUtils.randomAlphanumeric(20)); + // 生成一个唯一的请求消息ID + vo.setReqMsgId(UUID.randomUUID().toString().replace("-", "")); + // 设置签名类型为RSA + vo.setSignType("RSA"); + // 设置当前时间戳 + vo.setTimestamp(String.valueOf(System.currentTimeMillis())); + + try { + // 使用对方的公钥加密原始数据 + String encryptData = MyRSA.encryptByPublicKey(data, otherPublicKey); + // 将加密后的数据设置到请求体中 + vo.setData(encryptData); + // 使用我方的私钥对请求体进行签名 + String signData = MyRSA.sign(JSON.toJSONString(vo), myPrivateKey); + // 将签名设置到请求体中 + vo.setSign(signData); + } catch (Exception e) { + // 如果加密或签名过程中发生异常,记录错误日志并抛出运行时异常 + log.error("薪遇见加密签名异常" + appId + "\n" + e.toString()); + throw new RuntimeException(e); + } + + // 返回组装好的请求体的JSON字符串形式 + return JSON.toJSONString(vo); + } + + + + /** + * 使用公钥解密并验证数据的完整性 + * 该方法首先将输入的数据字符串解析为BaseDataVo对象,然后验证签名并解密数据 + * + * @param publicKey 公钥,用于验证签名 + * @param privateKey 私钥,用于解密数据 + * @param data 加密的数据字符串 + * @return 解密并验证后的BaseDataVo对象 + */ + public BaseDataVo decryptAndVerify(String publicKey, String privateKey, String data) { + // 将数据字符串解析为BaseDataVo对象 + BaseDataVo vo = (BaseDataVo) JSONObject.parseObject(data, BaseDataVo.class); + // 获取签名数据,并移除以便验证签名 + String signData = vo.getSign(); + vo.setSign(null); + try { + // 验证签名是否有效 + boolean verify = MyRSA.verify(JSON.toJSONString(vo), publicKey, signData); + vo.setVerify(Boolean.valueOf(verify)); + // 如果签名有效且数据不为空,则解密数据 + if (verify && vo.getData() != null) { + String decrypt = MyRSA.decryptByPrivateKey(JSON.toJSONString(vo.getData()), privateKey); + vo.setData(decrypt); + } + } catch (Exception e) { + // 记录验证或解密过程中的错误 + log.error("薪遇见验签解密失败:" + e.getMessage()); + e.printStackTrace(); + } + // 返回处理后的BaseDataVo对象 + return vo; + } + + + /** + * 使用公钥解密并验证数据的完整性 + * 该方法首先将输入的数据字符串解析为BaseDataVo对象,然后验证签名并解密数据 + * + * @param publicKey 公钥,用于验证签名 + * @param privateKey 私钥,用于解密数据 + * @param vo 返回数据对象 + * @return 解密并验证后的BaseDataVo对象 + */ + public BaseDataVo decryptAndVerify(String publicKey, String privateKey, BaseDataVo vo) { + // 将数据字符串解析为BaseDataVo对象 + // 获取签名数据,并移除以便验证签名 + String signData = vo.getSign(); + vo.setSign(null); + try { + // 验证签名是否有效 + boolean verify = MyRSA.verify(JSON.toJSONString(vo), publicKey, signData); + vo.setVerify(Boolean.valueOf(verify)); + // 如果签名有效且数据不为空,则解密数据 + if (verify && vo.getData() != null) { + String decrypt = MyRSA.decryptByPrivateKey(JSON.toJSONString(vo.getData()), privateKey); + vo.setData(decrypt); + } + } catch (Exception e) { + // 记录验证或解密过程中的错误 + log.error("薪遇见验签解密失败:" + e.getMessage()); + e.printStackTrace(); + } + // 返回处理后的BaseDataVo对象 + return vo; + } + + + /** + * 检查操作是否成功 + * 通过检查传入的BaseDataVo对象是否为非空且其code属性是否为"200"来判断操作是否成功 + * @param vo BaseDataVo对象,包含操作结果信息 + * @return 如果操作成功,则返回true;否则返回false + */ + public Boolean checkSuccess(BaseDataVo vo) { + // 检查vo对象是否为非空且其code属性是否为"200" + if(vo != null && "200".equals(vo.getCode())) + // 如果条件满足,表示操作成功,返回true + return Boolean.valueOf(true); + // 如果条件不满足,表示操作未成功,返回false + return Boolean.valueOf(false); + } + + + /** + * 根据第三方平台ID获取XYJ应用信息 + * 此方法用于从数据库中查询特定第三方平台的应用信息,并将其解析为XyjConfig对象 + * 如果找不到对应的信息,则抛出异常 + * + * @param sydId 税地ID,用于查询特定的应用信息 + * @return XyjConfig对象,包含解析后的应用信息 + */ + private XyjConfig getXyjAppInfo(Long sydId){ + + // 查询第三方平台应用信息 + SysThirdPlatform sysThirdPlatform = this.sysThirdPlatformMapper.selectThirdAppInfo(sydId); + + // 如果未找到对应的信息,抛出异常 + if(sysThirdPlatform == null){ + this.invalidationParamsException("未找到对应的第三方平台信息"); + } + // 可以加上redis进行缓存 + // 将查询到的信息解析为XyjConfig对象 + XyjConfig xyjConfig = JSONObject.parseObject(sysThirdPlatform.getOtherParams(), XyjConfig.class); + if(xyjConfig == null){ + this.invalidationParamsException("第三方平台配置信息无效"); + } + xyjConfig.setId(sysThirdPlatform.getId()); + // 返回解析后的配置信息 + return xyjConfig; + } + + + @Override + @Transactional + public boolean addMerchantCallback(BaseDataVo bdvo, Long sydId) { + log.info("企业注入新遇见平台回调,result:{}", JSON.toJSONString(bdvo)); + XyjConfig config = getXyjAppInfo(sydId); + + this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), bdvo); + if(!bdvo.getVerify()){ + throw new RuntimeException("验签失败"); + } + JSONObject data = (JSONObject)bdvo.getData(); + if(data == null){ + throw new RuntimeException("无数据"); + } + addMerResultDealWidth(data, config); + return true; + } + + @Override + public boolean addTaskCallback(BaseDataVo bdvo, Long sydId) { + log.info("企业任务审核新遇见平台回调,result:{}", JSON.toJSONString(bdvo)); + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = (JSONObject)bdvo.getData(); + if (data != null){ + String taskId = data.getString("taskId"); + String status = data.getString("status"); + Integer syd_verify_status = null; + if("04".equals(status)){ + //审核拒绝 + syd_verify_status = 2; + }else if("03".equals(status)){ + //审核通过 + syd_verify_status = 3; + } + if(syd_verify_status != null){ + this.merTaskMapper.update(new LambdaUpdateWrapper().eq(MerTask::getId,taskId) + .set(MerTask::getSydVerifyStatus,syd_verify_status)); + } + }else{ + throw new RuntimeException("无效数据"); + } + return true; + } + + @Override + public boolean addSignCallback(BaseDataVo bdvo, Long sydId) { + log.info("签约平台回调,result:{}", JSON.toJSONString(bdvo)); + JSONObject jsonObject = (JSONObject)bdvo.getData(); + if (jsonObject != null){ + String idNo = jsonObject.getString("idNo"); + String hasSign = jsonObject.getString("hasSign");//0-未签约,1-已签约,2-已解约 + String viewContractUrl = jsonObject.getString("viewContractUrl"); + String downloadContractUrl = jsonObject.getString("downloadContractUrl"); + + UserWorkerVo userWorkerVO = this.userWorkerMapper.selectVoOne(new LambdaQueryWrapper().eq(UserWorker::getCardId,idNo)); + if(userWorkerVO != null){ + if("0".equals(hasSign)){ + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId,userWorkerVO.getId()) + .eq(UserWorkerBusiness::getSydId,sydId) + .set(UserWorkerBusiness::getSignStatus,0) + .set(UserWorkerBusiness::getSignUrl,viewContractUrl) + ); + + + }else if("1".equals(hasSign)){ + this.userWorkerBusinessMapper.update(new LambdaUpdateWrapper() + .eq(UserWorkerBusiness::getWorkId,userWorkerVO.getId()) + .eq(UserWorkerBusiness::getSydId,sydId) + .set(UserWorkerBusiness::getSignStatus,1) + .set(UserWorkerBusiness::getSignFileUrl,downloadContractUrl) + ); + } + } + } + return true; + } + + /**** + * 入驻结果处理 + * @param data + * @param config + */ + private void addMerResultDealWidth(JSONObject data, XyjConfig config) { + //企业ID + String businessId = data.getString("businessId"); + String companyName = data.getString("companyName"); + //审核状态 + //00-暂存,01-提交风控审核,02-风控拒绝,待 + //运营审核,03-无效(关闭), + //04-提交运营审核,05-运营审核拒绝,10-待配 + //置参数,11-准入成功 + String status = data.getString("status"); + + this.busMerchantMapper.update(new LambdaUpdateWrapper().eq(BusMerchant::getBusinessId,businessId) + .set(BusMerchant::getBusinessStatus,status)); + + if("11".equals(status)){ + //准入成功 + JSONArray acctInfo = data.getJSONArray("acctInfo"); + if(acctInfo != null){ + SysSydBo sysSydBo = new SysSydBo(); + sysSydBo.setThreeId(config.getId()); + List sydList = this.sysSydService.queryList(sysSydBo); + acctInfo.forEach(item->{ + JSONObject acct = (JSONObject)item; + String acctNo = acct.getString("acctNo");//银行卡号 + String acctName = acct.getString("acctName");//账户名 + String parkName = acct.getString("parkName");//税源地名称 + Long parkId = acct.getLong("parkId");//税源地 Id + Long limitAmount = acct.getLong("limitAmount");//单笔最大限额(整数,单位:分) + String bankName = acct.getString("bankName");//银行名称 + String zfCode = acct.getString("zfCode");//支付通道编码 + sydList.forEach(syd->{ + if(syd.getGsmc().equals(parkName)){ + if(syd.getParkId() == null){ + //绑定税源地 + SysSydBo sydBo = new SysSydBo(); + sydBo.setId(syd.getId()); + sydBo.setParkId(parkId); + this.sysSydService.updateByBo(sydBo); + //添加税源地企业银行账号 + } + this.busMerchantAccountService.createThirdXnAccount(syd.getId(),Long.valueOf(businessId),companyName,bankName,acctNo,acctName); + } + }); + }); + } + } + } + + + /*********** + * 根据企业id,同步企业任务类型 + * @param businessId + * @return + */ + @Override + public boolean synQueryTaskTypes(String businessId, Long sydId) { + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("businessId", businessId); + log.info("同步企业[{}]任务类型:", businessId); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), data.toJSONString()); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/baseInfo/queryTaskTypes",sendMsg); + BaseDataVo bdvo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("同步企业[{}]任务类型:{}", businessId, JSON.toJSONString(bdvo)); + + return true; + } + + @Override + public boolean addMerchantResultSel(String businessId, Long sydId) { + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("businessId", businessId); + log.info("查询企业[{}]入驻结果:", businessId); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), data.toJSONString()); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/company/queryCompanyInfo",sendMsg); + BaseDataVo bdvo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("查询企业[{}]入驻结果:{}", businessId, JSON.toJSONString(bdvo)); + this.addMerResultDealWidth((JSONObject)bdvo.getData(), config); + return true; + } + + @Override + public boolean queryPark(String businessId, Long sydId) { + + XyjConfig config = getXyjAppInfo(sydId); + JSONObject data = new JSONObject(); + //企业名称 + data.put("businessId", businessId); + log.info("查询企业[{}]的税源地信息:", businessId); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), data.toJSONString()); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/baseInfo/queryParks",sendMsg); + BaseDataVo bdvo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + log.info("查询企业[{}]的税源地信息结果:{}", businessId, JSON.toJSONString(bdvo)); + JSONObject dataObj = (JSONObject)bdvo.getData(); + if(dataObj != null){ + String parkId = dataObj.getString("parkId");//税源地 Id + ThirdItemTaskTypesBo itemTaskTypesBo = new ThirdItemTaskTypesBo(); + itemTaskTypesBo.setParkId(Long.valueOf(parkId)); + List itemTaskList = this.thirdItemTaskTypesService.queryList(itemTaskTypesBo); + if(!itemTaskList.isEmpty()){ + return true; + } + String parkName = dataObj.getString("parkName");//税源地名称 + JSONArray itemType = dataObj.getJSONArray("itemType");//项目类型 + List itemTaskTypess = new ArrayList<>(); + if(itemType != null){ + itemType.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + ThirdItemTaskTypes tTaskTypes = new ThirdItemTaskTypes(); + tTaskTypes.setParkId(Long.valueOf(parkId)); + String itemTypeId = itemObj.getString("itemTypeId");//项目类型编号 + String itemTypeName = itemObj.getString("itemTypeName");//项目类型名称 + String invoiceOneObjectName = itemObj.getString("invoiceOneObjectName");//一级开票类目 + tTaskTypes.setItemType(itemTypeId); + tTaskTypes.setItemTypeName(itemTypeName); + tTaskTypes.setInvoiceOneName(invoiceOneObjectName); + JSONArray taskType = itemObj.getJSONArray("taskType");//任务类型 + if(taskType != null){ + taskType.forEach(task->{ + JSONObject taskObj = (JSONObject)task; + String taskTypeId = taskObj.getString("taskTypeId");//任务类型编号 + String taskTypeName = taskObj.getString("taskTypeName");//任务类型名称 + String invoiceTwoObjectName = taskObj.getString("invoiceTwoObjectName");//一级开票类目*二级开票类目 + tTaskTypes.setTaskType(taskTypeId); + tTaskTypes.setTaskTypeName(taskTypeName); + tTaskTypes.setInvoiceTwoName(invoiceTwoObjectName); + }); + } + itemTaskTypess.add(tTaskTypes); + }); + if(!itemTaskTypess.isEmpty()){ + this.thirdItemTaskTypesMapper.insertBatch(itemTaskTypess); + } + } + } + return true; + } + + @Override + public Boolean queryBatchSel(BusMerchant merchant, SysSyd syd, MerTask task, MerBill bill, List detail) { + + XyjConfig config = getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("taskType", task.getTaskId()); + jsonObject.put("outBatchNo",bill.getId()); + + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("查询任务认领参数:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/recruit/queryBatch",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + if(vo.getData() != null){ + JSONObject resultJSON = (JSONObject)vo.getData(); + JSONArray array = resultJSON.getJSONArray("rows"); + detail.forEach(item->{ + array.forEach(row->{ + JSONObject rowObj = (JSONObject)row; + String idno = rowObj.getString("idno"); + String status = rowObj.getString("status");//1-认领成功,0-认领失败 + String msg = rowObj.getString("msg");//认领失败原因 + if(item.getCardId().equals(idno)){ + if("1".equals(status)){ + this.merBillDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId,item.getId()) + .set(MerBillDetail::getThridRecruit,1) + ); + }else if("0".equals(status)){ + this.merBillDetailMapper.update(new LambdaUpdateWrapper() + .eq(MerBillDetail::getId,item.getId()) + .set(MerBillDetail::getThridRecruit,0) + .set(MerBillDetail::getThridRecruitReason,msg) + ); + } + } + }); + }); + } + return true; + } + + @Override + public Boolean settleQueryBatchSel(BusMerchant merchant, SysSyd syd, MerBill bill, List detail) { + XyjConfig config = getXyjAppInfo(syd.getId()); + + JSONObject jsonObject = new JSONObject(); + + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("outBatchNo",bill.getId()); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("查询结算参数:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/settle/queryBatch",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("查询结算结果:{}", JSON.toJSONString(vo)); + if(vo.getData() != null){ + JSONObject resultJSON = (JSONObject)vo.getData(); + JSONArray freelancers = resultJSON.getJSONArray("freelancers"); + freelancers.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + String outSeqNo = itemObj.getString("outSeqNo");// + String seqNo = itemObj.getString("seqNo");//seqNo + Long settleFee = itemObj.getLong("settleFee");//结算金额 + Long serviceFee = itemObj.getLong("serviceFee");//服务费 + String status = itemObj.getString("status");//支付状态 0-失败,1-成功,2-支付中 + String msg = itemObj.getString("msg");//失败原因 + String remark = itemObj.getString("remark");//备注 + String payTime = itemObj.getString("payTime");//支付时间yyyy-MM-dd HH:mm:ss + + //业务处理 + + + }); + + } + return true; + } + + @Override + public void rechargeCallback(BaseDataVo bdvo) { + Log.info("充值回调:{}", JSON.toJSONString(bdvo)); + + if(bdvo.getData() != null){ + JSONObject jsonObject = (JSONObject)bdvo.getData(); + String businessId = jsonObject.getString("businessId");//商户编号 + String acctNo = jsonObject.getString("acctNo");//商户号 + Long dealFee = jsonObject.getLong("dealFee");//充值金额 + //01 充值 //02 提现 03 结算服务费 04 结算佣金 06 异名充值 08 发放退款 14 结算银行退汇 + String dealType = jsonObject.getString("dealType");//入账类型 + String dealTime = jsonObject.getString("dealTime");//入账时间 + String counterpartyAcctNo = jsonObject.getString("counterpartyAcctNo");//对方账号 + String counterpartyAcctName = jsonObject.getString("counterpartyAcctName");//对方账户名称 + String counterpartyBankName = jsonObject.getString("counterpartyBankName");//对方银行名称 + String dealId = jsonObject.getString("dealId");//交易流水号 + Long parkId = jsonObject.getLong("parkId"); + String parkName = jsonObject.getString("parkName");//税源地名称 + String remark = jsonObject.getString("remark");//备注 + //业务处理 + } + } + + @Override + public Boolean settleRetreat(BusMerchant merchant,Long sydId,String startTime,String endTime) { + + XyjConfig config = getXyjAppInfo(sydId); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("startDate",startTime); + jsonObject.put("endDate",endTime); + + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("当零工有退款或者银行退汇等退票情况时进行查询:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/settle/queryRetreat",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("当零工有退款或者银行退汇等退票情况时进行查询 result:{}", JSON.toJSONString(vo)); + if(vo.getData() != null){ + JSONArray resultJSONArray = (JSONArray)vo.getData(); + + resultJSONArray.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + Long parkId = itemObj.getLong("parkId"); + String businessId = itemObj.getString("businessId");//企业编码 + String acctNo = itemObj.getString("acctNo");//支付账户 + String outBatchNo = itemObj.getString("outBatchNo");//原批次号 + String outSeqNo = itemObj.getString("outSeqNo");//原批次内序号 + Integer type = itemObj.getInteger("type");//类型1退款2退汇 + String idNo = itemObj.getString("idNo"); + String bankNo = itemObj.getString("bankNo"); + String msg = itemObj.getString("msg"); + String refundTime = itemObj.getString("refundTime"); + Long settleFee = itemObj.getLong("settleFee");//退回金额(单位分,负数) + Long serviceFee = itemObj.getLong("serviceFee");//服务费 + String serviceRate = itemObj.getString("serviceRate");//服务费率(小数) + + //处理业务 + + }); + + } + + + + return null; + } + + @Override + @Transactional + public void invoiceCallback(BaseDataVo bdvo, Long sydId) { + Log.info("发票回调:{}", JSON.toJSONString(bdvo)); + if(bdvo.getData() != null){ + JSONObject jsonObject = (JSONObject)bdvo.getData(); + String outOrderNo = jsonObject.getString("outOrderNo");//商户订单号 + Long invoiceTotalFee = jsonObject.getLong("invoiceTotalFee");//发票申请单号 + //状态 01-待审核,02-审核通过(待开票),03-驳回作废,04-已开票,05-作废重开 06-待开票,已申请在线开票,07-已撤回 + String status = jsonObject.getString("status");//发票状态 0-失败,1-成功,2-支付中 + String message = jsonObject.getString("message"); + if("02".equals(status)){ + this.merInvoiceMapper.update(new LambdaUpdateWrapper() + .eq(MerInvoice::getId,Long.valueOf(outOrderNo)) + .set(MerInvoice::getStatus,1)); + }else if("04".equals(status)){ + + JSONArray invoices = jsonObject.getJSONArray("invoices"); + this.merInvoiceMapper.update(new LambdaUpdateWrapper() + .eq(MerInvoice::getId,Long.valueOf(outOrderNo)) + .set(MerInvoice::getStatus,2)); + List invoiceDetailsList = new ArrayList<>(); + invoices.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + String invoiceTotalFee1 = itemObj.getString("invoiceTotalFee"); + String invoiceUrl = itemObj.getString("invoiceUrl"); + String invoiceNum = itemObj.getString("invoiceNum"); + MerInvoiceDetail invoiceDetail = new MerInvoiceDetail(); + invoiceDetail.setInvId(Long.valueOf(outOrderNo)); + invoiceDetail.setInvAmount(new BigDecimal(invoiceTotalFee1).multiply(new BigDecimal("100")).longValue()); + invoiceDetail.setAddTime(new Date()); + invoiceDetail.setDetailNo(invoiceNum); + invoiceDetail.setInvPic(invoiceUrl); + invoiceDetailsList.add(invoiceDetail); + }); + + if(!invoiceDetailsList.isEmpty()){ + this.merInvoiceDetailMapper.insertBatch(invoiceDetailsList); + } + + }else if("03".equals(status)){ + this.merInvoiceMapper.update(new LambdaUpdateWrapper() + .eq(MerInvoice::getId,Long.valueOf(outOrderNo)) + .set(MerInvoice::getStatus,4) + .set(MerInvoice::getCancelReason,message)); + } + } + } + + @Override + public Boolean taxpayDownLoad(BusMerchant merchant, SysSyd syd, String month) { + + List recordList = this.merTaxRecordsMapper.selectVoList(new LambdaQueryWrapper() + .eq(MerTaxRecords::getMerId,merchant.getId()) + .eq(MerTaxRecords::getMonth,month)); + if(recordList.isEmpty()){ + return true; + } + XyjConfig config = getXyjAppInfo(syd.getId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("businessId", merchant.getBusinessId()); + jsonObject.put("date",month); + String sendMsg = this.createSendMsg(config.getAppid(), config.getOtherPublicKey(), config.getMyPrivateKey(), jsonObject.toJSONString()); + Log.info("下载完税证明:{}", sendMsg); + String result = HttpUtil.post(config.getBaseUrl()+"/interface/taxpay/proveInfo",sendMsg); + BaseDataVo vo = this.decryptAndVerify(config.getOtherPublicKey(), config.getMyPrivateKey(), result); + Log.info("下载完税证明 result:{}", JSON.toJSONString(vo)); + if(vo.getData() != null){ + JSONArray resultJSONArray = (JSONArray)vo.getData(); + resultJSONArray.forEach(item->{ + JSONObject itemObj = (JSONObject)item; + String parkName = itemObj.getString("parkName"); + String invoiceUrl = itemObj.getString("invoiceUrl"); + for(MerTaxRecordsVo record:recordList){ + SysSyd syd1 = this.sysSydMapper.selectById(record.getSydId()); + if(parkName.equals(syd1.getGsmc())){ + this.merTaxRecordsMapper.update(new LambdaUpdateWrapper() + .eq(MerTaxRecords::getId,record.getId()) + .set(MerTaxRecords::getTaxFile,invoiceUrl) + .set(MerTaxRecords::getTaxStatus,1)); + } + } + }); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java new file mode 100644 index 0000000..169b3c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/BaseDataVo.java @@ -0,0 +1,70 @@ +package org.dromara.payment.thirdPlatform.xinyujian.sign; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author rysc + * @title: BaseDataVo + * @description: TODO + * @date 2022-03-03 11:15 + */ +@Data +public class BaseDataVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 签名 + */ + private String sign; + /** + * 签名类型 + */ + private String signType; + /** + * 时间戳 + */ + private String timestamp; + /** + * 随机字符串 + */ + private String nonceStr; + /** + * 请求id + */ + private String reqMsgId; + /** + * 平台编码 + */ + private String appid; + /** + * 响应码 + */ + private String code; + /** + * 信息 + */ + private String message; + /** + * 业务数据 + */ + private Object data; + + private String rawData; + /** + * 验签成功/失败 + */ + private Boolean verify; + + + public static void main(String[] args) { + + + + + + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java new file mode 100644 index 0000000..406c01a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MD5Utils.java @@ -0,0 +1,170 @@ +package org.dromara.payment.thirdPlatform.xinyujian.sign; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.Random; +import java.util.UUID; + +public class MD5Utils { + /** + * 获取MD5 随机字符串 + * @return + * @throws Exception + */ + public static String genKeyPair() throws Exception { + return UUID.randomUUID().toString().replace("-", ""); + } + + /** + * + * @param md5Secret 密钥 + * @param noticeStr 随机码 + * @param timestamp 事件搓 + * @return + * @throws Exception + */ + public static String sign(String md5Secret, String noticeStr,String timestamp) throws Exception { + String password = md5Secret+noticeStr +timestamp; + // 生成一个16位的随机数 + Random random =new Random(); + StringBuilder sBuilder =new StringBuilder(16); + sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999)); + int len = sBuilder.length(); + if (len <16) { + for (int i =0; i <16 - len; i++) { + sBuilder.append("0"); + } + } + // 生成最终的加密盐 + String Salt = sBuilder.toString(); + password =md5Hex(password + Salt); + char[] cs =new char[48]; + for (int i =0; i <48; i +=3) { + cs[i] = password.charAt(i /3 *2); + char c = Salt.charAt(i /3); + cs[i +1] = c; + cs[i +2] = password.charAt(i /3 *2 +1); + } + return String.valueOf(cs); + } + + + public static boolean verify(String md5Secret, String noticeStr,String timestamp, String sign) throws Exception { + String password = md5Secret+noticeStr +timestamp; + char[] cs1 =new char[32]; + char[] cs2 =new char[16]; + for (int i =0; i <48; i +=3) { + cs1[i /3 *2] = sign.charAt(i); + cs1[i /3 *2 +1] = sign.charAt(i +2); + cs2[i /3] = sign.charAt(i +1); + } + String Salt =new String(cs2); + return md5Hex(password + Salt).equals(String.valueOf(cs1)); + } + + /** + * 解密 + * @param encryptedData + * @param md5Secret + * @param noticeStr + * @return + * @throws Exception + */ + public static String decrypt(String encryptedData, String md5Secret, String noticeStr) throws Exception { + String encryptedDataStart = encryptedData.replaceFirst(md5Hex(md5Secret+noticeStr),""); + char[] charArray = new String(Base64.decodeBase64(encryptedDataStart), StandardCharsets.UTF_8).toCharArray(); + for (int i =0; i < charArray.length; i++) { + charArray[i] = (char) (charArray[i] ^'t'); + } + String str = String.valueOf(charArray); + return str; + } + + /** + * 加密 + * @param encryptedData + * @param md5Secret + * @param noticeStr + * @return + * @throws Exception + */ + public static String encrypt(String encryptedData, String md5Secret, String noticeStr) throws Exception { + + char[] charArray = encryptedData.toCharArray(); + for (int i =0; i < charArray.length; i++) { + charArray[i] = (char) (charArray[i] ^'t'); + } + String str = String.valueOf(charArray); + return md5Hex(md5Secret+noticeStr)+Base64.encodeBase64String(str.getBytes(StandardCharsets.UTF_8)); + } + + + @SuppressWarnings("unused") + private static String md5Hex(String str) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(str.getBytes()); + return new String(new Hex().encode(digest)); + }catch (Exception e) { + e.printStackTrace(); + System.out.println(e.toString()); + return ""; + } + } + + public static void main(String[] args) throws Exception { + + + String ddata = "{\n" + + " \"sign\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpQJpD7It6WGV2Q50GR7DZcdFBDNvWgShPVuBYvsWFyz4kkDDIdLTzjcr1o2tnHaJCxhiy1QTOGFqgsc5D9CETKkafDBG5Qwa6deTUjhvzwWjn01Lk1Y7uaK0f1FrxYXmHdajHk916XM4BfGjaefXAR6q1Rz+uQAlGM1SGrXYJBwIDAQAB\",\n" + + " \"signType\": \"RSA\",\n" + + " \"appid\": \"156412121\",\n" + + " \"timestamp\": \"1645770163620\",\n" + + " \"nonceStr\": \"MPzteIbCc0JiSRDWxsTQ\",\n" + + " \"reqMsgId\": \"394b83504cfDFDSSDSedbb6af8e9247a9d6b\",\n" + + " \"data\": {\n" + + " \"companyName\": \"北京接口科技有限公司\",\n" + + " \"creditCode\": \"91110108MA04EN0G0G\",\n" + + " \"companyAddr\": \"北京市大兴区丈八沟街道\",\n" + + " \"companyMobile\": \"173196655242\",\n" + + " \"companyEmail\": \"1564515@qq.com\",\n" + + " \"businessScope\": \"建筑业行业\",\n" + + " \"businessType\": \"土木工程建筑业\",\n" + + " \"serviceTypeId\": \"1\",\n" + + " \"registeredAssets\": \"500\",\n" + + " \"regdate\": \"2022-03-01\",\n" + + " \"bankName\": \"建设银行\",\n" + + " \"bankAcct\": \"622365451052525\",\n" + + " \"bankCode\": \"45412125620252\",\n" + + " \"contactName\": \"张三\",\n" + + " \"contactMobile\": \"17319852652\",\n" + + " \"referralCode\": \"1\",\n" + + " \"taskAuto\": \"1\",\n" + + " \"legalPersonName\": \"王五\",\n" + + " \"idNo\": \"632323190605269943\",\n" + + " \"idCardFace\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"idCardEmblem\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"businessLicense\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"accountLicense\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"houseNumberImg\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"officeSpaceImg\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"receptionImg\": \"http://uat2.oss-cn-shanghai.aliyuncs.com/yinlingyun/web/file1640327997055.jpg\",\n" + + " \"callBackUrl\": \"https://www.baidu.com\"\n" + + " }\n" + + "}"; + + String sa= sign("d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaefaf","156156156"); + System.out.println("签名数据==》》" + sa); + System.out.println(verify("d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaef2af","156156156",sa)); + + String ss = encrypt(ddata,"d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaefaf"); + System.out.println("==>> 加密后数据 "+ ss); + String ss2 = decrypt(ss,"d1366134375c849d4c456191b98637520e5c548c8fa66e09","ewfwafwaefaf"); + System.out.println("==>> 解密后数据 "+ss2); + + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java new file mode 100644 index 0000000..75b3ee1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/thirdPlatform/xinyujian/sign/MyRSA.java @@ -0,0 +1,306 @@ +package org.dromara.payment.thirdPlatform.xinyujian.sign; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + *

RSA签名,加解密处理核心文件,注意:密钥长度4096

+ * + * @author rysc + * @version $Id: RSA.java, v 0.1 2013-11-15 下午2:33:53 lilun Exp $ + */ +@Slf4j +public class MyRSA { + + + /** + * 加密算法RSA + */ + private static final String KEY_ALGORITHM = "RSA"; + + /** + * 签名算法 + */ + private static final String SIGNATURE_ALGORITHM = "SHA256withRSA"; + + /** + * 获取公钥的key + */ + private static final String PUBLIC_KEY = "RSAPublicKey"; + + + /** + * 获取私钥的key + */ + private static final String PRIVATE_KEY = "RSAPrivateKey"; + + + /** + * RSA最大加密明文大小 + */ + private static final int MAX_ENCRYPT_BLOCK = 117; + + + /** + * RSA最大解密密文大小 + */ + private static final int MAX_DECRYPT_BLOCK = 128; + /** + * 生成的秘钥长度 一般为1024或2048 + */ + private static final int MAX_DECRYPT_SIZE = 1024; + + + /** + * @return + * @throws Exception + */ + public static Map genKeyPair() throws Exception { + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGen.initialize(MAX_DECRYPT_SIZE); + KeyPair keyPair = keyPairGen.generateKeyPair(); + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + Map keyMap = new HashMap<>(2); + keyMap.put(PUBLIC_KEY, Base64.encodeBase64String(publicKey.getEncoded())); + keyMap.put(PRIVATE_KEY, Base64.encodeBase64String(privateKey.getEncoded())); + return keyMap; + } + + + /** + * 对已加密数据进行签名 + * + * @param data 已加密的数据 + * @param privateKey 私钥 + * @return 对已加密数据生成的签名 + * @throws Exception + */ + + public static String sign(String data, String privateKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(privateKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initSign(privateK); + signature.update(dataBytes); + return Base64.encodeBase64String(signature.sign()); + } + + + /** + * 验签 + * + * @param data 签名之前的数据 + * @param publicKey 公钥 + * @param sign 签名之后的数据 + * @return 验签是否成功 + * @throws Exception + */ + public static boolean verify(String data, String publicKey, String sign) throws Exception { + + + byte[] keyBytes = Base64.decodeBase64(publicKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey publicK = keyFactory.generatePublic(keySpec); + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initVerify(publicK); + signature.update(dataBytes); + return signature.verify(Base64.decodeBase64(sign)); + } + + + /** + * 用私钥对数据进行解密 + * + * @param encryptedData 使用公钥加密过的数据 + * @param privateKey 私钥 + * @return 解密后的数据 + * @throws Exception + */ + public static String decryptByPrivateKey(String encryptedData, String privateKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(privateKey); + byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData); + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, privateK); + + int inputLen = encryptedDataBytes.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(encryptedDataBytes, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedDataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + + return new String(decryptedData, StandardCharsets.UTF_8); + } + + /** + * 公钥解密 + * + * @param encryptedData 使用私钥加密过的数据 + * @param publicKey 公钥 + * @return 解密后的数据 + * @throws Exception + */ + public static String decryptByPublicKey(String encryptedData, String publicKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(publicKey); + byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData); + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicK = keyFactory.generatePublic(x509KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicK); + int inputLen = encryptedDataBytes.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(encryptedDataBytes, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedDataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + return new String(decryptedData, StandardCharsets.UTF_8); + } + + + /** + * 公钥加密 + * + * @param data 需要加密的数据 + * @param publicKey 公钥 + * @return 使用公钥加密后的数据 + * @throws Exception + */ + public static String encryptByPublicKey(String data, String publicKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(publicKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicK = keyFactory.generatePublic(x509KeySpec); + // 对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicK); + int inputLen = dataBytes.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(dataBytes, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + return Base64.encodeBase64String(encryptedData); + } + + + /** + * 私钥加密 + * + * @param data 待加密的数据 + * @param privateKey 私钥 + * @return 使用私钥加密后的数据 + * @throws Exception + */ + public static String encryptByPrivateKey(String data, String privateKey) throws Exception { + byte[] keyBytes = Base64.decodeBase64(privateKey); + byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8); + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateK); + int inputLen = dataBytes.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(dataBytes, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + return Base64.encodeBase64String(encryptedData); + } + + + /** + * 获取私钥 + * + * @param keyMap 生成的秘钥对 + * @return + * @throws Exception + */ + public static String getPrivateKey(Map keyMap) throws Exception { + return keyMap.get(PRIVATE_KEY); + } + + + /** + * 获取公钥 + * + * @param keyMap 生成的秘钥对 + * @return + * @throws Exception + */ + public static String getPublicKey(Map keyMap) throws Exception { + return keyMap.get(PUBLIC_KEY); + } + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java new file mode 100644 index 0000000..7b4e06f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionCallBackJob.java @@ -0,0 +1,73 @@ +package org.dromara.payment.timer; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Date; +import java.util.List; + +/** + * 同步银行交易回置单任务 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +public class BankTransactionCallBackJob { + + @Autowired + private TranLogMapper synDao; + + @Autowired + private ITranLogService tranLogService; + + @XxlJob("BankTransactionCallBackJob") + public void process() throws Exception { + long minId = 0; + int limit = 10; + XxlJobHelper.log("开始同步银行交易回置单"); + TranLogVo lockAccId = null; + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + do { + row = synDao.allotSyns(synBatch,2,(byte)0,minId,0,limit); + if(row > 0) { + List schools = synDao.selectTranLog(synBatch,2,(byte)0, null); + for (TranLogVo accid : schools) { + try { + tranLogService.synTransferCallBack(accid); + } catch (Exception e) { + XxlJobHelper.log("同步银行交易回置单出错(" + minId + "," + limit + "," + JSONObject.toJSONString(accid) + "):",e); + } + synDao.cancelSyn(accid.getId()); + minId = accid.getId(); + } + } + } while (row == limit); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + XxlJobHelper.log("同步银行交易回置单出错(" + minId + "," + limit + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch, 2); + } catch (Exception e) { + XxlJobHelper.log("同步银行交易回置单时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束同步银行交易回置单"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java new file mode 100644 index 0000000..9f560fd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionJob.java @@ -0,0 +1,87 @@ +package org.dromara.payment.timer; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import cn.hutool.core.exceptions.ExceptionUtil; +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.bill.domain.MerBillDetail; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.channel.mapper.BusChannelAccountMapper; +import org.dromara.payment.common.domain.TranLog; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.sys.domain.SysSydAccount; +import org.dromara.payment.sys.mapper.SysSydAccountMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.TransactionLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +/** + * 处理银行交易任务 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +public class BankTransactionJob { + @Autowired + private TranLogMapper synDao; + + @Autowired + private ITranLogService tranLogService; + + @XxlJob("BankTransactionJob") + public void process() throws Exception { + long minId = 0; + int limit = 10; + XxlJobHelper.log("开始处理银行交易"); + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + do { + //分配交易的处理批次 + row = synDao.allotSyns(synBatch,-1,null,minId,0,limit); + if(row > 0) { + List schools = synDao.selectTranLog(synBatch,-1,null, null); + for (TranLogVo accid : schools) { + try { + tranLogService.transaction(accid,false); + } catch (Exception e) { + e.printStackTrace(); + XxlJobHelper.log("处理银行交易出错(" + minId + "," + limit + "," +JSONObject.toJSONString(accid) + "):"+e.getMessage()); + } + synDao.cancelSyn(accid.getId()); + minId = accid.getId(); + } + } + } while (row == limit); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + XxlJobHelper.log("处理银行交易记录出错(" + minId + "," + limit + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch, -1); + } catch (Exception e) { + XxlJobHelper.log("处理银行交易时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束处理银行交易"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java new file mode 100644 index 0000000..c0c5f2c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/BankTransactionSynJob.java @@ -0,0 +1,78 @@ +package org.dromara.payment.timer; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.common.domain.vo.TranLogVo; +import org.dromara.payment.common.mapper.TranLogMapper; +import org.dromara.payment.common.service.ITranLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +import java.util.Date; +import java.util.List; + +/** + * 同步银行交易结果任务 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +@Slf4j +public class BankTransactionSynJob { + + @Autowired + private TranLogMapper synDao; + + @Autowired + private ITranLogService tranLogService; + + @XxlJob("BankTransactionSynJob") + public void process() throws Exception { + long minId = 0; + int limit = 10; + XxlJobHelper.log("开始同步银行交易结果"); + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + do { + row = synDao.allotSyns(synBatch,1,null,minId,0,limit); + if(row > 0) { + List schools = synDao.selectTranLog(synBatch,1,null, null); + for (TranLogVo accid : schools) { + try { + tranLogService.transaction(accid,true); + } catch (Exception e) { + e.printStackTrace(); + log.error("处理银行交易结果出错(" + minId + "," + limit + "," + JSONObject.toJSONString(accid) + "):",e.getMessage()); + XxlJobHelper.log("处理银行交易结果出错(" + minId + "," + limit + "," + JSONObject.toJSONString(accid) + "):",e); + } + synDao.cancelSyn(accid.getId()); + minId = accid.getId(); + } + } + } while (row == limit); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("同步银行交易结果出错(" + minId + "," + limit + "):",e); + XxlJobHelper.log("同步银行交易结果出错(" + minId + "," + limit + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch, 1); + } catch (Exception e) { + log.error("同步银行交易结果时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + XxlJobHelper.log("同步银行交易结果时解锁出错(" + minId + "," + limit + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束同步银行交易结果"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java new file mode 100644 index 0000000..f306847 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CntWorkerBillInfoJob.java @@ -0,0 +1,60 @@ +package org.dromara.payment.timer; + +import cn.hutool.core.date.DateUtil; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.payment.bill.mapper.MerBillDetailMapper; +import org.dromara.payment.worker.domain.UserWorkerBill; +import org.dromara.payment.worker.mapper.UserWorkerBillMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title CntWorkerBillInfoJob + * @description + * @create 2024-09-03 16:54 + */ + + +@Component +public class CntWorkerBillInfoJob { + + @Resource + public UserWorkerBillMapper userWorkerBillMapper; + + + @XxlJob("CntWorkerBillInfoJob") + public void updateInfo(){ + Date currentDate = new Date(); + Date startTime = DateUtil.beginOfYear(currentDate); + Date endTime = DateUtil.endOfYear(currentDate); + + Map paraMap = new HashMap(); + paraMap.put("startTime",startTime); + paraMap.put("endTime",endTime); + + List list = this.userWorkerBillMapper.selectCurentDayWorkerBillInfo(paraMap); + int dtmYear = DateUtil.year(currentDate); + for(UserWorkerBill bill : list){ + paraMap.clear(); + paraMap.put("workerId",bill.getWorkerId()); + paraMap.put("sydId",bill.getSydId()); + paraMap.put("busType",bill.getBusType()); + paraMap.put("merId",bill.getMerId()); + paraMap.put("dtmYear",dtmYear); + this.userWorkerBillMapper.deleteUserWorkerBillByInfo(paraMap); + bill.setDtmYear(dtmYear+""); + this.userWorkerBillMapper.insert(bill); + } + + + + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java new file mode 100644 index 0000000..162bb21 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/CreateSwMonitorJob.java @@ -0,0 +1,49 @@ +package org.dromara.payment.timer; + +import cn.hutool.core.date.DateUtil; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.payment.taxRecords.service.ISwMonitorService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * @author sunzexing + * @version 1.0 + * @title CreateSwMonitorJob + * @description 生成完税证明记录 + * @create 2024-07-26 21:46 + */ +@Component +public class CreateSwMonitorJob { + + + @Resource + private ISwMonitorService swMonitorService; + + + @XxlJob("createSwMonitorJob") + public void create(){ + + Date currentDate = new Date(); + currentDate = DateUtil.offsetDay(currentDate,-5).toJdkDate(); + + String month = DateUtil.format(currentDate,"yyyy-MM"); + XxlJobHelper.log("开始生成"+month+"完税证明记录"); + try{ + this.swMonitorService.createSwRecords(currentDate); + XxlJobHelper.log("结束生成"+month+"完税证明记录"); + }catch (Exception e){ + e.printStackTrace(); + XxlJobHelper.log("生成"+month+"完税证明记录失败"+ e.getMessage()); + } + + + + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java new file mode 100644 index 0000000..7829e70 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/InvoiceIogisticsReceivingJob.java @@ -0,0 +1,57 @@ +package org.dromara.payment.timer; + +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.payment.invoice.domain.bo.MerInvoiceBo; +import org.dromara.payment.invoice.domain.vo.MerInvoiceVo; +import org.dromara.payment.invoice.service.IMerInvoiceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +/** + * 发票快递自动签收任务 + */ +@Component +public class InvoiceIogisticsReceivingJob { + + @Autowired + private IMerInvoiceService invoiceService; + + @XxlJob("InvoiceIogisticsReceivingJob") + public void process() throws Exception { + PageQuery pageQuery = new PageQuery(); + pageQuery.setOrderByColumn("iogistics_time"); + pageQuery.setIsAsc("asc"); + pageQuery.setPageSize(50); + pageQuery.build(); + XxlJobHelper.log("开始自动签收发票快递"); + try { + MerInvoiceBo where = new MerInvoiceBo(); + where.setIogisticsStatus(2); + TableDataInfo pageData = null; + do { + pageData = invoiceService.queryPageList(where,pageQuery); + if(pageData.getRows().size() > 0) { + for (MerInvoiceVo inv : pageData.getRows()) { + try { + invoiceService.receivingIogistics(inv.getId(),"系统"); + } catch (Exception e) { + XxlJobHelper.log("自动签收发票快递失败(" + inv.getId() + "):",e); + } + } + pageQuery.setPageNum(pageQuery.getPageNum()+1); + } + } while (pageData.getRows().size() == pageQuery.getPageNum()); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + XxlJobHelper.log("自动签收发票快递出错(" + pageQuery.getPageNum() + "," + pageQuery.getPageSize() + "):",e); + } + XxlJobHelper.log("结束自动签收发票快递"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java new file mode 100644 index 0000000..6433269 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/MerchantProductJob.java @@ -0,0 +1,36 @@ +package org.dromara.payment.timer; + +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.dromara.payment.merchant.mapper.BusMerchantProductMapper; +import org.dromara.payment.merchant.service.IBusMerchantProductService; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title MerchantProductJob + * @description 商户产品费率修改定时任务 + * @create 2024-05-06 19:10 + */ +@Component +@Slf4j +public class MerchantProductJob implements BasicProcessor { + + @Resource + private BusMerchantProductMapper busMerchantProductMapper; + + @XxlJob("merchantProductProcessJob") + public ProcessResult process(TaskContext taskContext) throws Exception { + + this.busMerchantProductMapper.updateMerProInfosService(); + log.info("商户产品费率修改定时任务执行成功"); + return new ProcessResult(true); + } +} + diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java new file mode 100644 index 0000000..75b6ecb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/timer/SynMerchantAccountJob.java @@ -0,0 +1,124 @@ +package org.dromara.payment.timer; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.merchant.domain.BusMerchant; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountSynVo; +import org.dromara.payment.merchant.domain.vo.BusMerchantAccountVo; +import org.dromara.payment.merchant.mapper.BusMerchantAccountMapper; +import org.dromara.payment.merchant.mapper.BusMerchantAccountSynMapper; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.merchant.service.IBusMerchantFlowsService; +import org.dromara.payment.sys.domain.SysSyd; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; +import tech.powerjob.worker.log.OmsLogger; + +/** + * 同步商户虚拟账户余额 + * @author 张涛 + * @date 2021年9月3日 + */ +@Component +public class SynMerchantAccountJob { + + @Autowired + private BusMerchantAccountSynMapper synDao; + + @Autowired + private BusMerchantAccountMapper accountDao; + + @Autowired + private BusMerchantMapper shDao; + + + @DubboReference + private RemoteAccountService accountService; + + @DubboReference + private RemoteNoticeService noticeService; + + @Autowired + private IBusMerchantFlowsService merchantFlowsService; + + @XxlJob("SynMerchantAccountJob") + public void process() throws Exception { + int minId = 0; + int limit = 10; + XxlJobHelper.log("开始同步商户虚拟账户余额"); + Integer lockAccId = null; + String synBatch = null; + Integer row = 0; + try { + synBatch = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + //补全不存在同步记录的账户, 从bus_merchant_account 到 bus_merchant_account_syn + synDao.autoNotExist(); + do { + //分配账户的同步批次 + row = synDao.allotSyns(synBatch,minId,0,limit); + if(row > 0) { + //查询待同步的账户id + List schools = synDao.selectSyn(synBatch, null); + for (BusMerchantAccountSynVo accid : schools) { + lockAccId = accid.getId().intValue(); + if (synDao.lock(synBatch, accid.getId().intValue()) > 0) { + Result rtn = accountService.synAccount(accid.getId().intValue(),(short)1,accid.getSynPosition(),Arrays.asList("转账失败,退回记账服务费","转账退票,退回个人服务费","退回企业服务费","代收小额支付业务手续费")); + if (rtn.hasError()) { + XxlJobHelper.log("同步账户出错:"+rtn.getResult()); + }else if (rtn.hasTip()) { + XxlJobHelper.log("同步账户:"+rtn.getResult()); + }else if (rtn.getRtnData().getAddAmount() > 0) { + BusMerchantAccountVo acc = accountDao.selectByAccId(accid.getId().intValue()); + BusMerchant merchant = shDao.selectById(acc.getMerId()); + acc.setMerName(merchant.getName()); + //充值的金额 + Long addAmount = merchantFlowsService.saveFlows(acc, rtn.getRtnData()); + if(addAmount > 0) { + noticeService.addNotice(new RemoteSysNoticeVo("商户充值通知", String.format("%s商户往%s充值%s元",merchant.getName(),rtn.getRtnData().getBankType(),new DecimalFormat("0.##").format(addAmount/100.0)), merchant.getId().intValue(), BusRole.MERCHANT)); + noticeService.addNotice(new RemoteSysNoticeVo("商户充值通知", String.format("%s商户往%s充值%s元",merchant.getName(),rtn.getRtnData().getBankType(),new DecimalFormat("0.##").format(addAmount/100.0)), rtn.getRtnData().getUnitId().intValue(), BusRole.SERVICE)); + } + } + synDao.cancelSyn(accid.getId().intValue()); + minId = accid.getId().intValue(); + lockAccId = null; + }else { + XxlJobHelper.log("同步账户加锁失败:"+synBatch+","+ JSONObject.toJSONString(accid)); + } + } + } + } while (row == limit); + } catch (Exception e) { + e.printStackTrace(); + // TODO 自动生成的 catch 块 + XxlJobHelper.log("同步商户虚拟账户余额出错(" + minId + "," + limit + "," + lockAccId + "):",e); + }finally { + if(row > 0) { + try { + synDao.cancelSynByBatch(synBatch); + } catch (Exception e) { + XxlJobHelper.log("同步商户虚拟账户余额时解锁出错(" + minId + "," + limit + "," + lockAccId + "," + synBatch + "):", e); + } + } + } + XxlJobHelper.log("结束同步商户虚拟账户余额"); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java new file mode 100644 index 0000000..bf6b73f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/DateTimeUtil.java @@ -0,0 +1,318 @@ +package org.dromara.payment.util; + +import cn.hutool.core.lang.Assert; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +/** + */ +public class DateTimeUtil { + + public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS_SSS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"); + + public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + + + public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + public static final DateTimeFormatter YYYYMMDDHHMMSS = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + public static final DateTimeFormatter YYYYMMDDHH = DateTimeFormatter.ofPattern("yyyyMMddHH"); + + public static final DateTimeFormatter YYYYMMDD = DateTimeFormatter.ofPattern("yyyyMMdd"); + + public static final DateTimeFormatter YYYY_MM_DD_HH = DateTimeFormatter.ofPattern("yyyy-MM-dd HH"); + public static final DateTimeFormatter YYYY_MM_DD = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + public static final DateTimeFormatter MM_DD = DateTimeFormatter.ofPattern("MM月dd日"); + public static final DateTimeFormatter YYYY = DateTimeFormatter.ofPattern("yyyy"); + public static final DateTimeFormatter MM = DateTimeFormatter.ofPattern("MM"); + public static final DateTimeFormatter HH = DateTimeFormatter.ofPattern("HH"); + public static final DateTimeFormatter YYYY_MM = DateTimeFormatter.ofPattern("yyyy年MM月"); + + /** + * Date转换为LocalDateTime + * + * @param date 日期 + * @return LocalDateTime + */ + public static LocalDateTime toLocalDateTime(Date date) { + return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); + } + + /** + * LocalDateTime转换为Date + * + * @param dateTime 日期时间 + * @return Date + */ + public static Date toDate(LocalDateTime dateTime) { + return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + /** + * 获取指定格式的指定时间 + * + * @param dateTime 日期时间 + * @param pattern 指定格式 + * @return 指定格式的日期时间字符串 + */ + public static String formatTime(LocalDateTime dateTime, String pattern) { + return dateTime.format(DateTimeFormatter.ofPattern(pattern)); + } + + /** + * 获取指定格式的当前时间 + * + * @param pattern 指定格式 + * @return 指定格式的当前时间日期字符串 + */ + public static String formatNow(String pattern) { + return formatTime(LocalDateTime.now(), pattern); + } + + /** + * 判断dateTime1是否早于dateTime2 + * + * @param dateTime1 日期时间1 + * @param dateTime2 日期时间2 + * @return 判断结果 + */ + public static boolean isBefore(LocalDateTime dateTime1, LocalDateTime dateTime2) { + return dateTime1.isBefore(dateTime2); + } + + /** + * 判断dateTime1与dateTime2是否是同一时间 + * + * @param dateTime1 日期时间1 + * @param dateTime2 日期时间2 + * @return 判断结果 + */ + public static boolean isEqual(LocalDateTime dateTime1, LocalDateTime dateTime2) { + return dateTime1.isEqual(dateTime2); + } + + /** + * 判断dateTime1是否晚于dateTime2 + * + * @param dateTime1 日期时间1 + * @param dateTime2 日期时间2 + * @return 判断结果 + */ + public static boolean isAfter(LocalDateTime dateTime1, LocalDateTime dateTime2) { + return dateTime1.isAfter(dateTime2); + } + + /** + * 获取指定日期的毫秒 + * + * @param dateTime 日期时间 + * @return 毫秒 + */ + public static Long getMilliByTime(LocalDateTime dateTime) { + return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * 获取指定日期的秒 + * + * @param dateTime 日期时间 + * @return 秒 + */ + public static Long getSecondsByTime(LocalDateTime dateTime) { + return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond(); + } + + /** + * 日期加上一个数,根据field不同加不同值 + * + * @param dateTime 日期时间 + * @param number 数值 + * @param field 单位 + * @return 已添加数值后的日期时间 + */ + public static LocalDateTime plus(LocalDateTime dateTime, long number, ChronoUnit field) { + return dateTime.plus(number, field); + } + + /** + * 日期减去一个数,根据field不同减不同值 + * + * @param dateTime 日期时间 + * @param number 数值 + * @param field 单位 + * @return 已减少数值后的日期时间 + */ + public static LocalDateTime minus(LocalDateTime dateTime, long number, ChronoUnit field) { + return dateTime.minus(number, field); + } + + /** + * 获取两个日期的差 + * + * @param startDateTime 开始时间 + * @param endDateTime 结束时间 + * @param field 单位 + * @return 两个日期之间的差值 + */ + public static long between(LocalDateTime startDateTime, LocalDateTime endDateTime, ChronoUnit field) { + Period period = Period.between(LocalDate.from(startDateTime), LocalDate.from(endDateTime)); + if (field == ChronoUnit.YEARS) return ChronoUnit.YEARS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate()); + if (field == ChronoUnit.MONTHS) return ChronoUnit.MONTHS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate()); + if (field == ChronoUnit.DAYS) return ChronoUnit.DAYS.between(startDateTime.toLocalDate(), endDateTime.toLocalDate()); + if (field == ChronoUnit.HOURS) return Duration.between(startDateTime, endDateTime).toHours(); + return field.between(startDateTime, endDateTime); + } + + /** + * 获取某天的开始时间,例如:yyyy,MM,dd 00:00 + * + * @param dateTime 某天的日期时间 + * @return 某天的开始时间 + */ + public static LocalDateTime getDayStart(LocalDateTime dateTime) { + return dateTime.withHour(1) + .withMinute(0) + .withSecond(0) + .withNano(0); + } + + /** + * 获取某天的开始时间,例如:yyyy,MM,dd 00:00 + * + * @return 某天的开始时间 + */ + public static LocalDateTime getNOwDayStart() { + return LocalDateTime.now().withHour(0) + .withMinute(0) + .withSecond(0) + .withNano(0); + } + + /** + * 获取某天的结束时间,例如:yyy,MM,dd 23:59:59 + * + * @param dateTime 某天的日期时间 + * @return 某天的结束时间 + */ + public static LocalDateTime getDayEnd(LocalDateTime dateTime) { + return dateTime.withHour(23) + .withMinute(59) + .withSecond(59); + } + + /** + * 将字符串转日期成Long类型的时间戳,格式为:yyyy-MM-dd HH:mm:ss + */ + public static Long timeToLong(String time) { + Assert.notNull(time, "time is null"); + DateTimeFormatter formatString = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime parse = LocalDateTime.parse(time, formatString); + return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * 将字符串转日期成Long类型的时间戳,格式为:yyyy-MM-dd HH:mm:ss + */ + public static String zonedDateTimeToString(ZonedDateTime zonedDateTime) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return zonedDateTime.format(formatter); + } + + + /** + * 获取时间段内的时间列表 + * + * @param startTime + * @param endTime + * @param dataType + * @return + */ + public static List getDateList(String startTime, String endTime, Integer dataType, DateTimeFormatter dateTimeFormatter) { + List result = new LinkedList<>(); + while (endTime.compareTo(startTime) >= 0) { + LocalDateTime localDateStartTime = LocalDateTime.parse(startTime, YYYY_MM_DD_HH_MM_SS); + result.add(localDateStartTime.format(dateTimeFormatter)); + if (dataType == 4) { + localDateStartTime = localDateStartTime.plusHours(1); + } else if (dataType == 3) { + localDateStartTime = localDateStartTime.plusDays(1); + } else if (dataType == 2) { + localDateStartTime = localDateStartTime.plusMonths(1); + } else if (dataType == 1) { + localDateStartTime = localDateStartTime.plusYears(1); + } + startTime = localDateStartTime.format(YYYY_MM_DD_HH_MM_SS); + } + return result; + } + + public static String getPreviousMonthSameTime(String dateString) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter); + LocalDate date = dateTime.toLocalDate(); + int year = date.getYear(); + int month = date.getMonthValue() - 1; + if (month == 0) { + year--; + month = 12; // December + } + int day = date.getDayOfMonth(); + int hour = dateTime.getHour(); + int minute = dateTime.getMinute(); + int second = dateTime.getSecond(); + LocalDateTime prevMonthSameTime = LocalDateTime.of(year, month, day, hour, minute, second); + String formattedString = prevMonthSameTime.format(formatter); + return formattedString; + } + + + /** + * 获取时间段内的时间列表 + * + * @param startTime + * @param endTime + * @param dataType + * @return + */ + public static List getDateList(LocalDateTime startTime, LocalDateTime endTime, Integer dataType, DateTimeFormatter dateTimeFormatter) { + List result = new LinkedList<>(); + while (endTime.compareTo(startTime) >= 0) { + result.add(startTime.format(dateTimeFormatter)); + if (dataType == 4) { + startTime = startTime.plusHours(1); + } else if (dataType == 3) { + startTime = startTime.plusDays(1); + } else if (dataType == 2) { + startTime = startTime.plusMonths(1); + } else if (dataType == 1) { + startTime = startTime.plusYears(1); + } + } + return result; + } + + /** + * 获取季度 + * + * @param dataTime + * @return + */ + public static String getQuarter(LocalDateTime dataTime) { + int year = dataTime.getYear(); + int quarter = (dataTime.getMonthValue() - 1) / 3 + 1; + if (quarter == 1) { + return "第一季度"; + } else if (quarter == 2) { + return "第二季度"; + } else if (quarter == 3) { + return "第三季度"; + } else if (quarter == 4) { + return "第四季度"; + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java new file mode 100644 index 0000000..0276252 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/MoneyUtils.java @@ -0,0 +1,69 @@ +package org.dromara.payment.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; + +public class MoneyUtils { + /** + * 金额分转换为格式化后元 + * @param money 金额(分) + * @return 0.00 + */ + public static String getMoneyFormatYuan(Long money){ + return formatYuan(getMoneyYuan(money)); + } + + /** + * 金额分转换为元 + * @param money 金额(分) + * @return 0.00 + */ + public static BigDecimal getMoneyYuan(Long money){ + if(null == money){ + return new BigDecimal(0); + } + return BigDecimal.valueOf(money).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + } + + /** + * 金额分转换为万 + * @param money 金额(分) + * @return 0.00 + */ + public static BigDecimal getMoneyWan(Long money){ + if(null == money){ + return new BigDecimal(0); + } + + return BigDecimal.valueOf(money).divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP); + } + + public static BigDecimal getMoneyWan(BigDecimal money){ + if(null == money){ + return new BigDecimal(0); + } + + return money.divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_UP); + } + + + /** + * 金额元转换为格式化后元 + * @param money 金额(元) + * @return 0.00 + */ + public static String formatYuan(BigDecimal money){ + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + return decimalFormat.format(money); + } + + /** + * 金额元转换为分 + * @param money 金额(元) + * @return 0 + */ + public static Long getMoneyFen(BigDecimal money){ + return money.multiply(new BigDecimal(100)).longValue(); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java new file mode 100644 index 0000000..25a7a62 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/util/UniqueIdGenerator.java @@ -0,0 +1,35 @@ +package org.dromara.payment.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class UniqueIdGenerator { + + public static String generateUniqueId(long input) { + try { + // 将long转换为byte数组 + byte[] inputBytes = java.nio.ByteBuffer.allocate(8).putLong(input).array(); + + // 使用MD5哈希函数 + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(inputBytes); + + // 将哈希值的前5个字节转换为十六进制字符串,并截取前5位 + StringBuilder hexString = new StringBuilder(); + for (byte b : digest) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.substring(0, 5); // 取前5位 + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + long input = 1811245410163494912L; + String uniqueId = generateUniqueId(input); + System.out.println(uniqueId); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java new file mode 100644 index 0000000..93a58b2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerAccountController.java @@ -0,0 +1,120 @@ +package org.dromara.payment.worker.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.service.IUserWorkerAccountService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者账户 + * 前端访问路由地址为:/payment/workerAccount + * + * @author LionLi + * @date 2024-04-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workerAccount") +public class UserWorkerAccountController extends BaseController { + + private final IUserWorkerAccountService userWorkerAccountService; + + /** + * 查询自雇者账户列表 + */ +// @SaCheckPermission("payment:workerAccount:list") + @GetMapping("/list") + public TableDataInfo list(UserWorkerAccountBo bo, PageQuery pageQuery) { + return userWorkerAccountService.queryPageList(bo, pageQuery); + } + + + + /** + * 查询自雇者账户列表 + */ +// @SaCheckPermission("payment:workerAccount:bankList") + @GetMapping("/bankList") + public R bankList(UserWorkerAccountBo bo) { + return R.ok(userWorkerAccountService.queryList(bo)); + } + + + + + /** + * 导出自雇者账户列表 + */ + @SaCheckPermission("payment:workerAccount:export") + @Log(title = "自雇者账户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkerAccountBo bo, HttpServletResponse response) { + List list = userWorkerAccountService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者账户", UserWorkerAccountVo.class, response); + } + + /** + * 获取自雇者账户详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("payment:workerAccount:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerAccountService.queryById(id)); + } + + /** + * 新增自雇者账户 + */ +// @SaCheckPermission("payment:workerAccount:add") + @Log(title = "自雇者账户", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerAccountBo bo) { + return toAjax(userWorkerAccountService.insertByBo(bo)); + } + + /** + * 修改自雇者账户 + */ +// @SaCheckPermission("payment:workerAccount:edit") + @Log(title = "自雇者账户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerAccountBo bo) { + return toAjax(userWorkerAccountService.updateByBo(bo)); + } + + /** + * 删除自雇者账户 + * + * @param ids 主键串 + */ + @SaCheckPermission("payment:workerAccount:remove") + @Log(title = "自雇者账户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerAccountService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java new file mode 100644 index 0000000..e819a0b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerBusinessController.java @@ -0,0 +1,267 @@ +package org.dromara.payment.worker.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.*; +import org.dromara.payment.worker.service.IUserWorkerAuthorizedService; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.payment.worker.service.IUserWorkerBusinessService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +/** + * 用工签约查询 + * 前端访问路由地址为:/worker/workerBusiness + * + * @author LionLi + * @date 2024-04-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workerBusiness") +public class UserWorkerBusinessController extends BaseController { + + private final IUserWorkerBusinessService userWorkerBusinessService; + + + @Resource + private IUserWorkerAuthorizedService authorizedService; + + + /** + * 查询用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness:list") + @GetMapping("/operlist") + @Log(title = "运营商添加用工签约列表查询-运营商", businessType = BusinessType.SELECT) + public TableDataInfo list( PageQuery pageQuery,Long merId, + Long sydId,Integer busType) { + return userWorkerBusinessService.selUserWorkByMerServInfo(pageQuery,sydId,merId,busType); + } + + /** + * 查询用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness:list") + @GetMapping("/list") + public TableDataInfo list(CommonSelConditionEntity bo, PageQuery pageQuery) { + return userWorkerBusinessService.queryPageList(bo, pageQuery); + } + + + /*** + * 授权协议分页查询 + * @param bo + * @param pageQuery + * @return + */ + @GetMapping("/authList") + public TableDataInfo list(UserWorkerAuthorizedBo bo, PageQuery pageQuery) { + return this.authorizedService.queryPageList(bo, pageQuery); + } + + + /** + * 导出用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness:export") + @Log(title = "用工签约查询", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(CommonSelConditionEntity bo, HttpServletResponse response) { + List list = userWorkerBusinessService.queryList(bo); + ExcelUtil.exportExcel(list, "用工签约导出", UserWorkerBusinessVo.class, response); + } + + + @Log(title = "单个导出用工的身份证信息", businessType = BusinessType.EXPORT) + @PostMapping("/exportCardImg") + public void exportCardImg(Long workId,HttpServletResponse response)throws Exception{ + this.userWorkerBusinessService.exportCardImg(workId,response); + } + + + @Log(title = "批量导出用工的身份证信息", businessType = BusinessType.EXPORT) + @PostMapping("/exportMutiCardImg") + public R exportMutiCardImgs(String workIds)throws Exception{ + this.userWorkerBusinessService.exportMutiCardImg(workIds); + return R.ok(true); + } + + + /** + * 获取用工签约查询详细信息 + * + * @param id 主键 + */ +// @SaCheckPermission("worker:workerBusiness:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerBusinessService.queryById(id)); + } + + + + /** + * 获取用工签约查询详细信息 -授权协议 + * + * @param id 主键 + */ +// @SaCheckPermission("worker:workerBusiness:getAuth")s + @GetMapping("/getAuth") + public R getAuthInfo(@NotNull(message = "主键不能为空") + Long id) { + return R.ok(this.authorizedService.queryById(id)); + } + + /** + * 新增用工签约查询 + */ + @SaCheckPermission("worker:workerBusiness:add") + @Log(title = "用工签约查询", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerBusinessBo bo) { + return toAjax(userWorkerBusinessService.insertByBo(bo)); + } + + /** + * 修改用工签约查询 + */ + @SaCheckPermission("worker:workerBusiness:edit") + @Log(title = "用工签约查询", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerBusinessBo bo) { + return toAjax(userWorkerBusinessService.updateByBo(bo)); + } + + /** + * 删除用工签约查询 + * + * @param ids 主键串 + */ + @SaCheckPermission("worker:workerBusiness:remove") + @Log(title = "用工签约查询", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerBusinessService.deleteWithValidByIds(List.of(ids), true)); + } + + + + + +// @SaCheckPermission("worker:workerBusiness:import") + @Log(title = "用工签约导入", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file, + Integer busType,Long sydId ,String sydNo,String domain,Long merId,String merNo )throws Exception{ + return R.ok(this.userWorkerBusinessService.upload(file,busType,sydId,sydNo,domain,merId,merNo)); + } + + + + /** + * 导出用工签约查询列表 + */ +// @SaCheckPermission("worker:workerBusiness_error:export") + @Log(title = "用工签约错误信息下载", businessType = BusinessType.EXPORT) + @PostMapping("/exportError") + public void exportSignError(String uuid, HttpServletResponse response) { + List list = userWorkerBusinessService.selErrorList(uuid); + ExcelUtil.exportExcel(list, "用工签约导入错误信息", UploadExcelItem.class, response); + } + + + + /** + * 用工签约,查询会员信息 + */ +// @SaCheckPermission("worker:workerBusiness:selMember") + @Log(title = "用工签约查询会员信息", businessType = BusinessType.OTHER) + @PostMapping("/selWkInfo") + public R selWkInfo(UserWorkerBusinessBo bo) { + UserWorkerVo vo = userWorkerBusinessService.selMemberInfo(bo); + return R.ok(vo); + } + + + + /*** + * 添加用工人员-运营商 + * @param bo + * @return + */ + @Log(title = "运营商添加用工人员", businessType = BusinessType.OTHER) + @PostMapping("/addUwb") + public R addUserWorkdBz(@Validated(AddGroup.class) @RequestBody UserWokerOperBo bo)throws Exception{ + return R.ok(userWorkerBusinessService.addUserWorkdBz(bo)); + } + + + + /*** + * 用工签约- -运营商 + * @return + */ + @Log(title = "用工签约-选中提交 -运营商", businessType = BusinessType.INSERT) + @PostMapping("/addSelUwb") + public R operAddUserWorkSel(Long merId,Long sydId,Integer busType,String workIds){ + return R.ok(this.userWorkerBusinessService.operAddUserWorkSel(merId,sydId,busType,workIds)); + } + + + /*** + * 用工签约- -运营商 + * @return + */ + @Log(title = "用工签约-全部提交 -运营商", businessType = BusinessType.INSERT) + @PostMapping("/addAllUwb") + public R operAddUserWorkAll(Long merId,Long sydId,Integer busType){ + return R.ok(this.userWorkerBusinessService.operAddUserWorkAll(merId,sydId,busType)); + } + + + + @Log(title = "用工信息修改-运营商", businessType = BusinessType.UPDATE) + @PostMapping("/upUw") + public R updateUserWorkInfo(UserWorkerBo uw){ + return R.ok(this.userWorkerBusinessService.updateUserWorkInfo(uw)); + } + + + + @Log(title = "用工信息修改查询-运营商", businessType = BusinessType.UPDATE) + @PostMapping("/selUpUw") + public R updateUserWorkInfo(UserWorkerBusinessBo uw){ + return R.ok(this.userWorkerBusinessService.selMemberInfoNySignId(uw)); + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java new file mode 100644 index 0000000..1fd1088 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/controller/UserWorkerController.java @@ -0,0 +1,106 @@ +package org.dromara.payment.worker.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.service.IUserWorkerService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 自雇者 + * 前端访问路由地址为:/userWorker/Userworker + * + * @author LionLi + * @date 2024-04-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/Userworker") +public class UserWorkerController extends BaseController { + + private final IUserWorkerService userWorkerService; + + /** + * 查询自雇者列表 + */ + @SaCheckPermission("userWorker:Userworker:list") + @GetMapping("/list") + public TableDataInfo list(UserWorkerBo bo, PageQuery pageQuery) { + return userWorkerService.queryPageList(bo, pageQuery); + } + + /** + * 导出自雇者列表 + */ + @SaCheckPermission("userWorker:Userworker:export") + @Log(title = "自雇者", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserWorkerBo bo, HttpServletResponse response) { + List list = userWorkerService.queryList(bo); + ExcelUtil.exportExcel(list, "自雇者", UserWorkerVo.class, response); + } + + /** + * 获取自雇者详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("userWorker:Userworker:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userWorkerService.queryById(id)); + } + + /** + * 新增自雇者 + */ + @SaCheckPermission("userWorker:Userworker:add") + @Log(title = "自雇者", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.insertByBo(bo)); + } + + /** + * 修改自雇者 + */ + @SaCheckPermission("userWorker:Userworker:edit") + @Log(title = "自雇者", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserWorkerBo bo) { + return toAjax(userWorkerService.updateByBo(bo)); + } + + /** + * 删除自雇者 + * + * @param ids 主键串 + */ + @SaCheckPermission("userWorker:Userworker:remove") + @Log(title = "自雇者", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userWorkerService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java new file mode 100644 index 0000000..6097dc7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/SysUnitDomain.java @@ -0,0 +1,135 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位域名配置对象 sys_unit_domain + * + * @author LionLi + * @date 2024-04-07 + */ +@Data +public class SysUnitDomain extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + + private Integer openSms; + + private String smsConfig; + + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java new file mode 100644 index 0000000..64527ac --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/ThirdConf.java @@ -0,0 +1,22 @@ +package org.dromara.payment.worker.domain; + +import lombok.Data; + +@Data +public class ThirdConf{ + + private String type; + + private String secretId; + + private String secretKey; + + private String endPoint; + + private String ruleId; + + private String redirectUrl; + + private String region; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java new file mode 100644 index 0000000..968e211 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorker.java @@ -0,0 +1,195 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者对象 user_worker + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker") +public class UserWorker extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 微信openid + */ + private String openId; + + /** + * 姓名 + */ + private String name; + + /** + * 手机号 + */ + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + private Long isAuthentication; + + /** + * 身份证号 + */ + private String cardId; + + /** + * 身份证正面图片 + */ + private String cardPositive; + + /** + * 身份证反面图片 + */ + private String cardBack; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + private Long isSign; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + private Long isRegister; + + /** + * 人脸照片 + */ + private String photoPath; + + /** + * 性别 + */ + private String sex; + + /** + * 标签 + */ + private String tag; + + /** + * 区域编码 + */ + private String userArea; + + /** + * 区域名称 + */ + private String userAreaName; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 添加人 + */ + private String addBy; + + /** + * 编辑人 + */ + private String editer; + + /** + * 编辑时间 + */ + private Date editTime; + + /** + * 民族 + */ + private String nation; + + /** + * 户籍地址 + */ + private String address; + + /** + * 出生日期 + */ + private Date birthday; + + /** + * 签发机关 + */ + private String issue; + + /** + * 签发日期 + */ + private Date issueDate; + + /** + * 失效日期 + */ + private String expiryDate; + + /** + * 推荐人 + */ + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + private Integer status; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java new file mode 100644 index 0000000..420dab3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAccount.java @@ -0,0 +1,88 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 自雇者账户对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_account") +public class UserWorkerAccount extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + private String bankType; + + /** + * 银行账号 + */ + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 银行卡照片 + */ + private String bankCardPic; + + /** + * 预留手机号 + */ + private String phone; + + /** + * 结算通道 + */ + private String passage; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + + private Integer status; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java new file mode 100644 index 0000000..989ea5c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerAuthorized.java @@ -0,0 +1,73 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 授权协议对象 user_worker_authorized + * + * @author LionLi + * @date 2024-04-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_authorized") +public class UserWorkerAuthorized extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 运营商id + */ + private Long opId; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + */ + private Integer signStatus; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 签约文件地址 + */ + private String signFileUrl; + + /** + * 协议签字图片 + */ + private String signPic; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java new file mode 100644 index 0000000..337b5aa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBill.java @@ -0,0 +1,58 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 会员代发金额汇总表对象 user_worker_bill + * + * @author LionLi + * @date 2024-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_bill") +public class UserWorkerBill extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者ID + */ + private Long workerId; + + private Long merId; + + /** + * 服务商ID + */ + private Long sydId; + + /** + * 业务类型 1 委托代征 + */ + private Long busType; + + /** + * 年份 + */ + private String dtmYear; + + /** + * 代发总金额 + */ + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java new file mode 100644 index 0000000..5e58495 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/UserWorkerBusiness.java @@ -0,0 +1,151 @@ +package org.dromara.payment.worker.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 用工签约查询对象 user_worker_business + * + * @author LionLi + * @date 2024-04-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_worker_business") +public class UserWorkerBusiness extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 自雇者id + */ + private Long workId; + + /** + * 结算中心id + */ + private Long sydId; + + /** + * 结算中心编号 + */ + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + private Integer busType; + + /** + * 运营商编号 + */ + private String opNo; + + /** + * 运营商id + */ + private Long opId; + + /** + * 代理商id + */ + private Long channelId; + + /** + * 代理商编号 + */ + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + private String channelCode; + + /** + * 商户id + */ + private Long merId; + + /** + * 商户编号 + */ + private String merNo; + + /** + * 合同编号 + */ + private String no; + + /** + * 签约状态(0:待签约 1:签约成功 2:签约失败) + */ + private Integer signStatus; + + /** + * 签约时间 + */ + private Date signTime; + + /** + * 签约文件地址 + */ + private String signFileUrl; + + /** + * 协议签字图片 + */ + private String signPic; + + /** + * 年代发金额所属年份 + */ + private String moneyYearDate; + + /** + * 年代发金额 + */ + private Long moneyYear; + + /** + * 手机号 + */ + private String vPhone; + + + + /** + * 签约地址 + */ + private String signUrl; + + /** + * 预览地址 + */ + private String webUrl; + + /** + * ossid + */ + private String ossid; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java new file mode 100644 index 0000000..82a81ef --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWokerOperBo.java @@ -0,0 +1,78 @@ +package org.dromara.payment.worker.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWokerOperBo + * @description + * @create 2024-04-29 11:40 + */ + +@Data +public class UserWokerOperBo implements Serializable { + + //企业ID + @NotNull(message = "企业ID不能为空", groups = { AddGroup.class }) + private Long merId; + + //企业编号 + @NotNull(message = "企业编号不能为空", groups = { AddGroup.class }) + private String merNo; + + //服务商编号 + @NotNull(message = "服务商编号不能为空", groups = { AddGroup.class }) + private String sydNo; + + //服务商ID + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class }) + private Long sydId; + + //姓名 + @NotNull(message = "姓名不能为空", groups = { AddGroup.class }) + private String workName; + + //身份证 + @NotNull(message = "身份证不能为空", groups = { AddGroup.class }) + private String idCard; + + //手机号 + @NotNull(message = "手机号不能为空", groups = { AddGroup.class }) + private String phone; + + //业务类型 + @NotNull(message = "业务类型不能为空", groups = { AddGroup.class }) + private Integer busType; + + //开户行名称 + @NotNull(message = "开户行名称不能为空", groups = { AddGroup.class }) + private String khh; + + //开户行名称 + @NotNull(message = "开户行账号不能为空", groups = { AddGroup.class }) + private String backCard; + + private String code; + + //身份证正面 + private String cardPositive; + + //身份证反面 + private String cardBack; + + //银行卡照片 + private String bankPic; + + //人脸照片 + private String facePic; + + private Long work_id; + + private String channelName; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java new file mode 100644 index 0000000..b4a6456 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAccountBo.java @@ -0,0 +1,85 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 自雇者账户业务对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerAccount.class, reverseConvertGenerate = false) +public class UserWorkerAccountBo extends BaseEntity { + + /** + * 主键 + */ + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "用工id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 账户id + */ + private Long accId; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + private Long isDefault; + + /** + * 添加时间 + */ + private Date addTime; + + /** + * 银行卡照片 + */ + private String bankCardPic; + + /** + * 预留手机号 + */ + @NotBlank(message = "预留手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 结算通道 + */ + @NotBlank(message = "结算通道不能为空", groups = { AddGroup.class, EditGroup.class }) + private String passage; + + + private Integer status; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java new file mode 100644 index 0000000..bea1c41 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerAuthorizedBo.java @@ -0,0 +1,108 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 授权协议业务对象 user_worker_authorized + * + * @author LionLi + * @date 2024-04-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerAuthorized.class, reverseConvertGenerate = false) +public class UserWorkerAuthorizedBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + */ + @NotNull(message = "签约状态(0:待签约 1:签约中 2:已签约 3:归档失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStatus; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约时间 + */ + @NotNull(message = "签约时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date signTime; + + /** + * 签约文件地址 + */ + @NotBlank(message = "签约文件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signFileUrl; + + /** + * 协议签字图片 + */ + @NotBlank(message = "协议签字图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signPic; + + + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern="yyyy-MM-dd") + private Date endTime; + + private String scaleName; + + + private String opName; + + private String workName; + + private String idCard; + public Date getEndTime() { + if(this.endTime != null){ + return DateUtils.addOneDay(this.endTime); + } + return this.endTime; + } + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java new file mode 100644 index 0000000..645c16f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBillBo.java @@ -0,0 +1,60 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.payment.worker.domain.UserWorkerBill; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 会员代发金额汇总表业务对象 user_worker_bill + * + * @author LionLi + * @date 2024-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerBill.class, reverseConvertGenerate = false) +public class UserWorkerBillBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者ID + */ + @NotNull(message = "自雇者ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workerId; + + /** + * 服务商ID + */ + @NotNull(message = "服务商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 业务类型 1 委托代征 + */ + @NotNull(message = "业务类型 1 委托代征不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busType; + + /** + * 年份 + */ + @NotBlank(message = "年份不能为空", groups = { AddGroup.class, EditGroup.class }) + private String dtmYear; + + /** + * 代发总金额 + */ + @NotNull(message = "代发总金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java new file mode 100644 index 0000000..238bddc --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBo.java @@ -0,0 +1,221 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.payment.worker.domain.UserWorker; + +/** + * 自雇者业务对象 user_worker + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorker.class, reverseConvertGenerate = false) +public class UserWorkerBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 微信openid + */ + @NotBlank(message = "微信openid不能为空", groups = { AddGroup.class, EditGroup.class }) + private String openId; + + /** + * 姓名 + */ + @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + @NotNull(message = "银行卡是否认证(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isAuthentication; + + /** + * 身份证号 + */ + @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardId; + + /** + * 身份证正面图片 + */ + @NotBlank(message = "身份证正面图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardPositive; + + /** + * 身份证反面图片 + */ + @NotBlank(message = "身份证反面图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cardBack; + + /** + * 银行类型(字典) + */ + @NotBlank(message = "银行类型(字典)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankType; + + /** + * 银行账号 + */ + @NotBlank(message = "银行账号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String bankCard; + + /** + * 是否实名认证(0:否 1:是) + */ + @NotNull(message = "是否实名认证(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + @NotNull(message = "是否签约(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isSign; + + /** + * 签约时间 + */ + @NotNull(message = "签约时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + @NotNull(message = "是否临时税务登记(0:否 1:是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isRegister; + + /** + * 人脸照片 + */ + @NotBlank(message = "人脸照片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String photoPath; + + /** + * 性别 + */ + @NotBlank(message = "性别不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sex; + + /** + * 标签 + */ + @NotBlank(message = "标签不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tag; + + /** + * 区域编码 + */ + @NotBlank(message = "区域编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String userArea; + + /** + * 区域名称 + */ + @NotBlank(message = "区域名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String userAreaName; + + /** + * 添加时间 + */ + @NotNull(message = "添加时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date addTime; + + /** + * 添加人 + */ + @NotBlank(message = "添加人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String addBy; + + /** + * 编辑人 + */ + @NotBlank(message = "编辑人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String editer; + + /** + * 编辑时间 + */ + @NotNull(message = "编辑时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date editTime; + + /** + * 民族 + */ + @NotBlank(message = "民族不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nation; + + /** + * 户籍地址 + */ + @NotBlank(message = "户籍地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String address; + + /** + * 出生日期 + */ + @NotNull(message = "出生日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date birthday; + + /** + * 签发机关 + */ + @NotBlank(message = "签发机关不能为空", groups = { AddGroup.class, EditGroup.class }) + private String issue; + + /** + * 签发日期 + */ + @NotNull(message = "签发日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date issueDate; + + /** + * 失效日期 + */ + @NotBlank(message = "失效日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private String expiryDate; + + /** + * 推荐人 + */ + @NotBlank(message = "推荐人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @NotBlank(message = "支付宝登录号(支持邮箱和手机号格式)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + @NotNull(message = "状态(1:启用 2:禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + + private Long merId; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java new file mode 100644 index 0000000..56bda87 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/bo/UserWorkerBusinessBo.java @@ -0,0 +1,170 @@ +package org.dromara.payment.worker.domain.bo; + +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 用工签约查询业务对象 user_worker_business + * + * @author LionLi + * @date 2024-04-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserWorkerBusiness.class, reverseConvertGenerate = false) +public class UserWorkerBusinessBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 自雇者id + */ + @NotNull(message = "自雇者id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long workId; + + /** + * 结算中心id + */ + @NotNull(message = "结算中心id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sydId; + + /** + * 结算中心编号 + */ + @NotBlank(message = "结算中心编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sydNo; + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @NotNull(message = "业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer busType; + + /** + * 运营商编号 + */ + @NotBlank(message = "运营商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String opNo; + + /** + * 运营商id + */ + @NotNull(message = "运营商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long opId; + + /** + * 代理商id + */ + @NotNull(message = "代理商id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 代理商编号 + */ + @NotBlank(message = "代理商编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelNo; + + /** + * 代理商上下级关系编码 + */ + @NotBlank(message = "代理商上下级关系编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelCode; + + /** + * 商户id + */ + @NotNull(message = "商户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long merId; + + /** + * 商户编号 + */ + @NotBlank(message = "商户编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String merNo; + + /** + * 合同编号 + */ + @NotBlank(message = "合同编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String no; + + /** + * 签约状态(0:待签约 1:签约成功 2:签约失败) + */ + @NotNull(message = "签约状态(0:待签约 1:签约成功 2:签约失败)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer signStatus; + + /** + * 签约时间 + */ + @NotNull(message = "签约时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date signTime; + + /** + * 签约文件地址 + */ + @NotBlank(message = "签约文件地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signFileUrl; + + /** + * 协议签字图片 + */ + @NotBlank(message = "协议签字图片不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signPic; + + /** + * 年代发金额所属年份 + */ + @NotBlank(message = "年代发金额所属年份不能为空", groups = { AddGroup.class, EditGroup.class }) + private String moneyYearDate; + + /** + * 年代发金额 + */ + @NotNull(message = "年代发金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long moneyYear; + + /** + * 手机号 + */ + @NotBlank(message = "手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vPhone; + + /** + * 合同编码 + */ + @NotBlank(message = "合同编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signNo; + + /** + * 签约地址 + */ + @NotBlank(message = "签约地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String signUrl; + + /** + * 预览地址 + */ + @NotBlank(message = "预览地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String webUrl; + + /** + * ossid + */ + @NotBlank(message = "ossid不能为空", groups = { AddGroup.class, EditGroup.class }) + private String ossid; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java new file mode 100644 index 0000000..87672cd --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/ImportResultVo.java @@ -0,0 +1,32 @@ +package org.dromara.payment.worker.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title ImportResultVo + * @description 导入错误信息返回 + * @create 2024-04-28 11:12 + */ +@Data +public class ImportResultVo implements Serializable { + + + //总共1条,导入成功-0条,失败-1条 + private int cnt; + + //导入成功条数 + private int successCnt; + + //失败条数 + private int failCnt; + + //下载错误信息id + private String downId; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java new file mode 100644 index 0000000..d5d29b3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UploadExcelItem.java @@ -0,0 +1,32 @@ +package org.dromara.payment.worker.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title uploadExcelItem + * @description + * @create 2024-04-28 11:13 + */ + +@Data +public class UploadExcelItem implements Serializable { + + @ExcelProperty(value="姓名") + private String name; + + @ExcelProperty(value="身份证号") + private String idCard; + + @ExcelProperty(value="短信接收手机号") + private String phone; + + @ExcelProperty(value="错误信息") + private String errorMsg; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java new file mode 100644 index 0000000..0806f6c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAccountVo.java @@ -0,0 +1,117 @@ +package org.dromara.payment.worker.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者账户视图对象 user_worker_account + * + * @author LionLi + * @date 2024-04-28 + * @date 2024-04-11 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerAccount.class) +public class UserWorkerAccountVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 账户id + */ + @ExcelProperty(value = "账户id") + private Long accId; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 是否默认(0:否 1:是) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isDefault; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 银行卡照片 + */ + @ExcelProperty(value = "银行卡照片") + private String bankCardPic; + + + /** + * 预留手机号 + */ + @ExcelProperty(value = "预留手机号") + private String phone; + + /** + * 结算通道 + */ + @ExcelProperty(value = "结算通道") + private String passage; + + private Integer status; + + private String phoneNoHide; + + public String getPhone() { + if(StringUtils.isNotEmpty(this.phone)){ + return StringUtils.phoneHide(this.phone); + }else{ + return "--"; + } + } + + public String getPhoneNoHide(){ + return this.phone; + } + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java new file mode 100644 index 0000000..bce70c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerAuthorizedVo.java @@ -0,0 +1,133 @@ +package org.dromara.payment.worker.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 授权协议视图对象 user_worker_authorized + * + * @author LionLi + * @date 2024-04-29 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerAuthorized.class) +public class UserWorkerAuthorizedVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 自雇者id + */ + @ExcelProperty(value = "自雇者id") + private Long workId; + + /** + * 运营商id + */ + @ExcelProperty(value = "运营商id") + private Long opId; + + /** + * 运营商编号 + */ + @ExcelProperty(value = "运营商编号") + private String opNo; + + /** + * 签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:待签约,1=:签约中,2=:已签约,3=:归档失败") + private Integer signStatus; + + private Date createTime; + + public String getSignStatusStr() { + if(this.signStatus != null){ + switch (this.signStatus){ + case 0: + return "未签约"; + case 1: + return "签约中"; + case 2: + return "已签约"; + case 3: + return "归档失败"; + default: + return "未签约"; + } + }else{ + return "未签约"; + } + } + + private String signStatusStr; + + + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String no; + + /** + * 签约时间 + */ + @ExcelProperty(value = "签约时间") + private Date signTime; + + /** + * 签约文件地址 + */ + @ExcelProperty(value = "签约文件地址") + private String signFileUrl; + + /** + * 协议签字图片 + */ + @ExcelProperty(value = "协议签字图片") + private String signPic; + + private String opName; + + private String workName; + + + public String getCardId() { + if(this.cardId != null){ + return StringUtils.idcardHide(this.cardId); + }else{ + return "--"; + } + } + + private String cardId; + + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java new file mode 100644 index 0000000..4be15d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBillVo.java @@ -0,0 +1,68 @@ +package org.dromara.payment.worker.domain.vo; + +import org.dromara.payment.worker.domain.UserWorkerBill; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 会员代发金额汇总表视图对象 user_worker_bill + * + * @author LionLi + * @date 2024-09-03 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerBill.class) +public class UserWorkerBillVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 自雇者ID + */ + @ExcelProperty(value = "自雇者ID") + private Long workerId; + + /** + * 服务商ID + */ + @ExcelProperty(value = "服务商ID") + private Long sydId; + + /** + * 业务类型 1 委托代征 + */ + @ExcelProperty(value = "业务类型 1 委托代征") + private Long busType; + + /** + * 年份 + */ + @ExcelProperty(value = "年份") + private String dtmYear; + + /** + * 代发总金额 + */ + @ExcelProperty(value = "代发总金额") + private Long amount; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java new file mode 100644 index 0000000..3ce71a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerBusinessVo.java @@ -0,0 +1,265 @@ +package org.dromara.payment.worker.domain.vo; + +import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 用工签约查询视图对象 user_worker_business + * + * @author LionLi + * @date 2024-04-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorkerBusiness.class) +public class UserWorkerBusinessVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ +// @ExcelProperty(value = "主键") + @ExcelIgnore + private Long id; + + /** + * 自雇者id + */ +// @ExcelProperty(value = "自雇者id") + @ExcelIgnore + private Long workId; + + /** + * 结算中心id + */ +// @ExcelProperty(value = "结算中心id") + @ExcelIgnore + private Long sydId; + + /** + * 结算中心编号 + */ +// @ExcelProperty(value = "结算中心编号") + @ExcelIgnore + private String sydNo; + + + /** + * 运营商编号 + */ +// @ExcelProperty(value = "运营商编号") + @ExcelIgnore + private String opNo; + + /** + * 运营商id + */ +// @ExcelProperty(value = "运营商id") + @ExcelIgnore + private Long opId; + + /** + * 代理商id + */ +// @ExcelProperty(value = "代理商id") + @ExcelIgnore + private Long channelId; + + + /** + * 代理商编号 + */ +// @ExcelProperty(value = "代理商编号") + @ExcelIgnore + private String channelNo; + + /** + * 代理商上下级关系编码 + */ +// @ExcelProperty(value = "代理商上下级关系编码") + @ExcelIgnore + private String channelCode; + + + /** + * 商户id + */ +// @ExcelProperty(value = "商户id") + @ExcelIgnore + private Long merId; + + /** + * 商户编号 + */ +// @ExcelProperty(value = "商户编号") + @ExcelIgnore + private String merNo; + + /** + * 合同编号 + */ +// @ExcelProperty(value = "合同编号") + @ExcelIgnore + private String no; + + + /** + * 签约时间 + */ +// @ExcelProperty(value = "签约时间") + @ExcelIgnore + private Date signTime; + + /** + * 签约文件地址 + */ +// @ExcelProperty(value = "签约文件地址") + @ExcelIgnore + private String signFileUrl; + + /** + * 协议签字图片 + */ +// @ExcelProperty(value = "协议签字图片") + @ExcelIgnore + private String signPic; + + /** + * 年代发金额所属年份 + */ +// @ExcelProperty(value = "年代发金额所属年份") + @ExcelIgnore + private String moneyYearDate; + + /** + * 年代发金额 + */ +// @ExcelProperty(value = "年代发金额") + @ExcelIgnore + private Long moneyYear; + + + + /** + * 签约地址 + */ +// @ExcelProperty(value = "签约地址") + @ExcelIgnore + private String signUrl; + + /** + * 预览地址 + */ +// @ExcelProperty(value = "预览地址" + @ExcelIgnore + private String webUrl; + + /** + * ossid + */ +// @ExcelProperty(value = "ossid") + @ExcelIgnore + private String ossid; + + + @ExcelProperty(value = "创建时间") + private Date createTime; + + @ExcelProperty(value = "用工姓名") + private String workName; + + + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 手机号 + */ + @ExcelIgnore + private String vPhone; + + + public String getPhoneStr() { + return this.getvPhone(); + } + + @ExcelProperty(value = "手机号") + private String phoneStr; + + + + @ExcelProperty(value = "企业名称") + private String busMerName; + + + @ExcelProperty(value = "服务商名称") + private String serviceName; + + + /** + * 业务类型(1:委托代征,2:自然人代开,3:个体户注册 4:临时税务登记 5:资金代发 6:派遣&外包 + */ + @ExcelProperty(value = "业务类型" , converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType="wxfe_bus_type") + private Integer busType; + + + /** + * 签约状态(0:待签约 1:签约成功 2:签约失败) + */ + @ExcelProperty(value = "签约状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sign_status") + private Integer signStatus; + + + + + public String getvPhone() { + if(StringUtils.isNotEmpty(this.vPhone)){ + return StringUtils.phoneHide(this.vPhone); + }else{ + return "--"; + } + } + + + public String getvPhoneNoHide() { + return this.vPhone; + } + + @ExcelIgnore + private String phone; + + + public String getCardId() { + if(StringUtils.isNotEmpty(this.cardId)){ + return StringUtils.idcardHide(this.cardId); + }else{ + return "--"; + } + + } + + @ExcelIgnore + private String cardPositive; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java new file mode 100644 index 0000000..669183d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerNoHideVo.java @@ -0,0 +1,20 @@ +package org.dromara.payment.worker.domain.vo; + +import lombok.Data; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerNoHideVo + * @description + * @create 2024-05-12 6:15 + */ +@Data +public class UserWorkerNoHideVo extends UserWorkerVo{ + + private String cardIdNoHide; + + private String phoneNoHide; + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java new file mode 100644 index 0000000..6e9d44c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/domain/vo/UserWorkerVo.java @@ -0,0 +1,299 @@ +package org.dromara.payment.worker.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.payment.worker.domain.UserWorker; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 自雇者视图对象 user_worker + * + * @author LionLi + * @date 2024-04-08 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserWorker.class) +public class UserWorkerVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + private Date createTime; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long id; + + /** + * 微信openid + */ + @ExcelProperty(value = "微信openid") + private String openId; + + /** + * 姓名 + */ + @ExcelProperty(value = "姓名") + private String name; + + /** + * 手机号 + */ + @ExcelProperty(value = "手机号") + private String phone; + + /** + * 银行卡是否认证(0:否 1:是) + */ + @ExcelProperty(value = "银行卡是否认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuthentication; + + public String getCardId() { + if (StringUtils.isNotBlank(cardId)) { + return StringUtils.idcardHide(cardId); + }else{ + return "--"; + } + } + + + public String getCardIdNoHide(){ + return this.cardId; + } + + + public String getPhoneNoHide(){ + return this.phone; + } + + + /** + * 身份证号 + */ + @ExcelProperty(value = "身份证号") + private String cardId; + + /** + * 身份证正面图片 + */ + @ExcelProperty(value = "身份证正面图片") + private String cardPositive; + + /** + * 身份证反面图片 + */ + @ExcelProperty(value = "身份证反面图片") + private String cardBack; + + /** + * 银行类型(字典) + */ + @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "字=典") + private String bankType; + + /** + * 银行账号 + */ + @ExcelProperty(value = "银行账号") + private String bankCard; + + /** + * 银行账户id + */ + private Integer bankAccId; + + /** + * 是否实名认证(0:否 1:是) + */ + @ExcelProperty(value = "是否实名认证", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isAuth; + + /** + * 是否签约(0:否 1:是) + */ + @ExcelProperty(value = "是否签约", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isSign; + + /** + * 签约时间 + */ + @ExcelProperty(value = "签约时间") + private Date signTime; + + /** + * 是否临时税务登记(0:否 1:是) + */ + @ExcelProperty(value = "是否临时税务登记", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=:否,1=:是") + private Long isRegister; + + /** + * 人脸照片 + */ + @ExcelProperty(value = "人脸照片") + private String photoPath; + + /** + * 性别 + */ + @ExcelProperty(value = "性别") + private String sex; + + /** + * 标签 + */ + @ExcelProperty(value = "标签") + private String tag; + + /** + * 区域编码 + */ + @ExcelProperty(value = "区域编码") + private String userArea; + + /** + * 区域名称 + */ + @ExcelProperty(value = "区域名称") + private String userAreaName; + + /** + * 添加时间 + */ + @ExcelProperty(value = "添加时间") + private Date addTime; + + /** + * 添加人 + */ + @ExcelProperty(value = "添加人") + private String addBy; + + /** + * 编辑人 + */ + @ExcelProperty(value = "编辑人") + private String editer; + + /** + * 编辑时间 + */ + @ExcelProperty(value = "编辑时间") + private Date editTime; + + /** + * 民族 + */ + @ExcelProperty(value = "民族") + private String nation; + + /** + * 户籍地址 + */ + @ExcelProperty(value = "户籍地址") + private String address; + + /** + * 出生日期 + */ + @ExcelProperty(value = "出生日期") + private Date birthday; + + /** + * 签发机关 + */ + @ExcelProperty(value = "签发机关") + private String issue; + + /** + * 签发日期 + */ + @ExcelProperty(value = "签发日期") + private Date issueDate; + + /** + * 失效日期 + */ + @ExcelProperty(value = "失效日期") + private String expiryDate; + + /** + * 推荐人 + */ + @ExcelProperty(value = "推荐人") + private String referrerBy; + + /** + * 支付宝登录号(支持邮箱和手机号格式) + */ + @ExcelProperty(value = "支付宝登录号(支持邮箱和手机号格式)") + private String alipayLogonId; + + /** + * 状态(1:启用 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:启用,2=:禁用") + private Integer status; + + /** + * 年代发金额所属年份 + */ + private String moneyYearDate; + + private Long workId; + + + private Long merId; + + /** + * 年代发金额 + */ + private Long moneyYear; + + + + private String statusStr; + + + public String getStatusStr() { + if(this.status != null){ + if(this.status == 1){ + return "已启用"; + }else{ + return "未启用"; + } + }else{ + return "--"; + } + } + + + public String getPhone() { + if(StringUtils.isNotEmpty(this.phone)){ + return StringUtils.phoneHide(this.phone); + }else{ + return "--"; + } + } + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java new file mode 100644 index 0000000..039c8cf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAccountMapper.java @@ -0,0 +1,27 @@ +package org.dromara.payment.worker.mapper; + +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; + + +/** + * 自雇者账户Mapper接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface UserWorkerAccountMapper extends BaseMapperPlus { + + + /*** + * 根据用工id,通道,银行卡号查询银行卡信息 + * @param bo + * @return + */ + public List selctBankInfoByUidChannelBankNo(UserWokerOperBo bo); + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java new file mode 100644 index 0000000..6f954ea --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerAuthorizedMapper.java @@ -0,0 +1,37 @@ +package org.dromara.payment.worker.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAuthorizedVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 授权协议Mapper接口 + * + * @author LionLi + * @date 2024-04-29 + */ +public interface UserWorkerAuthorizedMapper extends BaseMapperPlus { + + + /*** + * 查询授权协议列表 + * @param page + * @param wrapper + * @return + */ + Page selUserWorkerAuthorList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + /*** + * 查询授权协议详情 + * @param auBo + * @return + */ + UserWorkerAuthorizedVo selUserWorkerAuthorInfo(UserWorkerAuthorizedBo auBo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java new file mode 100644 index 0000000..195318b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBillMapper.java @@ -0,0 +1,24 @@ +package org.dromara.payment.worker.mapper; + +import org.dromara.payment.worker.domain.UserWorkerBill; +import org.dromara.payment.worker.domain.vo.UserWorkerBillVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +import java.util.List; +import java.util.Map; + +/** + * 会员代发金额汇总表Mapper接口 + * + * @author LionLi + * @date 2024-09-03 + */ +public interface UserWorkerBillMapper extends BaseMapperPlus { + + + public List selectCurentDayWorkerBillInfo(Map paraMap); + + + + public int deleteUserWorkerBillByInfo(Map paraMap); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java new file mode 100644 index 0000000..3bc5bf8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerBusinessMapper.java @@ -0,0 +1,124 @@ +package org.dromara.payment.worker.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.payment.worker.domain.vo.UserWorkerBusinessVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; + +import java.util.List; +import java.util.Map; + +/** + * 用工签约查询Mapper接口 + * + * @author LionLi + * @date 2024-04-26 + */ +public interface UserWorkerBusinessMapper extends BaseMapperPlus { + + + /*** + * 用工签约查询 + * @param page + * @param wrapper + * @return + */ + Page selUserWorkSignLists(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + + + /*** + * 用工签约查询 ,不分页 + * @param wrapper + * @return + */ + List selUserWorkSignLists( @Param(Constants.WRAPPER) Wrapper wrapper); + + + + + /*** + * 根据签约id,查询用工签约详情 + * @param id + * @return + */ + UserWorkerBusinessVo selUserWorkDetail(Long id); + + + /*** + * 更新用工信息 + * @param userWorkerBo + * @return + */ + int updateUserWorkByCardId(UserWorkerBo userWorkerBo); + + /*** + * 更新用工信息 + * @param uwbo + * @return + */ + int updateUserWorkBisByWorkId(UserWorkerBusinessBo uwbo); + +// int updateUserWorkByPhone(UserWorkerBo userWorkerBo); + + + /*** + * 根据身份证查询用工信息 + * @param merId + * @param cardId + * @return + */ + UserWorkerBusinessVo selUserWorkByIdCard(@Param("merId")Long merId,@Param("cardId")String cardId,@Param("busType")Integer busType,@Param("sydId")Long sydId); + + + /*** + * 簽約信息查詢會員信息 + * @param bo + * @return + */ + UserWorkerVo selMemberInfo(UserWorkerBusinessBo bo); + + + /*** + * 根据服务商ID,获取签约默认渠道 + * @param sydId + * @return + */ + String selSydDefaultChannel(Long sydId); + + + Page selUserWorkByMerServInfo(@Param("page") IPage page, + @Param("merId")Long merId, + @Param("sydId")Long sydId, + @Param("workIds")String workIds, + @Param("busType")Integer busType); + + + List selUserWorkByMerServInfo( + @Param("merId")Long merId, + @Param("sydId")Long sydId, + @Param("workIds")String workIds, + @Param("busType")Integer busType); + + + + List selUserWorkBizByCon(Map map); + + + /**** + * 根据自雇者id,服务商id,业务类型查询签约信息 + * @param map + * @return + */ + List selUserWorkBizByWorkIdSydIdBusType(Map map); + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java new file mode 100644 index 0000000..45b22ce --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/mapper/UserWorkerMapper.java @@ -0,0 +1,28 @@ +package org.dromara.payment.worker.mapper; + + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; + +import java.util.List; + +/** + * 自雇者Mapper接口 + * + * @author LionLi + * @date 2024-04-08 + */ +public interface UserWorkerMapper extends BaseMapperPlus { + /** + * 根据身份证号查询自雇者信息 + * @param cardIds 身份证号列表 + * @param passage 结算通道 + * @param sydId 签约服务商id + * @param merId 签约商户id + * @return + */ + List selectByCardId(@Param("cardIds") List cardIds, @Param("passage") String passage,@Param("sydId") Long sydId, + @Param("merId") Long merId,@Param("busType")Integer busType); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java new file mode 100644 index 0000000..697fdba --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IIdCardAndOtherService.java @@ -0,0 +1,86 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.ThirdConf; + +/** + * @author sunzexing + * @version 1.0 + * @title IIdCardAndOtherService + * @description 身份证,银行卡验证等三方接口 + * @create 2024-04-28 16:31 + */ +public interface IIdCardAndOtherService { + + + + /*** + * 身份证二要素认证 + * @param name + * @param idCard + * @throws Exception + */ + boolean cardId2(String name, String idCard, String code) throws Exception; + + + /*** + * 银行卡四要素认证 + * @param bankCard + * @param name + * @param phone + * @param idCard + * @return + * @throws Exception + */ + boolean bankCard4(String bankCard,String name,String phone,String idCard,String code)throws Exception; + + + /*** + * 银行卡三要素认证 + * @param bankCard + * @param name + * @param idCard + * @return + * @throws Exception + */ + boolean bankCard3(String bankCard,String name,String idCard,String code)throws Exception; + + + + /*** + * 身份证二要素认证 + * @param name + * @param idCard + * @param config + * @return + * @throws Exception + */ + boolean cardId2(String name, String idCard, ThirdConf config) throws Exception; + + + /*** + * 银行卡四要素认证 + * @param bankCard + * @param name + * @param phone + * @param idCard + * @param conf + * @return + * @throws Exception + */ + boolean bankCard4(String bankCard,String name,String phone,String idCard,ThirdConf conf)throws Exception; + + + /*** + * 银行卡三要素认证 + * @param bankCard + * @param name + * @param idCard + * @param conf + * @return + * @throws Exception + */ + boolean bankCard3(String bankCard,String name,String idCard,ThirdConf conf)throws Exception; + + + +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java new file mode 100644 index 0000000..54e3af3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAccountService.java @@ -0,0 +1,57 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自雇者账户Service接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface IUserWorkerAccountService { + + /** + * 查询自雇者账户 + */ + UserWorkerAccountVo queryById(Long id); + + /** + * 查询自雇者账户列表 + */ + TableDataInfo queryPageList(UserWorkerAccountBo bo, PageQuery pageQuery); + + /** + * 查询自雇者账户列表 + */ + List queryList(UserWorkerAccountBo bo); + + /** + * 新增自雇者账户 + */ + Boolean insertByBo(UserWorkerAccountBo bo); + + /** + * 修改自雇者账户 + */ + Boolean updateByBo(UserWorkerAccountBo bo); + + /** + * 校验并批量删除自雇者账户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /**** + * 账单补发,修改自雇者银行卡信息 + * @param bo + * @return + */ + UserWorkerAccount rePayMdyWorkerBank(UserWorkerAccountBo bo); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java new file mode 100644 index 0000000..77de8ac --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerAuthorizedService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.payment.worker.domain.vo.UserWorkerAuthorizedVo; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 授权协议Service接口 + * + * @author LionLi + * @date 2024-04-29 + */ +public interface IUserWorkerAuthorizedService { + + /** + * 查询授权协议 + */ + UserWorkerAuthorizedVo queryById(Long id); + + /** + * 查询授权协议列表 + */ + TableDataInfo queryPageList(UserWorkerAuthorizedBo bo, PageQuery pageQuery); + + /** + * 查询授权协议列表 + */ + List queryList(UserWorkerAuthorizedBo bo); + + /** + * 新增授权协议 + */ + Boolean insertByBo(UserWorkerAuthorizedBo bo); + + /** + * 修改授权协议 + */ + Boolean updateByBo(UserWorkerAuthorizedBo bo); + + /** + * 校验并批量删除授权协议信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java new file mode 100644 index 0000000..243fd4d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerBusinessService.java @@ -0,0 +1,124 @@ +package org.dromara.payment.worker.service; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.*; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; +import java.util.List; + +/** + * 用工签约查询Service接口 + * + * @author LionLi + * @date 2024-04-26 + */ +public interface IUserWorkerBusinessService { + + + /*** + * 查询企业在所选服务商中未签约的用工者信息 + * @param pageQuery + * @param sydId + * @param merId + * @param busType + * @return + */ + TableDataInfo selUserWorkByMerServInfo(PageQuery pageQuery, Long sydId,Long merId,Integer busType); + + /** + * 查询用工签约查询 + */ + UserWorkerBusinessVo queryById(Long id); + + /** + * 查询用工签约查询列表 + */ + TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery); + + /** + * 查询用工签约查询列表 + */ + List queryList(CommonSelConditionEntity bo); + + /** + * 新增用工签约查询 + */ + Boolean insertByBo(UserWorkerBusinessBo bo); + + /** + * 修改用工签约查询 + */ + Boolean updateByBo(UserWorkerBusinessBo bo); + + /** + * 校验并批量删除用工签约查询信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /*** + * 用工签约导入 + * @param file + * @return + */ + ImportResultVo upload(MultipartFile file, Integer busType, Long sydId,String sydNo,String code,Long merId,String merNo)throws Exception; + + + /*** + * 下载错误信息 + * @param uuid + */ + List selErrorList(String uuid); + + + /*** + * 根據簽約信息,查詢對應的會員信息 + * @param bo + * @return + */ + UserWorkerVo selMemberInfo(UserWorkerBusinessBo bo); + + + /*** + * 添加用戶-运营商 + * @param bo + * @return + */ + Boolean addUserWorkdBz(UserWokerOperBo bo) throws Exception; + + + + Boolean operAddUserWorkSel(Long merId,Long sydId,Integer busType,String workIds); + + + Boolean operAddUserWorkAll(Long merId, Long sydId, Integer busType); + + + Boolean updateUserWorkInfo(UserWorkerBo uw); + + + UserWorkerNoHideVo selMemberInfoNySignId(UserWorkerBusinessBo bo ); + + + /*** + * 单个导出用工的身份证信息 + * @param workId + * @param response + */ + void exportCardImg(Long workId, HttpServletResponse response)throws Exception; + + /**** + * 批量导出用工者身份证信息 + * @param workIds + */ + void exportMutiCardImg(String workIds) throws Exception; +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java new file mode 100644 index 0000000..1a83f91 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/IUserWorkerService.java @@ -0,0 +1,49 @@ +package org.dromara.payment.worker.service; + +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 自雇者Service接口 + * + * @author LionLi + * @date 2024-04-28 + */ +public interface IUserWorkerService { + + /** + * 查询自雇者 + */ + UserWorkerVo queryById(Long id); + + /** + * 查询自雇者列表 + */ + TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery); + + /** + * 查询自雇者列表 + */ + List queryList(UserWorkerBo bo); + + /** + * 新增自雇者 + */ + Boolean insertByBo(UserWorkerBo bo); + + /** + * 修改自雇者 + */ + Boolean updateByBo(UserWorkerBo bo); + + /** + * 校验并批量删除自雇者信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java new file mode 100644 index 0000000..6696c95 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/TencentIdCardAndOtherServiceImpl.java @@ -0,0 +1,197 @@ +package org.dromara.payment.worker.service.impl; + +import com.tencentcloudapi.common.profile.ClientProfile; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.MpContants; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.payment.worker.domain.SysUnitDomain; +import org.dromara.payment.worker.domain.ThirdConf; +import org.dromara.payment.worker.service.IIdCardAndOtherService; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.stereotype.Service; + +import com.tencentcloudapi.common.AbstractModel; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.faceid.v20180301.FaceidClient; +import com.tencentcloudapi.faceid.v20180301.models.*; + +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title IdCardAndOtherServiceImpl + * @description + * @create 2024-04-28 16:36 + */ +@Service +@Slf4j +public class TencentIdCardAndOtherServiceImpl extends BaseService implements IIdCardAndOtherService { + + + @DubboReference + private RemoteConfigService remoteConfigService; + + + @Override + public boolean cardId2(String name, String idCard, String code) throws Exception { + ThirdConf tc = this.getThirdConfig(code,"idcardAuthConfig"); + return this.cardId2(name,idCard,tc); + } + + @Override + public boolean bankCard4(String bankCard, String name, String phone, String idCard, String code) throws Exception { + ThirdConf tc = this.getThirdConfig(code,"bankCard4Config"); + return this.bankCard4(bankCard,name,phone,idCard,tc); + } + + @Override + public boolean bankCard3(String bankCard, String name, String idCard, String code) throws Exception { + return this.bankCard4(bankCard,name,null,idCard,code); + } + + @Override + public boolean cardId2(String name, String idCard, ThirdConf config) throws Exception { + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential crd = new Credential(config.getSecretId(),config.getSecretKey()); + + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile hpf = new HttpProfile(); + hpf.setEndpoint(config.getEndPoint()); + + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(hpf); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(crd, config.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + IdCardVerificationRequest req = new IdCardVerificationRequest(); + + req.setName(name); + req.setIdCard(idCard); + // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应 + IdCardVerificationResponse resp = client.IdCardVerification(req); + log.info("身份证二要素识姓名:["+name+"],idcard["+idCard+"]别返回结果: "+ AbstractModel.toJsonString(resp)); + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BaseException(resp.getDescription()); + } + }catch(TencentCloudSDKException e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw new BaseException(e.getMessage()) ; + }catch (Exception e){ + log.error("身份证二要素认证出错:姓名:{},身份证号{},错误信息{}",name,idCard,e.getMessage()); + throw e; + } + } + + @Override + public boolean bankCard4(String bankCard, String name, String phone, String idCard, ThirdConf conf) throws Exception { + try{ + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(conf.getSecretId(), conf.getSecretKey()); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 推荐使用北极星,相关指引可访问如下链接 + // https://git.woa.com/tencentcloud-internal/tencentcloud-sdk-java#%E5%8C%97%E6%9E%81%E6%98%9F + httpProfile.setEndpoint(conf.getEndPoint()); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + FaceidClient client = new FaceidClient(cred, conf.getRegion(), clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + + if(StringUtils.isNotEmpty(phone)){ + BankCard4EVerificationRequest req = new BankCard4EVerificationRequest(); + req.setName(name); + req.setBankCard(bankCard); + req.setIdCard(idCard); + req.setPhone(phone); + // 返回的resp是一个BankCard4EVerificationResponse的实例,与请求对象对应 + BankCard4EVerificationResponse resp = client.BankCard4EVerification(req); + log.info("银行卡四要素:["+bankCard+","+name+","+phone+","+idCard+"]返回结果: "+ AbstractModel.toJsonString(resp)); + + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BaseException(resp.getDescription()); + } + }else{ + BankCardVerificationRequest req = new BankCardVerificationRequest(); + req.setIdCard(idCard); + req.setName(name); + req.setBankCard(bankCard); + BankCardVerificationResponse resp = client.BankCardVerification(req); + log.info("银行卡三要素:["+bankCard+","+name+","+phone+","+idCard+"]返回结果: "+ AbstractModel.toJsonString(resp)); + if("0".equals(resp.getResult())){ + return true; + }else{ + throw new BaseException(resp.getDescription()); + } + } + } catch (TencentCloudSDKException e) { + log.error("银行卡三/四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},状态码{},错误信息{}",phone,name,idCard,bankCard,e.getErrorCode(),e.getMessage()); + throw e; + } catch(Exception e){ + e.printStackTrace(); + log.error("银行卡三/四要素认证出错:手机号:{},姓名{},身份证{},银行卡{},错误信息{}",phone,name,idCard,bankCard,e.getMessage()); + throw e; + } + } + + + + @Override + public boolean bankCard3(String bankCard, String name, String idCard, ThirdConf conf) throws Exception { + return this.bankCard4(bankCard,name,null,idCard,conf); + } + + + public ThirdConf getThirdConfig(String code,String type ){ + + Map configMap = this.mpOtherThirdConfig(code); + if(configMap == null){ + throw new RuntimeException("站点第三方参数未配置!"); + } + Map subMap = (Map) configMap.get(type); + ThirdConf thirdConf = JsonUtils.parseObject(JsonUtils.toJsonString(subMap),ThirdConf.class); + return thirdConf; + } + + public Map mpOtherThirdConfig(String domainCode) { + + + RemoteSysUnitDomainVo unitDomainVo = this.remoteConfigService.queryByDomainName(domainCode); + + if(unitDomainVo == null){ + this.invalidationParamsException("此站点无配置-身份证识别等"); + } + String thirdConfigStr = unitDomainVo.getWeChatThirdParams(); + return JsonUtils.parseObject(thirdConfigStr,Map.class); +// String cacheKey = MpContants.MP_DOMAIN_KEY+domainCode; +// Object obj = RedisUtils.getCacheObject(cacheKey); +// Map map = JsonUtils.parseObject(JsonUtils.toJsonString(obj),Map.class); +// SysUnitDomain mpDomainVo = RedisUtils.getCacheObject(cacheKey); +// if(mpDomainVo != null){ +// String thirdConfigStr = mpDomainVo.getWeChatThirdParams(); +// return JsonUtils.parseObject(thirdConfigStr,Map.class); +// } +// return null; + + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java new file mode 100644 index 0000000..8404681 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAccountServiceImpl.java @@ -0,0 +1,304 @@ +package org.dromara.payment.worker.service.impl; + +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAccountVo; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.service.IUserWorkerAccountService; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者账户Service业务层处理 + * + * @author LionLi + * @date 2024-04-28 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerAccountServiceImpl extends BaseService implements IUserWorkerAccountService { + + private final UserWorkerAccountMapper baseMapper; + + @DubboReference + private RemoteAccountService accountService; + @Resource + private UserWorkerMapper userWorkerMapper; + /** + * 查询自雇者账户 + */ + @Override + public UserWorkerAccountVo queryById(Long id){ + UserWorkerAccountVo vo = baseMapper.selectVoById(id); + return vo; + } + + /** + * 查询自雇者账户列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerAccountBo bo, PageQuery pageQuery) { + bo.setStatus(1); + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询自雇者账户列表 + */ + @Override + public List queryList(UserWorkerAccountBo bo) { + + if(bo.getWorkId() == null){ + this.invalidationParamsException("用工ID不能为空"); + } + + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerAccountBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getWorkId() != null, "work_id", bo.getWorkId()); + lqw.eq(bo.getAccId() != null, "acc_id", bo.getAccId()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(bo.getIsDefault() != null, "is_default", bo.getIsDefault()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCardPic()), "bank_card_pic", bo.getBankCardPic()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getPassage()), "passage", bo.getPassage()); + lqw.orderByDesc("create_time"); + return lqw; + } + + /** + * 新增自雇者账户 + */ + @Override + public Boolean insertByBo(UserWorkerAccountBo bo) { + UserWorkerAccount add = MapstructUtils.convert(bo, UserWorkerAccount.class); + validEntityBeforeSave(add); + UserWokerOperBo bno = new UserWokerOperBo(); + bno.setWork_id(bo.getWorkId()); + bno.setChannelName(bo.getPassage()); + List accountVo = this.baseMapper.selctBankInfoByUidChannelBankNo(bno); + boolean isDefault = false; + boolean cz = false; + UserWorkerAccountVo selVo = null; + + if(accountVo != null && !accountVo.isEmpty()){ + for(UserWorkerAccountVo vo :accountVo){ + if(vo.getIsDefault() == 1){ + isDefault = true; + } + if(vo.getBankCard().equals(bo.getBankCard())){ + cz = true; + selVo = vo; + } + } + } + + if(cz){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(selVo.getId()); + uwab.setStatus(1); + uwab.setPhone(bo.getPhone()); + this.baseMapper.updateById(uwab); + }else if(!cz){ + + UserWorker uw = this.userWorkerMapper.selectById(bo.getWorkId()); + //先生成账号 + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bo.getBankCard()); + bankAcc.setBankType(bo.getBankType()); + bankAcc.setUnitId(0L); + bankAcc.setName(uw.getName()); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId == null){ + this.invalidationParamsException("创建账号失败!"); + } + + //添加银行卡 + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setWorkId(bo.getWorkId()); + uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(bo.getBankCard()); + uwab.setPassage(bo.getPassage()); + uwab.setBankType(bo.getBankType()); + uwab.setCreateTime(new Date()); + uwab.setPhone(bo.getPhone()); + uwab.setCreateBy(LoginHelper.getUserId()); + if(!isDefault){ + uwab.setIsDefault(1L); + }else{ + uwab.setIsDefault(0L); + } + this.baseMapper.insert(uwab); + } + return true; + } + + /** + * 修改自雇者账户 + */ + @Override + public Boolean updateByBo(UserWorkerAccountBo bo) { + UserWorkerAccount update = MapstructUtils.convert(bo, UserWorkerAccount.class); + validEntityBeforeSave(update); + update.setUpdateBy(LoginHelper.getUserId()); + update.setCreateTime(new Date()); + + UserWorkerAccountVo uwav = this.baseMapper.selectVoById(bo.getId()); + if(uwav != null){ + if(uwav.getBankCard().equals(bo.getBankCard())){ + baseMapper.updateById(update); + }else{ + UserWorkerAccount b = new UserWorkerAccount(); + b.setId(bo.getId()); + b.setStatus(0); + baseMapper.updateById(b); + this.insertByBo(bo); + } + } + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkerAccount entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者账户 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public UserWorkerAccount rePayMdyWorkerBank(UserWorkerAccountBo bo) { + UserWorkerAccount add = MapstructUtils.convert(bo, UserWorkerAccount.class); + validEntityBeforeSave(add); + UserWokerOperBo bno = new UserWokerOperBo(); + bno.setWork_id(bo.getWorkId()); + bno.setChannelName(bo.getPassage()); + List accountVo = this.baseMapper.selctBankInfoByUidChannelBankNo(bno); + boolean isDefault = false; + boolean cz = false; + UserWorkerAccountVo defaultVo = null; + UserWorkerAccountVo selVo = null; + + if(accountVo != null && !accountVo.isEmpty()){ + for(UserWorkerAccountVo vo :accountVo){ + if(vo.getIsDefault() == 1){ + isDefault = true; + defaultVo = vo; + } + if(vo.getBankCard().equals(bo.getBankCard())){ + cz = true; + selVo = vo; + } + } + } + + if(defaultVo != null){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(defaultVo.getId()); + uwab.setIsDefault(0L); + this.baseMapper.updateById(uwab); + } + + if(cz){ + + + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(selVo.getId()); + uwab.setStatus(1); + uwab.setIsDefault(1L); + uwab.setPhone(bo.getPhone()); + this.baseMapper.updateById(uwab); + uwab.setAccId(selVo.getAccId()); + uwab.setBankType(selVo.getBankType()); + uwab.setBankCard(selVo.getBankCard()); + uwab.setWorkId(selVo.getWorkId()); + return uwab; + }else if(!cz){ + + UserWorker uw = this.userWorkerMapper.selectById(bo.getWorkId()); + //先生成账号 + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bo.getBankCard()); + bankAcc.setBankType(bo.getBankType()); + bankAcc.setUnitId(0L); + bankAcc.setName(uw.getName()); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId == null){ + this.invalidationParamsException("创建账号失败!"); + } + + if(defaultVo != null){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(defaultVo.getId()); + uwab.setIsDefault(0L); + this.baseMapper.updateById(uwab); + } + + //添加银行卡 + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setWorkId(bo.getWorkId()); + uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(bo.getBankCard()); + uwab.setPassage(bo.getPassage()); + uwab.setBankType(bo.getBankType()); + uwab.setCreateTime(new Date()); + uwab.setPhone(bo.getPhone()); + uwab.setCreateBy(LoginHelper.getUserId()); + uwab.setIsDefault(1L); +// if(!isDefault){ +// uwab.setIsDefault(1L); +// }else{ +// uwab.setIsDefault(0L); +// } + this.baseMapper.insert(uwab); + + return uwab; + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java new file mode 100644 index 0000000..35c48f0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerAuthorizedServiceImpl.java @@ -0,0 +1,128 @@ +package org.dromara.payment.worker.service.impl; + +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerAuthorizedBo; +import org.dromara.payment.worker.domain.vo.UserWorkerAuthorizedVo; +import org.dromara.payment.worker.domain.UserWorkerAuthorized; +import org.dromara.payment.worker.mapper.UserWorkerAuthorizedMapper; +import org.dromara.payment.worker.service.IUserWorkerAuthorizedService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 授权协议Service业务层处理 + * + * @author LionLi + * @date 2024-04-29 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerAuthorizedServiceImpl extends BaseService implements IUserWorkerAuthorizedService { + + private final UserWorkerAuthorizedMapper baseMapper; + + /** + * 查询授权协议 + */ + @Override + public UserWorkerAuthorizedVo queryById(Long id){ + if(id == null){ + this.invalidationParamsException("签约ID不能为空"); + } + UserWorkerAuthorizedBo bo = new UserWorkerAuthorizedBo(); + bo.setId(id); + return baseMapper.selUserWorkerAuthorInfo(bo); + } + + /** + * 查询授权协议列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerAuthorizedBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selUserWorkerAuthorList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询授权协议列表 + */ + @Override + public List queryList(UserWorkerAuthorizedBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerAuthorizedBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.like(StringUtils.isNotEmpty(bo.getOpName()),"t2.name",bo.getOpName()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t1.name",bo.getWorkName()); + lqw.like(StringUtils.isNotEmpty(bo.getIdCard()),"t1.card_id",bo.getIdCard()); + lqw.eq(bo.getSignStatus() != null, "sign_status", bo.getSignStatus()); + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("t.op_id",LoginHelper.getBusId()); + } + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "no", bo.getNo()); + lqw.orderByDesc("t.create_time"); + return lqw; + } + + /** + * 新增授权协议 + */ + @Override + public Boolean insertByBo(UserWorkerAuthorizedBo bo) { + UserWorkerAuthorized add = MapstructUtils.convert(bo, UserWorkerAuthorized.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改授权协议 + */ + @Override + public Boolean updateByBo(UserWorkerAuthorizedBo bo) { + UserWorkerAuthorized update = MapstructUtils.convert(bo, UserWorkerAuthorized.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkerAuthorized entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除授权协议 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java new file mode 100644 index 0000000..5058b24 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerBusinessServiceImpl.java @@ -0,0 +1,941 @@ +package org.dromara.payment.worker.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.IdcardUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.base.BaseException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.payment.channel.domain.BusChannel; +import org.dromara.payment.channel.mapper.BusChannelMapper; +import org.dromara.payment.common.domain.CommonSelConditionEntity; +import org.dromara.payment.merchant.domain.bo.BusMerchantBo; +import org.dromara.payment.merchant.domain.vo.BusMerchantVo; +import org.dromara.payment.merchant.domain.vo.BusOperAndAgentAndMer; +import org.dromara.payment.merchant.mapper.BusMerchantMapper; +import org.dromara.payment.sys.domain.vo.SysSydVo; +import org.dromara.payment.sys.mapper.SysSydMapper; +import org.dromara.payment.taxRecords.service.impl.AsyncTaxRecordsService; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.domain.UserWorkerAccount; +import org.dromara.payment.worker.domain.bo.UserWokerOperBo; +import org.dromara.payment.worker.domain.bo.UserWorkerAccountBo; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.*; +import org.dromara.payment.worker.mapper.UserWorkerAccountMapper; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.payment.worker.service.IIdCardAndOtherService; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.Result; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerBusinessBo; +import org.dromara.payment.worker.domain.UserWorkerBusiness; +import org.dromara.payment.worker.mapper.UserWorkerBusinessMapper; +import org.dromara.payment.worker.service.IUserWorkerBusinessService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用工签约查询Service业务层处理 + * + * @author LionLi + * @date 2024-04-26 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerBusinessServiceImpl extends BaseService implements IUserWorkerBusinessService { + + private final UserWorkerBusinessMapper baseMapper; + + + @DubboReference + private RemoteDictService remoteDictService; + + @Resource + private BusMerchantMapper busMerchantMapper; + + @Resource + private UserWorkerMapper userWorkerMapper; + + @Resource + private SysSydMapper sysSydMapper; + + @Resource + private UserWorkerAccountMapper userWorkerAccountMapper; + + + @DubboReference + private RemoteAccountService accountService; + + @DubboReference + private RemoteUserWokerService remoteUserWokerService; + + + @Resource(name="tencentIdCardAndOtherServiceImpl") + public IIdCardAndOtherService tencentIdCardAndOtherService; + + + + @Resource + public AsyncTaxRecordsService asyncTaxRecordsService; + + + @Override + public TableDataInfo selUserWorkByMerServInfo(PageQuery pageQuery, Long sydId, Long merId, Integer busType) { + Page result = baseMapper.selUserWorkByMerServInfo(pageQuery.build(),merId,sydId,null,busType); + return TableDataInfo.build(result); + } + + /** + * 查询用工签约查询 + */ + @Override + public UserWorkerBusinessVo queryById(Long id){ + return baseMapper.selUserWorkDetail(id); + } + + /** + * 查询用工签约查询列表 + */ + @Override + public TableDataInfo queryPageList(CommonSelConditionEntity bo, PageQuery pageQuery) { + QueryWrapper lqw = new QueryWrapper<>(); + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getSignStatus() != null, "t.sign_status", bo.getSignStatus()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkPhone()),"t.v_phone",bo.getWorkPhone()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t1.name",bo.getWorkName()); + lqw.eq(StringUtils.isNotEmpty(bo.getBusMerName()), "t2.name", bo.getBusMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkIdCard()),"t1.card_id",bo.getWorkIdCard()); + lqw.eq(bo.getSydId() != null ,"t.syd_id",bo.getSydId()); + lqw.eq(bo.getBusType() != null,"t.bus_type",bo.getBusType()); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.MERCHANT.getId()){ + lqw.eq("t.mer_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId()){ + lqw.likeRight("t.channel_no",LoginHelper.getNo()); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("op_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId()){ + lqw.eq("t.syd_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + Page result = baseMapper.selUserWorkSignLists(pageQuery.build(),lqw); + return TableDataInfo.build(result); + } + + /** + * 查询用工签约查询列表 + */ + @Override + public List queryList(CommonSelConditionEntity bo) { + QueryWrapper lqw = new QueryWrapper<>(); + + lqw.between(bo.getStartTime() != null,"t.create_time",bo.getStartTime(),bo.getEndTime()); + lqw.eq(bo.getSignStatus() != null, "t.sign_status", bo.getSignStatus()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkPhone()),"t.v_phone",bo.getWorkPhone()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkName()),"t1.name",bo.getWorkName()); + lqw.eq(StringUtils.isNotEmpty(bo.getBusMerName()), "t2.name", bo.getBusMerName()); + lqw.like(StringUtils.isNotEmpty(bo.getWorkIdCard()),"t1.card_id",bo.getWorkIdCard()); + lqw.eq(bo.getBusType() != null,"t.bus_type",bo.getBusType()); + lqw.eq(bo.getSydId() != null ,"t.syd_id",bo.getSydId()); + int busRole = LoginHelper.getLoginUser().getBusRole(); + if(busRole == BusRole.MERCHANT.getId()){ + lqw.eq("t.mer_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.AGENT.getId()){ + lqw.likeRight("t.channel_no",LoginHelper.getNo()); + }else if(busRole == BusRole.OPERATOR.getId()){ + lqw.eq("op_id",LoginHelper.getBusId()); + }else if(busRole == BusRole.SERVICE.getId()){ + lqw.eq(bo.getSydId() != null ,"t.syd_id",LoginHelper.getBusId()); + } + lqw.orderByDesc("t.create_time"); + + return baseMapper.selUserWorkSignLists(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerBusinessBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(bo.getWorkId() != null, "work_id", bo.getWorkId()); + lqw.eq(bo.getSydId() != null, "syd_id", bo.getSydId()); + lqw.eq(StringUtils.isNotBlank(bo.getSydNo()), "syd_no", bo.getSydNo()); + lqw.eq(bo.getBusType() != null, "bus_type", bo.getBusType()); + lqw.eq(StringUtils.isNotBlank(bo.getOpNo()), "op_no", bo.getOpNo()); + lqw.eq(bo.getOpId() != null, "op_id", bo.getOpId()); + lqw.eq(bo.getChannelId() != null, "channel_id", bo.getChannelId()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelNo()), "channel_no", bo.getChannelNo()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelCode()), "channel_code", bo.getChannelCode()); + lqw.eq(bo.getMerId() != null, "mer_id", bo.getMerId()); + lqw.eq(StringUtils.isNotBlank(bo.getMerNo()), "mer_no", bo.getMerNo()); + lqw.eq(StringUtils.isNotBlank(bo.getNo()), "no", bo.getNo()); + lqw.eq(bo.getSignStatus() != null, "sign_status", bo.getSignStatus()); + lqw.eq(bo.getSignTime() != null, "sign_time", bo.getSignTime()); + lqw.eq(StringUtils.isNotBlank(bo.getSignFileUrl()), "sign_file_url", bo.getSignFileUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getSignPic()), "sign_pic", bo.getSignPic()); + lqw.eq(StringUtils.isNotBlank(bo.getMoneyYearDate()), "money_year_date", bo.getMoneyYearDate()); + lqw.eq(bo.getMoneyYear() != null, "money_year", bo.getMoneyYear()); + lqw.eq(StringUtils.isNotBlank(bo.getVPhone()), "v_phone", bo.getVPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getSignNo()), "sign_no", bo.getSignNo()); + lqw.eq(StringUtils.isNotBlank(bo.getSignUrl()), "sign_url", bo.getSignUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getWebUrl()), "web_url", bo.getWebUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getOssid()), "ossid", bo.getOssid()); + return lqw; + } + + /** + * 新增用工签约查询 + */ + @Override + public Boolean insertByBo(UserWorkerBusinessBo bo) { + UserWorkerBusiness add = MapstructUtils.convert(bo, UserWorkerBusiness.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改用工签约查询 + */ + @Override + public Boolean updateByBo(UserWorkerBusinessBo bo) { + UserWorkerBusiness update = MapstructUtils.convert(bo, UserWorkerBusiness.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorkerBusiness entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除用工签约查询 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + + /*** + * 用工签约导入 + * @param file + * @busType 业务类型 + * @sydId 服务商编码 + * @return + */ + @Override + public ImportResultVo upload(MultipartFile file, Integer busType, Long sydId,String sydNo,String code,Long merId,String merNo) throws Exception { + + ImportResultVo vo = new ImportResultVo(); + + if(file == null || file.isEmpty()){ + this.invalidationParamsException("不能上传空文件"); + } + + if(busType == null){ + this.invalidationParamsException("业务类型不能为空"); + } + + if(sydId == null){ + this.invalidationParamsException("服务商id不能为空"); + } + + + + if(StringUtils.isEmpty(sydNo)){ + this.invalidationParamsException("服务商编码不能为空"); + } + + + if(StringUtils.isEmpty(code)){ + this.invalidationParamsException("域名不能为空"); + } + + Integer busRole = LoginHelper.getBusRole(); + if(busRole == BusRole.MERCHANT.getId()){ + merId = LoginHelper.getBusId(); + merNo = LoginHelper.getNo(); + }else{ + if(merId == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(StringUtils.isEmpty(merNo)){ + this.invalidationParamsException("企业编码不能为空"); + } + + } + + + try{ + + + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setNo(merNo); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + ExcelListener listener = new ExcelListener(); + EasyExcel.read(file.getInputStream(), UploadExcelItem.class,listener).headRowNumber(3).sheet().doRead(); + List excelList = listener.getList(); + List passlist = new ArrayList<>(); + List userWorkerList = new ArrayList<>(); + List nopassList = new ArrayList<>(); + for(UploadExcelItem item :excelList){ + + if(!PhoneUtil.isPhone(item.getPhone())){ + item.setErrorMsg("手机号校验不通过"); + nopassList.add(item); + continue; + } + if(!IdcardUtil.isValidCard(item.getIdCard())){ + item.setErrorMsg("身份证号校验不通过"); + nopassList.add(item); + continue; + } + UserWorkerBusinessVo userWorker = this.baseMapper.selUserWorkByIdCard(LoginHelper.getBusId(),item.getIdCard(),busType,sydId); + if(userWorker != null){ + if(!item.getName().equals(userWorker.getWorkName())){ + item.setErrorMsg("导入信息与系统已有信息不一致"); + nopassList.add(item); + continue; + } + + if(userWorker.getPhone() != null && !item.getPhone().equals(userWorker.getPhone()) ){ + item.setErrorMsg("导入信息与系统已有信息不一致"); + nopassList.add(item); + continue; + } + + if(userWorker.getPhone() != null){ + item.setErrorMsg("导入用工信息已经存在!"); + nopassList.add(item); + continue; + } + + + + }else{ + try{ + this.tencentIdCardAndOtherService.cardId2(item.getName(),item.getIdCard(),code); + }catch(BaseException e ){ + item.setErrorMsg("身份证校验不通过,"+e.getMessage()); + nopassList.add(item); + continue; + } + } + + if(userWorker != null){ + UserWorkerBusiness userWorkerBusinessBo = new UserWorkerBusiness(); + userWorkerBusinessBo.setWorkId(userWorker.getWorkId()); + userWorkerBusinessBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBusinessBo.setCreateTime(new Date()); + userWorkerBusinessBo.setBusType(busType); + userWorkerBusinessBo.setSydId(sydId); + userWorkerBusinessBo.setSydNo(sydNo); + userWorkerBusinessBo.setMerId(merId); + userWorkerBusinessBo.setMerNo(merNo); + userWorkerBusinessBo.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusinessBo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusinessBo.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusinessBo.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusinessBo.setSignStatus(0); + userWorkerBusinessBo.setVPhone(item.getPhone()); + passlist.add(userWorkerBusinessBo); + }else{ + long id = IdUtil.getSnowflakeNextId(); + UserWorker userWorkerBo = new UserWorker(); + userWorkerBo.setId(id); + userWorkerBo.setName(item.getName()); + userWorkerBo.setCardId(item.getIdCard()); + userWorkerBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBo.setStatus(2); + userWorkerBo.setCreateTime(new Date()); + userWorkerList.add(userWorkerBo); + UserWorkerBusiness userWorkerBusiness = new UserWorkerBusiness(); + userWorkerBusiness.setWorkId(id); + userWorkerBusiness.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusiness.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusiness.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusiness.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusiness.setCreateBy(LoginHelper.getUserId()); + userWorkerBusiness.setSydId(sydId); + userWorkerBusiness.setSydNo(sydNo); + userWorkerBusiness.setMerId(merId); + userWorkerBusiness.setMerNo(merNo); + userWorkerBusiness.setCreateTime(new Date()); + userWorkerBusiness.setBusType(busType); + userWorkerBusiness.setSignStatus(0); + userWorkerBusiness.setVPhone(item.getPhone()); + passlist.add(userWorkerBusiness); + } + } + + vo.setCnt(excelList.size()); + vo.setFailCnt(nopassList.size()); + vo.setSuccessCnt(passlist.size()); + + if(!nopassList.isEmpty()){ + String uuid = UUID.fastUUID().toString(); + vo.setDownId(uuid); + RedisUtils.setCacheObject(GlobalConstants.USERWORK_SIGN_ERROR_KEY+uuid,nopassList, Duration.ofDays(15)); + } + + if(!passlist.isEmpty()){ + this.isSign(passlist,sydId,busType); + this.baseMapper.insertBatch(passlist); + } + if(!userWorkerList.isEmpty()){ + this.userWorkerMapper.insertBatch(userWorkerList); + } + + }catch (Exception e){ + e.printStackTrace(); + throw e ; + } + + return vo; + } + + @Override + public List selErrorList(String uuid) { + if(StringUtils.isEmpty(uuid)){ + return new ArrayList<>(); + } + List list = RedisUtils.getCacheObject(GlobalConstants.USERWORK_SIGN_ERROR_KEY+uuid); + if(list == null){ + return new ArrayList<>(); + } + return list; + } + + @Override + public UserWorkerVo selMemberInfo(UserWorkerBusinessBo bo) { + if(bo.getId() == null){ + this.invalidationParamsException("用工签约ID不能为空"); + } + UserWorkerVo vo = this.baseMapper.selMemberInfo(bo); + return vo; + } + + + + + + /*** + * 添加用戶-运营商 + * @param bo + * @return + */ + @Override + @Transactional + public Boolean addUserWorkdBz(UserWokerOperBo bo) throws Exception{ + + if(!PhoneUtil.isPhone(bo.getPhone())){ + this.invalidationParamsException("手机号校验不通过"); + } + if(!IdcardUtil.isValidCard(bo.getIdCard())){ + this.invalidationParamsException("身份证校验不通过"); + } + UserWorkerBusinessVo userWorker = this.baseMapper.selUserWorkByIdCard(bo.getMerId(),bo.getIdCard(),bo.getBusType(),bo.getSydId()); + if(userWorker != null){ + if(!bo.getWorkName().equals(userWorker.getWorkName())){ + this.invalidationParamsException("添加信息与系统已有信息不一致"); + } + + if(userWorker.getPhone() != null && !bo.getPhone().equals(userWorker.getPhone())){ + this.invalidationParamsException("添加信息与系统已有信息不一致"); + } + + if(userWorker.getPhone() != null){ + this.invalidationParamsException("添加信息已经存在"); + } + + }else{ + try{ + this.tencentIdCardAndOtherService.cardId2(bo.getWorkName(),bo.getIdCard(),bo.getCode()); + }catch(BaseException e ){ + this.invalidationParamsException("身份证校验不通过,"+e.getMessage()); + throw e; + } + } + + try{ + this.tencentIdCardAndOtherService.bankCard3(bo.getBackCard(),bo.getWorkName(),bo.getIdCard(),bo.getCode()); + }catch(BaseException e ){ + this.invalidationParamsException("银行卡校验不通过,"+e.getMessage()); + throw e; + } + + + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setId(bo.getMerId()); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + if(userWorker != null){ + UserWorkerBusiness userWorkerBusinessBo = new UserWorkerBusiness(); + userWorkerBusinessBo.setWorkId(userWorker.getWorkId()); + bo.setWork_id(userWorker.getWorkId()); + userWorkerBusinessBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBusinessBo.setCreateTime(new Date()); + userWorkerBusinessBo.setBusType(bo.getBusType()); + userWorkerBusinessBo.setSydId(bo.getSydId()); + userWorkerBusinessBo.setSydNo(bo.getSydNo()); + userWorkerBusinessBo.setMerNo(bo.getMerNo()); + userWorkerBusinessBo.setMerId(bo.getMerId()); + userWorkerBusinessBo.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusinessBo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusinessBo.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusinessBo.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusinessBo.setSignStatus(0); + userWorkerBusinessBo.setVPhone(bo.getPhone()); + this.baseMapper.insert(userWorkerBusinessBo); + + UserWorker userWorkerBo = new UserWorker(); + boolean updateStatus = false; + if(StringUtils.isNotEmpty(bo.getCardPositive())){ + userWorkerBo.setCardPositive(bo.getCardPositive()); + updateStatus = true; + } + if(StringUtils.isNotEmpty(bo.getCardBack())){ + userWorkerBo.setCardBack(bo.getCardBack()); + updateStatus = true; + } + + if(StringUtils.isNotEmpty(bo.getFacePic())){ + userWorkerBo.setPhotoPath(bo.getFacePic()); + updateStatus = true; + } + + if(updateStatus){ + userWorkerBo.setId(userWorker.getWorkId()); + this.userWorkerMapper.updateById(userWorkerBo); + } + + }else{ + + long id = IdUtil.getSnowflakeNextId(); + bo.setWork_id(id); + UserWorker userWorkerBo = new UserWorker(); + userWorkerBo.setId(id); + userWorkerBo.setName(bo.getWorkName()); + userWorkerBo.setCardId(bo.getIdCard()); + userWorkerBo.setCreateBy(LoginHelper.getUserId()); + userWorkerBo.setStatus(2); + userWorkerBo.setCardPositive(bo.getCardPositive()); + userWorkerBo.setCardBack(bo.getCardBack()); + userWorkerBo.setPhotoPath(bo.getFacePic()); + userWorkerBo.setCreateTime(new Date()); + this.userWorkerMapper.insert(userWorkerBo); + UserWorkerBusiness userWorkerBusiness = new UserWorkerBusiness(); + userWorkerBusiness.setWorkId(id); + userWorkerBusiness.setChannelId(busOperAndAgentAndMer.getChannelId()); + userWorkerBusiness.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + userWorkerBusiness.setOpId(busOperAndAgentAndMer.getOpId()); + userWorkerBusiness.setOpNo(busOperAndAgentAndMer.getOpNo()); + userWorkerBusiness.setCreateBy(LoginHelper.getUserId()); + userWorkerBusiness.setSydId(bo.getSydId()); + userWorkerBusiness.setSydNo(bo.getSydNo()); + userWorkerBusiness.setMerNo(bo.getMerNo()); + userWorkerBusiness.setMerId(bo.getMerId()); + userWorkerBusiness.setCreateTime(new Date()); + userWorkerBusiness.setBusType(bo.getBusType()); + userWorkerBusiness.setSignStatus(0); + userWorkerBusiness.setVPhone(bo.getPhone()); + this.baseMapper.insert(userWorkerBusiness); + } + dwUserWorkBank(bo); + return true; + } + + @Override + public Boolean operAddUserWorkSel(Long merId,Long sydId,Integer busType,String workIds) { + + if(merId == null){ + this.invalidationParamsException("企业ID不能为空"); + } + + if(sydId == null){ + this.invalidationParamsException("服务商ID不能为空"); + } + + if(busType == null){ + this.invalidationParamsException("业务类型ID不能为空"); + } + + if(StringUtils.isEmpty(workIds)){ + this.invalidationParamsException("用工ID不能为空"); + } + + { + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setId(merId); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + SysSydVo sysSydVo = this.sysSydMapper.selectVoById(sydId); + Date d = new Date(); + Long userId = LoginHelper.getUserId(); + List list = this.baseMapper.selUserWorkByMerServInfo(merId,sydId,workIds,busType); + List li = new ArrayList(); + for (UserWorkerBusinessVo vo :list){ + UserWorkerBusiness bo = new UserWorkerBusiness(); + bo.setWorkId(vo.getWorkId()); + bo.setVPhone(vo.getvPhoneNoHide()); + bo.setSydId(sydId); + bo.setSydNo(sysSydVo.getNo()); + bo.setOpNo(busOperAndAgentAndMer.getOpNo()); + bo.setOpId(busOperAndAgentAndMer.getOpId()); + bo.setChannelId(busOperAndAgentAndMer.getChannelId()); + bo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + bo.setMerId(merId); + bo.setMerNo(busOperAndAgentAndMer.getMerNo()); + bo.setBusType(busType); + bo.setCreateTime(d); + bo.setSignStatus(0); + bo.setCreateBy(userId); + li.add(bo); + } + this.baseMapper.insertBatch(li); + return true; + } + } + + @Override + public Boolean operAddUserWorkAll(Long merId, Long sydId, Integer busType) { + BusMerchantBo bo1 = new BusMerchantBo(); + bo1.setId(merId); + BusOperAndAgentAndMer busOperAndAgentAndMer = this.busMerchantMapper.selOpAndAgentInfosByMerInfo(bo1); + SysSydVo sysSydVo = this.sysSydMapper.selectVoById(sydId); + + Date d = new Date(); + Long userId = LoginHelper.getUserId(); + List list = this.baseMapper.selUserWorkByMerServInfo(merId,sydId,null,busType); + List li = new ArrayList(); + for (UserWorkerBusinessVo vo :list){ + UserWorkerBusiness bo = new UserWorkerBusiness(); + bo.setWorkId(vo.getWorkId()); + bo.setVPhone(vo.getvPhoneNoHide()); + bo.setSydId(sydId); + bo.setSydNo(sysSydVo.getNo()); + bo.setOpNo(busOperAndAgentAndMer.getOpNo()); + bo.setOpId(busOperAndAgentAndMer.getOpId()); + bo.setChannelId(busOperAndAgentAndMer.getChannelId()); + bo.setChannelNo(busOperAndAgentAndMer.getChannelNo()); + bo.setMerId(merId); + bo.setMerNo(busOperAndAgentAndMer.getMerNo()); + bo.setBusType(busType); + bo.setCreateTime(d); + bo.setSignStatus(0); + bo.setCreateBy(userId); + li.add(bo); + } + this.baseMapper.insertBatch(li); + return true; + } + + private void isSign(List list,Long sydId,Integer busType){ + + + Map paraMap = new HashMap(); + paraMap.put("workIds",list); + paraMap.put("sydId",sydId); + paraMap.put("busType",busType); + + List signList = this.baseMapper.selUserWorkBizByWorkIdSydIdBusType(paraMap); + if(signList != null && !signList.isEmpty()){ + Map resultMap = signList.stream().collect(Collectors.toMap(UserWorkerBusinessVo::getWorkId, userWorkerBusinessVo -> userWorkerBusinessVo)); + for(UserWorkerBusiness vo : list){ + UserWorkerBusinessVo uwbvo = resultMap.get(vo.getWorkId()); + if(uwbvo != null){ + vo.setSignStatus(1); + vo.setNo(uwbvo.getNo()); + vo.setSignFileUrl(uwbvo.getSignFileUrl()); + } + } + } + } + + /*** + * + * 用工银行账号处理 + * @param bo + * + */ + private void dwUserWorkBank(UserWokerOperBo bo) { + + String chnnalName = this.baseMapper.selSydDefaultChannel(bo.getSydId()); + if(StringUtils.isEmpty(chnnalName)){ + List dictDataList = this.remoteDictService.selectDictDataByType("pay_channel"); + if(dictDataList != null && !dictDataList.isEmpty()){ + chnnalName = dictDataList.get(0).getDictLabel(); + } + } + + if(StringUtils.isNotEmpty(chnnalName)){ + UserWokerOperBo bno = new UserWokerOperBo(); + bno.setWork_id(bo.getWork_id()); + bno.setChannelName(chnnalName); + bno.setBackCard(bo.getBackCard()); + List accountVo = this.userWorkerAccountMapper.selctBankInfoByUidChannelBankNo(bno); + boolean isDefault = false; + boolean cz = false; + UserWorkerAccountVo selVo = null; + if(accountVo != null && !accountVo.isEmpty()){ + for(UserWorkerAccountVo vo :accountVo){ + if(vo.getIsDefault() == 1){ + isDefault = true; + } + if(vo.getBankCard().equals(bo.getBackCard())){ + cz = true; + selVo = vo; + } + } + } + if(cz && StringUtils.isNotEmpty(bo.getBankPic())){ + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setId(selVo.getId()); + uwab.setStatus(1); + uwab.setBankCardPic(bo.getBankPic()); + this.userWorkerAccountMapper.updateById(uwab); + }else if(!cz){ + //先生成账号 + Account bankAcc = new Account(); + bankAcc.setType((short)2);//2:真实个人账户 + bankAcc.setBankCard(bo.getBackCard()); + bankAcc.setBankType(bo.getKhh()); + bankAcc.setUnitId(0L); + bankAcc.setName(bo.getWorkName()); + Result result = this.accountService.addAccount(bankAcc); + Integer accountId = result.getRtnData().getId(); + if(accountId == null){ + this.invalidationParamsException("创建账号失败!"); + } + + //添加银行卡 + UserWorkerAccount uwab = new UserWorkerAccount(); + uwab.setWorkId(bo.getWork_id()); + uwab.setAccId(Long.valueOf(accountId)); + uwab.setBankCard(bo.getBackCard()); + uwab.setPassage(chnnalName); + uwab.setBankCardPic(bo.getBankPic()); + uwab.setBankType(bo.getKhh()); + uwab.setCreateTime(new Date()); + uwab.setCreateBy(LoginHelper.getUserId()); + if(!isDefault){ + uwab.setIsDefault(1L); + }else{ + uwab.setIsDefault(0L); + } + this.userWorkerAccountMapper.insert(uwab); + } + } + + } + + + /**** + * 运营商 - 信息修改 + * @param uwb + * @return + */ + @Override + @Transactional + public Boolean updateUserWorkInfo(UserWorkerBo uwb){ + + if(uwb.getId() == null){ + this.invalidationParamsException("用户ID不能为空"); + } + if(uwb.getMerId() == null){ + this.invalidationParamsException("企业ID不能为空"); + } + this.baseMapper.updateUserWorkByCardId(uwb); + UserWorkerBusinessBo uwbb = new UserWorkerBusinessBo(); + uwbb.setWorkId(uwb.getId()); + uwbb.setMerId(uwb.getMerId()); + uwbb.setVPhone(uwb.getPhone()); + this.baseMapper.updateUserWorkBisByWorkId(uwbb); + return true; + } + + + + @Override + public UserWorkerNoHideVo selMemberInfoNySignId(UserWorkerBusinessBo bo ){ + if(bo.getId() == null){ + this.invalidationParamsException("签约ID不能为空"); + } + UserWorkerVo vo = this.baseMapper.selMemberInfo(bo); + UserWorkerNoHideVo noHideVo = BeanUtil.copyProperties(vo, UserWorkerNoHideVo.class); + noHideVo.setCardIdNoHide(vo.getCardIdNoHide()); + noHideVo.setPhoneNoHide(vo.getPhoneNoHide()); + return noHideVo; + } + + + /*** + * 单个导出用工的身份证信息 + * @param workId + * @param response + */ + @Override + public void exportCardImg(Long workId, HttpServletResponse response)throws Exception { + + if(workId == null){ + this.invalidationParamsException("用工ID不能为空"); + } + + UserWorker uw = this.userWorkerMapper.selectById(workId); + + if(uw == null){ + this.invalidationParamsException("参数无效"); + } + + if(StringUtils.isEmpty(uw.getCardPositive()) && StringUtils.isEmpty(uw.getCardBack())){ + this.invalidationParamsException("此会员未上传身份证图片"); + } + + RemoteUserWorkerZipVo vo = new RemoteUserWorkerZipVo(); + vo.setWorkName(uw.getName()); + vo.setWorkId(uw.getId()); + vo.setCardPositive(uw.getCardPositive()); + vo.setCardBack(uw.getCardBack()); + byte[] imgByte = this.remoteUserWokerService.downLoadSigleSfzZip(vo);response.reset(); + //response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); +// response.setHeader("Content-Disposition", "attachment; filename=\""+uw.getName()+"身份证信息.zip\""); + response.addHeader("Content-Length", "" + imgByte.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + FileUtils.setAttachmentResponseHeader(response,uw.getName()+"身份证信息.zip"); + IoUtil.write(response.getOutputStream(), false, imgByte); + + } + + + /*** + * 批量导出用工者身份证信息 + * @param workIds + */ + @Override + public void exportMutiCardImg(String workIds) throws Exception{ + + if(StringUtils.isEmpty(workIds)){ + this.invalidationParamsException("请输入用工者ID"); + } + + Long userId = LoginHelper.getUserId(); + String[] wids = workIds.split(","); + List list = new ArrayList(); + for(String s : wids){ + list.add(Long.valueOf(s)); + } + try{ + this.asyncTaxRecordsService.createSfzZipByUserInfos(list,userId,1); + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } + +} + + + + +/*** + * 解析Excel监听器 + */ +class ExcelListener extends AnalysisEventListener { + + private List list = new ArrayList<>(); + + private Map idCardMap = new HashMap<>(); + + private Map phoneMap = new HashMap<>(); + @Override + public void invoke(UploadExcelItem importResultVo, AnalysisContext analysisContext) { + + + int rowIndex = analysisContext.readRowHolder().getRowIndex()+1; + + if(rowIndex > 503){ + throw new BaseException("导入上限为500条"); + + } + + if(StringUtils.isEmpty(importResultVo.getName())){ + throw new BaseException("第"+rowIndex+"行姓名不能为空"); + } + + if(StringUtils.isEmpty(importResultVo.getIdCard())){ + throw new BaseException("第"+rowIndex+"行身份证不能为空"); + } + + if(StringUtils.isEmpty(importResultVo.getPhone())){ + throw new BaseException("第"+rowIndex+"行手机号不能为空"); + } + + importResultVo.setIdCard(importResultVo.getIdCard().trim()); + Object obj = idCardMap.get(importResultVo.getIdCard()); + if(obj == null){ + idCardMap.put(importResultVo.getIdCard(), ""); + }else{ + throw new BaseException("第"+rowIndex+"行身份证["+importResultVo.getIdCard()+"]已存在"); + } + importResultVo.setPhone(importResultVo.getPhone().trim()); + Object phoneObj = phoneMap.get(importResultVo.getPhone()); + if(phoneObj == null){ + phoneMap.put(importResultVo.getPhone(), ""); + }else{ + throw new BaseException("第"+rowIndex+"行手机号["+importResultVo.getPhone()+"]已存在"); + } + this.list.add(importResultVo); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + + + public List getList() { + return this.list; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java new file mode 100644 index 0000000..f17de6e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/java/org/dromara/payment/worker/service/impl/UserWorkerServiceImpl.java @@ -0,0 +1,140 @@ +package org.dromara.payment.worker.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.payment.worker.domain.bo.UserWorkerBo; +import org.dromara.payment.worker.domain.vo.UserWorkerVo; +import org.dromara.payment.worker.domain.UserWorker; +import org.dromara.payment.worker.mapper.UserWorkerMapper; +import org.dromara.payment.worker.service.IUserWorkerService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 自雇者Service业务层处理 + * + * @author LionLi + * @date 2024-04-28 + */ +@RequiredArgsConstructor +@Service +public class UserWorkerServiceImpl implements IUserWorkerService { + + private final UserWorkerMapper baseMapper; + + /** + * 查询自雇者 + */ + @Override + public UserWorkerVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询自雇者列表 + */ + @Override + public TableDataInfo queryPageList(UserWorkerBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询自雇者列表 + */ + @Override + public List queryList(UserWorkerBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(UserWorkerBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), "open_id", bo.getOpenId()); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), "phone", bo.getPhone()); + lqw.eq(bo.getIsAuthentication() != null, "is_authentication", bo.getIsAuthentication()); + lqw.eq(StringUtils.isNotBlank(bo.getCardId()), "card_id", bo.getCardId()); + lqw.eq(StringUtils.isNotBlank(bo.getCardPositive()), "card_positive", bo.getCardPositive()); + lqw.eq(StringUtils.isNotBlank(bo.getCardBack()), "card_back", bo.getCardBack()); + lqw.eq(StringUtils.isNotBlank(bo.getBankType()), "bank_type", bo.getBankType()); + lqw.eq(StringUtils.isNotBlank(bo.getBankCard()), "bank_card", bo.getBankCard()); + lqw.eq(bo.getIsAuth() != null, "is_auth", bo.getIsAuth()); + lqw.eq(bo.getIsSign() != null, "is_sign", bo.getIsSign()); + lqw.eq(bo.getSignTime() != null, "sign_time", bo.getSignTime()); + lqw.eq(bo.getIsRegister() != null, "is_register", bo.getIsRegister()); + lqw.eq(StringUtils.isNotBlank(bo.getPhotoPath()), "photo_path", bo.getPhotoPath()); + lqw.eq(StringUtils.isNotBlank(bo.getSex()), "sex", bo.getSex()); + lqw.eq(StringUtils.isNotBlank(bo.getTag()), "tag", bo.getTag()); + lqw.eq(StringUtils.isNotBlank(bo.getUserArea()), "user_area", bo.getUserArea()); + lqw.like(StringUtils.isNotBlank(bo.getUserAreaName()), "user_area_name", bo.getUserAreaName()); + lqw.eq(bo.getAddTime() != null, "add_time", bo.getAddTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAddBy()), "add_by", bo.getAddBy()); + lqw.eq(StringUtils.isNotBlank(bo.getEditer()), "editer", bo.getEditer()); + lqw.eq(bo.getEditTime() != null, "edit_time", bo.getEditTime()); + lqw.eq(StringUtils.isNotBlank(bo.getNation()), "nation", bo.getNation()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), "address", bo.getAddress()); + lqw.eq(bo.getBirthday() != null, "birthday", bo.getBirthday()); + lqw.eq(StringUtils.isNotBlank(bo.getIssue()), "issue", bo.getIssue()); + lqw.eq(bo.getIssueDate() != null, "issueDate", bo.getIssueDate()); + lqw.eq(StringUtils.isNotBlank(bo.getExpiryDate()), "expiryDate", bo.getExpiryDate()); + lqw.eq(StringUtils.isNotBlank(bo.getReferrerBy()), "referrer_by", bo.getReferrerBy()); + lqw.eq(StringUtils.isNotBlank(bo.getAlipayLogonId()), "alipay_logon_id", bo.getAlipayLogonId()); + lqw.eq(bo.getStatus() != null, "status", bo.getStatus()); + return lqw; + } + + /** + * 新增自雇者 + */ + @Override + public Boolean insertByBo(UserWorkerBo bo) { + UserWorker add = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改自雇者 + */ + @Override + public Boolean updateByBo(UserWorkerBo bo) { + UserWorker update = MapstructUtils.convert(bo, UserWorker.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserWorker entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除自雇者 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/application.yml b/ruoyi-modules/ruoyi-payment/src/main/resources/application.yml new file mode 100644 index 0000000..8ea15bf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9205 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-payment + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml new file mode 100644 index 0000000..99b0646 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/TranLogMapper.xml @@ -0,0 +1,87 @@ + + + + + + id, bus_type, bus_item, buis_id, tran_id, add_time, tran_result, tran_batch, tran_time, + source_acc_id, target_acc_id, bus_batch, source_acc_type, tran_no + + + + + + + + + UPDATE ( SELECT id FROM tran_log WHERE tran_batch IS NULL AND tran_result = ${result} + + AND is_callback = ${isCallback} + + + AND id > ${minId} + + ORDER BY add_time ASC LIMIT ${start}, ${size} ) t + INNER JOIN tran_log t1 ON t1.id = t.id + SET t1.tran_batch = '${synBatch}' + + + + update tran_log + set tran_batch = NULL + where id = #{id,jdbcType=BIGINT} + + + + update tran_log + set tran_batch = NULL + where tran_batch = '${synBatch}' + AND tran_result = ${result} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml new file mode 100644 index 0000000..e08e8eb --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillDetailMapper.xml @@ -0,0 +1,115 @@ + + + + + SELECT + t.`id`, + t.`cno`, + t.`bus_no`, + t.`bill_no`, + t.`bill_id`, + t.`worker_id`, + t.`worker_name`, + t.`worker_phone`, + t.`worker_enroll_id`, + t.`card_id`, + t.`bank_type`, + t.`bank_card`, + t.`bank_cheque`, + t.`money`, + t.`raise`, + t.`amount`, + t.`pay_status`, + t.`pay_time`, + t.`pay_remark`, + t.`pay_receipt`, + t.`service_charge_money`, + t.`add_time`, + t.`bank_no`, + t.`agent_money`, + t.`is_refund`, + t.`refund_time`, + t.`out_no`, + t.`is_out`, + t.`passage`, + t.`task_id`, + t.`task_no`, + t.`syd_id`, + t.`syd_no`, + t.`op_no`, + t.`op_id`, + t.`channel_id`, + t.`channel_no`, + t.`channel_code`, + t.`mer_id`, + t.`mer_no`, + t.`bus_type`, + t.`pay_receipt_b2b`, + t.`pro_no`, + t.`charge_mode`, + t.`op_service_charge_rate`, + t.`op_service_charge_money`, + t.`op_halve_status`, + t.`op_halve_remark`, + t.`fhzx_service_charge_rate`, + t.`fhzx_service_charge_money`, + t.`fhzx_channel_id`, + t.`zj_service_charge_rate`, + t.`zj_service_charge_money`, + t.`zj_channel_id`, + t.`ywy_service_charge_rate`, + t.`ywy_service_charge_money`, + t.`ywy_channel_id`, + t.`channel_halve_status`, + t.`bill_remark`, + t.`syd_service_charge_rate`, + t.`syd_service_charge_money`, + t.`syd_halve_status`, + t.`syd_halve_remark`, + t.`pt_service_charge_money`, + t.`pt_halve_status`, + t.`pt_halve_remark`, + t2.gsmc syd_name, + t1.`name` mer_name, + t3.`name` op_name, + t4.`name` fhzx_channel_name, + t5.`name` zj_channel_name, + t6.`name` ywy_channel_name, + t.sh_service_charge_rate + + + + FROM + mer_bill_detail t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + INNER JOIN bus_operator t3 ON t3.id = t.op_id + LEFT JOIN bus_channel t4 ON t4.id = t.fhzx_channel_id + LEFT JOIN bus_channel t5 ON t5.id = t.zj_channel_id + LEFT JOIN bus_channel t6 ON t6.id = t.ywy_channel_id + ${ew.getCustomSqlSegment} + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml new file mode 100644 index 0000000..6e0efd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/bill/MerBillMapper.xml @@ -0,0 +1,84 @@ + + + + + SELECT + t.`id`, + t.`task_id`, + t.`task_no`, + t.`no`, + t.`service_charge_type`, + t.`service_charge_rate`, + t.`money`, + t.`service_charge_amount`, + t.`amount_ent`, + t.`status`, + t.`pay_status`, + t.`pay_time`, + t.`give_up_time`, + t.`give_up_by`, + t.`add_time`, + t.`add_by`, + t.`verify_status`, + t.`verify_by`, + t.`verify_time`, + t.`verify_reason`, + t.`passage`, + t.`detailCount`, + t.`is_agency_fee`, + t.`wssph`, + t.`wtdzgssph`, + t.`sph_time`, + t.`sph_by`, + t.`out_no`, + t.`is_out`, + t.`syd_id`, + t.`syd_no`, + t2.gsmc syd_name, + t.`op_no`, + t.`op_id`, + t.`channel_id`, + t.`channel_no`, + t.`channel_code`, + t.`mer_id`, + t.`mer_no`, + t1.`name` mer_name, + t.`pro_no`, + t.`pro_id`, + t.`syd_verify_status`, + t.`syd_verify_by`, + t.`syd_verify_time`, + t.`syd_verify_reason`, + t.`is_invoice`, + t.`bus_type`, + t.`settlement_style`, + t.`max_month`, + t.`invoice_type`, + t.`charge_mode`, + t3.name taskName + + + + FROM + mer_bill t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + INNER JOIN mer_task t3 on t.task_id = t3.id + ${ew.getCustomSqlSegment} + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml new file mode 100644 index 0000000..156240b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountMapper.xml @@ -0,0 +1,126 @@ + + + + + SELECT + t.id, + t.channel_id, + t.syd_id, + t.acc_id, + t.bank_type, + + t.balance, + t.frozen, + t.cashout, + t.is_default, + + t.add_time, + t.STATUS, + t.out_bank_card, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` channel_name, + t1.`name` acc_name, + t1.no channel_no, + t1.khd, + max(t1.bank_card) bank_card, + SUM(t2.money) yesterday + + + + FROM + bus_channel_account t + INNER JOIN bus_channel t1 ON t1.id = t.channel_id + LEFT JOIN bus_channel_flows t2 on t2.channel_id = t1.id + AND t2.bus_type = 12 + AND t2.add_time BETWEEN #{ew.entity.flowsBeginTime} and #{ew.entity.flowsEndTime} + ${ew.getCustomSqlSegment} + GROUP BY t.id, + t.channel_id, + t.syd_id, + t.acc_id, + t.bank_type, + t.bank_card, + t.balance, + t.frozen, + t.cashout, + t.is_default, + t.yesterday, + t.add_time, + t.STATUS, + t.out_bank_card, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time + + + + + + + + UPDATE bus_channel_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + + UPDATE bus_channel_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + UPDATE bus_channel_account + SET cashout = cashout + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + + + UPDATE bus_channel_account + SET yesterday = yesterday + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND channel_id = #{channelId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml new file mode 100644 index 0000000..892d90d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelAccountSynMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml new file mode 100644 index 0000000..4a371d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelCashoutMapper.xml @@ -0,0 +1,60 @@ + + + + + SELECT + t.id, + t.syd_id, + t.channel_id, + t.acc_id, + t.bus_no, + t.amount, + t.remark, + t.khh, + t.khh_no, + t.fr, + t.khd, + t.bank_card, + t.verify_status, + t.verify_time, + t.verify_by, + t.verify_reason, + t.invoice_pic, + t.pay_status, + t.pay_time, + t.pay_remark, + t.add_time, + t.add_by, + t.passage, + t.pay_receipt, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` channel_name, + t1.no channel_no + + + + FROM + bus_channel_cashout t + INNER JOIN bus_channel t1 ON t1.id = t.channel_id + ${ew.getCustomSqlSegment} + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml new file mode 100644 index 0000000..cb32fa4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelFlowsMapper.xml @@ -0,0 +1,162 @@ + + + + + + insert into bus_channel_flows + + + id, + + + channel_id, + + + bus_type, + + + bus_no, + + + money, + + balance, + + add_time, + + + add_by, + + + bus_desc, + + + bill_no, + + + bill_id, + + + bill_detail_id, + + + tran_type, + + + payer_type, + + + payer_id, + + + payer_name, + + + payer_acc, + + + payer_acc_id, + + + payee_type, + + + payee_id, + + + payee_name, + + + payee_acc, + + + payee_acc_id, + + + remark, + + + + + #{id,jdbcType=INTEGER}, + + + #{channelId,jdbcType=INTEGER}, + + + #{busType,jdbcType=SMALLINT}, + + + #{busNo,jdbcType=VARCHAR}, + + + #{money,jdbcType=BIGINT}, + + + (select t.balance from bus_channel_account t where t.channel_id = ${payerId}), + + + ((select t.balance from bus_channel_account t where t.channel_id = ${payeeId}) + ${money}), + + + ((select t.balance from bus_channel_account t where t.channel_id = ${payerId}) + ${money}), + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{busDesc,jdbcType=VARCHAR}, + + + #{billNo,jdbcType=VARCHAR}, + + + #{billId,jdbcType=INTEGER}, + + + #{billDetailId,jdbcType=INTEGER}, + + + #{tranType,jdbcType=SMALLINT}, + + + #{payerType,jdbcType=SMALLINT}, + + + #{payerId,jdbcType=INTEGER}, + + + #{payerName,jdbcType=VARCHAR}, + + + #{payerAcc,jdbcType=VARCHAR}, + + + #{payerAccId,jdbcType=INTEGER}, + + + #{payeeType,jdbcType=SMALLINT}, + + + #{payeeId,jdbcType=INTEGER}, + + + #{payeeName,jdbcType=VARCHAR}, + + + #{payeeAcc,jdbcType=VARCHAR}, + + + #{payeeAccId,jdbcType=INTEGER}, + + + #{remark,jdbcType=VARCHAR}, + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml new file mode 100644 index 0000000..7b44b71 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml new file mode 100644 index 0000000..1f89180 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelProductMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update bus_channel_product set cost_service_charge = #{costServiceCharge} where channel_id in (select id from bus_channel t1 where t1.p_id = #{channelId}) + and channel_no = #{channelNo} + and bus_type = #{busType} + and pro_no = #{proNo} + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml new file mode 100644 index 0000000..0e54c5b --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/channel/BusChannelSalesmanMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml new file mode 100644 index 0000000..4050332 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusAccountsMapper.xml @@ -0,0 +1,233 @@ + + + + + SELECT + t.id, + t.syd_id, + t.unit_id, + t.acc_id, + t.bank_type, + t.bank_card, + t.balance, + t.frozen, + t.is_default, + t.add_time, + t.STATUS, + t.add_ype, + t.out_bank_card, + t.remark, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` unit_name, + t1.no unit_no, + t1.unit_type, + t1.cust_no, + t2.gsmc syd_name + + + + FROM + bus_accounts t + INNER JOIN sys_unit t1 ON t1.id = t.unit_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + + + insert into bus_accounts + + + id, + + + syd_id, + + + unit_id, + + + acc_id, + + + bank_type, + + + bank_card, + + + balance, + + + frozen, + + + is_default, + + + add_time, + + + status, + + + add_ype, + + + out_bank_card, + + + remark, + + + lhh, + + + khh, + + + + + #{id,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{unitId,jdbcType=INTEGER}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=BIGINT}, + + + #{frozen,jdbcType=BIGINT}, + + + #{isDefault,jdbcType=TINYINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=SMALLINT}, + + + #{addYpe,jdbcType=SMALLINT}, + + + #{outBankCard,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{lhh,jdbcType=VARCHAR}, + + + #{khh,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + bus_accounts t + WHERE + t.syd_id = #{sydId} and t.unit_id = #{unitId} and t.bank_type = #{bankType}) + + + + UPDATE bus_accounts + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND unit_id = #{unitId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + AND bank_type is null + + + + + + UPDATE bus_accounts + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND unit_id = #{unitId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + AND balance >= frozen + ${amount} + + + + + + UPDATE bus_accounts + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_accounts + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml new file mode 100644 index 0000000..a08bb1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/common/BusOperLogMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml new file mode 100644 index 0000000..0b23dc8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/coverPage/CoverPageMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml new file mode 100644 index 0000000..417fd23 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceAddressMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml new file mode 100644 index 0000000..fdf129e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceBillMapper.xml @@ -0,0 +1,183 @@ + + + + + SELECT + t.id, + t.inv_id, + t.inv_amount, + t.STATUS, + t.money, + t.service_charge_amount, + t.task_id, + t.task_no, + t.syd_id, + t.syd_no, + t.op_no, + t.op_id, + t.channel_id, + t.channel_no, + t.channel_code, + t.mer_id, + t.mer_no, + t.bill_id, + t.bill_no, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t2.gsmc syd_name, + t1.`name` mer_name + + + + FROM + mer_invoice_bill t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + + + + + + + + UPDATE mer_invoice_bill t + INNER JOIN mer_bill t1 ON t1.id = t.bill_id + AND t1.is_invoice = #{sourceStatus} + AND t.`status` = 1 + AND t.inv_id = #{invId} + SET t1.is_invoice = #{targetStatus} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml new file mode 100644 index 0000000..70575ab --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceDetailMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml new file mode 100644 index 0000000..ed055b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceMapper.xml @@ -0,0 +1,196 @@ + + + + + SELECT + t.id, + t.no, + t.header, + t.type, + t.credit_code, + t.bank_address, + t.bank_card, + t.category, + t.inv_num, + t.inv_amount, + t.add_id, + t.add_name, + t.add_phone, + t.add_address, + t.add_email, + t.iogistics_status, + t.iogistics_time, + t.iogistics_by, + t.iogistics_company, + t.iogistics_no, + t.status, + t.add_time, + t.add_by, + t.cancel_time, + t.cancel_by, + t.cancel_reason, + t.inv_remark, + t.remark, + t.dwzcdz, + t.dwdh, + t.syd_id, + t.syd_no, + t.op_no, + t.op_id, + t.channel_id, + t.channel_no, + t.channel_code, + t.mer_id, + t.mer_no, + t.bus_type, + t.iogistics_receiving_time, + t.iogistics_receiving_by, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t2.gsmc syd_name, + t1.`name` mer_name, + t.update_time, + GROUP_CONCAT(t3.bill_no SEPARATOR ',') billNos + + + + FROM + mer_invoice t + INNER JOIN bus_merchant t1 ON t1.id = t.mer_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + LEFT JOIN mer_invoice_bill t3 ON t3.inv_id = t.id + AND t3.status = 1 + ${ew.getCustomSqlSegment} + GROUP BY + t.id, + t.no, + t.header, + t.type, + t.credit_code, + t.bank_address, + t.bank_card, + t.category, + t.inv_num, + t.inv_amount, + t.add_id, + t.add_name, + t.add_phone, + t.add_address, + t.add_email, + t.iogistics_status, + t.iogistics_time, + t.iogistics_by, + t.iogistics_company, + t.iogistics_no, + t.status, + t.add_time, + t.add_by, + t.cancel_time, + t.cancel_by, + t.cancel_reason, + t.inv_remark, + t.remark, + t.dwzcdz, + t.dwdh, + t.syd_id, + t.syd_no, + t.op_no, + t.op_id, + t.channel_id, + t.channel_no, + t.channel_code, + t.mer_id, + t.mer_no, + t.bus_type, + t.iogistics_receiving_time, + t.iogistics_receiving_by, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t2.gsmc, + t1.`name`, + t.update_time + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml new file mode 100644 index 0000000..36f335e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/invoice/MerInvoiceTypeMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml new file mode 100644 index 0000000..b8096fe --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountMapper.xml @@ -0,0 +1,419 @@ + + + + + `id`, + `mer_id`, + `syd_id`, + `acc_id`, + `bank_type`, + `bank_virtual_card`, + `balance`, + `frozen`, + `is_default`, + `add_time`, + `settlement`, + `invoice_settlement`, + `invoice`, + `status`, + `out_bank_card`, + name, + lhh, + khh + + + + insert into bus_merchant_account + + + id, + + + mer_id, + + + syd_id, + + + acc_id, + + + bank_type, + + + bank_virtual_card, + + + balance, + + + frozen, + + + is_default, + + + add_time, + + + settlement, + + + invoice_settlement, + + + invoice, + + + status, + + + out_bank_card, + + + name, + + + lhh, + + + khh, + + + + + #{id,jdbcType=INTEGER}, + + + #{merId,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankVirtualCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=BIGINT}, + + + #{frozen,jdbcType=BIGINT}, + + + #{isDefault,jdbcType=TINYINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{settlement,jdbcType=BIGINT}, + + + #{invoiceSettlement,jdbcType=BIGINT}, + + + #{invoice,jdbcType=BIGINT}, + + + #{status,jdbcType=SMALLINT}, + + + #{outBankCard,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{lhh,jdbcType=VARCHAR}, + + + #{khh,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + bus_merchant_account t + WHERE + t.syd_id = #{sydId} and t.mer_id = #{merId} and t.bank_type = #{bankType}) + + + + + + + + + + update bus_merchant_account + + + mer_id = #{merId,jdbcType=BIGINT}, + + + syd_id = #{sydId,jdbcType=INTEGER}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_virtual_card = #{bankVirtualCard,jdbcType=VARCHAR}, + + + balance = #{balance,jdbcType=BIGINT}, + + + frozen = #{frozen,jdbcType=BIGINT}, + + + is_default = #{isDefault,jdbcType=TINYINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=SMALLINT}, + + + where acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET `status` = 2 + WHERE + `status` = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET `status` = 2 + WHERE + `status` = 1 + AND is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + + UPDATE bus_merchant_account + SET `status` = 1 + WHERE + `status` = 2 + AND is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + + UPDATE bus_merchant_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET invoice_settlement = invoice_settlement + #{invoice,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE bus_merchant_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND syd_id = #{sydId,jdbcType=INTEGER} + AND mer_id = #{merId,jdbcType=BIGINT} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + AND balance >= frozen + ${amount} + + + + + + UPDATE bus_merchant_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET invoice_settlement = invoice_settlement + #{invoice,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_merchant_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml new file mode 100644 index 0000000..124f8be --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAccountSynMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + id, sort, syn_lock, syn_batch, syn_position + + + + + + INSERT INTO bus_merchant_account_syn ( id ) SELECT + t.acc_id + FROM + bus_merchant_account t + WHERE + NOT EXISTS ( + SELECT + t1.id + FROM + bus_merchant_account_syn t1 + WHERE + t1.id = t.acc_id) + + + + UPDATE ( SELECT id FROM bus_merchant_account_syn + WHERE syn_lock = 0 AND syn_batch IS NULL + + AND id > ${minId} + + ORDER BY sort DESC,id ASC LIMIT ${start}, ${size} ) t + INNER JOIN bus_merchant_account_syn t1 ON t1.id = t.id + SET t1.syn_batch = '${synBatch}' + + + + update bus_merchant_account_syn + set syn_lock = 0, + syn_batch = NULL + where id = #{id,jdbcType=INTEGER} + + + + update bus_merchant_account_syn + set syn_lock = 0, + syn_batch = NULL + where syn_batch = '${synBatch}' + + + + UPDATE bus_merchant_account_syn + SET syn_lock = 1 + WHERE + syn_lock = 0 + AND syn_batch = '${synBatch}' + AND id = #{id,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml new file mode 100644 index 0000000..2eaed0d --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantAgreementMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml new file mode 100644 index 0000000..b1aa175 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantCashoutMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml new file mode 100644 index 0000000..f8bde8f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantConfigMapper.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml new file mode 100644 index 0000000..f91575f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantFlowsMapper.xml @@ -0,0 +1,38 @@ + + + + + insert into bus_merchant_flows (mer_id, syd_id, + bus_type, channel, bus_no, + bank_no, money, balance, + add_time, add_by, bus_desc, + bill_no, bill_id, bill_detail_id, + tran_no, tran_type, tran_status, + payer_type, payer_id, payer_name, + payer_acc, payer_acc_id, payee_type, + payee_id, payee_name, payee_acc, + payee_acc_id, remark, pay_receipt, + pay_receipt_type, illustrate) + + select #{item.merId,jdbcType=INTEGER}, #{item.sydId,jdbcType=INTEGER}, + #{item.busType,jdbcType=SMALLINT}, #{item.channel,jdbcType=VARCHAR}, #{item.busNo,jdbcType=VARCHAR}, + #{item.bankNo,jdbcType=VARCHAR}, #{item.money,jdbcType=BIGINT}, + + ((select t.balance from bus_merchant_account t where t.acc_id = ${item.payeeAccId}) + ${item.preMoney} + ${item.money}), + + + ((select t.balance from bus_merchant_account t where t.acc_id = ${item.payerAccId}) + ${item.preMoney} + ${item.money}), + + #{item.addTime,jdbcType=TIMESTAMP}, #{item.addBy,jdbcType=VARCHAR}, #{item.busDesc,jdbcType=VARCHAR}, + #{item.billNo,jdbcType=VARCHAR}, #{item.billId,jdbcType=INTEGER}, #{item.billDetailId,jdbcType=INTEGER}, + #{item.tranNo,jdbcType=VARCHAR}, #{item.tranType,jdbcType=SMALLINT}, #{item.tranStatus,jdbcType=SMALLINT}, + #{item.payerType,jdbcType=SMALLINT}, #{item.payerId,jdbcType=INTEGER}, #{item.payerName,jdbcType=VARCHAR}, + #{item.payerAcc,jdbcType=VARCHAR}, #{item.payerAccId,jdbcType=INTEGER}, #{item.payeeType,jdbcType=SMALLINT}, + #{item.payeeId,jdbcType=INTEGER}, #{item.payeeName,jdbcType=VARCHAR}, #{item.payeeAcc,jdbcType=VARCHAR}, + #{item.payeeAccId,jdbcType=INTEGER}, #{item.remark,jdbcType=VARCHAR}, #{item.payReceipt,jdbcType=VARCHAR}, + #{item.payReceiptType,jdbcType=SMALLINT}, #{item.illustrate,jdbcType=VARCHAR} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml new file mode 100644 index 0000000..65c8657 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantMapper.xml @@ -0,0 +1,73 @@ + + + + + + update bus_merchant + set + ywy_id = #{ywyId}, + salesman_id = #{ywyId}, + update_by = #{updateBy}, + update_time = #{updateTime} + where id = #{id} + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml new file mode 100644 index 0000000..d065a35 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + update bus_merchant_product set update_by = #{updateBy}, update_time = #{updateTime} + ,cost_service_charge = #{costServiceCharge} + ,service_charge = #{serviceCharge} + ,mdy_service_charge = #{mdyServiceCharge} + + and channel_no = #{channelNo} + and bus_type = #{busType} + and pro_no = #{proNo} + + + + + + + + update bus_merchant_product set service_charge = mdy_service_charge where service_charge != mdy_service_charge and mdy_service_charge is not null + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml new file mode 100644 index 0000000..49b998f --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/BusMerchantProductSydMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml new file mode 100644 index 0000000..0e94638 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/PubMerchantMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml new file mode 100644 index 0000000..1287f64 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillDayMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml new file mode 100644 index 0000000..64824d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/merchant/VMerchantBillMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml new file mode 100644 index 0000000..f5c1479 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAccountMapper.xml @@ -0,0 +1,252 @@ + + + + + SELECT + t.id, + t.op_id, + t.syd_id, + t.acc_id, + t.bank_type, + t.bank_virtual_card, + t.balance, + t.frozen, + t.cashout, + t.cashouting, + t.is_default, + t.add_time, + t.STATUS, + t.out_bank_card, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.gsmc syd_name, + t1.gsmc acc_name, + t1.no syd_no + + + + FROM + bus_operator_account t + INNER JOIN sys_syd t1 ON t1.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + + + insert into bus_operator_account + + + id, + + + op_id, + + + syd_id, + + + acc_id, + + + bank_type, + + + bank_virtual_card, + + + balance, + + + frozen, + + + cashout, + + + cashouting, + + + is_default, + + + add_time, + + + status, + + + out_bank_card, + + + name, + + + khh, + + + lhh, + + + + + #{id,jdbcType=INTEGER}, + + + #{opId,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankVirtualCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=BIGINT}, + + + #{frozen,jdbcType=BIGINT}, + + + #{cashout,jdbcType=BIGINT}, + + + #{cashouting,jdbcType=BIGINT}, + + + #{isDefault,jdbcType=TINYINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=SMALLINT}, + + + #{outBankCard,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{khh,jdbcType=VARCHAR}, + + + #{lhh,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + bus_operator_account t + WHERE + t.syd_id = #{sydId} and t.op_id = #{opId} and t.is_default = 0 and t.bank_type = #{bankType}) + + + + UPDATE bus_operator_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_operator_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + UPDATE bus_operator_account + SET cashout = cashout + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE bus_operator_account + SET cashouting = cashouting + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + + + + + + + UPDATE bus_operator_account + SET `status` = 2 + WHERE + `status` = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml new file mode 100644 index 0000000..eb4e265 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorAgreementMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml new file mode 100644 index 0000000..d6ca269 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorCashoutMapper.xml @@ -0,0 +1,65 @@ + + + + + SELECT + t.id, + t.syd_id, + t.op_id, + t.acc_id, + t.bus_no, + t.amount, + t.remark, + t.khh, + t.khh_no, + t.fr, + t.khd, + t.bank_card, + t.verify_status, + t.verify_time, + t.verify_by, + t.verify_reason, + t.iogistics_company, + t.iogistics_no, + t.invoice_pic, + t.pay_status, + t.pay_time, + t.pay_remark, + t.add_time, + t.add_by, + t.passage, + t.pay_receipt, + t.create_dept, + t.create_by, + t.create_time, + t.update_by, + t.update_time, + t1.`name` op_name, + t1.no op_no, + t2.gsmc syd_name, + t2.no syd_no + + + + FROM + bus_operator_cashout t + INNER JOIN bus_operator t1 ON t1.id = t.op_id + INNER JOIN sys_syd t2 ON t2.id = t.syd_id + ${ew.getCustomSqlSegment} + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml new file mode 100644 index 0000000..2f7de29 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorFlowsMapper.xml @@ -0,0 +1,198 @@ + + + + + + insert into bus_operator_flows + + + id, + + + op_id, + + + bus_type, + + + channel, + + + bus_no, + + + bank_no, + + + money, + + balance, + + add_time, + + + add_by, + + + bus_desc, + + + bill_no, + + + bill_id, + + + bill_detail_id, + + + tran_no, + + + tran_type, + + + tran_status, + + + payer_type, + + + payer_id, + + + payer_name, + + + payer_acc, + + + payer_acc_id, + + + payee_type, + + + payee_id, + + + payee_name, + + + payee_acc, + + + payee_acc_id, + + + remark, + + + pay_receipt, + + + pay_receipt_type, + + + + + #{id,jdbcType=INTEGER}, + + + #{opId,jdbcType=INTEGER}, + + + #{busType,jdbcType=SMALLINT}, + + + #{channel,jdbcType=VARCHAR}, + + + #{busNo,jdbcType=VARCHAR}, + + + #{bankNo,jdbcType=VARCHAR}, + + + #{money,jdbcType=BIGINT}, + + + (select t.balance from bus_operator_account t where t.acc_id = ${payerAccId}), + + + ((select t.balance from bus_operator_account t where t.acc_id = ${payeeAccId}) + ${money}), + + + ((select t.balance from bus_operator_account t where t.acc_id = ${payerAccId}) + ${money}), + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{busDesc,jdbcType=VARCHAR}, + + + #{billNo,jdbcType=VARCHAR}, + + + #{billId,jdbcType=INTEGER}, + + + #{billDetailId,jdbcType=INTEGER}, + + + #{tranNo,jdbcType=VARCHAR}, + + + #{tranType,jdbcType=SMALLINT}, + + + #{tranStatus,jdbcType=SMALLINT}, + + + #{payerType,jdbcType=SMALLINT}, + + + #{payerId,jdbcType=INTEGER}, + + + #{payerName,jdbcType=VARCHAR}, + + + #{payerAcc,jdbcType=VARCHAR}, + + + #{payerAccId,jdbcType=INTEGER}, + + + #{payeeType,jdbcType=SMALLINT}, + + + #{payeeId,jdbcType=INTEGER}, + + + #{payeeName,jdbcType=VARCHAR}, + + + #{payeeAcc,jdbcType=VARCHAR}, + + + #{payeeAccId,jdbcType=INTEGER}, + + + #{remark,jdbcType=VARCHAR}, + + + #{payReceipt,jdbcType=VARCHAR}, + + + #{payReceiptType,jdbcType=SMALLINT}, + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml new file mode 100644 index 0000000..2c7fe1e --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml new file mode 100644 index 0000000..49baccf --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/BusOperatorProductMapper.xml @@ -0,0 +1,121 @@ + + + + + + INSERT INTO `bus_operator_product` ( + `syd_id`, + `syd_no`, + `bus_type`, + `pro_no`, + `pro_id`, + `op_no`, + `op_id`, + `cost_service_charge`, + `service_charge`, + `charge_mode`, + `settlement_style`, + `max_month`, + `invoice_type`, + `invoice_items`, + `create_time`, + `create_by`, + `update_time`, + `update_by` + ) + + SELECT + `syd_id`, + `syd_no`, + `bus_type`, + `no`, + `id`, + #{item.opNo}, + #{item.opId}, + `service_charge`, + #{item.serviceCharge}, + `charge_mode`, + `settlement_style`, + `max_month`, + `invoice_type`, + `invoice_items`, + #{createTime}, + #{createBy}, + #{createTime}, + #{createBy} + FROM + sys_syd_product + WHERE + id = #{item.proId} + + + + + INSERT INTO `bus_operator_product` ( + `syd_id`, + `syd_no`, + `bus_type`, + `pro_no`, + `pro_id`, + `op_no`, + `op_id`, + `cost_service_charge`, + `service_charge`, + `charge_mode`, + `settlement_style`, + `max_month`, + `invoice_type`, + `invoice_items`, + `pro_status`, + `create_time`, + `create_by` + ) values + + (#{item.sydId},#{item.sydNo},#{item.busType},#{item.proNo},#{item.proId},#{item.opNo},#{item.opId},#{item.costServiceCharge},#{item.serviceCharge},#{item.chargeMode}, + #{item.settlementStyle},#{item.maxMonth},#{item.invoiceType},#{item.invoiceItems},#{item.proStatus},#{item.createTime},#{item.createBy}) + + + + + + + + + + update bus_channel_product set cost_service_charge = #{item.cost_service_charge} where op_id =#{item.op_id} and pro_id= #{item.pro_id} and up_is_op = 1 + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml new file mode 100644 index 0000000..5b5efc2 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/operator/ReProductInvoiceMapper.xml @@ -0,0 +1,32 @@ + + + + + + INSERT INTO re_product_invoice ( pro_type, pro_no, pro_id, invoice_type_id, create_time, create_by, update_time, update_by, bus_id, bus_type ) SELECT + pro_type, + pro_no, + pro_id, + invoice_type_id, + #{operTime}, + #{operBy}, + #{operTime}, + #{operBy}, + #{newBusId}, + #{newBusType} + FROM + re_product_invoice + WHERE + bus_type = #{busType} + AND bus_id IN + + #{item} + + AND pro_id IN + + #{item} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml new file mode 100644 index 0000000..67f9f56 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/AccAccountsMapper.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + id, syd_id, bank_type, bank_card, bank_acc_name, is_use, use_obj, use_obj_id, use_obj_name, + add_time,bank_arg_no + + + + + + + + + update acc_accounts + + + syd_id = #{sydId,jdbcType=BIGINT}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + bank_acc_name = #{bankAccName,jdbcType=VARCHAR}, + + + is_use = #{isUse,jdbcType=BIT}, + + + use_obj = #{useObj,jdbcType=SMALLINT}, + + + use_obj_id = #{useObjId,jdbcType=BIGINT}, + + + use_obj_name = #{useObjName,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + bank_arg_no = #{bankArgNo,jdbcType=VARCHAR}, + + + where is_use = 0 and id = #{id,jdbcType=INTEGER} + + + + update acc_accounts + + + syd_id = #{sydId,jdbcType=BIGINT}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + bank_acc_name = #{bankAccName,jdbcType=VARCHAR}, + + + is_use = #{isUse,jdbcType=BIT}, + + + use_obj = #{useObj,jdbcType=SMALLINT}, + + + use_obj_id = #{useObjId,jdbcType=BIGINT}, + + + use_obj_name = #{useObjName,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + bank_arg_no = #{bankArgNo,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + + insert into acc_accounts + + + id, + + + syd_id, + + + bank_type, + + + bank_card, + + + bank_acc_name, + + + is_use, + + + use_obj, + + + use_obj_id, + + + use_obj_name, + + + add_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{sydId,jdbcType=BIGINT}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{bankAccName,jdbcType=VARCHAR}, + + + #{isUse,jdbcType=BIT}, + + + #{useObj,jdbcType=SMALLINT}, + + + #{useObjId,jdbcType=BIGINT}, + + + #{useObjName,jdbcType=VARCHAR}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml new file mode 100644 index 0000000..71cd2c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/BusDownloadsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml new file mode 100644 index 0000000..5ddeb25 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/ProInfoCommonMapper.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml new file mode 100644 index 0000000..112f9d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysPayPwd.xml @@ -0,0 +1,18 @@ + + + + + + + + + update bus_operator set pay_password = #{payPassword} + ,create_time = #{createTime} + ,create_by = #{createBy} + where id = #{id} + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml new file mode 100644 index 0000000..f3546e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountMapper.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + select id, syd_id, acc_id, bank_type, bank_card, balance, frozen, is_default, add_time from sys_syd_account + + + + + + + + + + insert into sys_syd_account + + syd_id, + acc_id, + acc_type, + bank_type, + bank_card, + balance, + frozen, + is_default, + add_time, + lhh, + khh, + name, + + + #{sydId}, + #{accId}, + #{accType}, + #{bankType}, + #{bankCard}, + #{balance}, + #{frozen}, + #{isDefault}, + #{addTime}, + #{lhh}, + #{khh}, + #{name}, + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.syd_id + FROM + sys_syd_account t + WHERE + t.syd_id = #{sydId} and t.acc_type = #{accType} and t.bank_type = #{bankType}) + + + + update sys_syd_account + + syd_id = #{sydId}, + acc_id = #{accId}, + bank_type = #{bankType}, + bank_card = #{bankCard}, + balance = #{balance}, + frozen = #{frozen}, + is_default = #{isDefault}, + add_time = #{addTime}, + status = #{status,jdbcType=SMALLINT}, + + where id = #{id} + + + + update sys_syd_account + + syd_id = #{sydId}, + acc_id = #{accId}, + bank_type = #{bankType}, + bank_card = #{bankCard}, + balance = #{balance}, + frozen = #{frozen}, + is_default = #{isDefault}, + add_time = #{addTime}, + status = #{status,jdbcType=SMALLINT}, + + where acc_id = #{accId,jdbcType=BIGINT} + + + + delete from sys_syd_account where id = #{id} + + + + delete from sys_syd_account where id in + + #{id} + + + + + UPDATE sys_syd_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + is_default = 1 + AND acc_type = #{accType,jdbcType=SMALLINT} + AND syd_id = #{sydId,jdbcType=INTEGER} + AND bank_type = #{bankType,jdbcType=VARCHAR} + + + + UPDATE sys_syd_account + SET `status` = 2 + WHERE + `status` = 1 + AND is_default = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + + + + UPDATE sys_syd_account + SET invoice = invoice + #{invoice,jdbcType=BIGINT} + WHERE + settlement - invoice >= #{invoice,jdbcType=BIGINT} + AND acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE sys_syd_account + SET balance = balance + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + + + UPDATE sys_syd_account + SET frozen = frozen + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + AND balance >= frozen + ${amount} + + + + + UPDATE sys_syd_account + SET settlement = settlement + #{amount,jdbcType=BIGINT} + WHERE + + + AND + + acc_id = #{accId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml new file mode 100644 index 0000000..510b920 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydAccountSynMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml new file mode 100644 index 0000000..3662bc4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydCashoutMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml new file mode 100644 index 0000000..89c93d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml new file mode 100644 index 0000000..6e62b44 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydFlowsMapper.xml @@ -0,0 +1,238 @@ + + + + + + insert into sys_syd_flows + + + id, + + + syd_id, + + + bus_type, + + + channel, + + + bus_no, + + + bank_no, + + + money, + + balance, + + add_time, + + + add_by, + + + bus_desc, + + + bill_no, + + + bill_id, + + + bill_detail_id, + + + tran_no, + + + tran_type, + + + tran_status, + + + payer_type, + + + payer_id, + + + payer_name, + + + payer_acc, + + + payer_acc_id, + + + payee_type, + + + payee_id, + + + payee_name, + + + payee_acc, + + + payee_acc_id, + + + remark, + + + pay_receipt, + + + pay_receipt_type, + + + + + #{id,jdbcType=INTEGER}, + + + #{sydId,jdbcType=INTEGER}, + + + #{busType,jdbcType=SMALLINT}, + + + #{channel,jdbcType=VARCHAR}, + + + #{busNo,jdbcType=VARCHAR}, + + + #{bankNo,jdbcType=VARCHAR}, + + + #{money,jdbcType=BIGINT}, + + + (select t.balance from sys_syd_account t where t.acc_id = ${payerAccId}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${payeeAccId}) + ${money}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${payerAccId}) + ${money}), + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{busDesc,jdbcType=VARCHAR}, + + + #{billNo,jdbcType=VARCHAR}, + + + #{billId,jdbcType=INTEGER}, + + + #{billDetailId,jdbcType=INTEGER}, + + + #{tranNo,jdbcType=VARCHAR}, + + + #{tranType,jdbcType=SMALLINT}, + + + #{tranStatus,jdbcType=SMALLINT}, + + + #{payerType,jdbcType=SMALLINT}, + + + #{payerId,jdbcType=INTEGER}, + + + #{payerName,jdbcType=VARCHAR}, + + + #{payerAcc,jdbcType=VARCHAR}, + + + #{payerAccId,jdbcType=INTEGER}, + + + #{payeeType,jdbcType=SMALLINT}, + + + #{payeeId,jdbcType=INTEGER}, + + + #{payeeName,jdbcType=VARCHAR}, + + + #{payeeAcc,jdbcType=VARCHAR}, + + + #{payeeAccId,jdbcType=INTEGER}, + + + #{remark,jdbcType=VARCHAR}, + + + #{payReceipt,jdbcType=VARCHAR}, + + + #{payReceiptType,jdbcType=SMALLINT}, + + + + + + + insert into sys_syd_flows (syd_id, bus_type, + channel, bus_no, bank_no, + money, balance, add_time, + add_by, bus_desc, bill_no, + bill_id, bill_detail_id, tran_no, + tran_type, tran_status, payer_type, + payer_id, payer_name, payer_acc, + payer_acc_id, payee_type, payee_id, + payee_name, payee_acc, payee_acc_id, + remark, pay_receipt, pay_receipt_type, + create_dept, create_by, create_time, + update_by, update_time) + + select #{item.sydId,jdbcType=INTEGER}, #{item.busType,jdbcType=SMALLINT}, + #{item.channel,jdbcType=VARCHAR}, #{item.busNo,jdbcType=VARCHAR}, #{item.bankNo,jdbcType=VARCHAR}, + #{item.money,jdbcType=BIGINT}, + + (select t.balance from sys_syd_account t where t.acc_id = ${item.payerAccId}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${item.payeeAccId}) + ${item.money}), + + + ((select t.balance from sys_syd_account t where t.acc_id = ${item.payerAccId}) + ${item.money}), + + #{item.addTime,jdbcType=TIMESTAMP}, + #{item.addBy,jdbcType=VARCHAR}, #{item.busDesc,jdbcType=VARCHAR}, #{item.billNo,jdbcType=VARCHAR}, + #{item.billId,jdbcType=INTEGER}, #{item.billDetailId,jdbcType=INTEGER}, #{item.tranNo,jdbcType=VARCHAR}, + #{item.tranType,jdbcType=SMALLINT}, #{item.tranStatus,jdbcType=SMALLINT}, #{item.payerType,jdbcType=SMALLINT}, + #{item.payerId,jdbcType=INTEGER}, #{item.payerName,jdbcType=VARCHAR}, #{item.payerAcc,jdbcType=VARCHAR}, + #{item.payerAccId,jdbcType=INTEGER}, #{item.payeeType,jdbcType=SMALLINT}, #{item.payeeId,jdbcType=INTEGER}, + #{item.payeeName,jdbcType=VARCHAR}, #{item.payeeAcc,jdbcType=VARCHAR}, #{item.payeeAccId,jdbcType=INTEGER}, + #{item.remark,jdbcType=VARCHAR}, #{item.payReceipt,jdbcType=VARCHAR}, #{item.payReceiptType,jdbcType=SMALLINT}, + #{item.createDept,jdbcType=BIGINT}, #{item.createBy,jdbcType=BIGINT}, #{item.createTime,jdbcType=TIMESTAMP}, + #{item.updateBy,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP} + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml new file mode 100644 index 0000000..f8196aa --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydLogMapper.xml @@ -0,0 +1,82 @@ + + + + + INSERT INTO `sys_syd_log` ( + `syd_id`, + `no`, + `gsmc`, + `kfd`, + `kfh`, + `bank_type`, + `bank_card`, + `jbsl`, + `quote_num`, + `add_time`, + `add_by`, + `editer`, + `edit_time`, + `province_id`, + `province_name`, + `city_id`, + `city_name`, + `county_id`, + `county_name`, + `nsr_sbh`, + `fr`, + `fr_cardid`, + `fr_phone`, + `con_name`, + `con_phone`, + `con_cardid`, + `con_email`, + `address`, + `business`, + `abridge`, + `limit_amount`, + `sign_mode`, + `sign_valid_time`, + `log_time` + ) SELECT + `id`, + `no`, + `gsmc`, + `kfd`, + `kfh`, + `bank_type`, + `bank_card`, + `jbsl`, + `quote_num`, + `add_time`, + `add_by`, + `editer`, + `edit_time`, + `province_id`, + `province_name`, + `city_id`, + `city_name`, + `county_id`, + `county_name`, + `nsr_sbh`, + `fr`, + `fr_cardid`, + `fr_phone`, + `con_name`, + `con_phone`, + `con_cardid`, + `con_email`, + `address`, + `business`, + `abridge`, + 0, + 0, + 1, + #{curTime} + FROM + sys_syd + WHERE + id = #{sydId} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml new file mode 100644 index 0000000..59f9786 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, gsmc, abridge, kfd, kfh, bank_type, bank_card, jbsl, quote_num, add_time, add_by, editer, province_id, province_name, city_id, city_name, county_id, county_name, nsr_sbh, fr, fr_cardid, fr_phone, con_name, con_phone, con_cardid, con_email, address, business from sys_syd + + + + + + + + + + update sys_syd + + gsmc = #{gsmc}, + abridge = #{abridge}, + kfd = #{kfd}, + kfh = #{kfh}, + bank_type = #{bankType}, + bank_card = #{bankCard}, + jbsl = #{jbsl}, + quote_num = #{quoteNum}, + add_time = #{addTime}, + add_by = #{addBy}, + editer = #{editer}, + edit_time = #{editTime}, + province_id = #{provinceId}, + province_name = #{provinceName}, + city_id = #{cityId}, + city_name = #{cityName}, + county_id = #{countyId}, + county_name = #{countyName}, + nsr_sbh = #{nsrSbh}, + fr = #{fr}, + fr_cardid = #{frCardid}, + fr_phone = #{frPhone}, + con_name = #{conName}, + con_phone = #{conPhone}, + con_cardid = #{conCardid}, + con_email = #{conEmail}, + address = #{address}, + business = #{business}, + limit_amount = #{limitAmount}, + sign_mode = #{signMode}, + sign_valid_time = #{signValidTime}, + + where id = #{id} + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml new file mode 100644 index 0000000..fc2c702 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydProductMapper.xml @@ -0,0 +1,74 @@ + + + + + SELECT + t.`id`, + t.`id` pro_id, + t.`syd_id`, + t.`syd_no`, + t.`bus_type`, + t.`no`, + t.`no` pro_no, + s.gsmc syd_name, + t.`service_charge`, + + op.service_charge setingServiceCharge, + op.pro_status, + + + t.pro_status, + t.seting_service_charge, + + t.`charge_mode`, + t.`settlement_style`, + t.`max_month`, + t.`invoice_type`, + t.`invoice_items`, + t.`create_time`, + t.`create_by`, + t.`update_time`, + t.`update_by` + + FROM + `sys_syd_product` t + INNER JOIN sys_syd s ON s.id = t.syd_id + + AND t.create_time between #{where.params.begin_time} and #{where.params.end_time} + + + AND t.bus_type = #{where.params.bus_type} + + + AND t.no = #{where.params.no} + + + AND t.invoice_type = #{where.params.invoice_type} + + + AND s.gsmc like CONCAT(#{where.params.syd_name},'%') + + + AND s.no = #{where.params.syd_no} + + + LEFT JOIN bus_operator_product op ON op.pro_id = t.id + AND t.pro_status = 1 + AND op.op_id = #{where.params.opId} + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml new file mode 100644 index 0000000..fb2f24c --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysSydSignContentMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + id + + + content + + + + + insert into sys_syd_sign_content + + + id, + + + content, + + + editer, + + + edit_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{content,jdbcType=LONGVARCHAR}, + + + #{editer,jdbcType=VARCHAR}, + + + #{editTime,jdbcType=TIMESTAMP}, + + + + + update sys_syd_sign_content + + + content = #{content,jdbcType=LONGVARCHAR}, + + + editer = #{editer,jdbcType=VARCHAR}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=INTEGER} + + + update sys_syd_sign_content + set content = #{content,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml new file mode 100644 index 0000000..fda9ca4 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/syd/SysUnitMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml new file mode 100644 index 0000000..6fcc209 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskEnrollMapper.xml @@ -0,0 +1,73 @@ + + + + + + UPDATE mer_bill_detail t + INNER JOIN mer_task_enroll t1 ON t1.id = t.worker_enroll_id + AND t1.settlement_status = #{sourceSettlementStatus} + AND t.bill_id = #{billId} + SET t1.settlement_status = #{settlementStatus} + + + + + + UPDATE mer_task_enroll + SET verify_status = 3, + verify_by = #{verifyBy}, + verify_time = now() + WHERE task_id = #{taskId} + + and id in + + #{item} + + + + + + UPDATE mer_task_enroll + SET verify_status = 2, + verify_by = #{verifyBy}, + verify_time = now() + WHERE task_id = #{taskId} + + and id not in + + #{item} + + + + + + UPDATE mer_task_enroll + SET task_status = #{taskStatus}, + task_remark = #{taskRemark} + WHERE task_id = #{taskId} and id = #{id} and task_status in ( 1,2,3) + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml new file mode 100644 index 0000000..bac0097 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/task/MerTaskMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + update mer_task + set task_status = 8 + where id = #{id} + and limit_num = (select count(1) from mer_task_enroll + where task_id = #{id} and task_status = 3 and verify_status = 3) + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml new file mode 100644 index 0000000..3c9af50 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsDetailMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml new file mode 100644 index 0000000..f59bfda --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/MerTaxRecordsMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml new file mode 100644 index 0000000..19dcb30 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/taxRecords/SwMonitorMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml new file mode 100644 index 0000000..3c0d4d8 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/thirdPlatform/SysThirdPlatformMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml new file mode 100644 index 0000000..c3c63a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAccountMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml new file mode 100644 index 0000000..83d0a63 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerAuthorizedMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml new file mode 100644 index 0000000..516c093 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBillMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + delete from user_worker_bill where worker_id = #{workerId} and syd_id = #{sydId} and mer_id = #{merId} and bus_type = #{busType} and dtm_year = #{dtmYear} + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml new file mode 100644 index 0000000..b167479 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerBusinessMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + update user_worker + + + name = #{name}, + + + card_positive = #{cardPositive}, + + + card_back = #{cardBack}, + + + photo_path = #{photoPath}, + + + + + and card_id = #{cardId} + + + + and id = #{id} + + + + + + + + update user_worker_business + + + v_phone = #{vPhone} + + + + + and work_id = #{workId} + + + and mer_id = #{merId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml new file mode 100644 index 0000000..e7cdc20 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/mapper/payment/worker/UserWorkerMapper.xml @@ -0,0 +1,50 @@ + + + + + + diff --git a/ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java b/ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java new file mode 100644 index 0000000..7ae6b6a --- /dev/null +++ b/ruoyi-modules/ruoyi-payment/src/test/java/org/dromara/payment/invoice/InvoiceImplTest.java @@ -0,0 +1,11629 @@ +package org.dromara.payment.invoice; + +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.payment.invoice.domain.MerInvoiceType; +import org.dromara.payment.invoice.mapper.MerInvoiceTypeMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.*; + +/** + * @author sunzexing + * @version 1.0 + * @title InvoiceImplTest + * @description + * @create 2024-07-11 16:54 + */ +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class InvoiceImplTest { + + + @Autowired + private MerInvoiceTypeMapper merInvoiceTypeMapper; + + + +// @Test +// public void testInsertDictData(){ +// +// { +// +// String json = "{\n" + +// " \"success\": true,\n" + +// " \"message\": \"操作成功!\",\n" + +// " \"code\": 200,\n" + +// " \"result\": [\n" + +// " {\n" + +// " \"id\": \"1321646609039216642\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"1\",\n" + +// " \"name\": \"劳务*垃圾处理处置劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609232154625\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"2\",\n" + +// " \"name\": \"劳务*污泥处理处置劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609236348930\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"3\",\n" + +// " \"name\": \"劳务*污水处理劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609236348931\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"4\",\n" + +// " \"name\": \"劳务*工业废气处理劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609236348932\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"5\",\n" + +// " \"name\": \"劳务*其他加工劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609244737537\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"6\",\n" + +// " \"name\": \"劳务*稀土金属及合金加工费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609244737538\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"7\",\n" + +// " \"name\": \"劳务*修理修配劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609248931842\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"8\",\n" + +// " \"name\": \"劳务*油气田生产性劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609248931843\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"9\",\n" + +// " \"name\": \"劳务*矿产资源开采劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609248931844\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"10\",\n" + +// " \"name\": \"劳务*矿产资源挖掘劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126145\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"11\",\n" + +// " \"name\": \"劳务*矿产资源切割劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126146\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"12\",\n" + +// " \"name\": \"劳务*矿产资源破碎劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126147\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"13\",\n" + +// " \"name\": \"劳务*矿产资源分拣劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609253126148\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"14\",\n" + +// " \"name\": \"劳务*矿产资源洗选劳务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609257320450\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"15\",\n" + +// " \"name\": \"交通运输服务*陆路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609257320451\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"16\",\n" + +// " \"name\": \"交通运输服务* 陆路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609261514754\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"17\",\n" + +// " \"name\": \"交通运输服务*水路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609261514755\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"18\",\n" + +// " \"name\": \"交通运输服务*水路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609261514756\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"19\",\n" + +// " \"name\": \"交通运输服务*水路运输期租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709058\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"20\",\n" + +// " \"name\": \"交通运输服务*水路运输程租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709059\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"21\",\n" + +// " \"name\": \"交通运输服务*航空客货运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709060\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"22\",\n" + +// " \"name\": \"交通运输服务* 航天运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609265709061\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"23\",\n" + +// " \"name\": \"交通运输服务* 液体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903361\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"24\",\n" + +// " \"name\": \"交通运输服务* 气体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903362\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"25\",\n" + +// " \"name\": \"交通运输服务* 固体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903363\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"26\",\n" + +// " \"name\": \"交通运输服务* 其他管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903364\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"27\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运陆路运输业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903365\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"28\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运水路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609269903366\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"29\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运航空运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097666\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"30\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097667\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"31\",\n" + +// " \"name\": \"交通运输服务* 无运输工具承运联运运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097668\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"32\",\n" + +// " \"name\": \"交通运输服务* 其他无运输工具承运业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097669\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"33\",\n" + +// " \"name\": \"交通运输服务* 旅客联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609274097670\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"34\",\n" + +// " \"name\": \"交通运输服务* 货物联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291969\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"35\",\n" + +// " \"name\": \"交通运输服务* 其他旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291970\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"36\",\n" + +// " \"name\": \"交通运输服务* 其他货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291971\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"37\",\n" + +// " \"name\": \"邮政服务*函件寄递服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291972\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"38\",\n" + +// " \"name\": \"邮政服务*包裹寄递服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609278291973\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"39\",\n" + +// " \"name\": \"邮政服务*其他邮件寄递服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486274\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"40\",\n" + +// " \"name\": \"邮政服务*邮票发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486275\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"41\",\n" + +// " \"name\": \"邮政服务*报刊发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486276\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"42\",\n" + +// " \"name\": \"邮政服务*邮政汇兑\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486277\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"43\",\n" + +// " \"name\": \"邮政服务*其他邮政普遍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486278\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"44\",\n" + +// " \"name\": \"邮政服务*邮政特殊服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486279\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"45\",\n" + +// " \"name\": \"邮政服务*邮册等邮品销售服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609282486280\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"46\",\n" + +// " \"name\": \"邮政服务*邮政代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680578\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"47\",\n" + +// " \"name\": \"邮政服务*其他未列邮政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680579\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"48\",\n" + +// " \"name\": \"电信服务*语音通话服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680580\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"49\",\n" + +// " \"name\": \"电信服务*出租或出售网络元素\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680581\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"50\",\n" + +// " \"name\": \"电信服务*短信和彩信服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680582\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"51\",\n" + +// " \"name\": \"电信服务*电子数据和信息的传输及应用服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680583\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"52\",\n" + +// " \"name\": \"电信服务*互联网接入服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680584\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"53\",\n" + +// " \"name\": \"电信服务*广播电视信号传输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609286680585\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"54\",\n" + +// " \"name\": \"电信服务*卫星电视信号落地转接服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069185\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"55\",\n" + +// " \"name\": \"电信服务*其他增值电信服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069186\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"56\",\n" + +// " \"name\": \"研发和技术服务*研发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069187\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"57\",\n" + +// " \"name\": \"研发和技术服务*合同能源管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069188\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"58\",\n" + +// " \"name\": \"研发和技术服务*工程勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069189\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"59\",\n" + +// " \"name\": \"研发和技术服务*地质勘查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069190\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:48:22\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"60\",\n" + +// " \"name\": \"*研发和技术服务*专业技术服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069191\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:34:40\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"61\",\n" + +// " \"name\": \"*信息技术服务*软件开发服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069192\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:33:58\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"62\",\n" + +// " \"name\": \"*信息技术服务*软件维护服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069193\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"63\",\n" + +// " \"name\": \"信息技术服务*软件测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609295069194\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:33:27\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"64\",\n" + +// " \"name\": \"*信息技术服务*其他软件服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263489\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"65\",\n" + +// " \"name\": \"信息技术服务*电路设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263490\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"66\",\n" + +// " \"name\": \"信息技术服务*电路测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263491\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"67\",\n" + +// " \"name\": \"信息技术服务*相关电路技术支持服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263492\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:33:05\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"68\",\n" + +// " \"name\": \"*信息技术服务*信息系统服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263493\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:36:10\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"69\",\n" + +// " \"name\": \"*信息技术服务*业务流程管理服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263494\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:27:57\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"70\",\n" + +// " \"name\": \"*信息技术服务*信息系统增值服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263495\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"71\",\n" + +// " \"name\": \"设计服务*工程设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263496\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"72\",\n" + +// " \"name\": \"设计服务*文印晒图服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263497\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"73\",\n" + +// " \"name\": \"设计服务*其他设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263498\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"74\",\n" + +// " \"name\": \"文化创意服务*知识产权服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263499\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"75\",\n" + +// " \"name\": \"广告服务*广告发布服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263500\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"76\",\n" + +// " \"name\": \"广告服务*广告代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263501\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"77\",\n" + +// " \"name\": \"会议展览服务*会议服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263502\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"78\",\n" + +// " \"name\": \"会议展览服务*展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609299263503\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"79\",\n" + +// " \"name\": \"航空地面服务*机场服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040706\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"80\",\n" + +// " \"name\": \"航空地面服务*空中交通管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040707\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"81\",\n" + +// " \"name\": \"航空地面服务*其他航空地面服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040708\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"82\",\n" + +// " \"name\": \"通用航空服务*航空摄影\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609316040709\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"83\",\n" + +// " \"name\": \"通用航空服务*航空培训\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235010\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"84\",\n" + +// " \"name\": \"通用航空服务*航空测量\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235011\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"85\",\n" + +// " \"name\": \"通用航空服务*航空勘探\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235012\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"86\",\n" + +// " \"name\": \"通用航空服务*航空护林\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235013\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"87\",\n" + +// " \"name\": \"通用航空服务*航空播洒农药\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235014\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"88\",\n" + +// " \"name\": \"通用航空服务*航空降雨\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235015\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"89\",\n" + +// " \"name\": \"通用航空服务*其他通用航空服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235016\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"90\",\n" + +// " \"name\": \"物流辅助服务*港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609320235017\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"91\",\n" + +// " \"name\": \"物流辅助服务*货运客运场站服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429313\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"92\",\n" + +// " \"name\": \"物流辅助服务*打捞救助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429314\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"93\",\n" + +// " \"name\": \"物流辅助服务*收派服务*收件服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429315\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"94\",\n" + +// " \"name\": \"物流辅助服务*收派服务*分拣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429316\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"95\",\n" + +// " \"name\": \"物流辅助服务*收派服务*派送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429317\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"96\",\n" + +// " \"name\": \"鉴证咨询服务*认证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429318\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"97\",\n" + +// " \"name\": \"鉴证服务*工程监理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429319\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"98\",\n" + +// " \"name\": \"鉴证服务*涉税鉴证\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429320\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"99\",\n" + +// " \"name\": \"鉴证服务*纳税情况审查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429321\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"100\",\n" + +// " \"name\": \"鉴证服务*审计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429322\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"101\",\n" + +// " \"name\": \"鉴证服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429323\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"102\",\n" + +// " \"name\": \"咨询服务*一般税务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429324\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"103\",\n" + +// " \"name\": \"咨询服务*专业税务顾问\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429325\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"104\",\n" + +// " \"name\": \"咨询服务*一般税务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429326\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"105\",\n" + +// " \"name\": \"咨询服务*税收策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429327\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"106\",\n" + +// " \"name\": \"咨询服务*其他涉税服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429328\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"107\",\n" + +// " \"name\": \"咨询服务*会计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429329\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"108\",\n" + +// " \"name\": \"咨询服务*会计咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429330\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"109\",\n" + +// " \"name\": \"咨询服务*法律咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429331\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"110\",\n" + +// " \"name\": \"咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429332\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"111\",\n" + +// " \"name\": \"广播影视服务*广播节目制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429333\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"112\",\n" + +// " \"name\": \"广播影视服务*电视节目制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429334\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"113\",\n" + +// " \"name\": \"广播影视服务*电影制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429335\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"114\",\n" + +// " \"name\": \"广播影视服务*音像制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429336\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"115\",\n" + +// " \"name\": \"广播影视服务*广播节目发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429337\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"116\",\n" + +// " \"name\": \"广播影视服务*电视节目发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429338\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"117\",\n" + +// " \"name\": \"广播影视服务*广播节目制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429339\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"118\",\n" + +// " \"name\": \"广播影视服务*电影发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429340\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"119\",\n" + +// " \"name\": \"广播影视服务*广播节目播出服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429341\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"120\",\n" + +// " \"name\": \"广播影视服务*电视节目播出服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429342\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"121\",\n" + +// " \"name\": \"广播影视服务*现场电影放映服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429343\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"122\",\n" + +// " \"name\": \"广播影视服务*互联网电影播出服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429344\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"123\",\n" + +// " \"name\": \"企业管理服务*物业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429345\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:22:47\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"124\",\n" + +// " \"name\": \"*企业管理服务*其他企业管理服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429346\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"125\",\n" + +// " \"name\": \"经纪代理服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429347\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"126\",\n" + +// " \"name\": \"经纪代理服务*代理报关服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429348\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"127\",\n" + +// " \"name\": \"经纪代理服务*婚姻介绍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429349\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"128\",\n" + +// " \"name\": \"经纪代理服务*纳税申报代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429350\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"129\",\n" + +// " \"name\": \"经纪代理服务*其他税务事项代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429351\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"130\",\n" + +// " \"name\": \"经纪代理服务*法律代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429352\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"131\",\n" + +// " \"name\": \"经纪代理服务*代理记账\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429353\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"132\",\n" + +// " \"name\": \"经纪代理服务*其他经纪代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429354\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"133\",\n" + +// " \"name\": \"人力资源服务*劳务派遣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429355\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"134\",\n" + +// " \"name\": \"人力资源服务*其他人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429356\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"135\",\n" + +// " \"name\": \"商务辅助服务*安全保护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429357\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:04:52\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"136\",\n" + +// " \"name\": \"*现代服务*其他现代服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429358\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"137\",\n" + +// " \"name\": \"建筑服务*工程服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429359\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"138\",\n" + +// " \"name\": \"建筑服务*安装服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429360\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"139\",\n" + +// " \"name\": \"建筑服务*修缮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429361\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"140\",\n" + +// " \"name\": \"建筑服务*装饰服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429362\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"141\",\n" + +// " \"name\": \"建筑服务*其他建筑服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429363\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"142\",\n" + +// " \"name\": \"文化体育服务*文化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429364\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"143\",\n" + +// " \"name\": \"文化体育服务*体育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429365\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"144\",\n" + +// " \"name\": \"教育医疗服务*教育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429366\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"145\",\n" + +// " \"name\": \"教育医疗服务*医疗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429367\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"146\",\n" + +// " \"name\": \"旅游娱乐服务*旅游服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429368\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"147\",\n" + +// " \"name\": \"旅游娱乐服务*娱乐服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429369\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"148\",\n" + +// " \"name\": \"餐饮住宿服务*餐饮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429370\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"149\",\n" + +// " \"name\": \"餐饮住宿服务*住宿服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429371\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"150\",\n" + +// " \"name\": \"居民日常服务*殡葬服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429372\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"151\",\n" + +// " \"name\": \"居民日常服务*养老服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429373\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"152\",\n" + +// " \"name\": \"居民日常服务*员工制家政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429374\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"153\",\n" + +// " \"name\": \"居民日常服务*育养服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429375\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"154\",\n" + +// " \"name\": \"居民日常服务*其他居民日常服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1321646609324429376\",\n" + +// " \"createBy\": null,\n" + +// " \"createTime\": \"2020-10-29 10:54:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:20:08\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"155\",\n" + +// " \"name\": \"*生活服务*其他生活服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031192489947138\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"156\",\n" + +// " \"name\": \"租赁服务*融资租赁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031192749993986\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"157\",\n" + +// " \"name\": \"租赁服务*经营租赁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031193060372482\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"158\",\n" + +// " \"name\": \"租赁服务*光租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031193358168066\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275267\",\n" + +// " \"industryName\": \"租赁服务\",\n" + +// " \"ticketItem\": \"159\",\n" + +// " \"name\": \"租赁服务*干租业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031193597243394\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"160\",\n" + +// " \"name\": \"咨询服务*专业税务顾问\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031194020868097\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"161\",\n" + +// " \"name\": \"咨询服务*税收策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031194457075714\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"162\",\n" + +// " \"name\": \"咨询服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031194767454210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"163\",\n" + +// " \"name\": \"咨询服务*商务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031195065249794\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"164\",\n" + +// " \"name\": \"咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031195413377026\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"165\",\n" + +// " \"name\": \"咨询服务*其他涉税服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031195732144129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"166\",\n" + +// " \"name\": \"咨询服务*技术咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196000579586\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"167\",\n" + +// " \"name\": \"咨询服务*会计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196281597954\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"168\",\n" + +// " \"name\": \"咨询服务*管理咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196596170753\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"169\",\n" + +// " \"name\": \"咨询服务*翻译服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031196944297986\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"170\",\n" + +// " \"name\": \"咨询服务*法律咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031197246287873\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"171\",\n" + +// " \"name\": \"咨询服务*策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031197535694850\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"172\",\n" + +// " \"name\": \"咨询服务*医疗咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031197871239169\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"173\",\n" + +// " \"name\": \"咨询服务*医疗健康咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031198169034754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"174\",\n" + +// " \"name\": \"咨询服务*一般咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031198437470210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"175\",\n" + +// " \"name\": \"咨询服务*一般税务咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031198722682882\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"176\",\n" + +// " \"name\": \"运输服务*长途客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199007895553\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"177\",\n" + +// " \"name\": \"运输服务*运输货物打包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199255359489\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"178\",\n" + +// " \"name\": \"运输服务*拖车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199477657601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"179\",\n" + +// " \"name\": \"运输服务*铁路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031199788036098\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"180\",\n" + +// " \"name\": \"运输服务*水上运输辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031200073248769\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"181\",\n" + +// " \"name\": \"运输服务*水路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031200366850050\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"182\",\n" + +// " \"name\": \"运输服务*内河旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031200761114625\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"183\",\n" + +// " \"name\": \"运输服务*旅游客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201021161473\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"184\",\n" + +// " \"name\": \"运输服务*陆路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201281208321\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"185\",\n" + +// " \"name\": \"运输服务*陆路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201549643778\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"186\",\n" + +// " \"name\": \"运输服务*客运轮渡运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031201868410881\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"187\",\n" + +// " \"name\": \"运输服务*客运服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031202241703938\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"188\",\n" + +// " \"name\": \"运输服务*航空运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031202497556481\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"189\",\n" + +// " \"name\": \"运输服务*国内铁路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031202795352065\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"190\",\n" + +// " \"name\": \"运输服务*国内铁路货运运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203097341954\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"191\",\n" + +// " \"name\": \"运输服务*国内其他货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203390943234\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"192\",\n" + +// " \"name\": \"运输服务*国内道路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203646795777\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"193\",\n" + +// " \"name\": \"运输服务*国际铁路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031203881676801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"194\",\n" + +// " \"name\": \"运输服务*国际铁路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031204213026818\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:47\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"195\",\n" + +// " \"name\": \"运输服务*国际道路货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031204447907841\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"196\",\n" + +// " \"name\": \"运输服务*公共自行车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031204691177474\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"197\",\n" + +// " \"name\": \"运输服务*道路货物运输\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031205936885762\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"198\",\n" + +// " \"name\": \"运输服务*出租汽车客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031206293401602\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"199\",\n" + +// " \"name\": \"运输服务*出租车客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031207153233921\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"200\",\n" + +// " \"name\": \"邮政服务*其他邮政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031207606218754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080962\",\n" + +// " \"industryName\": \"邮政服务\",\n" + +// " \"ticketItem\": \"201\",\n" + +// " \"name\": \"邮政服务*基础电信服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031208180838402\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"202\",\n" + +// " \"name\": \"研发与技术服务*研发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031208470245378\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"203\",\n" + +// " \"name\": \"现代服务*研发和技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031208780623873\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:46:09\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"204\",\n" + +// " \"name\": \"*研发和技术服务*研发服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031209015504898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"205\",\n" + +// " \"name\": \"研发和技术服务*其他地质勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031209288134657\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"206\",\n" + +// " \"name\": \"研发和技术服务*矿产地质勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031209543987201\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"207\",\n" + +// " \"name\": \"研发和技术服务*基础地质勘察服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031210944884738\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"208\",\n" + +// " \"name\": \"研发和技术服务*合同能源管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031211360120833\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"209\",\n" + +// " \"name\": \"研发和技术服务*工程勘察勘探服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031211712442370\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"210\",\n" + +// " \"name\": \"信息技术服务*桌面管理与维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031211930546178\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"211\",\n" + +// " \"name\": \"信息技术服务*在线杀毒服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031212228341761\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"212\",\n" + +// " \"name\": \"信息技术服务*虚拟主机服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031212547108865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"213\",\n" + +// " \"name\": \"信息技术服务*信息系统应用服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031212794572802\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"214\",\n" + +// " \"name\": \"信息技术服务*信息系统数据库管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031213058813954\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"215\",\n" + +// " \"name\": \"信息技术服务*信息系统数据存储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031214266773505\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"216\",\n" + +// " \"name\": \"信息技术服务*信息系统数据处理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031214644260866\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"217\",\n" + +// " \"name\": \"信息技术服务*信息系统数据备份服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031214900113409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"218\",\n" + +// " \"name\": \"信息技术服务*信息系统容灾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215114022914\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"219\",\n" + +// " \"name\": \"信息技术服务*信息系统集成服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215470538754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"220\",\n" + +// " \"name\": \"信息技术服务*信息系统分析和整合服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215688642562\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"221\",\n" + +// " \"name\": \"信息技术服务*信息技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031215902552065\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"222\",\n" + +// " \"name\": \"信息技术服务*信息技术基础设施管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031216129044482\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:50\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:42:48\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"223\",\n" + +// " \"name\": \"*信息技术服务*信息技术服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031217316032513\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"224\",\n" + +// " \"name\": \"信息技术服务*信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031217680936961\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"225\",\n" + +// " \"name\": \"信息技术服务*信息安全服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218033258497\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"226\",\n" + +// " \"name\": \"信息技术服务*物流信息管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218322665473\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"227\",\n" + +// " \"name\": \"信息技术服务*网站维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218591100929\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"228\",\n" + +// " \"name\": \"信息技术服务*网站内容维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031218834370562\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"229\",\n" + +// " \"name\": \"信息技术服务*网站建设\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220084273153\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"230\",\n" + +// " \"name\": \"信息技术服务*网络运营服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220340125697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"231\",\n" + +// " \"name\": \"信息技术服务*网络管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220679864321\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"232\",\n" + +// " \"name\": \"信息技术服务*托管中心服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031220973465602\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"233\",\n" + +// " \"name\": \"信息技术服务*推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031222156259330\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"234\",\n" + +// " \"name\": \"信息技术服务*税务管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031222542135298\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"235\",\n" + +// " \"name\": \"信息技术服务*数据中心服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031222978342913\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"236\",\n" + +// " \"name\": \"信息技术服务*数据库维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031223284527105\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"237\",\n" + +// " \"name\": \"信息技术服务*数据加密\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031223582322690\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"238\",\n" + +// " \"name\": \"信息技术服务*数据恢复\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031223842369538\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"239\",\n" + +// " \"name\": \"信息技术服务*数据处理和存储支持服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031225096466433\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"240\",\n" + +// " \"name\": \"信息技术服务*数据备份\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031225427816450\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"241\",\n" + +// " \"name\": \"信息技术服务*系统设计\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031225692057601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"242\",\n" + +// " \"name\": \"信息技术服务*软件维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031226010824705\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"243\",\n" + +// " \"name\": \"信息技术服务*软件外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031227365584898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"244\",\n" + +// " \"name\": \"信息技术服务*软件开发费用\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031227726295041\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"245\",\n" + +// " \"name\": \"信息技术服务*软件测试费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031228032479233\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"246\",\n" + +// " \"name\": \"信息技术服务*人力资源管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031228472881154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"247\",\n" + +// " \"name\": \"信息技术服务*经营信息管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031228770676737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"248\",\n" + +// " \"name\": \"信息技术服务*技术转让\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031229022334978\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"249\",\n" + +// " \"name\": \"信息技术服务*技术开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031230083493889\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"250\",\n" + +// " \"name\": \"信息技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031230922354689\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"251\",\n" + +// " \"name\": \"信息技术服务*计算机软件开发\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031231182401537\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"252\",\n" + +// " \"name\": \"信息技术服务*基础信息技术管理平台整合服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031231526334466\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"253\",\n" + +// " \"name\": \"信息技术服务*呼叫中心管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031231832518657\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"254\",\n" + +// " \"name\": \"信息技术服务*供应链管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031233157918722\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"255\",\n" + +// " \"name\": \"信息技术服务*电子商务平台服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031233443131393\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"256\",\n" + +// " \"name\": \"信息技术服务*电商平台服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031233711566849\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"257\",\n" + +// " \"name\": \"信息技术服务*电路设计及测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031234214883329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"258\",\n" + +// " \"name\": \"信息技术服务*大数据分析\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031235586420737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"259\",\n" + +// " \"name\": \"信息技术服务*财务经济管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031236051988481\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:34:19\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"260\",\n" + +// " \"name\": \"*信息技术服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031236798574593\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"261\",\n" + +// " \"name\": \"信息服务*互联网信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031237134118913\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"262\",\n" + +// " \"name\": \"现代服务*营销服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031237427720193\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"263\",\n" + +// " \"name\": \"现代服务*业务推广费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031237691961345\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"264\",\n" + +// " \"name\": \"现代服务*信息技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031238958641154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"265\",\n" + +// " \"name\": \"现代服务*销售推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031239180939266\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"266\",\n" + +// " \"name\": \"现代服务费*推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031239403237378\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"267\",\n" + +// " \"name\": \"现代服务*直播服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031240565059586\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"268\",\n" + +// " \"name\": \"现代服务*营销推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031241051598850\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:55:10\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"269\",\n" + +// " \"name\": \"*现代服务*音像制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031241320034305\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"270\",\n" + +// " \"name\": \"现代服务*音视频服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031241651384321\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"271\",\n" + +// " \"name\": \"现代服务*业务外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243022921730\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"272\",\n" + +// " \"name\": \"现代服务*信息技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243320717314\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"273\",\n" + +// " \"name\": \"现代服务*信息技术外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243580764162\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"274\",\n" + +// " \"name\": \"现代服务*洗车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031243828228097\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"275\",\n" + +// " \"name\": \"现代服务*物流装卸、搬运、包装服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031245145239554\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"276\",\n" + +// " \"name\": \"现代服务*物流配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031245422063618\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"277\",\n" + +// " \"name\": \"现代服务*文化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031245690499074\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"278\",\n" + +// " \"name\": \"现代服务*文化创意策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031246965567489\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"279\",\n" + +// " \"name\": \"现代服务*网络推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031247334666241\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"280\",\n" + +// " \"name\": \"现代服务*市场营销策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031247661821953\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"281\",\n" + +// " \"name\": \"现代服务*市场营销\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031248014143490\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"282\",\n" + +// " \"name\": \"现代服务*市场销售服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031249389875202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"283\",\n" + +// " \"name\": \"现代服务*市场拓展\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031249796722690\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"284\",\n" + +// " \"name\": \"现代服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031250140655618\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"285\",\n" + +// " \"name\": \"现代服务*市场售后服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031250467811329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"286\",\n" + +// " \"name\": \"现代服务*市场管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031251742879745\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"287\",\n" + +// " \"name\": \"现代服务*市场策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031252124561410\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"288\",\n" + +// " \"name\": \"现代服务*设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031252455911425\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"289\",\n" + +// " \"name\": \"现代服务*商务信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031252783067138\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"290\",\n" + +// " \"name\": \"现代服务*商务信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031254041358337\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"291\",\n" + +// " \"name\": \"现代服务*软件服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031254301405186\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:55:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"292\",\n" + +// " \"name\": \"现代服务*人力资源管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031255568084994\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"293\",\n" + +// " \"name\": \"现代服务*人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031255995904002\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"294\",\n" + +// " \"name\": \"现代服务*渠道搭建及使用\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031256289505282\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"295\",\n" + +// " \"name\": \"现代服务*清障服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031256608272386\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"296\",\n" + +// " \"name\": \"现代服务*汽车装饰\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031257774288898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"297\",\n" + +// " \"name\": \"现代服务*汽车美容\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031258088861697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"298\",\n" + +// " \"name\": \"现代服务*汽车检测服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031258327937025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"299\",\n" + +// " \"name\": \"现代服务*企业管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031259649142786\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"300\",\n" + +// " \"name\": \"现代服务*培训服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031259904995329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"301\",\n" + +// " \"name\": \"现代服务*居民日常服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031261079400449\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"302\",\n" + +// " \"name\": \"现代服务*救援服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031261419139073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"303\",\n" + +// " \"name\": \"现代服务*经济服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031261733711873\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"304\",\n" + +// " \"name\": \"现代服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031263075889154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"305\",\n" + +// " \"name\": \"现代服务*家政服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031263382073345\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"306\",\n" + +// " \"name\": \"现代服务*家庭服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031263713423361\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"307\",\n" + +// " \"name\": \"现代服务*技术推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031264174796801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"308\",\n" + +// " \"name\": \"现代服务*技术交流\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031265588277250\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"309\",\n" + +// " \"name\": \"现代服务*机动车公共停车管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031266058039297\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"310\",\n" + +// " \"name\": \"现代服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031266393583617\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"311\",\n" + +// " \"name\": \"现代服务*会展服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031266737516546\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"312\",\n" + +// " \"name\": \"现代服务*广告制作费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031268100665345\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"313\",\n" + +// " \"name\": \"现代服务*广告服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031268515901441\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"314\",\n" + +// " \"name\": \"现代服务*供应链外包\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031269098909698\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"315\",\n" + +// " \"name\": \"现代服务*电梯等设备维保\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031269593837569\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"316\",\n" + +// " \"name\": \"现代服务*道路救援\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031271066038273\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"317\",\n" + +// " \"name\": \"现代服务*代理经纪服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031271409971201\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"318\",\n" + +// " \"name\": \"现代服务*代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031271753904129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"319\",\n" + +// " \"name\": \"现代服务*代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031272114614274\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"320\",\n" + +// " \"name\": \"现代服务*代办年检\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031273582620674\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"321\",\n" + +// " \"name\": \"现代服务*畜牧业技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031273926553601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"322\",\n" + +// " \"name\": \"现代服务*财务顾问服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031274375344129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"323\",\n" + +// " \"name\": \"现代服务*保洁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031275776241665\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"324\",\n" + +// " \"name\": \"现代服务*(市场、网络等)渠道搭建及使用服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031276111785985\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"325\",\n" + +// " \"name\": \"现代服务*市场营销服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031276380221442\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"326\",\n" + +// " \"name\": \"现代服务*市场推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031276698988545\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"327\",\n" + +// " \"name\": \"现代服务*市场调查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031278104080385\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"328\",\n" + +// " \"name\": \"现代服务*维持秩序服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031278431236097\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"329\",\n" + +// " \"name\": \"物流辅助服务*专业仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031278804529154\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"330\",\n" + +// " \"name\": \"物流辅助服务*运输组织服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031280335450113\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"331\",\n" + +// " \"name\": \"物流辅助服务*运输货场仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031280654217218\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"332\",\n" + +// " \"name\": \"物流辅助服务*铁路货运客运场站服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031281270779906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:21:09\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"333\",\n" + +// " \"name\": \"*物流辅助服务*收派服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031281555992577\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"334\",\n" + +// " \"name\": \"物流辅助服务*商业流通仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031282847838210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"335\",\n" + +// " \"name\": \"物流辅助服务*其他通用航空服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031283133050881\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"336\",\n" + +// " \"name\": \"物流辅助服务*其他航空地面服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031284408119297\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"337\",\n" + +// " \"name\": \"物流辅助服务*其他港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031284760440833\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"338\",\n" + +// " \"name\": \"物流辅助服务*其他辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031285121150978\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"339\",\n" + +// " \"name\": \"物流辅助服务*其他仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031286673043458\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"340\",\n" + +// " \"name\": \"物流辅助服务*票务服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031287096668161\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"341\",\n" + +// " \"name\": \"物流辅助服务*农产品仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031287490932737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"342\",\n" + +// " \"name\": \"物流辅助服务*空中交通管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031287885197313\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"343\",\n" + +// " \"name\": \"物流辅助服务*客运港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031289349009410\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"344\",\n" + +// " \"name\": \"物流辅助服务*客运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031289709719553\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"345\",\n" + +// " \"name\": \"物流辅助服务*机场服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031290145927170\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"346\",\n" + +// " \"name\": \"物流辅助服务*货运港口码头服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031291395829761\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"347\",\n" + +// " \"name\": \"物流辅助服务*货运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031291781705729\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"348\",\n" + +// " \"name\": \"物流辅助服务*货物装卸\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031292196941825\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"349\",\n" + +// " \"name\": \"物流辅助服务*货物中转服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031292922556418\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"350\",\n" + +// " \"name\": \"物流辅助服务*货物配载服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031294361202689\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"351\",\n" + +// " \"name\": \"物流辅助服务*货物打包整理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031294805798913\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"352\",\n" + +// " \"name\": \"物流辅助服务*货物保管\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031295292338177\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"353\",\n" + +// " \"name\": \"物流辅助服务*航拍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031296819064833\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"354\",\n" + +// " \"name\": \"物流辅助服务*航空摄影\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031297360130049\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"355\",\n" + +// " \"name\": \"物流辅助服务*航空培训\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031297741811713\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"356\",\n" + +// " \"name\": \"物流辅助服务*航空勘探\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031298144464898\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"357\",\n" + +// " \"name\": \"物流辅助服务*航空降雨\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031299608276994\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"358\",\n" + +// " \"name\": \"物流辅助服务*航空护林\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031299943821314\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"359\",\n" + +// " \"name\": \"物流辅助服务*航空测量\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031300245811202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"360\",\n" + +// " \"name\": \"物流辅助服务*航空播撒农药\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031301818675202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"361\",\n" + +// " \"name\": \"物流辅助服务*航道疏浚服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031302158413825\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"362\",\n" + +// " \"name\": \"物流辅助服务*航道管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031303437676545\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"363\",\n" + +// " \"name\": \"物流辅助服务*道路货运客运场站服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031303940993025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"364\",\n" + +// " \"name\": \"物流辅助服务*打捞救援服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031304272343042\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"365\",\n" + +// " \"name\": \"物流辅助服务*打捞服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031305656463362\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"366\",\n" + +// " \"name\": \"物流辅助服务*船舶移泊服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031306075893761\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"367\",\n" + +// " \"name\": \"物流辅助服务*船舶调度服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031306444992514\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"368\",\n" + +// " \"name\": \"物流辅助服务*车辆调度服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031307787169793\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"369\",\n" + +// " \"name\": \"物流辅助服务*车辆挂运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031308152074242\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:20:52\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"370\",\n" + +// " \"name\": \"*物流辅助服务*装卸搬运服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031308596670466\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"371\",\n" + +// " \"name\": \"文化创意服务*专业设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031310102425601\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"372\",\n" + +// " \"name\": \"文化创意服务*文化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031310639296513\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"373\",\n" + +// " \"name\": \"文化创意服务*体育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031311008395265\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"374\",\n" + +// " \"name\": \"文化创意服务*组织活动服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031311679483906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"375\",\n" + +// " \"name\": \"文化创意服务*直播表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031313202016258\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"376\",\n" + +// " \"name\": \"文化创意服务*文艺创作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031313793413122\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"377\",\n" + +// " \"name\": \"文化创意服务*文艺表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031314225426433\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"378\",\n" + +// " \"name\": \"文化创意服务*文艺表演\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031315630518274\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:48:45\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"379\",\n" + +// " \"name\": \"*文化创意服务*文化创意服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031316062531585\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"380\",\n" + +// " \"name\": \"文化创意服务*文化比赛服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031317333405697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"381\",\n" + +// " \"name\": \"文化创意服务*其他文化艺术经纪代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031317719281666\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"382\",\n" + +// " \"name\": \"文化创意服务*互联网文化活动\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031318113546241\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"383\",\n" + +// " \"name\": \"文化创意服务*档案管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031318868520961\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"384\",\n" + +// " \"name\": \"文化创意服务*会议展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031319782879233\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"385\",\n" + +// " \"name\": \"文化创意服务*广告服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031321246691330\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"386\",\n" + +// " \"name\": \"文化创意服务*体育指导服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031321653538818\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"387\",\n" + +// " \"name\": \"文化创意服务*体育训练服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031322983133185\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"388\",\n" + +// " \"name\": \"文化创意服务*体育经纪人服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031323406757889\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"389\",\n" + +// " \"name\": \"文化创意服务*体育活动服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031323809411073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"390\",\n" + +// " \"name\": \"文化创意服务*体育管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031325130616834\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"391\",\n" + +// " \"name\": \"文化创意服务*体育表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031325571018754\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"392\",\n" + +// " \"name\": \"文化创意服务*体育比赛服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031326846087169\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"393\",\n" + +// " \"name\": \"生活服务*文化娱乐经纪人服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031327210991617\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"394\",\n" + +// " \"name\": \"生活服务*专业保洁、清洗、消毒服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031328632860673\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"395\",\n" + +// " \"name\": \"生活服务*住宿服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031329094234114\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"396\",\n" + +// " \"name\": \"生活服务*钟点服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031330478354434\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"397\",\n" + +// " \"name\": \"生活服务*植物养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031330901979138\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"398\",\n" + +// " \"name\": \"生活服务*植物养护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031331203969025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"399\",\n" + +// " \"name\": \"生活服务*直播服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031332432900098\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"400\",\n" + +// " \"name\": \"生活服务*直播表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031332734889985\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"401\",\n" + +// " \"name\": \"生活服务*照料和护理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031334106427393\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"402\",\n" + +// " \"name\": \"生活服务*医疗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031334421000194\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"403\",\n" + +// " \"name\": \"生活服务*养生保健服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031335834480641\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"404\",\n" + +// " \"name\": \"生活服务*洗染服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031336207773698\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"405\",\n" + +// " \"name\": \"生活服务*洗车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031337679974402\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"406\",\n" + +// " \"name\": \"生活服务*文艺表演\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031338057461762\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"407\",\n" + +// " \"name\": \"生活服务*文化体育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031339345113089\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:19:39\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"408\",\n" + +// " \"name\": \"*生活服务*文化服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031339689046018\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"409\",\n" + +// " \"name\": \"生活服务*外卖递送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031341039611905\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"410\",\n" + +// " \"name\": \"生活服务*体育健康指导\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031341379350530\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"411\",\n" + +// " \"name\": \"生活服务*体育表演\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031342729916418\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"412\",\n" + +// " \"name\": \"生活服务*摄影扩印服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031343094820865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"413\",\n" + +// " \"name\": \"生活服务*社会看护与帮助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031344407638018\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"414\",\n" + +// " \"name\": \"生活服务*庆典策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031344738988034\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"415\",\n" + +// " \"name\": \"生活服务*汽车美容\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031345988890625\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:18:23\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"416\",\n" + +// " \"name\": \"*生活服务*其他居民日常服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031346290880513\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"417\",\n" + +// " \"name\": \"生活服务*旅游娱乐服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031347637252098\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:18:45\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"418\",\n" + +// " \"name\": \"*生活服务*旅游服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031348069265409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"419\",\n" + +// " \"name\": \"生活服务*临床检验服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031349369499650\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"420\",\n" + +// " \"name\": \"生活服务*老年人、残疾人养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031350619402242\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"421\",\n" + +// " \"name\": \"生活服务*居民服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031350933975041\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:22\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:19:19\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"422\",\n" + +// " \"name\": \"*生活服务*教育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031352422952962\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"423\",\n" + +// " \"name\": \"生活服务*健康体检服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031352792051713\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:17:28\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"424\",\n" + +// " \"name\": \"*生活服务*家政服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031354171977730\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"425\",\n" + +// " \"name\": \"生活服务*家庭服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031354524299266\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"426\",\n" + +// " \"name\": \"生活服务*家居产品维保\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031355820339202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"427\",\n" + +// " \"name\": \"生活服务*活动策划\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031356139106305\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"428\",\n" + +// " \"name\": \"生活服务*婚姻介绍服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031357468700673\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"429\",\n" + +// " \"name\": \"生活服务*餐饮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031357829410817\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:17:57\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"430\",\n" + +// " \"name\": \"*生活服务*保洁服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031359150616578\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"431\",\n" + +// " \"name\": \"生活服务*外卖配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031361134522369\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"432\",\n" + +// " \"name\": \"商务辅助服务*职业中介服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031361499426817\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"433\",\n" + +// " \"name\": \"商务辅助服务*人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031361902080001\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"434\",\n" + +// " \"name\": \"商务辅助服务*企业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031363185537025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"435\",\n" + +// " \"name\": \"商务辅助服务*劳务派遣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031363500109825\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"436\",\n" + +// " \"name\": \"商务辅助服务*经纪代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031364783566849\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"437\",\n" + +// " \"name\": \"商务辅助服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031365999915010\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"438\",\n" + +// " \"name\": \"商务辅助服务*代理记账\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031366373208065\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"439\",\n" + +// " \"name\": \"商务辅助服务*代理报关服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031369263083522\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"440\",\n" + +// " \"name\": \"劳务*劳务仪器仪表修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031369632182273\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"441\",\n" + +// " \"name\": \"劳务*维修服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031369942560770\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"442\",\n" + +// " \"name\": \"劳务*通用设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031371100188673\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"443\",\n" + +// " \"name\": \"劳务*大型车辆装备修理与维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031371574145025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"444\",\n" + +// " \"name\": \"劳务*修理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031373151203329\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"445\",\n" + +// " \"name\": \"劳务*设备维修费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031374032007170\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"446\",\n" + +// " \"name\": \"劳务*电器维修费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031375369990145\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"447\",\n" + +// " \"name\": \"劳务*金属制品修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031375764254722\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"448\",\n" + +// " \"name\": \"劳务*家用电器修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031377068683266\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"449\",\n" + +// " \"name\": \"劳务*通讯设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031377429393409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"450\",\n" + +// " \"name\": \"劳务*其他办公设备维修\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031378746404865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"451\",\n" + +// " \"name\": \"劳务*计算机和辅助设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031380050833409\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498052\",\n" + +// " \"industryName\": \"劳务\",\n" + +// " \"ticketItem\": \"452\",\n" + +// " \"name\": \"劳务*电气设备修理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031380671590401\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029602857127937\",\n" + +// " \"industryName\": \"经营租赁\",\n" + +// " \"ticketItem\": \"453\",\n" + +// " \"name\": \"经营租赁*汽车租赁\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031382143791105\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029602857127937\",\n" + +// " \"industryName\": \"经营租赁\",\n" + +// " \"ticketItem\": \"454\",\n" + +// " \"name\": \"经营租赁*建筑机械租赁\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031382529667073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029602857127937\",\n" + +// " \"industryName\": \"经营租赁\",\n" + +// " \"ticketItem\": \"455\",\n" + +// " \"name\": \"经营租赁*工程机械租赁\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031383964119042\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029608750125057\",\n" + +// " \"industryName\": \"金融服务\",\n" + +// " \"ticketItem\": \"456\",\n" + +// " \"name\": \"金融服务*直接收费金融服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031384266108929\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029608750125057\",\n" + +// " \"industryName\": \"金融服务\",\n" + +// " \"ticketItem\": \"457\",\n" + +// " \"name\": \"金融服务*账户管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031385499234306\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029608750125057\",\n" + +// " \"industryName\": \"金融服务\",\n" + +// " \"ticketItem\": \"458\",\n" + +// " \"name\": \"金融服务*货币兑换服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031386753331202\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"459\",\n" + +// " \"name\": \"教育医疗服务*教育服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031387135012865\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"460\",\n" + +// " \"name\": \"教育医疗服务*招生服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031389274107906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"461\",\n" + +// " \"name\": \"教育医疗服务*考试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031389668372481\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"462\",\n" + +// " \"name\": \"教育医疗服务*教育信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031390096191490\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"463\",\n" + +// " \"name\": \"教育医疗服务*教育医疗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031391429980161\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029609509294082\",\n" + +// " \"industryName\": \"教育医疗服务\",\n" + +// " \"ticketItem\": \"464\",\n" + +// " \"name\": \"教育医疗服务*教育测评服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031392285618178\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"465\",\n" + +// " \"name\": \"交通运输服务*液体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031393518743554\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"466\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运水路运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031393829122050\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"467\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运陆路运输业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031395167105025\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"468\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运联运运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031395594924033\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"469\",\n" + +// " \"name\": \"交通运输服务*无运输工具承运航空运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031397138427906\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"470\",\n" + +// " \"name\": \"交通运输服务*气体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031397465583618\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"471\",\n" + +// " \"name\": \"交通运输服务*其他无运输工具承运业务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031398723874817\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"472\",\n" + +// " \"name\": \"交通运输服务*其他旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031400049274882\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"473\",\n" + +// " \"name\": \"交通运输服务*其他货物运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031400468705281\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"474\",\n" + +// " \"name\": \"交通运输服务*其他管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031401961877506\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"475\",\n" + +// " \"name\": \"交通运输服务*旅客联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031402356142081\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"476\",\n" + +// " \"name\": \"交通运输服务*陆路旅客运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031403786399745\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"477\",\n" + +// " \"name\": \"交通运输服务*货物联运服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031405057273858\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"478\",\n" + +// " \"name\": \"交通运输服务*航天运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031405405401089\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498053\",\n" + +// " \"industryName\": \"交通运输服务\",\n" + +// " \"ticketItem\": \"479\",\n" + +// " \"name\": \"交通运输服务*固体管道运输服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031406793715713\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"480\",\n" + +// " \"name\": \"鉴证咨询服务*质检技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031408081367042\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"481\",\n" + +// " \"name\": \"鉴证咨询服务*物流信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031408597266434\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"482\",\n" + +// " \"name\": \"鉴证咨询服务*商务咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031409935249410\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"483\",\n" + +// " \"name\": \"鉴证咨询服务*认证认可服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031410379845633\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"484\",\n" + +// " \"name\": \"鉴证咨询服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031411839463426\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"485\",\n" + +// " \"name\": \"鉴证咨询服务*鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031412263088129\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"486\",\n" + +// " \"name\": \"鉴证咨询服务*技术咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031413462659074\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"487\",\n" + +// " \"name\": \"鉴证咨询服务*工程管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031415006162945\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:37:39\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"488\",\n" + +// " \"name\": \"*鉴证咨询服务*财务咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031415492702209\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:55:25\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"489\",\n" + +// " \"name\": \"*鉴证咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031416981680130\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"490\",\n" + +// " \"name\": \"鉴证服务*审计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031417371750402\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"491\",\n" + +// " \"name\": \"鉴证服务*涉税鉴证\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031418869116930\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"492\",\n" + +// " \"name\": \"鉴证服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031419229827073\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"493\",\n" + +// " \"name\": \"鉴证服务*纳税情况审查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031421461196801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"494\",\n" + +// " \"name\": \"鉴证服务*工程监理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031421821906946\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"495\",\n" + +// " \"name\": \"建筑服务*装修费施工\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031422170034177\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"496\",\n" + +// " \"name\": \"建筑服务*钻井服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031423558348801\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"497\",\n" + +// " \"name\": \"建筑服务*园林绿化\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031424913108994\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"498\",\n" + +// " \"name\": \"建筑服务*设备安装\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031425336733697\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"499\",\n" + +// " \"name\": \"建筑服务*绿化工程款\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031426691493889\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"500\",\n" + +// " \"name\": \"建筑服务*看管服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031427995922434\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"501\",\n" + +// " \"name\": \"建筑服务*建筑装饰服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031428423741442\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"502\",\n" + +// " \"name\": \"建筑服务*建筑修缮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031430172766210\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"503\",\n" + +// " \"name\": \"建筑服务*道路养护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031430621556737\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498051\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"504\",\n" + +// " \"name\": \"建筑服务*爆破服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031431540109314\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"505\",\n" + +// " \"name\": \"广播影视服务*制作费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031433234608130\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"506\",\n" + +// " \"name\": \"广播影视服务*广播影视节目(作品)制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031433612095489\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"507\",\n" + +// " \"name\": \"广播影视服务*广播影视节目(作品)发行服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031434950078466\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"508\",\n" + +// " \"name\": \"广播影视服务*广播影视节目(作品)播映服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031435923156993\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"509\",\n" + +// " \"name\": \"广播影视服务*广播电视集成播控\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031437437300738\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"510\",\n" + +// " \"name\": \"广播影视服务*电影摄制服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031438913695746\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"511\",\n" + +// " \"name\": \"广播影视服务*电影放映\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031440008409090\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787514806274\",\n" + +// " \"industryName\": \"电信服务\",\n" + +// " \"ticketItem\": \"512\",\n" + +// " \"name\": \"电信服务*互联网信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031440968904706\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622457110529\",\n" + +// " \"industryName\": \"餐饮住宿服务\",\n" + +// " \"ticketItem\": \"513\",\n" + +// " \"name\": \"餐饮住宿服务*住宿服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031443250606082\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622457110529\",\n" + +// " \"industryName\": \"餐饮住宿服务\",\n" + +// " \"ticketItem\": \"514\",\n" + +// " \"name\": \"餐饮住宿服务*餐饮服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031443674230786\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622729740289\",\n" + +// " \"industryName\": \"保险服务\",\n" + +// " \"ticketItem\": \"515\",\n" + +// " \"name\": \"保险服务*人身保险服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1342031444072689665\",\n" + +// " \"createBy\": \"admin\",\n" + +// " \"createTime\": \"2020-12-24 16:56:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029622729740289\",\n" + +// " \"industryName\": \"保险服务\",\n" + +// " \"ticketItem\": \"516\",\n" + +// " \"name\": \"保险服务*财产保险服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1377464798135984130\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-04-01 11:36:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-04-01 11:38:44\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"517\",\n" + +// " \"name\": \"教育辅助服务*教育辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1377464930202083329\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-04-01 11:36:46\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-04-01 11:38:27\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"518\",\n" + +// " \"name\": \"教育辅助服务*教育测评服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1377465065174736898\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-04-01 11:37:18\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-04-01 11:37:59\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"519\",\n" + +// " \"name\": \"教育辅助服务*招生服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1399569637040988161\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-01 11:32:59\",\n" + +// " \"updateBy\": \"yangmenglin\",\n" + +// " \"updateTime\": \"2021-06-01 16:02:53\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"520\",\n" + +// " \"name\": \"生活服务*配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402179019306201090\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-08 16:21:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"521\",\n" + +// " \"name\": \"现代服务*推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560665964531713\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:38:16\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-06-09 17:38:39\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"522\",\n" + +// " \"name\": \"现代服务*技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560872777252865\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:39:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"523\",\n" + +// " \"name\": \"现代服务*技术开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560922995654658\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:39:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"524\",\n" + +// " \"name\": \"现代服务*系统集成服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402560972949815298\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:39:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"525\",\n" + +// " \"name\": \"现代服务*运行维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561128101314562\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"526\",\n" + +// " \"name\": \"现代服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561186788036610\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"527\",\n" + +// " \"name\": \"现代服务*信息存储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561243759267841\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"528\",\n" + +// " \"name\": \"现代服务*技术研发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561303167369218\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:40:48\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:25\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"529\",\n" + +// " \"name\": \"*现代服务*技术推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561532411269121\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:41:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"530\",\n" + +// " \"name\": \"现代服务*物业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561588006768642\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:41:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"531\",\n" + +// " \"name\": \"现代服务*企业管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402561650120196097\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:42:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"532\",\n" + +// " \"name\": \"现代服务*房地产中介服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562125209030658\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"533\",\n" + +// " \"name\": \"*现代服务*房地产咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562176551505922\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"534\",\n" + +// " \"name\": \"现代服务*品牌策划咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562223225700354\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"535\",\n" + +// " \"name\": \"现代服务*法律咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562274568175618\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"536\",\n" + +// " \"name\": \"现代服务*教育咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562327856807937\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:44:52\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:00:26\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"537\",\n" + +// " \"name\": \"*现代服务*市场推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562390674898946\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"538\",\n" + +// " \"name\": \"现代服务*策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562447679684610\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"539\",\n" + +// " \"name\": \"现代服务*市场调查\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562505603022849\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"540\",\n" + +// " \"name\": \"现代服务*会展服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562553472614402\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:45:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"541\",\n" + +// " \"name\": \"现代服务*影视策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562749610872834\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:46:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"542\",\n" + +// " \"name\": \"广播影视服务*服化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562805948743681\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:46:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"543\",\n" + +// " \"name\": \"广播影视服务*配音服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402562881920172034\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:47:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"544\",\n" + +// " \"name\": \"广播影视服务*制作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402563229644750849\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:48:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"545\",\n" + +// " \"name\": \"现代服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402563291326185473\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:48:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"546\",\n" + +// " \"name\": \"现代服务*文化活动策划服务 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564079993769986\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:51:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"547\",\n" + +// " \"name\": \"现代服务*礼仪服务*\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564213448134658\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:52:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"548\",\n" + +// " \"name\": \"现代服务*文艺创服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564279747497985\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:52:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"549\",\n" + +// " \"name\": \"现代服务*健身服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564358822711297\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:52:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"550\",\n" + +// " \"name\": \"现代服务*代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564409640878081\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:53:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"551\",\n" + +// " \"name\": \"现代服务*洗染服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564467669073921\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:53:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"552\",\n" + +// " \"name\": \"现代服务*文化创意服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564534421442561\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:53:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"554\",\n" + +// " \"name\": \"现代服务*仪器安装调试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564914563796994\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:55:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"553\",\n" + +// " \"name\": \"现代服务*保洁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402564969622405122\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:55:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"555\",\n" + +// " \"name\": \"现代服务*养生保健服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402565032532770817\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:55:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"556\",\n" + +// " \"name\": \"现代服务*知识产权代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402565501053325313\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:57:29\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:57:48\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"557\",\n" + +// " \"name\": \"*现代服务*图文制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402565848043880449\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:58:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"558\",\n" + +// " \"name\": \"现代服务*婚庆服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402566021314793473\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 17:59:33\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:41\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"559\",\n" + +// " \"name\": \"*现代服务*营销策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569227495276546\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:12:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"560\",\n" + +// " \"name\": \"广告服务*广告设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569501605646338\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:13:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"561\",\n" + +// " \"name\": \"设计服务*设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569561563222018\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:13:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"562\",\n" + +// " \"name\": \"设计服务*知识产权服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402569620434452482\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-09 18:13:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"563\",\n" + +// " \"name\": \"设计服务*广告制作服务 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402804944934817793\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:48:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"564\",\n" + +// " \"name\": \"人力资源服务*人力资源服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402805001197191170\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:49:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"565\",\n" + +// " \"name\": \"人力资源服务*外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402805068054417410\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:49:26\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"566\",\n" + +// " \"name\": \"人力资源服务*人力资源培训服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1402805121875726337\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-06-10 09:49:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"567\",\n" + +// " \"name\": \"人力资源服务*高级人才寻访\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1403171867937734657\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-11 10:06:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"568\",\n" + +// " \"name\": \"其他咨询服务*管理咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1408307892926300162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-25 14:15:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"569\",\n" + +// " \"name\": \"信息技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1408329928713191426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-06-25 15:43:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"570\",\n" + +// " \"name\": \"生活服务*美容服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413035919233024001\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:23:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"571\",\n" + +// " \"name\": \"信息技术服务*审计管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036034710601729\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:23:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"572\",\n" + +// " \"name\": \"物流辅助服务*仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036130525282305\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:01\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:23:04\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"573\",\n" + +// " \"name\": \"*企业管理服务*企业管理服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036192148000769\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"574\",\n" + +// " \"name\": \"企业管理服务*市场管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036239950479361\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"575\",\n" + +// " \"name\": \"企业管理服务*日常综合管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036316320366594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"576\",\n" + +// " \"name\": \"文化服务*图书和资料借阅服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036363334324226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:24:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"577\",\n" + +// " \"name\": \"文化服务*文物及非物质遗产保护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036425883979778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:25:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"578\",\n" + +// " \"name\": \"文化服务*提供浏览场所服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1413036483597598721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-08 15:25:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"579\",\n" + +// " \"name\": \"教育辅助服务*考试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1415212313908207618\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-14 15:31:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"580\",\n" + +// " \"name\": \"*文化服务*档案管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1416934308379197441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-19 09:33:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"581\",\n" + +// " \"name\": \"经纪代理服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1420254425011814401\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-28 13:26:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"582\",\n" + +// " \"name\": \"会展服务*展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1420254496730218498\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-28 13:27:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"583\",\n" + +// " \"name\": \"会展服务*会议服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1420595466424348673\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-07-29 12:02:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"584\",\n" + +// " \"name\": \"现代服务*汽车服务 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424557298679902210\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-09 10:25:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"585\",\n" + +// " \"name\": \"现代服务*策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999460303298562\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"586\",\n" + +// " \"name\": \"现代服务*其他业务外包服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999521728880642\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"587\",\n" + +// " \"name\": \"现代服务*驾驶服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999560803016705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:25\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"588\",\n" + +// " \"name\": \"现代服务*咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1424999628788490241\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-10 15:42:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"589\",\n" + +// " \"name\": \"物流辅助服务*装卸服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1427932739499274241\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-18 17:57:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"590\",\n" + +// " \"name\": \"人力资源服务*服务费 \",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1428172679214592002\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-19 09:51:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"591\",\n" + +// " \"name\": \"*现代服务*信息服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1430014895759388673\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-24 11:51:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"592\",\n" + +// " \"name\": \"研发和技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1430444668214128641\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-25 16:19:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"593\",\n" + +// " \"name\": \"人力资源服务*业务外包\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1430809481003954177\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-08-26 16:28:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"594\",\n" + +// " \"name\": \"设计服务*设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1433700621348876290\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-03 15:57:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"595\",\n" + +// " \"name\": \"现代服务*培训服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1434797687399624705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-06 16:36:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"596\",\n" + +// " \"name\": \"广告服务*印刷费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435145866938716162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:40:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"597\",\n" + +// " \"name\": \"现代服务*信息咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435145959368667137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:40:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"598\",\n" + +// " \"name\": \"广告服务*其他广告服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146050900889602\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:40:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"599\",\n" + +// " \"name\": \"设计服务*专业设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146137135779842\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:41:17\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:21:55\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"600\",\n" + +// " \"name\": \"*物流辅助服务*分拣服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146201610620930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:41:33\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:21:28\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"601\",\n" + +// " \"name\": \"*物流辅助服务*收件服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146267247284226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:41:48\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:22:12\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"602\",\n" + +// " \"name\": \"*物流辅助服务*派送服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146323765604354\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:42:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"603\",\n" + +// " \"name\": \"物流辅助服务*配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146430649053186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:42:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"604\",\n" + +// " \"name\": \"企业管理服务*工程项目管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146579391582209\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:43:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"605\",\n" + +// " \"name\": \"企业管理服务*其他辅助管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146696735625217\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:43:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"606\",\n" + +// " \"name\": \"经纪代理服务*其他经纪服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146768776990721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:43:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"607\",\n" + +// " \"name\": \"生活服务*安装服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435146832194940930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-07 15:44:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"608\",\n" + +// " \"name\": \"生活服务*维修服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435427814445789186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:20:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"609\",\n" + +// " \"name\": \"信息技术服务*维护费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435427899883761666\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:20:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"610\",\n" + +// " \"name\": \"信息技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428005701857282\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:21:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"611\",\n" + +// " \"name\": \"广告代理服务*广告策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428080565989378\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:21:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"612\",\n" + +// " \"name\": \"广告代理服务*广告咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428135163170817\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:21:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"613\",\n" + +// " \"name\": \"现代服务*宣传费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428200200048642\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"614\",\n" + +// " \"name\": \"广播影视服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428259251654657\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663876\",\n" + +// " \"industryName\": \"广播影视服务\",\n" + +// " \"ticketItem\": \"615\",\n" + +// " \"name\": \"广播影视服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428312460668930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"616\",\n" + +// " \"name\": \"企业管理服务*保洁费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428367284416514\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"617\",\n" + +// " \"name\": \"人力资源服务*劳务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428409399349250\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:22:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"618\",\n" + +// " \"name\": \"人力资源服务*咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428453032767490\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"619\",\n" + +// " \"name\": \"人力资源服务*职业介绍费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428501078446081\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"620\",\n" + +// " \"name\": \"人力资源服务*人员素质测评费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428547131977729\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"621\",\n" + +// " \"name\": \"经纪代理服务*代理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428605692776449\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"622\",\n" + +// " \"name\": \"文化服务*创作费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428649699414018\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:23:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"623\",\n" + +// " \"name\": \"文化服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1435428721652699137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-08 10:24:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"624\",\n" + +// " \"name\": \"旅游服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1439161210128871425\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-18 17:35:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"625\",\n" + +// " \"name\": \"其他咨询服务*技术咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592763472080898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:24:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:04:36\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"626\",\n" + +// " \"name\": \"*现代服务*现代服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592851946725377\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:24:35\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:59:05\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"627\",\n" + +// " \"name\": \"*现代服务*知识产权服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592915645620226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:24:51\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:59:55\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"628\",\n" + +// " \"name\": \"*现代服务*宣传推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440592981500391426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:06\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:02:01\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"629\",\n" + +// " \"name\": \"*现代服务*产品推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593062760833025\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:26\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:02:20\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"630\",\n" + +// " \"name\": \"*现代服务*品牌推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593122739384322\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:40\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:02:47\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"631\",\n" + +// " \"name\": \"*现代服务*互联网推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593173352046594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:25:52\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:04\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"632\",\n" + +// " \"name\": \"*现代服务*信息推广服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593240087621634\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:08\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:03:56\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"633\",\n" + +// " \"name\": \"*现代服务*企业形象策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593303941705730\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:23\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:04:15\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"634\",\n" + +// " \"name\": \"*现代服务*社交营销服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593365845438466\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:38\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:55:28\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"635\",\n" + +// " \"name\": \"*现代服务*动画制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593432677474305\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:26:54\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:55:55\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"636\",\n" + +// " \"name\": \"*现代服务*视频制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593499408855041\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:27:10\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:58:43\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"637\",\n" + +// " \"name\": \"*现代服务*多媒体制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593649304891393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:27:46\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:56:31\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"638\",\n" + +// " \"name\": \"*现代服务*音频制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593712584351745\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:28:01\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:56:53\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"639\",\n" + +// " \"name\": \"*现代服务*网页制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593774672633858\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:28:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:57:08\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"640\",\n" + +// " \"name\": \"*现代服务*形象创意服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440593922240835586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:28:51\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:57:29\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"641\",\n" + +// " \"name\": \"*现代服务*音像剪辑服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594046920712194\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:29:20\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:58:06\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"642\",\n" + +// " \"name\": \"*现代服务*图形制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594114620977153\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:29:37\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:58:23\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"643\",\n" + +// " \"name\": \"*现代服务*平面图形制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594188080013314\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:29:54\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:56:15\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"644\",\n" + +// " \"name\": \"*现代服务*多媒体制作服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594263648792577\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:30:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:53:02\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"645\",\n" + +// " \"name\": \"*现代服务*产品开发服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594347593588737\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:30:32\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:53:21\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"646\",\n" + +// " \"name\": \"*现代服务*产品功能开发服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594459149492226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:30:59\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:53:50\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"647\",\n" + +// " \"name\": \"*现代服务*产品创意服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594523892772865\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:54:16\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"648\",\n" + +// " \"name\": \"*现代服务*产品创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594583938424833\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:28\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:54:43\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"649\",\n" + +// " \"name\": \"*现代服务*产品外观创意服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594638703456258\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:51:25\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"650\",\n" + +// " \"name\": \"*现代服务*会务服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594703337680898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:31:57\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:51:44\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"651\",\n" + +// " \"name\": \"*现代服务*会议服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594796090519554\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:32:19\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:52:06\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"652\",\n" + +// " \"name\": \"*现代服务*产品陈列服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594862914166786\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:32:35\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:52:25\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"653\",\n" + +// " \"name\": \"*现代服务*产品展示服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440594990752362497\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:33:05\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:49:07\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"654\",\n" + +// " \"name\": \"*文化创意服务*文化创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595105483350017\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:33:33\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:49:23\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"655\",\n" + +// " \"name\": \"*文化创意服务*产品创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595189138743298\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:33:53\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:49:41\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"656\",\n" + +// " \"name\": \"*文化创意服务*平面创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595266297163778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:34:11\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:50:01\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"657\",\n" + +// " \"name\": \"*文化创意服务*多媒体创意策划服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595333410222081\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:34:27\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:50:19\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"658\",\n" + +// " \"name\": \"*文化创意服务*市场营销策划\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595394949046273\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:34:42\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:50:41\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"659\",\n" + +// " \"name\": \"*文化创意服务*知识产权服务\",\n" + +// " \"ticketItemCode\": \"3040300000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595543863615490\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:35:17\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:45:38\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"660\",\n" + +// " \"name\": \"*研发和技术服务*研发和技术服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595642505261058\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:35:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:46:36\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"661\",\n" + +// " \"name\": \"*研发和技术服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595725497954306\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:36:01\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:46:58\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"663\",\n" + +// " \"name\": \"*研发和技术服务*仪器设备安装服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595779029852162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:36:13\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:47:23\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"662\",\n" + +// " \"name\": \"*研发和技术服务*仪器设备维修服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440595895002361857\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:36:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:47:41\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"664\",\n" + +// " \"name\": \"*研发和技术服务*知识产权信息服务\",\n" + +// " \"ticketItemCode\": \"3040100000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596023805239297\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:37:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 13:35:37\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"665\",\n" + +// " \"name\": \"*信息技术服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596105279598594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:37:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:46:05\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"666\",\n" + +// " \"name\": \"*信息技术服务*软件服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596217619836930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:37:58\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:45:24\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"667\",\n" + +// " \"name\": \"*信息技术服务*集成电路开发服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596279611645954\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:38:13\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:39:25\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"668\",\n" + +// " \"name\": \"*信息技术服务*其它集成电路服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596361975197697\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:38:32\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:39:07\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"669\",\n" + +// " \"name\": \"*信息技术服务*技术推广服务\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596517747453954\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:09\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:38:37\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"670\",\n" + +// " \"name\": \"*鉴证咨询服务*咨询服务\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596585590321153\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:26\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:38:16\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"671\",\n" + +// " \"name\": \"*鉴证咨询服务*法律咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596640493756417\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:39\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:37:45\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"672\",\n" + +// " \"name\": \"*鉴证咨询服务*管理咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596701541855234\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:39:53\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:37:24\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"673\",\n" + +// " \"name\": \"*鉴证咨询服务*工程咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596796387651586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:40:16\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:37:03\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"674\",\n" + +// " \"name\": \"*鉴证咨询服务*项目咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596853832839170\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:40:30\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:36:40\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"675\",\n" + +// " \"name\": \"*鉴证咨询服务*心理咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440596940076113922\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:40:50\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:02:18\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"676\",\n" + +// " \"name\": \"*鉴证咨询服务*健康咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597023383379969\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:41:10\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:01:53\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"677\",\n" + +// " \"name\": \"*鉴证咨询服务*旅游咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597082720202754\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:41:24\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:01:04\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"678\",\n" + +// " \"name\": \"*鉴证咨询服务*技术咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597152878325761\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:41:41\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 11:00:44\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"679\",\n" + +// " \"name\": \"*鉴证咨询服务*知识产权咨询\",\n" + +// " \"ticketItemCode\": \"3040600000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597309845954561\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:42:18\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:59:09\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"680\",\n" + +// " \"name\": \"*商务辅助服务*商务辅助服务\",\n" + +// " \"ticketItemCode\": \"3040800000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597421322170369\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:42:45\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:58:21\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"681\",\n" + +// " \"name\": \"*商务辅助服务*居间服务\",\n" + +// " \"ticketItemCode\": \"3040800000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597545733611521\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:43:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:57:37\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"683\",\n" + +// " \"name\": \"*企业管理服务*企业管理咨询服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597615996596226\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:43:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:57:17\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"682\",\n" + +// " \"name\": \"*企业管理服务*企业管理顾问服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597708174815233\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:43:53\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:56:46\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"684\",\n" + +// " \"name\": \"*企业管理服务*企业财务管理服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597796750123009\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:44:14\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:53:08\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"685\",\n" + +// " \"name\": \"*企业管理服务*企业形象策划服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440597891256184834\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:44:37\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:52:03\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"686\",\n" + +// " \"name\": \"*企业管理服务*企业管理战略服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598000421330945\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:45:03\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:51:42\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"687\",\n" + +// " \"name\": \"*企业管理服务*企业管理合规服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598072336871425\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:45:20\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:51:03\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"688\",\n" + +// " \"name\": \"*企业管理服务*企业管理内训服务\",\n" + +// " \"ticketItemCode\": \"3040801000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598392567783426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:46:36\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:50:39\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"689\",\n" + +// " \"name\": \"*安全保护服务*安全保护服务\",\n" + +// " \"ticketItemCode\": \"3040804000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598528769417218\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:47:09\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:49:34\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"690\",\n" + +// " \"name\": \"*物流辅助服务*物流辅助服务\",\n" + +// " \"ticketItemCode\": \"3040400000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440598626362482689\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:47:32\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:46:16\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"691\",\n" + +// " \"name\": \"*运输服务*交通运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599069431984130\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:49:18\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:46:24\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"692\",\n" + +// " \"name\": \"*运输服务*陆路运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599141020360705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:49:35\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 10:46:47\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"运输服务\",\n" + +// " \"ticketItem\": \"693\",\n" + +// " \"name\": \"*运输服务*旅客运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599220917657601\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:49:54\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 14:35:14\",\n" + +// " \"industryId\": \"1342029528106242049\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"694\",\n" + +// " \"name\": \"*运输服务*货物运输服务\",\n" + +// " \"ticketItemCode\": \"3010000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599298260623362\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:12\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:26:04\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"695\",\n" + +// " \"name\": \"*生活服务*生活服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599377369391106\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:54\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"696\",\n" + +// " \"name\": \"*生活服务*体育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599447074529282\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:48\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:43\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"697\",\n" + +// " \"name\": \"*生活服务*健身服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599495501967361\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:50:59\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:24\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"698\",\n" + +// " \"name\": \"*生活服务*健康服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599608886587393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:51:26\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:25:04\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"699\",\n" + +// " \"name\": \"*生活服务*学历教育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599690503548929\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:51:46\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:24:42\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"700\",\n" + +// " \"name\": \"*生活服务*非学历教育服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599746073878529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:51:59\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:24:15\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"701\",\n" + +// " \"name\": \"*生活服务*教育辅助服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599816731123713\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:52:16\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:15:45\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"702\",\n" + +// " \"name\": \"*生活服务*娱乐服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599878970400769\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:52:31\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:15:26\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"703\",\n" + +// " \"name\": \"*生活服务*居民日常服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1440599937824878594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-09-22 16:52:45\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2021-10-15 09:15:11\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"704\",\n" + +// " \"name\": \"*生活服务*修理修配服务\",\n" + +// " \"ticketItemCode\": \"3070000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1448891771667873794\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2021-10-15 14:01:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"706\",\n" + +// " \"name\": \"*现代服务*市场营销策划服务\",\n" + +// " \"ticketItemCode\": \"3040000000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453544049842688002\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 10:08:02\",\n" + +// " \"updateBy\": \"yangmenglin\",\n" + +// " \"updateTime\": \"2021-10-28 10:08:25\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"705\",\n" + +// " \"name\": \"信息技术服务*信息服务费\",\n" + +// " \"ticketItemCode\": \"3040200000000000000\"\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453656369520545793\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 17:34:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"707\",\n" + +// " \"name\": \"人力资源服务*人才委托招聘\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453656440760799233\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 17:34:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"708\",\n" + +// " \"name\": \"经纪代理服务*房屋销售代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1453656505638293506\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2021-10-28 17:34:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"709\",\n" + +// " \"name\": \"其他咨询服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1482981326448545793\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-01-17 15:41:15\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2022-01-17 15:41:40\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"710\",\n" + +// " \"name\": \"*物流辅助服务*拣配服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245125419761666\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:39:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"711\",\n" + +// " \"name\": \"现代服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245191534575617\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:39:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"712\",\n" + +// " \"name\": \"现代服务*软件开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245252565893122\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:40:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"713\",\n" + +// " \"name\": \"现代服务*软件维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245321448947714\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:40:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"714\",\n" + +// " \"name\": \"现代服务*软件测试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245414449250306\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:40:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"715\",\n" + +// " \"name\": \"现代服务*其他软件服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245570355724289\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:41:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"716\",\n" + +// " \"name\": \"现代服务*研发和技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245636873191426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:41:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"717\",\n" + +// " \"name\": \"现代服务*专业技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1494245728422264833\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-02-17 17:41:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"718\",\n" + +// " \"name\": \"现代服务*相关电路技术支持服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349531423125505\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:50:52\",\n" + +// " \"updateBy\": \"admin@wangquanxin\",\n" + +// " \"updateTime\": \"2022-03-17 14:51:04\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"719\",\n" + +// " \"name\": \"*生活服务*垃圾清运\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349710821896193\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:51:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"720\",\n" + +// " \"name\": \"*生活服务*代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349775779082242\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:51:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"721\",\n" + +// " \"name\": \"*生活服务*园林养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349847908528130\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:52:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"722\",\n" + +// " \"name\": \"*生活服务*园林绿化服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504349999339679746\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:52:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"723\",\n" + +// " \"name\": \"*生活服务*汽车检测信息服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350127316283393\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:53:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"724\",\n" + +// " \"name\": \"*生活服务*汽车清洗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350189693972482\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:53:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"725\",\n" + +// " \"name\": \"*生活服务*汽车保养服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350268500750338\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:53:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"726\",\n" + +// " \"name\": \"*生活服务*汽车救援服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350346326061058\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:54:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"727\",\n" + +// " \"name\": \"*生活服务*汽车拖车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504350466786471938\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-03-17 14:54:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"728\",\n" + +// " \"name\": \"*生活服务*商业代驾服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1504711899227369474\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-03-18 14:50:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"729\",\n" + +// " \"name\": \"企业管理服务*企业管理服务*培训\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1509008794921738241\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-03-30 11:25:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"730\",\n" + +// " \"name\": \"*现代服务*市场调研\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1509008912047677441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-03-30 11:25:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"731\",\n" + +// " \"name\": \"*广告服务*学术推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517341896580567041\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:17:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"732\",\n" + +// " \"name\": \"信息技术服务*财务经济管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517341958886952961\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"733\",\n" + +// " \"name\": \"现代服务*项目设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517342001387835393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"734\",\n" + +// " \"name\": \"现代服务*法律代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517342053514645506\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"735\",\n" + +// " \"name\": \"现代服务*代理记账\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1517342133269336065\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-22 11:18:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"736\",\n" + +// " \"name\": \"生活服务*汽车检测费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572266743087105\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:00:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"737\",\n" + +// " \"name\": \"*其他咨询服务*商务咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572323294887938\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:00:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"738\",\n" + +// " \"name\": \"*其他咨询服务*市场调查服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572389782994946\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"739\",\n" + +// " \"name\": \"*生活服务*教育信息咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572451967746049\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"740\",\n" + +// " \"name\": \"*企业管理服务*停车场管理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572513670152194\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"741\",\n" + +// " \"name\": \"*会览服务*展览服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572552689762306\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"742\",\n" + +// " \"name\": \"*会览服务*会议服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572609933623297\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:01:57\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"743\",\n" + +// " \"name\": \"*信息技术服务*测试费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572650500931586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"744\",\n" + +// " \"name\": \"*信息技术服务*设计费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572708369743874\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"745\",\n" + +// " \"name\": \"*文化服务*文化策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572754217680897\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:32\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"746\",\n" + +// " \"name\": \"*设计服务*活动策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1519572815018311681\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-04-28 15:02:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"747\",\n" + +// " \"name\": \"*现代服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1525019031218683906\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-05-13 15:44:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"748\",\n" + +// " \"name\": \"现代服务*维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999578574850\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"749\",\n" + +// " \"name\": \"*会展服务*会务服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999716986881\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"750\",\n" + +// " \"name\": \"*会展服务*会议展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999775707137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"751\",\n" + +// " \"name\": \"*鉴证咨询服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999830233089\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"752\",\n" + +// " \"name\": \"*鉴证咨询服务*其他鉴证服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999884759042\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029614076891138\",\n" + +// " \"industryName\": \"鉴证服务\",\n" + +// " \"ticketItem\": \"753\",\n" + +// " \"name\": \"*鉴证咨询服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539842999960256514\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"754\",\n" + +// " \"name\": \"*其他现代服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000014782466\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"755\",\n" + +// " \"name\": \"*其他咨询服务*财务咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000077697026\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"756\",\n" + +// " \"name\": \"*其他咨询服务*品牌商务合作咨询\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000136417281\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"757\",\n" + +// " \"name\": \"*其他咨询服务*软件咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000190943234\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"758\",\n" + +// " \"name\": \"*其他咨询服务*商务信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000245469186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"759\",\n" + +// " \"name\": \"*其他咨询服务*市场调研服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000299995138\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"760\",\n" + +// " \"name\": \"*其他咨询服务*市场咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000354521090\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"761\",\n" + +// " \"name\": \"*其他咨询服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000409047042\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"762\",\n" + +// " \"name\": \"*其他咨询服务*咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000463572993\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"763\",\n" + +// " \"name\": \"*其他咨询服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000572624897\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"764\",\n" + +// " \"name\": \"*设计服务*策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000627150849\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"765\",\n" + +// " \"name\": \"*设计服务*产品研发设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000711036930\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"766\",\n" + +// " \"name\": \"*设计服务*代理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000769757185\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"767\",\n" + +// " \"name\": \"*设计服务*广告设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000824283137\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"768\",\n" + +// " \"name\": \"*设计服务*设计制作服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000878809090\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"769\",\n" + +// " \"name\": \"*设计服务*制作服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000933335041\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"770\",\n" + +// " \"name\": \"*物流辅助服务*仓库打包\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843000987860994\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"771\",\n" + +// " \"name\": \"*物流辅助服务*仓库打包费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001042386945\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"772\",\n" + +// " \"name\": \"*物流辅助服务*货物运输代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001096912898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"773\",\n" + +// " \"name\": \"*物流辅助服务*货物运输代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001151438849\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"774\",\n" + +// " \"name\": \"*物流辅助服务*物流装卸费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001205964801\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"775\",\n" + +// " \"name\": \"*现代服务*策划创意服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001260490754\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"776\",\n" + +// " \"name\": \"*现代服务*策划宣传服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001315016705\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"777\",\n" + +// " \"name\": \"*现代服务*促销推广服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001369542658\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"778\",\n" + +// " \"name\": \"*现代服务*公用设施维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001424068610\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"779\",\n" + +// " \"name\": \"*现代服务*管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001503760386\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"780\",\n" + +// " \"name\": \"*现代服务*广告策划费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001558286337\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"781\",\n" + +// " \"name\": \"*现代服务*广告策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001612812289\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"782\",\n" + +// " \"name\": \"*现代服务*广告设计费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001671532545\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"783\",\n" + +// " \"name\": \"*现代服务*活动执行费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001751224322\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"784\",\n" + +// " \"name\": \"*现代服务*检测服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001809944577\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"785\",\n" + +// " \"name\": \"*现代服务*经纪代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001864470529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"786\",\n" + +// " \"name\": \"*现代服务*勘察技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001918996481\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"787\",\n" + +// " \"name\": \"*现代服务*其他设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843001977716737\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"788\",\n" + +// " \"name\": \"*现代服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002032242690\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"789\",\n" + +// " \"name\": \"*现代服务*摄影服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002086768641\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"790\",\n" + +// " \"name\": \"*现代服务*市场服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002141294594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"791\",\n" + +// " \"name\": \"*现代服务*市场开拓服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002195820546\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"792\",\n" + +// " \"name\": \"*现代服务*市场咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002254540801\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"793\",\n" + +// " \"name\": \"*现代服务*文印晒图服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002309066753\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"794\",\n" + +// " \"name\": \"*现代服务*文印设计服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002363592706\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"795\",\n" + +// " \"name\": \"*现代服务*现代营销服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002418118658\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"796\",\n" + +// " \"name\": \"*现代服务*研发服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002472644609\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"797\",\n" + +// " \"name\": \"*现代服务*制作服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002527170561\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"798\",\n" + +// " \"name\": \"*现代服务费*经纪服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002585890817\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"799\",\n" + +// " \"name\": \"*信息技术服务*开发课程资源\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002640416770\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"800\",\n" + +// " \"name\": \"*信息技术服务*无线智能系统的维护\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002720108546\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"801\",\n" + +// " \"name\": \"*研发和技术服务*测试费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002778828801\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"802\",\n" + +// " \"name\": \"*研发和技术服务*技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002833354753\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"803\",\n" + +// " \"name\": \"*研发和技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002892075010\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"804\",\n" + +// " \"name\": \"*研发和技术服务*咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843002946600962\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"805\",\n" + +// " \"name\": \"*咨询服务*管理咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1539843003001126914\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2022-06-23 13:29:15\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"806\",\n" + +// " \"name\": \"*咨询服务*商务咨询费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1548971625716666369\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-07-18 18:03:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"807\",\n" + +// " \"name\": \"研发和技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1595712821063114754\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-24 17:35:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"808\",\n" + +// " \"name\": \"现代服务*学术推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596068729723035650\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:10:13\",\n" + +// " \"updateBy\": \"yangquan\",\n" + +// " \"updateTime\": \"2022-11-25 17:10:32\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"810\",\n" + +// " \"name\": \"人力资源服务*外包费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596068920534556674\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:10:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"809\",\n" + +// " \"name\": \"人力资源服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596069274789617666\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:12:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"812\",\n" + +// " \"name\": \"文化服务*文化创作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596069367215300610\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:12:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"811\",\n" + +// " \"name\": \"文化服务*文化服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1596069483116503041\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-25 17:13:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"813\",\n" + +// " \"name\": \"文化服务*文化策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1597420037273083905\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-11-29 10:39:50\",\n" + +// " \"updateBy\": \"admin@yrc\",\n" + +// " \"updateTime\": \"2022-11-29 16:10:46\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"\",\n" + +// " \"ticketItem\": \"815\",\n" + +// " \"name\": \"现代服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465156102447105\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:28:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"816\",\n" + +// " \"name\": \"信息技术服务*互联网营销推广费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465414643531777\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:29:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"817\",\n" + +// " \"name\": \"体育服务*体育训练服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465495077707778\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:29:37\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"818\",\n" + +// " \"name\": \"体育服务*体育管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465593450913794\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:30:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"819\",\n" + +// " \"name\": \"教育辅助服务*教育咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605465752180154369\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-21 15:30:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"820\",\n" + +// " \"name\": \"非学历教育服务*培训服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605762421014716418\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-22 11:09:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"821\",\n" + +// " \"name\": \"现代服务*配送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605762544029450241\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-22 11:09:59\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"822\",\n" + +// " \"name\": \"现代服务*市场推广\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1605842163839590401\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-22 16:26:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"823\",\n" + +// " \"name\": \"现代服务*市场推广费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1607186010351919105\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2022-12-26 09:26:20\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"824\",\n" + +// " \"name\": \"研发和技术服务*技术开发费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1607577783616192514\",\n" + +// " \"createBy\": \"yangquan\",\n" + +// " \"createTime\": \"2022-12-27 11:23:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"825\",\n" + +// " \"name\": \"*研发和技术服务*服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648590963372744705\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:34:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"826\",\n" + +// " \"name\": \"研发和技术服务*专业技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591180318924801\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:35:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"827\",\n" + +// " \"name\": \"现代服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591271104634881\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:36:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"828\",\n" + +// " \"name\": \"现代服务*健康咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591381574213633\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:36:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"829\",\n" + +// " \"name\": \"现代服务*技术调试服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591515997462529\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:37:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"830\",\n" + +// " \"name\": \"现代服务*技术维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1648591691411644417\",\n" + +// " \"createBy\": \"admin@wangquanxin\",\n" + +// " \"createTime\": \"2023-04-19 15:37:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"831\",\n" + +// " \"name\": \"非学历教育服务*培训服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1715254273203265538\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2023-10-20 14:31:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": null,\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"832\",\n" + +// " \"name\": \"其他咨询服务*其他咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153657339023362\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:18:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:18:38\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"833\",\n" + +// " \"name\": \"*经纪代理服务*代发服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153771864494082\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:19:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:19:05\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"834\",\n" + +// " \"name\": \"*人力资源服务*代付服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153826910539778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:19:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:19:18\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"835\",\n" + +// " \"name\": \"*人力资源服务*代付业务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739153936302182402\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2023-12-25 13:19:45\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 13:19:44\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"836\",\n" + +// " \"name\": \"*人力资源服务*代付个人生产经营所得\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739186988634050562\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2023-12-25 15:31:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-25 15:31:05\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"837\",\n" + +// " \"name\": \"现代服务*分拣服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1739523530627977217\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2023-12-26 13:48:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2023-12-26 13:48:23\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"838\",\n" + +// " \"name\": \"信息技术服务*技术检测服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090008041885698\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:46:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:46:39\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"839\",\n" + +// " \"name\": \"现代服务*业务宣传服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090074534187009\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:46:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:46:54\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"840\",\n" + +// " \"name\": \"企业管理服务*管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090127910899713\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:07\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"841\",\n" + +// " \"name\": \"企业管理服务*总部管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090173435875330\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:18\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:18\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"842\",\n" + +// " \"name\": \"企业管理服务*投资管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090233452171265\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:33\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:32\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"843\",\n" + +// " \"name\": \"企业管理服务*资产管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090316994318338\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:47:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:47:52\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"844\",\n" + +// " \"name\": \"信息技术服务*数据处理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090370769489922\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:06\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:05\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"845\",\n" + +// " \"name\": \"研发和技术服务*技术开发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090426448875522\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:18\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"846\",\n" + +// " \"name\": \"研发和技术服务*专业技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090470111580161\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:29\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"847\",\n" + +// " \"name\": \"研发和技术服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090571219472385\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:48:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:48:53\",\n" + +// " \"industryId\": \"1342029533932130305\",\n" + +// " \"industryName\": \"研发与技术服务\",\n" + +// " \"ticketItem\": \"848\",\n" + +// " \"name\": \"研发和技术服务*技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1742090654866477058\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-02 15:49:13\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-02 15:49:13\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"849\",\n" + +// " \"name\": \"物流辅助服务*外卖派送服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747891412559474690\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 15:59:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 15:59:21\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"850\",\n" + +// " \"name\": \"现代服务*会议展览服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747895966470516737\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:17:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:17:27\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"851\",\n" + +// " \"name\": \"物流辅助服务*货物仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896011513147393\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:17:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:17:38\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"852\",\n" + +// " \"name\": \"物流辅助服务*商品流通仓储服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896074364792834\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:17:53\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:17:53\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"853\",\n" + +// " \"name\": \"鉴证咨询服务*鉴证咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896123656253441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:04\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"854\",\n" + +// " \"name\": \"鉴证咨询服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896176332517377\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:17\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"855\",\n" + +// " \"name\": \"鉴证咨询服务*翻译服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896234385879042\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:31\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"856\",\n" + +// " \"name\": \"鉴证咨询服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896279533367297\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:42\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"857\",\n" + +// " \"name\": \"现代服务*活动策划服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896338580779010\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:18:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:18:56\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"858\",\n" + +// " \"name\": \"经纪代理服务*经纪代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896391030550529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:19:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:19:08\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"859\",\n" + +// " \"name\": \"经纪代理服务*中介服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896450811965442\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:19:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:19:22\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"860\",\n" + +// " \"name\": \"现代服务*安全保护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747896530340163586\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:19:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:19:41\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"861\",\n" + +// " \"name\": \"生活服务*驾驶服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1747900548118491138\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-01-18 16:35:40\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-01-18 16:35:39\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"862\",\n" + +// " \"name\": \"鉴证咨询服务*其他鉴证服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1752954773823303682\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2024-02-01 15:19:21\",\n" + +// " \"updateBy\": \"admin@songya\",\n" + +// " \"updateTime\": \"2024-02-01 15:20:08\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"1111\",\n" + +// " \"name\": \"现代服务*物流辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1760591325269340162\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-02-22 17:04:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-02-22 17:04:16\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"863\",\n" + +// " \"name\": \"信息技术服务*咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1760591419108503554\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-02-22 17:04:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-02-22 17:04:39\",\n" + +// " \"industryId\": \"1321641787611275266\",\n" + +// " \"industryName\": \"鉴证咨询服务\",\n" + +// " \"ticketItem\": \"864\",\n" + +// " \"name\": \"鉴证咨询服务*市场调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1760591464616701954\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-02-22 17:04:50\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-02-22 17:04:50\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"865\",\n" + +// " \"name\": \"经纪代理服务*商务辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600417282809857\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:11\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"866\",\n" + +// " \"name\": \"现代服务*翻译服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600470558859265\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:24\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"867\",\n" + +// " \"name\": \"设计服务*内部管理设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600510266335234\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:33\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"868\",\n" + +// " \"name\": \"设计服务*供应链设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600553211813890\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:44\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"869\",\n" + +// " \"name\": \"设计服务*服装设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600604885639170\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:43:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:43:56\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"870\",\n" + +// " \"name\": \"设计服务*平面设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600676708900865\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:13\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"871\",\n" + +// " \"name\": \"设计服务*包装设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600718488363009\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:23\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"872\",\n" + +// " \"name\": \"设计服务*动漫设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600777917456386\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:37\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"873\",\n" + +// " \"name\": \"设计服务*网游设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600814420484098\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:46\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"874\",\n" + +// " \"name\": \"设计服务*网站设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600849765883905\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:44:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:44:54\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"875\",\n" + +// " \"name\": \"设计服务*造型设计服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600893961265153\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:05\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"876\",\n" + +// " \"name\": \"设计服务*创意策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600931647086594\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:14\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"877\",\n" + +// " \"name\": \"知识产权服务*知识产权登记服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769600983010533378\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:26\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"878\",\n" + +// " \"name\": \"知识产权服务*知识产权鉴定服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601045686018049\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:42\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:41\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"879\",\n" + +// " \"name\": \"知识产权服务*知识产权评估服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601087654223874\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:45:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:45:51\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"880\",\n" + +// " \"name\": \"知识产权服务*知识产权认证服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601123737821186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:00\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"881\",\n" + +// " \"name\": \"知识产权服务*知识产权检索服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601181514358786\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:13\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"882\",\n" + +// " \"name\": \"广告服务*广告宣传服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601217287577601\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:22\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"883\",\n" + +// " \"name\": \"广告服务*广告展示服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601314264080385\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:45\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"884\",\n" + +// " \"name\": \"企业管理服务*投资与资产管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601366957121537\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:46:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:46:58\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"885\",\n" + +// " \"name\": \"经纪代理服务*知识产权代理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601468186648578\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:47:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:47:22\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"886\",\n" + +// " \"name\": \"生活服务*汽车保养检测服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601527234060290\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:47:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:47:36\",\n" + +// " \"industryId\": \"1343101669654736897\",\n" + +// " \"industryName\": \"文化体育服务\",\n" + +// " \"ticketItem\": \"887\",\n" + +// " \"name\": \"文化服务*组织活动服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601578719141889\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:47:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:47:48\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"888\",\n" + +// " \"name\": \"非学历教育服务*学前教育服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1769601635543572482\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-18 13:48:02\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-18 13:48:02\",\n" + +// " \"industryId\": \"1377464354886131713\",\n" + +// " \"industryName\": \"教育辅助服务\",\n" + +// " \"ticketItem\": \"889\",\n" + +// " \"name\": \"非学历教育服务*演讲服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773536886344806402\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:19\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:19\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"890\",\n" + +// " \"name\": \"人力资源服务*项目外包费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773536924647190529\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:28\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:28\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"891\",\n" + +// " \"name\": \"人力资源服务*招聘服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773536978401390593\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:41\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"892\",\n" + +// " \"name\": \"现代服务*绿化养护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537019614621697\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:25:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:25:50\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"893\",\n" + +// " \"name\": \"现代服务*保养费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537089953099778\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:07\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"894\",\n" + +// " \"name\": \"现代服务*居间费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537157032603649\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:23\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"895\",\n" + +// " \"name\": \"现代服务*外包服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537199181164545\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:33\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"896\",\n" + +// " \"name\": \"现代服务*渠道服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537276838703105\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:26:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:26:52\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"897\",\n" + +// " \"name\": \"生活服务*清洁服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537337844854785\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:27:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:27:06\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"898\",\n" + +// " \"name\": \"生活服务*物业服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537540735922178\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:27:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:27:55\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"899\",\n" + +// " \"name\": \"生活服务*酒店配套服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537611254755330\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:11\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"900\",\n" + +// " \"name\": \"生活服务*家具产品维保\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537674873958402\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:27\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:27\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"901\",\n" + +// " \"name\": \"生活服务*市容市政管理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537734365966337\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:41\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"902\",\n" + +// " \"name\": \"生活服务*策划服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537774614507522\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:28:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:28:50\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"903\",\n" + +// " \"name\": \"生活服务*城市配送费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1773537851319939074\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-03-29 10:29:09\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-03-29 10:29:09\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"904\",\n" + +// " \"name\": \"生活服务*网约车服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778237994947526657\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:45:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:45:50\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"905\",\n" + +// " \"name\": \"信息技术服务*信息系统运行维护服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238050115207169\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:03\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"906\",\n" + +// " \"name\": \"*信息技术服务*物联网技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238103110238210\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:16\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"907\",\n" + +// " \"name\": \"*信息技术服务*网络技术服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238154519822337\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:29\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:28\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"908\",\n" + +// " \"name\": \"*信息技术服务*数据服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238196752269314\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:39\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:38\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"909\",\n" + +// " \"name\": \"*信息技术服务*商务平台服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238266436435970\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:46:55\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:46:55\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"910\",\n" + +// " \"name\": \"*现代服务*信息咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238316499648513\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:07\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:07\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"911\",\n" + +// " \"name\": \"*现代服务*销售代理\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238354785255426\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:17\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:16\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"912\",\n" + +// " \"name\": \"*现代服务*社会调查服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238415715909633\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:31\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"913\",\n" + +// " \"name\": \"*现代服务*商务辅助服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238459340865537\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:41\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"914\",\n" + +// " \"name\": \"*现代服务*商务服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238498725380097\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:47:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:50\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"915\",\n" + +// " \"name\": \"*现代服务*贸易经纪\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238537078095873\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:48:00\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:47:59\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"916\",\n" + +// " \"name\": \"*现代服务*贸易代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238948883251201\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:49:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:49:38\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"917\",\n" + +// " \"name\": \"*现代服务*技术转让服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778238994345312257\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:49:49\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:49:48\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"918\",\n" + +// " \"name\": \"*现代服务*国内贸易代理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239044031037441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:00\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"919\",\n" + +// " \"name\": \"*现代服务*办公服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239087299477505\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:11\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"920\",\n" + +// " \"name\": \"*现代服务*物流服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239143100497921\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:24\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:24\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"921\",\n" + +// " \"name\": \"*现代服务*检验检测服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239183332261890\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:34\",\n" + +// " \"industryId\": \"1321641787607080963\",\n" + +// " \"industryName\": \"物流辅助服务\",\n" + +// " \"ticketItem\": \"922\",\n" + +// " \"name\": \"物流辅助服务*打包服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239239913422850\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:48\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:47\",\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"923\",\n" + +// " \"name\": \"*文化服务*文艺创作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239275820859394\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:50:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:50:56\",\n" + +// " \"industryId\": \"1596069139343007746\",\n" + +// " \"industryName\": \"文化服务\",\n" + +// " \"ticketItem\": \"924\",\n" + +// " \"name\": \"*文化服务*文艺表演服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239324235710466\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:08\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:07\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"925\",\n" + +// " \"name\": \"*生活服务*植物养殖服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239382133882882\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:21\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"926\",\n" + +// " \"name\": \"*生活服务*养老服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239433216311298\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:34\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:33\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"927\",\n" + +// " \"name\": \"*生活服务*消毒服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239474714755073\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:43\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"928\",\n" + +// " \"name\": \"*生活服务*清洗服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239525088346113\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:51:56\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:51:55\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"929\",\n" + +// " \"name\": \"*生活服务*票务服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239587260514305\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:10\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"930\",\n" + +// " \"name\": \"*生活服务*居民日常生活服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239631409758210\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:20\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"931\",\n" + +// " \"name\": \"*生活服务*美容美发服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239693028278274\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:36\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:35\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"932\",\n" + +// " \"name\": \"*设计服务*图文设计制作\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239738481950721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:52:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:52:46\",\n" + +// " \"industryId\": \"1321641787594498050\",\n" + +// " \"industryName\": \"文化创意服务\",\n" + +// " \"ticketItem\": \"933\",\n" + +// " \"name\": \"*设计服务*打印复印服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239798347251713\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:01\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:00\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"934\",\n" + +// " \"name\": \"*企业管理服务*综合管理服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239853271662593\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:13\",\n" + +// " \"industryId\": \"1321641787619663875\",\n" + +// " \"industryName\": \"商务辅助服务\",\n" + +// " \"ticketItem\": \"935\",\n" + +// " \"name\": \"*企业管理服务*项目管理费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239943239483394\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:35\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:35\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"936\",\n" + +// " \"name\": \"*其他咨询服务*设计优化咨询服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778239982091321346\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:44\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:44\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"937\",\n" + +// " \"name\": \"*其他咨询服务*内部管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240020695695361\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:53:54\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:53:53\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"938\",\n" + +// " \"name\": \"*其他咨询服务*流程管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240057827868673\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:03\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:02\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"939\",\n" + +// " \"name\": \"*其他咨询服务*教育咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240096713261058\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:12\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:11\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"940\",\n" + +// " \"name\": \"*其他咨询服务*健康咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240139025399810\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:22\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:21\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"941\",\n" + +// " \"name\": \"*其他咨询服务*技术咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240178145673218\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:31\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:31\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"942\",\n" + +// " \"name\": \"*其他咨询服务*房地产咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240218461323266\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:41\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:40\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"943\",\n" + +// " \"name\": \"*其他咨询服务*安全咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240261721374721\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:54:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:54:51\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"944\",\n" + +// " \"name\": \"*其他咨询服务*翻译服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240315039367169\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:55:04\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:55:03\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"945\",\n" + +// " \"name\": \"*其他咨询服务*设计咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1778240365178077186\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-04-11 09:55:16\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-04-11 09:55:15\",\n" + +// " \"industryId\": \"1342029524901793794\",\n" + +// " \"industryName\": \"咨询服务\",\n" + +// " \"ticketItem\": \"946\",\n" + +// " \"name\": \"*其他咨询服务*环保咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1790212884265558017\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2024-05-14 10:49:47\",\n" + +// " \"updateBy\": \"admin@songya\",\n" + +// " \"updateTime\": \"2024-05-14 10:50:00\",\n" + +// " \"industryId\": \"1321641787619663873\",\n" + +// " \"industryName\": \"生活服务\",\n" + +// " \"ticketItem\": \"947\",\n" + +// " \"name\": \"*生活服务*后勤服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1791338857564332033\",\n" + +// " \"createBy\": \"admin@songya\",\n" + +// " \"createTime\": \"2024-05-17 13:24:00\",\n" + +// " \"updateBy\": \"yangmenglin\",\n" + +// " \"updateTime\": \"2024-06-18 10:53:15\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"948\",\n" + +// " \"name\": \"现代服务*设备操作服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1802897233819156481\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-18 10:52:51\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-18 10:52:51\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"949\",\n" + +// " \"name\": \"现代服务*场务服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805112272407969794\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-24 13:34:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-24 13:34:37\",\n" + +// " \"industryId\": \"1321641787611275265\",\n" + +// " \"industryName\": \"现代服务\",\n" + +// " \"ticketItem\": \"950\",\n" + +// " \"name\": \"现代服务*拍摄服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510429583331329\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:56:46\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:56:45\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"951\",\n" + +// " \"name\": \"建筑服务*劳务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510482607722498\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:56:58\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:56:58\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"952\",\n" + +// " \"name\": \"建筑服务*工程款\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510530447953922\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:57:10\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:57:09\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"953\",\n" + +// " \"name\": \"建筑劳务*工程服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1805510575998095362\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-25 15:57:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-25 15:57:20\",\n" + +// " \"industryId\": \"1805510316332929026\",\n" + +// " \"industryName\": \"建筑服务\",\n" + +// " \"ticketItem\": \"954\",\n" + +// " \"name\": \"建筑服务*建筑劳务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245125455859714\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:11\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:10\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"955\",\n" + +// " \"name\": \"研发和技术服务*安装技术服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245168581693441\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:21\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:21\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"956\",\n" + +// " \"name\": \"研发和技术服务*技术支持服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245204501712898\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:30\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:29\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"957\",\n" + +// " \"name\": \"研发和技术服务*技术开发服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245240081993729\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:38\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:38\",\n" + +// " \"industryId\": \"1321641787619663874\",\n" + +// " \"industryName\": \"研发和技术服务\",\n" + +// " \"ticketItem\": \"958\",\n" + +// " \"name\": \"研发和技术服务*工程勘察勘探服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245296847704066\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:36:52\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:36:51\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"959\",\n" + +// " \"name\": \"信息技术服务*供应链管理咨询服务\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245351818252290\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:05\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:04\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"960\",\n" + +// " \"name\": \"信息技术服务*网站内容维护服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245388086398977\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:14\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:13\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"961\",\n" + +// " \"name\": \"信息技术服务*人力资源流程管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245428087476225\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:23\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:23\",\n" + +// " \"industryId\": \"1321641787628052482\",\n" + +// " \"industryName\": \"信息技术服务\",\n" + +// " \"ticketItem\": \"962\",\n" + +// " \"name\": \"信息技术服务*数据库管理服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " },\n" + +// " {\n" + +// " \"id\": \"1806245511801589761\",\n" + +// " \"createBy\": \"yangmenglin\",\n" + +// " \"createTime\": \"2024-06-27 16:37:43\",\n" + +// " \"updateBy\": null,\n" + +// " \"updateTime\": \"2024-06-27 16:37:43\",\n" + +// " \"industryId\": \"1596068477544751105\",\n" + +// " \"industryName\": \"人力资源服务\",\n" + +// " \"ticketItem\": \"963\",\n" + +// " \"name\": \"人力资源服务*外包服务费\",\n" + +// " \"ticketItemCode\": null\n" + +// " }\n" + +// " ],\n" + +// " \"timestamp\": 1720684216813\n" + +// "}"; +// +// Map resultMap = JsonUtils.parseObject(json, Map.class); +// List list = (List)resultMap.get("result"); +// List insertlist = new ArrayList(); +// Map keyMap = new HashMap(); +// int i = 0 ; +// for(Map m : list) { +// String value =(String)m.get("industryName"); +// String text =(String)m.get("name"); +// MerInvoiceType sd = new MerInvoiceType(); +// +// Object obj = keyMap.get(value); +// +//// if(obj == null){ +// sd.setParentType(value); +// sd.setType(text); +// sd.setCreateTime(new Date()); +// keyMap.put(value,""); +// insertlist.add(sd); +//// } +// i++; +// +// } +// +// this.merInvoiceTypeMapper.insertBatch(insertlist,10000); +// +// } +// +// } +} diff --git a/ruoyi-modules/ruoyi-resource/Dockerfile b/ruoyi-modules/ruoyi-resource/Dockerfile new file mode 100644 index 0000000..6e0df4f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/resource/logs \ + /ruoyi/resource/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/resource + +ENV SERVER_PORT=9204 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-resource.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-resource \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-resource/pom.xml b/ruoyi-modules/ruoyi-resource/pom.xml new file mode 100644 index 0000000..2c99da7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/pom.xml @@ -0,0 +1,171 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-resource + + + ruoyi-resource资源服务 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-ratelimiter + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + + + + + + + + + + + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-websocket + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + com.google.zxing + core + 3.5.2 + + + + com.google.zxing + javase + 3.5.2 + + + org.dromara + ruoyi-api-payment + + + + junit + junit + 4.13.2 + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java new file mode 100644 index 0000000..4caa45a --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java @@ -0,0 +1,26 @@ +package org.dromara.resource; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 资源服务 + * + * @author Lion Li + */ +@EnableDubbo +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class RuoYiResourceApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiResourceApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + + System.out.println("(♥◠‿◠)ノ゙ 资源服务模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java new file mode 100644 index 0000000..a7f3a75 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysDhqSignController.java @@ -0,0 +1,52 @@ +package org.dromara.resource.controller; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.junziqian.common.bean.sign.JzqBack; +import org.dromara.resource.service.impl.DhqSignServiceImpl; +import org.dromara.resource.service.impl.JzqSignServiceImpl; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title SysDhqSignController + * @description + * @create 2024-05-23 13:46 + */ + +@RestController +@RequestMapping("/sign") +public class SysDhqSignController extends BaseController { + + + @Resource + public JzqSignServiceImpl jzqSignService; + + + /**** + * 接收返回结果 + * @param + * @return + */ + @PostMapping("/accept") + @ResponseBody + public String accept(@RequestParam Map map)throws Exception{ + return this.jzqSignService.accpet(map); + } + + /**** + * 接收返回结果 + * @param + * @return + */ + @PostMapping("/acceptSure") + @ResponseBody + public String acceptSure(@RequestParam Map map)throws Exception{ + return this.jzqSignService.accpetSure(map); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java new file mode 100644 index 0000000..19da5ba --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysEmailController.java @@ -0,0 +1,60 @@ +package org.dromara.resource.controller; + + +import cn.hutool.core.util.RandomUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mail.config.properties.MailProperties; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.validation.constraints.NotBlank; +import java.time.Duration; + +/** + * 邮件功能 + * + * @author Lion Li + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/email") +public class SysEmailController extends BaseController { + + private final MailProperties mailProperties; + + /** + * 邮箱验证码 + * + * @param email 邮箱 + */ + @RateLimiter(key = "#email", time = 60, count = 1) + @GetMapping("/code") + public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { + if (!mailProperties.getEnabled()) { + return R.fail("当前系统没有开启邮箱功能!"); + } + String key = GlobalConstants.CAPTCHA_CODE_KEY + email; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + try { + MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); + } catch (Exception e) { + log.error("验证码短信发送异常 => {}", e.getMessage()); + return R.fail(e.getMessage()); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java new file mode 100644 index 0000000..506cdb7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssConfigController.java @@ -0,0 +1,100 @@ +package org.dromara.resource.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssConfigBo; +import org.dromara.resource.domain.vo.SysOssConfigVo; +import org.dromara.resource.service.ISysOssConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; + +/** + * 对象存储配置Controller + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oss/config") +public class SysOssConfigController extends BaseController { + + private final ISysOssConfigService iSysOssConfigService; + + /** + * 查询对象存储配置列表 + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { + return iSysOssConfigService.queryPageList(bo, pageQuery); + } + + /** + * 获取对象存储配置详细信息 + * + * @param ossConfigId OSS配置ID + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/{ossConfigId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("ossConfigId") Long ossConfigId) { + return R.ok(iSysOssConfigService.queryById(ossConfigId)); + } + + /** + * 新增对象存储配置 + */ + @SaCheckPermission("system:ossConfig:add") + @Log(title = "对象存储配置", businessType = BusinessType.INSERT) + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(iSysOssConfigService.insertByBo(bo)); + } + + /** + * 修改对象存储配置 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { + return toAjax(iSysOssConfigService.updateByBo(bo)); + } + + /** + * 删除对象存储配置 + * + * @param ossConfigIds OSS配置ID串 + */ + @SaCheckPermission("system:ossConfig:remove") + @Log(title = "对象存储配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossConfigIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossConfigIds) { + return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysOssConfigBo bo) { + return toAjax(iSysOssConfigService.updateOssConfigStatus(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java new file mode 100644 index 0000000..4e9bb8f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java @@ -0,0 +1,124 @@ +package org.dromara.resource.controller; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssUploadVo; +import org.dromara.resource.domain.vo.SysOssVo; +import org.dromara.resource.service.ISysOssService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * 文件上传 控制层 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oss") +public class SysOssController extends BaseController { + + private final ISysOssService iSysOssService; + + /** + * 查询OSS对象存储列表 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { + return iSysOssService.queryPageList(bo, pageQuery); + } + + /** + * 查询OSS对象基于id串 + * + * @param ossIds OSS对象ID串 + */ +// @SaCheckPermission("system:oss:list") + @GetMapping("/listByIds/{ossIds}") + public R> listByIds(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { + List list = iSysOssService.listByIds(Arrays.asList(ossIds)); + return R.ok(list); + } + + /** + * 上传OSS对象存储 + * + * @param file 文件 + */ +// @SaCheckPermission("system:oss:upload") + @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R upload(@RequestPart("file") MultipartFile file) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + SysOssVo oss = iSysOssService.upload(file); + SysOssUploadVo uploadVo = new SysOssUploadVo(); + uploadVo.setUrl(oss.getUrl()); + uploadVo.setFileName(oss.getOriginalName()); + uploadVo.setOssId(oss.getOssId().toString()); + return R.ok(uploadVo); + } + + /** + * 下载OSS对象存储 + * + * @param ossId OSS对象ID + */ +// @SaCheckPermission("system:oss:download") + @GetMapping("/download/{ossId}") + public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + iSysOssService.download(ossId, response); + } + + /** + * 下载OSS对象存储 + * + * @param ossId OSS对象ID + */ +// @SaCheckPermission("system:oss:download") + @PostMapping("/download/{ossId}") + public void downloadPost(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + iSysOssService.download(ossId, response); + } + + + + @PostMapping("/dlurl") + public void downLoadByUrl(String url,HttpServletResponse response)throws Exception{ + this.iSysOssService.downloadByUrl(url,response); + } + + /** + * 删除OSS对象存储 + * + * @param ossIds OSS对象ID串 + */ +// @SaCheckPermission("system:oss:remove") + @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { + return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true)); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java new file mode 100644 index 0000000..e0c8520 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java @@ -0,0 +1,78 @@ +package org.dromara.resource.controller; + + +import cn.hutool.core.util.RandomUtil; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.ratelimiter.annotation.RateLimiter; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.service.ISysSmsService; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; +import java.util.LinkedHashMap; + +/** + * 短信功能 + * + * @author Lion Li + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/sms") +public class SysSmsController extends BaseController { + + private final ISysSmsService sysSmsService; + /** + * 短信验证码 + * + * @param phonenumber 用户手机号 + */ + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + @GetMapping("/code") + public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + // 验证码模板id 自行处理 (查数据库或写死均可) + String templateId = ""; + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); + if (!"OK".equals(smsResponse.getCode())) { + log.error("验证码短信发送异常 => {}", smsResponse); + return R.fail(smsResponse.getMessage()); + } + return R.ok(); + } + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-03-27 15:03 + * 说明:公众号短信验证码 + **/ + @GetMapping("/mpCode") + public R sendMpCode(@NotBlank(message = "站点名称不能为空") String domain, @NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber){ + this.sysSmsService.sendMpSmsCode(domain,phonenumber); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java new file mode 100644 index 0000000..8e3457b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/DMSmsUtils.java @@ -0,0 +1,213 @@ +package org.dromara.resource.danmi_sms; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import org.apache.commons.lang3.StringUtils; +import org.dromara.resource.danmi_sms.common.*; +import org.dromara.resource.danmi_sms.config.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +@Service +public class DMSmsUtils { + private static final Logger log = LoggerFactory.getLogger(DMSmsUtils.class); + + @Resource + private Config config; + + @Value("${ruoyi.captchaSMS}") + private int captchaSMS; + + private String accountTip = " 账号: %s ,密码:%s ,请及时登录更改登录密码"; + + public DMSmsResult verificationCode(String sign, String mobile, String code) { + SmsDto smsDto = signJsonToDto(sign); + String params = code; + return execute(mobile, params, smsDto.getVerification()); + } + + public DMSmsResult enterSuccess(String sign, String domain, String title, String mobile, String companyName, String password) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = companyName; + } else { + params = companyName + "," + title + ",http://" + domain; + } + if (StringUtils.isNotEmpty(password)) { + String account = String.format(this.accountTip, new Object[] { mobile, password }); + params = params + "," + account; + } else { + String account = String.format(this.accountTip, new Object[] { mobile, "" }).replaceAll(" ,密码:", ""); + params = params + "," + account; + } + return execute(mobile, params, smsDto.getMerchant()); + } + + public DMSmsResult rechargeInfoPush(String sign, String domain, String companyName, String taxSourcesName, String receiptAccount, String receiptBank, String receiptAccountName, String mobile, String routingNumber) { + SmsDto smsDto = signJsonToDto(sign); + if (smsDto != null && StringUtils.isBlank(smsDto.getRechargeInfo())) { + log.error("充值信息发送短信:mobile:" + mobile + ",companyName:" + companyName + ",taxSourcesName:" + taxSourcesName + ",receiptAccount:" + receiptAccount + ",receiptAccountName:" + receiptAccountName + ",routingNumber:" + routingNumber); + return new DMSmsResult(); + } + if (StringUtils.isBlank(routingNumber)) + routingNumber = "无"; + String params = companyName + "," + taxSourcesName + "," + receiptAccountName + "," + receiptBank + "," + receiptAccount + "," + routingNumber; + return execute(mobile, params, smsDto.getRechargeInfo()); + } + + public DMSmsResult invoicePush(String sign, String domain, String companyName, String params, String mobile) { + SmsDto smsDto = signJsonToDto(sign); + if (smsDto != null && StringUtils.isBlank(smsDto.getInvoce())) { + log.error("开票短信推送:mobile:" + mobile + ",companyName:" + companyName + ",params:" + params); + return new DMSmsResult(); + } + params = companyName + "," + params; + return execute(mobile, params, smsDto.getInvoce()); + } + + public DMSmsResult agentSuccess(String sign, String domain, String title, String mobile, String companyName, String password) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = companyName + ","; + if (StringUtils.isNotEmpty(password)) { + String account = String.format(this.accountTip, new Object[] { mobile, password }); + params = companyName + "," + account; + } + } else { + params = companyName + "," + title + ",http://" + domain; + if (StringUtils.isNotEmpty(password)) { + String account = String.format(this.accountTip, new Object[] { mobile, password }); + params = params + "," + account; + } + } + return execute(mobile, params, smsDto.getAgent()); + } + + public DMSmsResult toSign(String sign, String domain, String mobile, String flowId) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = flowId; + } else { + params = "http://" + domain + "," + flowId; + } + return execute(mobile, params, smsDto.getTosign()); + } + + public DMSmsResult recharge(String sign, String mobile, String companyName, String accountName, String money) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + accountName + "," + money; + return execute(mobile, params, smsDto.getRecharge()); + } + + public DMSmsResult refund(String sign, String mobile, String companyName, String money, String number, String accountName) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + money + "," + number + "," + accountName; + return execute(mobile, params, smsDto.getRefund()); + } + + public DMSmsResult giveout(String sign, String mobile, String companyName, String batchNumber, String successNum, String failNum) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + batchNumber + "," + successNum + "," + failNum; + return execute(mobile, params, smsDto.getGiveout()); + } + + public DMSmsResult balance(String sign, String mobile, String companyName, String accountName, String money) { + SmsDto smsDto = signJsonToDto(sign); + String params = companyName + "," + accountName + "," + money; + return execute(mobile, params, smsDto.getBalance()); + } + + public DMSmsResult toOnlineSign(String sign, String domain, String mobile, String flowId) { + SmsDto smsDto = signJsonToDto(sign); + String params = ""; + if (smsDto.getUnified() == null || smsDto.getUnified().intValue() == 0) { + params = flowId; + } else { + params = "http://" + domain + "," + flowId; + } + return execute(mobile, params, smsDto.getToOnlineSign()); + } + + private DMSmsResult execute(String mobile, String param, String templateid) { + log.info("短信发送(验证码通知,会员营销):mobile:" + mobile + ",param:" + param + ",templateid:" + templateid); + DMSmsResult dmSmsResult = new DMSmsResult(); + try { + dmSmsResult.setSuccess(true); + if (this.captchaSMS > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("accountSid").append("=").append(this.config.getAccount_sid()); + sb.append("&to").append("=").append(mobile); + try { + sb.append("¶m").append("=").append(URLEncoder.encode(param, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + sb.append("&templateid").append("=").append(templateid); + String body = sb.toString() + HttpUtil.createCommonParam(this.config.getAccount_sid(), this.config.getAuth_token()); + String result = HttpUtil.post(this.config.getBase_url(), body); + log.info("短信发送(验证码通知,会员营销):result:" + result); + JSONObject jsonObject = JSONUtil.parseObj(result); + if ("0000".equals(jsonObject.getStr("respCode"))) { + dmSmsResult.setSuccess(true); + dmSmsResult.setSmsId(jsonObject.getStr("smsId")); + } else { + dmSmsResult.setSuccess(false); + dmSmsResult.setErrorMsg(jsonObject.getStr("respDesc")); + } + } + } catch (Exception e) { + e.printStackTrace(); + dmSmsResult.setSuccess(false); + dmSmsResult.setErrorMsg("短信发送失败"); + } + return dmSmsResult; + } + + public DMSmsSendResult getSmsSendResult(Long count) { + log.info("短信发送回执拉取(验证码通知,会员营销):count: {}", count); + DMSmsSendResult sendResult = new DMSmsSendResult(); + try { + sendResult.setSuccess(true); + if (this.captchaSMS > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("accountSid").append("=").append(this.config.getAccount_sid()); + sb.append("&").append("accountId").append("=").append(this.config.getAccount_id()); + sb.append("&").append("count").append("=").append(count); + Long timestamp = Long.valueOf(System.currentTimeMillis()); + String body = sb.toString() + HttpUtil.createParamWithTime(this.config.getAccount_sid(), this.config.getAuth_token(), timestamp); + String baseUrl = this.config.getBase_url().replaceAll("/sendSMS", ""); + String result = HttpUtil.post(baseUrl + "/receipt/pull", body); + JSONObject jsonObject = JSONUtil.parseObj(result); + if ("0000".equals(jsonObject.getStr("respCode"))) { + sendResult.setSuccess(true); + sendResult.setData(JSON.parseArray(jsonObject.getStr("smsResult"), DMSmsSendResultDtl.class)); + } else { + sendResult.setSuccess(false); + sendResult.setErrorMsg(jsonObject.getStr("respDesc")); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.info("短信发送回执拉取(验证码通知,会员营销):result:" + e.getMessage()); + sendResult.setSuccess(false); + sendResult.setErrorMsg("短信发送失败"); + } + return sendResult; + } + + private SmsDto signJsonToDto(String sign) { + String defaultSign = JSON.toJSONString(this.config.getDefalutCode()); + sign = StringUtils.isNotBlank(sign) ? sign : defaultSign; + return (SmsDto)JSON.toJavaObject((JSON)JSON.parseObject(sign), SmsDto.class); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java new file mode 100644 index 0000000..366344e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsResult.java @@ -0,0 +1,43 @@ +package org.dromara.resource.danmi_sms.common; + +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + + +@EqualsAndHashCode +public class DMSmsResult implements Serializable { + private boolean success; + + private String errorMsg; + + private String smsId; + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public void setSmsId(String smsId) { + this.smsId = smsId; + } + + public String toString() { + return "DMSmsResult(success=" + isSuccess() + ", errorMsg=" + getErrorMsg() + ", smsId=" + getSmsId() + ")"; + } + + public boolean isSuccess() { + return this.success; + } + + public String getErrorMsg() { + return this.errorMsg; + } + + public String getSmsId() { + return this.smsId; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java new file mode 100644 index 0000000..87bf9c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResult.java @@ -0,0 +1,53 @@ +package org.dromara.resource.danmi_sms.common; + + +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; +@EqualsAndHashCode +public class DMSmsSendResult implements Serializable { + private static final long serialVersionUID = 1L; + + //是否成功 + private boolean success; + + //错误信息 + private String errorMsg; + + //短信回执详情 + private List data; + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public void setData(List data) { + this.data = data; + } + + protected boolean canEqual(Object other) { + return other instanceof DMSmsSendResult; + } + + + public String toString() { + return "DMSmsSendResult(success=" + isSuccess() + ", errorMsg=" + getErrorMsg() + ", data=" + getData() + ")"; + } + + public boolean isSuccess() { + return this.success; + } + + public String getErrorMsg() { + return this.errorMsg; + } + + public List getData() { + return this.data; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java new file mode 100644 index 0000000..70220d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/DMSmsSendResultDtl.java @@ -0,0 +1,99 @@ +package org.dromara.resource.danmi_sms.common; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +@EqualsAndHashCode +public class DMSmsSendResultDtl implements Serializable { + private static final long serialVersionUID = 1L; + + //到达时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date receiveTime; + + //具体错误码描述 + private String respMessage; + + //计费数量 + private Integer chargingNum; + + //短信发送请求唯一ID + private String smsId; + + //短信发送请求唯一ID + private String phone; + + //响应结果集中返回,短信回执具体状态码 + private String respCode; + + //短信发送状态报告。0:成功;1:失败 + private Integer status; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public void setRespMessage(String respMessage) { + this.respMessage = respMessage; + } + + public void setChargingNum(Integer chargingNum) { + this.chargingNum = chargingNum; + } + + public void setSmsId(String smsId) { + this.smsId = smsId; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public void setStatus(Integer status) { + this.status = status; + } + + protected boolean canEqual(Object other) { + return other instanceof DMSmsSendResultDtl; + } + + public String toString() { + return "DMSmsSendResultDtl(receiveTime=" + getReceiveTime() + ", respMessage=" + getRespMessage() + ", chargingNum=" + getChargingNum() + ", smsId=" + getSmsId() + ", phone=" + getPhone() + ", respCode=" + getRespCode() + ", status=" + getStatus() + ")"; + } + + public Date getReceiveTime() { + return this.receiveTime; + } + + public String getRespMessage() { + return this.respMessage; + } + + public Integer getChargingNum() { + return this.chargingNum; + } + + public String getSmsId() { + return this.smsId; + } + + public String getPhone() { + return this.phone; + } + + public String getRespCode() { + return this.respCode; + } + + public Integer getStatus() { + return this.status; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java new file mode 100644 index 0000000..990d996 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/HttpUtil.java @@ -0,0 +1,86 @@ +package org.dromara.resource.danmi_sms.common; + +import org.apache.commons.codec.digest.DigestUtils; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.URL; +import java.net.URLConnection; + +public class HttpUtil { + public static String createCommonParam(String sid, String token) { + long timestamp = System.currentTimeMillis(); + String sig = DigestUtils.md5Hex(sid + token + timestamp); + return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=1"; + } + + public static String post(String url, String body) { + System.out.println("body:" + System.lineSeparator() + body); + String result = ""; + try { + OutputStreamWriter out = null; + BufferedReader in = null; + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(5000); + conn.setReadTimeout(20000); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + out.write(body); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line = ""; + boolean firstLine = true; + while ((line = in.readLine()) != null) { + if (firstLine) { + firstLine = false; + } else { + result = result + System.lineSeparator(); + } + result = result + line; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public static String postHuiDiao(String url, String body) { + String result = ""; + try { + OutputStreamWriter out = null; + BufferedReader in = null; + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(5000); + conn.setReadTimeout(20000); + out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); + out.write(body); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line = ""; + boolean firstLine = true; + while ((line = in.readLine()) != null) { + if (firstLine) { + firstLine = false; + } else { + result = result + System.lineSeparator(); + } + result = result + line; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + public static String createParamWithTime(String sid, String token, Long timestamp) { + String sig = DigestUtils.md5Hex(sid + token + timestamp); + return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=UTF-8"; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java new file mode 100644 index 0000000..53d777b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/common/SmsDto.java @@ -0,0 +1,51 @@ +package org.dromara.resource.danmi_sms.common; + +import lombok.Data; +import lombok.EqualsAndHashCode; + + +@EqualsAndHashCode +@Data +public class SmsDto { + private Integer unified; + + //@ApiModelProperty("短信签名") + private String sign; + + //@ApiModelProperty("验证码") + private String verification; + + //@ApiModelProperty("充值成功") + private String recharge; + + //@ApiModelProperty("退款成功") + private String refund; + + //@ApiModelProperty("发放成功") + private String giveout; + + //@ApiModelProperty("余额不足") + private String balance; + + //@ApiModelProperty("商家入驻成功,不带密码") + private String merchant; + + //@ApiModelProperty("代理入驻成功,不带密码") + private String agent; + + //@ApiModelProperty("签约提醒") + private String tosign; + + //@ApiModelProperty("充值信息提醒") + private String rechargeInfo; + + //@ApiModelProperty("开票信息提醒") + private String invoce; + + //@ApiModelProperty("灵工线上短信签约提醒") + private String toOnlineSign; + + //@ApiModelProperty("模板信息") + private String templateContent; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java new file mode 100644 index 0000000..2b34bec --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/Config.java @@ -0,0 +1,68 @@ +package org.dromara.resource.danmi_sms.config; + +import lombok.EqualsAndHashCode; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "danmisms") +@EqualsAndHashCode +public class Config { + private String base_url; + + private String account_sid; + + private String auth_token; + + private SmsConfig defalutCode; + + private String account_id; + + public void setBase_url(String base_url) { + this.base_url = base_url; + } + + public void setAccount_sid(String account_sid) { + this.account_sid = account_sid; + } + + public void setAuth_token(String auth_token) { + this.auth_token = auth_token; + } + + public void setDefalutCode(SmsConfig defalutCode) { + this.defalutCode = defalutCode; + } + + public void setAccount_id(String account_id) { + this.account_id = account_id; + } + + protected boolean canEqual(Object other) { + return other instanceof Config; + } + + public String toString() { + return "Config(base_url=" + getBase_url() + ", account_sid=" + getAccount_sid() + ", auth_token=" + getAuth_token() + ", defalutCode=" + getDefalutCode() + ", account_id=" + getAccount_id() + ")"; + } + + public String getBase_url() { + return this.base_url; + } + + public String getAccount_sid() { + return this.account_sid; + } + + public String getAuth_token() { + return this.auth_token; + } + + public SmsConfig getDefalutCode() { + return this.defalutCode; + } + + public String getAccount_id() { + return this.account_id; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java new file mode 100644 index 0000000..0a7b594 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/danmi_sms/config/SmsConfig.java @@ -0,0 +1,48 @@ +package org.dromara.resource.danmi_sms.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode +@Data +public class SmsConfig { + //@ApiModelProperty("短信签名") + private String sign; + + //@ApiModelProperty("验证码") + private String verification; + + //@ApiModelProperty("充值成功") + private String recharge; + + //@ApiModelProperty("退款成功") + private String refund; + + //@ApiModelProperty("发放成功") + private String giveout; + + //@ApiModelProperty("余额不足") + private String balance; + + //@ApiModelProperty("商家入驻成功,不带密码") + private String merchant; + + //@ApiModelProperty("代理入驻成功,不带密码") + private String agent; + + //@ApiModelProperty("签约提醒") + private String tosign; + + //@ApiModelProperty("充值信息提醒") + private String rechargeInfo; + + //@ApiModelProperty("开票信息提醒") + private String invoce; + + //@ApiModelProperty("灵工线上短信签约提醒") + private String toOnlineSign; + + //@ApiModelProperty("模板信息") + private String templateContent; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java new file mode 100644 index 0000000..956219f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusMerchantAgreement.java @@ -0,0 +1,31 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BusMerchantAgreement + * @description + * @create 2024-05-29 16:28 + */ + + + +@Data +public class BusMerchantAgreement implements Serializable { + + //合同编号 + private String no; + + //签约状态(1:签约成功 2:签约失败) + private Integer status; + + //协议链接 + private String fileUrl; + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java new file mode 100644 index 0000000..a966fa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/BusOperatorAgreement.java @@ -0,0 +1,19 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title BusOperatorAgreement + * @description + * @create 2024-05-29 16:34 + */ +@Data +public class BusOperatorAgreement implements Serializable { + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java new file mode 100644 index 0000000..55b9fe9 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/DhqSign.java @@ -0,0 +1,57 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author sunzexing + * @version 1.0 + * @title DhqSignVo + * @description 大鸿签请求实体类 + * @create 2024-05-15 14:57 + */ + +@Data +public class DhqSign implements Serializable { + + //应用ID + private String applicationId; + + + private String launchName; + + //合作账户 ID + private String businessId; + + //发起类型 0-个人 1-企业 + private String launchType; + + //发起用户手机号 + private String launchSubject; + + //发起企业名称(launchType 为 1 企业发 + //起合同时必传) + private String launchEnterpriseName; + + //客户发起时定义的编号 + private String customerOriginationNumber; + + //模板编号 + private String contractModelNum; + + //静默签署企业名 +// private String signEnterpriseName; + + //合同名称 + private String contractName; + + //签署人信息 (json 格式字符串) + private String signatoryInfos; + + private List inputValues; + + private Integer signatureType = 0; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java new file mode 100644 index 0000000..d8fd08b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/MerTaskEnroll.java @@ -0,0 +1,35 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title MerTaskEnroll + * @description + * @create 2024-05-29 15:58 + */ + +@Data +public class MerTaskEnroll implements Serializable { + + + //合同编号 + private String signNo; + + + //任务确认书文件地址 + private String taskConfirmFile; + + + //任务确认书签约状态 0 签署中 1 签署完成 2-拒绝签署 3 解除中 4 解除完成 5 拒绝解除 6-已撤回 7 已过期 + private Integer signStatus; + + + + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java new file mode 100644 index 0000000..ae4c941 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/PcSignatoryDto.java @@ -0,0 +1,33 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/*** + * 大鸿签-签署人 + */ +@Data +class PcSignatoryDto implements Serializable { + + //签署人姓名 + private String userName; + + //签署人电话 + private String userPhone; + + + //企业名称(Type=1 时必传) + private String enterpriseName; + + //签署印章 1 用户手绘章 2 用户模板章 3 + //企业章 4 合同章 5 法人章 + private String signMode; + + // + private Integer signLevel; + //类型 0-个人 1-企业 + private Integer type; + private String signType; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java new file mode 100644 index 0000000..8a1cc4f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java @@ -0,0 +1,50 @@ +package org.dromara.resource.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * OSS对象存储对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oss") +public class SysOss extends TenantEntity { + + /** + * 对象存储主键 + */ + @TableId(value = "oss_id") + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java new file mode 100644 index 0000000..aebc56e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java @@ -0,0 +1,90 @@ +package org.dromara.resource.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 对象存储配置对象 sys_oss_config + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_oss_config") +public class SysOssConfig extends BaseEntity { + + /** + * 主建 + */ + @TableId(value = "oss_config_id") + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + + /** + * 是否https(0否 1是) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java new file mode 100644 index 0000000..30b14de --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSignLog.java @@ -0,0 +1,68 @@ +package org.dromara.resource.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 合同签约日志对象 sys_sign_log + * + * @author LionLi + * @date 2024-05-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_sign_log") +public class SysSignLog extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 业务合同ID + */ + private String bizId; + + /** + * 合同编号 + */ + private String htCode; + + /** + * 第三方业务ID + */ + private String thirdId; + + /** + * 合同类型 + */ + private String htType; + + /** + * 内容 + */ + private String content; + + + private String sendBody; + + private String resultException; + + private String signState; + + private String contractFile; + + private String appId; + + @TableField(exist = false) + private Long createDept; +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java new file mode 100644 index 0000000..54ebbec --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysSms.java @@ -0,0 +1,127 @@ +package org.dromara.resource.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 短信对象 sys_sms + * + * @author sunzexing + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_sms") +public class SysSms extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 搜索值 + */ + @JsonIgnore + @TableField(exist = false) + private String searchValue; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + /** + * 创建者 + */ + @TableField(exist = false) + private Long createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新者 + */ + @TableField(exist = false) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 短信类型 1 登录验证码 2 支付验证码 3 其它 + */ + private String vType; + + /** + * 发送人姓名 + */ + private String vUserName; + + /** + * 发送人ID + */ + private Long iUserId; + + /** + * 发送手机号 + */ + private String vPhone; + + /** + * 验证码 + */ + private String vVerCode; + + /** + * 模版id + */ + private String vTempId; + + /** + * 发送内容 + */ + private String vSendContent; + + /** + * 发送时间 + */ + private Date dtmSendTime; + + /** + * 过期时间 + */ + private Date dtmExpirTime; + + /** + * 是否使用 1 是 0 否 + */ + private Integer isUse; + + /** + * 状态 0 未发送 1 成功 2失败 + */ + private Integer iStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java new file mode 100644 index 0000000..d307869 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkAuth.java @@ -0,0 +1,26 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkAuth + * @description + * @create 2024-05-29 16:39 + */ +@Data +public class UserWorkAuth implements Serializable { + + //合同编号 + private String no; + + //签约文件地址 + private String signFileUrl; + + //签约状态(0:待签约 1:签约中 2:已签约 3:归档失败) + private Integer signStatus; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java new file mode 100644 index 0000000..0a6ffd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/UserWorkerBiz.java @@ -0,0 +1,27 @@ +package org.dromara.resource.domain; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author sunzexing + * @version 1.0 + * @title UserWorkerBiz + * @description + * @create 2024-05-23 14:40 + */ +@Data +public class UserWorkerBiz implements Serializable { + + + private String no; + + private String signFileUrl; + + + private Integer signStatus; + + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java new file mode 100644 index 0000000..0f399db --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssBo.java @@ -0,0 +1,49 @@ +package org.dromara.resource.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.resource.domain.SysOss; + +/** + * OSS对象存储分页查询对象 sys_oss + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOss.class, reverseConvertGenerate = false) +public class SysOssBo extends BaseEntity { + + /** + * ossId + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java new file mode 100644 index 0000000..d3aa801 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysOssConfigBo.java @@ -0,0 +1,111 @@ +package org.dromara.resource.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.resource.domain.SysOssConfig; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +/** + * 对象存储配置业务对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysOssConfig.class, reverseConvertGenerate = false) +public class SysOssConfigBo extends BaseEntity { + + /** + * 主建 + */ + @NotNull(message = "主建不能为空", groups = {EditGroup.class}) + private Long ossConfigId; + + /** + * 配置key + */ + @NotBlank(message = "配置key不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "configKey长度必须介于2和20 之间") + private String configKey; + + /** + * accessKey + */ + @NotBlank(message = "accessKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "accessKey长度必须介于2和100 之间") + private String accessKey; + + /** + * 秘钥 + */ + @NotBlank(message = "secretKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "secretKey长度必须介于2和100 之间") + private String secretKey; + + /** + * 桶名称 + */ + @NotBlank(message = "桶名称不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "bucketName长度必须介于2和100之间") + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + @NotBlank(message = "访问站点不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "endpoint长度必须介于2和100之间") + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 域 + */ + private String region; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String accessPolicy; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java new file mode 100644 index 0000000..b93da2b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/bo/SysSmsBo.java @@ -0,0 +1,98 @@ +package org.dromara.resource.domain.bo; + +import org.dromara.resource.domain.SysSms; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 短信业务对象 sys_sms + * + * @author sunzexing + * @date 2024-03-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSms.class, reverseConvertGenerate = false) +public class SysSmsBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 短信类型 1 登录验证码 2 支付验证码 3 其它 + */ + @NotNull(message = "短信类型 1 登录验证码 2 支付验证码 3 其它不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer iType; + + /** + * 发送人姓名 + */ + @NotBlank(message = "发送人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vUserName; + + /** + * 发送人ID + */ + @NotNull(message = "发送人ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long iUserId; + + /** + * 发送手机号 + */ + @NotBlank(message = "发送手机号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vPhone; + + /** + * 验证码 + */ + @NotBlank(message = "验证码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vVerCode; + + /** + * 模版id + */ + @NotBlank(message = "模版id不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vTempId; + + /** + * 发送内容 + */ + @NotBlank(message = "发送内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String vSendContent; + + /** + * 发送时间 + */ + @NotNull(message = "发送时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date dtmSendTime; + + /** + * 过期时间 + */ + @NotNull(message = "过期时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date dtmExpirTime; + + /** + * 是否使用 1 是 0 否 + */ + @NotNull(message = "是否使用 1 是 0 否不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 状态 0 未发送 1 成功 2失败 + */ + @NotNull(message = "状态 0 未发送 1 成功 2失败不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer iStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java new file mode 100644 index 0000000..33bfd87 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/convert/SysClientVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.resource.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.resource.domain.SysSms; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysClientVoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java new file mode 100644 index 0000000..dc4046f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssConfigVo.java @@ -0,0 +1,96 @@ +package org.dromara.resource.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.resource.domain.SysOssConfig; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 对象存储配置视图对象 sys_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Data +@AutoMapper(target = SysOssConfig.class) +public class SysOssConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主建 + */ + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java new file mode 100644 index 0000000..14d7dc7 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java @@ -0,0 +1,34 @@ +package org.dromara.resource.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 上传对象信息 + * + * @author Michelle.Chung + */ +@Data +public class SysOssUploadVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * URL地址 + */ + private String url; + + /** + * 文件名 + */ + private String fileName; + + /** + * 对象存储主键 + */ + private String ossId; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java new file mode 100644 index 0000000..aa2957b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssVo.java @@ -0,0 +1,72 @@ +package org.dromara.resource.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.resource.domain.SysOss; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * OSS对象存储视图对象 sys_oss + * + * @author Lion Li + */ +@Data +@AutoMapper(target = SysOss.class) +public class SysOssVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 上传人 + */ + private Long createBy; + + /** + * 上传人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 服务商 + */ + private String service; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java new file mode 100644 index 0000000..3f07043 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSignLogVo.java @@ -0,0 +1,68 @@ +package org.dromara.resource.domain.vo; + +import org.dromara.resource.domain.SysSignLog; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 合同签约日志视图对象 sys_sign_log + * + * @author LionLi + * @date 2024-05-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSignLog.class) +public class SysSignLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 业务合同ID + */ + @ExcelProperty(value = "业务合同ID") + private String bizId; + + /** + * 合同编号 + */ + @ExcelProperty(value = "合同编号") + private String htCode; + + /** + * 第三方业务ID + */ + @ExcelProperty(value = "第三方业务ID") + private String thirdId; + + /** + * 合同类型 + */ + @ExcelProperty(value = "合同类型") + private String htType; + + /** + * 内容 + */ + @ExcelProperty(value = "内容") + private String content; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java new file mode 100644 index 0000000..fe2ea50 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysSmsVo.java @@ -0,0 +1,106 @@ +package org.dromara.resource.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.resource.domain.SysSms; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 短信视图对象 sys_sms + * + * @author sunzexing + * @date 2024-03-27 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysSms.class) +public class SysSmsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 短信类型 1 登录验证码 2 支付验证码 3 其它 + */ + @ExcelProperty(value = "短信类型 1 登录验证码 2 支付验证码 3 其它") + private Integer iType; + + /** + * 发送人姓名 + */ + @ExcelProperty(value = "发送人姓名") + private String vUserName; + + /** + * 发送人ID + */ + @ExcelProperty(value = "发送人ID") + private Long iUserId; + + /** + * 发送手机号 + */ + @ExcelProperty(value = "发送手机号") + private String vPhone; + + /** + * 验证码 + */ + @ExcelProperty(value = "验证码") + private String vVerCode; + + /** + * 模版id + */ + @ExcelProperty(value = "模版id") + private String vTempId; + + /** + * 发送内容 + */ + @ExcelProperty(value = "发送内容") + private String vSendContent; + + /** + * 发送时间 + */ + @ExcelProperty(value = "发送时间") + private Date dtmSendTime; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date dtmExpirTime; + + /** + * 是否使用 1 是 0 否 + */ + @ExcelProperty(value = "是否使用 1 是 0 否") + private Integer isUse; + + /** + * 状态 0 未发送 1 成功 2失败 + */ + @ExcelProperty(value = "状态 0 未发送 1 成功 2失败") + private Integer iStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java new file mode 100644 index 0000000..a18b474 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteDhqServiceImpl.java @@ -0,0 +1,64 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSONObject; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.enums.SignType; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.RemoteDhqService; +import org.dromara.resource.api.domain.RemoteDhq; +import org.dromara.resource.domain.DhqSign; +import org.dromara.resource.service.impl.DhqSignServiceImpl; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteDhqServiceImpl + * @description + * @create 2024-05-20 9:55 + */ + + +@DubboService +@Service +public class RemoteDhqServiceImpl implements RemoteDhqService { + + + @Resource + public DhqSignServiceImpl dhqSignService; + + + @DubboReference + private RemoteConfigService remoteConfigService; + @Override + public String becomeSign(RemoteDhq sign, String domain, SignType signType) throws Exception { +// RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); +// +// if(site == null || StringUtils.isEmpty(site.getSignConfig())){ +// throw new Exception("未找到该域名的大鸿签签约配置信息"); +// } +// +// JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); +// +// sign.setApplicationId(signConfig.getString("appId")); +// sign.setBusinessId(signConfig.getString("businessId")); +// +// if(StringUtils.isEmpty(sign.getContractModelNum())){ +// if(1 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_pro")); +// }else if(2 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_conf")); +// } +// } + DhqSign dhqSign = BeanUtil.copyProperties(sign,DhqSign.class); + + return this.dhqSignService.becomeSign(dhqSign); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java new file mode 100644 index 0000000..5516cfd --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java @@ -0,0 +1,73 @@ +package org.dromara.resource.dubbo; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.service.ISysOssService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 文件请求处理 + * + * @author Lion Li + */ +@Slf4j +@Primary +@Service +@RequiredArgsConstructor +@DubboService +public class RemoteFileServiceImpl implements RemoteFileService { + + private final ISysOssService sysOssService; + + /** + * 文件上传请求 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException { + try { + String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix, contentType); + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalFilename); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + RemoteFile sysFile = new RemoteFile(); + sysFile.setOssId(oss.getOssId()); + sysFile.setName(uploadResult.getFilename()); + sysFile.setUrl(uploadResult.getUrl()); + return sysFile; + } catch (Exception e) { + log.error("上传文件失败", e); + throw new ServiceException("上传文件失败"); + } + } + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + @Override + public String selectUrlByIds(String ossIds) { + return sysOssService.selectUrlByIds(ossIds); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java new file mode 100644 index 0000000..66f5570 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteJzqServiceImpl.java @@ -0,0 +1,109 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.SignType; +import org.dromara.resource.api.RemoteJzqService; +import org.dromara.resource.api.domain.RemoteJzq; +import org.dromara.resource.junziqian.common.bean.sign.JzqSign; +import org.dromara.resource.service.impl.JzqSignServiceImpl; +import org.dromara.system.api.RemoteConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.File; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteJzqServiceImpl + * @description + * @create 2024-05-20 9:55 + */ + + +@DubboService +@Service +public class RemoteJzqServiceImpl implements RemoteJzqService { + + + private static final Logger log = LoggerFactory.getLogger(RemoteJzqServiceImpl.class); + @Resource + public JzqSignServiceImpl JzqSignService; + + + @DubboReference + private RemoteConfigService remoteConfigService; + + public String becomeSign(RemoteJzq sign, String domain, SignType signType) { +// RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); +// +// if(site == null || StringUtils.isEmpty(site.getSignConfig())){ +// throw new Exception("未找到该域名的大鸿签签约配置信息"); +// } +// +// JSONObject signConfig = JSONObject.parseObject(site.getSignConfig()); +// +// sign.setApplicationId(signConfig.getString("appId")); +// sign.setBusinessId(signConfig.getString("businessId")); +// +// if(StringUtils.isEmpty(sign.getContractModelNum())){ +// if(1 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_pro")); +// }else if(2 == signType.getId()){ +// sign.setContractModelNum(signConfig.getString("user_worker_conf")); +// } +// } + JzqSign JzqSign = BeanUtil.copyProperties(sign,JzqSign.class); + return this.JzqSignService.becomeSign(JzqSign); + } + + + public String link(String applyNo, String fullName, String identityCard, int identityType) { + return this.JzqSignService.link(applyNo,fullName,identityCard,identityType); + } + + + public String bankThreeVerify(String name, String identityCard, String cardNo) { + return JzqSignService.bankThreeVerify(name,identityCard,cardNo); + } + + public String userValid(String name ,String identityCard){ + return JzqSignService.userValid(name,identityCard); + } + + + public String ocrIdentity(String file, Integer front) { + return JzqSignService.ocrIdentity(file,front); + } + + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone){ + return JzqSignService.bankFourVerify(name,identityCard,cardNo,mobilePhone); + } + + public String ocrBank(File file){ + return JzqSignService.ocrBank(file); + } + + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom){ + return JzqSignService.startH5Face(orderNo,name,identityCard,backUrl,startFrom); + } + + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile){ + return JzqSignService.organizationCreate(emailOrMobile,name,organizationType,identificationType,organizationRegNo,organizationRegImg,legalName,legalIdentityCard,legalMobile); + } + + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse){ + return JzqSignService.cloudCertiPerInfo(fullName,identityCard,idenFront,idenReverse); + } + + public String linkFile(String applyNo){ + return JzqSignService.linkFile(applyNo); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java new file mode 100644 index 0000000..81badff --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMailServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.resource.dubbo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.resource.api.RemoteMailService; +import org.springframework.stereotype.Service; + +/** + * 邮件服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteMailServiceImpl implements RemoteMailService { + + /** + * 发送邮件 + * + * @param to 接收人 + * @param subject 标题 + * @param text 内容 + */ + public void send(String to, String subject, String text) throws ServiceException { + MailUtils.sendText(to, subject, text); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java new file mode 100644 index 0000000..d8f6def --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteMessageServiceImpl.java @@ -0,0 +1,42 @@ +package org.dromara.resource.dubbo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.resource.api.RemoteMessageService; +import org.springframework.stereotype.Service; + +/** + * 短信服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteMessageServiceImpl implements RemoteMessageService { + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param message 消息文本 + */ + @Override + public void sendMessage(Long sessionKey, String message) { + WebSocketUtils.sendMessage(sessionKey, message); + } + + /** + * 发布订阅的消息(群发) + * + * @param message 消息内容 + */ + @Override + public void publishAll(String message) { + WebSocketUtils.publishAll(message); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java new file mode 100644 index 0000000..4aefcdc --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java @@ -0,0 +1,153 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sms.config.SmsProperties; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.resource.danmi_sms.DMSmsUtils; +import org.dromara.resource.danmi_sms.common.DMSmsResult; +import org.dromara.resource.service.ISysSmsService; +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.mapper.SysSmsMapper; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 短信服务 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSmsServiceImpl implements RemoteSmsService { + + + @Resource + public ISysSmsService sysSmsService; + + private final SysSmsMapper baseMapper; + + @Resource + private SmsProperties smsProperties; + + @DubboReference + private RemoteConfigService remoteConfigService; + + @Autowired + private DMSmsUtils dmSmsUtils; + + /** + * 发送短信 + * + * @param phones 电话号(多个逗号分割) + * @param templateId 模板id + * @param param 模板对应参数 + */ + public RemoteSms send(String phones, String templateId, LinkedHashMap param) throws ServiceException { + SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); + SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, param); + RemoteSms sysSms = new RemoteSms(); + sysSms.setIsSuccess(smsResponse.isSuccess()); + sysSms.setMessage(smsResponse.getMessage()); + sysSms.setResponse(JsonUtils.toJsonString(smsResponse)); + return sysSms; + } + + + + @Override + public Boolean sendSmsCode(SmsType smsType, String phonenumber, LinkedHashMap param, Map smsConfig) { + return this.sysSmsService.sendSmsCode(smsType,phonenumber,param,smsConfig); + + } + + public RemoteSms send(String domain, String phone, SmsType smsType, LinkedHashMap param) throws ServiceException { + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + if(site == null){ + throw new ServiceException("不支持短信"); + } + if(site.getOpenSms() != 1 || StringUtils.isBlank(site.getSmsConfig())){ + throw new ServiceException("未开通短信"); + } + JSONObject smsConfig = JSONObject.parseObject(site.getSmsConfig()); + + + DMSmsResult result = this.dmSmsUtils.verificationCode(site.getSmsConfig(), phone, param.get("code")); + if(!result.isSuccess()){ + log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phone, result.getErrorMsg()); + } + + + java.util.Date currentDate = DateUtil.date().toJdkDate(); +// SmsBlend smsBlend = null; +// SmsResponse smsResponse = null; +// String smsFacType = "tencent"; +// if(StringUtils.isNotEmpty(smsProperties.getType())){ +// smsFacType = smsProperties.getType(); +// } +// switch (smsFacType){ +// case "aliyun": +// smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA, AlibabaConfig.builder().accessKeyId(smsConfig.getString("accid_aliyun")) +// .accessKeySecret(smsConfig.getString("acckey_aliyun")).signature(smsConfig.getString("sign_aliyun")).build()); +// smsResponse = smsBlend.sendMessage(phone, smsConfig.getString(smsType.getTempId()+"_aliyun"), param); +// break; +// case "tencent": +// smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT,TencentConfig.builder().sdkAppId(smsConfig.getString("appid")).accessKeyId(smsConfig.getString("accid")) +// .accessKeySecret(smsConfig.getString("acckey")).signature(smsConfig.getString("sign")).build()); +// smsResponse = smsBlend.sendMessage(phone, smsConfig.getString(smsType.getTempId()), param); +// break; +// } +// SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT,TencentConfig.builder().sdkAppId(smsConfig.getString("appid")).accessKeyId(smsConfig.getString("accid")) +// .accessKeySecret(smsConfig.getString("acckey")).signature(smsConfig.getString("sign")).build()); +// SmsResponse smsResponse = smsBlend.sendMessage(phone, smsConfig.getString(smsType.getTempId()), param); +// if (!"OK".equals(smsResponse.getCode())) { +// log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phone, smsResponse); +// } + SysSms smsEntity = new SysSms(); + smsEntity.setIUserId(LoginHelper.getUserId()); + smsEntity.setVTempId(smsType.getTempId()); + smsEntity.setDtmSendTime(currentDate); + smsEntity.setVType(smsType.getDesc()); + String msg = smsConfig.getString("templateContent"); + if(StringUtils.isNotBlank(msg)){ + Iterator paramIter = param.entrySet().iterator(); + int paramIndex = 1; + while(paramIter.hasNext()) { + Map.Entry entry = (Map.Entry)paramIter.next(); + msg = msg.replace("{"+paramIndex+"}",entry.getValue()); + paramIndex++; + } + smsEntity.setVSendContent(msg); + } + + smsEntity.setCreateTime(currentDate); + smsEntity.setVPhone(phone); + smsEntity.setDtmExpirTime(DateUtil.offsetMinute(currentDate,smsType.getExpireTime())); + this.baseMapper.insert(smsEntity); + return MapstructUtils.convert(smsEntity,RemoteSms.class); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java new file mode 100644 index 0000000..f73f823 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteUserWorkerServiceImpl.java @@ -0,0 +1,224 @@ +package org.dromara.resource.dubbo; + + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ZipUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.payment.api.worker.RemoteUserWokerService; +import org.dromara.payment.api.worker.domain.RemoteResultZip; +import org.dromara.payment.api.worker.domain.RemoteUserWorkerZipVo; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.service.ISysOssService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteUserWorkerServiceImpl + * @description + * @create 2024-05-06 18:09 + */ +@Slf4j +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteUserWorkerServiceImpl implements RemoteUserWokerService { + + @Resource + private ISysOssService sysOssService; + + @Override + public byte[] downLoadSigleSfzZip(RemoteUserWorkerZipVo vo) throws Exception { + OssClient storage = OssFactory.instance(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + if(StringUtils.isNotEmpty(vo.getCardPositive())){ + paths.add(vo.getWorkName()+vo.getWorkId()+"_正面."+StringUtils.getDomainSuffix(vo.getCardPositive())); + ins.add(storage.getObjectContent(vo.getCardPositive())); + } + if(StringUtils.isNotEmpty(vo.getCardBack())){ + paths.add(vo.getWorkName()+vo.getWorkId()+"_反面."+StringUtils.getDomainSuffix(vo.getCardBack())); + ins.add(storage.getObjectContent(vo.getCardBack())); + } + + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); + byte[] data = outputStream.toByteArray(); + return data; + } + + @Override + public byte[] downLoadInvZip(List list) throws Exception { + OssClient storage = OssFactory.instance(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list) { + if(StringUtils.isNotEmpty(vo.getCardPositive())){ + paths.add("发票编号_"+vo.getInvNo()+StringUtils.getDomainSuffix(vo.getInvPic())); + ins.add(storage.getObjectContent(vo.getInvPic())); + } + } + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); + byte[] data = outputStream.toByteArray(); + return data; + + } + + @Override + public RemoteResultZip createWorkerSfzZip(List list) throws Exception{ + + OssClient storage = OssFactory.instance(); +// String zipId = IdUtil.fastUUID().toString(); +// java.io.File zipFile = new java.io.File(zipId+".zip"); +// InputStream zipInputStream = null; + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + String fileId = IdUtil.getSnowflakeNextIdStr()+".zip"; + + try{ + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list) { + try { + if (StringUtils.isNotEmpty(vo.getCardPositive())) { + paths.add(vo.getWorkName() + vo.getWorkId() + "_正面." + StringUtils.getDomainSuffix(vo.getCardPositive())); + ins.add(storage.getObjectContent(vo.getCardPositive())); + } + if (StringUtils.isNotEmpty(vo.getCardBack())) { + paths.add(vo.getWorkName() + vo.getWorkId() + "_反面." + StringUtils.getDomainSuffix(vo.getCardBack())); + ins.add(storage.getObjectContent(vo.getCardBack())); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("生成身份证图片信息失败,自雇者ID{}", vo.getWorkId()); + } + } + + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); +// InputStream zipInputstream = new FileInputStream(zipFile); + UploadResult uploadResult = storage.upload(outputStream.toByteArray(),fileId , "application/zip"); + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(".zip"); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(fileId); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + + RemoteResultZip rrz = new RemoteResultZip(); + rrz.setOssId(oss.getOssId()); + rrz.setUrl(uploadResult.getUrl()); + + return rrz; + + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } + + + /*** + * 合同信息 + * @param list + * @return + * @throws Exception + */ + @Override + public RemoteResultZip createWorkerHtZip(List list) throws Exception { + + OssClient storage = OssFactory.instance(); +// String zipId = IdUtil.fastUUID().toString(); +// java.io.File zipFile = new java.io.File(zipId+".zip"); +// InputStream zipInputStream = null; + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + String fileId = IdUtil.getSnowflakeNextIdStr()+".zip"; + try{ + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list){ + if(StringUtils.isNotEmpty(vo.getHtUrl())){ + paths.add(vo.getWorkName()+vo.getWorkId()+"_合同."+StringUtils.getDomainSuffix(vo.getHtUrl())); + ins.add(storage.getObjectContent(vo.getHtUrl())); + } + } + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); +// InputStream zipInputstream = new FileInputStream(zipFile); +// UploadResult uploadResult = storage.upload(zipInputstream, zipId+".zip", "application/zip"); + UploadResult uploadResult = storage.upload(outputStream.toByteArray(),fileId , "application/zip"); + + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(".zip"); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(uploadResult.getFilename()); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + RemoteResultZip rrz = new RemoteResultZip(); + rrz.setOssId(oss.getOssId()); + rrz.setUrl(uploadResult.getUrl()); + return rrz; + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } + + @Override + public RemoteResultZip createWorkerPayCerZip(List list) throws Exception { + + OssClient storage = OssFactory.instance(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + String fileId = IdUtil.getSnowflakeNextIdStr()+".zip"; + try{ + List paths = new ArrayList<>(); + List ins = new ArrayList<>(); + for(RemoteUserWorkerZipVo vo: list){ + if(StringUtils.isNotEmpty(vo.getPayReceipt())){ + paths.add(vo.getWorkName()+vo.getBusNo()+"_凭证."+StringUtils.getDomainSuffix(vo.getPayReceipt())); + ins.add(storage.getObjectContent(vo.getPayReceipt())); + } + } + + ZipUtil.zip(outputStream,paths.toArray(new String[]{}),ins.toArray(new InputStream[]{})); +// InputStream zipInputstream = new FileInputStream(zipFile); +// UploadResult uploadResult = storage.upload(zipInputstream, zipId+".zip", "application/zip"); + UploadResult uploadResult = storage.upload(outputStream.toByteArray(),fileId , "application/zip"); + // 保存文件信息 + SysOssBo oss = new SysOssBo(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(".zip"); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(uploadResult.getFilename()); + oss.setService(storage.getConfigKey()); + sysOssService.insertByBo(oss); + RemoteResultZip rrz = new RemoteResultZip(); + rrz.setOssId(oss.getOssId()); + rrz.setUrl(uploadResult.getUrl()); + return rrz; + }catch (Exception e){ + e.printStackTrace(); + throw e; + } + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java new file mode 100644 index 0000000..5f6e3df --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWeiXinServiceImpl.java @@ -0,0 +1,118 @@ +package org.dromara.resource.dubbo; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.net.URLEncodeUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.mapper.SysSmsMapper; +import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; +import org.dromara.sms4j.core.factory.SmsFactory; +import org.dromara.sms4j.provider.enumerate.SupplierType; +import org.dromara.sms4j.tencent.config.TencentConfig; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 微信服务 + * + * @author Lion Li + */ +@Slf4j +//@RequiredArgsConstructor +@Service +@DubboService +public class RemoteWeiXinServiceImpl implements RemoteWeiXinService { + + @Resource(name="remoteFileServiceImpl") + private RemoteFileService remoteFileService; + + @DubboReference + private RemoteConfigService remoteConfigService; + + @Override + public String genPubAuthQrcode(String domain,String redirectUri) throws ServiceException { + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + if(site == null || StringUtils.isBlank(site.getWxPubConfig())){ + throw new ServiceException("不支持微信登录"); + } + JSONObject weixinConfig = JSONObject.parseObject(site.getWxPubConfig()); + String authUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+weixinConfig.getString("appid")+"&redirect_uri="+ URLEncodeUtil.encodeAll(redirectUri) +"&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; + byte[] data = null; + String format = "png"; + try { + Map hints = new HashMap<>(3); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + hints.put(EncodeHintType.MARGIN, 0); + + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode(authUrl, BarcodeFormat.QR_CODE, 300, 300,hints); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, format, outStream); + data = outStream.toByteArray(); + } catch (WriterException e) { + throw new ServiceException("二维码生成失败"); + } catch (IOException e) { + throw new ServiceException("二维码生成失败"); + } + String fileName = UUID.fastUUID().toString() + "." + format; + RemoteFile oss = remoteFileService.upload(fileName, fileName, "image/png", data); + return oss.getUrl(); + } + + @Override + public String getOpenId(String domain, String code) { + RemoteSysUnitDomainVo site = remoteConfigService.queryByDomainName(domain); + if(site == null || StringUtils.isBlank(site.getWxPubConfig())){ + throw new ServiceException("不支持微信登录"); + } + try { + JSONObject weixinConfig = JSONObject.parseObject(site.getWxPubConfig()); + String json = HttpUtil.get("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+weixinConfig.getString("appid")+"&secret="+weixinConfig.getString("appkey")+"&code="+code+"&grant_type=authorization_code", StandardCharsets.UTF_8); + log.info("获取授权用户的微信openid:("+weixinConfig.getString("appid")+")"+json); + JSONObject rtn = JSONObject.parseObject(json); + if(rtn.containsKey("openid")){ + return rtn.getString("openid"); + } + } catch (Exception e) { + log.error("获取授权用户的微信openid出错:("+domain+","+code+")",e); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java new file mode 100644 index 0000000..e77351e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/CommonUtil.java @@ -0,0 +1,183 @@ +package org.dromara.resource.junziqian.common; + +import org.apache.commons.lang3.StringUtils; + + +/** + * 基本工具类 + * @author yfx + * + */ +public abstract class CommonUtil { + + /** + * 去空,null->'' + * + * @param str + * @return + */ + public static String trim(String str, String def) { + if (str == null || "null".equals(str.trim()) || "".equals(str.trim())) { + return def; + } else { + return str.trim(); + } + } + + /** + * 去空,null->'' + * + * @param str + * @return + */ + public static String trim(String str) { + if (str == null || "null".equals(str.trim())) { + return ""; + } else { + return str.trim(); + } + } + + /** + * 去空,支持sql(发现为空时返回null) + * + * @param str + * @return + */ + public static String trimForSql(String str) { + if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) { + return null; + } else { + return str.trim(); + } + } + + /** + * 默认转换 + * + * @param obj + * @param cla + * @return + */ + @SuppressWarnings("unchecked") + public static T parVal(Object obj, Class cla) { + if (cla.equals(String.class)) { + if (obj == null || "".equals(obj + "") || "null".equals(obj)) { + return (T) ""; + } else { + return (T) (obj + ""); + } + } else { + try { + if (obj == null) + return null; + if (cla.equals(Integer.class)) + return (T) Integer.valueOf(obj + ""); + if (cla.equals(Long.class)) + return (T) Long.valueOf(obj + ""); + if (cla.equals(Float.class)) + return (T) Float.valueOf(obj + ""); + if (cla.equals(Double.class)) + return (T) Double.valueOf(obj + ""); + if (cla.equals(Boolean.class)) + return (T) Boolean.valueOf(obj + ""); + return (T) obj; + } catch (Exception e) { + throw new RuntimeException("CommonUtil.parVal error|obj:" + obj+ ",class:" + cla); + } + } + } + + /** + * 不返回错误的转换 + * + * @param obj + * @param cla + * @return + */ + public static T parValNoErr(Object obj, Class cla) { + try { + return parVal(obj, cla); + } catch (Exception e) { + return null; + } + } + + /** + * 不返回错误的转换,为空或异常时返回默认值 + * @param obj + * @param cla + * @param t + * @return + */ + public static T parValNoErrDef(Object obj, Class cla, T t) { + try { + T t1 = parVal(obj, cla); + if (t1 == null || (cla.equals(String.class) && "".equals(t1))) { + return t; + } + return t1; + } catch (Exception e) { + return t; + } + } + + /** + * 补位数据 ,前补0 + * @param src + * @param length + * @return + */ + public static String conver0(Object src, int length) { + if(src instanceof Number){ + return String.format("%0"+length+"d",src); + }else if(src instanceof String){ + String str1=((String)src); + if(str1.length()num) { + start = str.substring(0, a); + end = str.substring(length-b); + le = length-num; + } + for (int i = 0; i < le; i++) { + temp+="*"; + } + return start+temp+end; + } + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java new file mode 100644 index 0000000..fae5119 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/JzqUtils.java @@ -0,0 +1,614 @@ +package org.dromara.resource.junziqian.common; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.dromara.resource.junziqian.common.bean.sign.JzqSign; +import org.dromara.resource.junziqian.common.http.HttpClientUtils; +import org.junit.Assert; +import org.junit.Before; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Base64; +import java.util.IdentityHashMap; +import java.util.Map; +@Slf4j +@Component +public class JzqUtils { + @Value("${junziqian.Services_URL}") + private String servicesUrl; + + @Value("${junziqian.AppSecret}") + private String appSecret; + + @Value("${junziqian.AppKey}") + private String appKey; + //请求的body内参数 + Map bodyParams; + + @Before + public void initParams() { + Assert.assertTrue("APP_KEY不能为空", StringUtils.isNotBlank(appKey)); + Assert.assertTrue("APP_SECRET不能为空", StringUtils.isNotBlank(appSecret)); + log.warn("测试前请确认APP_KEY,APP_SECRET,LOCAL_URL等配置是否正确"); + log.info("APP_KEY:" + appKey); + log.info("APP_SECRET:" + appSecret); + log.info("SERVICE_URL:" + servicesUrl); + long ts = System.currentTimeMillis(); + String nonce = DigestUtils.md5Hex(System.currentTimeMillis() + ""); + String sign = DigestUtils.sha256Hex("nonce" + nonce + "ts" + ts + "app_key" + appKey + "app_secret" + appSecret); + bodyParams = new IdentityHashMap<>(); + bodyParams.put("ts", ts); + bodyParams.put("app_key", appKey); + bodyParams.put("sign", sign); + bodyParams.put("nonce", nonce);//这只只是为了生成一个随机值 + } + + //个人信息二要素校验 + public String userValid(String name ,String identityCard){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/userValid"; + params.put("name",name); + params.put("identityCard",identityCard); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //身份证识别 + public String ocrIdentity(String file, Integer front){ + initParams(); + // 将文件对象放入参数中 + Map params = bodyParams; + // 解码 Base64 字符串为字节数组 + byte[] fileBytes = Base64.getDecoder().decode(file); + + // 创建临时文件 + File tempFile = null; + try { + Path tempFilePath = Files.createTempFile("ocrIdentity", ".jpg"); + tempFile = tempFilePath.toFile(); + + // 将字节数组写入临时文件 + try (FileOutputStream fos = new FileOutputStream(tempFile)) { + fos.write(fileBytes); + } + + + + String url = servicesUrl + "/v2/ocr/ocrIdentity"; + + + params.put("file", tempFile); + params.put("front", front); + + // 发送 HTTP 请求 + return HttpClientUtils.init().getPost(url, null, params, true); + } catch (IOException e) { + log.error("文件处理失败: " + e.getMessage(), e); + throw new RuntimeException("文件处理失败", e); + } finally { + // 删除临时文件 + if (tempFile != null && tempFile.exists()) { + tempFile.delete(); + } + } + } + + //银行卡识别 + public String ocrBank(File file){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrBank"; + params.put("file",file); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //营业执照识别 + public ResultInfo ocrBusinessLic(File file){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrBusinessLic"; + params.put("file",file); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //H5人脸识别 + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom){ + initParams(); + log.info("startH5Face:"+orderNo+","+name+","+identityCard+","+backUrl+","+startFrom+"$$$$$$$$$$$$$"); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/startH5Face"; + params.put("orderNo",orderNo); + params.put("name",name); + params.put("identityCard",identityCard); + params.put("backUrl",backUrl); + params.put("startFrom",startFrom); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //银行三要素认证 + public String bankThreeVerify(String name ,String identityCard,String cardNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/bankThreeVerify"; + params.put("name",name); + params.put("identityCard",identityCard); + params.put("cardNo",cardNo); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //银行四要素认证 + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/bankThreeVerify"; + params.put("name",name); + params.put("identityCard",identityCard); + params.put("cardNo",cardNo); + params.put("mobilePhone",mobilePhone); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //运营商三要素校验 + public ResultInfo operatorsThreeVerify(String name ,String identityCard,String mobile){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/operatorsThreeVerify"; + params.put("name",name); + params.put("identityCard",identityCard); + params.put("mobile",mobile); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业基本信息核验 + public ResultInfo enterpriseInfoMatch(String enterpriseName,String identityNo,String legalPersonName){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/enterpriseInfoMatch"; + params.put("enterpriseName",enterpriseName); + params.put("identityNo",identityNo); + params.put("legalPersonName",legalPersonName); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业工商四要素核验 + public ResultInfo entFourVerify(String entName,String bizLic,String name,String identityCard){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/auth/entFourVerify"; + params.put("entName",entName); + params.put("bizLic",bizLic); + params.put("name",name); + params.put("identityCard",identityCard); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //手写对比度 + public ResultInfo ocrPic(String file,String text){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrPic"; + params.put("file",file); + if (!ObjectUtils.isEmpty(text)){ + params.put("text",text); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //获取签约链接 + public String link(String applyNo,String fullName,String identityCard,int identityType){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/link"; + params.put("applyNo",applyNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("identityType",identityType); + + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //获取签约链接(短连接) + public ResultInfo linkNew(String applyNo,String fullName,String identityCard,int identityType,int viewMode,int useCustomDomain,String backUrl){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/linkNew"; + params.put("applyNo",applyNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("identityType",identityType); + if (!ObjectUtils.isEmpty(viewMode)){ + params.put("viewMode",viewMode); + } + if (!ObjectUtils.isEmpty(useCustomDomain)){ + params.put("useCustomDomain",useCustomDomain); + } + if (!ObjectUtils.isEmpty(backUrl)){ + params.put("backUrl",backUrl); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //短信验证码 + public ResultInfo smsVerify(String target){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/ocr/ocrPic"; + params.put("target",target); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业实名认证上传 + public ResultInfo organizationCreate(String emailOrMobile, String name, int organizationType, int identificationType, + String organizationRegNo, String organizationRegImg, String legalName, + String legalIdentityCard, String legalMobile, String legalIdentityFrontImg, + String legalIdentityBackImg, String signImg, String address, String authorizeName, + String authorizeCard, String authorizeMobilePhone, String organizationCode, + String organizationCodeImg, String taxCertificateImg, String signApplication, + String notifyUrl){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/organizationCreate"; + params.put("emailOrMobile",emailOrMobile); + params.put("name",name); + params.put("organizationType",organizationType); + params.put("identificationType",identificationType); + params.put("organizationRegNo",organizationRegNo); + params.put("organizationRegImg",organizationRegImg); + params.put("legalName",legalName); + if(!ObjectUtils.isEmpty(legalIdentityCard)){ + params.put("legalIdentityCard",legalIdentityCard); + } + if(!ObjectUtils.isEmpty(legalMobile)){ + params.put("legalMobile",legalMobile); + } + if(!ObjectUtils.isEmpty(legalIdentityFrontImg)){ + params.put("legalIdentityFrontImg",legalIdentityFrontImg); + } + if(!ObjectUtils.isEmpty(legalIdentityBackImg)){ + params.put("legalIdentityBackImg",legalIdentityBackImg); + } + if(!ObjectUtils.isEmpty(signImg)){ + params.put("signImg",signImg); + } + if(!ObjectUtils.isEmpty(address)){ + params.put("address",address); + } + if(!ObjectUtils.isEmpty(authorizeName)){ + params.put("authorizeName",authorizeName); + } + if(!ObjectUtils.isEmpty(authorizeCard)){ + params.put("authorizeCard",authorizeCard); + } + if(!ObjectUtils.isEmpty(authorizeMobilePhone)){ + params.put("authorizeMobilePhone",authorizeMobilePhone); + } + if(!ObjectUtils.isEmpty(organizationCode)){ + params.put("organizationCode",organizationCode); + } + if(!ObjectUtils.isEmpty(organizationCodeImg)){ + params.put("organizationCodeImg",organizationCodeImg); + } + if(!ObjectUtils.isEmpty(taxCertificateImg)){ + params.put("taxCertificateImg",taxCertificateImg); + } + if(!ObjectUtils.isEmpty(signApplication)){ + params.put("signApplication",signApplication); + } + if (!ObjectUtils.isEmpty(notifyUrl)){ + params.put("notifyUrl",notifyUrl); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业实名认证重传 + public ResultInfo organizationReapply(String emailOrMobile, String name, int organizationType, int identificationType, + String organizationRegNo, byte[] organizationRegImg, String legalName, + String legalIdentityCard, String legalMobile, byte[] legalIdentityFrontImg, + byte[] legalIdentityBackImg, byte[] signImg, String address, + String authorizeName, String authorizeCard, String authorizeMobilePhone, + String organizationCode, byte[] organizationCodeImg, byte[] taxCertificateImg, + byte[] signApplication){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/organizationReapply"; + params.put("emailOrMobile",emailOrMobile); + params.put("name",name); + params.put("organizationType",organizationType); + params.put("identificationType",identificationType); + params.put("organizationRegNo",organizationRegNo); + params.put("organizationRegImg",organizationRegImg); + params.put("legalName",legalName); + if(!ObjectUtils.isEmpty(legalIdentityCard)){ + params.put("legalIdentityCard",legalIdentityCard); + } + if(!ObjectUtils.isEmpty(legalMobile)){ + params.put("legalMobile",legalMobile); + } + if(!ObjectUtils.isEmpty(legalIdentityFrontImg)){ + params.put("legalIdentityFrontImg",legalIdentityFrontImg); + } + if(!ObjectUtils.isEmpty(legalIdentityBackImg)){ + params.put("legalIdentityBackImg",legalIdentityBackImg); + } + if(!ObjectUtils.isEmpty(signImg)){ + params.put("signImg",signImg); + } + if(!ObjectUtils.isEmpty(address)){ + params.put("address",address); + } + if(!ObjectUtils.isEmpty(authorizeName)){ + params.put("authorizeName",authorizeName); + } + if(!ObjectUtils.isEmpty(authorizeCard)){ + params.put("authorizeCard",authorizeCard); + } + if(!ObjectUtils.isEmpty(authorizeMobilePhone)){ + params.put("authorizeMobilePhone",authorizeMobilePhone); + } + if(!ObjectUtils.isEmpty(organizationCode)){ + params.put("organizationCode",organizationCode); + } + if(!ObjectUtils.isEmpty(organizationCodeImg)){ + params.put("organizationCodeImg",organizationCodeImg); + } + if(!ObjectUtils.isEmpty(taxCertificateImg)){ + params.put("taxCertificateImg",taxCertificateImg); + } + if(!ObjectUtils.isEmpty(signApplication)){ + params.put("signApplication",signApplication); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + + } + //SaaS_API发起 文件上传 + public ResultInfo link(File file){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/link"; + params.put("file",file); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //SaaS_API 文件发起 + public ResultInfo link(File file,File attachFile,String backUrl,JSONArray signatories){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/link"; + params.put("file",file); + if(ObjectUtils.isEmpty(attachFile)){ + params.put("attachFile",attachFile); + } + if(!ObjectUtils.isEmpty(backUrl)){ + params.put("backUrl",backUrl); + } + if(!ObjectUtils.isEmpty(signatories)){ + params.put("signatories",signatories); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //获取合同编号 + public ResultInfo applyNo(String fileKey){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/applyNo"; + params.put("fileKey",fileKey); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //SaaS文件下载 + public ResultInfo link(String fileKey,String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/multiFile/applySign/download/link"; + params.put("fileKey",fileKey); + params.put("applyNo",applyNo); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //发送签约提醒 + public ResultInfo sendSigningReminder(String applyNo,String businessNo,String fullName,String identityCard,int idenntityType,int signNotifyType,String customizeName){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/notify"; + params.put("applyNo",applyNo); + params.put("businessNo",businessNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("idenntityType",idenntityType); + params.put("signNotifyType",signNotifyType); + if(!ObjectUtils.isEmpty(customizeName)){ + params.put("customizeName",customizeName); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + // 签约发起-模板类API + public String applySign(JzqSign request) { + initParams(); + Map params = bodyParams; + + + + String url = servicesUrl + "/v2/sign/applySign"; + params.put("contractName", request.getContractName()); + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(request.getSignatories().get(0)); + jsonArray.add(request.getSignatories().get(1)); + + params.put("signatories", jsonArray.toString()); + params.put("serverCa", request.getServerCa()); + params.put("dealType", request.getDealType()); + params.put("templateNo", request.getTemplateNo()); + if (!ObjectUtils.isEmpty(request.getTemplateParams())) { + params.put("templateParams", request.getTemplateParams()); + } + params.put("fileType", request.getFileType()); + if (!ObjectUtils.isEmpty(request.getAddPage())) { + params.put("addPage", request.getAddPage()); + } + if (!ObjectUtils.isEmpty(request.getPositionType())) { + params.put("positionType", request.getPositionType()); + } + if (!ObjectUtils.isEmpty(request.getFaceThreshold())) { + params.put("faceThreshold", request.getFaceThreshold()); + } +// if (!ObjectUtils.isEmpty(request.getOrderFlag())) { +// params.put("orderFlag", request.getOrderFlag()); +// } +// if (!ObjectUtils.isEmpty(request.getSequenceInfo())) { +// params.put("sequenceInfo", request.getSequenceInfo()); +// } + if (!ObjectUtils.isEmpty(request.getNotifyUrl())) { + params.put("notifyUrl", request.getNotifyUrl()); + } +// if (!ObjectUtils.isEmpty(request.getNoEbqSign())) { +// params.put("noEbqSign", request.getNoEbqSign()); +// } +// if (!ObjectUtils.isEmpty(request.getAttachFiles())) { +// params.put("attachFiles", request.getAttachFiles()); +// } +// if (!ObjectUtils.isEmpty(request.getNeedQifengSign())) { +// params.put("needQifengSign", request.getNeedQifengSign()); +// } +// if (!ObjectUtils.isEmpty(request.getNoBorderSign())) { +// params.put("noBorderSign", request.getNoBorderSign()); +// } + + return HttpClientUtils.init().getPost(url, null, params, true); + } + //撤销签约合同 + public ResultInfo cancel(String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/cancel"; + params.put("applyNo",applyNo); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //撤销批量签约发起 + public ResultInfo batchSignCancel(String businessNo,int part,String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/batchSignCancel"; + params.put("businessNo",businessNo); + if(!ObjectUtils.isEmpty(part)){ + params.put("part",part); + } + if(!ObjectUtils.isEmpty(applyNo)){ + params.put("applyNo",applyNo); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //签约状态查询 + public ResultInfo status(String applyNo,String fullName,String identityCard,String identityType){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/status"; + params.put("applyNo",applyNo); + if(!ObjectUtils.isEmpty(fullName)){ + params.put("fullName",fullName); + } + if(!ObjectUtils.isEmpty(identityCard)){ + params.put("identityCard",identityCard); + } + if(!ObjectUtils.isEmpty(identityType)){ + params.put("identityType",identityType); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //签约状态及时间查询 + public ResultInfo info(String applyNo,String fullName,String identityCard,int identityType,Integer showAll){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/info"; + params.put("applyNo",applyNo); + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("identityType",identityType); + if(!ObjectUtils.isEmpty(showAll)){ + params.put("showAll",showAll); + } + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + //创建或修改合同模板 + public ResultInfo oper(Long templateId){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/tmpl/oper"; + params.put("templateId",templateId); + String result = HttpClientUtils.init().getPost(url,null,params,true); + return JSON.parseObject(result,ResultInfo.class); + } + + //企业认证实名上传 + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/organizationCreate"; + params.put("emailOrMobile",emailOrMobile); + params.put("name",name); + params.put("organizationType",organizationType); + params.put("identificationType",identificationType); + params.put("organizationRegNo",organizationRegNo); + params.put("organizationRegImg",organizationRegImg); + params.put("legalName",legalName); + params.put("legalIdentityCard",legalIdentityCard); + params.put("legalMobile",legalMobile); + return HttpClientUtils.init().getPost(url,null,params,true); + } + + //个人证书申请资料上传 + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse){ + + log.info(idenFront.toString()); + + + + + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/user/cloudCertiPerInfo"; + params.put("fullName",fullName); + params.put("identityCard",identityCard); + params.put("idenFront",idenFront); + params.put("idenReverse",idenReverse); + return HttpClientUtils.init().getPost(url,null,params,true); + + } + + + //文件下载 + public String linkFile(String applyNo){ + initParams(); + Map params=bodyParams; + String url = servicesUrl+"/v2/sign/linkFile"; + params.put("applyNo",applyNo); + return HttpClientUtils.init().getPost(url,null,params,true); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java new file mode 100644 index 0000000..349bc11 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/ResultInfo.java @@ -0,0 +1,93 @@ +package org.dromara.resource.junziqian.common; + +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.io.Serializable; + +/** + * 返回对象 + * @author luopeng + * + */ +@Data +public class ResultInfo implements Serializable { + + private static final long serialVersionUID = -1L; + + private boolean success; // 操作是否成功 + private String msg; // 操作失败的原因 + + private String resultCode;//返回码 + + private T data;//返回对象 + + /**异常对象不作序列化传输*/ + private transient Exception exception;//异常对象 + + public ResultInfo(){} + + public static ResultInfo create(Class cls){ + return new ResultInfo(); + } + + public static ResultInfo create(){ + return new ResultInfo(); + } + + public static ResultInfo createFail(Exception e){ + ResultInfo result = new ResultInfo(); + result.fail(e); + return result; + } + + public static ResultInfo createFail(String msg,Exception e){ + ResultInfo result = new ResultInfo(); + result.fail(msg,e); + return result; + } + + public ResultInfo success(){ + this.success = true; + return this; + } + + public ResultInfo success(T data){ + this.success = true; + this.data = data; + return this; + } + + public ResultInfo fail(){ + this.success = false; + return this; + } + + public ResultInfo fail(String msg){ + this.success = false; + this.msg = msg; + return this; + } + + public ResultInfo fail(Exception e){ + this.success = false; + if(e != null){ + this.exception = e; + this.msg = e.getMessage(); + } + return this; + } + + public ResultInfo fail(String msg,Exception e){ + this.success = false; + this.msg = msg; + if(e != null){ + this.exception = e; + } + return this; + } + + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java new file mode 100644 index 0000000..0b9e7c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqBack.java @@ -0,0 +1,43 @@ +package org.dromara.resource.junziqian.common.bean.sign; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class JzqBack implements Serializable { + + /** + * 签约编号 + */ + private String applyNo; + + /** + * 证件类型 + * 1: 身份证, 2: 护照, 3: 台胞证, 4: 港澳居民来往内地通行证, 11: 营业执照, 12: 统一社会信用代码, 99: 其他 + */ + private int identityType; + + /** + * 名称 + */ + private String fullName; + + /** + * 证件号 + */ + private String identityCard; + + /** + * 操作时间(毫秒) + */ + private long optTime; + + /** + * 签约状态 + * 1: 签约完成, 2: 拒签, 3: 已保全 + */ + private int signStatus; + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java new file mode 100644 index 0000000..87ca9cb --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/bean/sign/JzqSign.java @@ -0,0 +1,96 @@ +package org.dromara.resource.junziqian.common.bean.sign; + +import lombok.Data; +import org.dromara.resource.api.domain.SignatoryReq; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@Data +public class JzqSign implements Serializable { + /** + * 合同名称,非空,最长100个字符 + */ + private String contractName; + + /** + * 签约方,参考后面签约方说明 + */ + private List signatories; + + /** + * 是否需要服务端云证书:非1不需要(默认);1需要;建议需要,否则影响后续司法服务 + */ + private Integer serverCa; + + /** + * 处理方式:为空或0时默认为手签合同(用户有感知);2只保全;5部份自动签;6HASH只保全;17收集信息批量签 + */ + private Integer dealType; + + /** + * 合同模版编号, fileType=2或4, 时必须传入 + */ + private String templateNo; + + /** + * 合同模版参数JSON字符串, fileType=2或4, 时必须传入 + */ + private String templateParams; + + /** + * 2 API模版(HTML源码); 4 API模板(PDF文件/word文件) + */ + private Integer fileType; + + /** + * ofd文件追加内容(0不能追加内容,1允许追加内容),允许追加内容时noEbqSign需要设置为2 + */ + private Integer addPage; + + /** + * 指定公章位置类型: 0或null使用签字座标位置或不指定签字位置; 1表单域定位(表单域如果上传为pdf时,需pdf自行定义好表单域); 2关键字定义 + */ + private Integer positionType; + + /** + * 验证方式为人脸时必传, 人脸识别阀值: 默认等级(1-100之间整数),建议大于72, 验证方式在签约方中(signatories)设置 + */ + private Integer faceThreshold; + +// /** +// * 是否按顺序签字,非1为不按,1为按 +// */ +// private Integer orderFlag; +// +// /** +// * 多合同顺序签约或批量签合同关联信息,参考后面表格说明 +// */ +// private Map sequenceInfo; +// + /** + * 合同签署完成后异步通知地址 + */ + private String notifyUrl; +// +// /** +// * 不显示ebq的保全章: 1不显示但会签名, 2不显示也不签名; 0或其它-显示 +// */ +// private Integer noEbqSign; +// +// /** +// * 合同附件, 虽不限个数, 但包括合同原文件, 不能超过30MB, *SDK引用中的多文件同名情况的上传说明 +// */ +// private String[] attachFiles; +// +// /** +// * 是否使用骑缝章: 1使用; 2个人不要企业要,3个人要企业不要 +// */ +// private Integer needQifengSign; +// +// /** +// * 是否不显示个人标准章边框: 1不显示;0显示边框(默认);2不显示边框标准章字体为黑 +// */ +// private Integer noBorderSign; +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java new file mode 100644 index 0000000..de95e27 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/exception/ResultInfoException.java @@ -0,0 +1,36 @@ +package org.dromara.resource.junziqian.common.exception; + +/** + * @Description: 返回的异常信息处理 + * @author yfx + * @date 2015年9月10日 上午9:32:12 + */ +public class ResultInfoException extends RuntimeException{ + + private static final long serialVersionUID = -962336849220646170L; + + private String resultCode; + + public ResultInfoException() { + super(); + } + + public ResultInfoException(String resultCode,String message) { + super(message); + this.resultCode=resultCode; + } + + public ResultInfoException(String resultCode,String message, Throwable cause) { + super(message, cause); + this.resultCode=resultCode; + } + + public ResultInfoException(String message, Throwable cause) { + super(message, cause); + } + + public String getResultCode() { + return resultCode; + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java new file mode 100644 index 0000000..393d5e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/common/http/HttpClientUtils.java @@ -0,0 +1,479 @@ +package org.dromara.resource.junziqian.common.http; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.*; +import org.apache.http.client.HttpRequestRetryHandler; +import org.apache.http.client.config.RequestConfig; +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.methods.HttpRequestBase; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.config.ConnectionConfig; +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.TrustSelfSignedStrategy; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.ByteArrayBody; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.entity.mime.content.InputStreamBody; +import org.apache.http.entity.mime.content.StringBody; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.LaxRedirectStrategy; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.protocol.ExecutionContext; +import org.apache.http.protocol.HttpContext; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; +import org.dromara.resource.junziqian.common.CommonUtil; +import org.dromara.resource.junziqian.common.ResultInfo; +import org.dromara.resource.junziqian.common.exception.ResultInfoException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLException; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.File; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.io.UnsupportedEncodingException; +import java.net.ConnectException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.nio.charset.CodingErrorAction; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * http的请求服务类 + * 也可以考虑使用spring restTemplate调用 + */ +@Component +public class HttpClientUtils { + public static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); + private static Object objTg = new Object(); + private static HttpClientUtils httpClientUtils; + /** + * 默认连接超时时间 + */ + private final static int DEFAULT_CONN_TIMEOUT = 6000; + /**最大重试次数*/ + private final static int DEFAULT_RETRY_TIMES = 3; + + private CloseableHttpClient client; + + /** + * ssl trust管理 + */ + public static class SSLTrustAllManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } + + /** + * 初始化ssl管理 + * @return + * @throws KeyStoreException + * @throws CertificateException + * @throws NoSuchAlgorithmException + * @throws IOException + * @throws KeyManagementException + */ + private SSLConnectionSocketFactory initSSLConnectionSocketFactory() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, KeyManagementException { + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + SSLContext sslcontext = SSLContexts.custom() + .loadTrustMaterial(trustStore, + new TrustSelfSignedStrategy()) + .build(); + sslcontext.init(null, new TrustManager[] { new SSLTrustAllManager() }, null); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + sslcontext, + //new String[] { "TLSv1","TLSv1.1","TLSv1.2","SSLv3"},//参考ProtocolVersion//这里写为null为所有 + null, + null, + SSLConnectionSocketFactory.getDefaultHostnameVerifier()); + return sslsf; + } + + + public HttpClientUtils() throws Exception { + // 设置协议http和https对应的处理socket链接工厂的对象 + Registry socketFactoryRegistry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https", initSSLConnectionSocketFactory()) + .build(); + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + connManager.setValidateAfterInactivity(1000); + ConnectionConfig connectionConfig = ConnectionConfig.custom() + .setMalformedInputAction(CodingErrorAction.IGNORE) + .setUnmappableInputAction(CodingErrorAction.IGNORE) + .setCharset(Consts.UTF_8) + .build(); + connManager.setDefaultConnectionConfig(connectionConfig); + connManager.setMaxTotal(100); + connManager.setDefaultMaxPerRoute(10);//最大路由深度,即301次数 + + //默认头信息,创建自定义的httpclient对象 + List
defaultHeaders=new ArrayList
(); + defaultHeaders.add(new BasicHeader("Accept","text/html,application/xhtml+xml,application/xml,application/json;q=0.9,*/*;q=0.8")); + defaultHeaders.add(new BasicHeader("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")); + defaultHeaders.add(new BasicHeader("Connection","close")); + defaultHeaders.add(new BasicHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0")); + //默认请求配置 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(DEFAULT_CONN_TIMEOUT) + .setConnectTimeout(DEFAULT_CONN_TIMEOUT) + //.setProxy(new HttpHost("myotherproxy", 8080)) //设置代理 + .setConnectionRequestTimeout(DEFAULT_CONN_TIMEOUT).build(); + //重试拦截 + HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { + @Override + public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { + if (executionCount >= DEFAULT_RETRY_TIMES) { + //Do not retry if over max retry count + return false; + } + if (exception instanceof InterruptedIOException) { + // Timeout + return false; + } + if (exception instanceof UnknownHostException) { + // Unknown host + return false; + } + if (exception instanceof ConnectException) { + // Connection refused + return false; + } + if (exception instanceof SSLException) { + // SSL handshake exception + return false; + } + HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); + boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); + if (idempotent) { + return true; + } + return false; + } + }; + + client = HttpClients.custom() + .setConnectionManager(connManager) + .setDefaultHeaders(defaultHeaders) + .setDefaultRequestConfig(requestConfig) + .setRetryHandler(myRetryHandler) + .setRedirectStrategy(new LaxRedirectStrategy()) + .build(); + } + /** + * init实例 + * @return + */ + public static HttpClientUtils init(){ + synchronized (objTg) { + if (httpClientUtils == null) { + try { + httpClientUtils = new HttpClientUtils(); + } catch (Exception e) { + throw new ResultInfoException("ACCESS_SIGN_ERROR","httpClient初始化出错",e); + } + } + } + return httpClientUtils; + } + + + /** + * 工具类,通过url和params 生成url地址 + * @param url + * @param params + * @return + * @throws URISyntaxException + */ + public static URI builderUrl(String url, Map params){ + URIBuilder builder = null; + try { + builder = new URIBuilder(url); + if(params!=null&¶ms.size()>0){ + for(String key: params.keySet()){ + Object obj=params.get(key); + if(obj==null){continue;} + builder.setParameter(key, CommonUtil.parValNoErr(obj, String.class)); + } + } + return builder.build(); + } catch (URISyntaxException e) { + throw new ResultInfoException("HTTP_URL_FORMART","转换地址出错:"+url,e); + } + } + + public static void fillHeader(HttpRequestBase request, Map heads){ + //请求头 + if (heads != null && heads.size() > 0) { + for (String key : heads.keySet()) { + request.addHeader(key, heads.get(key) + ""); + } + } + } + /** + * get请求 + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public String getGet(String uri, Map heads, Map params) { + HttpGet request = new HttpGet(builderUrl(uri,params)); + fillHeader(request,heads); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的字符串 + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + return result; + } else { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + result= StringUtils.isNotBlank(result)?result.substring(0,result.length()>200?200:result.length()) : ""; + ResultInfo res=new ResultInfo(); + res.setData(result); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("EXCEPTION","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + public byte[] getGetByte(String uri, Map heads, Map params) { + HttpGet request = new HttpGet(builderUrl(uri,params)); + fillHeader(request,heads); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的字符串 + byte[] result = EntityUtils.toByteArray(response.getEntity()); + return result; + } else { + ResultInfo res=new ResultInfo(); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("EXCEPTION","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + /** + * 直接获取返回体,注意要手动关闭response + * @param uri + * @param heads + * @param params + * @return + */ + public CloseableHttpResponse getGetResponse(String uri, Map heads, Map params) throws IOException { + HttpGet request = new HttpGet(builderUrl(uri,params)); + fillHeader(request,heads); + CloseableHttpResponse response = null; + response = client.execute(request); + return response; + } + + /** + * 构建post的body信息, + * @param request + * @param params + * @param ifMutipart 是否启用富文件方式上传 + */ + private void buildPostBody(HttpPost request, Map params, boolean ifMutipart){ + if(ifMutipart){ + //富文本请求 + MultipartEntityBuilder meBuiler = MultipartEntityBuilder.create(); + if (params != null && params.size() > 0) { + for (String key : params.keySet()) { + Object obj = params.get(key); + if(obj==null){ + continue; + }else if (obj instanceof File) { + FileBody fb = new FileBody((File) obj); + meBuiler.addPart(key, fb); + } else if (obj instanceof ByteArrayBody) { + meBuiler.addPart(key, (ByteArrayBody) obj); + } else if (obj instanceof FileBody) { + meBuiler.addPart(key, (FileBody) obj); + } else if (obj instanceof InputStreamBody) { + meBuiler.addPart(key, (InputStreamBody) obj); + }else { + StringBody sb = new StringBody(CommonUtil.parValNoErrDef(obj, String.class, ""), ContentType.create("text/plain", "UTF-8")); + meBuiler.addPart(key, sb); + } + } + } + HttpEntity httpEntity = meBuiler.build(); + request.setEntity(httpEntity); + }else{ + //普通请求 + List pList = new ArrayList(); + if (params != null && params.size() > 0) { + for (String key : params.keySet()) { + Object obj=params.get(key); + if(obj==null){continue;} + pList.add(new BasicNameValuePair(key, obj + "")); + } + } + try { + request.setEntity(new UrlEncodedFormEntity(pList, "UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new ResultInfoException("HTTP_REQ_ENCODE_ERROR","请求参数格式化出错",e); + } + } + } + + /** + * post的上传请求 + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public String getPost(String uri, Map heads, Map params, boolean ifMutipart) { + HttpPost request = new HttpPost(uri); + fillHeader(request,heads); + buildPostBody(request,params,ifMutipart); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的字符串 + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + return result; + } else { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + result= StringUtils.isNotBlank(result) ?result.substring(0,result.length()>200?200:result.length()) : ""; + ResultInfo res=new ResultInfo(); + res.setData(result); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("HTTP_IO_ERROR","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + /** + * post的上传请求,返回byte[] + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public byte[] getPostByte(String uri, Map heads, Map params, boolean ifMutipart) { + HttpPost request = new HttpPost(uri); + fillHeader(request,heads); + buildPostBody(request,params,ifMutipart); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + // 获得返回的byte[] + byte[] result = EntityUtils.toByteArray(response.getEntity()); + return result; + } else { + ResultInfo res=new ResultInfo(); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("HTTP_IO_ERROR","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } + + /** + * post的上传请求,返回CloseableHttpResponse,必须手动关闭 + * @param uri + * @param heads + * @param params + * @return + * @throws Exception + */ + public CloseableHttpResponse getPostResponse(String uri, Map heads, Map params, boolean ifMutipart) { + HttpPost request = new HttpPost(uri); + fillHeader(request,heads); + buildPostBody(request,params,ifMutipart); + CloseableHttpResponse response = null; + try { + response = client.execute(request); + if (response.getStatusLine().getStatusCode() == 200) { + return response; + } else { + String result = EntityUtils.toString(response.getEntity(), "UTF-8"); + result= StringUtils.isNotBlank(result)?result.substring(0,result.length()>200?200:result.length()) : ""; + ResultInfo res=new ResultInfo(); + res.setData(result); + res.setSuccess(false); + res.setResultCode(response.getStatusLine().getStatusCode()+""); + throw new ResultInfoException("HTTP_RESPONSE_ERROR", JSONObject.toJSONString(res)); + } + } catch (IOException e) { + throw new ResultInfoException("HTTP_IO_ERROR","网络请求失败",e); + } finally { + try { + response.close(); + } catch (Exception e) {} + } + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java new file mode 100644 index 0000000..ea2e0df --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatGPTUtils.java @@ -0,0 +1,137 @@ +package org.dromara.resource.junziqian.openai; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +@Service +public class ChatGPTUtils +{ + private static final Logger log; + static String baseUrl; + static String key; + + public static void main(final String[] args) throws Exception { + final ChatGPTUtils chatGPTUtils = new ChatGPTUtils(); + final String q1 = "中国的个人所得税征收标准是什么"; + final ChatResponse response1 = chatGPTUtils.chat("123", "你是一个智能助手", "", "", q1); + final String assistantPreContent = response1.getContent(); + final String q2 = "起征点是多少"; + final ChatResponse response2 = chatGPTUtils.chat("123", "你是一个智能助手", q1, assistantPreContent, q2); + System.out.println(response2); + } + + public ChatResponse chat(final String user, final String systemContent, final String userPreContent, final String assistantPreContent, final String userContent) { + final ChatResponse response = new ChatResponse(); + final String modelId = "gpt-4-1106-preview"; + final String apiUrl = ChatGPTUtils.baseUrl + "/v1/chat/completions"; + final JSONObject data = new JSONObject(); + data.set("user", (Object)user); + data.set("model", (Object)modelId); + final ChatMessage chatMessage = new ChatMessage(); + final JSONArray messages = chatMessage.buildMessage(systemContent, userPreContent, assistantPreContent, "", userContent); + data.set("messages", (Object)messages); + data.set("max_tokens", (Object)4096); + final JSONObject result = this.sendPost(apiUrl, data.toString()); + if (!result.containsKey((Object)"error")) { + response.setContent(result.getStr("content")); + } + else { + response.setError(result.getStr("error")); + } + return response; + } + + public ChatResponse vision(final String user, final String systemContent, final String imageUrl, final String userContent) { + final ChatResponse response = new ChatResponse(); + final String modelId = "gpt-4-vision-preview"; + final String apiUrl = ChatGPTUtils.baseUrl + "/v1/chat/completions"; + final JSONObject data = new JSONObject(); + data.set("user", (Object)user); + data.set("model", (Object)modelId); + final ChatMessage chatMessage = new ChatMessage(); + final JSONArray messages = chatMessage.buildMessage(systemContent, "", "", imageUrl, userContent); + data.set("messages", (Object)messages); + data.set("max_tokens", (Object)4096); + final JSONObject result = this.sendPost(apiUrl, data.toString()); + if (!result.containsKey((Object)"error")) { + response.setContent(result.getStr("content")); + } + else { + response.setError(result.getStr("error")); + } + return response; + } + + private JSONObject sendPost(final String apiUrl, final String data) { + final JSONObject resultJSON = new JSONObject(); + String result = ""; + try { + final URL url = new URL(apiUrl); + final HttpURLConnection connection = (HttpURLConnection)url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Authorization", "Bearer " + ChatGPTUtils.key); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + connection.setDoOutput(true); + try (final DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + ChatGPTUtils.log.info("postData:" + data); + outputStream.write(data.getBytes()); + outputStream.flush(); + } + final int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + try (final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + final StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + ChatGPTUtils.log.info("ChatGPT 响应:" + response.toString()); + result = response.toString(); + } + } + else { + ChatGPTUtils.log.info("ChatGPT 请求失败,响应码: " + responseCode); + } + connection.disconnect(); + } + catch (Exception e) { + e.printStackTrace(); + ChatGPTUtils.log.error("ChatGPT 网络请求错误", (Throwable)e); + resultJSON.set("error", (Object)"ChatGPT 网络请求错误"); + } + if (StrUtil.isNotBlank((CharSequence)result)) { + final JSONObject jsonObject = JSONUtil.parseObj(result); + final JSONArray choices = jsonObject.getJSONArray("choices"); + final JSONObject error = jsonObject.getJSONObject("error"); + if (choices != null && !jsonObject.containsKey((Object)"error")) { + final JSONObject choice = choices.getJSONObject(0); + final String role = choice.getJSONObject("message").getStr("role"); + final String content = choice.getJSONObject("message").getStr("content"); + resultJSON.set("role", (Object)role); + resultJSON.set("content", (Object)content); + } + else if (error != null) { + resultJSON.set("error", error.get((Object)"message")); + } + } + return resultJSON; + } + + static { + log = LoggerFactory.getLogger((Class)ChatGPTUtils.class); + ChatGPTUtils.baseUrl = "https://flag.smarttrot.com"; + ChatGPTUtils.key = "zk-b02953bb6f9045cf4c683a438350e8fb"; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java new file mode 100644 index 0000000..4807b33 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatMessage.java @@ -0,0 +1,59 @@ +package org.dromara.resource.junziqian.openai; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; + +public class ChatMessage +{ + public JSONArray buildMessage(final String systemContent, final String userPreContent, final String assistantPreContent, final String imageUrl, final String... userContent) { + final JSONArray message = new JSONArray(); + final JSONObject system = new JSONObject(); + system.set("role", (Object)"system"); + system.set("content", (Object)systemContent); + message.add((Object)system); + if (StrUtil.isNotBlank((CharSequence)userPreContent)) { + final JSONObject preUser = new JSONObject(); + preUser.set("role", (Object)"user"); + preUser.set("content", (Object)userPreContent); + message.add((Object)preUser); + } + if (StrUtil.isNotBlank((CharSequence)assistantPreContent)) { + final JSONObject assistant = new JSONObject(); + assistant.set("role", (Object)"assistant"); + assistant.set("content", (Object)assistantPreContent); + message.add((Object)assistant); + } + if (StrUtil.isBlank((CharSequence)imageUrl)) { + final JSONObject user = new JSONObject(); + final JSONArray contents = new JSONArray(); + user.set("role", (Object)"user"); + for (final String s : userContent) { + final JSONObject content = new JSONObject(); + content.set("type", (Object)"text"); + content.set("text", (Object)s); + contents.add((Object)content); + } + user.set("content", (Object)contents); + message.add((Object)user); + } + else { + final JSONObject image = new JSONObject(); + image.set("role", (Object)"user"); + final JSONArray imageContentArray = new JSONArray(); + final JSONObject content2 = new JSONObject(); + content2.set("type", (Object)"image_url"); + content2.set("image_url", (Object)imageUrl); + imageContentArray.add((Object)content2); + for (final String s2 : userContent) { + final JSONObject textContent = new JSONObject(); + textContent.set("type", (Object)"text"); + textContent.set("text", (Object)s2); + imageContentArray.add((Object)textContent); + } + image.set("content", (Object)imageContentArray); + message.add((Object)image); + } + return message; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java new file mode 100644 index 0000000..1c79c46 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/junziqian/openai/ChatResponse.java @@ -0,0 +1,81 @@ +package org.dromara.resource.junziqian.openai; + +public class ChatResponse +{ + private String content; + private String error; + + public String getContent() { + return this.content; + } + + public String getError() { + return this.error; + } + + public void setContent(final String content) { + this.content = content; + } + + public void setError(final String error) { + this.error = error; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof ChatResponse)) { + return false; + } + final ChatResponse other = (ChatResponse)o; + if (!other.canEqual(this)) { + return false; + } + final Object this$content = this.getContent(); + final Object other$content = other.getContent(); + Label_0065: { + if (this$content == null) { + if (other$content == null) { + break Label_0065; + } + } + else if (this$content.equals(other$content)) { + break Label_0065; + } + return false; + } + final Object this$error = this.getError(); + final Object other$error = other.getError(); + if (this$error == null) { + if (other$error == null) { + return true; + } + } + else if (this$error.equals(other$error)) { + return true; + } + return false; + } + + protected boolean canEqual(final Object other) { + return other instanceof ChatResponse; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $content = this.getContent(); + result = result * 59 + (($content == null) ? 43 : $content.hashCode()); + final Object $error = this.getError(); + result = result * 59 + (($error == null) ? 43 : $error.hashCode()); + return result; + } + + @Override + public String toString() { + return "ChatResponse(content=" + this.getContent() + ", error=" + this.getError() + ")"; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java new file mode 100644 index 0000000..aad7d40 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java @@ -0,0 +1,17 @@ +package org.dromara.resource.mapper; + + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.resource.domain.SysOssConfig; +import org.dromara.resource.domain.vo.SysOssConfigVo; + +/** + * 对象存储配置Mapper接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface SysOssConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java new file mode 100644 index 0000000..629ad20 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java @@ -0,0 +1,13 @@ +package org.dromara.resource.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.resource.domain.SysOss; +import org.dromara.resource.domain.vo.SysOssVo; + +/** + * 文件上传 数据层 + * + * @author Lion Li + */ +public interface SysOssMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java new file mode 100644 index 0000000..7a77f3e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSignLogMapper.java @@ -0,0 +1,39 @@ +package org.dromara.resource.mapper; + +import org.dromara.resource.domain.MerTaskEnroll; +import org.dromara.resource.domain.SysSignLog; +import org.dromara.resource.domain.UserWorkAuth; +import org.dromara.resource.domain.UserWorkerBiz; +import org.dromara.resource.domain.vo.SysSignLogVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 合同签约日志Mapper接口 + * + * @author LionLi + * @date 2024-05-22 + */ +public interface SysSignLogMapper extends BaseMapperPlus { + + int updateSysSignLog(SysSignLog signLog); + + int updateUserWorkerBiz(UserWorkerBiz userWorkerBiz); + + + /*** + * 更新确认单状态 + * @param taskEnroll + * @return + */ + int updateMerTaskEnrollInfo(MerTaskEnroll taskEnroll); + + + /*** + * 授权协议更新 + * @param uwa + * @return + */ + int updateUserWorkerAuth(UserWorkAuth uwa); + + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java new file mode 100644 index 0000000..58fc219 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysSmsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.resource.mapper; + +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.domain.vo.SysSmsVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 短信Mapper接口 + * + * @author sunzexing + * @date 2024-03-27 + */ +public interface SysSmsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java new file mode 100644 index 0000000..8c7484d --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/runner/ResourceApplicationRunner.java @@ -0,0 +1,28 @@ +package org.dromara.resource.runner; + +import org.dromara.resource.service.ISysOssConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + * 初始化 system 模块对应业务数据 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Component +public class ResourceApplicationRunner implements ApplicationRunner { + + private final ISysOssConfigService ossConfigService; + + @Override + public void run(ApplicationArguments args) throws Exception { + ossConfigService.init(); + log.info("初始化OSS配置成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java new file mode 100644 index 0000000..96b6e29 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssConfigService.java @@ -0,0 +1,66 @@ +package org.dromara.resource.service; + + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssConfigBo; +import org.dromara.resource.domain.vo.SysOssConfigVo; + +import java.util.Collection; + +/** + * 对象存储配置Service接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface ISysOssConfigService { + + /** + * 初始化OSS配置 + */ + void init(); + + /** + * 查询单个 + */ + SysOssConfigVo queryById(Long ossConfigId); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery); + + + /** + * 根据新增业务对象插入对象存储配置 + * + * @param bo 对象存储配置新增业务对象 + * @return + */ + Boolean insertByBo(SysOssConfigBo bo); + + /** + * 根据编辑业务对象修改对象存储配置 + * + * @param bo 对象存储配置编辑业务对象 + * @return + */ + Boolean updateByBo(SysOssConfigBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 启用停用状态 + */ + int updateOssConfigStatus(SysOssConfigBo bo); + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java new file mode 100644 index 0000000..4114202 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java @@ -0,0 +1,42 @@ +package org.dromara.resource.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssVo; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.http.HttpServletResponse; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +/** + * 文件上传 服务层 + * + * @author Lion Li + */ +public interface ISysOssService { + + TableDataInfo queryPageList(SysOssBo sysOss, PageQuery pageQuery); + + List listByIds(Collection ossIds); + + String selectUrlByIds(String ossIds); + + SysOssVo getById(Long ossId); + + SysOssVo upload(MultipartFile file); + + SysOssVo upload(File file); + + Boolean insertByBo(SysOssBo bo); + + void download(Long ossId, HttpServletResponse response) throws IOException; + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + void downloadByUrl(String url, HttpServletResponse response); +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java new file mode 100644 index 0000000..a339a2e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysSmsService.java @@ -0,0 +1,70 @@ +package org.dromara.resource.service; + +import org.dromara.common.core.enums.SmsType; +import org.dromara.resource.api.domain.TencentSmsConfig; +import org.dromara.resource.domain.vo.SysSmsVo; +import org.dromara.resource.domain.bo.SysSmsBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 短信Service接口 + * + * @author sunzexing + * @date 2024-03-27 + */ +public interface ISysSmsService { + + /** + * 查询短信 + */ + SysSmsVo queryById(Long id); + + /** + * 查询短信列表 + */ + TableDataInfo queryPageList(SysSmsBo bo, PageQuery pageQuery); + + /** + * 查询短信列表 + */ + List queryList(SysSmsBo bo); + + /** + * 新增短信 + */ + Boolean insertByBo(SysSmsBo bo); + + /** + * 修改短信 + */ + Boolean updateByBo(SysSmsBo bo); + + /** + * 校验并批量删除短信信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-03-27 13:44 + * 说明:发送公众号登录验证码 + **/ + + Boolean sendMpSmsCode(String phone); + + + public Boolean sendSmsCode(SmsType smsType, + String phonenumber, + LinkedHashMap param, + Map smsMap); + Boolean sendMpSmsCode(String domain, String phone); +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java new file mode 100644 index 0000000..0f0f1a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/DhqSignServiceImpl.java @@ -0,0 +1,304 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.domain.*; +import org.dromara.resource.mapper.SysSignLogMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title DhqSignServiceImpl + * @description 大鸿签签约 + * @create 2024-05-15 14:53 + */ + +@Service +@Slf4j +public class DhqSignServiceImpl { + + + @Resource + public SysSignLogMapper sysSignLogMapper; + + @Resource + public RemoteFileService remoteFileService; + + /*** + * 发起签约 + * @param sign + * @return + * @throws Exception + */ + + + public String becomeSign(DhqSign sign) throws Exception + { +// String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/v3/becomeSilentSaveSign"; // 替换为实际的API地址 + + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/pro/addContractSign"; + SysSignLog signLog = new SysSignLog(); + String response = null; + try{ + response = callThirdPartyApi(apiUrl, sign,signLog); + log.info("调用大鸿签发起合同返回结果====》"+ response); + }catch (Exception e){ + signLog.setResultException(e.getMessage()); + response = null; + }finally { + this.sysSignLogMapper.insert(signLog); + } + return response; + } + + + public static void main(String[] args) throws Exception{ + String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/signTemplateList"; // 替换为实际的API地址 + + + System.out.println(URLUtil.encode(Base64.encode("https://c.woxin666.com/wxre/2024/08/15/74a87e99d4d5485692c8d9eba169f992.pdf"))); + + + +// String apiUrl = "https://openapi.signzg.com/openAPI/contractSign/pro/addContractSign"; + +// Map paraMap = new HashMap(); +// +// paraMap.put("applicationId","2205026100"); +// paraMap.put("businessId","95d6eb9ae14b4b6f8770467a37132c82"); +// paraMap.put("contractName","测试合同"); +// paraMap.put("launchType",1); +// paraMap.put("launchName","陈总"); +// paraMap.put("launchSubject","15981832653"); +// paraMap.put("launchEnterpriseName","上海欣度网络科技有限公司"); +// paraMap.put("customerOriginationNumber","159818326531231"); +// paraMap.put("contractModelNum","2024081415531723622014701172"); +// paraMap.put("signatureType",0); +// +// //签署文本控件 +// List mapList=new ArrayList<>(); +// Map map2 = new HashMap(); +// map2.put("controlNumber","76505d7668304283aa727d40809f20f7"); +// map2.put("writeContent","20248088"); +// Map map1 = new HashMap(); +// map1.put("controlNumber","2bd867b199b4426e986faeb6508fb3d0"); +// map1.put("writeContent","郑州限公司"); +// Map map3 = new HashMap(); +// map3.put("controlNumber","495e5b2ac1614ed9a08375187cd67888"); +// map3.put("writeContent","张"); +// +// mapList.add(map2); +// mapList.add(map1); +// mapList.add(map3); +// +// paraMap.put("inputValues",mapList); +// +// List> data=new ArrayList<>(); +// Map map = new HashMap<>(); +// map.put("userName","石杰");//经办人姓名 +// map.put("userPhone","15981832653");//经办人手机号 +// map.put("type","1");//类型 0-个人 1-企业 +// map.put("signMode","3");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// map.put("silenceSign","1"); //是否需要静默签:0不需要 1需要 +// map.put("enterpriseName","上海欣度网络科技有限公司");//企业名称(类型type为1时必传) +// map.put("signNumber","e746ad74069443349cabc975e5b8d25a"); //0签署方编号 +// +// Map map5 = new HashMap<>(); +// map5.put("userName","孙泽星");//经办人姓名 +// map5.put("userPhone","15981832697");//经办人手机号 +// map5.put("type","0");//类型 0-个人 1-企业 +// map5.put("signMode","1");//签署印章 1用户手绘章 2用户模板章 3企业章 4合同章 5法人章,多个用逗号分隔 +// map5.put("silenceSign","0"); //是否需要静默签:0不需要 1需要 +// map5.put("signNumber","c65ba6bb0b7944beba1f664ec8cc5fd4"); //0签署方编号 +// data.add(map); +// data.add(map5); +// String s = JSONObject.toJSONString(data); +// paraMap.put("signatoryInfos",s);//签署方相关信息 +// +// +// +// +// +// paraMap.clear(); +// +//// Map paraMap = new HashMap(); +// +// paraMap.put("applicationId","2205026100"); +// paraMap.put("businessId","95d6eb9ae14b4b6f8770467a37132c82"); +// paraMap.put("isOpen","1"); +// +// CloseableHttpClient httpClient = HttpClients.createDefault(); +// HttpPost httpPost = new HttpPost(apiUrl); +// ObjectMapper objectMapper = new ObjectMapper(); +// String requestBody = objectMapper.writeValueAsString(paraMap); +// +// System.out.println(requestBody); +// StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON); +// httpPost.setEntity(requestEntity); +// +// CloseableHttpResponse response = httpClient.execute(httpPost); +// try { +// HttpEntity entity = response.getEntity(); +// BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); +// StringBuilder responseBuilder = new StringBuilder(); +// String line; +// while ((line = reader.readLine()) != null) { +// responseBuilder.append(line); +// } +// System.out.println(responseBuilder.toString()); +// } finally { +// response.close(); +// } + + } + + + public static String callThirdPartyApi(String apiUrl, DhqSign becomeSilentSaveSignDto,SysSignLog signLog ) throws IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(apiUrl); + signLog.setBizId(becomeSilentSaveSignDto.getCustomerOriginationNumber()); + + + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = objectMapper.writeValueAsString(becomeSilentSaveSignDto); + signLog.setSendBody(requestBody); + signLog.setHtCode(becomeSilentSaveSignDto.getContractModelNum()); + + log.info("请求报文===>"+requestBody); + StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON); + httpPost.setEntity(requestEntity); + + CloseableHttpResponse response = httpClient.execute(httpPost); + try { + HttpEntity entity = response.getEntity(); + BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); + StringBuilder responseBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + responseBuilder.append(line); + } + signLog.setContent(responseBuilder.toString()); + return responseBuilder.toString(); + + } finally { + response.close(); + } + } + + + public void accpet(JSONObject jsonObject)throws Exception{ + log.info("签约接收回调结果["+jsonObject.toString()+"]"); + //客户发起合同时定义的编号 + String customerOriginationNumber = jsonObject.getString("customerOriginationNumber"); + //应用 id + String businessId = jsonObject.getString("businessId"); + //合同签署编号 + String contractNum = jsonObject.getString("contractNum"); + //0 签署中 1 签署完成 2-拒绝签署 3 解除中 4 解除完成 5 拒绝解除 + //6-已撤回 7 已过期 + String signState = jsonObject.getString("signState"); + //合同文件 + String contractFile = jsonObject.getString("contractFile"); + //合同名称 + String contractName = jsonObject.getString("contractName"); + + if(StringUtils.isNotEmpty(customerOriginationNumber)){ + SysSignLog signLog = new SysSignLog(); + signLog.setSignState(signState); + signLog.setContractFile(contractFile); + signLog.setAppId(businessId); + signLog.setBizId(customerOriginationNumber); + + + this.sysSignLogMapper.updateSysSignLog(signLog); + + + if(customerOriginationNumber.startsWith("DHQUZ")){ + //更新用工协议 + UserWorkerBiz uwb = new UserWorkerBiz(); + uwb.setNo(customerOriginationNumber); + if("1".equals(signState)){ + uwb.setSignStatus(1); + }else if("2".equals(signState)){ + uwb.setSignStatus(2); + } + String fileUrl = upLoadOss(contractFile); + fileUrl = fileUrl.replaceAll("http://","https://"); + uwb.setSignFileUrl(fileUrl); + this.sysSignLogMapper.updateUserWorkerBiz(uwb); + }else if(customerOriginationNumber.startsWith("DHQQRD")){ + //确认单 + MerTaskEnroll enroll = new MerTaskEnroll(); + enroll.setSignNo(customerOriginationNumber); + if("1".equals(signState)){ + enroll.setSignStatus(1); + }else if("2".equals(signState)){ + enroll.setSignStatus(2); + } + String fileUrl = upLoadOss(contractFile); + fileUrl = fileUrl.replaceAll("http://","https://"); + enroll.setTaskConfirmFile(fileUrl); + this.sysSignLogMapper.updateMerTaskEnrollInfo(enroll); + }else if(customerOriginationNumber.startsWith("DHQWT")){ + //运营商委托协议 + UserWorkAuth uwa = new UserWorkAuth(); + uwa.setNo(customerOriginationNumber); + if("1".equals(signState)){ + uwa.setSignStatus(1); + }else if("2".equals(signState)){ + uwa.setSignStatus(2); + } + String fileUrl = upLoadOss(contractFile); + uwa.setSignFileUrl(fileUrl); + this.sysSignLogMapper.updateUserWorkerAuth(uwa); + } + + + } + } + + private String upLoadOss(String contractFile) throws Exception { + + InputStream inputStream = URLUtil.getStream(new URL(contractFile)); + try{ + if(inputStream != null){ + byte[] arrayBytes = IoUtil.readBytes(inputStream); + String fileName = IdUtil.getSnowflakeNextIdStr()+".pdf"; + RemoteFile remoteFile = this.remoteFileService.upload(fileName,fileName,"application/pdf",arrayBytes); + return remoteFile.getUrl(); + } + }finally { + if(inputStream != null){ + inputStream.close(); + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java new file mode 100644 index 0000000..8564068 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/JzqSignServiceImpl.java @@ -0,0 +1,205 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.domain.*; +import org.dromara.resource.junziqian.common.JzqUtils; +import org.dromara.resource.junziqian.common.bean.sign.JzqSign; +import org.dromara.resource.mapper.SysSignLogMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.*; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title JzqSignServiceImpl + * @description 大鸿签签约 + * @create 2024-05-15 14:53 + */ + +@Service +@Slf4j +public class JzqSignServiceImpl { + + + @Resource + public SysSignLogMapper sysSignLogMapper; + + @Resource + public RemoteFileService remoteFileService; + + @Autowired + public JzqUtils jzqUtils; + + /*** + * 发起签约 + * @param sign + * @return + * @throws Exception + */ + + + public String becomeSign(JzqSign sign) + { + + return jzqUtils.applySign(sign); + } + + public String bankThreeVerify(String name ,String identityCard,String cardNo){ + return jzqUtils.bankThreeVerify(name ,identityCard,cardNo); + } + + public String link(String applyNo,String fullName,String identityCard,int identityType){ + return jzqUtils.link(applyNo,fullName,identityCard,identityType); + } + + public String userValid(String name ,String identityCard){ + return jzqUtils.userValid(name ,identityCard); + } + + public String ocrIdentity(String file, Integer front) { + return jzqUtils.ocrIdentity(file,front); + } + + public String bankFourVerify(String name,String identityCard,String cardNo,String mobilePhone){ + return jzqUtils.bankFourVerify(name,identityCard,cardNo,mobilePhone); + } + + public String ocrBank(File file){ + return jzqUtils.ocrBank(file); + } + public String startH5Face(String orderNo,String name,String identityCard,String backUrl,Integer startFrom){ + String s = jzqUtils.startH5Face(orderNo, name, identityCard, backUrl, startFrom); + return s; + } + + public String organizationCreate(String emailOrMobile,String name,Integer organizationType,Integer identificationType,String organizationRegNo, + File organizationRegImg,String legalName,String legalIdentityCard,String legalMobile){ + return jzqUtils.organizationCreate(emailOrMobile, name, organizationType, identificationType, organizationRegNo, organizationRegImg, legalName, legalIdentityCard, legalMobile); + } + + public String cloudCertiPerInfo(String fullName,String identityCard,File idenFront,File idenReverse){ + return jzqUtils.cloudCertiPerInfo(fullName, identityCard, idenFront, idenReverse); + } + + public String linkFile(String applyNo){ + return jzqUtils.linkFile(applyNo); + } + + public String accpet(Map map)throws Exception{ + Object data = map.get("data"); + JSONObject jsonObject = JSONObject.parseObject(data.toString()); + log.info("签约接收回调结果["+jsonObject.toString()+"]"); + + String customerOriginationNumber = jsonObject.getString("applyNo"); + + String signState = jsonObject.getString("signStatus"); + + if(StringUtils.isNotEmpty(customerOriginationNumber)){ + SysSignLog signLog = new SysSignLog(); + signLog.setSignState(signState); + signLog.setBizId(customerOriginationNumber); + this.sysSignLogMapper.updateSysSignLog(signLog); + UserWorkerBiz uwb = new UserWorkerBiz(); + uwb.setNo(customerOriginationNumber); + if("0".equals(signState)){ + uwb.setSignStatus(0); + }else { + uwb.setSignStatus(1); + } + String s = jzqUtils.linkFile(customerOriginationNumber); + JSONObject json = JSONObject.parseObject(s); + String fileUrl= null; + if (json.getString("success").equals("true")) { + fileUrl = json.getString("data"); + } + signLog.setContractFile(fileUrl); + fileUrl = upLoadOss(fileUrl); + uwb.setSignFileUrl(fileUrl); + this.sysSignLogMapper.updateUserWorkerBiz(uwb); + } + + return "{\"success\":true}"; + } + + public String accpetSure(Map map)throws Exception{ + Object data = map.get("data"); + JSONObject jsonObject = JSONObject.parseObject(data.toString()); + log.info("签约接收回调结果["+jsonObject.toString()+"]"); + + String customerOriginationNumber = jsonObject.getString("applyNo"); + + String signState = jsonObject.getString("signStatus"); + + log.info("确认单####################"+signState+"!!!!!!!!!!!!!!!!!!!!!!"); + + if(StringUtils.isNotEmpty(customerOriginationNumber)){ + SysSignLog signLog = new SysSignLog(); + signLog.setSignState(signState); + signLog.setBizId(customerOriginationNumber); + this.sysSignLogMapper.updateSysSignLog(signLog); + MerTaskEnroll enroll = new MerTaskEnroll(); + enroll.setSignNo(customerOriginationNumber); + if("0".equals(signState)){ + enroll.setSignStatus(0); + }else { + enroll.setSignStatus(1); + } + String s = jzqUtils.linkFile(customerOriginationNumber); + JSONObject json = JSONObject.parseObject(s); + String fileUrl= null; + if (json.getString("success").equals("true")) { + fileUrl = json.getString("data"); + } + signLog.setContractFile(fileUrl); + fileUrl = upLoadOss(fileUrl); + enroll.setTaskConfirmFile(fileUrl); + this.sysSignLogMapper.updateMerTaskEnrollInfo(enroll); + } + + return "{\"success\":true}"; + } + + + + + private String upLoadOss(String contractFile) throws Exception { + + InputStream inputStream = URLUtil.getStream(new URL(contractFile)); + try{ + if(inputStream != null){ + byte[] arrayBytes = IoUtil.readBytes(inputStream); + String fileName = IdUtil.getSnowflakeNextIdStr()+".pdf"; + RemoteFile remoteFile = this.remoteFileService.upload(fileName,fileName,"application/pdf",arrayBytes); + return remoteFile.getUrl(); + } + }finally { + if(inputStream != null){ + inputStream.close(); + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java new file mode 100644 index 0000000..2e7154b --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.constant.OssConstant; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.resource.domain.SysOssConfig; +import org.dromara.resource.domain.bo.SysOssConfigBo; +import org.dromara.resource.domain.vo.SysOssConfigVo; +import org.dromara.resource.mapper.SysOssConfigMapper; +import org.dromara.resource.service.ISysOssConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 对象存储配置Service业务层处理 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysOssConfigServiceImpl implements ISysOssConfigService { + + private final SysOssConfigMapper baseMapper; + + /** + * 项目启动时,初始化参数到缓存,加载配置类 + */ + @Override + public void init() { + List list = baseMapper.selectList(); + // 加载OSS初始化配置 + for (SysOssConfig config : list) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + } + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + } + + @Override + public SysOssConfigVo queryById(Long ossConfigId) { + return baseMapper.selectVoById(ossConfigId); + } + + @Override + public TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + private LambdaQueryWrapper buildQueryWrapper(SysOssConfigBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), SysOssConfig::getConfigKey, bo.getConfigKey()); + lqw.like(StringUtils.isNotBlank(bo.getBucketName()), SysOssConfig::getBucketName, bo.getBucketName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysOssConfig::getStatus, bo.getStatus()); + lqw.orderByAsc(SysOssConfig::getOssConfigId); + return lqw; + } + + @Override + public Boolean insertByBo(SysOssConfigBo bo) { + SysOssConfig config = BeanUtil.toBean(bo, SysOssConfig.class); + validEntityBeforeSave(config); + boolean flag = baseMapper.insert(config) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + @Override + public Boolean updateByBo(SysOssConfigBo bo) { + SysOssConfig config = BeanUtil.toBean(bo, SysOssConfig.class); + validEntityBeforeSave(config); + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(ObjectUtil.isNull(config.getPrefix()), SysOssConfig::getPrefix, ""); + luw.set(ObjectUtil.isNull(config.getRegion()), SysOssConfig::getRegion, ""); + luw.set(ObjectUtil.isNull(config.getExt1()), SysOssConfig::getExt1, ""); + luw.set(ObjectUtil.isNull(config.getRemark()), SysOssConfig::getRemark, ""); + luw.eq(SysOssConfig::getOssConfigId, config.getOssConfigId()); + boolean flag = baseMapper.update(config, luw) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysOssConfig entity) { + if (StringUtils.isNotEmpty(entity.getConfigKey()) && !checkConfigKeyUnique(entity)) { + throw new ServiceException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) { + throw new ServiceException("系统内置, 不可删除!"); + } + } + List list = CollUtil.newArrayList(); + for (Long configId : ids) { + SysOssConfig config = baseMapper.selectById(configId); + list.add(config); + } + boolean flag = baseMapper.deleteBatchIds(ids) > 0; + if (flag) { + list.forEach(sysOssConfig -> + CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey())); + } + return flag; + } + + /** + * 判断configKey是否唯一 + */ + private boolean checkConfigKeyUnique(SysOssConfig sysOssConfig) { + long ossConfigId = ObjectUtil.isNull(sysOssConfig.getOssConfigId()) ? -1L : sysOssConfig.getOssConfigId(); + SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) + .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { + return false; + } + return true; + } + + /** + * 启用禁用状态 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateOssConfigStatus(SysOssConfigBo bo) { + SysOssConfig sysOssConfig = BeanUtil.toBean(bo, SysOssConfig.class); + int row = baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysOssConfig::getStatus, "1")); + row += baseMapper.updateById(sysOssConfig); + if (row > 0) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey()); + } + return row; + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java new file mode 100644 index 0000000..6466769 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java @@ -0,0 +1,257 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.URLUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.enumd.AccessPolicyType; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.resource.domain.SysOss; +import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssVo; +import org.dromara.resource.mapper.SysOssMapper; +import org.dromara.resource.service.ISysOssService; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 文件上传 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOssServiceImpl implements ISysOssService { + + private final SysOssMapper baseMapper; + + @Override + public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List filterResult = result.getRecords().stream().map(this::matchingUrl).collect(Collectors.toList()); + result.setRecords(filterResult); + return TableDataInfo.build(result); + } + + @Override + public List listByIds(Collection ossIds) { + List list = new ArrayList<>(); + for (Long id : ossIds) { + SysOssVo vo = getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo); + } } + } + return list; + } + + @Override + public String selectUrlByIds(String ossIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo).getUrl()); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo.getUrl()); + } + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); + lqw.orderByAsc(SysOss::getOssId); + return lqw; + } + + @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId") + @Override + public SysOssVo getById(Long ossId) { + return baseMapper.selectVoById(ossId); + } + + + public SysOssVo getByUrl(String url){ + QueryWrapper query = Wrappers.query(); + query.eq("url",url); + return this.baseMapper.selectVoOne(query); + } + + @Override + public void download(Long ossId, HttpServletResponse response) throws IOException { + SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) { + int available = inputStream.available(); + IoUtil.copy(inputStream, response.getOutputStream(), available); + response.setContentLength(available); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + @Override + public SysOssVo upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + @Override + public SysOssVo upload(File file) { + String originalfileName = file.getName(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix); + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + + public static void main(String[] args) throws Exception { + + InputStream inputStream = URLUtil.getStream(new URL("https://towersignal.hn.hayuxin.com/floor_photo/report/410105010000000267/410105010000000267_202403190544333.pdf")); + + byte[] arrayByte = IoUtil.readBytes(inputStream); + + + + + + + } + + private SysOssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) { + SysOss oss = new SysOss(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalfileName); + oss.setService(configKey); + baseMapper.insert(oss); + SysOssVo sysOssVo = MapstructUtils.convert(oss, SysOssVo.class); + return this.matchingUrl(sysOssVo); + } + + @Override + public Boolean insertByBo(SysOssBo bo) { + SysOss oss = BeanUtil.toBean(bo, SysOss.class); + boolean flag = baseMapper.insert(oss) > 0; + if (flag) { + bo.setOssId(oss.getOssId()); + } + return flag; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + } + List list = baseMapper.selectBatchIds(ids); + for (SysOss sysOss : list) { + OssClient storage = OssFactory.instance(sysOss.getService()); + storage.delete(sysOss.getUrl()); + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public void downloadByUrl(String url, HttpServletResponse response) { + if(StringUtils.isEmpty(url)){ + throw new ServiceException("参数url不能为空"); + } + SysOssVo sysOss = SpringUtils.getAopProxy(this).getByUrl(url); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) { + int available = inputStream.available(); + IoUtil.copy(inputStream, response.getOutputStream(), available); + response.setContentLength(available); + } catch (Exception e) { + throw new ServiceException(e.getMessage()); + } + } + + /** + * 匹配Url + * + * @param oss OSS对象 + * @return oss 匹配Url的OSS对象 + */ + private SysOssVo matchingUrl(SysOssVo oss) { + OssClient storage = OssFactory.instance(oss.getService()); + // 仅修改桶类型为 private 的URL,临时URL时长为120s + if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) { + oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120)); + } + return oss; + } + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java new file mode 100644 index 0000000..7993149 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysSmsServiceImpl.java @@ -0,0 +1,256 @@ +package org.dromara.resource.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.MpLoginHelper; +import org.dromara.common.sms.config.SmsProperties; +import org.dromara.resource.danmi_sms.DMSmsUtils; +import org.dromara.resource.danmi_sms.common.DMSmsResult; +import org.dromara.resource.danmi_sms.config.SmsConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.dromara.resource.domain.bo.SysSmsBo; +import org.dromara.resource.domain.vo.SysSmsVo; +import org.dromara.resource.domain.SysSms; +import org.dromara.resource.mapper.SysSmsMapper; +import org.dromara.resource.service.ISysSmsService; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 短信Service业务层处理 + * + * @author sunzexing + * @date 2024-03-27 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class SysSmsServiceImpl implements ISysSmsService { + + private final SysSmsMapper baseMapper; + + @Resource + private SmsProperties smsProperties; + + @Autowired + private DMSmsUtils dmSmsUtils; + + + /** + * 查询短信 + */ + @Override + public SysSmsVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询短信列表 + */ + @Override + public TableDataInfo queryPageList(SysSmsBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询短信列表 + */ + @Override + public List queryList(SysSmsBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysSmsBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getIType() != null, SysSms::getVType, bo.getIType()); + lqw.like(StringUtils.isNotBlank(bo.getVUserName()), SysSms::getVUserName, bo.getVUserName()); + lqw.eq(bo.getIUserId() != null, SysSms::getIUserId, bo.getIUserId()); + lqw.eq(StringUtils.isNotBlank(bo.getVPhone()), SysSms::getVPhone, bo.getVPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getVVerCode()), SysSms::getVVerCode, bo.getVVerCode()); + lqw.eq(StringUtils.isNotBlank(bo.getVTempId()), SysSms::getVTempId, bo.getVTempId()); + lqw.eq(StringUtils.isNotBlank(bo.getVSendContent()), SysSms::getVSendContent, bo.getVSendContent()); + lqw.eq(bo.getDtmSendTime() != null, SysSms::getDtmSendTime, bo.getDtmSendTime()); + lqw.eq(bo.getDtmExpirTime() != null, SysSms::getDtmExpirTime, bo.getDtmExpirTime()); + lqw.eq(bo.getIsUse() != null, SysSms::getIsUse, bo.getIsUse()); + lqw.eq(bo.getIStatus() != null, SysSms::getIStatus, bo.getIStatus()); + return lqw; + } + + /** + * 新增短信 + */ + @Override + public Boolean insertByBo(SysSmsBo bo) { + SysSms add = MapstructUtils.convert(bo, SysSms.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改短信 + */ + @Override + public Boolean updateByBo(SysSmsBo bo) { + SysSms update = MapstructUtils.convert(bo, SysSms.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSms entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除短信 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean sendMpSmsCode(String phone) { + return null; + } + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-03-27 13:45 + * 说明:发送公众号登录验证码 + **/ + @Override + public Boolean sendMpSmsCode(String domain, String phone) { +// String key = GlobalConstants.CAPTCHA_CODE_KEY+SmsType.MP.getIType() + phone; +// String code = RandomUtil.randomNumbers(4); +// RedisUtils.setCacheObject(key, code, Duration.ofMinutes(SmsType.MP.getExpireTime())); +// LinkedHashMap map = new LinkedHashMap<>(); +// map.put("code", code); +// map.put("expirs", SmsType.MP.getExpireTime() + ""); +// RemoteSms sysSms = remoteSmsService.send(domain,phone,SmsType.MP,map); + return null; + } + + + + + /* + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-07 17:22 + * 说明:通用发送短息 + **/ + + public Boolean sendSmsCode(SmsType smsType, + String phonenumber, + LinkedHashMap param, + Map smsConfig) { + + + if(smsConfig == null){ + throw new RuntimeException("短信配置不能为空"); + } + + try{ + java.util.Date currentDate = DateUtil.date().toJdkDate(); +// SmsBlend smsBlend = null; +// String smsFacType = "tencent"; +// String tempKey = (String)smsConfig.get("tempId"); +// String tempId = (String)smsConfig.get(tempKey); +// if(StringUtils.isNotEmpty(smsProperties.getType())){ +// smsFacType = smsProperties.getType(); +// } +// switch (smsFacType){ +// case "aliyun": +// AlibabaConfig alibabaConfig = new AlibabaConfig(); +// alibabaConfig.setAccessKeyId((String)smsConfig.get("accid_aliyun")); +// alibabaConfig.setAccessKeySecret((String)smsConfig.get("acckey_aliyun")); +// alibabaConfig.setSignature((String)smsConfig.get("sign_aliyun")); +// tempId = (String)smsConfig.get(tempKey+"_aliyun"); +// smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA, alibabaConfig); +// break; +// case "tencent": +// TencentConfig tencentConfig = new TencentConfig(); +// tencentConfig.setAccessKeyId((String)smsConfig.get("accid")); +// tencentConfig.setAccessKeySecret((String)smsConfig.get("acckey")); +// tencentConfig.setSignature((String)smsConfig.get("sign")); +// tencentConfig.setSdkAppId((String)smsConfig.get("appid")); +// smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT,tencentConfig); +// break; +// } + +// SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, tempId, param); + JSONObject jsonObject = JSON.parseObject((String) smsConfig.get("smsConfig")); + + DMSmsResult result = this.dmSmsUtils.verificationCode((String) smsConfig.get("smsConfig"), phonenumber, param.get("code")); + if(!result.isSuccess()){ + log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phonenumber, result.getErrorMsg()); + } +// +// +// +// +// if (!"OK".equals(smsResponse.getCode())) { +// log.error("{}-{}验证码短信发送异常 => {}",smsType.getDesc(),phonenumber, smsResponse); +// } + + + SysSms smsEntity = new SysSms(); + + smsEntity.setIUserId(MpLoginHelper.getUserId()); + smsEntity.setVTempId(jsonObject.get("verification").toString()); + smsEntity.setDtmSendTime(currentDate); + smsEntity.setVType(smsType.getDesc()); + smsEntity.setVSendContent(JsonUtils.toJsonString(param)); + smsEntity.setCreateTime(currentDate); + smsEntity.setVPhone(phonenumber); + // smsEntity.setDtmExpirTime(DateUtil.offsetMinute(currentDate,Constants.CAPTCHA_EXPIRATION)); + + this.baseMapper.insert(smsEntity); + }catch (Exception e){ + e.printStackTrace(); + log.error("发送短信失败==>",e.getMessage()); + throw e; + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml b/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml new file mode 100644 index 0000000..92e3701 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml @@ -0,0 +1,74 @@ +# Tomcat +server: + port: 9204 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-resource + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml + +junziqian: + Services_URL: https://api.sandbox.junziqian.com + AppKey: 2c4399d12cd9ff33 + AppSecret: 87d3e6a62c4399d12cd9ff33c01f2d37 + +#旦米短信 +danmisms: + base_url: https://openapi.danmi.com/textSMS/sendSMS/V1 + account_sid: 8315b08c67c30decd030fc25d9766fd6 + auth_token: be7e9a3738882ca188d85e9d45823a09 + defalutCode: + + sig: 薪资社 + #验证码 + verification: 1000000008982 + #充值到账 + recharge: 407811 + #退款到账 + refund: 407812 + #发放完成 + giveout: 407813 + #账户余额 + balance: 407814 + #商户入驻 + merchant: 407801 + #代理入驻 + agent: 407809 + #签约提醒 + tosign: 407810 + #充值信息 + rechargeInfo: 461126 + #开票信息 + invoce: 460599 + +ruoyi: + captchaSMS: 1 + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt new file mode 100644 index 0000000..f589ce2 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ + (_) + _ __ _ _ ___ _ _ _ ______ _ __ ___ ___ ___ _ _ _ __ ___ ___ +| '__| | | |/ _ \| | | | |______| '__/ _ \/ __|/ _ \| | | | '__/ __/ _ \ +| | | |_| | (_) | |_| | | | | | __/\__ \ (_) | |_| | | | (_| __/ +|_| \__,_|\___/ \__, |_| |_| \___||___/\___/ \__,_|_| \___\___| + __/ | + |___/ diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..a2e187f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml new file mode 100644 index 0000000..ffad843 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml new file mode 100644 index 0000000..2573ebb --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysOssMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml new file mode 100644 index 0000000..b14416a --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSignLogMapper.xml @@ -0,0 +1,44 @@ + + + + + + + update sys_sign_log set update_time = now() + ,sign_state = #{signState} + ,app_id = #{appId} + ,contract_file = #{contractFile} + + biz_id = #{bizId} + + + + + + update user_worker_business set update_time = now() + , sign_file_url = #{signFileUrl} + , sign_status = #{signStatus} + where no = #{no} + + + + + update mer_task_enroll set update_time = now() + ,task_confirm_file = #{taskConfirmFile} + ,sign_status = #{signStatus} + where sign_no = #{signNo} + + + + + + update user_worker_authorized set update_time = now() + ,sign_file_url = #{signFileUrl} + ,sign_status = #{signStatus} + where no =#{no} + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml new file mode 100644 index 0000000..5e2301f --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/mapper/resource/SysSmsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-settlement/Dockerfile b/ruoyi-modules/ruoyi-settlement/Dockerfile new file mode 100644 index 0000000..dd84464 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/settlement/logs \ + /ruoyi/settlement/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/settlement + +ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-settlement.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-system \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-settlement/libs/SADK-CMBCNew-3.1.5.0.jar b/ruoyi-modules/ruoyi-settlement/libs/SADK-CMBCNew-3.1.5.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..dfabb348c2d0cf08361151c2f8124c3a91428c43 GIT binary patch literal 3684247 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%0D4{G?6jnaS^2lXcK7x+(E2)5%9MS|>M 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

iV!yG3PpH-e8@>G7} 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 z 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

rWwql1Ulz$q>askW~VVHlC&=!p4&E_EtVTIXS~ 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 BbZMgfj8?EPg6~wvgn6COA;SN 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ΜrEf@h+ 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

{xDn~9W!whj= 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 r+{lGFhp^&z#kRX_I>>GV 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�U>>s7kk)A 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

log;5d5iN_BX6dwPC`@_|NmL`PqwFWN)3 zrg9J&){1!C!If+jH>+_ZX2{i(53YJc7SNx)-`HUgSdgq_8o2dRW4uGrlBr^8##YnW zla3?=7Sg$1`@AI=_RiGF_YCQq?U zAX|2bQPgkP^+FTf3;C%I9seos7(}MkxD`4ix4AJj8S7V}1|D2<4$)n~L*bWlQbdHF zCNS`5%9XNtBHC#*5-@&|fZvFVB@pnXr4;I2 z0Q=Px{hP&An8*6U-?Kmn)Q z-7hW#`QM<^|1?(olkmB}j`G(7rKo4}e_e0M&K^id7{lAkEKLlgBbGIhlM$1QQ~^E& z8Pe6~{d1WuoEYgbnuY`sA+@D6#lH~OrB1fmA*|Ax%r^N%IO2X<#b3r=7P(i?uvpD+ z7Es+icFm1WLx5)=;)!iPx^6vgnPlU--F|?f8(_IA!IT?*R_V>Jc$=?yug2f*X`+}Y zWjH9C1U`aq-baMcYY~})r!!gGvMAtTVviR7aM&#Mot0#VE!(%OwI-2TzPxv&BIHtV zfEi!V*A{eOF3q)D(q)sDUm4tUEZj>Sbx~cBFNTg@VCLLq@4IAil-sCqU>T-|S?=*o ztAZM)2qVl0T*&GJe6;nr^`V-t(sPEL$$et9CC&5+LkB~OKyt99U$ms9J970$sQ=d7 zlosb;Pp5Lz)DspQI73zki4MhxqB63ZIfUaF-`Sj?}gJS8j3TzYkAGp+{Lm9Vol3HV^v_gbCvS%1G$&7%A)s z?5w1&){bL2Ma7!wRuw5%k0e-<#ocy54p?X7>CZdZKXBXt0RdJ62c7V^sbIuquk7XY zjV*Q8m{Vn1mHEeAz!{U|H^+?`ivty~2B%MFZ0RI;n`VOrdEUxQ52)wy^3<*p?}bu> zg+?E9hr4t3Q>SK%eyFAOD)`yJl(Xa==8oZcL*fO7TX=>g>4Dw38$H7zLQWLA(3bH*fbb5+r)}K} z9clc~`T=56nO8>{6Ye%RCgCGfHF|@A7FcapUN)T-!~sMnC7Y-jd9YUgG+wzc&gNI%Ef_gkfL%4w>8q=2kZy73OW`QPhB+FsGJ3(-&_MLG`3MfQjGFu3UsMV zD(kH63=V`=9UBVPF^(B#9mq)f=UMw;uz_hbeH(~ zm~$ZrVh-%a-xx}3W^Y%04GBk%UDJKMg`P#Qx2iXunPt7=hPWk!CLLkRg zWqA^f`A|q};Fw;M`p0fP(xUL*UKksHoQ)Yp0iU7_$kI#9k5|j{k;mHx#ZZy&lwfvF zh~G4R$(jb2d78-Dl=Zv^3WTh<4(>v|##Tu4AKNdG;W%w=73h`kD>}T;3!8ZH%t&DO zo@yieV0XsuhO`i*JX2nMU;iQg^7f1=qKC66dl*V#@FQ_Pq9=A=s8Ck&n++h0qFa(`W^DTEcYBy@eaMNO2>f+9kdj}G%Q*z)u7UR{u=hZKhUl*Ike6S+mv*H*OdD~)8u{)C(tbm zl35B}S2Y`s8QvCQxBR)!sBEcG4z?lzrZL90Dz4+^OqsmsYp^jJ95)N(afH`0P^RWg zVGxOaFbdjK-2SF)JRCGv>U+6ht8A}VOX$oN?xv0=fp;O%TnJaFU?tH1ZsjSE?|*`H z^5w+ApHITX*jPytD_jTRurKoliLbBYjqjH^w_#8Rbf!({Vn%b9ES3G?M@rPpiihF~ zr%n1w#^zL~eP(OX;rwlhpDuk+C*VI-E6L$bp1wtp%}m72!IgnA5h$}?07MjH*K~1` z6>BKYQD~dTq*)%x7@u@|@*Guh8*(a(32NQ<(=9x7;pBICwtQRN1YzX(#nw zM4q+Ce3fp6&SG`%e3nvMd3@Yeh$egJhRkO26JW3(#Z_*F&%Cm2e2+6);E-YE>Bh2q zK){)&FdjouQweKFcseF53f+YKX-Z}EY8kx-opgG>}P`51*9O-XbYUpTvITC5y+*V}0vKP*_l@_ALsWmOChmarUi z2eyabwb->(fX$C>eivviX_xPB)P2o<*-}r)PwWBNP+quzBY&M=Pk}pV2wn_NBmp{* zUKoI6e;vN3#2pm`FXkua039eV9Kf=_4Uq@u(@y}a&$j3j>~%W$HiQ=wpxI|z{E7B@ z9lRTdOY8|}#~INJ?P)V$+GqRA%(3%`;Klo7-G}$hJLWpL2anVP?n%4v(U+J1$?IAK z!W;U{t`E)!kN6GZnhe4l^3AL-8^}B9`lu(H><#o94T2Zs0}(*y-_8G2zEh3x!SRF@ z&<)|0a^2jsP5Op&?F``!_vYEh`|UI4I=Y9K7LX19LGfe~;2qUEbl^C2R9!O{WD|8| zR(@slW?gs-&O^1RPr?~Kz1H#lmH8E>tGIr|n9d3K%q+<7&wHDX!Lu7CL+YO=v1(E4tIcOn`z`RO<+NHfm zdE^r{5{2Pf-V%{SgF9|z`nTwFnZV!=V2;}W;M~oN@+-XqPApl?``kkaF_d;p0V(I& z%=_G;(1#b<`=^ z_dBdE=ogpYqB>mo!#t(Fw}UzPtcBkcm2#O7qoiX-?d9~w^E)?zWTlCjo}l>;LJFn( z{?{i!^}{qQ!N?-+a#^u{GX4BEsyiWNq;#H0-U=h3^a5q>Z;|4)3WT@7L7?2aEGx=B zN1ftRwN|9^w?Z1?hS${nRX-G4E@|b7BwFz17kjd#SPv?pgoA$asWHV%3Aq$Op*&F) zLJ~tq8Jkm0vHmrozBCsXdd0&*QDVSLpQt|JoZcPR*5TaZV7Eetqw#@c%eAwFKnu6; zpJ>C+%rz4wEVWdL`(NuQCQ;*EdawK$13z<_08#=0DUfz3oA4$K5-rcX(f#UAR`k=` zJ$u;zJyfTRZ@GXxADU>rGl!_g8Y}yTL;ajpPLTVqUibbFrnl&-@M4pO25su+>#&@x=4^dUwo`f+qp;Uc9$QX2Pk-kIHj%!tZGRbxdH&5`{+}ED zKaqs}b&P~9zm_24FEQ9xU7NU#ne~60i{-xpZe@|V>CDnu#w{~7GP_xdE1S%;nkWd# z31Okq2N}xdAwF*6x|Sk-QixGL$-RMml?Y{qF{gwg{JAi(aUQ*xG6RiZZ>W#5!>vCZ@UM2JxwUQCF z^6l@$!EHl~W>u)u{b7)x%akLr@WY_L*lBZ5j`;Yl_avMWM@DeWepb#wY0H{vLWy*_ zQkY@Ta8I{km|mk)+6|@?1)5*vr>0t0Rt)VpJup*?t}ZIok12v_*^D>wACPP|Jv|M4 zNcG0L5Uf8pj9Nawx`rV|1T`MAY)usx!V(ey?_Jko4xVv`-ZFCc3yC`%`wjj-Fy#^V zMNZ=r9pflQy5QycXa=!Y2?>I0#Lx27u>4ZNWG5Ej%btNtH-QU+M^f$y8mf`=b_iDq z=L}h6`k4q#cMw@>eU4IOrjS#^9;!$O!drw3$pssKeT2-AQ0I>wvX*4i8PU2xW_Fu3=jf#?cJ`rk@IkZ>n~n!J7@ZFNoMm_}Fj#8@0aitA8uoK-s1e5^O37dk4*BFYqg% zDbudyVd*nJOG>}^SEgL?{ALDs`?Tw0M!d)C%`=q`0+(zp9MQ!Hpu-OeBce=nH!qAq zb4(vQ`G7uGS6+y-NOA4A&`S}DW+Il!zO7WR6KFm3n*5HM^nH^BdmmB#{tTCe!!{a^ zfSdn1b8nA0w3R}V0q8um7%i#Osud>t$k#ZL2GGRwg$RX;W zDpHYA2tg&6eY0rWKW`KQG7|WKn&C)nACIiqmeQSyzrr3_Z^EUmv|PAqG=n=%<23$A zGMJ1ymJ#e!Y?SAsy)rxI2kV`G>MI-@AUX)}$@ODfQ??Z52CQRV=1kPss3`xOFp%xH zgEm#|Ar!DS5oX>PL8#xmtYm znR1_%1Z)1PbUEFgMZTu5#m2Ybwh*o+!UeS}6lC4mx|sJ0|I>iI*ZxkQq`WRx=A^y3 zkt=ndii%j=#&cY9M|f#!rR96%O?r9DnQYCl>3T-wd znGxC3elh>%9^>~`;kbjZrrv<{&W0@SZpTJSGgk^Si31~_>y1?v|7(`qPAlLFHnwxN z7M&tHDn|BH7Tc=FL@aD0k%r47TJUq+N|*U7i>9?2BE{-kJsT=;sXJEBwmHewAZfw^ zRY6=e)=blNUhrqmHS0CV4}%*&ZSx2T37+B}LW*K7=af(kTV2i~L4v1rV5-YOE*>Z>jKh!!6I=6d`zg!@v}w z075H;88WrXxYHhDm)wPXH>Ssd#46nJ-{*$mu8^xGs14zQBxVeUfYwWCVb{;>U9G_t zMnAz`lt=Y-OYF!Lef$2`U1guO6PEdUOq%`;SNqQgh4mlaRRQJyAxiugIIMc6gS?F4 z^#k>{T5x%-@_|3J9^-*F?Xv+6*5V!_(A!Rc4kS8o?ro%Q9mib~G;P#Zx|Z4> z)oeFqSZ4tP936)PkDDv_5q7&yWL`UcSk{Vrt~alFHRr+B9ihzw>+AY0#6ftWt$5+h z*&%v!q2ty+cX80F!27E?7)Wwe7xjf*=qo6Lmde1$h%K+=gTWNDIZ7ybxKVFmjt%6T z_?3hsLk<;$^I>?T zqO9~P;h=~g$u7d2WR@W0Csc0*MP2gzxCFtOEIl!&ip8Ig*=o(RQ(O+Iv$J0+8^~N# z!(^;R4Ts?-8JZ}eu9=(X$DA(00;i~_6~efiXW|xKMY+@O#)UAiO=2(*jSkGFug|=X zEhIpd_`pB&?K1n$q=KU_)l8QZ4{Z!z5%A+TG^{*WrcpD#h(`VXYfK*Qyx)cL!gxr0 zL4^%}0>8BrOuBZdterhEHj|S&hoGao<1F3SvoV&DBr!*Z=*XaO=FT5q%X#Xf_#F+j zY(+D4LG48Lwj_h+T3gc*UAU5taa#9Q9tjB!B5~6MaV__SkWIxAy0g{I^5{XuN+!#P z{RI0B>M^My;1wzZ%;8mJwABE^f!wjNy?OLU$P%k~%reT+xdEqKa+}xWa?#$3+p7yTM4{iqqDu4X zT}mEJo?6kj;_Yx)L8hdNUa6y$%vXPjsTx?{HZed-Embf5r43pT_c zo-iL<#VsZ}DF4CiwMYbrX^xbEjM*4^_^eBB#NKFN$KP-sGYZ>k4qXkd;|;9iF_7-b zuo2{vo{b@|cpEdkxVN9Br!`%b*~HBHN<(a&uXij`#g7%sK&XK^r8|-6w~v%JN!zi; zld(}X>EbhHL?gaQ@cuc%Y21Cu7xK@`oa~NUnn@8e$l!)h<$ zN*YL9Vj;G*d9QqGj0|gYV^QWk)$v=Y zIu#OMeMBM9NOX%a>F98zy}y?1_H6k0B$wn?-=OKrqm-ADX~Yk7;$Njso_A<5<7z}a^@|2%3U3ZW+Ss702*n=wtGvJ!JYDG8%#Cjc}$&7H07h> zeOa5}z95I647eJ94j+aT;q8V%VT&1F<=on!5N(_vp(u3&t)9YX?ZJy;yMlX@4k(?o%obe3bZoXZS}@E(hYefKFr)wB)bEn8F&Y~VG`nf zlTT3%?5p58z27xthL$vippO|cwHd_QGO{&6Xt1c3kD*zCb%-MlnO?Ez3WmIs@0`u< zH(I-8tGg6wmNZe0HnuDLHTJeODJ|TLgQ{o&594jXmUes+=kXrTmx8F>f13Z}eh(qs zC5UjCc=950Pus={`*Ctr%aD*;xO5n!iKyrjW$6;64J*6g((n%3&ZuSX9IRG&r)v0=c+{pw`QQHEEbbXxwXwB02wbhw}8CE((O6iSO&b5rwos#XV5hg(A_##Q%i@rihxWT`ol}+)>NNV%z=gZX_*F(mKwR@Md;LP=+kLE6F~jYSpoe_3b_N8Wa>=|(Tuig4;K}n{tmd6!>&iF^6ws~;vZjWqYbL^ zih^uzeR78UB%(-%LW*$>sVS1LXCKSb_qAz!c2e6(pQrdxK^&yTV!{YrmQ6qZNxWV7 zv%uTrR~&qMI*G;{b!?3fNq)orWdQR;ssSP?Nkeh^6PqS?ZtV>tkT7t7yXQ85^?i|Ea!}68M-$`9Pc2n1%*3&4zT3e zdY3tQ9YullFbk_N*6|YA=@q!<< zi)7LY)?+<%T}!mz3+&RC0LfYW4-ObCo9zrJ+NJ$&``q?LAHm&7$#P)-Q&z-fY|(Te zbBjvaYry_HEtd}wqo-_IF!oayl&gy>DR0anf*J0l{+|>iUPplC#z7wkcH($+yKH1W zEEk|p{cR-hyKj6T9_Mudk_^N|u@-rs7r{*gFt42+!zH3TZ{ln{qnmVEw%DJJpS;P3 zXmfA!U|w_`SB|?zWZHJSaMB&8J$RtYnXqqS zG4@x}ux~;HG{%}GH4UUKo)R_0E2z*3f_WDt8iZPaohn^?)GK=N@3q%+akoQlg&(#i zDjf{C%-`3?k&QtkO}Q3OA%E-&d;Xk5J*9uE6jn`&DCsLh5L14}9OLBV4ERNkXnp?E zk3TZu=uY8K*j2^Df*3RG%A9^Jq67gJ6H+ZxOT*>H(jd9-6afRnS69q)mtP4VSGC(H z9U&rqUNRl}j1Z?%cwxx!Aw~*nOb9cXf3bv31veRzZ=&Yrrm+!0%`})VB_PIRdu5ix2I7~tZNlRqwMFhIUaX%hng352*e87J35T|N;i z#!VWh7a{1JTUI79h{nBI*lUDD;*=7A;#FJgFD$XsOGXGMOR5XyFdlfX9Wg6Us%n7H zK`<+9919ydLmQm*BblSjTMp?j`5pJNUDfFjmWscR&$!CX$8QoBK1R(;jamU?S zm+c(<$~UFp?qWt(P-RfwgYZ(PVwzbkJt+Wvi?k%tXrf4np!7P;&%GdEpdD@T;Pe+R z1{bAHEe`I>eZmmmWVF7BkV{LjW9A?%B{cK!r57F|0+~DR0rNvcuSEQ1z(e;@Z2D-% zy#Af@J4vo+sJG`_NJGh$CxdU_+GCkypu!Mkdf$Sep~!%ORDB&SGD`Gn{bJNCNb<&Q zpnt3~#G)}{xFE?NCI>~_=8BA;*8?#H+%`QQ^auTu0{8DI`**SV)@;LQ#VKhcKER5s z?6?>?7>6YfKr@pWnaYY29^A1SUYWI^S=}R!wNbxXI*EHtGfpV~4`=TfU1@-B4OYdr zZQD-8wo|cfnyGP6>OS%!)p(>2h?aL7$~J7Ft7!#} z8HjFS;6>J#ViEOIiWQhQr;KI3@EdN&i2#@s>di}Fpf;<< z?2J3c6N^YEkw8&r@hv!V7^osrBvG4pRL@N}*c#?DCFP%F-Qm9~$nngc5(7Ayjx_owz*qeTDI$pins;SMKtsZ8gF9Xe8#3zQs?AL zpv+v!!53#mv8g$M3Y&+x?V(m)3d6|8^^cafR75-1PC}SVNN*lls4Q8C^4-aS>pUD@ ze@>D9yzJ$+c?bVW8vWXELm$~_#nET4HX1<6$FT^&R;yrP=Zl(dwFfO-4}Ze5CPK-` zuxr51NtuP6%M3)L;!nyQfFJ{Nsc`C)^`H{cAEij_;lp6xD+X**&3B&Z^*&T=Z_nyC zf^&@(TxzeEX=kWSoZJq!}#30V~HniqN1DF)bupEXB#$l{8PIv2p5Z&FFMZIm8E z;0p(0M=@FSgR!R@H!7q@ED8rFoJ;34<2}jv|6M`i*KYIg!8x0Hu&%aM*S)N{P5YT! zOE6^r309`r(hY!G)l$=`h(Yq8YLAM-cKf3{^owzSxTo93aTBlxr5m{6u#en25mhnx zB8I{%VvX|T5Yz7jOs#EEdHDFq3K`UWW}$1G(6ido79N)+KjgI@!z$-%d=DXmD_qH5 z*-1RhSF*LO2Zua}8g3QfE}iqFE{o5cMsk{SyEO*h(DxSGj2aG}c>{tZ#xpyZ=JRK3 z*3Efuk~R3S7p+DnAJ1J=Io{GBkG2H6Tdall>aUd6(d2tM2Lm4?ab> zY|Y)mB+Xq$HVb22c~foYiPqPO50-fg%3PBu4Vu~V7k6WGc>S<|sq-vG+i(7f1Dna# z1=dJk1G=Rhs~>Ie7V^|zk`k12-d&3gXs6w?=?z4u-K*)gjULIif0^y+JcDICE_tS= zTPFDjUrg5D2QtB}?rAf@t?yN*VAngN?p@ZssP7Q!CtK`&{H?eAPpvdkRz-h2!p+5v z`fTOnm1eekr~c^+TC*{FBCH~1??T6fe;{l)Jka4dLwo97RZRbc*cy}aMbKa;;->$A zsF!4JSD+br+p#zu8q{)yuSdrnF2s|blDZa}P!m5ij-9*|u20DkA_kg@|GIx} zx})BCqVx%Vr`uJVsL9O9(Jg3(tli8=nT;shJedhZZbv*I2(c>09e&WsT!{kfVlKe; zvBkgBG-7H%f7w*8VmEQ#N8#lt!-noM4`En`^M%{B%pJ7dz2ZxDmoK<9!WQLQr!vaJ zQVQkEDTO*Al{!JEK83Y3e__+~=BM>Wr}YX|y)00Ijt!2%JogJE=DTuL) z;`d1!XjkZMxsZKz#6pW3q03h_f(sqwpHGl6$9L>2B#haLhME)?MkhPQ(d1hbsckbMIqvTY9 zm`^mCDSl;orohBYizuuh3Ww9}cuzPnZV5!j@a{)e_QthhTl&UjGR7O_FfP`f)4e9r zicz|(-(!YN01rDYTMMFJ=Jrg;kn(PPy2w_C!d#$Ip)OTdnKysQc&W4Hv2um3%_DWC z52>g14p#v0h(pMA4x@wx4Y3Kpdz3IYwUa zC_8tB*)EPUQz>Uw%AN4@oe^+(gX<3LCMCL(P0ohZndW;Y0^rv}x^rzH3zR7(p&Xdpm=3Id8!im(I#xWCM)e$dNb(=*BH7*x5X zrR|_%`}LFf32JYH0qxjoF;m-(fG{jddCTz!8K<`hxji*x6b|e=*Lw!yeH2GcE|6rD zaYdr2)kwZx(v91y!Q8Ivf3PO$rq6w*Tx=KV;tlYC)v8fqN1{sbYw--iqw-1pDsD{C zxYgW2MZR7ICkJl1@XI#NXqbn0B5n}Hl?Q(qwK|Gpp(4}QX9s3s46Fu9^Lf5Me6}BPRz8oX8;CP8fhRszBFPQlQ3ReKnV{FvWJ7K%>Ggo&U&}n_2cucYItBiN~+t)uv-sa-k*8u7IjT z!)bz&Q|zg0eiUg~r%z46ji(xenVKrh71qTRTF(_$nP+HbC})rr%B&eI3wdi)F#o7}E`b-*Ps~F!CnHOMN#GEH!V&*;7ya=i~uvlAk%qkl)0fbV{j z4qo$i!vI6?GqEq1`kpvSif?fXKi75(Wv<{N%MgZILb{O&jL5IiG@Z3Y=A-n@ zIZnzVG7t!bpT_nES&hra=I#3vygc~3t99U1^UQo3TuA&Ce@s~N%qkNMV%gTSRgP#O zjZ094t{Gv%q$}hyM6>tEAC(0ehZ8A>iFj1g_l15I-cxLzlfZal$$pm>nzsB~9#$;K{6(=AxY&1G zo3dq0j1N-9M!zSUUCPoeT%b>2c;qF&dex^dtiqd=ovpo8<1`MZb_##E;+KhrVkom3 zb1);TMM6?$*Kg#HD_STrDeG`&R5v=v_V&RJnQC#S=!3^r+c;{<$?DkC0sb@vyZOXeStFMMK9Bu&F{XS2dw(TmLFxnR%gUpFlN^9z{r1puys^fR2x7Movn ztTY$vZBdDwM_4;v#=Ua!gk0!owkeqob5Y9qjki(fm_n+urJ1NrL;3Ep1*8TD?V!#x8&I$8iPt0NOgbEs|_Uw z#aeg!WDr|&!~YnJ2CjSE8X}I&(B&g*6XBW8MbVW@h|CB>&{w*5VJ4mD`!$!Epj!4& zl4g9Q+q{xaZnK|GH_Tk8o~S8~!6a>mhRW4W94I0B_L*8ehWq&qU0k1Ip7V1uiF3Y4 zZ}+YUKL|J0m>TrfSon|^5GT(4p2YOA5buqH^%r28GcwOccQIyxYuH}+XmBchMh@Bz z)g3Ii9y}&8lHash2eJ@;NA)exX>QUK5pe;IB(5(@b$M6c>|uTh@%wlRz?LaWEKI~= zA2oIdEN?PvEwNf?7V~?vpJSbTuy{8Za}%2(N44cJq?_YFCKx2u<0?bwOrLK(a;bs`m&0o z{)J7~YBNr0Kd3%Z*ZEbqyl`11xbDagZyCTiM5=^Olptv= ziyq}*1}P}s8jM6nM`lA-B;Cw-%W%tPte~3K87?G~l%(-&Q{Y9ha4{y>8FeXD3c<>5 zS~rkY%U)kfq5*vaNI$t~H$H%vwYeZz6PLRtbhJ?L2Pw~+Ib&Vecjj_O2ET#uj^-7e z;`{{wwa5DAHTYKcL5z|cK8oCe4-%1a%1l4@Q)?#@Z&9TMd(~*k<@4uXlw4ua0OmD` zvZ}OFSk-%Dyi(#%Sp&5A1(LnST7?o#KbVO3s-5Q#;b~4wXsGpqYok6_!#stWuGZa7 z&@2S&GFBcDU35ExwV^|UQtRTgEUvHXp0HCCuzwE^)RA6Pm5=9d#peul)BL6H>#4ul zMn{{8^)2(KW36g)oX+S1q1u6Pzr%2^%gS96*seu{y4ybpvk?c$1@Sip*i0dtWs~=6 z5yp1P{Ad&XTN!IBN()&uSVAniwg0D6nvY*dr+T=8lfLGtv$K6_-1uSq%sjnLjBXZh z`x?$WdUzbfPlbgJa7EA=IjsJte~dUHaNLc>bl0#sSU1<7hNKfm9T81Jlk{)?R5;;! zJ3L;#91?DbIF@pJvvZ*_Z`X!May@Rxi4E`H{c|_KGp048SD>i>)PA&&KGsVmixVF}>s>Z;=?J{t;3G!^Ly=rElZD&VWxjbWJ zxAQuEQxbjoQ(kD5hdH`Q(LSwlyMkU&@-o|zSo-U#tg#8>zREY*Ydapm{~+SrgHXiI)+bqOGm@31L@NT(UdG?X!;URkiHFKX zJ3>}RX01-KeD;2hbvMt67ZO@;KNS>bc^cNUITuNO#5zv%^3hMbPmO-3LGgb9$q(P- znArKk%s)$pq7vd6)us;(;3%pi=MxRKBVc3ljP2ONE!U<6hLdCROcKVt33|~E7TZ;r z$dB(}14fVEgWfipo|7%zY1gfpr7yb}d>LU!oYqB&AHK6v?YfTI1kBoZ^G=;O2Uy3? z+w**N?lqmT`5!aUo}RRQj@p_<0DfN^sOCA&)9D+g;{5g6+#5!vX0|21_~UbgflQ^z z+YOr(w=pL3yFm4(X;XQp>w9>ZNjD2{7}-}ErZVHTvj1=?Yn~<9S!y!|%Nu}Ywi^dy zr!5%%nBl9VWj^SrPa$Mn@RH=N4u3TtcN`7$S9t9Jj%+r4KLFd59l00UYB#VySBr4{ zhDAy)DFs4Tq5gP|Y9w}Ryd@n|Tg~6$1zz#*E@Ez|&BG8)ob{vaogy-pQu(5D$K(%1 zyUyMbw(9}W>(@57*`?J6c)zK>Yq7mj=x+)J=}4f0%Ew^=bL&fiB4sqjbt;$Iiu`EX z;J>&7SxW3cgCP1!zp z%y{+DVmT=yJJQd*@3TA5oUjFkrf5{@#NZmO?b>kjB(0voFl%=HW_zfn$PRl+_yfwq zje9khDrFC6n?@8bY_k@3=KcrxCo|bYYq;F0ep(*6Sl;P${trORN%F6BpGFkL9?Yzk zgEX=ncQ5HX5Z7y88@^wwC93vOQ9Xph{n{oiC2&B=Cy|psf(R0gszI88 za<4=_unurs6vm5aCH`46kNplh1bxCiFzj;DA*zCr{Kt1Di17NCcwHaqMnr%w@e$|~b;=+7M@GV#Ck9G87`WhQJl+|W z1U#EguR!y$x?cx0aADc;*f+72*hb#cB)oBt=%s+aSV`1~@t|wqLRSz2DM;=w{QrOg zK(3B`+V|}a=l@dP$?+dTfryas|AP&Prx%V2>ZeWps77A-2t_a(vjr@=aL*l*U@tuckj&@TRp8p+p+WCckN<2+kf|T z@UQL*fS%rNaOvS*>LB2sZ?$~U%e7%>nzp=y8cnbzT zO!klp_{XwAE%)__+egKPgq4HmZEOA)ax{=m3b zRv}(V-@m1^M%f9OdWz{<)^yFHXLJnN&23cI8o2xk8;qpH$#F1U2p7iYGAtM{=|@N> z!QgTYo@6nlzF%K9?`tWNacQ+P3YxWh!?8YyURr&yG0!OL`Mse;>;=R30kbNddB3xY zIF+yyZUL&xRZ0n$wluu3YX!M5_2M=snQ`vq4%Fn(Et#;o`R)3syTVk(M~xT;yE?nc zabDvVd8+WXFsm(W#cTvao5tF}73-PLLB!CZ^&)c9_6QYSlasAT70=l*&e_4vU6n*$ z;+!;ES(&Ju%+qX&cl^+%wAp#Uh+FhK%BUue0U$FjeZznPX2H%JamT&dKBdmVN6@C9 zkQN@kg0t`C=!57q;o)Ks27{1BExA0B-+?*(pm-_I;TY{QUfBxsCtI}g51i7Rr4OG8 zUmVXII=)QMWOb;~bnxn^Ww3Ar0Kw;UsD`C8QrGhq8@6ZYy34aBuGqh?uF` zg>RMEeONWofvwqfu6qOk`1hz_m-j7TJrA9UtN-rFG5swDWUUnKYMyS9&yCnM^;0Uf zwR2;!hD4fK8iYzPnHa|x^zTL0Q5)Q5G4eKL^NE;8{d#K<^tNOv=YEvK$CJ_Y=qbxU zw5&**5koSGzkhTSWPcSY*QfI3kHpQw)*@F`bsvxDF?*)|EY8El#o7W3(DVFu51D&FM^D?s?n(~l8n-=PWy@Q9B`k1JdtP=77hMXA5Ema2u9wev_9LAL?q z_LK~cbUTwLK3{X~T=?*fk6ba5PLO&u@wxMEpsvBf33O0#Z171A927CB6= z>bVMvGX;}F8iOyORqnNz7_8^pY~B>9s;eQT*?Ettbcc!R>9QGcrxVK7fr0bMZLUe^ zhc+EG>Bao2r7>Hs7u`XQ7}0+O_q|i8FMY60pCx(EmO2r;XlsT8l|>keRIh`4NnIcq zor9D5Els$wQ^tuW92Od31JlIGyzGt{L9M3@`Cp~cvrhU?ZaUVkGD(SL#%pyzvc7w| zWxvA;`YVgR)R0Il+5FCGo;25hxM-fA?ZEMFDrhLJ*N$YhLZxedTT;|Lp7SiNaXsx? z;6IsTm%nyAO_AUJep2{~mFhuBvJzU6c8C7D?Fte^siTFI{k4cI(AU0m7ot#Vhmt)& z0fmMq%E;XbW#~r7I;ZqS;$_I8`~~85>`~4uChq`$;M(vWe6WA0G;*xP7jUDt?(SP(+X*}zjCH1HG=3+c0XJPu-H{dl*#qNIqn!fiZK*1vFhWn&@zM`sq1y| zL_*C2O+qg9@WLsgJM@+53z65V#urYaz2H58!KWX9Us-p;-1f9%+BWSEY>*E?Q%0OY zn(Ij%T#kDnL)sFoZ;987IJhFoTSmTt-8lO#abQhyO)%P#5VR?mk4M0nKyu88bVtK} z=pKJVB;f{%f3$e!po90Sfjr;_Uwo$@+VzWh)Vy!=8G=ue|LpnlkU<<1a{r?Cf~)AK z4gECslTYk6>J0Ixqp2Kd4gwKn`Ad;lH;IKJZY8n{c^yTg7trFyAms)$2YhS5HHAGq zvz|dSy~o-4Lwn-E4~pMw!!vv?o7B(A&f9vrkn7Q9&TYkLmE?y9QPS%^%IK@niQp9x z5_aX|8F#emr|YgL5u=xhDFV+gTe9nrnsNqsoa%q#b)s<9Md^|a(Wm-s@cOB(uj!>; zVsE>N_r1aGtMgUj0F64g2V>%FQMXpHUQ zaK<=v&D>8bQ)Xq5(ae%IL{lS|nY4!YmopESn1L~K@j@13Gd$}9=V8A1V|EGSJ6

_V#*!z||J|Q0-vw^t9GnRg3I! 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

osA21iM5CDe8sX6d?GQ&qM$~Id*z_I_}_N;{EcL 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

soG{4R-{tV( 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%0AS__tQ{e>wsCN3h+z>olcP7Lr{k)T`&7L1W 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,cwi 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 z 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

J;hhV=)n|6#Wj@R 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

HkQgSC_POs#W2oO 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�K`Qe#lm{(!VaDD2^8yc~Z56Z8v@~Z(K%F`%$Su|*eN&xj5l!^us&SV}j z29wm;q)lQm54C$WJ=C`(H?fS{b}VBVbP;QjLB;j(exnJD0h|3n$#r6;r54es7S(Xs zb**?ZnITNZFa(7_Nd{Z#cZLANn4i0#vIFl6`d#pE(Of^dCsiB5C-C3{tJCD)l0Ua< zI?ZUkYy~jmg$0`b(jH|$5(UApVZH{lhpJ_3Mb{hZ;|w~g36hBBI;6hc&kxd9ZRyqG zMdsV7Qx&rF5OuPTk4WaoL=2tSr=7W>(j09^Rxw8B!V#-u7Yn_Ttx-C-(db>ZkD>LW zz&=DoFMR!qP2X}%@XfJ!HvaO9zT4#{NFWzP)+qw_7rwzE(qaw15&!D#o=eO`0ldzDT_$-(Qw3PR}DrF3>eodp84Z^Y#O(sH_fOz0tz7L3x9 z-{$VKNlXX8m>{VKy~{9QcU0;XacUD*@TZ~@rB!x5EV(k!b`6lL8s9CL4rjB<@iK6Q zvO|d_l(<;+0@E94q*SIgM7XYLlwz{)K%@d+b^$030+20o5bV&8kSukFaw3EQ?8dmg ziiY4tVQjM!Dk2pc@FGK0YBX8Yav3H^Sy;;hv^AlcI*5r~)M{6b>^G@$*@+I=w|owC z(IaCPCj{=Ig86itu5^>KtzUm0ti@;W8Jmabu6~Z?{wCL%J-C^EIa-(K16jgj9MDXI zU6F9P0v~Hq#=~;XBge>^r#7hjgeGiY(83f88YF-y#ooBRjM%hMg#^Ye(SyRSa?Vs-a2 zh^9xWGZO!GE5#MXkk40 ziW_i=Vl+wN>jpJ#pHm__0nsbarQzFw^sYjM=BW|dpSukjird;9Sv4yd4a@)WsZjJ6 zKSf|?cItM<;5j*9Kc_{YQOXTDF5)&C{@92Do7OKHx)&v6Y}BGwDB@Yd$>?g-NY+v@ z(o!kLP*si$;{NPdM#TALd!Cjp+CXU!v8Y6X%4M#?J%V@#JL221L54elX&5G*>Op#i zqEveb^~%pBP0VpR)ga=;ffev_Y6VCgZ(6CvVi< z`h}0VcsQ=TGQ_x^Z-3~rLa-6C2Aofyss;WX+5Ml>Wq*;~KtlAtEkLT3#-u+BA^Btv zM#b!7JRTCehY?sWMCL)6Dnf}PQv2iaWV5?wk=@IJKGQ0I05{_qW^<9PhPm7$0$c|Q zThtd-b!!O~7(PAJ0RUV50nvCEHjK2Zb#>N&p?+$S8x2Tqe!ysI>lqw4hc#75dIrLR z>Wm$=6HNwzrgXC+Of7ws{Qaax*ps`5Vx1Q67dM zgWWEqTM(fr%uwMb1`WU5eL2VnXt*fxd0V}HF5%Je;wB<&p*T)k^O6MOh5Q`5eA-26 zZS1uZe-0BalmteK(oX-shCG&!RqC0YP^w24Kzg{=1Cmt!ieF&m{H)GrJW!qm=1%Wu^Yz!GUC(E%kyz#s2buuHIOzSBsQt8L zMvC2-piXAe4HzRmUQA=>ot(6}*>JIR+6KcmhFyO~ZIppjW&&c0Ld;lF+R&TiC=l9^ z8;$;D!(ZW8-;pT@$7bU&S#_#?=kaYA#tl8HJ=A$ zv{IMoEwYW!IjTBMIyAqkxGe;)rk_6r2djAYHD;0q(S%sEDZ|;^45EmRj)=D?xDQ`bRFUTzIiKAPp&j~qKPK8tj-8=FM z%{!J5O{b4_;1KeK&(-jKldRe9S4xNQ{DbWq&=zAvZOHygK%zAAtNBl_Y_0Z5xs0fm zpSF-G0iGpi=&rb!_Ib%vn+s*TvSwE?+t+9^-Mb3o^{YaiS}l)sm~{R;KCsWk1$V0N@l^nsw1A zi@zZJ-D=m=s8n5^n{2F9Lm~_O@PCVKeioK@h9)c7w=9uQYt1ZVxk}zT*iEDB`N1iY z`vLgP(0?M)9X-rA1=P1l%i~DSF{~xgg!Gb1L`qMQ0*(iH)E#Boq~>*@YEesWjuBb>f3+ zOu+L9e$?B&ClJ>>XOa)swz*Zcs0*91s2E#DK=dN-olYdrx1{u#mH~(s-M*!+pNxtb zxn!+ITP2SYE?}dmEB7*plR3t5}wGM_xVc|(sJY;}^iGr6Ehvk_V%t+jFAj#Z!!C>Jhm^&tG zWi~E5|NQ~-zIpysyOhP}>^^_~RC5gLvwYfQ6QWkN>&)}_t1Q0GO2Uul2cAz3-t-1& z96Z<5N<`jYc1Vu`HK6v?kXpgP99V+H-sNGXzHq?uQuH}PSfIAim6(c=8Z+z3?BXvSxlJ^e_m~$uvoT8*r+`Vxs+vkBAGJ@ zX~A}qGdj_ng}-oZPn)mml&%pZ*#%ctg_(#bzPtKuklC1z>eM@6jHDcrugL;F)WU|N z?-5@hr@E@b)^41x{X4^S%(Yl!0Z&H#u%Qt1Ajr^aKDf)`bXt5)wUR5tB-T@fv`d}k zmh?8{h!j3qv^G9V(wVKVS8{cyzoemfw1cV?BXPY#&Cz-OOKpA_$5+Lut}G&M5`j~0 z@Fls*GEUxE5(v0bSl-_U1V$nXB}L_M%2Ro^_laNa2A39?#T4Uhn3H0M2i~B+59o>@ zR$W111kOVFH&DC#mzu9)krOir4Pv^V7YBjMa7`t${rqh+QK3r3RdSpnPm0LXB%y|y zH9X?v8Njbqlv&c*jdhu^g*6~Zx<-8^JWQ)y!Crc2iR&RRCu=W(TuVZ{2dY=7lp{wU zzS652^8Q!Gx6HLHx90TxYL&t3pdnFEg;^$yEgV^5k#g>o0EM4POh7zl0ZSagD5@iz zwflNwfdU|=F9?zl(jd0x#4Db(FCY3*6h&8@SBwA29EC@fodD;^NQC+VTXG|s-vYKq zDu$}~*o^sR0wsK9Y~Ux*e6yI3`Yh#mat0#%$wp2oC$Q+8ZuF~r$de4A z6fc83k~T4ck+vv!Zg^XaMTpfSf`p~aRt{OR((iXAOMb3xX^~t=h6_x%fxwS51H-nv zT#^%nivK;__EvabDi#f3-6m{+EF-5~)U6>26#i4rgn{aAvp)=1~X5F8LG*+RFXLw;3Qz~%_DCsOc zIhYKJmC|)fE_R4r>Yk-&%BtYmtTiOT=tjS)a6fqReiCNp@lXl5pbU{tpRKnbekxPKk!uyZ*qfs`5{lIf;&x3D^_9jGqD^vG z5LdwC=d{@G+c_Sb7o6{PJrOP0!Mb1#olvG$P{BMENW&E;Me68=@VYZPWeC^XFtKI0 zzLtI^@%ppj`nvr@8E1oYG8{A;2<&GLK->{%TY;$WNlU(hNG%t9|%iLbx;725kr zV7{AwN|eEmdEDw{1GOH=bdNmZy!PZPSJ!g=7>I`RD+KJk==@Q9Gv=vmjTF@Kmba}9mj@mZ)0O{5*m>|PGA~o7B zd{nc>q-eyfb^vxUQ=^CGi_I1)1oaBQ#Pm!I8ZYpbq4-O(oe+QY8J>=y9$ z?J?L$FvHA{-qMGB08HE18T7+vw0l|N;eY%o?XR6q15AJkzv15|{QrDp`7gzs|9$4M zS_9f!`O)X&-I?!()@c-vY52=$^4s8E1I7?egG><+Ya@TuPcsxM>a^a} zV(Id{BhXZP{@h?HW74?~!C|1jiS(?cMthBXy`y<5!`4bB#b$F!*T(PT!^<pQdN~i$L&%a0Ix*~v~l5#+m<2&(iZN!Wfb(gztpMLwzvh8bhgk$}0 zE$DX)ztX+4r;rF~Z{e!ynH3kklDN$&fetpfi3nPlVtf zm3#Ew`eHPCn3*4?JE7ETQTW5xB2n4Gltsrjh>g1>1lGtl1a^QdUs#=*4{dpJ+mds{k8f zG@rCsj2mK3(@DMze!RuzOM7PCaY+s=PGv39#HbPq&=bvUnO3qsSKrF}kJpx?xDbvWzjJYqTyz`my zmd%O@Qjlm8B*rF;M6etav@}c-lM*NKm*vKRZ3?HzY8QI(Jp=q%qTGR}s5n+yyXN}1%`%Lw7Ez{~OZ>3j z?UL$c<^3isMN(qla~ws0bOjsF_|xwCYPuyJ#A-Mc;!~g)7{iLR0~k6$7fg-FTvE0v zr;Zvyp6*RhzKME& z)J=!>EQG#{^eVK~(L7wf8&L$q5j}@8Cp6^v4blWd5PKnUCbUj~c7IDSBU7lb5s087 zA?!#&pi}x3nGN|gYIvW02AA`TLJN2xvsyND6ldJw3L9(E5BFl}Pw(N9PD3X5Oc+Ln zpQuzUhU6t)1yvA7Xs<9<1M4cxCt(ZD?y~dgc+JJ7>1QHJBvvpX%-WX;6Wp!R+uMb( zXro*QuCy?Bo=ae&KXKMXmpZN1Sww^R@elNA$l@Z5R9UA%5*|h^uo5oXOK;;yMu{r< zUm80{!S`oD{K{{u3hQ#xFdke4|1lW=gF_UX)J)Mo zXNUbskR_A=YujfPpy)FH+V9JO8G^bn{vP5-or-)8KWUZAZ#@P>3m`8^iUGJmm5?|+Qww5|higIJTMv*{m zq_2R>+Z0~`4jJntKaJY&93LQfU<|N*=Ja}I{vAf(C%G+a?saS;lrKlnkywF#>s1!> zlW##V%44FMoO20_X1eTh5koz;NlHb2$q|J6g3Q!`0JAMMMz z*7f0Pgabn(-ubUt3|`_oYt^zjk#)+Q{EG$S-|+w;mhy8M1T%3qzHE|BEs~GtJx}X? zisW6~2nru&*A+&Xi|bi=OVdhBD&BLl5QeNh9F%!e^!>Y?h#ESw;dEQ19 zPi9YU;6fOZcJ&Bd>-_CAtC4eziRL^P)KYV(i@(Um?ahAOR;igGQ!Xt;lyM_uZoe{t zWuG$G_SAS7whV{D2EiH~(xnH*P=H5nCVHDMMYLO;EVP+9A_&apVZK_2c78X(nuHBZ zvsYPQo38SJ=9E(#L0%vX{;j=}b8Oh=Ko*0K$Irvokg=Fqm6(_lDE_M1ul`+$`u$?G z-um+?x-Ze7nId*hE{T_~+z^jbinGe=8d)eWGljR0;rg(yeTS3Rdnp6sJMv8&Cd2(wVNgP;iwbO(l z<+Q8AURu{^1ZQ>nwh9?9gC>_v0YBuK%%yFrYA|`}ys<)EWaGlj273wLJ_pFDlARm# z*uz%^U)mZ*<=vH^z~U9sT~27|veMZ}jSi7$+Hjomn!kH!fW45nZQmVNf3#^nBX@eLJ&_7lFiGQLMBJxKRfyOtm+eEHPA_D-o{iY_dSg z;$<$+*^Wx&x8HhZBzv$rdIs^`g@zWfPcK?8UH1w33W$XkFdwpQU+T&Wwm-|Yy-s1T zV*cE)T%nE)4=HHra>${-xIFy{?|Oc9dbQz}6giI1VfhQnD>CUDE=KU))ZQK-8kLUb zI}Zy|q+{6ytu>5^LAsbn4fY}3K!gmfN(fc(k}b4)jZD=Iq+J!M1Ui8zRuBknfZV;- zC%l5qg#9|M9OjWSE=N>yiOT`^rf_=Mn2oR-jbVxnedZ;!T3=B49FR`SQlaMY$hu#v z69$OCxUlFKj%fo~7LKU{X`Df%tM5QJnqy!!RAeyoA{53v!nvomn-!lrW9OEQNLmUZ zyu;1H!SW(+or4{TSk5qog0&d%qrCks>$AB5WMB?~kxzNJ$R z%8p8*tOkXjC(g&ctno5CQ31( z9@R0WglaxRbpGOvV99)&$6!m{;L0gv%Pekw+(EuGZS-(*xNy?o4JK2sOZrg2FgTs) zYgp;O)$5uWYzUReS8>}Eqb1RyJ}3~7xUrQX=h%uxlpOjXUN<#(U|UBWD03+v!-~d%K}XBKT7H>aolw1 z1wF_^t6?ImVP0AJCyxo^!Jzcs-=oBi+N6d#0v#hKEfb?!iDj(hh^lY!wD==a5Ct+N zDzkbvnsAyq&JC0k^yS10mSMuGlw9WmP^_6bg z@mSTGH`24@t0%@{v*Byi3n)e^51d;ilWkaVm*P!R(#e+(N$JlBF#D}BewpBnF^C$I9`0d_Uap-4;H$H0&ZA)l^$L1%&*JY_5nkicY(3^J(PkKkvHfjqn z2}e3_&a#O80v8`hy$+P&erZ3Myt04rgwE_*ctiKZs^7qUk1+$vOYeKR%j1yxqo_D_ zy@UG3&kxH3_0#WS_fl8f@t5?#WVoVzqaIgCQ=n^EvWci}U9eHvxn9tZCg{z2fGu5= zo*u3SKe2BA@SHYT^qa%{iYvcUq&rE=BpY7Km3_5+eM*u{u3#`@b3^|kXYf>i6&c-l zAwBnFp|6PfI0E&K znCT;P9&%5PjQy7+H{zTd`~$Z&sOlZG5D0~G{q!PG-M{LV6yIuGx)m3pt$P^M(8yz z(X#7+3s^CVypw8)HO*nQ-St*x*9!#hwRYKHE7`~Tvo#g&Z)jKS-D)eknq@7W+U7Pr z8joh}__fJxg@!_Gi^@<1Fa#F}IiD^3`4vs9k7cqctPwS9Ziu~8&LRruLB;rOyYRC66m5r(oD!24<*@wKIQU|5Sz#DWIGQyhgarr z6U5kTj~;Gvg@+BJN(=+a+IF=)tihX!hIB`m^&|dc)7VW9^)y?2(cP)o+b}WdHc>qp zM$%CsXlG&?%GhXHF(_K$=qmnfD&dwD{p@=qU^Wd+ZP`XQ(B4|(b;}7ZwVKxGzV^HW zj;oGE$i7ds@4a!umyFa9LvX{Xw_X+Uj9Ys<=Ez=#KFBY4NIcqFS;7mB$7pN8O^p+s zcd7V>nx~#9k!E$d`_ZVs{Kq`6`l#@@BaM=$DIAJ6Zg>LJah&pqy&IBD<|`n9Jih)Ou4_mw%Bs3ga__1fL8 z&@MBLUvM59gDyFsvuQ~cp{{E(L3kNq72S2Xf_?A88e!}FodB75nZ{G=y}^aa`dG2` zE}*Zn9%?ZR_Lts~xyH4-JdOu!bi0@kwTF~T+HGm!%~6z$=D1#ps44UG)_H*| zqFy_tYOHg5=SA$!ijWAiAVHL2FDHz|&S+*QV8f?+U9rEfDYFMd%Lr$Fd?L3%Vwi=} zEBM+a?9e4{cFiWe+j$QH)G&9?9JYYwlbtx>YYN_yiN5#c7AH*7`;B%yX>y)BGx~Hp z@ybOdV^)5zLxFI8&dWd0=-`X;P9%|*NSFzt(~I_UPI`>4Irtik zzF%tM;2b=M?e?74RP?<>gB`{FL6hXC#{;ndq_v}~l=vG&%Epc*yTrP|!5EDSO(WjT zXM=B+btfZ#$;J@k`>^pN0x37Lf5*Rm{g0vAzxY=LYh&QPF&oprtfeYf{?}TnR$YF8 z9<{KlX#Gzis{6E(`jT@AsTQF1Txr0ctyI(2p+cC9UJ@3MJ93uv$JkVkPw3X%l-wH5 z@qG!f{SB~?Gze<=RmdeVDrI{{{e#oCfpL7%YYB0+m5N*Ufhh}*U5DBV`2^6H9Bpdh ze6FVZ5++dX+C4sQUwO*TQM)D>lYTE84@-Kv=wb@VFy4IOjC2ldF7Ty<2*_MXt)g*P zmt2~kOSF`kn*0J~T$OC_rty3pgzGUi^pNVAyt5_dLwC?F{lm*hynP~WZ9c$bY1J6?)FG?bVWJ& zw%%{}ZE9`i7Df|DN=@Tdn_#hJEjHOTR7KkEfQ;Hv*3dL8VxGZ+Mi(x!)fO2 z_w$C+G~dvoXB;gD%i@`T zY`9_-sp?5$T`9HBXfV(Oicj0uu*ilCt2epGO_{ehW!Te_q!M5)H%jR)raH^9RX1g@ zE<1V(En8Czs7_7)Djy)3PaH$9;i*TP;TlfptM(7Zdh0O5<`prGK*|`7#*3{rN!-Yo zOThkVfz9DU$5N>oVxG#wH{AeW$-*O$k`khdZKuFEKm>$W3{ahWzd7Kd0(3-NXzygofZev;CBs1as5Pfn;4 z312u%3|B~vq;v;?(zZ|{tTz9LEzA*;nms16khxxeK|t$uOMsVq=E&GP!ebiS;#fWaO~kyb5uO_dZD3T$KYZ7bVNCKylLB`fWBDB(+x4> z26qiFg;G}1k-YH4?B=ha4$Q&@p>UF#@WC?@8zs_kyI5GogT}~jwEJ3YE>TSm^5LP&l=&wb~ zt?kZYYHh^%%tlOQkEuj-oFL4Herdu&cfjWTawPiEOyYrkd=l)Kk;AUH5RN9Jl|9;E zyQx>hGyZGUaf(toi{u%v*;kkkr|c5uQPj1!|3YjbI53C!=YWtMa*qA1dJqR*QpEM! zUX5>#F(hBYx5wQ9NKSvmQ|x=>n>K|o!ucnPlY+U^AKy7+k#;OMp-?MkJ(2RWgUC6T zJ2MO}9N7BS&nyGlXBNTS!iT*a{MAsL*dbQ4RnI-ZEKs%iI^)QR*Ug_$j|uw)2;b3} zlTlTEmb;g^mp>6(Ljsiq7j5=r560#o&7*ybGyDLL|1+&j6W!KZkx&5amwn)Yztyw3ae!dl>5!- z9S!%r&+91$?v-!q6-3~Ne%cdxb%)%M@(s!uJhhK|dQ{QutGazW5@)xDOyT3$Q}I`3 z%^@nW{+|@3I^>%oF5i~AemZsrV3ykw$$_oF-a`-!fo=tT{Fy>h>w%7o0ZMMj{#*Q7 z{Xb5S|CiB}zo$f%zdM4{)9OxCV~DnEG*K7#|JXYO5dlSq%I~v;zqw__4{4av`>7Z9 zist9fz<&ZunsJgz{!Y2SYNHIB#IX^|*J$?rE_-6Kwdce84dF}d2+m&Hd~7GqB|uHA zh0qBH?SS=u|9gZ7IxMwwh`UFp#u(#Wn!R%(4=tN-j8TQzx*ZiLzViJ*HIa8LfuyZ{ zLYL&#mJ9u(_e+ell!j`4q)(sANcE{IMcq*RPL7>)H@&;AWcMz2=x~m+%hhPXMh($@ zFNds8v{!=+U?OSmT8)P18GfX>O+O#1bC{7^yW&oyCUc|aRPNaE0lvAOu&M*g{oP-=#B$Wp*$Xa<{167&{1E;W@S*dMk_U>cR&c3Wj`tnC>W<2 zj8@Qo)c6B(I-7eFT5=zZ_Trg#e z0gPSU_Y3I=yIsE#&*QJL5a@G%6XP?uwl`}(5OG9zE1PXNV1~?42OE=agKykVpPXwp z(+3ltR#m>cCS(6*8baoW(Qs!w^-2DoGRoZ0?L=XqZ$1}@*3H)N=xDptSUZ1{JZk;|5>8zzh=7rDj$Kh zBh%kbOZDFcP3G0q{|K58pz)fEiS%U>tB6snFi7VEO{g;(2+3A4emC->)BbT6Z+NH* zAirk5yEP3-2bv}Pf)_+zCm1J4@j0m53#|J&Fpv@If`}V*%7R{bpB1+)V2%QlDkXsu z0gpb>>AR5f+rL$0A_*sa2asrW_zJBlnVVcc;?u202FBq)`^#iBIzFYELv#T{mKSCk zw&sSOO1i&DtF&GSR0m{@oYi@p3_)!$nzNVgzZvfHwm%}o0%||JV@Wo6x zl*G$6yyuSvb&}G{aGIXE^+~lTUD@@SJ&aYGQiHixJ$U6M(D7uZGB)uVHeuhOekf&z zlxe_p!HYv4ev&z+|F6JWq)8*Dd0G<zIF{*Jzh|)47ZnL-s*7}_!V`3B7c2!ugFNfQE+S|^Kwol2@1y26@SGo&n%wV$rn|dcqg;jEQbVkdU5R;A zUK=U0#)M*Y9lfsZ8Lq=a{HP?>ny}p)fKuyoaCM;vL4uK(0>)>ML$IrP>60@+NvYU=W8nRBkqL?Bz!91(wIBkL~>>J0{{m*iPKYsEoMtzyUCU8Xidn?)1#oHmeAoc`8 z37%}{sKGEeU@16|3-S&D18RVWTIGfwP}ZbIVT@Q%LMpqULOHW0B=S>c>$eu%!H1>;tO4Bq|oxLTweCtyEQ zOW5sdKMY(4%hgZ>YF(f)^QT(I3Zr(1ciK3Cc$|U(lRsI1&$PtKixYRh>1k&PM4?ZN zvK0TDx_4%~QnlLhPmR91&AfxS?guW~4mBR}Y3bfqPeSKSiKC9te1e8{YY;@fgPdxH zz^{>G^Z^7+5(?Kl?0-LmtN$Md`~R$T zfZpXMjsRd=`1gt@UO|S032QiaW$q_uWy`y+8zQ~?EHOkabpVWXewY=e5O1-CwX!LB z!Wh(>27&1H4&=2+xSgR;R~rSx)iwoUPij{eKi}t-KFcTvT6v=W1jGr|DwUf=Kz~G+ z6?4dTwSOCGmtsTH8ob9k=1*elM=Ww!Gu168ABd$Qvls5=%WwG&^&VqL_?b0^X*Q=i z*~yv`t9}KEKZ>@Pm5NgPEw^Js;?K?kc00%#V-9Y`VQj5q-DJ}z^3j52&#Zw=E-#x?0YPMybNMe`BnbBGpvUFoaxiW^F))zvtSpgGC43M^2_2iC;zD(_yQ z9oCc7Do`(=mp}G|E|czq@C>`$RG4e?|A0 zW&{vq8VYaPp7ZNU`v~MZ#*C){jEDVwO@Y{ujY03a=oRjl*$ zbo@hw5{8f}qXPvH|H)P@G^Nz~ljn)tMI;~c3MEt%Gt$+NMm1>qGU{(vK{y)vhm;t8 zBlLAgWN3||CKo++MErvAI|y2|Q-ajB-6c*Q}XAP1;v zG6p&J53y`04<3&@ptaE=bH2dfji} zonJyGZE$^TjMqoIHMj$XBFE4IauoB-+?O7>>9P9FE3jqizs0M_SX2NGdj1@G*L({Q zGhmee8UOj$`}}`2%FLYqi1ObI2>%B1b?fVa5n74`@>8Mr(M0?eWuuJYjE2+<>tNp$ z1#np3Z-iu~%X@!ed_+!;ra+9Z^)XfbQ>KO^87{ok16bn7xBzKwSn1Ui-l9wHUVxJ z!2JFjnBQwF(2*CwP#=N$okN4pGPHoCE!<};BY-2=m=2$>yklX~IY4k&3wkLgc?O{^ zUX@<$dqFBRF!e79=ai9lFRNR#KBH1p`6No8$kW7V^acY;mxAl=8asea)`KBFd^?n6 zyl^C`y~3c8L3e&t@pT`^=0U&q+%B9B|a<532tpDa+QOvrC<@l$A zg|kE%H2yzA{I4Uo8vk)#|Gz68hfAY#0Rp4lw+7=rnJ5c+Vj|n>;a!5p!7u%|hG(BR`j=#m7>Fnd7 zV#KUxgj>;xc&?q}ICLJ{ma*!hWk02HOtvd_TjJOm2iT;QOw*KoGcCQU zDO2l67($}Gt4SaNLZu&~TSN#Rk`B;xDKzN^1rXa=2Xf$_u;jXAWr9gKLJmLP3?Yj7 zMi@DBr*%`w4@u6K@>TdMKMOctr`>zbawyrHmDxn5W?y*>I>q;)1}IPm0uJ}CnCNcp zZ_u8hRP7ybo!~mv1z3855P#UXJyl6R-fcXF=RyX4J#baR~dMNev# zQQfvVc%;`XWuDat%}vJVs&g$zl4pabF&}8)V4vT{#k}+VRf|q~iP^=AUe%2FBp>#c2vyn^+Q=yp!wKZv4fv;Xa7`jzVcTTTX@}df z#YpW1j_7vPbm$@#I3rJc{^~cnaJ>jQfH#mN5Q6z{J7kQ1*$n!B_E7v=7b)^LB>HbJ zYq9E#`i2VHd;ja`BvPJY3C6n8f>wxPn1TP2nwIG|Ze}!NB(w^)L}-zdxJfBcZhD;# zheBA)%Z{^Q@SOd;k>FBWohQPl8TYO$GM4!gu9ZNi=?%9##~!yUx2x2HT0h?x{9dpq zwCUY$(jTM14IvhpNwhRg(<6Qsn#n5WJ0Vaj;s`294a^$=%;t(D0F|)#nyDpi)if0` z?OAlNl$apmNmdY8{L!x4yFG&6qdzQ&sFqilicxj60Mu-u!!*P-dsT$i87v}N3drczzz*<9f^$(i)OyJ+Z=vs~{Nvl}s% zjeI#1w$7dH(vu*oWe%H(Dn(swl|h>U)(uUNSQds`0rU&rH+lL!R#pl2vTUwO*^8f4 zSS7w620cYUOtHM8aZWQsYg5rCQ1>PCtJ|_Y*ko>!je_zct8V$~QvTN^o1yY6W&ZWq zq|eJ`)T>$QY|U~NCzm?fv~TJ0jP0aUmU9h{syNOOui(ms2~t9HlcTOF9dG7~xW6W4 z?!Q&`f2H)RL`)JcGFoo0B2JI*N_E^?#*k@WNW$!le?(9DvOU8qmz*nYn*9nl^1RXD zBg|EsQJ_`4(M^jVTu}o^=i*Ly*lTJ{$ff9@py1m@mgW&%RzLr#RKv;CUc8Pm(KAFk zcXh4>xp;er+{IROp)$u^$L2F<;CNz*;FL8b*UvcG6<&!lZ6w%V+4g0Zm|hCY_=uTB zWU|Yj21Re+%=u((qvTsA17Dl#BfAvqGdwgIQenBWoL)eP6tW3)>rD-mZa)GwifelM zP*D(18b;jPhZd%N37xgwmwPpjOAmHgYIBK2X9)|#vR&5bnvzLQE4%mChoQtRNKo5X zHyO$wrqQ0re6)7N4eL9yQ z-k~}DRvY;4xvC%fntaf!{sTf^O5E7%qzhm?8Z*1NeX?UVGuk5BWl@iM_0xIwsK%rt-eT;c zFd8f}FL*lu+&mhe^c-T>LKDw0Y}PIs_$5;U{)Q1N$%c_=;f9fl(T0)nKJdHPCDR@> zw;5i9LSps#M%pV2u|##jzPD2XCW!}#FB2&G8d&V}j-yH5W*?59`XfYOy zi6o9+6ymG5kVS;EGhL-|F>}ArHiIcn?%6wF3r9}43L-VmnK~@w2=*syPxvg`eJ+Tx zD?OXLzVJfKGNgUHX-SU3*|fgk?^QQ;8+hdS+3YLy+90$a$i_E5=0uUaKezs5&^n|msYzh=O!+4O`(G=( z|9k-Z?>OB5#^LJ92n!+cok?)mwbEX6>ID!?mJQ|UMfFD2)#<_YZ7sPpCchAMs`uqC zCdSPoo=Av!)$(gAcG|CSIRT-#?3vm}#7|`B+N0VUt?|7f@BwnT7%jBc+ABmFZAstZ zYM~N>3(18laGb$}TIhXlIIq`)`RZG&(scNCCT*C>NW8>L`qj(jV#KQ*^|(oZoW6cp z#Y7WENKdU(?G%;YZWKg?%z9t%G0C*^3C!Al)d=`Sr2!?6@K?TDUS#UA(=SQ%-KJW+ zjJ}+5K-W^-K0yZun!^6+NuM<%5pjFoQUvuvUo6E~2RSS9pq)K47YWy31h#Coo^U$I z$Wc+?9|(jldOAqTUb)cwqySrOX3=umR1*5SuhCn^?1p#-eYA4UVeO^}5H?1taqJ9V z^s~M-kxMoWOUA_Gki40mfTh5RXPR}5#+z{tyOt1X3|m%dMlyw3SCKiCqZ@z!V=>He zGWrMr)^`7Yh(^navi+lQ|J!~vdZE#|=s z{t4yYZ-hG%;cQ0J)aD$#6?#1t1r=w1L9D&>YP>4ElTVZeOOSx+&`=LVSON@a5=e6P zQzC%5&wh*|uY5)Zqb5iFcUuW~8#@yc;}RW(B)F?0wse6nk*A3cc%Ci|3Q+X>8vl#8 zcM6iUP1l9H)MeYYZQEv+ZChP7x{NN{?6Pg!w#}~k>zi3CV&?nTUMI6-N4!Uwd6IEI z@2%&;+MWVeaT-r`c}Z@Nr-Bm6qasVZYelP6E6aRdp|P~Zjdendg(bB%dxW!PG}6U< z(5?iR59tEdQ6f*!&x3LK9L$WeN3zzP{bSogknDSp-}(Ado|n zMa)4Gv{r6?T2e-Gwjg!~D8Fyq*i_)8^GfoGjm$=N?stKvEEeJSy;;#Vl8sp($tUNn zC)Ph#KCwd_1fp}Xv29yUAN8Ae+x4Fw=NNvGqS5%=4hns^SbQZra--0e1-aw;M(tqF;SjAwC#4dx|(S*Qp_j z{JR#HdJGVp8^=Nuhu1)x}devFH7ecFFYJrCi9+z0Xh5Ok5Xhhq+?DYIW zdT;W1jtRMXt;GX3x%&;jm4MPo5BBU2&!5Pv*tjQ-j2#w>8DI!rqHGcDxV;P2C`w)MM~Xjh8-{zl$1QT51RpCvgA}OEW`A zml_}vxg!DNf@k;V-^Z{tnHS~XU_x5z#gObTSi!-l$X5=^gw4c%&~0SbOSE7U-R99} z?IYomeXcjFL(W?3m_bgWe<;0hJaTWFSs0K#c{L*L5>B0dUmStp)z}UR877gU)=N<$ljh@`*NNYlSS?n|5>Pqh)$ulT|v|2%@swa&{D81K*Fg{va5p(bl_ET zajRb37KNj_Z`E8yilmr(rl>g3toA47^0Hzijhb}n{S@Pe$+Hd{Z1uAFJ`8pK5%W`# z3IlR5D~6F_=)~ZBk^8K~PaT$p?C`W-yG#jcsE0i!O4hjSyX@nGU{`6~z2WeKRg2P- zH8+}YI$HK6uDiLz-JfJC&pan#yHvQi&1yp~&ALO-_JJ|wg3xr?m)wadiG|x;3l6YZ z)q8Fd=Fc55`~6^F9z14H=Fo}oX=_UxXy6ZT0)B9d*aY-XnmAGNrhg$QdwMoy3y28eb@2GRLDI2CRHIb0v*{nY@F!ykmdP+|W$O zj?)*7*~xQy*v?=^tYt+!4tZWo@PzPrQ4WvweC%%;Tk1JtW+yV!F*7iocGSwU5fU{g ziPs0r>AO)OvkU^0mO%I9i1;w1#WVFg-NLGyWsIY+B*bG={`@iKG-cCDfkY?U?6Q;V z8>DXDdOZ`Bhv8L1x3eS?PUp-Ak*9)wU`TdW?*!{6C1TnW<)Qq8$H+9$G2XRKg&_sX zHC^!gHj|Euer)&Y9o-HnUFM?>)RlHhyxOQKTIN{e6-U3mErX5H26_fB;%T0g3X}@D za?h|WrL?_Xbs9`jyy^7%)b?1K4h%3O0Ntry`?hBNcZ!?Ewu2a#uD?1IP1+-KZloW} z8d#pER-Sx39Q2*^?-c*J*{zLCGXdPI{x)YudDB+v&mX}B-G@hF=jl;#c*G5t?~*h4 zs*IFdbxxILs%f)E3t7zM?U~*}%}dEqjPNdy6`4pzc-?3Xb7iip7ovRf7j3TRG1k^= zE_;u#YpZ0&X_8dmI`fbKOuv}p89NQ)Bu~2~sroDyvM-ydfKyPD7nD(1l>i69@5X;T zl)K`F#XRFnqa;hG)M|Cdiq|BHCrDgYSXTTYr62nU_%9qw8C~nK$nX+LAyt!}ZVnHe z#f^#2VDPeg?ZwzU98$$rW?DiW@J@D>QLkdCvy?l^&Du=ckV)?!mi3Tnr_*a+Uqjn*)&~k@$-IbbXGMcY&m&GVfeYII|&rmaq-5>q+_Z| zraAAX`3&kZcV+FY4kyNOZH#_o@T*NaH{I1q*8cAIdmuf@1uFnjlPABD$uZfWl}mqf zq7CFMEmehG%7Q0EP2u&xuU1oS=``rwvVd~xo6lxodb44!*UTSE{DCu4V3@J2Fl6PC zCZvg;$~m8h%dH7?5r8gQrwg`RFQ&?CCA&}`q{>^au~7fhL=TRAtPTCPv1g_7x_iLa z#~hTXfHx)&PMuVH2F{IieFjdRlxGIcje~O0A*|t-;yUPewwF>x8RH8 zuLFUm;($(>$jdew$Tr$| zCrAktB9`mM5|fh{2HjJY4SIeM)Cz<>6A#`v0kkGo(*b4u3xq9(mu2bp4abk3un1VZ4X$9735Mg~+0jQMLqksxm$wy+ffbQso=#ey9 zT!GHMVtok^W?D?dxW;ujtQLSWyY99}W^8Rpy)vdOx)97#HIlEmKTRQ&tQE)Nc-&;M zZVh5tpuj9|MA){gTw;3k0|PZS&#`=+5^u0#P#7>k=y8frojfBEso)aQQxz&EPq!!K zcWyP}jL2IULsnA!ZuA|xo4%`7B0r|-$w&dn*4g=isC_xa)SfJt*0v&*H;S{#;Dh4O zHHv7OF#wvXER?Z2uB)#Ev*&$pZ&SIb-4H)QvNfiEkhOMsrr)qVNTHBScNAGPLZ@kh zZeF8SpccRqk<(YTXsTXoA9a)m$)hKnRh{3|Nf>K3yo1?0hBB2x%?OsXlYCG&u)!Lb zD?%DE(+*+4>~tbIzY!9mNaLC_kK8j$+^it5Yk|>Mzt1rh0=Io3El)6i4(lE|;|_&N z$cizjq=XYtRV0fu=DR{kqvBH^8h3p0bFapl4y$J%h%qQKU9Q*b8#M4HS$gL_1RbI~ z%9uyz326JN#0iC(vx+uXK+@2`!Wf(cSr)Q}3x;0)?6zjVc^}z@h0B!eU&- z(YNFnL)9V7Uj?U_gXxGBq>&C(g|oM)X9c;CeQw`yfu29WAyL_3F{CzyCJSCQJk40kT2bMbQsL$$7=IC~bI09hK_#{$PuKPy)O3 zJNi0^7W6c31{Hs~lf>yu;P9v4CFu;1-^TQY>Ke4z87dyI<{=Dt4uIH` zHss7gD!*2(1=>OYT+<>Bxb-(YR~`4v5k+5x)A&;8Mws=#T|+yt`%+#WEKNiBQsedE zC$?=0k#B~!xTEUIt_#a>ESfXxN)P$cB9AGK*Dd*qxTzBpeuf%H=auB%b!FkNjyaGD zZ%4Nay5Twfh}kTNkHr~LQ7aI$8w401+dDJcHB(Mpu*Ig78>{sz=;Q()piwIXZ9#n* znwiSaQChoIel27yATO2$$5YT|%i2?5@>N?kHS5LN+6SpavV6F^D+l`)QaaUJeWR|g8k zq{MNy!kQHAkX`Owxsy8lz3@(cCrV^=-%%Wry;{`+iV!KcP1ES`lrp5upHLgU>knud z@ktF4N6jN0YY|xUj9?zT!T<3DFC37x4OqV*+L}H73e(#CrQCPz zJjP&|p^j|d7DKQr+Rgh>Qr1p|b)qY);<^mfTMqZe>CV0(S2E)@UrsN6Tj+FS47NF@ z(`5LgyfSNTMAt~~%)aWDVv+TU)l0lq^q{Abc-d7uE>n_7ebtYu;M|awwH^<37b>7m zDsF;=L)zlVug;&X0^Hbb)Z%nDB5HY_!? zc4KxO@f<7NmYa4zyoYgTj@2l*R<6Ye`J;YP-tKeu=yJ z%w`>FrIM{~DIqY?9Vku}jcOi9m034egUXwb&_&6I47WmDP}45X;Tw(pKOdB)ZpC$A zfP<(^P5cmeKg^@=rgwy(M#%0zIq~1!?aPf}zkMUZ|JSAV-;IDQ|KkboUyOiAgj`Hb zO&m>(|8duDVe~Iw{d1`ANVZYO7DXBQObDWpOcqj#X!O&!VdeQvErFktDCKURPnnau zEabCn{pCMl%5KZ1@lN3jwDl}BHDf>T#52_7OA+fvCcRulpy0(r&dr?G@$}Ti{4`1O zQhdwB3&wn6m;ffBObud z7&iz;tJNa*A%+BB(ZS*G!p1$6jv<#B7I#UWh20x29r`n0qE8sD4Y_Sa&zJII?Kbs; z_9uR>*=y^p(ccmUCstWn^iLYF$k%4Oz?zJXxxX)!Rn=RewUjSBQlVZVDwcZ{6`I^* z!Pivd&`ZBDdX(9i13F#B@I$JnsGOkg%5-VcU0cxZ0alYE6sTK%JDWcW6rn^H7}n+N zvVdK-&rcK4E*FhibV!GE>I#ETmSLxlAO))jWg5kn+O#fMRD~VBg=lH!LqEK3i~eWXyS}nI?0Kw6`*2>QH>@*I=4Q znXOjWCdwI$n~ir)I$wW7*SnM`_zou0jDjo^i1|F2u@=s~ToyDH$JTuG$A4BmO?9KQ8wNFcoh{vjDRX zi&oJK!o$ssPt8oN9>QyQXYlp+hNI&v|7Ve2m|A-XyIF0$IV^O>Z^LmpOd~k=Y4C_~ zYLX-GxI5%VZ(%t8mjuozyauFxa*flHLR|;>q2BjK&Jgkia5H;v#~cB;8o zvejtZ3x>tV8*BR`{XNCHCHuo%H0%dvL9avDVR*B9M5FfcY$T`z;OzTQRZ@;PSG&A* za&sI)%*6LmhU0o8Fb}F-~>9f5F4s|#^sjb&G{Z+%wji88hr!1k}HJFx!T(XgsE zBzgBw%;G{zG8d1|^2;keygOd*r>}MUU<;HxzcEO z90VbeI8jgxx=>CwGJgpdeF_eJ>-X_sb=;wiI6j;o?l@-#iXbXeYU zH))-$QWs|QKRpn^@L|0RzxLVsF#no7|Gv-G`Hz$5U;FGYk_sm~C;Jy-iP`N7iO9~u z$Y#v)&wSaStn+oJjl$bBPghY+5C-8p&=0=t4=G4nFbGN|7XKQTsQ=25iMvMmrfAlb z`azSGz8r+#ef6_Tu)U489~^{aaASWmlly4h>1cBNvdIv5Ry`*B_v z7y0V7j^>B}o&`ET-%xf}3ZM&lYg_@Bba*-9;Y__L?@|w>I3Z7D;4N?k|HhQ6nZBEK54iPAX~*$isXh zT2N<_1fk`Ua!o|j!N$kb1H|3;DHJbK%t*@;xEkm2OFisXOQ8k;V!hN(p2(=ju=AI= zZY7X(bqLF?yM7H4B~l@JJxrmuq{%EdXBFq8u~Q*xFWO#u+B^JGXvtbl>a@#KqvKv3 zOi?6}z9C_jht&I29)ei=%t*WTc_~B2y>cQCTQFE~URzbO{nlkYhTraBM708@(-BUl zKBUhxM56a_PWG&Q1mEnp0IaoAf zht6v=EZk!JFtufUbEpGHx@8xp$oC&`Mklt4(weW$Y6!@`9-Y4KCi&Z;-Z1 zRU2hwbrfH^a7|5gP!t6Ms6|7Gpn=6#C5j}4xP??LBa8ew__4!QnvHW)SN5nI@_YPy z^n0sJO5>um(yiBA{<1kIyJQHUT$k5_&P=DNyNsiZj<=<)u1}!t@15$55o;Y7J-CeP zsC`F<8VG%P0rYZ4lEDG=sO!qPhMJ;y)L+TiUQZNXP4ymn4+J%^xl&(t85Z^ETA_y+ z4D9=W^F^NK0gP}kt<&1P&RqS25(-CFhrl7eNB(|088b7+EA@M!rdz(aS19G>N{o0U z0Ia;#;AByHZ2nL8BKv!*87mEQly((BFdyyZH9~o9A85m;n-?!N4j(~4Z^Ma)+)-u; z(j!qymYmAO!?8oPq%~eMpR}B!H`e~U&5wSe`MDC znn7Bhl?I-BTZ(+}W z)X}O%W3CYU4{Ucsmt{<&60|YGy!rjZ59j(gNtB{(l9+< z7IYUN3AXdt!PesS;AuKf!=&KcmJH<9=NN*Au;`4G`oOg38T=h!jSMCBkow*QUqhN? zd9^qzj6%s>)MjGIqAe#5h=6nv5ky1U$lcDlT~SJqxln*Q)viVQ*xg6%4~%Ous&Gf% z7<6Dsd5AH$^hnF@fc#B}T~yHi}3x5 zuQfrUUzzTmAgfuUla~Y!Av~V;NrQ|9<}!1ciuX$Ez7d}OyG4|TL&hVG`36`^-&&9= zQnexZcpXVGNQapNF}V@811y(UwovvoWSVLR6qFImIK5kqGz#ua z>S*GEo*?+Q;+~0EzEoCGj9U9lwUV<&Q~^;WH=USww_zzY8-%*N{6?0sy3m0KWFf7; z&3Cjl-OqP?X*oLM$J0O$ikPkVBRlu&XjQG?XrQG1NoqFG(|rRu2f z%{-_mzNitbui*XXT0IG0kUJyO+s$#~)T5?Q@^5Pz4GO;*tcU}@TuAQNXlOJve%FXF zxKe;%;vz;Rve7}-HPp~T+`?jp)i1jRx9V4!5e174r@4(J%DfveU~fpsGB{}4B|VM3 zp;p&RZ)be>S742`pdH`y2z;X}eotq{DuZ+BSnG4ew|zo}Ql!GS0NErZakeC!gVXOn%P`SdC8=WCRe=PK9dxOqQl z8~>TeG^6m$Jd3itEco6qX-!5ql;EA-4=IHgC%%BpS+_fU-^$bA_eL@=b|G96K+Oww zoTS~bMqlbm@jimngb2*)V7dOhhJeEz;{GXOS~-x|_hC2&PrF`B84Q_ZBzHleYWt`I zZwZF*lSJkOL!g&L=~*S^;f{Y)9eE4NW0$Y0v;M!{=gI!xiaOhWH7Nhhl_;&u-+L}w zd=j&taWy~?4T>-yq6$7OQnF8z%$Lm+9~nn^6>fD^t=R^DRx~s{?@js&_fDtX<%o~h z4-c@KP+Ab_@5!>p3JiiZhP~Zo{;VKppb0~>DKn5gBDM2G!>fV-gmLx)`YNL-#M2PY zs>Xe6AT!%Y%Cuu6Bev7wp9F5YR(N;_8ZKMtqpq45P&QTU%}4g5R~-5Nt;KQ(Z{FRS z7%c&=oM(=LUR1|pjS4I{?pa}p`z$d9(&aQL>QPq(Nz|aG%weeL=u8$?(H(6%i)NtW zTfcWKrz3$+8S#|bEY&ys_?PRJ5T%Zg&p$J$-n}M7B_5VC*3SLsnU)I>{m2#yfGS~9VuYt_fiAt_MA3fPJdufs9c z+H;AxhOO7T8Z+cGYKm+lj=2XElAbX`)@w)@p(&3W@kNtb)N{)G6GC6ul@)6L73%5# z2ciC-Xfg2OLth5r{A>Y{S~J_dNkq>Av?}aqJtkjBTBg|euSi3_vR6St{R2x|q@(_q zL3dV$7yJ`hww@jSH@KP;{hpq@NStJCgyb)SZikvv{b&Y<3L(^NgxjP{FQFYCOG%;9 zDj|wBbQLv+X`C`kLkeaex;(sn)P`(yC|v z+8?+phu%vJ?A*7Fe=y~B)=+wPrcRStS!)f_UPRH{Q~On*&M2)Bsy<5Ddrz{d5g)1c zOnEJ>mPZs{$G-qdHYU`AXk_Q1lISZoL;5ofGn5gJpfoC5g786sMM{36W2Q`a8ITFJ ztazaz@8ZoI>EvK%Tc&x?@o67u7FSI2cuQTi$bC{Bs`=bY= zfRu8m;#;hOPYnsLw$H_*>tg$o9&G|lP~%9$4EF5wdFw#&FyoFAJg`#4kMF-r%?2*F z1Q8jj5RKf32d<7rUae7rWZnVr$Tg+9K42S5gnt zu4fUemU)1?o&1PxCtV*hs$(_8#M@SEc!d7z)KNwlVjg~-y3v0dSpMEH{O8c^zh>S4 zV%z->RE#ec7H?ByOw8WfUrda$znB=PJ>+mIh)I7j?$VjyC5wc*MA1J2$^!!ag8QV^ zHrwa^MY`+Yd`ik#YAQzmR-Wp>aIW7k3YSj@VMK=$#hq%;AbGs55GTb3i97HDMc9SB zM3UQ8LF6$HQLdDIW2w(8e4ufi)7v0*(a4;wO)ZSUvAM~uKJpO$qus5!t+i3;`kf-) zlYDznVvK`2vW69#$* zo({f5DN;%$%Xt4R3995LC#6B{dJBF`#1~FdqJ59BV@~nj%C6Q&%T&`iA!@tG{|8_{ zfENfEdMYQ#-jHAq#*`!IBT8Dc zgU`9^A8i92vMjgjSL{#!E#v%sSpCnLmVbxs|5vxD_RoRUwyuV;3L#MBCVE**=G(@r z7;OoyVD~p*QWWgkRTHQ1$X|ciAk01en5pdwm{dt!v}nlYn!{f>X=x+;j&vNg7rOq- zYjf&Ldc*7U<>`qZNV`8)F+=e2TYM_g*zYJzOgH0kF$Q!|?nB~dnt)&muAkgtY&2qo zJ5HF=OqWo*=uEeY>wR@mZ%mz0yAXK8?iixLcS0ZK6f70P)A<}R)}UaucMxg=a`B>= zvBnroix|C4gHA9~i*?P+rj}J>I+(GTh9cQhQSx`EK}BAT$|gTq>p9AkIE1}TWdTbn z%JmVJlTI+@9KF+W=bZW7_AX-dmB(eBWmaVuC<~}nC0Kyg8a`yOx)Qqi2vY*Cu?TffW_loMOEZoXu#&FQ8bHg-0#uPNGy*Qt~s z5;DGo3DQCP6lm2`&QOQ0%gO+Uty1ZntKzeKcWGtZ3w37YF7?LpzBt1S8S7KP!p`q$ zlVe#1fJ6;zZYVoXfDcncN9M5>JQOvDO5WvnF<#c)U`T`zBQIjtW>JBgZ?U4{_1X!eOtjY8tH^Oa zr-&0PsNzS+A?Ep6YO?l%$5a?Wr3Ash1AJi+aJXq+!xm8kfl0OAjF0UUqbnM!(!_F$ zw1-0J1fmlvYDEZ0BYrQ6jd)(fhy40YRU|2aT%A_c9Z;DQMcx}Eob1*!il8+~VJ~=r zyQU+8i3)c1H4S@T>E_)wmDC29@FGI-w>hoE^iY^0nlg zTeSt3WFN;387n=EOZwO{aIw?_3JFB}kzQDDdcuM+S*SJM;9RbVesfNs5og=F0Ir@3 zDmIZPyR@xnF{HYt_O<0fop7!f9dmugKsAC-yb7;&YZ<5Qz3`^?CsVqBik=oGljIM1 zLdX+`ie~lPkua=#X%j)-<#C{&rj$oASml0e>V5^+C79=b2Hw#NLkW`~4`? z9?3O)9V#OE-SXbP74-Qt2>b98IVNattXZhdzFuIKa1|NkhoEQ7aJSWOn|2W|J~}(X z+p^2bz9vsNrWK?>8FwkrbQgI@?EwUj*J1e(fxHJSJ~*CQjLg;WJ(!PZ;m%Ny-oEZf zN-8;>pWoRXt~p!vght`tzXu;aRzukAOo!ZqbKUOHIUkyWPuUT%(I6gN+XLhQ90=nN z61+CQ!n(wk1}kbLl{S3QqIN0#=EmrUO(8169XgG`GlL221?j2Hr@VVk*Qeg!=ujX7$vC-QYfE(V?~eYVhI zo1s=oC#*r)+}#x?+3hyHJV-yo>dOkiCeWT|C(&O2hxQo?4G@PNz-6} ze{p2L&Hq=mF7$PHVfd1|ZvS7A*5dzhkN8!s|0_wWLwg|)q4FAyX-OwTuyIfV1qewP zN`E)lArJcfT&a(3gpHHJcH!Bv9C?uRQ_b&$nARfQ>{lmXu1FT2(x<>?c8~+k!jDhr z*CYGGS=vg2^$?58Pd=Zmj5Ka$v&#-AGncEkPmed9Z_&?g2#DT(-YDaLmu zuqjkGDhR&bqJ49Mpx3IfQ=m6AS##Ikq`DA9G{w5}*Q~I5)xFZsVhF6yrU<`oDhbMN zE~LDRp|%E|jPHC_-UZn1>RNF2G5Hfa@Gaam`(jz&Mf#|Lb8}-Z8OPG_8j8kgLM7MO z>N6>MQ<$Bwe5nxb(W35gXRew3CpO(VIOln%7nbYv`li6B=6zwi5FjejJzPvu&F8MA z;bIHPBp23Gr|m_%yVgHd4Ne6B2_brI%4MI}P1)wQGuMFX?3{O2ApEyzEMIa3zUhUE zou{(C7XA`A4?Xmf(^EVPI~zOR_;jwE9a#TW)qp#e!iLIPllWgB6gjYNWL#ccC1=?j z+gxtfWDRG$Y)t9qR@RmaH3F`5^Y%%}PKwa%^h$$t=#!^nO}r*6McsXW2G4^K+2yc3 zc``F2%aiB&`D*W;3rlc`dcyOI2(3tTt93uVcZdhk-dJsj;PD&_$>EWIFo~ z4hKx;ZL4R9QW7_-^`VUT$Z_gVYVNqSd0dY(7u->u4TEwbm77fEncYT}cp!x5>`Ywt=E3p}NB@}Jir4Iu5H&y%6FHDbOWcurP3 zw1!v_zGGfNop)6>o>f~W-NMJw#8y7b`n0eYkx{w3QzaZywH4;&eYqJb`JkaF^EklS#TO zYV7eIy5J(fnl2=@6y`PvS2-^Mpd1krDd)O=*@+pQIN14rSI0E3$WiPeXPb2?Nklu7WC5ll-hjyji| zN-WK~mu)$fyn23~W9;E9qsk%(+;7Hd3%+K3966Q0$K0xk;CeY(9HMy?1cE<8jp!et2e`j~Ys@5!FWoVB6~7 zsm{~w+S;yc*h2%BWYFC&<9KG+6>Hrf@u~YF%sdq)8dF}$Pm+8+O@3bD_kv&)#fmxj zE#e+lJ~=)Z-A_4qk_rQG#k%KGd!;!7J;o`fGQ|)c?j!sq8^NJFE{vHt&xptBtQ)7> zRE}qiz^e7go_^oHnrQIkN0F;~oS9NQDDR4=X3+SzBUliP;tE3R2*=6h&w3%(MW@t@u0!g(WFSK*+_5TwZfGi**{eo@uw_c zM|GH}*pR=kPrKIvRbM~@Y0&jtyBBVYYgBsvm{Jte1s$EDuV9?orjO%D)E?tV74*#> z$Z3;th%?!#VWxcfMb4y)tI`|tDanZD(Q~I+_OvX^Kjf$ejJ~2SZ;@MRFFo>fm`RKB z$tO!5hDN2yfE|Aw#CbPRO4BiGiZtPc+)$mpby00lt@iTzKD2wCQFg{W z3ic|~-qcyG7;63c6dXkB%!;W@Y9wU|TG_0p|Y;U3M)$Nax}An%yPYzL;JRE3vt+++a`P>r<)$648| z4KBiZ>@u`hT%y!Qt?5m1V`-gMm|8teby}?)aXL=gV?R>cO53=aWR|c~rVUoD=Itl$ zi>(9GnT(}jAO=R~mHWoul8q8txf$!L&|PTD*Q{2F3@#dOy30Hk9GqI|gRYo=PA8zw z$XqC>q@v#y5$-6l9w${?dhCH5piZ$s&9~-yu*^SFqkjb1jYI}BE%*3nz~tg+r>CVb zWVpjyJBXD&&CVt^vs1Pc#R%5LHQ^>*t`M*G@1755?ELa2)tnGyk$E%_T99P#Aw}!U zEvp;19Cs>j6cY0*O>(M;oK|RzglWxU1Xnd$ zap@`5O1!Gdppk$ilWhGom5N==1X@2YBL`IZYZVx5s!ourm*I<59?zTG1v9+ULj@u1 z6t_sJ-u2J*&Sk_;?%jgRG#5srWO7G7T+k-v-q6#BuC{g=E7j=w{KX)*^oKmN4lKVG z0zshelO_>_;|zNppTKXjVvDsNM!!U}5i^^rNFKw;q@?aR@9C0U<{BI;c8UDg)O5(% zTXuc{_czABDb> ze8OCpQ?EjA<$0SC@1<_b>?!ZoQ?`Jefazf|bk}lfSc}K!Yq1GH1$wj9-N4RKA-?yS zLp<&qSL6l_n?`%NCAHzSS^)+1|M(7kYz>ikRN+6>V_X(AXm-3RHs{E+C^JnvOe(^z zY&d%hQ#qoS(=KvW^m}Yk)T)F=L++uP1!7wLkB{!H%>pj4(MwT(&mM<>OstDXrKS2lB&bQfjfZDXXQAfnA`FP zUmvqqH)Df^(mL4DNbM$;xhwaM#y3J-cKt zj6^15+B*&!4t)vGS79bqsV%-7knq_%3P71e>&ZceNiEYCACA5Hp-2X8VLuxsHnH9+3wQPd z&yq~wn1jgj5YX1eWn*!u_tICs#KTC0i`#@2#{ncm1Y0Pgp-yAr`|>K$jm(Zfs)f zpDkZc6?G{!CqaxU*n7X!8K1BXGxKIL7JW#32|rZf%G#K2eeY&@Ce-*PGdQ~tEN$DDsP4~8!=B1%O!K^prXHDpH&QSw&%g%HiC|@^g>+UDVOAR-A-}J& zHS3~^Lo~$|HWa!mM86ge@V4Pg`^c8#iIjQ!EB|U5Zh;tZfX*ZZ!DD3Tgu%XDe?DV;UE&=Bz4|)H6mW5kIzcT`AJ@-A!y- zyo#_iO?qbkLI!4HeREZ%qpJeh^vEF|T~fg;DesbUe2k4{Z1Ki6Pcg^)SickzuUP~R zN11T((-@~9r}`xH=!>JE0$pO{yQ6~wT`uum!5}%vg$7C*scWN;7@8COGJ0+ZKx~lvs&szzmGbeVP_B|jXk4&k6(7;mM&p3sOgO>K*R0J z$jUbJc5*JN_7dnQ)Qx^7H)&7bI=8bS$$SNoaP8B_`S~5 z8pZ95*hxbCDg~hrcu?5*N+i!qBQg6|AI%axQ-?z+ddXrdx zL*dDwE}y0f2i>S-5-nOORlx2rDDr!!?Rv)>X_0qybBT^KtFAtI^!9B!itW+y{*dzC z(^fq|{X${1sTgMP`Pe4r@y4s`ZBl-0#BWi8wVkWK@6&;~m*$n|6@xYzS!%BxytyC7 z?S}HA-ib~}ikc*{7#&74Noy(UuU3c)uUBM=zq1IN_Ks;T^5bLGYNydU@zC2nwQBQl^Y^gQY8Uh-a)MG9h1BjMAn6>~t z#PNarRojF!7lxzMcqkW%Jx@}THgyo_&`o2`+SKQXgiaB)jfexT1|XwX@wo$Y2)IoK z`H?-2U+A&N5ur9e1MTji8D_8}+B#V3X07jItV%RXL=sKJIMsbudV`&tpk19*E_K4m zBXXrF)oZ9p-F*%an^Zw(xmM+T#x|^*tIcAYdJ4M!5J7spATM&(CpsH!l{r@1z?yyx z{LjlrBSLoDI`$Ok6_nZLflk1K_`cau8d@uq18)wi#>F_3Iz2;i8J>CQNnkL?if)&2 z@vnI^Z6@PG;M#E2BAu|=2#~jaFiAcf_n{7d5RFfb9233ad!9jiZz#{0=M+qWXyW(I z5f`03^!7Zaz$^3B(7YtIPDm}}W|p&FUYwiW$G>byQb@r^MLv66K?<&QMEW)Z zUU7)wgU*~-ajLGY_T_h8d5G;o&i;tm!Yv(Pdk||^H#>uGFF9&xuYsXpv_L^%yf98r z4L=Adh0Tc?-*A5ocbAbA-L5; zeR2%9sM`?4Qy_(6wxFZVAl5B%L6r=*I{JBdK!DQXUO6U5IE2}g8u3%@4mbH(;z9%RsrAt@JRmemCTb#`Db5|lKH%mpkfa^(Tj0PRCG}(yjo~FDj->PQN%8CLPr-uUjULoIMlWZ{qPg#R}X3%$Kx! z{`+pd*keLA^DWJb2Qhs7S`?40ZlM{Hx)t;d7>t;1zEK!GR?C;1?h@kKokdpxIr7p& zVTbNoI6byU$a{oX7<%w|a_B6|<)ttoF@v#30QE$c1pZ8=xOa_*n7wR@CZt7Ra^ z;<&B2CTx$?_tq-1%V~-mSYr8~Tl1X#O)P@vOpfp##c|>zZBgFY?SQo~FZZaRe)t{!7h>Lw=UUUS z;^=nakN)BEeR&t)8<--ZA0Zq>*#jf-{7X0ePOTB{c-&$iLek-ShI1o&JI^EN_M`ie z9E`V1s}k>Gfbf)i=UtO=$q%)pXWZV5_l`w`YK#}?7w}5b4~W=d{+(|l>Mlq(ScfEf zOB4Os4e=K00on;hY-4t{GbdIwk;HZxaz z-gNAB%SGcdg#5DX$YgN0?}m7@kYt$QELua<_Wo_bsQBJ z#2O^_zgA=s(_o}*xjXqH&P2sT@$W!|8Fl6@P%#_No9&a+v^OnQRd9ft)lH{kabNu^>Su=l&jLfYh92u3|hu6trM0F= zFBqL`tgK0|IO&XQC3EYT)kpLWg=`yR*CckXQTWh&Yt14RC$73Nw{Jyuu~E&h>sFfzY*p!oO5#QVNIC zb(ZJL){0ki8x)6!<=;B^sQ1~oVt^`dr=$A z^{slnrIRE#a3(wbHjY58&qjWC4JKoqnX` zpZdakGFOl==q^?M>gUbT?^vbgZyKXp*3>^5JNj-jyRV!JPhHnuh|=3vokI^jZr#e0 z_}4;|Kg%jUEIP@5OnKe9#U^ygX1!nB?q7w_t- znxu`VJV32J+i*<^G2=3Pdrb}$oC6WYov3*tf?x|-p`-o(Hhw&<V;Id^qYck6wY%r)1Xx;vP1 zoj$t>4`w#GQb_5C!uDlo0&G9#y2wgDS~r)2ckD`JCDdXpwGcrahar+qu}RT;Jgtsi zoA_Zh&Chma$iA^zxPaADq4?;M3Ep7_`h!yCvJX;Rv*yg*!rd3 z`0pO>FLag{j&)j?PQBX*Z@Ndh^+=)ySEzi?mR&Qg9b(bCkFg3E)9n|2>`!X zoOCcC`znGgTRqHMBDttkTsPl9>OgA^wyaPw3IZWjyL9Y?J8U?YDd5~?V?ABX4dEIj z0FEl51J}ejqst1C4~8K-fiSD~(J$wS5EiqK1COnTu!9@Ubbc&*4-$e7$d;}{rjb$Z zl5L84OZTN?9s%Y=Cf$;7QaN$$khx*yF$JXoDi68kBEFAir-z}`%{CYMfgkGjKp?fR zYVD1z(`YaB$S>ugrpG}nn0fwEq=qk0SM7RQm8rc)E9}0#jU$QSDu9*OBOq~iEraQL zRWwpBumbk=cW!nRUtJjIM5@DP!dx&IEE&@T<=>#S_?g*MV)!vi@1_^yP$v&H#}{IW z-TmU5^;uNK{h!@{{xh{j5YLQ6#o5C8cU(fv+g@1>?WO(b#4Bwu=$(Fy%m+IB9x#bS zaAZMqh4a@m5(K7iSir03TcgIw(pHaG-Xc<=+E~@kFB@86*RfbyS%Y*&*t!R@>vF%G z`HGeLa%^)<+)fv7cTOn#-n2KS(aI2#Fq2)JaG!qln&AEJHqm@@WXJdZ0_y{obg}t6 z<&PB`d9YA9RH2AUQ!N-O-`Q-I65~Xi`d4=wYXIp`=^hm9X?V zwm?`Wszf+d)$S_nLS@AjwU<2WP*L1WwZ^K)^P{(wXUJtaJZNCj~1%Mv%XN2HQ z0d_paGZUV&4QeW?GZl!aqN0IZs*a$_Ftn)RTSz>NITXVt3cksZ%{D)BG#*lc4(7~o zGdBr)a5lWe4Qp8u7nuCxvpgSt_aZs=mii8GPLt!};6#oxOouZY=8UCh_n=ClC3itT z@_6Y3Q76GsV`oRLWnv-k82ue%VYq^D^(uPS^zd-uI%&3SC@7-kcftq-5p%`v%ItnA zG1-K?R(-_X1_!XNZ1oi=l5UdfEO~Da9@k2hniFL(kzFAKvm@AN@fbyCmg1*oiZQX! z4n@i6!lgd(|z=F_KplGTp5>Ivz(7|1pxlIFO}pn7NSL(JqOnN`erxjQCxoBg)x=6)p(eP%{h5HJoxxK55er4XEmjL#@9iaHWFH_J2=Da+ z)`zFmebWBP;|Eoy%8yhiwI3)5KA{+BZ71E>$v^aw)p&0)E2!L+1ZN+)Y1uSq1vnPj zv&52FRoL6zt$WK+S14P=?DT^swtuu8jq2#}EOF1Ct# zv_r9_CRr5lv!(~TViSvnD>Ip@)KI>kQ$+uQjH)9|6_2(*LSt26vco!7Pr9?4ld-FU zxMy=<0}Jy#FoW=c2-&saTLt-N9TCqk+djGd=^pA%gGAaBfZEJ;mo_QJDv$>&-C!k- zHSP|jM~XpePbK^8>LVu>f!2?)gY??NKo`xXdh%Q|1W}0iBZtLKCIAs6we5%dAV{nJ z@s>9*aMCYKDYKNlvX!QOF|AlMK5iuzB-B3FLm$^nsb9vl_KYsv#!FSJQ~8mx37(C` zbH+EC;`9VMNIP`W$Ov@^6#}@AMK@ zQSwH>hbrsj;uCbOq(mso5LB2%#o>*!m+hHnjPzB=o)Ako$0lvmLkN^l|c@GG6wyJ$QyP%;=Ps zV~{qoy>X*XBfWnoULzeB-3*3Pigp4rY@5_9rT;7y-B%Li3Hxp5fs0CS)W}L7V$i0q z0`GN@A-DhZPzvI-?V#CI*yI+t!igAlQ1B||M7j`m=HTnhZ%~XMCpVM!dMc+Q);AHK zKM>zypA7IjpuS{Ze&V1@*a)bDz7hX6mCrgyvegvAZEFV5DryuLe(N0YNV+A6dKj;Xyv|B76iwbm#Tf8DfkN5DQNPEXn{F#SDpY2A#Qci~91} zz|KB|v3YFNHQepcM7o+5k)yEq4%{j$Vmh93QxuB0(B3-|Yf#a0T`IIFC+;jj!iCWK z%P6bpHDWn!;d5_zh5t3Ljp%>`^=JJuujKDA6^+*v1#<1KbzQ82r(NWtrMU!}P-FU> zaDLy)&N)LamL;iGRaAv7v2-Fmm#81o$!cUPrHxHcG!|HDt|&Hdsh&Cojr9tjKqUH$ z`dHjS)veiglh+$uygr|=G86{$874J>=c`S;H@9J{p z5T~E$vsL~AWvmkBAec|^m@>|lZRHAi8pn_>yMuii2gNMM-1!)|k5tqe@s$|O;Ai(& zFPK_CFfv1YO>AB==CAmS9$!1Sf981P{>-WCNy-!JfvnD%$6!UHEsQ4WkiG;Fw``ZhcPmu^CGEKeNT%fkxqcbAG&@|Fi58|cfux+$wO5cM}a+$cSI|=3}DO#zArcI3GGy$z>Z5=pa2ZH3Nv~c8f4-OHXCZ`U& zjt5T5IfwH%hrJpH`Mp9F_EH5SD~qc3q~@B*I+`97wXfFJem`WkbRU0l3}4%B0BB%9 z`z5r$YQv@e>>^8#6EjSSy zwheqndqT^Eg?)bI8_&^ty;1!0ba2;XO`7R9N6yy8D*2i!ePVwRY=9K#bWlsZx@shv zf9_*s6p(CW#U`i>TbDXWPzmZF=hQ8}85K7w*^oKD#|kbN#aGyLn;SRgvT54Te!}k^ z<^qaBUNDc1WG8WRTa4eQ-9)z@9|9;v;p#$nwa^OXHnScm?{YvCWJjf8F6rsu^0o_7 zu@hkp)&9sDt~7(u_E-@E=Ug)tmTuodH--(&GYRNJ(#K8#gFZN0y2(0f}K3IeK4_P$j8|d^x3cX)$JIfGp19G(z~nHsb~mA+=pVp&pt z?dT{g7AD=I-@#`x2#UdL!z zwNSE;jethNK!HBVJT=AV9U~!*@*p#8oi97|%Ny|IC1LHi;168n9p!A|a$Iya3s@$_ z1VA#qz8`0lLcU7Sw*H;YIT&g|efLI$*qIhu&hJ8ESDgdCGR$X3WJI5rjwD6GeEkyB zcgVHYl^l5?sV#4aV-&C$mKGT$u)wzRA~UqhwdVY_yDqXdStS4#i_OJ)J2MhD9ymiT zoY5HRK3)bc-STmk72cH2MM73T$>2h|l3M5tRlrHDC1v)AmhK9d*paP*IpT<$*@%R_QWPHHK0I0TpQt;VRh_j zXGJUG>-NqEnb^3?W(W;NLwk57V2_Dl23aMu@%R?<_=)r5OekenBb|~_2dj{kU`Ia3 zCvU0h$lJs%+$-9Co?WfbR?!PPqexd|Cv?#sy%*zWc5}J2Z;zEzY|Q+I8*XDfVxW_M zD3YR#T=W9;Z1jBe(JG_8^%ykI(6cdLv(K9eTkJq@gGWqV+UrYq5s&wg-B7)ixJG+P zwyCE3{Ls;aTWZ;}FUd&Sy~v5xp@)m4lny9*golMzF@hap#o~lAih~%*g&BmJ%xK{X zMXSbq-Du~-`q8+AyyDdBXAT%uB3uGSR?f7c!7mU$>FI%muvT9{hh(Cl^6@V#g+Egh zg#M$_0ZJ>sm5ltDQQ4k%s6j8As_*36K>ih0gRxx`f$!!;V}eQ^3~(gUW>R&<-B~gC zJ|LLz^!6w>*pj`lr(Bp!aO$n&e|{yMj>*AhZ@3YkeVOk0TBsLZ2n_)&hJ?z1A~Hw^ z(v+D6N+CIqNLo)gx|nF*KlE#>m6F+jeA;3pD^_Z|l(&LD1^-gx7h$28Y(aYN)y#q! z$(8BqF@27kH;sp>oy9^?E=-g_qd`ySRj8mAY?EqbcHJysiR^mIkA6W0?cqCR$2&5J zs4dLTq8b!QiX;|UP4t2EXueUofj1?FnKa*>5(YANFt0`=dZuQu@Ph3J29@-N{KeYMenzVWrsa+oR0JsgvIv;|N74F8B>DG)QvneH;s5REv|iQ5 zX+;>(N7j+Xka}EdR?tFFNUKYBrsQKh8%y4z>1?;8E zBD4z@VZ{asDR({sXMyTMKCj6xlTIRGXh@LZD?QH>M&Mp9n|qgp6nJ(?_f!RbnLAa_ z8875@{J}~L_w(Cx(ZOJAyAkdQ~GI9E}E>i@J_H7O>eJX@Z=936`~F! zybY8>I()oK3MnHqcH4a7Mdw{a!dmmQ=565UCCL&tPnL4)#)x%Mbg7r6HY+j+*2B#` z6_LWsnAO_foN$f%^k{8)a4{}})hV22T;v%wU46cW7P_i;fmXU?Ht=)B)k(!sx`!E_ zX7y7z509yr^pWu_^nH_-d55+l| z)8{pb36~xu~U_(=sd?ldc@k!ta=!Wh1GjVGJ36--~^M-etEiqi_rTt~)S zFft{P*lRzOq6*O&WHA$(x&txzD`Dq_RC~`zIwVwhKhIG_5fvmnj!_SX#~EK^8as>j z(|#@RGuz{vv)eRAurrpOI;L#d_t6(*4_K+1BS+YTe=?Ykzas44mmufQ37hCqFOzw% z(Gn$Dof0w(x}1K)3ow;~Zb;ZrfQqQF1QYoYDVHi2+foJ6 zFVdx$fk-D~_w>>xeei~e`9gX`)O{fX|jFdTGkM0AkYfn(K?exN*uN{r+LG;w}8 zB%v=-BZ)yv0g=Z7jCb*AGrl^=7!m>jOS?24q3`{9Uii2|Wgg^dZBE*sgi;sF07a z>8dF=uuahdG}*T=?9!)KG3P~2t$rslCBz6)v4P&)Gjo&Tm5c*^sni`#{=^twSe4p? zm3^ZmqnN7axGntNYV}`%TLJgDXF--D`4;1Tq zjMX*64CricT8;WUg8}1{M;2_TGt8u8CBC1;m~rM3AS`*JEj}T&=a&6v`B6z{j?)K~ zpZ_<;5={S?Gk-Id$mnO>HfK2*75RZkyj&zEGS&AMnLc!*de*||lZN1p@Q|4YEXD0> zpSV!gxO9~%TX$uZ&Jr<|g_Z9Y)E{)pIFnr%z7zR-U;yCgaA>$dp&eszEfT`TXEYv7 zYXme~&M5-=Tj1wa=*_8|h*SAQB(KC_UsQn^x4HUsK2wQ`*!8@Sr%Zr^;`<&=k?xBY zKx*u$7p1%LavSEA;8If0K*ts?C70q^MF^gY6sGNiK-SM0vw!(Jc~41DG`8~1hwk=B zPtg+Q3~|rg#*9dJRDjlcu=woh01`q#-J_o(@Y>h3(OGM0(J{6nzu=PtDzdtSe!}LZ z-n}8mvlDL6@wuB4UOmgvHo@K6h~2Gn%8>dXkXF(WsDlNTEw#pYZv4770i&uF!}tUw zL=%lo@FKhkAcKyxd9$X_1I1I*W&lgZnBi!uNRyrHs6oXV*n{yisAafUra#Sl|JqqX z?mzA+eg_YPLsu9}#rEUlLe z=`McgU{X;F$R-*T5%Q!R{+5Bt!+^U63)z7qfh1b7#Y^d_c-8?E)KU&W5X&qi$|c1Y zUjBxLR3b&_M&3LMxOQP+P@H$xUQW5a@iL?UO0J{En$AUmoxor^N~$=#@z9%ps$l9f zLd4wM)-nmS?5O!wpUjnijEgBZRXypP5eJA?u)o*Pt;~F}ob8vip&e%yL<+>NU zS;`gO19eg%vt^bk3&g?B`^l?zQ544+XN-&ol06BWV4VWa=)fw6Hs8WaOprrds7o6r zB99TK_0{Cfftm9EvUSv^9JT$QUao&m&Ho*kNJjXdd)j~Vg$a9bMB)(^!JbYd>T44G zH(wYO!q49*vwo=!jgx$*_?Iut#o_TAkS`4Hn0xY-LRUIMPaDEdR~TLzBvE)7>lxx6 zc@vN?Oc|++OmbP8x?W>$P(x!45|dH|xnz*rOzPNaT>s@T2Yfr%5;=I1LzxY2{DcMB z_KwWGvm=dUMJpMNOWSoqm>jvF@4+K7$n* zP4*PL4XTMSvDR2@sOpt(n)(4k~c2l6DhvICD~lYzyy&YEi}l<-i7B)~|F_*he(aG?`8 z%(G^ETo?Hd2|aYZPyD(Gn+KD&fclY~?`c=UBck=6ym$8XX1mQ5)dHydCSr1-?Je>3 zVa0*JC@s2TdH_$bNdD-&-$3n)#RKGsW*)?mSh{=#kR7@DK`K&e;d598dQ zALM_nS7KuN=bQY!S1QNF9aKBiV)uh9|Dun?9x9Jkthh=cm}G%vHNqpwM0;7QjfVR8 zieGX}x>fb3Fw}3o68`7P(^v4-`&oPX(;|>kbkL)8IAt8_E>)sKpG)NX%>s@lPKXKJ zkm^YcDnPqs@~eK*n#?x7sY0T{b0L_^uO@hU%*OP)D-&v?3MnE*Gl}| zvMMB?q|8bpV_0`l&wqJb=zsUTQ9adTJi%xRRfk=9g5X{f!7o=+a>c z-o&9*szD3o`J->2nFvaF>aBSWJywM1wl8DmDxJ+2zmTA$6lSN6iwtJay+1;yZYM-^ zcLuoTbni5_fBHLcUWfF6Ee&rROuG(8M2$-)fIYww-~e#a{?;_W*uyyDkg*LpC=;p0 zxPuJz$Le(lpa3Gm+{nqyPMAr)f2kKsHMCR}&~U`~;ovVt<+MMrBPux4{HD!k1;e#W$#qKHmM!Aa@{Qjxn%*+jds zTqRfDm15ueUQe9*V<=XimkT{)2hwTRd#GWCcD=Sfu9CEm6(OXpM|*}dKftAK$>Z9+ zqU|BgFg2Y_yIlcp9-dh10z8aFeK?c7BF$iL<6Wux7nmHv&kWw z4FMWsjF)jj6DdKev2LR=F_lBTPu`AXakxXK-v~YIWXUH^YPQ3JuzadkKzsd+U{||( z<&*FF00X_jYi7U!9}B=s==8<4L3cMIt$K${pUzWqmB>y((q5-Uov=pK*m7P zBY8&#*|3lqu~_?e3i9}!7!!FgROK-o$wRv~!CJxgMh57M^-dTMdC(kL!*fPK!C0Ev zh@}rikqnbNZ!iy>1-9H!<85K%ZF6UCKxJ+fRtiadEBgqaIscJ`vU^%1;WDQZ&B7f( zyTWk>_ExLIRJTHO{U%bqG_v)In9+@4JHWaL;{`N{tM{D_>*Vs z-v&BWW#omVlmwW62Rao;Wx)gx%VGipU6A_N%@7W{LpJxQ{knngWEj4heL^y;MPO=; z{-Kd6%>x=);;S)Oe7YvGOG^usGMsM~ZU)IeFtgyIR@oR04pc<&2A#i?F62rj0i1ZF zQqIB%#}@Ss@Cg+cqPtPmICSaPi{yy6OvT7n0%64li50oelIJw_#10J5Jx6%p=n3+t zqw=9ed-lR#LRIfeil<%lf--l`MPTvLU~aZFNHG2hWPVO{uNWNpVT=?+#j1Hey-_@i zy;e7YnQp+ttmxvhtNHZ6an-Ngr2c8tKBW{wi1%XaV=&p{^hJU+W=k^-!V8pl+N60s zYLF{mn)PRABr9jcC8PN19q7_N&4BPK_jCAb(P1n$3a)@GurT!qCO4G;F194r2$QdZ zAypCs=+#72RWPFgXo64)_&-~lx>vWF0-)*`^@r;C=ZO7n-kE@+5X=8apjJvhHT0yk zQWGf@Gdmzc>j+@-A-ai{(L({j01AKn#(l+}JPC4{lufg2W`=`3gdbv@YkAoKbpEXO zOT1qAW|OP!t^B^;Pp=6A=PB-EqN4#uM4_*ckuD8pL?%h3n`>tv&}NYpkxfbRNR3Ix zB$MNQX!pDa!YQ=9V+-$R&}DMAwW&m1xCRx8Zqhx~o}Fe`t3V6$z)O$WBh$cQd*rC)w$Q=2hqLDbxlda;9~_z0W}4bV2W->D zsMB7XDj}7bzh7ZilYLV%>MoEw1!&;rfm5tu>AB^}dv=aYY%sJ1MpGwG?4KSBtup1(k>7oMfu? z(Mmhm2@D{fFgc@LE`O{-TbN+D{ro*fBc{*&U=lQ) zuAtx;G;tUzm#kYYaE17S`3@52cc(3o2l-;0TgR$2%LFc|LSsGMp1G1-nh5E@S82)KJWWe@twDvlLtTcn(4ayTL2QaUe_ z(MLAM)T^BHv_!fh{VdbkzO62Uq9c~W8%-3-K3jOH?$P`;c7nktaE7{WwsgOv%2O_5 zIh!b5Mi&iOFj?~XnehOw(Fz6vTB+6xoj`^;my^W-(p50)&5cF)41fet7#RV2c$|Qz z4<*VPNX*ym7V2PB8dn`@2mPK$=m&~m;a+&41xMf|M9eEPqiOY|s2%i{dBH~dLRUS> z_F34&v+2MoBykoh66t=9g8fce!Z6Gu1rt(Zef^{LpjcHGg1K~&{g6b98s@SA>mJKu5 zQVED6`$Z1$J!!yp37S#jU{ciCCz+NF5~~1)G3{1&*{5=)W~c7h%Ynan-e{5>0F2K$ zc)d)1mBc@9gby0Mq^zZ7N-vDc`ZjAeGNmU8pBtH(rcUT0Xx#U>$-Ripim6cL)pHr{nld{F^~95qbz)wXjR1deGA^!9VS{ax5yKBslYjB>3kD z{_QqW$;8p##MYVQH*xyk+ek$zIWR`VXV@XI9G>@w0x~>VP}nGTh%zLWa}gMTkU>RJ z3XPV$*65?jbK#tjv!f^`*N^@foJBTFvv*uiyVG~K?>*kw`(*$|;8h*P^;ti$e8I8i zSTq)2h*#aj6smCq{hWVdV?@=?-}hOxi}66Dog^|@Nb0eI%{BCbEa<6#r5VH(S;)gY zXV;7?_9B8F+DfW8Y9vXLQ?y@qb|1yJ#FRh^z&p!C<&}7^{}^K#w<$1ps$?Dyy5f5? zv)LVAKN4+qD@436+0S@Ud$^qmgn=|OWlEobA(LT&_SRMNr%R!v$3(g(Lx4(Ax8__l zEqW2^0W@|RVg`+DV-RJX-Z3_zu~)=<3A(xWdLGDLnd%z(mephV+8@)S8REmax^ML# zHI&yfS(Q75F_%h-nW*+WQ2#v185HN$V)&SzaJKilmBJ7q>^lB4UsVgk8KtZ-%qWVU zDa=B3z|k+)&wt3T}J|k5TkNH@vzB0RbOEhUpnJ-(vlusdg) zE1X9zK-1Ba`k|yZpp`qn9C=ZOe@1)G1c!ycm4C06ka%d!+AkM>%YhdwfUkU5KyHt+ zc8ccG1skGZ(}6n6^l`|#pJSTvi8)0Nra!rS!V~^jHM~r z-goWw^c8Z%kkUxM48KnD2<30B(J2XA{c7b4C-YDE4+?Kj#|Z367LX z6=aU?v4P7i=TRcd>3|QJ6Bbu2*nAk7(?JRft;3Mnclr5Xe{@~ClLPNSc^23lijW5s z@Bc&wJgi{iNq5f-4Nq+I_R{OL$iP2d&O!@vrUqgbSJcTQKUL!a`qUZH$0P{Hje!u_ zcf2K}j}cyXq-N0pMh3Ip=t4GUg-qHn)I$_Abd9eyV-$Ky4-ND%gSOAxuE#AOyz*zN zUff#b2^R(Yf_mvh(=>&fq!rN|wm!^1sZ|Y98s0sko|(<`MH5M*K!gtE2=heWT@S$G z9>zWN@GO4j+L*~Kvs4X#7&$Wj?dxZX?Ueq}hbe@sjFJk@ zl)Mt(=X;0O`q*-s$vv7Myk4I`xf3KWE%auO-UntqF^-l+A?u(vKv&U0uaiAhE+5A4 z3w0l@U;2-O@gPh4)@+CP(3tyNcmnl>7|>jDUZtU~7WEdW(K&s?n=RB5I|@5DqE0?+ z9`nJ=ufF=kC9AHn_f3>sY`K-{MaepmJhHQ4h1tS7{?4{;#9Ocbj)K`JH;k#;Qvb3` zo%Qmrn7ct2ZJVV&-%S+Px%Jc)qTK)ePK5U<)nFABAO4=w>Htw9IK8D7+%7eK!d_Wr zN8cMONrA$K)qxiU;VYTv2 zT>?VAgy@)82m{-$k8m7Cr@LT{!oXFh`><>k>gm($vE9gc-N+r#W_P5(kF0*MMah(xu6U`<|d{TLn)ZrF0=s zA3^ay8(StKN-k+V8cnJFo>J>Hu{2s*3->Bb-R;Lfw-(f?wsG|lk^c=HkgqAZR}AVi z?t6pe;)8dCt$?NTg*QRkyhl_)fer9;x?67Xcf?$H9-+tbu&3{UHVeKP&F)#mf`{W+ zLLF$}BXhh+BBAN6Hv4WQNxYQq=J#zVWFK*)koq&XgeZd)&thPrT+}e}B0zx`m3nTi z?i5&20e*dAU{qwSA7_zzJ{5AH0XE<-s->P$zBo*Y!p)jzN;7<;}NH*)iY*#S5|K7XP7p!TZInbX7NF`#uIn`4gh!S*M zaP2Z@IHYPN6qJq|jw;k#>3s$Cie!@OaTr$Ihf-`3GH~`&8_;H%CJb~vViPL<{xGsw z0WBmlpsME?`3o~hW_0sgOoF5A8B%#q)vrv&$K0(Q6~DRJbD?Zpw}X(;O`31TfC?pG zop*4sQ^2!SSzt&9v|ZRqFl7t_t9WFb$0r+Z+1bmh3b0WR;i$JCn0l1+0JKN+Y>T(H z(F)GHzPYnJToT3%N;_!LEnmAN&xv`QTP?WS2IEZqV9dBYhZ^f4crz3W8GnGUKPhFL zIMjhOk@c=doLs&a{vZ$KFiFat{#(3KbJS|QRP9INb9A3yyRU=WwFOyF^nCv^jsI=< z2c)t?qULB||Bq7qkMJ3YC_M6|y1zqU@th9E51|%C*%Ej=VAQBgq2bED8W`~TTZk|U zXc`*f(BX9IVoTXi^YFGYyMMYkgV=y>h5w?>psYiqzuH~kPaD+lgnMuqOQ^?f&Wzet zlnbPy#Vz@?*`>Ctar;`Nq+C2Si#EK$9g8N9HzV4Mk;s%{{ZlrRE-A%3m#o$lK$6YV9Lz#zdTHGyubJ(3hzIZy8-*fOmwX%DIPeh1#zP!N zEJmLrg^*^PLzcLrhpwHV+ETSFrJD(K(p-D2|7mke@5ZPp&FY0={&gpMNDWbDq}K?; zoKke}yj8zzNZqFojL7GVYlFJi;sZy2(1<(60gZH-+v7!*$zb9fTDPjS{ z!IunUT-@3Yz1Efv5PB!tPaw==EDsHia6;sMa6#*I_YB7yQT`f1nL4-!#!-Zw zHJ)SgKXQT$fo1#hxCH__DZV);ab|hw5}WvNxySdz8sZbq(nW6a1{A8j@|cqt4rN2l zYHs7edfbaZ8J z?^dMScl7K+;JT}xCOT%EmnHhBEozIyEtMa|Grd~83jjj zKcikYSVd8~b!alvWF-Zy@`dYK!dS$pezG3|+g-5jlC_P_rT3i?F#sm%JnrR?GpAFB z4sVhdxAS$e?aKGO(&!h%^9K$aiZbK&+M`Ro3Bv?rpZ+>F?z~QHNCbTak$;(hMgDF% z24NY0n3eMXf5%`1G9U~x>)rrdK%WsMnq;ERjE?yAuHMfr*3LMuWnQ5J6*uF$UtPZ0m??cy zfzKjUiNhlkbkP$sM(0WzT?Z_QNSkD;(a*mis)bW%*Pml>#b3VdzfDSzwKK6Y zv9tXjK(7r5=tcC2OeA|7V<;eh_O?j=U2yOzDk>KQW);I$mXE`3Djs1pSq6zo(C5I3 zt}N!C*DKp(Z)xk_8|;j(u66J{d_7rvdcN4k_<*^Cc4??QkQ`9v2NaDHH{yvVGnR&Y z$fc7u&E_+0AXP`p2A?9Q$;N<&!V6vqk9mmI*kmfK8HjYC%&` zU2?Rnpi3OjGPZPX+|RbH_-BNak4s467-Yj(qLyAe$Q<~H zEVQ1=(MF&-GIs@Nez9l_5J8hlHlxrUo@1cV1uNW5OZ-BkYD9({Kz0Pea~qzX!W)Zo zcEM3LxLwfZX;)6f@kZ5{ZRYrN>DY^y!*#kY!A@8niVN7@*Um`^-HN250H%FsrSy<` zkM*a-Lt~^bBoAe{#%CtXPt!SGa}#C1X*5?chvL|xP$0FKWQ5tOvGgMHD*?kZt-9K>?fK;?`#P z__D$9WyL!>Wf_R@#f5-m_e`Q#Ea5oIlD>k z%Z^`g!hjE~2;3o?;bK)xUqPS^95?u|(*E#9I)N@#BQ&zhJQ6sknCBK9PD5aanau)$ zh?v7}Lvmuw69k!G$K~6>a*!)v6oJ#Rhv0(F?nBSU+fN89>F0E2%KLaWrBmA|6OUbJ z&Rt6%;J9WiX}ATIe3@`U-$}_@Rd^mrcKUJ@{sfB9Ea|YAU{iIz;=f%?M#@8H>mH7E z*On9gnB&5E0LN>Fo(dsprca0#q66mzp7avK+&x}t-t(@dZs7eHuK-x#j&QwVk_YcH zOQvq6XM0&QKe|=~-`$ZM>DDW1Q@IV?vuJ$*=T~G&Tt`yDujd1r7 zM)W7)Zt$t&CtRdZs)Ij9Aq7YgWnfWUHBV!(nUwW3B%x@o$DG*Ri8kd42GgDQuV7*p zH4#QlroqW8TXd)zwZB^D!aPCG0g5hfgZO&u{fteYDvo2kdQN{piri-?daoHhFPRVf z9NhIB8{kW^(7G}%Uz(H5?&u&-h+{;Cm3>HZ>&qkymWy^LWe5UDa9e@G3ad*-&E5Kr zi#=jk&g6CJth#7Gn!3RKuWd8Ezc!yCD5|x8sA_*^_WbQ$MO=u9mF*AM-){p4nz4z9 z0P0*C8QzqCgeVX6G{tlZ}X4L%66|55wTn09reKv~bGcrec{Ow_IOkNbDJDi4iQ~hvCXrigNgdFx z6y#68bWhkJpmP*JF^u>_4FCKx1^@2L{5f^V{ZIHOr_`z}V&3w}Jm*;CGRHrZNSKI( z0^HA!)-Ne;SeSe@ilLQyXQFdQ_ShnbGmhB4vMiU=4at3>^>J!i1u7mdfmdwlKIL^hef%S{iIAi71q} zzg5vWe~T9-^RR)5=is3uG$Qe_sN*W5p_HMCzqe1kzS5=u>HK9c)Tz7bZmeVG(#v7U zN}@0~+;X8!{<-3CErki7MeoFi%eNK(jMQ|-ROF{brEdJmW#=?A!0LhD<>6`UR+>oM4^z1k}EhMqqIk zV};6v^5RAo`qdwzfWIx_{GPPDQbAwBUr!!?`%3_wRFen^3jG5+7?l)aMC2_lSF5~Q zy;nulE`sxiRkWa-u?iG)$c3hx1+L6JP&79R@{g)?|FTw#TMo2EW&PMYW;{V+##CuH zNe?3Debb*7m=J*l@!h3Be0OdTId6bLcP3kQ1Yp$a#SXBbZ&3o&y5N?K+D^&uYO=f! zrI{n9e8e`WyAtbmo|$1(Xb&BXE)UFR%B0^?SE$lX5)g9qpofT(j$_ZUrSMYh3#oM1 z3T;qsGs+S3E(An*31lJXlJZyT9?Lfq`Fo+cL?~k{udxW6`8R-=?&Rxp2?YxhM0nA` z$x11q_`^_gZki(uI4{!525|v{*J$(EDgEGNv}Ib0_Ep33_fZT%%b)jFg&*3846j6H zrcc~-@IvnUD3C}bG>xcp{RNivM!=Jv%PAJufJj7iF6y0!O0+NI=tUZH8f2hAo(Co{XVf!ocP}>}D zU9{?Z4IKa0<7K>N`W~{*{Glq1;wY~%J?!#DIo?Mnuf;xanJ}GjHeRe@91rpU=9&Ce zChE<*x5b}c&%80#g_b6io0-6>iqx>y4=wB21KZzXFm_z{1v*@%L97I|;gMMI7i16wFo?c${4F_tY2Skra=oV9dc|`Pw)d zx>BcALrcPwNREQ=^SU)1ECgYScg${gbSKT&)Yqr8$VByq~xqe2WD*@V1BTXCz_O`+$;s+MFwR}Q%NAIN%2vVY#ffl)$yAD}L zrO-r*nz_QE<}_s!hY@?mr>T%vVodNPNp^}q`eZ$#$0D>PV@zYVvQe{@-SpK zn&6a{wnEG=%nPE>n2!@$k(vJd>IPRH{Vs|K{g%v>@PnYzS$7G zz5fym75M(kjeZl|POM(+vtUSv;4{#qj&+MoB}rJcO#8i`x4dExyhs$ZrG1g5{BC91 zRNqNSVST7q5%P-hk-UlkE?u=~84B;*%P)j>n~aEv9~7>TKa^YaKN0l)Hr?x2xEPr@ z{?Il3^BwvTz#f1u7+b2kn+RU(e2CHy#s-9pDpJLNh1zci@$@RhS8-z3w%^kye;Xu-g}vw^?<{X9{-wS$mpaJ(E^jp29MZc#+R93gSGp~e zDJtiCY{3+Ko_%YNIW>JkhFx$;sf&>A4haG22I=nZ z?ha{5zYDydxS!{J{l;*u_4oWc$8j9<+~>Y;vxQ0EF7AB498SYP%*8i2YF}l+e-8g( zPD~11&`B7^%y@%*wI5%OX3b_XB_Nd_DLlXv5)u%0nbB|ivy>o4?As#5u8;_HX+e*m z5e9Al*ZJC_qmwv|fyb3Cjeu1sXe{_|7*^&Wg+|<|GZ?H!cBM6aJ7|l^p;Jc;SuliN z8ikzb6VfT)_5!x1W09=2k86ddPBO+}lE}SKAgmyYo#uqu zFWMuh;NBNBDWZdY$rT1>q$7+FHNH=#AS9^gq+KdR=03xmzmQ-@@YDm7IS=|7ns2@j zVg7{jCKoDq9XVz2LQFkDWO#(av?)2}`?fdA&y|aXL2)#oY=dtY43MGk%Rb+VD zc*rUA{634me#fTtj{H19+Em|RY(k@xMk&~e(K){`6FxzWcsdww-}^~jn2S#`{_j)w zpH1!`s|yN(??^!F2jukZ^{hZ4@?T{uR@SsZ76tj#?JBM+BANZ;6=?JL4%i4`QRZV` z&(8+8O)?Zrh*Zcaht0$o5xcv*<8YA6TC{;L_}H zHF&!6v+)tORa!|}s+Gl-I3R@-sV=VD%)@B4CKz$ntv;rG#>~S{9eHKF#D^UjZToU7 z-RBOXnTa9fL^^aW-lx&$RYz~*j{81Ohn%y07@;~8maksb;mzl9>#2bI;F%N>Ogcz- zn-aUdy*s`{CE2E+wN8Nvt+nV{JgAH|%A4lM0MZB|{(k*AvnkvKb(cC^v6&J`tCc+t zE(K{l8#a#)L}zlp@EL^h@P^`exp9X>^R?kA?lK2J-ghm1WugW^M8y`|@|rVAYR!ex zOt`?>>?XqKkr|aUvP7>k(g-fS))b`tmKU+<&|VIW>W}ik8skK_H>Q-Cp*|SH_~^i0 zIx7w$CGAy3`Qa;vtWN(;i9`M9eGTWc7o%&Vh-(amKa-k`V(vuE%j>au3Q4=@_l%n_sA@|dQqpjBhxp)QqWz3eG0FEtkkWLO z<{Tlms~hy=fhDPya+Vz_iq1aiwjntBBpr7``Cu4WDSM{D;!PdFO>$NaTEC_OApne_ zn(DF0?aJLRjSJX%%PjyejOUSJun@idiAt$20_7Uld|(_A6DMkd^U{6%)0e)%J1Jx> z%oq%sPvq;gh{?0A<#$Xe52MDdM#%@rqb-E=4_BrS{?;re(MH8Ndx_}^R;4V6O?C&mi8Zr-{4N<9xu*$-a6uvHujcVtRSZwn zzz~bRO1lFc%)WFlKBtK-{+3C3xT*EKW@^8cLC&<_X*64mp*d{9=>(V;QBh_MV@>=QJ@}n z1T{*9m@beNL#{1s!r>Q>FkX`4R29&ISQ#h39O7Us=VnMlD z{2(HTNY|GDmetg>*UmtDIw-cXFn#IFXQuio!RH8PbL&T=UNhpIM4sUtTlCtI@*2{9 zqvJ-(koD~mUttJ~>UL+fbdok(Z+1e~m!cF-%ES;Y0N76!^YUV?b|+h0RvfMlfM8)6 zxki7R!=T28wbi%U3>U?P4@Sbc2wC0`Bb1JZfb*XdZ(vJt2le9h_9W)}%WR=jo%6Mt zSEnEN0y)FNV)AmKrCr|v`_^w>;&YmWl#W-CUvQE()UMy~h2*~c*r9cBiL=^+uaGY6l|s=Ox%3gqda{CxkKP#Jyft z0rEH5T!MADsA6;>{S5(w_)ia=H2cMsC8)I&_^pgC_or&kKeLhl({pE~h^>s`Wer6= zXHBS3SUt^BT@2)#^EH)6kS54#L!jSVHB20b^o8xpz~o*& ze8*Y<$eN@w6zG1Pp0LBUv*;lEcz@7^|6*Hii~(A)BU^rOFG!Ea$Kr=thi^DyqWO&> zN(Sk7j87aq9XnX@ju>hxfppA8rau&V*qXvTYmE(*77uW|yU4}npE z;kzs92{&WAiG-T^om#H12B!p$0rfVgo|1_mr6{c-(s8Kp$0Q|h%{72r=n$M8T|6fr0l=%T{I%r2g~(R1}6+Bs!Rpu+m;@) z#w+auX&QS4)tRJPUNXnYi|_$zX<-E~&LQJXf#E0eX4V(>Pp@7UhHmsezuP`w^k($s z8bd?C0k>p=dkyh_g!Y0 zF$;&8f{Z}y?|QxQ4@#rvES{JlZu{#JdFeNdaYL$#Lk4F3$I5{O#>$89!0=b`I)=Py zD}A_N0KqTq;0_?tGxPO2T4%@^7L}JF^WJg}jh<*(m3xK+hbYsR1v7S3!|uBe5=5(L zXzwz2@|o$vE?_lh!9V;=&d9ndZPm!yNM^?iI)8iOl1^6;JWke-FA<)O+Z5tY2H*ak zOi9+2ttmyZVoTCBl_2U9^VcZjZ*+!r4O(;a6eU|!D+!e;uJ1I4g^yQ8bHgMYdeHR7 zU11@9Oa;v5K_3`**hW{;` zPr;1X0jDFQnMu_flLlShF;M`kDQ>Vo_J;(OY?F^EA2P1ktT*7*DR#(Svj~0j@>jD0 z<&}R7FhRvZ5l&U^6X%zrAnK2yH%Xq=;S)}*W?jDIIgD}V|H5_@V0d;trm&3;XlYm5 zh9a(}tgX*|!z@P13nnZPG{vWP zFU)KZ!3*#vTVrrtC6)~Cb%ooT;Ff3IhXX@9E)MkWCI9W+`_JB2=ufYNUlGm!_H=5I}h8RH2Rpm#w6B>VaH}~ zp5_;e>x=C^aKO)DG&mY;HMZ@MO*75m`+&VOhMI?{8oEzeh-WD;;rsR+qBWdXd=DHQU$_uq{-yk;c3OmrlUcgt~C@Skf+OE64{sd zY}@O(exbU3V^5y0fWIjQ|5-n&Kds+CC!_yM%2vQd6K%|1kx!{;+}E)_Sm0$YYygB1 z5yXYvEWA;lbHbrDL*tJkUPx&IbI=rRsl|Y6fi_k`aC~=QFo}J~W5>(u@$m|*6~kWM zk&wbbtlbuckc4=*(;x#YD(cLp8ax{#2Ba>%!HVa&an|m*HP3 zmyGwyahPEWXed4R)XIkp_cYxM$Zinr`b^N`_|9Pd#0AcU&I>{+T*Pr<{vFKQz{3(! zthQqELXFImZ_S9`$Gry6k_`PGwF4ycD;qF#SQ^X{aI_5Jcuk5;+H&vB$?L-K`fH7G z4x!27)ZMGohOA2H9e-+lmFlC1R_AB6rug6kF5&GVK0w~f7gLt63#|@Zeql!aE-Lx6 z!}u4Go-cb?*YB!AyGQFO!{fnGL)@=~vlSZKbuqN*VGF<~R;>#~YIus?2ka6HFEBJV ztwXr5O)0V+gTs!ooetpaho2TkxoKQl4LvA|imR!Vz3S(``sqm8Appkrc7%S)ylBT0 zos?N`3sVFsA&}X1k7^gZWq|A3S=VS(9d)8L^)MAjvPjC#`A!KFVEVKw{DfJ@YHH<7 zKa+7}%JAT&eZ?3y2hlxQJyV*<zzZu}>n?osn=@I)i$Ncy35okOO3X&l_j?dIsRKHn)30ci@qbJ{Q3;7Id?sTd^@j+^0 zHqX*U(z&*bcL2240Wa=eV9c`A9KTaV@%5QJfDUyPZFJK{Tz%EFSS`_sXNt* z#ee+10rU=v&43~*m;(n;zR@&Vrx@__0^H>_*-?c@cH32n(d7?d#=hwn?|S@#tOF$F zEbB_-;yXNaOcyI|GKVO<*FxP2B^R`J&w`kEZC@WbOz-%@$FWA^X656gO}|H%mq z`?cy%nYdLi(s24n_$K4#A8EKgT9q4=1s#jDR_3y`nl@5*qr6nbJz?A_O+1GLUqwl^ zg=`+IG|;M?3hX{R8MR1IzCID-j)=k|J}+!Tk)qk~0jrVgX4$?dU~|oMqBx}>tMCoz zRINp!N)%mto={gBn&}vUF3-B(UY-JfTG^-R=Kt{YJ=>W@;CI_Zq(c!w4;d**rymwl z#F9c*9cVl)+5Vg;dp6Q(v42?qXm!S6b8F0zc6D&~fZPfmPHmacDo3LS$BA}DeaN(# zGCw2#iBOaGh-vdsHxq-B`{?W4tV66TQn+NgIbCG?5eO07Y`gtA3ZA0Mpcb=VYelu& zSr~)TzQ%3bfh2(r6ixxuBX|BKwHi=#E1U*H=ecG6Lu&OdE47F%X_IpU=o3$+$;ePf z{`8>E^IbC+*ETbbd6HQb9`vG%Vv>zE_1@a*u0>|uWQ=1pPzCfvIlF557al>JO-;u{ zF#-}UjXX6LcVvZ#U2{{E4|*8vFK+ul!)XeCaQ)ieXzH^xihe7YyL`Lb=4P6oiB3Ek6GcLZ35?ia+nTNK zP0e04xgXJ|R4n$E(QyM>$UpfM0E|!9pM8^}gIO2JY zi=2#4d6ot8a<2MIOPQ?&1nz!aky<-+8B=+7YVFV+-h8%6^)nBy!dX*6iPSgz-Tb3j-pCy`*c zq6|mNYv`_&x}#Vgh9$Y53oB;*CVK{e4S)N1NT`h^azu#*1XX^;ud%kNZ|yd0Ajp#J zy?TV%?h**_XtR&(m3wvs&dapWdAM5Ca zyj=&-if7?Sl(#K;(Iuq(xzN5P<}_#|a=dV4a}@dzO1mbtGQKg+;Iby3V9!~_MTz(= z{)}*TUpP5zQOxE^)# zO*U+jH;(^}UZaOaem~~}4B~JRQJLW?+yccRvQQX7W2n5f5+C<6=0(=;FO-3j z{jLL59oAIvx3v~dSLO0qln^R%1|VfVIPf)+Srd)H4Ei?-us7v}YX%Sp-WJ}#?v{4* zo)VMz4+aD1IJw`Wd4AIsL2>oUsa%7Ow7ne^kv5l%#1aOzLJhn z?^&TB`W(b5WNQB-M)6SjR z#a_kH{=yvwTPLQ{e}m@}Hd=B*FqMe0NBD5~LLil3^G*fq^<^BH0QJphQE@y~B*SE` zD($WmFnig(*u19bfrt14H1F_|bGee=O}i)~vY4 za`*uu`GdAETg-C1_l%}O4pSKdGfW@xS)};*BvQc4M1w>Mk7%+munIT0xnCj$H{%9& z%KxuO@y8wb(}3<*|IP9j94uEsQ}WdlmT^eAveB{hOJ*R9ITZD)?EHXs4PRz|JP?*K z%1PDu3CkEGH~MB*RM@0CGr^+_^T)8$u+{MMS~X(JT)C>USbo3&CP}%z-cUP-;F**= z2bW3E$?+5>Qq77IfL+vmzj?)q{G1$%)+{8PEcu0j+bW4!6(i{Vj$lM1-A6Q3hJL#^-BiOEli43M%Brp=CS0bc7qfP@ z634hWjFOFSo}d%V_fQhvHs|!2rJkx0tu*S(45ez`(D{hWz}QIo@H~DEgD5sKu1Eq< zB$0H__af9(uca3TU=ze0hJa6aD$tL?=s(u{@=b4ci0gVq45W~QLB>4>tQyW8BTQWg zcuvbNyMu18;FCM0_P0IUAKM-N>fu1PGHL#QI?JATeF&arUoB>Cr*0p>eIbw9G9jN9 zc2Gi1NeX{Y%ri@A_(suJGn%ngp!@6BY5|W+dF(YFQ%q9A-~h;W)C9)X)$Hf%r;JWf zR8OGhvZmY77Vl@}J12?RzZ*i}>3A;`d8#CcK&@;Dgb6TJ`<_aC8#j z%O?Z^0C*}Q!`ZQs(jeBoo0@pP*#D#d=5$Xy@Dj7FD;Bm6&yiRdtQ)TSJ*v(rx~%hp zzzUO$?W02hl%@&U?2gRUf z=ngtUZ+38MwfzPXwJv*~x;TAAF3Al1TbA;mU#N!ic2=)Pd3}Ojq`;?!D4ZGO14sT6`la6wwk3F@Ugz2*Yw-{CW9aW5U;Ttg=9}yU z{Z2E2KyU=@u>ByF%3;`Jhch85qow)b1-(BR#C+tGon{9v7_{Mpsjw{hmg5D`T?hHr zPPOM_I6rQDxH}dQu-H=ugv7#Q%!!XTG2WTRV1!Na_yppYOH4~-=BW0^I0?8hCK`%u zx~XDD*XW=CXkf>YKULfF=c6~ShJ3F$v2}@~!b~?XVw{ashIn8vRe}l^au`1Muh7yi zhT)ipm8oA<8*b>J(TOYa)j3bK3RDGCRZD?iar9S~e~hPwF;cD_Fye2-v6#c_J2pV- zsoHQqs8CWwvFCBY>b(^n2tNrdO3>Hjky2f`HvHhMQs>XHR%fRihT4*c!$8$xzZW~B zI}3)4%O)$LslwuqMe=Qbc}MOJd=rBz9tSOnS54I$~7w zHB9R{Lt058CVvkBfYonoEW1mgqO)6Stj;I{aO*e1HyPYnzyu=v(LX^>V!Fxby1jD2 znu!;*y6DWGdW%S{U|<)+17x{n!k`TR6IAdu#A4Fm++&vF%x)^Td1D#q58*gwJ__H+ zk7Q%#LsEI{|EUhiN2{wEV-@+vzuDp;33wvbI4^j{gyj;|Z(4OI@H52m)dS{6e)(R| z7?(NMb>L~FB9Q3i3HgXtbiJnXLZCl$y7!Pt!L`!vgjR2(=elNsQ)rqmV-stjRnk;USFlB zr{0;aENAGvOw}a=u}G~uo1POg(Gb!-#RYoHPZo>%Wm>JD7-gA8yZA8t@A&0 zCgHRB!n0x9@^c@B8>yP^i)KebRc%(ii(USBy4EIDBN1s)pSAs&a3d$+=Hc{X7$(0l z9&+kqWW+%)?0by_ZJphuicxA?Cp-}AWUiu2+V%$j9rF915~P3}LApe`W;8Kf)x$c~ zefp_vnhvEV^YbrjUJI7*yf)8ytAn(t6Y-x|Cz$Ew>c~?7nNT|1IPtw>@Zdn`Xylx9 zKs?{@?2o&b?&SLTpSEK&PQ&PA*mDcCy2oQBLzg*VdVgiBH)okwo}{Gi-#%r3>>v1N zaX|#>f2T+PVwjp)i1wUL-Fo?~3VfsAmB@#2E+bN6jq@Fl!g@F18kL0jFW!4MWl2sx zG|q8T{WZz;W^*%l(~H@jJfA`zS7dPNL;^KtJ>9<65FcgVvnYU}y@1@}+z~?TVHp*a zu?8c8YQYJV(-4lVC}nXZQ)x%+;Jsd1?BYOTYn|buH48j+(I*0g{wp;cSWnyK_2v$W zmaS0WemI97)^{EgyLIS&`)zxEVpN{q5;^AMyJoT2&8nrCsDTeQ?!B61^b2~0b*BA? z^93XR+zH(Dz8(11YlZl42`@1t3bxHZ5T492HlRzyL?}`Ea?*(0Ulvv_*3yRu1Ev|( zSV4H3E4n45)W;Aq=^RmPYBW~^NKRfeUdy8ttjoh|i)<9LTdtcQvP=4~M%;mOL~a%g z?~>;^yAo?Ynjc|qZes?dybJ-0g}`v1Tzf_O&bR}BlkJPFHebObK_4*3WkTBnV|@0W zdrPgGnRNMCej;^Yns2=7x#PLL=E`gQms>MY zu&+HY45h}>u-r;-rX7#JhBPj8|MlLPdJ4e?gciTt_Z+0_(=y@<;)5R$6s|8#yi&}P zI$`ONFO5L(`OX|d6rTwt3DX%9J#v88(Wzdb;^QDDoMVKuui7cJiQXnG$Esy3IPRV< z^*4bDTTmWNOi~6rS^Ql|>ag93>gFsJK%Se?uT zf>PnGzoyzgC;60UC1PT^Eac>eyzy!0t%An~!F{uk3zQ^uzg%7HlzXmKC~zEusnk^V zl^^Y)im7vOMI&{cyGOckH*`k*`m3-;_Ii#s_Wy7M zE`c0@2tSLDHrEHDI0)gae!!T0{1juKD{WR_mI;k-r~j&xPyq|t%u{>IiMfy2S$K^t!-*2?R%Dc+y2*n)FuJqp+S z!(UV5;;&aS-`XjdWl$Z#z9nV$C|HYy$BnOO8IS6o;gH$DerwM$ys8Novwv6=uAMqT zpR1S5-$H{Wydx@)LI`%3o^>9&!M;W!IF6&GFD89w)b^df?X=UQNdw6~D&hV79@P&P zmxMaUSX`UDc1@X9-NE4Qw`LSCajit z{v~B9R?X(HUr8T0Wz@x}OqIS8#fDp@waB3uF^t2f5kIznMX2VoGsa*%4^Z|B)buGk z7>CAIk*Co2aW`s7R=hE_YmT){kB%FI?(j)l$8giE?L>!NZ>2X47vbkstFfFE(CHFG z9LEGNTL1*dQLL+89E_u(<0_{gtH6^fVQ4K^U<@D2MPPiZNVi9r$!Y>X@U-_xq_Wa~ z^n?i4ooxlr)#`i;oUrNf2HW|utW3*}swH--=C?4@)d~=qtagQ~gxHp&x5YfiD#54= zu>b_J#**bj-${ps7-FjN$-ksFuN$U6Z=UznuvC@19JMQ^zzYh~1+SdKp}nS5iQ;OK zplwln(*rHbS*N}^IsxmMOa_I4zM)8=g&cmdavEHoaSGvOGGLt+7e zoAVNEj%WH4x`h}uYm_BXob+QrIGJN~t5-BP3gmq#z>BC+$Mz$2HfpdR#^-mrKrRt2 z0-G%x!|Mpvu_S3LA1Cy*x|T`cj?hzlq=VPRtQ8}f zOI?T>4bzd@+I}(@-};!7XU}oCDPh9~!`(4dWJdN{7~*jT3>me&i7SE2TMYBZ7WyX! zMxC?=nm-xvM9}+IGS^(zT{18peC+Onp}AT~@Wv$1nfvuW-jn6`XZMOM+H~HK(4+O) z;p8cQsr2#)6clTD&f$M;|5EA=y3mz=YlaZ~)0x5(?C8G%DX5130;HrfuZza&GK1oZ z2obqTToUh+_gdA(EPtW@eo8ex(&b&U;W=aq20p2>PWnAb-EdN5%@M zpBGO6k>eplvc{)<++-e_8R;o6;i$qk z3*#q}v@1_c$TP1*2zyH5)DIyMxfqgN#K!*81E}cog`*@F?ov#R4QixAyPxDF3&|L5%-44*J!K?O8Z#=u|f^ zL4op2ZM2I@{?0|@XcQ`xT6sycdBacePp|l|zTmvAbfX!FOx3X9i1NsFi|*{#cG2e- zx8I>wU!*{w!EH))mKpl$&iVTofqjLThEfn6k6B~j_b{oIi7fNbL>N@gA)|G-R?N4U zc621w1fd1@rTWOzNs#q4Azs&;7kChNI3E?MT^z>P(|8j?yiRf$LGHI#Lx2ivD73BZ zduq&X3x!j>MmE5PeMb?iI@AMU=as#5<^{%dR~v|wq7|29X7%sBB7%eFLDx_7APusI z@THS79%8n8V;ogK>s>|F7`S}p3W@NM6Y4oD*vo8zwdxBn@R+Us4RSvUDN*C4R*2_$ zQ0mV@Bf404nsPo5qNJ6ZV@^_LUL_PFCzQulXiYJ*HQ|5EgM>+{A*qkU_^^mOu>?B< z#Q;%_GkX~0^CJ7;=}{p6*8D(Y0thp2FxWn8%)r_Wng@YbCVD-O=ur)C8QnnD|NT7Z zkAJP6$VUI|;8(G-Sx^F58l$IzcdFkmb(3QoYO;>!eC_F$%*q|jIT91Ehz^Z673i=# z=28t#o0FL&IDP5=k&fUs5>kt<&dYKL`Oeh|5-*hX_ndG?3jHiuy;n^;TkJbr*Xi!( zJ31}*5UZ|@R2yuxJ+=Tku@Ca?lJbqz#J-q>Zo=(f89&!iYgft-c74a%HfjuKC86%c z5D}58Ktg*<-S^?u0ONXM)b~7p9KlX2`!qeGmaOV(X=N7<=@FFxIT|CnV)O9nRXmq| zl0+knWG0%46cZ>ivYB3Xiy5{KvE`}{dyF{R z`Pe+isMZYR>;vmEH6``5WLx&yHcC#)Ed>^ZM;PW)*6MDeGw(}>r{J^}M(gJt4{Ovn z!uOrAVp9!n3uF#`bES-|F=Lg($Bop)Z?_6)XEek2oP2M4+w$g$yO$~P>1jT_q%%_) zvK|cijOwS^EIMaG`v5g6l(_-Mkjh04$Ze@AIL|YgM~kv2$`63q2;V;CAuSkwONRdf z3vh&lNBkH89`7{7ILX7cCt#eSJ;M~MrT7Eka4zsw+<^1I*i8k63af+#JxwDDSAZS3 z?E34Dq@T;m0QBqbes!y2>uCtVD+gmW@_FdmDa-lr9*f|IIhn<(wAaFt%q}_5#JZ6L zdBX8jFvA<{z*BD>7;qax*@ZM)5)>2^JLUF5-&%QnHf}Yok|r`p#J8oHp`cCScV#We z3kmTW@g^)EbP85+i^SDT)b4qceY4Kg=xIiZzG4n-`7vKR=Nyf0OB~N@8QE6>S~T_1 zRxTKEWtp$DHZMaXhj0^nN=O)+Ne?Vk+y#KdUvs}&)OY2Mhph|fiQ}+Cq=39#@K7&0TpyEQ1N<+|6011hr zX5>boxBnSa_~yg{Mv0UYLq)(CCkBl*v37k~Ksjyr@;AR=@59&Dx{3%airgs|*RkWS zgZk;TvqaXJ5-XXVMp!TL;$}(5Sr~wC@{8W|-4f^jNc7+#E|uL4e~cYY9_hP-E!vQ5 z{{fV1_6;x9+tAF2cLhYH`7-AP5d?Ij(@WbaaY>E{6Y-yzb?Gl1kJZZLfX^d5q##V{ z5czhk%P*|M+;sl}`3#EFy+!~nezS!79jD}v1?{H>;@6J@1N&c_!E)sXWIE^(aK2=@ z%9�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

#$P^zb&?W1!9obJWSUt> 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

cwmD;YaFPUJpx-x4 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

xJ~)geoV-Kq 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 literal 0 HcmV?d00001 diff --git a/ruoyi-modules/ruoyi-settlement/libs/cryptokit.jni-1.0.jar b/ruoyi-modules/ruoyi-settlement/libs/cryptokit.jni-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0a528a7d89c60aec5b1e625f356b941199b69a80 GIT binary patch literal 4623 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 Ir;hIa1wCG-D*ylh literal 0 HcmV?d00001 diff --git a/ruoyi-modules/ruoyi-settlement/libs/logback-cfca-jdk1.6-3.1.0.0.jar b/ruoyi-modules/ruoyi-settlement/libs/logback-cfca-jdk1.6-3.1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..e5da926a7c86287482e8c0efa41ae92acded04ff GIT binary patch literal 898088 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­X@i00pNP=Jn8juo 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%0Di02y?sq#A!Ykg4WM9yRS_sQ-|HBMbzskZFN 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%0D-rQ{31 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

Sn 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

W1dKgtVNpO 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

UL>ky~(}(AjUP?cAyH5lGD9FYyU#GC zCwwm{vn^T(1g00nQmPL9jHP%w#wJbJvT}ChI@lafp|0i(GG-g1$T$|7$BLUv9-7uM z<}(=}r=hIwNx|Wm!xzUmvFODBp=anInej~KJsQxknL`?ZRxbQr7_mg(Ym6)^NjnCf zIwar5&0|57t)Vz|8ACmM&I05$K0Z>CBq0{Pkq2D}b$*%4pCKS+#~GJjqONuH>I<}B z!H*k88Cb&PlzVjDt5pfRaF{=mkHcq0`L4o#+@wW?#f>EwvhUrjisdOf8PfMty8wv^ zp}`ryiiRbtc1H*QZ=RlLi_lS0~1 zyK5~y;&VB$VYrp5g$9c@iVIpK1+YA zeJei)2S(I^h2y~OiZ??Jn|`qtu;ug#wKI5>gW9;-4aDQJuY-M!hcx(4ddV)oM@;~O zG-=ZjIf7@=0w%A5!j>&o$yDz#W4Qky{z@8#cX5TE$xQ9giKv0X#+b{mPQ zpVV;Jb;4OM&7kXWkSGKqYK!?~n-xO&^jldh?=|yD#*_$eoO|@`H+(Jv%8>OOZu6VI zUZo->$JsOY<0n|3Agn}fcyl?xXp6%QEr~XP9;o~26PbYc3(&~;x)F@{ls^y^c04PL z=61;@;RyU<#t|kLaGWq62w9MiT|{{0LZ9*XmU^5uKbb7f{I=DQxKoWhI9d4B#9Oo5 ztu|qi6&+o_@<(#=qytI%7rHEHUxL-^SDB1Vf+Ym8=42r~CYnN5R%IV;yFl zhNl;Vq6zp-a%`z1@Hr}Q_N!wN?RD;v3lH2^VE3eM&?mCz5tYy7(FE6R#%$|5Ra-RH#m;*?Mrz>67={_p093 z(vB#tUDsvFMJJm56krK!D?8dDapiiJ=%^Hxn%0&#&+jSL(eN<&D)72Yw87`-kfr?ngE_IJ|AUn!X&2``1|6rb^zitT{bWKWg%S1bYzr+12Hc!q+JT!Q zPNi~R`R>QEbJ^JE&LNIpYKO)Iuj(-4m287y0^3PkF>1YGd3wX(9aU&|(5A%`dpX}G z9)9=WCv&%w&E$-nJ9oY^>AqlXcV>`Z+~?mb8fxXGn%&NNbsDpFF_k^U#7oR5=k_kC zXbX{v)*$pXpR9b)ytE0#B%IoSiAmbra_)Tb`qoxrS=dQANtH?tv2up20yzc4jf+SG z>|Nh}I9P*;4k$6Y8SyqPndNO0bGm}WIT%IFI`3*U4dPIBm?eIFE8pz0*-+WacuJKQ zEfx6`mopk8Q10PyNYopkm{AieQorb~ibNBGl^A_fEY?iIeAx?ip)9bPd2)*}X3uCU zg1Sxt(|Vw|L1pf3o1*8mrp$Ph*Sd@|m4&fkF19v=gq1PvnK^w&jNg3-F{_Ufhn@Mh zdCF)V3gNgw`pLA(2;;=;@GNNNY@K4zW>&m`?m{o}OgW;ND4XeGz)W9{y4Olh*zCed zmhnPiE;7p=?hlumO?kZ77TfbIcB=bUhG%t|yb5V0X;RfU!HPXZfp~w9?`HPYx)@x~ zEpR-mvP&Ic`*_-8Etd|_sp1v)mUP}=DT|Uyrh+l(VKz2$hP(ODm51i=f(za>)&xT* za2#tf^*@1$& zsq67JBUE!v=L2-S<%td2x={ZX$9;zC>GEBOu}dM!O}ATBc*x87)m3)AKZ>}5x>Ls7 z-9Pp8zZqs$bhkcJ_rFXNAvIV7GLrAM?`@8xx(>+tZ z)rR4<3-iZLq%r9FZ)eP0FR5qwUpvKVN3g$bOXJ+8IW*^T?StY{I}@iW%JnFRYxW-* z*f%NEM}JZ4_G9H2s5kCY^{FjLMsU_o{ibNIqE3ibuL9pN74f^=> zp+JG-63XHt(Rq4JCvV`CA+s+Ra%{c5gD*Hv(Qx0kxNn@(7KZY6y@fk;{J4JI``WE$ z{J=TQE+P)1cX zk7$r$Vp1~clBYOILdEG690k1|Gx%|~dG$AhaeBSsaa9hH9MT{Z>1H77f+#(Qb(AkC zJ3NE8bI-ObFHUh9TT6eHG~+TjwJ>8B*Ll_gO{WnUPH7)!J_>X@?dVo?A&8~v#QOn+ zr!fbOGxS2DSyS2KE?bN`_8GM4gbJv?5_Uu4WITkUQa!YR>Xxiw+c*7i_2eFFcZ}&< zJ=$PEM_kd_wLqi+%jc;1wVeH~_7W~-*V(624+Y^5_@&$d*06QA7F!tq)rtcSv#Tc2 zm?Y1DwDM#=1@_oNQ2St5dvhyq$iQw?R}W0p?J7B+OAR6SpSXvCcEg-U$~h~oFq>p} zu;gr8x?qO;FYHeouQti`krBT9=F&>0NSH-aCu|y(7@mkzJ1_KDpTx-qJ_TTj%)&tg0n`M6@+`m}~sd61louYjtZ0)PG$cyY}XhWZawX|h(ZHCE? zbm(;E;`jw1ybvX=;AcG&4{e6Q;&m{_x#v11DbbI5!VY(!InnMn(d?nv2iHesvv5-3 za#6KOEDL2e3)?P2Bo_P_UD+ZKFh$Tm{` z3rHNh3xC+u!{z1)P;L*cuRW^X4VDLibuq-5>o5BAn16x^k`rJSznAur-s_Fw`GBb7 z7<|ob(rg_%wMU{1nkDwRV}Q`S{J?&Tn{SF}|B!L2i=BMM_uX!$zg658>A7f@C0wC2 zow`3u=OYUoIcnAWkOVDnR_BLRJbW#?0n^Q;EMrvadWAlTDq0LKGv~1^c*#6U{6;`3 zt%w=#B1y0p%Qr#+K-K`SS6B+keytR4a-d3FEDX{nmz;&TGF&06**@dT-$sY;*1Y)j zonfq%4f2V6zV}Ze|7owHN-CREQVj*EjGKqGud0Y(1kDfmDqAYj)bp!_l~}WZo6!|- zrBv%EOZSZD18O6WjGIX&mmEOo4PC^Ysnxw+Aa3RjR3;ikz7DN=vqKN*+5~+GF1yyG zaTQgtcD)q8LhlB9$re$IaKw6dc@*eX_vO__<84;*_0F(@-}>gaT=k26TXnQl$Rr$uCdpkG6A<* zqdf7K`v%_YCXF4^CGbJol%*`4iET-vQLCQn0@a->$;_U1c?>>$54fVyRv-j1_zP3GpB;){4cOF zPvoR~nqMg5?U@(r`cKY5)kcd^qs^Sb>ip2P_e2?Og1XQ`4w>m>{TK%K#ma{iEH+2%Vw{tP|aFMfg zb}_a4PX#MRN#0t787XV&#h}UW?u>CdDo{j`Ae3M)FmGDap1E?$Lh4MG=G~Uy4dh*U z@K3+2@Bsf=yr~;SL%07hYJldQGaJ~(oepg|=gl~zrEi;x7iE(=F&2IQ#z4LdC$f4pTMs?&1EO)P2E@ z(W63xDt7RCvYkgz{Yx00_-wnSEHJZ23k5spM1%9c1}~Q~a~*Y+e62YCS&8PLSqSAB zJ~0$5MHPDF(0rPH}#+Hp7}kQ|7v`>@`iTyqM(r#X#G*M6os zCiOZP#r^86enS@=l;az~u$}87fX>BG{bYh-(j2UO)LK(Sqmj_up_W59UxB6f1%CEL>pAqiyfo&t+oSxNu7xl5xXf==3|gy@ z;8e{&n4p(puvv-x>!k2NIp;yfqil{KXJ8HCI#~hd!8pfDAZ@(6h$SWDfEAR+qFUz_ zxWF?Cw&-D}f$=zPR6f|QAY_W@2l}r|4k8_YCi#onl!*E7*_!`Ya$nX}dv}15jj588 zy@#i|i>1v!wdP_iYc;(E?Da6uHEbu+5EBnFGNoK5RHEK+WE2z;3Z4`sFwjJ)QPbA= zUVs@(99YxBuRGHw`>F^_wndC8OZiHad6~_+rc3v~CnuL5CvnvaKNwOjoDW!7K}1Ae z%rADcZqMJ(FC8bd-35J|A%yrps)-fz1i0|nPJ+TtW5rNiw~t2hkULu#usBd6lxi7} zVHaEpVbs1o++d{w!#VhL}`%?6Ekm08$o}7JG+zI0|qX-uISEd+TGotIhS3 z%Oiv{YeJ~T%ZCTdPoj-u;L=4W+1xiu5kff>^vq1{Xh|X9t{|@#!wP7Z!4SWXm{BY zP;uLtJmd@J9pY!3u0~44FceVTmDC#HqyS?kbQnbFXia)&UsYX=jtQwbrx>-zy+Sl= z_GIWvgMqwQSE|ylLAQEZY29^4QmI_pieHEaTjpVJ0OyHlvdo)0kQ5vmFsrm-sbNWn zsvcm}H~I=I5m`RFHOgr+Y`w|59SkXjEiZh|Es2s<2P&3igqz>ni$_aZZ1t3O(dp4g zfxn7~|mLWl=>GFAfkxXS$=WQip=&AclqY{sd(zG(p0`+6xAR~`-k zD=kf3@>7dGJ1~IOXtpN*0^y6Z`A1{1sLAW1E5Lk)he%-}993hdbuOyC{avoIcmY)_ z1vhrlf~GI0QAK{udO&T|dg&LSL#ThjGCt0BiCA|+L0eLGSf!a#A0BjTDy1c#%; z(kL!=)e$li6B2CkM+uH#BnP}ZOSP=rTpi}QP1Hd`GP2o+x6^3xs=B%Yh0mW1DepF7BsUVml}z`8*$-4QLO$wCkr4fVvh`2l*X`&XPnmQ^0- z0)s03(<|+)){Kv^i;KurP)fN1wEh6fu6GN=ToWl>-}2 z@HWY0l+lIpU+|_G2g<3@tsAYY;l8p%>TKq zzrH#CD+UHDziC|}@x1f(GoWq$xIprPsnmrp>Tqem6m&%VHUPJp2p6N;c$7a5lg;NA zCiV?h^YjVh_n)gUln+PIoO{nJfvvu%&T^ltJlIV@%P&4E;>n|@>a!^DMEG4= z(qV%cM~&Eh=gMJ|saOdMXQnD0uWl3A6|Z|rG+ibR7xKer@jU?X!5uL+q-e=1E>BLc zw91BUz0*-7H(8XL`pGJf*;PNcrt?&;8YPkDr`9l2b0UZBj<+hdeRqFBfo49_&`CY!Nesyw{BiYN%Zi?=oePT)- z`BYI#X~@2KbpnJOT-;I3I^Vj7*hG_Axy3odWi&MXGeljPJLC%QRx|v;V|TMC*Z<06 zHAUS#`vfsqoG4pE-hB$?z%RcM;-q$6trKV`jeBr-_a~rzHAojN0e8B`9izi$ZZSH{8k7wPb#Y6fU z!MKC!2tMVDOm6;H`^{y~WKNU<;5Sz^N7RL-2_~DMG?&O^(J=uXDVVG}f)1|WVRK+n z%8_T}2F%hLA<>V1J7uAux1D;Zk1$lS@J)9R9BCdK^G?=>{Bwa1wpE<7q}Et4T>Rhn z_cgtnM|94~+@(ldvFxaB%n6*lfJ}OSh?SS5hR>^|DU+X^G`lS*RE(6b(U+u;bw^w<$v67bTb$)tb3w-{cxQ`h6+Ou>d6G53;rjK*Xv;-QRa(HBj#L86 zwj^1mcHm~^Co=6exKkc^@EER%zZ`1lI4Ns!1mo`v)nmI&d-Qh?RZiP{FDpKM7uiGn z6V;;TtmU3DiJpw1Ym!0k)QN+~#aKb*WQ)wv$T*W}lFMuXWkdm)h2PmPd;BI(Y0V7? z9)3r9mpT;vrOj1gw-0FAuwZQXAtayPRWrjrm$!_Ql|)7F?3snOse7l?_O6s3TuG7D zw|i$%YW}%T@70ZR-jgyKV(#u?FgMlt&$A2&>D zL1~grm3CH*L1^6!XFM z)@g@sAfph}a};|6+it6e6b3>Zs0Le~SOSZ;iD%^DhCX-Y&`bHuk*zcnGP+SIEhFirGP+3hyIkJH!JW$ePlY~C z)OTF(PO7kjl)Ov*a2%S4+V z>M_@3SEuN8)2x^+5RKhn?wj)g?x+ui&dAH8^i1|g9D|m)=LR5d?{Bj&8FrOcBmw(j7HeZ4={rORrI zHov{zxxoEMhKo{}%c)1_D2A)*8)tr=F}>q%_UOKeZ0|$zMJ?OH$4aZsd*I#2C|vST z1hq_X#}NKOKMN7{z+-16c%438_V+p~RZ7TFyF-ojI#Yepp5g6mFq>i=qlA7&svK3nJaNUNHb=s3Ue zrvtW!Yc9Xw4`@~0$+ZZdd=m3HAtIe_7&o`44^vid4OY$5-cyq|r{yMkK3wUcVXF0z zCHyb}?-XlHOJ6W|QYm9o1u0Iw!_m|*r->)%j3dF0|6zIsS-D63P@d{0T=40IeCKlB z-PdHUEVapZ$AEjc1Lss1YO|nC+_2{XQ8@>ydrH1y5AOUVHADE+Un*E$y79csKBy;{ z`@NCld*dP~%2S2TZOeZL%KRg$&SxLn=GRv{it^Q#{yU2Ne{Zh-Pg^SN4siO9$V=a; zFRBa^QqQ&Qd-&quAI(}>#CD#DEj0(EwK>wE#c2x^!JI$6kXQKw^P>e^d#&3~*HgQm z9p8l@ND+{OqnpY8KgQlEy3%f27p~Y9+qP}nX2rIRifzu=PAax-+cqoq$+ypHXRZC; z{Oe-2dHuFFM(?9P{Xv|oJIl{T#o%1t1hlE-peqGK+oS|n155fpzP^ZRjwehQ>U%T_ zky^Xur6e9deZWWMCpBJ*`QiyUPPI7#ozuU@Eq+ZWzy-S7$fX?AEdXVDmlVsIoEXkP z{Xzen6ygpQtnX!*fZY2JI_^K;PXN!EJM=wVqJjPR!Sr8@<^L1QD(GnT?>Bz3vg|jX z1cmnxzKphj6pTix#K(_y3jX&J~e$;A9fqVTqKIeZg)E@d;_`05YTS8R<1R59YS zq2OB$=B zX=b>|bAZ-m+PdNTB@b$G5y4O#-(0NAs@Tt*3k zs3Ww448sJAOa}jzoA$=$yf&KI2n&vI^P|gh(h~s&a%k~z&FnM2tg6z0d{70p;q{D* zZfxnoUgVH!*5aJT39z;*!+0FrODJJpdzQ`eA_OSpu8~9ng<^d$cU+3lk9k?aJ+}v4 zeFvo$)8_GYZn;>ch&(D`L+BI?HM)M6@jcv4BFA1Ua`0=Y`C835q0uT==14Q=2-)a~~kw&Z;g|k;G(r=U-eYjxFU+ErBJ5XC$ zeZMLb{BlNbCQAqXT$Y7}TwX+!>fk%pZS6Ds7crB*dB4(*Yq(vwrA6qB#}9CUUR#3O z<$gD(mw7Uo<&%R8|$Q0cgS%GgZ)6Z3%~?}Miz@Bp=7TdYeN zu|;N*t$D%#lqzIjhGf^LcD&V9N6V&9+jP|6n?_5 zv`B}4B;Z%$7!-5d!qfa|64HpT&PNEuqgc2PKD1zn`6A3LrWL9^H#tHl^1-EIx@2pbry->i7Hs!vbdw z`R>a)HJVa{lVI#1a>x7Bugxk2t z=ISu_l;FO}Dd8v8fjh;7p==ydaOaR@=FjYQ#8jiF!y6g|&cKhhbC=Gpr-3KA99|QB zJcle1Q_j?v-{SKEZ^D5M$l0A7T!7Oyo}U;K!id346Zp*LZxA5horxV#<@zlKc@fb4 zb@*es+|i+eYsdXzEH39Y z^`8Y?%FiA2SF*RKDjyL0@?AGBNf(zvW`}~=f68uC-J8!mSlo}1j%kPm$K}O^YdMrO zEG>A3yV3}Gv7i^|yh6X#bG6BQMdUBn=3^i@R+G?84%)u-vM>CRUP>BB$L*2r%WYHL zNRKS414-A@Po=9->;Aw!ALc^+0=?5H0I=P|Bt1x9Diyhnn1m{!v$Cl`Xb;%-lP&eq zshTUy9H}mV`;aws`QvVqgnC7EfBkv7>`iYwS zzs`-im%H*I=2sSp&Dy&(2@+D z4QDxa_RWwfN-7oh%of4JJ(tw{sYw{!84ti+({L;A`o?EkY~sh(HHk%n7^O${fmiqV zoA348+m?3rtMfMT57T{KdL1lNFm*6EznbN4GPEag!#rDJ_cDGA#=Tqn8T@PbH;`Hd z3LH4rD%Jv5vkY`RxP3KjD>%P_u#k6~&5Fs~OVPY<#vVx-r*aayDAo|Q;BH#?W<#GC ziFfNPE+Zv>b#YcPD*SN%cm_7Bxio8(MVRP*lOSu9L?4aD?W}5Wj`s<-xUlH?UjcoS zk2=zE?Q|_}37U%TFq+A${&(}zvHH$B${7-7xI=#ft2LX**GXz20C>)(6+leBVpcrb zyMf$TYpQSopn$!uBQC>|iG%?cfk|`6f+8}}Xe!cwn=_6bC(Lts$-M7COtMoMq3IK1 zlfg?{R>T;BDs_*z;5p8;gdAHfa0R0{pn-+bE`z`~9Z|JkyDGlWMjRa~;N=hQ z<|11HE-zd;eBT?L=)91t#sVomxg?_3Y~jLTtBDsj`z#mOHR|CwYxESdk0pnf3;{bF z&mrJOgmXHpuYw=XPVIQKh;#XikAX{C;rF~tra%3xflx8-$j!;^A}cWvHQ6$Ni%OBM z^3Ej_EMGO-bn@m)xk9`|*%UPFx!y&lM+C83LR?s?KE`=x6hMZ%kBgde!T~Xf6(Isf z?k>mCHz@ZUmgeMw6DUbkEGk~1b6AjO3_0q5=Ztf{Q7!&0&jo3xsp|^AkhV%V5TZ@!xPJz5N6jB*SALP%-ur$6z2D;DFD7a$Y`8S6GSY@q zawD3S(kmZO8IH0AcG*efdh>0$t9JFc5ni`OLP=cP8!212yW}nXk?R&4X43Pus^!`q zv8`hgA{Q_rixfk@R*nWYv0}Ilr50;(izWujLoH&~93ObOt_I~>OJ(+nK3dvZi<&8P`)Lr9-MtZN6rYewuzkHvOXX;8;MLCS2 zo#hSk{*TK$c=urpu5?Nr=71$i<3uEgCY(F;l#jd8uq{ur_C%ulD??C;%R8Q5Zfv?0 zk{HP+W>39iYhO^qnbQvyPU1pKLxCN)KdeNnS42o_G0A})&B@=PcaG5PEq%syRSvEmpX58X$A0)ern64Yx+~`E_9|(s!d!a3td>n zl2+!na#a46am`_o=5WA4F2|-*`#~?Yii9G(R)X|t;wY#URI4L9IqaYt^7p$l6&6`m=kE6KM}toqveMRtk88V)H~bzu*%8-2xNM?Id754U$iW>wtF@+&Y1N zV8TayJ?Z2GX#dMpk2uxe!IJ7>qI`f09VLIlPnKBP0bz?0140bL?4VyW9J2_F*Z6gy7=aeL6qX^#c zOy(ife&89RnPw%6U&eUs^+>DIIePE_tl}LRbP=V#jCD+0@Fq^cButR@@dN=+|9pyJ z;fM)?!z7Yo5+L}T`?|dr!xL?DL~Z5zL-al!XX;u65Pmvj(91}D31PXrAgOon?GyAS zPyKp@{mf_ik}ZJA#lF*>@{{5@G#<(jhh%gN-pEuRfsc_JN$C*sO`95Uv7EBAMeCvs zRFr0FTluoyy{0YX)#+5N_3JTvu-8#!4_iMYDRQpNDZjHc?FW~UY11x;f)+WMm)$@7gN5q-Vf!B{!&Bvcx&B-R0a;B5*X%^R} zP-|i`P0GhW6T`d{{ZCBCw*4T9Ud96~@4|tv?-`x+fWGgWaQfayF$ld^fB0gLM~3 zX-;T5s&XLH7MH(j8MIf~H6Pm2N5d82go#~q*qzgDOP#BKf%4kgkL=$1hNd)C9;E4ahxu|(Qcb+y z%e+5w;sV`o6Ba!8Z#<2TJSDpJi}hMh)1{Bp;mG5mIv}mPbvSw+_o3FlNc8T?qPSW~ zF5_k0HCZ{ZGnaW~>~&=7VWBQ-PD;#Ei?dRBNg=$XhY@Vht6USm^ldg>N6lOy6n3^0 zxx<9Li-gyWm7Xvf(1wM4$U+HK{(^=B##FlW{nMvi9*>J3kH<)ix@TAIWG>mKRN@Ms zgfl~J*Ag;aI7`|?7-j+E#`L<#5YBQKQ&7Y%eQ~3@9RQwPOz;Qr#T;JYZ@-vR&lryv z556nGM-O_01N7C&P7!if8XHFz6#ia<&~z6DYiqnCQ7?KL)R+mTQjoRX3d)| z1LQlp@j)+Z&8=aVXPCqz2$^_46AkYX(7){9TiXu&pS^J}iJCt6cC~2u__iNpfAUfXs{yjha1F769 zu@caJ&rajt`+A=L@+JKLm=6B~DG3=k{R>vgQXc=mdiz3$bO>4tY^iy0@*-0B#gsY$ z3DIOJFeIguVpWn9WM&t*7+h@}x>Vc&Ny|Wrxfg79ZOwZr_^>L>X`6nR36R41w#VwYtk9nv~kUII_n0 zsUedjX?HNukTK=YfO9rCnU6dhn8fwB?A2>%@)keSFkSst zIcRLy(D{9(U&DOrt%P}9ST2_pSK(NhPeGREO=uog$iNnryCFOp$p%GhSnLic?kPqg zgesresKQqixo5;%kuiR=9nS9Di)*liQ-KEDk-%fluHv@a%mX0OROlt-xuaW(WNMk& zoUf-yEc4Mt4%u7I>6nvF4?uHv7Kp+rL&h39VlhJ(2*0T{asiLOD-bZ*b4)<^k34Vtc3K=$rcgQvyVQRQKxK#{&?cftI^1YtHNwCa{ zNAdTV`GtF$YFi5!=1RIv0XUDnw_lDfe7_z}VSYo&ScNe}X~xppYE>K|FSFY;>l`e# zS*&h66`8zd%uTc&*4kGXb%kPriM%cGD6 zyWhHhyCJWYZ5YPs9k_$s%C+jfBUvJ2b}2cAqAL*e?r}<;PnzG@H^XAHIv3w-6Jk#F zE0@X1R`TRTs5yigw(7ys33{tX^Pa&uIf$NDF@2Lh1KwTXwx5W4QlG<&Ack#hT2h=w zl`W#rOJR{b-ibCLG*RMUnN6EwTdRAR-O6|0IeJ0nY}@yfdJ4#(cn%C#5fW9T&_(%mCy@Jakdq{4HFybMF>2}m< zB)7u0y{Ud!aaHiwvQ>%?Yy@F=7MA!;89RGWE?E={0au-0M6{chLnE<@D!`X0tAbmw zRcFg7`rIcQ0cc)<8uuWc+q0%9$ERh=oN=hbqB@X~fiwu_18I5afkQ>zYL}$AVivel z7kf%%?a>Eb_qK$Lb%A-jnXggt;_Vn8>589h6I^2Gsvrp>wsBY(M41Mj#X=ojmXcBP zp-_26ScZA5;nbjID%I+#4^Y*F*%nB1O##Re5H4G($cZf&pHE>`X7`CRu1O-?M zAcige8R8`5@Z=fdWZTdM#h*X^eINcQ%V|jN&&uB=`Sja-;=d`&%Ff@yFBL}vBNI_; z6B`p-=l|ih{NG!VrSeNzSscSRg(MRLJ{JfUl~}Rj2qY>R&4!o)wA5UI0VDEKls(jj zps?bt*f0AT!M+~VJ~yj=jp?J%PeP; z|MTSq{RgLabzZ2!-1FRyrV(-bWsBx`nOe)O>QYV1dAiurCR06WEKLQgZJ38N4`NfZ zj#D<@Jc2Pt(`fgRX5{+f#m87N0}os$tnip6*J?s3V1uc97gaj0z9Pj$(MfjLw}oT4 z=ZfJT6=(gS1?;Tw)|?m} zkdal^uH~&wG}?hTpt3{C-)UnXWy7n#LDnvvFy5OuK?OjlVZS5_3Y0m6C>ljYu51E# z&6v3f|EqyU@o-6|N-Nd>P9CoI5RuRz3d#43%)ox#wL?UdnWR=u6A62R)C7vVw<>+-d>Sc;F(4xh zdBf7JC2`?|dozmxbv@2aXfsIELne|7?FK3ea3AkVIc2#9 z0~}tlI?4m!B07w_5uF=^3ReN!`URg#z?D4NPag&!N_gOoosUNNy6j9+G(kjKqRTuG zKxsE`{-o_FY1)Sw0X>5*gg~B0D04@A|M^HDL@t?{a(t*k;R$0?^A18Ugdq;^?`^X1W`q%0Ljc=(SIfb;EiycOrHqr6BPU5sEJjiEMe+bEfK%!nat=!AU!hO z7dH&Y{|u8;jsYhBK?i7SMaxoK{InPiSP(AsccUm`Vnr8PuW~TnMjORycJ2 zdG{+|;Djc0Tt_A9Z2w3qsHA{G+NO#&mYN3PA^ zFr*9rfanf;B|(P2T8hT+4-e!y-o1n9jJ*>rIvkI}TW=Pc z+Qji6h3dZwl$xe8&bLASl{GJOLvNfj5n~2cJgk2>Mz|0x02W~uh=^IRH<(43nZ=@* ze3MsmBQ;4??FC{YavX-}8f9P^H1vd;r~434NRInu9d6>8()PNm`d3`n>O;oSE!!Z3hrD!?!mi zo(=;&z+#vtblAG=jl94(T!E|kB-QdT3&Mc!gGXlC`=ROR7d ztvbQlmxiC6A5zt~yz0kK=mEKf3yjN*GH#yuo&t`-T}J;VTIK^!HLmgDUm-rYvBYGp z$+yQ4)22hr!L<&jw@|p395S({MTW^{U|h|ATO?Hix5;IlPdEbPLhxHE@WEW0?D*zV ze+y_0{~Tc9p}e`_kE2x0nX5$(5pbHK(=J#X#2lwiV~!ymAEiy73OZeN{1YS@KK5-FgfT6SRk3@Y^Kr{ zU9qOjZoob5J`&Dp^j@zwwOapmZuMX}SdMy|=a;B@BvQ*~sJ6fe_oq6et|9_Umpty_ zh-He2!Z2UG%%fbLGWwKP*xrm1qB zhBYosi$EJ2`nY8bUbh*=`M5B>8gFc)ru1k16TfS$d&Uix4lb&WG3$!|A;5o}+IV?$ zw0H`B`M^i^MsZOfmo}sOtR-kXQ`#gZExNu|ES<+sbvVO4GSPhNUObt~4pH+qidd5^ zbde@?(n-JHd9$2$JGK7?#DD8c0r)&5rlUK-qxlTAiclNP`fjb|BH_$E$OGnXSt!a) zAW5F+m@bIpkzlpPZtv4Sv-$Ya@INZ3$ zJw9EbA|A^kM?dKlwrmljD(LhMSBojEcSw+kNkW~uf?K{51KIaGu#WiyOpC8XjoBR- zS!ZyU0qU<+fbVs&(3(%MD|zcwK4nuMQH0gWG6N|~NAWHkWP{E}>FzTpcy=vbwL;?>4>0%*jpQJc(j- zs8*SgpIm@l)|FGPiw0n773FSOP2!7&09q7l5Q8I9e@H0u?fZj3pDcaK4sE+m)x=5u zofBheozGy~{mu;R^qa|$t`CJOzE|vjKdS%fQ+XthBdOmHYJ24WZtM5IiQ@n2Rq8L= zIET1j9T$u>KN%C^g3{tDWK)BU;aY)|N9#yNDBGdHRG45vXjV5@FX9WD8ZE6WqVua5 z#cbAAhB3#tO~7vR;=IK&b6Grr^Si#=IXbSssssAPY?Q zYrK%+K998ZNL$u6TZJrMLdnWVK!178lGgBB34me~_Q-B-L7OZ3AfqCkA&J#WQvcIS z$&q%^iQR}G(pUmTYrWr2JYctLrZy&KN}mG7`osz@B({kivN8ufzK{{agzi~8`o4x! zAY{fu4!R+X2Q234Ol3QYHFAsJPj&*h zJALY|QbX>p0c%1}wXPoGt-;f|^}63JO?y*lD1x~{gIr0Y%~Gi6wNky`9B(HQ8&iq` zcr&N~GZ*6cm^6p86{K)%8-PZ4JgnJWd*NWAU#!(=SjX}2D-F42L+S^u#-InmUR!?` zx4B4T7f$x-yEQf0K?iu8l|P2?Y!Zv`;>c3rC5zxuv#C`{1)-rnnINvI zG!zh{pMNhZRxYYeCXKpsxyqEt`=Et@7oXIGhv(u;BaHNaR!bGZRR{-7Dy&Hyq>DB` zT_sSbY|0d#>M7>sYou=#+6iREPP8(?ZCstb1{ zfEp4KMH3ZW)8~Vy-V^rDg@p4Cyty^o9VBDal^U?mA#)%Lv?nm!cwN|^;BvFD!m^5AL9r6y-q9B z7wNd}9`1EBT?Km<-pYHOrF-oy1W$38#-}M>t`RtHF$2G+l<+4+3g7@5LcP?LkHM37 z_GC!745fP%k6t%EIx08mJza;SK@rO)$FwpTnnwxe*i>};vSh6(5*Q9g7vOgK4)D`u ziqw=_DJc91D+bI8*J7*T_~p-t)s9kyOdrIiB-zJi{x^mp%nRdJ62p-9x?uW1IRP532DIVyd_-B919a<6Qq zqSGX4ua=!xB`FB_FfhkRs@Rn6dR5-FA~ccBVHchn8}K=G@XfERtd6zyoNCqsw+&@_ zy*$QUmPo0F9J1{9Rm38T(?j-@JY-`cl-hsaqZk0QqsSc9a}CF!DLWu{C)&^^W^c9- z7k39HSxZR@M`{9fpY&ckX!nLPM{4rLMDXtr(*Z$2MGRf%LLlp&PKzn$Uc~qpCzfGy zKlmTA^SX^0mgS~ti;YZ>xD+rFd0m&kQ*BTt_n<8`2l~-n;e$Cs?fD6VIcnBUy;UMR z3TTs)XMi0yG|JH_@#G})j@>wK3ch38e*XBn-|XSr=I}=5*m07{9a87?=h8bQ`6;`11B!Kc zJ`2S%UjIObmmz?@-KJepTr=nfliz*@o}DI;bM14liWqFRENhO;FtnT1N6ANR5pRSf zY{ShrG&=6?I4sVgxliM?)fFIz55FdT8sk%KRZ8~auatVAeMIA;n&?IWQ{Hst0X)?% zQWklyUh?G&7yN6^&&atCN@iDipz@A6jq^B~0j0;5qZS~zDfV<>GV*xaltahcL(l5H zbbD-oGe~%E55wpGBVWfs8FCK?ixVVf2h0~&6nSeGjXT5?ZMmRDbOj}KY5E4^(|=!0 z;HSxEq_SH62s=P)!b(Rd!4B+TLwL&K%5hn^}kK-qB zj!`TT5c%MgMe$LGJdY7j@T1ZQCQtS_E5AIzimt8dikDinhgV z#e?t`xoN=6CL9|b34RSJr(fMBtQ`$0b_Iz)_|GZ=_B9D6Tc3fV%5M`_xUoSM;s?#R>%{ypzJi;hz#w@k_*iwCfl_X|% z&TuEsuup0*^%&&)lJyg(a1pe-EkSeoxP8nE+3jV@7$wSEX62WZt{z4Ps?t;gSfXxk zq|6%3MF4&L!}tYv!G-xBEum%Om%|`5W*0J%E*w3-$WwljTM-btIWX*#vKRa~oBK?Vi*j$5wpm-Ot+E z1rL{3J<{c&+epdxBUzN#eIM5ncrpj8DbSq7KD~lhbjmN6&u!1}8+MJ`R7GhGkS)W@ zF4-@=+KJoRpJkd;nL<~z`1`R7ULb6{^3Tky+fsgC!8)5M;p;nTrps>HMI6w*$0#*E z>2M_k5Q+Yu15%;gpYZ>F==_5ox)MKpjD4ernBNp9*8gH4|6lUe|Hp4q{iTd;g5tYH zLPGdU3X)PI53E5#0(gBc1??pcIA7qo28c>ko6SJ7sd&}7-a({f%Y7gIB>DsB5^m}w zYDUov2iMGVSMLVh{k&1{xC0v)3gwo_W7=!WY09bVX}P=m3$f=1EWQq~r6+S$*=gl# z4^25IbK=|_e)(yp8V#03qXxr55McCVsSwco5PP{Oiq8Yw>$N7Ho<9E<(}mGRUVfd= z9jq_GD$P=<8J5<}JHN=03kvZW*^^~`k?d8lwzcF$45+ozTIpw`@=LO|Lr7+izQb*~CfFY5RN;EaFa&S7;-%5X^ zQDGWB`$NeQEv6PraU!ZBK==^;VXOdJPlKV35Rfx(ckmEA_mN~v%U$%7bb>`ytH5)< zbK-tQvw*_>bOjV|)DCt#zob&l7de>msPIfJ4Vd9hTMZN)PlQ>z~LnFzL6{3 zlBW-xxbUWxmwU_(`Wl18J3zG$UmwoCI?y2CW&C$Az_&y8CEN`U<5W>C+vKnnOT%mu z2jqO1ht;~Ho~dJQiD+HRP~0^3>A5)IoX1r6Lr`)Y)#`73s4w?#)sFN2s&dp54du9j zzmywCPfzBZs;B_9Y|YNOF|tEfzU+VXk1BD{&EpA>wd1%U2>u8T8# z7>kK=(;*Go%^^6@0VlMH;FA&V(#>b=kDx-mVfNM))qsqrIe=eK6|}Z8)WB*>M1Z(SMhLqmqMf*0SA}nZUhg_WtDF)mpnss@>ZuDoNFBw2 zIwhTt=?CbvC_tU85fX1UiiyRt2x+(O`B&uQyp@Z+48@NvQ(yfVm-_+k*E6GK{){Qc z8S^U&!poHr)iaXf(E^=0FGyHf6+Hm{)B*i^p^eMuhfPg@SigeUTh`oF@qE}&cJ5R? z?i=PFPx3SIYE+j`bp0nN4va zvWOa^FdzTh|GFg|<<~nEn&Vf?H`jzOFX4KFdv?<9tT)V|1aV}Ze__X*#l-+PZ`1``S3%k?v9RYp}SWlbuZ^K@ziUww@bZej$P;w8{R z&Gt%h1Q91#!XU6U=#V1%B`VTQO-1Qqx*5e9)O5t! zP=PNne@5rLjKCQ;tMbw6&C$M9M%j`ju=Mik&lQISAOGG+ZkUFZtCXv_MfuWWIt>#a zc>x+o5jT}k|1R>vRn|!L**#Uy@~da&%a|2BX4;TGzlH1(j~n>tw-|Y?mB0GiP>t-bUwR<67)MgttPtPGAco@^dq=>Y*iEV z!4*4LQhp-y+_u1BGa3h7CDM*8s!b#ajPX=l%We zcW8V7P?Q0Nq@nRid!(ZLs!9R3(H@>wjE93|BvW~+1CSb~nJ@mEGn3hGZYU@*F~Z>3 zS+by$gm9KHLj2Q;*d%`RvTpx-y#8ZlpRWwd0NljFv6^GrvsPJBO)51B=TLHGo>p=B zl(XwE!DRlTu|$Kug0XC+BDu1m>7s~n841s2z$?_h8~;BDhwz!Yz{PjI*Y$To`hU~- z|05*%AJ>Y1ZP8U_m9fPUdx~T3>%Xf4HUx zn$V9V9>~pro1dAq`OscowrSR6o*-|t!0xgGv~AbjTdr5M!qaji=&t?+iGdV09bRF+ zchz5QJLNK6zY9V>0c&p5b7nlrEi(JU5VDegsL_ig>`qiaia^=o5-);r%tA6dY~N+gY1r7QjjX#^x*D)6w90x4 z99W(Ap>0I6(&Qb&eaQTGoKeR%B6nPCg^k8cGc9EzXLmaMXW==k%eL*t=BzsGb@+|r z@Ro{e#w4=OKz5CjNl}#zhpZ3p4NVE)t!-ST>=Kgs#I@Yk>&h*`iEbWy^C5_6&7hu4 z>(Q4ED#QQ|{g#jNPWAGBo{V-l1$0K4LR_6H&Td;aVIOnHtOqd`v(@r<#8IN&6d z*PSBma~joS%!nyTV4mxw-(0@z$}MUkU?QkRpTXaSoD`}ZE)bo7-`^XL|lPcWuSl*SO`iGac~!y4~z#APf8IcBE` zwYnQ+NZBHeLC}I_Hc_8tqksltqZUa+sTS?7@)%(Vn#;ml;Vi>p@-PUJ9~QhKK{toN zQLRh~RG(I^_0_yErILEQuTRn{fyWjJS`OkKkD*AAv5)bQU5IeZ^%w6v72%l2o!P z?7u3A^0*_mDgv)Md@Suy{N6L7C|eV<#JxR_e&$V$A)X`fPe&ob{NPA1^?rhAOjD#u z3b6MdUp*nHHMhX!_N8M1hN9m-C+IYqN|IBZ%rSaeJ%--x>zh8WnYJG<&%1U%)M{)A zNNWuJOr^)KG@k-y{s!2JujObrk@wFuR^3#88%=xw71W)-Zo*+of?)dh#dOfq%D?_P zcQqTXB?kGX5OBFOmn>{n}@Z=Wc;O{@9|?P;uXh8wx^W&A6=zln&kIs;cC<(f-zKP)WqaEt-dNyhq`+M;Fm zK||V7fK}X!>7tB{s|FwpmkLLNyXw0!DuRhRw(ZvEU*cLj3eZA?vKeg;#~_~S^uMPV zUNF$TeW+AzT7*`U)#+6QuDC@d_GcD9TIywG9kC+Q9fF2{;o=sTCpjJIhs@8OCm&X0 zI9Z>9Q7Mu z;y)2NP51;J65Fl-OT6-@CY5!2(CRL#PuVf&iCdIIsSgtLv($tSLF!q$U#0BP^f9u#JCno~i&4>ffK z;MbySq!J8r^rytgu~qpg9E7(xZm=Z^#VmAhxM_o|c3)((TQsOnS;uRITW~s~z=LY$ zeekb0I@>*7mfCQ%Dw~ej*wah>NH_QMnTOZu>e1nI_rT0!hYWKV<0|7ZqlJ<5FT;ej zgGujfD3_|k#*+Vip+y9hJi_6A{8%LX@6>VssdM_*zC*)9ALS7B%cs?JRfYfpGyoEt z1c5E>kOpM|O*nT&AH@*if^}6UA-Hp86SB6daiP4bu`#r%p;66i1*D>hEVn_yOW=Bb zE45SJb6vRV@_KS&>Pn6*^n(~+*Y&dH)$P`8*L`!}PYzV6Ha(|MTtmc#z)CcmH{!3t zh9nR7h&lTaZ@w{NYBVdsh8yWz1P);|+B;P-X)GrkEOg1YZ%K^Ao)8#+)#YQF)UFDB zEI(-G#YpUk$q{#f7styyPdJQn)()NNcF4rjE=ib%J(ec+RV3DTAicq5*S)Ypk6UIu z#Um19^D9yCgo;n5t6r+qs~uHMRw{>G6cMUbWoWWuvZc=>aXdwsr;2pKdI^I?^i74# z;K0%JE9PA-Ivx{8ZiX#`8PiB4Z?~N8Pu{2@*ehGIRlEi^%b3Tf1YFLMFIGFs{wtXSQxf8!ewcO`rP%`ARV zPy=8z`hsB&#pn)aYH*Jy`6wQ<-7rv+m_0ME?Odu`mtpH^-;E9luT`UuWB`=3R66V; zK!YizT_Uf;#p92VsCfA{Y(5SxS9-06!a%}NQGYle^E|Ow9E0@ik4`Z%vg;{RQCo^3 z1nV3%*n@&Jdt18)AU+oyIftQ$R7u)BE|*04G@9!yAk(IwaQ*~qwMxPw2Db|}&XtA+ zzuC->E^sn7+q`*T4Z76CXG}k7aL;S~31#!E=c0IW7UriV4cZmOS?>wxdPK44R5bW( z9C4?6oluXw6fani%Q9E7nc=A_0l=|(F)-zkE(`j_l}#sU!CIO&i;AJYE3-=qfa(Kv ze&z4KoG57sDILjAxy&6M$j$4QlR`{R%B3)`^i}zG-MQ3-NMmMB)6561_>Yso(5a^_ zpN%j5O!~!jl&cu!8yus1p=KUsLQm`@O!R9^#7rsXNn5f>{rPIPR=utw9)N-ygUwlg z;Eh1v6Uow1Q>b}?HF`7=6obA`3hgqxD-&XRV!(DCHn^YQZR{Jqb2?uONqBV7<8PjT zX{&CT?!pyLic0h+rw>Q35fzxGN$!$5Qe4x!Du0;EI2i=)R_Q=(!-^p7i1JPigjzW; zRzo&`B+>w`)uQ27MGu2UwZ8v?Lt~I?6?#U$R|(syw!QDhOPwq0|7DfaM_sJ^>I|8A`ku&%Q|b>mkEh#nE)dul!Dn~uuYQa4##_<9GSx? zqK4M+9a`7TT}9i7$#i~Tm7*msf=z)smIMkYm-TeJmg${^ynZg_G>A2 zo*7pyAXd}O$Wqf z^9-~9;0?m11E|8}!2nm>;g3x+t~QrcaYkDQe#B9Rr`=tAt)s7NLQI3JWu!ZH0;rS1 zk3)!I{Usl$9YMJuUSZP_0E=)YvoOy5 zu*y2HCOA|z>wVrBby}0IoNijfnBFm(q_uGdx;Qc>kLy(vN!XI%iS34~ILenW&j}&) zbw2WktpO^ydPC|Q>YRs4yHa0uJYCKeDq7rt%pb@DBs;VqPf(pwMfzXGUS_z@12z7W2ZjmtsNlt#*=8wy}EJ#a!a{89-qC=1KXu$#;j{Mm6NVL0L?JYl1eJAOtkhj7* zD`qa|L%oMPp@KLzB$t>oP0c}XwcmC7uhYEe3ubPAtF%6Baj{Njq+lGxa!vIH5PU{; zTRy|g_nt4&;&Oe4bgy%cH&1?uagh_w@bH-rAO;g>nt$chcrs0|GTPapK?b_xe9hh3 zm5nn~HkMMT?@PXm_bcO|lOzJJRUalgAsqh^?>24swkx7k%=E-pY(JyHd>dY#wR7$fx z%*3&)X!_YJLu0m9iUAXot1$+&#+xY(e=K2)1qJY2oO=iJ7jJTF7fvtM(sYJ4td=kh zoj+9xNx3R!hU47F`L@Y80q#IhZ=I?PgO&*>O_3jA4#Ln*1UmJ z|A(?~jIKmWx2;sHimeJNwr$(CZJRr`ZQHg{vCWEYznrV?zVD6E=l$5p-hbDaYkpjF z)?>Ea?<-|a_1nueZ=P0ME{Rz+Ke(xVeGVJ5GO#L0UQ_N3NAoKjD)0F}uBpeILOgz} zPJA9-Tft_BO^sdAQM&c8whao&#|nNJ zkqCk%2x3+>7>4<#$d%3}XU!I#i*+FU6XL}dwzTRXR7ExHq9M@^IZ-KrV@&;i?x)eB zIH$aIX?#6g%l}}H+vlI;}LI2GojJehKHuP5;nhnkCSR10G4#9Lo?Sl!iV~a3&YAL zKYn#{Aj|50)m3ZMl^1GZ+1?EkQGKD%`c;0z>&8`i9rM-^mOIOy6ZZg)_U@Wzs7&d0Mc27MKW011M^KfjsLCp^(Ryuc{WK>T2#RBQt+@g) z0gvfJS50#3Yfo>vbYEKZkNjvB3CEIH|c3GWFmn$y&Tps01 z^&(`)+Tv}|ZzAtS9yOmHO{_TJ%g>jjQ#V96qwuqgYf2Sli}j-_cnqyBC^3s^B`cd35PfS znmczIoIMN2laJ@kXV{(51Lw3EgHf2kIZuyPW>*bv`~b0f zWllr9i7hUNuK5(5XI!F_-J9tws*%fJ%N|A0`( zj0)L$0&m?xu8DBzNxVJ}_BCJQ;C*tXJ#M+&et699@h}AsSqNsP1q&}Q`h6M}kza2; zZq#U<2U_vUd%^Hr30A4g1~PBwbq@cY?q3vzs33edD5heL-mr1ma--*P8hc^&W(I6U z?ACf5k+1B}vLBt)#mGS{NNS-9s7Orbs88o5eT=j)DH;6r_aimo?h%J*%j5>Ep;0cNWkYx8n zUC}w!)f!q^S3(G*Ma56``USE(hf%3+b^Kmr~Tqp6lr?YZMrC(SoQlrX@P| z(>vi34&z{>^ZEC0t4}s($c{g-s`eR}w}S3?id)Mfd=%dqm@kl_`7+g%c&CjEGGv4H zQdQY$%$pl&@u5TP4mf@OFU^+@zoS&duK~vC*M#@)yqEgdRkr^g@n$M%C?KoAe@tql z_sYqt+LWZ28rrZz3Fqa=As}mAecugoO~nCh^lso}tT54$Q6!T42yNcPJoN>Xh9wiB zP{^n!e#Yp;9Cj4wPq<7{l8-AQ)N62TcuD(sy?AbLy{_@_Z~;$;=K(@`v@I6tVarX| zoxSq+QE!Tz#%sijE;*8RrZ|QSXB>E#ZhyUI9C|yuoKyf(c-J!Ah8e|;3w1MoPpv2` z3B>!>%2&)3_A*u=9?9lnFQwFQ4O6mZk6UGJQ#g!0cn();VsqjDl!mUru&3}|s8B4P zkpCU^>6X{*)wcGcm7|u)V4W1ImF*F~DY)Q39s~qbY5Cfvw*A09PL;ed79wKeGg7Hk z7Qsb6J=(KaDK^z`wiBn-M4^;;KsUv335A_8S?SmrD$6+)rD6R0aP(CfW~K+emde}8 zd(+_JA%gdEOpG#mn(;_6;{@T$x`yc&JeIx58LD8d)UdH7g6VHI6ps$&$+b;G-jA0I zi&&3%lpHOc2&M3-DP-k|oLYnZUr^3Yma(5vhURX5Y4}%uQOpfcM|ZgDl*Q|!C#n=I z>IXv_g9<8`iMVPwr#0HTiFXhq7khM<;z=-#Dk9&pK$;j7U4>3@=wc+_FSBC6&zEMR zempdA9#s-te$v?W(|?K%3tJLE3eC}gDdG0$!3IcxG5^#Y<||mi;%rdf{Z=6t8kKr` zZ_cvPY+)P-Q8D&QlwB@MI;bRW!YhgLuJ$bQeP@18FAn$y{kbg97D>KysCy4qW0wW z8&0wfg-E=Ub*imJmQgfooo?um;)AI46)vy{f}U*T7L_T0)12uOh+z78Pm`>(lA29O zypADppOkcTC@(>^i{a_4z(^Kq%=HDb$-8>J>2{?6b!}#_7?)KS90|w?u@>eH*qO`n zn@f_gZ$yT zx^A`HMM#^6z}DK>!{eIJrt{#Y2^NM~9UW>EZaKL5C0=Klk_I}>zgfIW5fSjkA= z%^v~!e5@9BC^{V=uKbJrrjb8}XVpu_&V1&gc;hq43dGd_!A5kCZfM^7?6+2R85ocF zVw4?klmjE620+s!h5iRe#Pw0ZvO}(^$1G_Z<_F<0N3;Qq$un29MT;+1$^a#GUIbZ7 zOQ1(f1PzATO%q{@Z6-@;BoawW@-SPK5ORQ(>EiCo*3nO^%A0<^gYg_`4OF^6;Oi3c zG}l)qArvySvEv0k0|h;VjuKYl=IsT}YUUWFT8Zj-i83HVbyKxp#&Th&(Ym(BMLn)l z4h0NcQ{H@U2rv2I`f$^+_>rNiG6ahfQ=zYPe0wV_)gL3Ao>D6i7OU-dl74#_(Q}K$AS~AC8Oxf!jQl@$nL7? zu7IE9LJlDyA!EM5aj$q^UTi+!pFe~4AUu3`L~rSc_aA5Tp^dVLFXZ2JC=GIG-LD#Z zHe_!8BUhlVrE%K;RWn&r4=>T%NXp=yNS#oD(I>fpHpUi926!jU`g;7=_rQKC4ok%s(MLEN>fhj{8U~VE{ZrY>waGY_K2@+$+txcunC!bG@GGuKIZ!?n(s1 zq#4xGVm>}Y()drhP1Wn(Ve{p;D@^Tue3I?LGf@~rmZvmBKWRni1GS$_#%iPil&}H$ z?sx>0`0#Tq*;OaNSBVt$KKFQM%d$M~NNWe)e^)x@=h&>rrT+rN3l9pY1K0AeP!map)+9ZS_mg!c}(1k?M)J#fE1!eq?LZEX&Qg#-?K}{0xe8t6ghPYi6JA zD?wB0n+)R_CpBitvNzXU8v~U-o$hy7bYX)8jNgW*wi^;=v5ER-~eQC+3H9H4d zEr$nQ%Xc?Gocoj-8Na}zRedJhe>C-aEiK}>?#{^UV61^~K4xwFuNjusGIxmH*X|qm zS7!9@3`Y(1X%yrn`JK!x|6w?q_-elkJ2E_4I;%@u zUzyNQ>Yqra1nX8NODU{SYaH}Ka-Ls0$LtSWY{~%zIJnIyjWd<2%cxLj%r7fP;_Ar; zkQkAtrz=Z^QU5Aks8la(kYE#7{eWS(FVoW2xY~v3zmi)=-s#7J(UdYq-he0(BSbkG z`ZgKX3P+a#+cp`n=g z`cTx7Y?BL~41cvtFYv@PvFi$LGk3OB@uDpbmJZK5CXz-n=q$<}m zOktm-LNiy|3jP^D0)N)WO5B;E8?%}wP$0j$LdkNL(Z?82t(T8!lwvj2^Nt)9z<^!f z7ottC&$BO(awi2A*yR@GG9bGF$(E^{*Xl7=*2BWKiIT!%r@V+u%01op5cr+DL*(^0 zUn=j_q#^H{Kwk?7_N4&v&b@d)BA|Dhj+o&N!S)Otrf|c&WM$QEnEHCJrTWVQ1QhSQOSyBruhvSk(bNK$Tn>NWwDC(k9cE1MXaxO6?k3uYsPclAJ zWs!AJs6=3KkKwzeEvK2E8W1zv7!@r^59+WpbRcMn-8|?~^hla8yFpn|17P#uX?|uk zLWq$q9>H&ll^e}()A(mD`gmzc2mEQrV+l1z>3wxu@2S25=kp zF+MY9S$hvt9%IyOgwe8}oYb?!ZeVEex!Oqt(Y7mcob$3lzruX8H2ILB%pUNa;~rc! zRxjJ+@~qBPN_fP>s^cCk3Tz`9z{Na{K+cbooF5DXIH2(sy|*eiY@xl5gz;Kt2w7eR zBB8ABmLn}$$Xn$GBg?EC_Jn0Nj>7W?pT@Kz+OOuE!d~VSVM4>`1d^uY>Hg>vMwqlj zUD8G49brGivRt8A@8Yp@ehg9#9rd6O5Mbp48(=m+LJ#*<_SMSP+rn(I8hF3*{A=(l zb6uue{0e$ZUjdNq-vqxewzAfXFK^^vW9j_gHZxYyeAa!uFhX3i5Ri)e zyHJ$Aph>GZe3Ve?%#eWImx3IK-ip_yjR;~`$%tny8_{Y z!-UCt<{;U}dorRVCq&xK9zjt{w_hhIAwxn{p@}`!(2HabTMqySdk4mWL@^6Z-~Z{_ zn?oX0n=cqDKB3F1uESK_HqmEig@EQ(W;D_htx#G@>R^&OnZFWg#;q0@K11DRLm#l5z=md1YES#*^U!e9j6rM4uLS!j1ic#78J4rRTwR~;-(C6&{jZ1B&T=3- z{B=;JUzq~$-##oOV?8HJ$N$%vWy(w0{N*x}USJp3mYpE0o`XCa*CemvuYq*H3q>+6 zT5#gkxzR=))x3O4@PX2a916_iix-5x=EwL;w5OMWquypSJ@vl%Qm5;?Ym^D9I1KoW zA{6!1lSk&2>}yucWebc@97tTYD<`5r;+23C`Rp`ymm`^HIUUO{`c2oTEdfs&-L*y3>^AXfBFcjyd_ouF=JG}$x$S%yd zMlkil94`T3uLQXdC&ru`yXQOTY4PRnuGbEoM&{XiQHyg+dh8KU06+%@j3cJRJ^RR& zg#t@QHl#k%fXEiidu(d439&|TNW96ui8D{Wolr2MW!(a2YZzOdGf)pF>c||tD#5&c zRA+pAO9EAF^|_Y80j5Q^eJb6Q`{W!YEn(JKgWs@Y_p=1yIOiyq`^yw2md~{5d(jN0 zndQOR8qYr|XZ*DS=a;g~iTD-&QNAAf{kxp~e{Ph3jir;7^iRkrlLDQ5(bs&Q!E%0$Mh^B5wl3f9K!p$_Rr3S^-I9snM zZ^%)Hnina{p)~Tw+s)k`Q(PVoS>qockK-!el4kA=1O@86WnJR#^Y`PWX;x0K7c*Y+ z4Lc9++<&{RE84Glehs$C4nSZcLP|7V1~U6pqds z&oDC28#b64PvohIrY}SoO*br&8ehWHG7j9pyD$yR0*vG~B`4{XteN7PVAdAl<5QDsU9_(gI7>cE;iZ(=J8Ek|;gfWy-TZHX~}{9UYI%?G5TS zOl!YC(!i$HJyUTBH&$#wXfgc(7T+)TfML6oQ0UoAGMz>*T++|`6|K9l3zo6I=U;(t zn>>s5Od;y3!9&!5sBxo0)CHOc&r zIwsM8IwrA(lfj#a)mTCisSc?&fefh*sX=|;qePS!<@nrnC$t@*etIEH%%RyI!Ap@WU=?l`8p)1Uz?1e!N z(hb@TLJo=zk`0;_agT#Xli$g6sn{l-c!5uA$Ipqp9;=up4zy<-x?W;bNjy(e926zA z%8}j5TR#_2inpF8$0gJu$J9|CWN}Am#6E;_!+8EYXYfK#jeBUtO=u#v(t;CXC@8$I zX@E7u&=MUNA3sJggDX^XS5((tZNiOjBCISqowYP;ch^)`TV-+QR~N#2ja=W`ZPU7L zYcW$1)|yyD$qpB4-*t&?pa4P}cNQwnMfo1d^>bP`4BoL;7^0OHLJtiKWQRZ^qei8A-ws>>2q5&05PV>O_qI50sY*@n$s|&*vtDe?71{ z$Gc$D_}U?F`68Nsryu-3B%}D3=hQzqCQ)HaW>psXgBld7kz62HVcn(~h@FCZ4SL{6 zRb&J{LWsT&+@TcZRD1<0gh2z;upx8!-U=)~hq7D_MYMF-F7=(`6|qnYfF zmVWO!-y!K{=QwKGiFQIbyuve7O7BLj$W?nBFs4fKDQ=?MxymbdLFHlOF5KRh&pg?T zM>MVKRyi9cw5uE?N{FH)9=rnU7}@#Z~2Fha>Z*ob1OgMTxRrb@YD#hteQl`v z0eC?=2nC9Zgp>c%5sQ|_T)2;sMeWtzJ48(+XqJ(RF9IOYR|>74z(Dm0c<-k6HTo>q z8*EHz!S=m||{Xes&1S^HFtZDdjiNFuu^k610 zFGOF%a_?3FA<;h?BFZSm&NC5U0a+v_B|k5-uaP-(auh-1wG%AQvII6O4~UvOKHu29 z__%O>ym_5^%>G8bR~iV>Pt{pqQPx%1RjakoFfJtJQ+ZPKrwveLjjAM3ZmU9to>(@T zjH+UG@890k+K&Ut1#@j>C88kpo4nj&(5lJ<(H*185v73%TVP@?jQG)M3P+oMlMbf( zEQrQ6N-xntub#h>Xkxd`YLQ%dnV|rx!u=3-{0bF4Z*(3^KxT7upFS^yLY8(pSP$$j zKu^&xklTm3Du#a|iYx}JUJMlYC|{uh9aX1NDQsQsacU25agoVEzyZc*L-DKB0F1|I zJYRk(?j_PcE(S<2WJm#K>ns<@TNR5r@6jUa3f-83HS2E6o7Xb_%t5yX?Z23lm_V9f z5U(zTGxe|UM@6U+{mQT*^X}*8gE9j%6JfCMtQ?@l;x^CcW4|_>*!I@}!1Sxye|nn> z0Ky~?sp(-FwFPpeyZGIj1kHuxaq_2j)BI1nHhfL0mu*_(mozUFY{*-J*5C~C^j^x_evJU9o1kPh=umFF!HUp?dRh^Pjd%r zuug(<*1(~0@8=jQF&p%kNsm4eSg@IGtrozV?0c)&*nM=LW)L%1=})(y=I#jc?s)uh z1>Z~rbdo|oO#>6s?RiB*&yI3uSOv>f3W~vl?J{x}63}I)qh=w5yUF5Uifz+4i-SHffEbT*5aJkkXm9D?F$lM8FDU-} zIT=~BYmCAwz#^0rxgbmx0&P+W%tQ^j26!OtOrhE)KU|*gdj0lFqoc$P%RcgzaU9C# z_?EpDJjHS?F~T^fNkFqjla%!eYIXq}6{6^~Dm0?cAvAOhPuvt98d^qAImhWYVoF-qUUR3_wNLfzQTorfxVfnBaNwpou#2Z_1E7*1udC9 zT6j;96Cc&kWaX1Ws$s8hGPwotTBi7;nNh`KPRyZ7!;nooN8LPYh10XB((FoJE14Uq zqfv19W#JgPw+hq0`~@dRzBE^$kV!Gl`K1%U22ADKx}b9z>shehEJtMMCeN%mS;Dpx(*<+NvWH%W%sr{U+zBcP_o|#elgOg@4Wd~$I5Y53M7ahoB zNz}(=vwO7~eYq`SyQFRBw1i6I6-jIduN_4NrLBt-5+DZ;zNZ&s>Fyfj$Sr!my7sb6 z?IAXm{wAjX6a_P{5L}B|3YV_f|SiF zFMKEAHJsq)s5jZo#&~nh zt?PTWXi{L6HE$urcQ!(aC@N7}kzP}1eFBsiPXClWiaGQv0x{JrUP@5_O^~YE{VEDf zxILk29Jwh>`tC{WDyH*pknDw(Z(MQwnYVe zCzW)DuvS3|C5+$}_(XB}q&8`CDirJa6t;#D!XnjJ39c37z63D{T&@_!8hIcTQRFd} zYMCiXU63)!xSI8Ekz{o0zi%?($3hb#)MsWfVbAIYIQeUlF36{$RjVYK%0M>ne-gM8 z#gbCd(w{WO@_6`8T%)!OX;NJ!>YITCaDW{)V+Hn}>l_u5iX)rf%A66(cQW7M za5zpPV%=l<>SKr}CeqrHTrdV6OZxC|RU7eIQ4)&lHB1wUA%fU2XTH_F?_{3iDf~7? z4%ajR-h_zUY`**rN7=TD}OT2WrUL?W8vbMeh$1IkykAUuf z>WKY?#6Zd$YojkDYJ9yx`FGaK|KLgoH~lXeVg)-(K5I7@Q=>1Vt1n)qe%abA zDW3SWNW}c)G&bgQAuC{5D3}J&%Bzg9vV;ch6*NhVcUPZ-0pZ{>#4ayqPjMZ-q)CJK z(Q6>KwE<-kita~HvNhog_{GgI7YLgDB=Aev<6!XU8K*QL2vCgsz9rszQ&r85gPyn` zTt~Syjop~TgZ+aeK)ZVhP<%X*-wMusxc$xOgfziIa$U^D9RSg~xFFR$&V%DdQ%HZ< zmLZ1>)v1YwJuA;}r2J zzD?>-Nmw~#zZR>hx*Pe~Ae4_*y>Oyoon6d9=GWBh*S}Ns#@4;+f5jaz$u0 z8xbAc<%2V#H+y*QH8iz7ILG?M!0~fiWa^5;)!JG}y$FcPlo9hV*zuF@+p?RLW(@+U z3m>wiaPOI{nM$jb64Wi6KEN#~-Qckvx@))!(x=j+f#>B18)_|VI|0>Ux6_UoF6XI& z-6sPTs}D?<=bDOLilT(R_T(mIhV|I>K*bMtuls*04F5v!s9Qi^|5vVE4*CBR>21D* zTP^NWadSD#L1U#A2>4n~ku7 zzX7vRDh>*|Z@j;pwyp)4Wl^d<*@LnR#gMXUK%MdWV~FEA|1=f{9w!I^?Q&=XjwOMd zLJaw(v7O-oKC zamq$eppK@}nN@szAFD7y|)a5n^OXGTbjpZEJN7`(6)W z)bE|=M{p&XzE@(%7Eej!EU*dGo}GZwa1KHsY?s1s#OEuH#5$!LAdg^xt{xzrIG7c> zK;*Zt8uIpgpWId0FjY|X3$gzGz=H;8w`DFa zG<}xlK&@%#pmC{?yQmqREI?qLFSxl|HzIBD8o+nSi?rmT3RDEH|? z1{eDi?d|k~{^+43mYPtGOZJrY&t;9i#!oZ4Xv(D;!4de#Z9!9zQ5ewD5oVon`ST%v zg$Z$OhqBq>)RS-Op+Y1DUPLbkN@Jo3MqSLO4?|AsL)OT}`T}9Rd+LxSauu{Xm7>M$ zS4r|T5$Tuul{rR|Vt-s)(B^gf8t(GtwM)oF3**n}-IG{A&^sLiYaWvCz7%=KwAz~) zwt_-gT+HT7HccA%rny=spK#w+7cw`%%2A(jow-$4AZ24eI{q7B{JSr6JyY*iS_>GZ~ zv5wiLrymJ!+sn~aC~RGUZIt6roe6B-HTgeU~XaO(?YK7@}G+DzX-uCwTM6SE1YqB72kA! zJF)r-UY2H#|H%jmS~6?2$bjnL0Uy>`YxPoC*%ab!aw>q(DR_aNfBBe{G$QoUsAd0A z_m)^%LK3RFl*5ANz|^z*JNx;A%8|)vLa+>)t^!D;{8i}yDp84Scnv5W3u;T)&!i`E zQ#ivUBK}|S7To*`6~HygazS8F z=u32H)dQ(_heKl2({-?MMuik6FDGR8W0CR61EkGO5O*b$J8w9PA3M%U){C=HL;EC! z`obhr7w-7TVInSHbor_5p>u_;XA~Viy-_gz=MA-VBJ2?21@bJ$7T} zrO2K|h+FQaHY;D}jP5pQ@~PFm=O3_&Fs*P_&Tpp3aNj7589yk4-JQ6?e(191eR_3o zsp}H$MQFsC@wemkdEc>z9BQsv`iWhwELlVX4Qt$$+NSPwb79bam@`1Xx^m_IL>(A4KV4p&609YMq zX={6*yLfE;;FRR2n53-12!M)dix9j9ghDdb;u9E(C#oDCT9OUBlNCg7D4AZLV@w}*t9lzd6!9bc3h(>Hq?CkQ0_ptj3w+=u zUDBVZA971Y)3ml{Bc)R;QH@Gp!3;FVw2EU=LbcM5!}%TJE%f8z>JZbJ5;)ce&m_>8-@2d;{&S5){o)2fY*p{uT3A`Q;F|*ziNaRMtofg^sh_tH};YKtFpFo`w9X7QCug;{MGsy zoC+UsK@XLnZ~_hzqS#JI>Jd(FiUFWxkh7!`p;jST-WG3p599lN(SIegyoarKmfP)H z1{Xw_<=F140xg?AfA5N-E;xNciR-#wf*G(RaSW8_&fO2eSR+m27;@(RL;ekpb`Fne znz7bhHS3%O8-d6D{r%S+zQ-KkrTki?!yhgDyr8D$`Ep!(`YfxR27)7zWHOJBgXP$V zxzi06I#=k0!XzvVKxVn*i4~M)nM&$qkIIpiNNDss05o|8qjvZM&Hg9$Z#Wd%m?0?i z0c~0LJFyg!J_lgE=oU}U+CCQ-_sv2c&b19TI1v^2*3KT_ z&+i=?KG>1zz$x2E;tXU;a(VQ(=cb;awGF6NK}hp>uwdSfO_b$$?$-MY9?8zrl;5ac z!F8V^{$wUjb8=-jiO^!tToOaDSEIKw8vs00;j7dD-(p?b{a2Vvh~xNGl3(`#?>g4Y zUyC0z+PPwpDW>_B%*?aI#kxe<3sv|*WaJ5S((=7!d3%0XAdGUbw23%9v-L$#d>d9d z{Z={ok+KtkKbPdGYqBmV@XXuB-i(*b-2ucjaaLx%MtgQaRsPj{2cxf=c=o^-QjBR& z0^&P8`S<11cr80PZx0uiK@axkEG7@Q%bg2;zX`9JU`sSzuJl^TO`C%$aH-qmge+o@SKjMzhG z+Mxjs4-emCdG0)HInq5iAAiOmV(XGd^Sy_JavV!fA>cPRwV}i8hZ9`pGCErS1Qjuw z9=F2Br)oqRD+~KzAQ?Vi^4I*ST_&h1M=sF2ku5|GGhstWs~JA_eQAU;t!O*AaXQ7f z^2=t%%C|UU!Tt2E5}7)c&fjBnEL{^!DTti!+@A#l{t6*cD=ZLX#3{GOnmmw1c}e`G zqM(OO0i#gdNv-GJ5vVCpjJ4|nK`@h{`;>qSGCkP>x?oCPtSV59v)xa~79*(gemvPQ zk(y%O85kVh^N;F+Gq!KeBz;uBF2cnM*ij3OFAAs_1-Yq;M(@aFpJS8n@f7I^+XFCD zx$dHVT>%5Y2;zz&WO&Oz<>cPQH5uhzenyq4SHtt}z%rTG&fct|O2a3iiOq>?1+CqW zv8Y7OPO~VkHOGORDo>l~+gvJ~%_4^!1ZLLvNNGQAydc*2I8BM5fuc46ZpH?zqrEC7 zM?c2I(b5LwviqmPC64V=t(DZg`pVL8vGBxaMQlz;NQhg#k5^T5!bfejXSk``=jk^l z2{H;Z7DxVB*lGJ7>m5tsUQdMa7M|g7?+Eul9+u|U#_plCfA3zsoHl^zmA|ldK<(MG z|2VXv_)rOG$_@qofkQ9aqf_3=!BMafQMJ67g6(+Y6+YnO^oQkN(JN-!f(Q6QFWMJ+ z|HcIOzi8Rk#=+6V-sm3?R#^KB!bX748kV@!0U|SxZ_>o*X{GVLd$b4pa{G;yd>_1s z32(3BQ8+h2qq%8fKW6hcTvRUG)<9XJ(E_=3{Kerx?7xhYIp7Td{xd%W1<8M^K_GlJ z&Zc}1?I!Bb3HapS(!)(o?+Vs}^t35K!;wHM^{`&h(9kycs<%#i`W=mD2EL~|kOGz7 ziXz*fC$WsLF$jt#kW)`hJ&VWQ$4PiyW-x@M3R1|C1(Tu`%E}|VXD8T?IS`h>2;Nc} zh8?8N_m1Q6=ph=zQHzqR=K4YrK^ZB1HJOmm{po9oD3f>z#Ur%iyOQ|XV&mi}G*wxa zoaJ;;^HeSH$fhw=izb{^%{#sXsX)^z@Mmg62NJWeY~10xyw2HkR2Ig*ZP6<5;op1@ zQrBiOc#^KAMPYWhKb~+);fT+zM+yq^8%UgtTEbyDJiMyBL1NCU?(XZ3Ag!%S1vzgzBi7WamLaM7kDGvwH8@1gZM3|H|A6+mbfzQNX&B;j! zg;#Jrpwj7Q7~o}?H^3n0QingmwyGVKE=tKs%B$pP_D#p7GEYHK3>R0zA!&h&dd91! zX1DI;XD>0KEW+1G4h}4&A*1dir~j_17EoQ@zu!x z8#%Zjzo?O=?SC&3CMt}}fB9!|Ss{YOLDC=yZPJMK88C*xA?hdMCzV1G(bEl1rol*| zr%Vi_Li$sD_BML^VX>&U*pBx3T*=JeJb<96s@9~ec}=aaJ+99+cfY^fpztC_6MczU z%``hn&A22aH69e7H6#jZ`18-W$k3)VLsxThT`G1iX)E5^uKS~H|mB;F3*E0>Vl?oKB$Q}&P3 zg6LmE3D8>DT+@C(ibL?5m{y{t?AokQX;oM(BQ`mrT5dB|W*mn9fJDD@hDpZPZqbz> z18{Ftv83T{ZLh8GBuy?cxh7+u{HtTGLMGkSh&I z!O-8$w=_4UQL!;2-2PblqN7^ZUbK#5j3Rzna(}%DaddpIskaz9fZeQJG+x;{N46Ne zk+i;g-+Zd%3;rIeu_*hJ>u<03+q~G82oPg2WBp$v_Q6$id*IrIBQ@x+-F(9co#mtCMYz~HWtSp*%?*kA8g3_j`56{N%P(R({j9}Zw*nnSez5&^2{ zSVSIsnj78ymYM6x@5hfP!#F`8^gMk+Me79d=oxGOGonAVLCD52LNIJ;!%h?Yg=~le zNL2PM!LQy1PwUQ&~Nu(aBCk14ANV(Z}mdkK?)U~8SRZniITmPW>zpjIN z1_2Mpm)!p*#ox-l1^M}GZH=t|=QTj38nmb4K_U;yZ3{!Z1Vr!8fE*y8_|!mj-X0J# z{L~&^`hf{_kVZTDRxvPQ20LT_?Q-s`1@lvlnMH8!9&jo+SixpfyzmWY7mc;XHD`pv^g1#kBok)3=To*X zz3^*Ucme5%7>q2fH}*EOEie3mu3TH5U>tAImp_d(i*>Y0Pr8t~(>;jGy5M!?J)M>h zU3R7#b>urG5{WW!g$kyVL4po?v+B|4O1GpRPc{7<=xmPv zl-)D(x0`~cq>1B`x+hK-Z+vxmVdD(r=;XfnnW~3(lhBODNgdUXP9wXf!O~{R(WaJ^ zv2;ug4SbvM?uBFuUOGc&_H=cufL_aJsB(?nNJJGA9BXXsM zCryJwQQ=I*z!HkW3R|T2)utp_{wVGzr^-M0MvVI)p(UcbdZ?%@Md}-$LakT|KqUh) zGajuiE!S^67qgNZ5hIjXXc@B7D}DZ$tl;=A)3nUo?=syke%C zwOTYShK74a?UoT^XqlqyI>36Ns$fjXg5=qX@J?iit5Azh{3`^=t%}Q2C(omXJSNtx z!-`%b6(Xr8kV`U5x8^uiluYQ(3oKCD0HuE#ipm^uw5sDJ4C-t|EjLpn0WSWt6y*~j zwY44;SLX2G?+M~8vr>}bH*oB2{Nfp|6S*m%OjW)5T(8_KWqvOmR&w{x0ttXK z9p(O=lad*NM}~1NJr{bH37DNxrAmrftQRRPKE`+w@lG34R7+*?=Hv^4%*AsG3VGem53pcBsaStB3pwd?-ZpmYDmE7ZTLWr%4*(r?dyjsjC{^z*M@sZ6n)(8 zAXq*8?%R`vb?)*bO85=>E1qFnOd4n?Gm+lWW0RQ_@%Ps(MbtnbVK}3*;whO0Y8%Oe zPR;pVY$wR3$iOMteFd{H8K2IF=>ZJJ?$mSr0HKNDtA`URnj?0oeq!%(G z)T;-QIJ45aoQXw+W1!LG&!X9>V>Dl`j9D2J@gIYP1kEtNP<4C-z4eUzrsa>qjv+{1 zBd%CFd0FFtr~eOQ?-VRb6GZ8rZQHhO+qP}nwr$(C&$eybwms*MnHw|rX(pl{I-(vb zx}&qQt8(SHHY)>|IW7wIAoqT;p5pnIL~j4F0iUX}X??I#e$VjOSB5dlM$FjoU@1nWe{cfijyFH zhMZS`2jgELjVMudgW1cn7Q(cP8%3I-Mw8uQ=3%oYUKB1Dkv`{f!zN@gBtnFYZ%}Ay zPbeUbvMe+xzV4e>$f)nSvX z7fhT+>=V|vvan^CA}<=$Dy|RemLmi&p#v4A9)sBk5SK7C0Xs5%^8bSfo2tp$ldVjz z=lKAklz*vjVDLGyPerNd4(!o?vf7x*OPwD2mxdbZj!+@%<|0we7d(Uv_*GY&v1l@| z-HAZfVR!c&*_J*~{s8-IhOgR-2%Y!eLKVaGdYKbl$#O8@Z@-j(Xvu!YJ zj9Q`C2AGb#RQ{Fy%hxngkn#m?J(tUG9yC$26^g%0wwDoo8AGZ~i&45VgLW8*9dQc| z3j<5oS-cXwnBdD}CKfxY1s}v-?kKL!gEKa2(rbRD?17|5xj@7-nX1uAsYmL? zj|>n_E2>xUK-K~EVi=t|xo6(q|E7a|5@0h6V(1~@6Sv`xFCdw`q5)#e{kH{i+i9L4|QBIMdZf~4m? zN{yDRL4L5lRzhuIfR2srGpbflOK}&-Aoob5R;U9AYnm&FgXIivL!lbIT8j0~XYJmN=(*6}Rk&EYWUOn-b`4#kriKX2v%gwTf$AgvYc)Hloq1Vz>!2NxrzbMF`e~T3Z{Yzh!)0Xr!@6wb# zqj_hKAW1_L5oCwiK z$c1^&pwfK~pOW7*V$EhShe*;}Ra#St_+(b-hJH9JeM2uz$~fc-OsYQ6*KE|MU1hlkozk=53HRbuB`ZLU)FK&?VZIx!Lr&meO>x&Pl48Rvpiy5V%8XqwsgqwL7u7A$En549vAI=iFZ_PybU|wXj>RA2&=HM~O!zuN8Fu52RC!&ATMK|S(rh*Jw zhXgiMEG_vU#Ynz51Mrle&=7;0A4DAF^bB@2ntr!05;HJYrQm9Q4*0SsVK4B1>$IZ1 zHnbj~jId`dL;{>jh&r(u%`Px9Xjs;?rZ<_NI~lP;tk3-81y zx(JLehcf5$K`5kT|4KXiV~Wk}zp4dWAOe01KQOCyMnAE6ZkhB}hkl?%GOB&mq8c}c zP>SF=Evbt|Sr;|2N`2H)^l)M>B5<4~NcLO4ic{`q*W9$E>yzBWC&9rk*-tFp6kboGk|7mj_$PAElC4Hul1Z zJ;o%(B*TTSqq{`1<5^P9rNiZ({#!b-ZF1sxg~Mx1!&W7i^Sy~<0+-V(7G1j(?&OO6 z>6g+<4@#g(m~F7mwZF$Uq|mj0$1W^n7l5uCN!cFE`<~V#QDp&BFe53LkqlzKchOJ0 z@@3I)pp*Ko*MBF)b>$C`JDZUM)7ZZDG+ts(#}_b)A3rTE2f^&S(?`hu{HuOXpEW_7 zhl4Bnu3w8vuLLWvJdgCPOi^4esn&CVC6wgg(Iar5_?3nOjoS)d z!C$nyRMb`IMX=D0a+bj^JtoZ`HpTU`6u#rkTqy~Ejskf-eA z^`hJ4gbv;yA0D}5#cIQ{5^flR!N3QIkEVcQ)ukbeN!a;F*0@*jv}@8~D~&DHoPRsM z+HY=OJ^Xvs-eg_IedW~kCg~gEwL;+= zr0I{u>_3uF=@&IDqvI+%Oamz*N3FPJ2bOIrsz>iNq+K2uyd%u{}Z0?$FqC+L19vtwsAPN!8#<*%l#{HO0?Vu!8OAY*rcrN5j7xJb{1cPj)it}R4 ze}YSYl|+b7L_qVSqTQ`{gr~vC*|u=mLP)C!a#O6%tBeevC!1;f9@-#>EUVsbfZrKk zZ1a74)N98ASoe`W{T*=VTRUusya5&upTJi)s~RM3!B^1~x^=*hd)lW7IM&?aq6 zJ)e%CKH@V94;`JaN+_Ob+rG*5&Rx4{^9V^O!+!Y^=iSLJgm*(_dw^{IhHSjX&ve7s zeey1p{xhKeAUODqgLm?ShVukt{|a7sQlkIdbjC`*u(e+f(*G;g?<(iN{j%4Q=1Y-q z6~EF6{B+ zO;CGd z6PMo(G0EE+nE`4 zE~;w5CRcza@E34P04Er_{qtSHS30mOk8d^zaqIh!RU5EdFF`Tgg1$pkXm|gWA~|1Bj+NXV zp%IE+?kIT;Fc)MIgnhS+y}bGg`((eUQ`q~ui7UAkol@27bkc2%V;IdO zPUI$OyO4(tFWf}b1?5*vp%&aZgu_fAI&;c)cw|#~_AKB;Qw8F&C2v@&JqXJkH@*+; zyF2e3Z`y`?0Ywy~u{_Lw*BgQUT~G+Ccu;FVNhR@#Ys5Tvqp$d}f9RxaAg48_>VlBi zc2jc(;@3cW_D)n|_{%WvEmm_A=J;6Ddm3A+p&&H%J^C$OeQ<6%rqrKBy4WsY!_a6p z@40aNu%G|KbmhNuxah$gZK!|eaOD5mAO3Gu@c*A1)&K0roz{SIPhQUO?KMu6Ams}H z1_T8rG#57o1VHXs3?&{Cr%eym=MT;s&!cC|h+sm(SFT$5tXYxj&R4CmX;^M`CkSs| zuB_^6-RySl>S}GVrK?)m-nh1PTWwu<&Hl~fOByEz&gK2QdL(|#7fzG;jCs*G_zP@fTY?&7y*vPvZ zAY$h_yfdGwbQP^(J4{9E2we9xW?s?4fqTt%({L%Gu@1tJ7B&jfJ%X4RMMk}aQ(+77 ztlsF?Uqh6xtJ;-s>ZmXpEzR7BVS$OEf#JHac7clgoceAtWw#zycFS4LTcf!fu5M2$kAW3#S67gm zx@vk6G4f)yfKb(b7wOaxJ(oNuaFZcNl&nTFR#SFekg+V| zhU(S7s2|HzpTbsl^eGqaz-*i2XDIblpeg4a?*6PFOKn){qt33-JjFeMXI8Wan9wq%lJN=ipS}0~= z#IwIJ65=h5$;ri}OtWK#pTg9$L4f}D$m!7@AZBi5V`E>4hgNyg7TH-XJGUs0am^Gc zNj^PJRr_d|v|r;8vi?QW0LaE1?PzJaZg&emo$n{na>TNwX&RKXK_p&`Y^9s|T*A5P zRMizVA8PZjd^LL@6ts5Wwe#T*0O(Mpa!AWf=M*HVYTQi)_V#fRqAU7Z#QPBs3dXaS zL615EvK?=v^@(io5OH$VLuuF#` zG`2ac1!44d2sS6B?r|BJs&edZs*-#y8110V1#h;F%ZO|IFdi`2IRViMe~=OJGVCik z&XZ>8u9pMahvmB{(b7C!CT*lkoHL^Cm0LJQn2^E*?kysAC5?h9=baRgX>sCA@=cQz z5zqkxyqlr!$kE!TeP8US0{~Ig4^SBH@US&I9bWy=!?*m9^1WoPZi{7 zjpzjgJCIp)ch%uEHe`s_%@*D8f5vgaA_DR-a-b4DKc-y8^_l5QxqB}X#2aLP*>k6! zF?C08)SdILsjCsy1x_?SGg`(?&7ji~T~y&b>Nji1(WHr0F6>dgH~S{tLtfM-Wa?|9 z*|HFnh;$SgLT@iIHREb<8A575%>aMLPsp=hxaoAwIMQvSpZ`_bCPw}Gsn-x`m~w1J zCO=e;McCj(CIVSSQf(ghS+=TN9g8f#O9F29>&i*J5T%Nu33x^li@$pdzT48Cg^f&F z-h|8o0B;I>R{K}Ek zm_=2TRg0|*fs2ccYeezg&vlxEHux`A0x#B2tslDoY9&GuDKgr;oxP$Fm{pD zfFNNqszH&Tf(=!zhElYR#Tzd2%1FrKdL6h*E)>4N&kuVrd8gwO4e(v3I+E1GCZL68 zu0bCg4(8i=W7O9%rdlN)ija#P(T!Pzij=d-eNEViBLk7A>}eUT19P|>{QSzp*6z!=-aMY z4{5Yzud6rWhb8H%J*bnk#v+;E(%58-89p?RgF!1L!>uVNp*isEpiC=@v9Iy0uQ4pZ zo}VTlbK%HFGR8e5UnqrCCoyk0NB(SBRqSQpKX$T_QL;83_*7fSGN@EqEIl45>BRrc zaZ!?!qP`T_@jzzSDSCoPjn-j5sYq2~>j+aP!c6Hc#H%upQVA>w`3`NQX&XX|#B>BE z&dOV2QkBHA%#&f249BY;m*=_@Zqxy*C|yHvUUCq*sCR8bi(FLao0j85xn*x+TE$jE zwW{IxKDj3IxyxJGH*s?L5$Uyx zr>W7RDoZ=J5@?xV4fdA!I*Dn))a>!KgtTEfRy1$kbES@81o&vy{LA-eS;k1Mx0H?= zSv*E7*#O3NC@`hZ%kmdnvz8O~2%qHiC5+syt zVG2*aDTA1Q9r^38nuk!w^0f`dQYgpeAcn6ZqV%xrc)$-g+&N*PruVXg(Z^(~^DngJDOJy5LGK zY#EMJJ0eEw%`X@)rmsW2HFdPTid+FMQj4a}8iFw$$_U&zh@A0e(Z&(xeOdOJLbs|w zk3?P2g4k+DDmXs@gl?KHufSkB25kj=yl3LOuIu739dj&Aq@v^mAKD4@;^`K6C7&(H zjAsy1ihOjA2frQ1;>nICflKAQFH(<<-MD3&PsWpscWgW!RCrrAO>JlHkR&CzoqEd( z6;zZL*=+{Tc2y>r*u_TlQ~`~44`GlDr6td@&@8vz49`AezKgoohi+&}U0rr$X%g0k;lY%PBB>UDV9iBN zuLa|@gDW%>#JXOIfz_JW!I7Z9?94@NYZCnf_0|7&Eqnig zRimpsWtt&uTkkvWN=_big9FnYEk0~-`nTmTdb^4mhS9$40gErozOaAMd^T6GMP&~S zYq~?cQ1g)FsUv7xa$>hXd33+}+DhE27E8cWPjLbl#qT0^0}oR@PCoKkiq} z0ePaA4d{MK^jUgDiQcEes8eJ5_samM6IarXFzJBw{SLciZwhoX6w(eg-Hw&hj<#u! zN3tuI!oxp_J@f~+cm?mE`jh%{WD$FKC6aYtsjnyH7ls<4%>(_iVC+6!REH4 z`4wIZw>CAV=xTP~6GpZQG;PmgW^9;Y!a`Vgzc`Lw>u>q#E<|GNDwJ>6?zzGUSO2is zOC{=^7qw}Yp6;9c;$D;OS@n_Ib?r~>slKOcBJ2XtDSVz>G4M=%+avcuc*TiQ_hdoM zRGBtF>nTqLBgbe=ryXf`)R1A9?LPP_M>grPc;qi?Cp;w1vuuCcT_Mq}>WqBR#ZoS+ zwMv$zJv`Nz8y(JQmCoqBrrLcT-Z0kH+YEe<*4OG+KGAQD|i;(oj0{0gV}C5ypGR(04TH*E4Zh#gm>XFcXVEbL4QB`n_1JjhIB5T|)R zn_AA;SMiWrzBs=sOxS(H5Ab#YJQgOD-BPyh>;XO#*gtpx-=M$aEM7BMeDw=#8PdrSHqmemRVj(I3vk>F5cK;L|9R3pj$nF0w z8O%jF>)eqBe8-P`A-Mb+0s2MB`weV;v(6NtP~9v2^LDQX=93d>X3of3IxY=5Ly(+a z3C~SBA1zj%^9CnT88xomBjG5ci1(33H8z0q0t^fy+i4i3LA>_FjWOqZh5ReDn>1Z58>wu`Qq*~gQd=YDKT!xFYArj4-hvT)E7KWi;? zKMR@m?V8B;ItDOT4lf_K65V?0r~~?v*oo5?J47XpY_AQ0WG03B?BX_1$Y=}mG5jp znnIEC%sv{lvk02iw0mJgJ_vl%G}hwnD%!gy`Lf6S*Jh|>>I|i zzX#R+3xH<#?>4?Xhz4r@qrSU)z&bm6bgNdf;!nS1vB z03$I0(8lI#EQNy}XvA@HyS{dW#swL+*uf?2;S!e_yo+vyq~c6A@iBBI`A2a57p44G z5o;oGUK=)fo^$?MG>6!G@Y}eLit|uNdAx}F)QhA>Am_s&J>D|c-9x=9Z;70RlLGN7 zqIv3M!Aln+*%z}=${MuD;stp2xQx!Jt!2odJg*lMY+4zm1;)ei7jor8hqBAJeG5LD zxy30L$Fw}9BBBOq@qBKzbiy&Ewrz6Omiy#NuF`R(TgoYXX;Y~y@>Zif#fvFo!l=R( zU1)@)8eZc+{4lK9JqEtktGTCQX_X_4_Hi=^?kxlXXo8hNM%-*!_D}BL84L_35QEP#U3ANn@NGC^FxEdiXrH_FKix^u}~zQYCFZk<(t7s z@ED|y&PX<3`fM~%X@Wj2ak^-r1t$-^TOMM%*9gF(Bz+cmX^Q@aEZD#52-WM9&8ItW zRN3ddAN@5sl~#HaZRxub-0gd9R$FHvD`#M&dJ2!Q0Nmp*!Ve!S^_*;Sn*5$C9vYlH@h2sA(UBTDG!&}7oFU}77$D^7Jz4$p{-sNM zm>w$t$~S}g;XCMjp@8lFhA=Ol4o2>)B(_Me$?opaane{xTf|A%gQRSOe0C1(R? z7bh7LCnp0l6DK7TM^|f;|7H7Hqb#Mg_#cldxfLmhAH)MvKtK_m5WKLp{!bV{8Dp%z z*r$k?8K@pptkrJ<)@Ty55(TpS=rl*isqd-xsmtT{>1o{`)B1FN zq`~YC8^=Lv46j;d>$djc>9kM_CkmRyF|C8;(An=uZ}Q?J5dya0HajT30Q5mYA+=Sc zP-q`nH@yQz`evzpjjb6dInCNf<7-|ZufDm?D^BFT`^T-?@YMF7!;Q__WjW~k>SOgE zLZPPI8K$As?Lhgt=qO5LZGH1ejac=%D_aP=B)j#Y_=yfu1pC4QC*$aM5-G;1)1Qh5 z=wlsZU*}Pr&Ik0Jvksh|SvY775e$-DI;<*U!nRSvI>O>S4m8q9XLns6q-a!#IO0I4mir=W-9|Q#nFQ2B9PyM(OMhFc*}B zD9IczVF+7I-+HN&-#o8B%+@!^6$H7*$Q9QXp*M#oC6Oj*!D&OlgT}4QP3ksztyncx zt=FEKIxm@nZXyC+wfv*TcgCgYoli;L=ic-kS(K#=gYo%+tK$g;N_O$u@Ybrs*tUzG zN5_r!kjZjIO=}JmzE-ssLyFk6hJqfw2Mq=a1(9rT5m%z|_>lkxt0Y*3`nx#nHgo!p>IM#M;Enz}bXY z&&bZ+rzAe3=--*PEmEW^_OV*?JChRQ;5<)3Jmipw-&2qw&singw>?M`oc^lZprHq_`zI#{D# zN6*w@J-%?AP2YCMJ$u1wCxKB&FCf*Lf<-f)VmL7tWjKDI1BpJESWPn2AEBm7J3af8q5GsC8*QFfcrl>OB=y1T@9FdX5x_8znN;T-H17T~ggl^NVg@e4n$fSJ; zG9X6G13M`d49K#ul^J|~qk@P^6Y<&zWhqzhn=4ndVA95@E4GF!<7v0J!wvngFj%mn z*fg;;1 zo&PRgKV&+z+oN8z862{eO5N=Co~D|C+OZ3iEe9fmODxARmlHn z%9)pRVKmSfW^UTWRZ80gd#pLE(_8s?`EZ=C3#9Gyk)Xkzi)IaATAtuqU z8fta)#45J1?Ss|krd8NS<8|;`L18xK`b5{qdX-O2s|t9PzR6RD{jP$x3mtA$_T(Bb znKo7i_UynZ5jhUmQI!8Aj3|I(7J&VlNf;)2_4q z2i>-y$b};($Y9%~oFX5ww$p>=QRjva?!<7zY zEe?zX$O9(EJdtO>IDD$DiIQACB7=4LdJ>C>cWJgu#j0Lj+2Kzsls2o%pn!dcy|^pf z#YxzcARmY9F%O~EO(Ck0X|Ilg0jLd%RCu&cfs~aydYrf$9!V`5y2q(tz5yWIxbG+M zU?b|_L9z`~r@JK$jj(qVtI*(EbIr4RDQ?Y@;}<=;ZS0ibnDz4H{AI!^PyRjyH;s&U zge`I!Y~fx?WmPa%fyU>Y6{YU*r83tkzEXb{Wo*9C;G?_1#tUnUQ7^GG{BBC)EyL0U zEf$;ZN6i_K_Zq*ck1!ipnQHSG(B-N`<+ic9HcQE#5@j`p!T3Psz7w{}Jw}hdx`%+h zJbR&*yJ;19#yRgKqH}exp?NJJ7IG_TM?=7IOE$&cGH&G zL=~n%XHCY8danc@5B8-8!Zh+H(L={>3xT=DAGlno@;642dMm>;z`X%#BEvofWckvd|%Rel0jrKhZ}F=UgFb zj4vFkB$n%ljok)X4Wv$r1n7lBYTKNF>(d5XNUhGGef&%4XP1N($%PLTAOLOo>vSC# zHFoy#;&*`22-8t^1y@1+w$tD~omixWea=jX17M!lqH>gUumM0V!+zN-~WSg^Iuxs1DkrvK>zb6;-5u0=l^S3wXwIeHL-R6|5EDz zOq(T|5c=9G%e<%4#7q);Sw}K$6f`-h%`&E(GECcxA)&=m=81wyiJ=Pz#*7kRi5bqO z3ySit0`}hm^ZE!VCG7_5naPlVlv$Anp^=f1T$DG2v|qa(uifKPoDczujyGQaR;`;3 zv)q^$&Nszg(FyUf~%79t=w7?kc5p0NKW@z7nl3`ph_dRG9#gQ5L3doGG04<&|Wa zSG604ymq(kJv9#SrUPV5cR8alS-PPdENEOE` zx3u@XX#c_^XI`YgdEYHz&5BMNlw!op7$3HrJ0ow#DJ$R1%$oZ#W}U^T4b$@ly{oVuXy%yCO&KnX z#reePt_hVfsKklYlcdT%napw~$4o|V%$V!3=Dy5fmma8d!Y+r4XP_!y%`{cbC$3u1 zf<&G>XO<~3$WQ{RnbE%+7txdoW`>fS*Og-nrE=2bhcp(6aHc3`$X6_lONl%n8#QwViw`t3 z9dODNAR3rqEGFI$SwXb|$R^%IjvQ3+Gy`VcN*fpA@Z8IWldNONxN!mladGICsWf+{ zt1e)oeWd}{|B?CgMfDYGJtSntD3f^8`QyCtR6~LiW7KiBF_FYlqePR#62Xe7U1;sD z?7B>I(g?xpguk(fx4SdU++El&F^~z2sby}(U{eZOE}w3onKP;~!rYYbWnCn?Ulw6u z!0R^|*Qg^ugMiTqf{(l$O*VE_!23kT<%MX7{i%3vP376D$%AWYvS2hX-O5rzefsRt zKrLPNSYDIvx=@S2TP4cl+(WNM-bd6|rG!F*64oxS8m{_8dVE%-|LJpLb`O0 zjpWlSLp6Ff4U$5Z6c~p3Nxse;A7WC*xU~#v+rE?c*!fdLHYwg}NV09Hsg>G!f)eQh zZJ4ML|JY_@7w;OQB%r}0fCYAe1d#x49Fr4%l&OzKG7YBNXRcoh#Hi7q0#Fh-nQz!)>zuRwAh)l_oHSkh@+rw^KGDab1|4aq%HuB{) z{l1C?N5-^M@qDLzi3j(CJGz4?0GbXb zsGez1_MtOD(8gzr0#*pC@UZa^%pezuR*2^b!~mgW)}j=QOWHA*%}>GOkq8`sA>^iH z6xgZt_!B>Ky!6v(U0JiNt~~m&T{@j;&pA10tv%_h9^O@2931H$JB&WJv@VjqhqP)| zgkaGEg+=!x)ET7Dl`~i389N*Z;(I&n?-LD1M%WT_?HeZ2KM=Q21Mb*OS0FuJ%UL=& zT8X|Osisq9D__(Vnv9uB;ad-W9zlLK#XG6e2t{!UUPPoX^(7sAy?h@b016;w#*Dcv z2x`W=i2{D+&CRWdJcRMbK?5)>Y7W3#Nbsm0J<1gXaUythub}<*VaYDIuROnapCNz& zfE2JYggRxuCckhWBfum`HGI8dA0>j%*QXL`Be=>7({YbLqkK@^K}n z2GBY*9wnwcv)H~j?u);iaii&5`HV=jC!$w}x*$BKXxe=%NBvBa$qw?H#jConr|ocs zhe?l%R0p)}M5uK+=!p}9aJqQrrD(}lsxJq_ONO1Us3Jv!QiICkc(M!N3e+0@o-_a! z$Py&G6n~DtCqNdkHL8D;Z-7RWkkY(y^XXg(yH2D54dy8{+e5rgF(sk$4JX)iX1Gk% zF66a3heebJyL21j;Mw0HX(?+@fXYvK8`in331gs1N7_^f{OnTLfkDoHdQPE=AAUUH z7&W@A8OK(C8$e7DW(afCdK?HgxJ}$p{q6|k7w#4%>`Y8&-O)>jK7H(gvf?R^lLkzN zyb8kI6Rd|yJEGNzSQ&t~fYR|+h&7UY9e<6#x2X03{ygv)M=23m zttwU#Kr7MWMcz&Vxd%LQHUl(Un$m9d9e26_Cl-4&?9w;EX!wC91T)&=Oi}!G+IsDC zV6$u)@hCR9z+4l}RWu3PXyL%{Z`c=_*kd85a!B!%`VROF z#JN>GOeds&tr^z{@ImR;u1%Ojv3DjNzNS;j62TPFMkk4iW&(`z^d2%QcQ9t3`cb)- zd4@k$s|>DdLnpYqIo%$48;*b_&4zW8JQg-`n`LLFrE|(q8AwlpI0HrF>;sWx$Lq)B zZNvX!^K4g|?O&oR$m%-28=wsLM0%U1o=7u5;*U8tYMXP=k_vi6oiW_lzx}~O{-K+f zC>s|kW>}CL7QWr%{!%SpF;&^#tKrkQNkQseT6}lxDNNrTQKKB-P<83aM4jkkNjy84 zftjsDH*#~#DdV~ZDnsbcOLglEvvc1re2YQvo>_h5BD;_Iq7{C#H9P+1e5E)%u717q z3OV|m0{%H+Px+@qLZoC1V(1X$LBF>0hatdD8x_@co^jX{(o>W*c_j=Kj!KD`!9VU7$9>uX?z62vXReq=}iq zLmFs$KQz5A9%<^}!m0Z%efz4nvO~q1(ljk}6N>|)Yi{HoIRBogfS{V|yxG5wLt9V5E zYOnq-9wZJWGFumSwLGS6B7d!ZTt!yW6SH+a>)?$gWXHKpUZ4b^NzPd+dt~!yr2ecn zTCW9;Y#%DAH~;VX-IgGCaVm6B$az+hW_Hy8zW|`S53EbVPeHE5U|rm}mUMV?&(}Xf zTf1;JekgkJt-hpHnQYEQ!a5HeZ2$sLD#3F6NYuca-dD$HU$C+H5--97RZn*#fK4Bz z46{gI{p`m8#r%C-DDG|ln=Y^TB5T@DbcR-Kms-?YrK4W6w)kpf2&ysKKo<%f<=MWCDgY0YKY@9&cxX-&tO$caYj*H}uzeyvcXzh>Vt{ z7Mo6chk=+>l^WIa0xK|lx|R~NkHcT33${^?t*ZAvFHs)ZptGWNYv$J3s_FQ^bxwH? zmR>blxNQveB(*G<=pA9i#5vj52Uxly%bZNPRB0-z5%EqVA8-2m6-k7(ibuV7yYRgY zz|t`+vV(clm`-z*b@ys2$(ly>s<}YvvX~?*?hV7_G5MBSnt)>qgBr=z6Du?DtYyd9 z^Q0aVczIJy9YSy0kLV50)QE<9*S;1ybp93(8-u!6xa#LqwlfMcnN4veTEXe?|MNEDZJ(=Q$PguAwNMO*nB{>4#>xtzDz znp?PG*jZ;3zvYnqJuPhYik%ZM*egYVb`Fin%7G4_;{7AI;5(-6`e$;-6LPXK-4tsT z`2z}o$5&2k?aiLJeGR+zJ~U1a(W^Qlt1o&2 zKn5;rZkPm7DgSb*u&<)HjaWIG_20eb_;`y9J{QfCSw}kgxmg1`y4Y5~C0XNR4=dSD?$?p6IqK3_MYcSODDe5l5`Kw(LW^j$Z~awUpq#*pJY#VA8->3ma9xpdeNwNl&eWk ze4a6o9^ID=sd~~LZw#=FpwWajEYA&4PtIx^7gR3aBNvYu_wNS8RBSYY&b9fXl|z{V zp767JWs&3Ehbbv5&;10G#-8B-X>@rb0|C*Q(=1C4C5qbqFyP z7D87^_*3|NEQpLW?u6=h34yIdbvkU-cmD5-nS-qZ=k*n+74EkC7V@=|3H({+C@e-z zi%u#s$lbQ@)x=pKbWDT_G3Xojd-2&U>30`sJ7o09!W$3I(BQPQt@vr#FZS&^A> zo{KWq&HqRQCRe3lXMmo_v%4kRe=}+KSenyn2LS37DdwJO=F$UQTODKRC&1>DDak|K z@Bd6sm9=cs*VLzTv}%V-8ifB_m2fz#h+xeiG)!*~O*p#LHffu;02`g9rl`#Yj$;y? z(8Q@{#oUG~=5WTn$i`}-gC+HvsItY*X8<-rcT{F{DM}q%Gu#$i8S~l`66>EbwFtAUbhp!|uP>bNz&Q`p%EvlaEBXZ-*aE+<(BYPtC}u>lS=# zf)_RrFIHa&SG2{zTD}}LC+*w1 z&(?YPO$fNca>8an#Ve-IZQXZK0LtZd)@xV|aa7C#y1Ntd<8~8`44(*; z84zX|5M1dE(ls7I=^cnpx}oMDx92WsIu2i4*yEvGtFYS=IEzgC*g(S`FD%8J9~{C` z;IkbskU73x*`I?h1rIZm;>NkKM~^7h8nbKz<84c?p8^z5*xfX^bpUTj7VT1(xC%uf zVpMF#V8TikP+!p^H+5>Sg}mqC$xzU)%K0vw94p(HU~{Jek+h4i0RO03q5f%BY*(l5 zFfyzbH@RVb%ywEv=}=KSQq?JVz*fCJ{9dW-nlt+OD-vxG2-P^-A!Pz1<#aGBD1 z9JbS;g*lzwLhc^@33Huv1Ot0tQ1tp>5>r4{F6C;@R{u^C|n_u9(0byrmRRcV<#n6C0nB!IbaP`#rCTwInPuuX?4Ol2D z?y+mzILSj!mYaz|V(iRv!y!~ky-B~Ofgz%MSH^Oh@V(YVCM%St-bJk?=JpW43DV>a^tpva@`*Tn0M>dT!MG`Ddy??f8+$=AzIZ(8ab1M3s(e{l9r(Va%o zwr7$`Qn78@`Nyi*wpFq1q+;8)ZQHhO+wPo;KDTd=9(}sU_+IwY_cr(1Yt8kWZUDBC z?Yi3TO!RjT)+YzUi_75tIXB+njx;%p46YHrreU8x`h(o>`+SZ!x5RsB?9XIJo37h! z&n2vHtF6sXZ?)&w)$e@iZzG-T-{16Mp0%FRa{cU6ZGY7~7)>i4Z}~L*hB)!N{fs-K zb%pDDhrdPY`-i`U=kvDcy zk^2JKbiX6Y`fJQ=6~80(Y?YuRF5byM_ZhP3VMoEdR-9?aUTabSdI~h}GS*k-!Ha2B zL3*kn?_xABaoRTz2VcGt;qMYOuhon9c#Vf?^V#m7a~axay2it``K-^+p)|>DPz&6| zC!1Art(5l?U}lm6y?0n{};4UlA^>FD0 z#KJRo6h=mp*D9)EajD~Q=^g6atB}$ogTKPLQ8u0W66?Hk%YFOruGNznuvxR(zGmeY zc=@;GxmUVuI=NLoOZ6z0P19Dh=KWOdQKm&?v%2SH-P64FrAhT7e&fNCK1>tEHbs(+ zQj*OC8{Ztke9#In0m>c4xVeq7*MpCBtCFo z6Zr_n9MQUr>8^7Qo#+?jR&}Kc%1>Oibt45$gMAia0#(y(KvNTsqtrTkN#>*QVIjr9 za(uz}{&bgOpGhuqOK&>cAXhJnPe<&JR zVa0MZUHT2a1obtvYp zN1|USdx)LY_Fiz*q95mp<^sz%XlDtAm(YXhG#YNApD;t+q_Rle5fVty?{OYW(?@@e z&~a##8!J`M;uvp~x3&{~cCF2=4a-Thx`qH?G@x?Q5)RcgCGNv$BCpoJf$`X~UUL*F zRV1wt-_RAj+eNW_Q6g!&{h(1O%R|$1u(?w>lI_JJ*Ov~ zb`I23u7(=Un}|EOzRK9g<&x_h>4;P--4zYPb41CUVn~ooH#ieXRr24_jaoPfLlvW2 z7zx$L@WU%%TDkh=PNp+z2kozZH&aqvv4FLUXd0pwPBXFlw{dd^P5IdpycArZSnXct zOQM{KmKOKccnPP*)THjQCasqqd%h<59V1*1)UWg*Fm?{s0@ezlH*piTN&2ILIUHT5 z_V+9&@*WZ#{jU>aj8CZ3s(7_`2e}W+OSlFhuTH&*8HJEX=b@SmgCl@ViOkblWe^35 zj@UPdqT$HuCYjmKs_{2eD-Ce^=n(g=Pk%ioTQ z_gb(Mo_&M&zqRbz=A8(CC}I@&52T_IOW--WKb3N_4BQyQq=$rP<}zG}a}$ulV`=M7 zXTOc)i9kS|0>HK-^zQ8!=Q{cS3j=j)DvG`^K{{xnxwuhO=_=v*VWk^?Qg!^4K|u@OSDWo^J{Ji@tx_?ey*e$x&-89W z5di_R7=L|$v{dQu3n?vauZv%#hLk(#gG^hCRY6nn7Qvk8dtWK#+#yh>iJ8Frx|p5?%vY6zY$1ba~y!r9ZDa1w7K2pyBE50P5AP<1n{$v*l;UZ zcg#4E%Oe}YX3|{D9kmfMF;-6bEZK z+N0)z{bZnPs)s%bQEFAn<*FX}5uj!cOnl$WkS4t?n!KXjGobXuDgyb{0)*a7gQx^i z6SYM|hWmli(v!NRS30`%du(xQ4UvsodsJ@hs=fxr0IJT>5~m(|A4eR_$~oUd~MIb>eT)B5Rso|M-U)c> zg-5AKtWgB7*n3FpA3}e73l5PbDQGNaqLddPyEB+tF~OJqheX5Yd7%8@lei`Cd7P}; z_e><>_@@_MKV8_b=lg#l8vn;&TU1xb?*1pyvj7SRNbtX=^ZyeU_&?{`KUT5-ZVdY$ zvRaU!!xgR6@uv(xajIC!8VyDUU@3yH+}QR2&1xxNl-W@;bTr zE2b;onO`HxD*H_1Q(k-1#8`?HG`Xo}X(H9(>Fa50yDQ`4@wvJi7-I+?2H9PGS;xit{6i*h-Y2Mia4nL^}!<{P1YTKhE zElpXz*bf;}K8Sz4w4_aYPf}x2S&*{W*lh?()ud$*7lfJxu!ix(l8yz{fUzgOJkKqd zjZ`(MVU$joX%#v>PPWX`-?R{Pf#I)2gVgtd@~eHa#$uxe<{G5GRLNPry%?-ZS6hp0 zvi6ee7aQgi3H3($oD{Q-tLK~@z}}pMrDkR=ltC=>Ks!z~n>vc}M4&kWVh;-CA_-B@ zkMM{Vldga8;(H7{a8&L(sqj0Fx=KPya%~B++CWz55rM30&iJIQ^Lf zCqhBkclW_!mT;Fruz4kGcZ+4X%6{0RWQPLIaStMj5vCi4u9{0^vHf9YU*Ly-tW4<$ zX~X1r0!MCs^b^3!)L3Jv#xl*I9GBOS(Ibv2o?#GzAvCt76h4A_F$^5r0i)bm65OF1 zf4?#Rp<%cpYfj%JxF4csfewZe@@UBq4~kO4PP~s0gy|f9=LyU@&%|5_ONlY4jyR?X zwKhA;f7LY^dvq=mREgS@=ocG}$HCz*monQn9< z32s#T17H$z*-ksoF`mykZL4 zl%GBHq6bz?%@lz-X1aaajmlpUz*7T?KloGrvd5YuPBev>)c~x-TO`r>SDoz>l)m^iihKpha3=d3^)ux_6LVt5shlM5YFpPM6wO6U^PBN1? zD)|Pd!Jt22LNL?gDBsk+|pKoq(gL-as)M*-eK?Y;~2q) zADdH$Z$P>nbZ9#`@>+$!8!hEotih+W1Cogyb>+zrBF7C{fNt>#^W(SbPI!N6nWZ7GDZ8piHNW(L!c_>=UH&LeU9aqp-0h;(~;>MvRF_OLh=UMC%o1SOGp5X7KrS=ote!J~I zoPZcIx7^$qU(2*gLxw-l8Oj2~o(--r#f&ItkwNaobLSX87zqK7wkQXSXgl6?w;=0U z&EY_SC&($2B}PgD#A^fxO3;(SW}s_=euoQ4W4za|rv1+#F`QoAiYWLG#l7?+A=fp* z0SF+<%oEvzyJ@fzK|xF{~D{EvIr~(Zl-FZGk%0H&TzK00AB!mz$NPow4#;pw+|I}`8_Z)Y> zk61lizoouS`AEF*R%AkS4XF0;{a3}5FayC^th9+Dj|rBkjIy#6_+S+p1UiS}6^uLbqU%0>-gx_Ow%Z&`z8`sT(^h=scN(B8 zE7Hc8d2lGRHXqE(EeE5`K8{*5)^y94vj;5KR0?h!fK49W(ukwC#4k#>tJ%BOgAU25 z+FE)%k|;3%R%Q4XFLCe}B!pRF>?M*cVC)_tn%UKlTg4+Kf*NzJn_tUd z+P~>-A(dgmJ#Sz>Lm$+wli=KI3Q3};q-qQQyHm~p3aeXd&vZ6P9=38Y?> z>7>xwRxlOO2J04TLG9W4-wP{Iuo6cJ2nZEM%T#o-UTxenBcaSZ^qn`~pM901CCBl$?UtTwW8DM&S5krU2ezj#j!Wa~(U1m9uf1 z@*L~m{Yzkl(gMu=3b$_%F40_13@#htP|gHh7_=*+HAD@zBo{<2N^CIW$b?c9E0H`* zSt8Ve_gep$+6-aZktc9Q%=!l+13F>Ctl?oT;B4?I&5k-G!(P^-P5xf=*DL)zUzGd! zi9D5o$Grl}FjlkuTBB#6k0t7+Uw zlYGc!0d(7cbF|nZMRcWm8F7+lBabnYLY%YrDi|9``ZuXZb_#Y568s8FP+6SP2pP9m ziF1?Z7=ahFwce5HXILkEQYcS`p_$%p@@!lsSWIHke$$8R6u7zQU|-dMzAs<{%FXxQ z9{3xrpws(Xk+++|=qoe3okBMqFlnG&`r8UB<&$gs4~Y_$50BJV#LJFs$6 z2hdDY{zU4`zZ;Qs673)>p)6sbEvx5CAgINs_tFKPXlqHlqMGPETRZ$+$|09L0EwNb z2qr5ib&Do!h>^{h)g)SlgfY#yvlCFf1E`qzJH$bc@L=s$vJVK;_)U^3RhxE}Sd!Tc zmMQub>&{-G(46>aMs&N1;H%VU2J+N5smM$~WjoBCbo-oLDf}A^N}iASxt{i_Bm;B+2o&>rZ6gDt35$mVjFB~27HAT6N!CAIPHri+T}zL8#dPzQ91)2 zLLx(T?rkd{xQof{3TJnB-Bi%O%p}n_R$66=37*mAYyUNp_yLv(K}`NvEL9rwu9V>49wq z-kRHQj$Y;2t_x}h_KL@9y!gyAO}Q5*aAV>3nspA-*N|YY-Il)~Nho}0-^LCnx!z5z{gdH+1-8fat2~s8;v>??5qH?aCsyG2*T9%-{yi_< zW8B$#Kng_rg=R_Ldkd1e zz!!NYCsQ1td4edIMce7w%}kBbH( z@-(u>ZPyEDMf7r@qwbaoW~xSFdwl?&@j*s1?!usijC?r}XC6hUWn+wgMN-cDs%hzf zatdPkdvn7)?ADfqX5ol@^-^ob*S4`^HRBH{*EEX_ME#Okj8+`!#`jh=D_^Ho;BTuh zvU7>l=2{X%{LE(LJ_tik_((|Ph2OUFn-KM7N90al|J&0hhFbXV0xS@aDE|L@+{OP` zg^@9Ga5S?vQF602`X5U!>X5G3!%knpK#&L;+R*1Y24gWWnj{oRXqM`AB-BMD5<#GG zVf^7iM!`BD&<3=&$y?eXDrZgNYi(0r9Kjo8PVq%!yGxunu@QM{trr7U^A8g9#5{8k z648LpxCZID=O-Y3d&=-HUON-U`=ie9PPhB%^hHU&uLl!gOJs6T_prmfI69TNXbhD$ z^N2{QLF7{ddH& z=c}p6)F8XNg!28EdtUap8jS`Q=!%qb9>1ENx4{EqQ$)4Nu|=fwD?2c-G;nt?Yjr9n z-y~1x9l0u5JvSTgzu$Uv%gsI%TV=)HJ2}Qla&%0 zO$HW&pEL=J<3WF@Oi~O_^W+t%B_<_2veM04CBDpqvZ}`CK1N0$%ucrH39iVs_RA{S z`$5i+23of9_0XS9+l;SK#asXtf45j6m#!+-mFpYLIg3xp7v?s@luuR3oL%tp#mI-1 zJh~Msk61J>S)>DrGEYyq@nBku*4J9n=;Atr@63GmtRbyd5CoBRNNZRjgpL^@&u8!i znOUI*R?W9U6~8O|t#C8LTPO&9r7OJa16b77C2Yhc9?SJNT*g$~Xv){i)K$XHrXZ|~ zZp@c*N+ab>1#vTW$F7fCa zJvtVy>=fIJ2^*2)!xDD@^9f~7oQ(-73l|as)ym~Oq4~s&&N`Y>=+5FR{#?oW zY^J{kO+zaSz(tfNLYDcz4i2#fvEX(7$zmu?O&?7|)eg84_q#$FD<1w+%f;ww?k#3rTQFXwBZP7k6FISj! zx&9lO9Tl`cQz>dBy=x6fR2y`>M__#S^hb_Q?&4d2W&exP^< zMGC*pj>%<2zKHm0tLB5I3kc{*C`Zn>8lqIcfne*}m1n6wc`Cw{#so;k9f5;IZ?UtY{R!{in0$vJxHs%ce zAn{`48RLIPxCbkF7*^uD=<%qKDfa0f|=iyIYDq>@cAqs+^UR)e`O@q zVPWZH!v3&ThoWtP$;5cIeo^#QDd>%PjV8~UKB^L>Rg%eaeUtaw%2CKU^B z@X6=fgUgNb(d%}h1-PI^iFrE+vQ;hT^YhJnMzs%tKFeR$FVTdnWp}TTooLEwuac|7 z{i(n}k>kc~QIZeHFF=sZ&a~DbEXyrhE73RjmmfGyb&}M!8lcbepqlW)4R_>9G3 zAvxy8@FS!;o-Y@KqZ4)HZ81y4u<4e$}u= zh5J(Z=n~q%75{4cjJOQ_D~~Aege@EuRHCBdJwyDCl4iHTUu6V#D#?v#vv7p^TN%k> zMW|j)^LM#L%QM4jUC8L-o(!V@`KQCs!%vKluXCWn?s7Z-%6aguE3u$ z^e6EHDrED<{L7b(qj`#+Q?CMyb&=y^`}`&lv=do>`#+gl*{HEoFq;SyTp)4~{aTsvq%f{gBo#su_f-n(@K|HfcqKDar8c$IxAvM>zaHxJ61Qb-{vO_|sXcBTvJ$nNN9=*vyUPdBhUu zwbw(a()mje+sh**(f+L&=}_B+v(m|AID<8pv)()=tYN4^FLZ@g+b(p)cE@pi4)l_A zr#{R@VhBXcR!+X|i$S#KLR&QHv zg@yMtFdcViY@SVUtCj3YG*7C^T#6|L&<9sRers;4O`OhuTCfaYv$>3uH5Th621F{N ze9i#8opai|JyvkNKR0$0xjU#g(5`Ht;ax^;c4jM?Us@3kip)Arq0&yW!)Kg4Dv^7J zd7766htqG-0ElnROS9cS!~B}?FROsB%jJK(or%3t``X2|rIOxklkT#(mMJ1QYFX5< zb)$5z;&EQr0;}rXTP~5_JlfCakjwOI0@1slS-KvS{AyIYZ;!qa8zgLn8K7E1KELS_7vc9ZEHNO-aB_hfq6t~MDPVV(}LqJw29tP<|Pb6s`1nTJ*x}BnClAGbOhZB9Tpj}JTx4I^vJ%PKW zB{%Fbr2`RQkDzz&Uktitr25^C@}T8HLZ>)1X(qmZ?Y!Dj2WF$|LB}pF9~4CsrKJtw zXYoW=AGhfYNL*zOWux1p-#k`@zexH-d)HU(h}cM0OY#J#L(vm>IB@tmln=5yLDSQ|nsu)Uq6aaLtZ&kkIYC^H$(52&;GyO_oxARP%lKyv+9L%MaiF zBJ9{@-__HIEU-4sMk2K7g7{sEj_AW4Rt>K9omQ;V06vxUu{u5&_HS2t+O@y@SM9LZ z;W8MN?lHA4{Tf=;aYD;iYTNnc<84emC~YZr(E#k%N5BdSfbTTF9n$>YYr2=CCWx2h zYkj*P2)X;lDkB|g=WcQ4KD;XvsZDga6ffy@c=&qBXj?a2d-s){Pi9E?<$}`wp0l~k z(4dUD&NZt|NVxVw2Q8hm;=Qx#!KR%ZIm@-3aF(M_=kn(xuS?(WJp+1{8VgS27g?XoFcv8BV@JXl@Cxs^`ZC>AK? zy|-YgwP{6CqXUOz0|xqKus?nNvswEel-_c6>r2s}X6@F`OOg4%_L>&`Z`_3cusQsv zk6~T}g$Fx*#10ga@;VNI0-n#HJmAm2098RG0n6e@L4rcsL?dBDcBB!e8|pWS&_q7fj>sM!Sel@+Dt}nG^i8ezs$-wubUFe5NI(mBA?eU{y zupp+$XSeNoTnh;TCaVO?;U{|N0E1g)-BQ zNuly)y}y(63Ky-NFk)X!7{5@+ye@l z)x33l9MA~ao4eA&6|&wV{!lZ# z`f@YIcE~PPeATGL;uosm%r9Hhn*6QA8B*&pF6%Yix8mt!%Y)#pwp#UY(M>2G3-DvU z=malI?U5K%&p?)2(xxxAVH!rRol+#qGOJHhu+<^>n)(ZROJA1K2dJ-;%HFHHR)%Ti zGcj=C`d|}%n0Q1wollEU>rb{*?nPx?Z3?5R+J*M@b~ebrmT3g7a8V4VI5|A0GG-h$ zRG>#Q;i2!b@QR=^Eov68tJ`gr^)oO8rf4B#SR0a>dOY3;Q_S!(Pl5MZcS6}fVV|2B zYkdu?jb-_SZC0o3XTA7q-s?8u&o-kr%X1|e&tFCQB=GrhJWf_guh}R;IzK154AW1O ze6CSJHy*R2euT?KO8`T5lk{1H#&)IF?(`d5i95{=8goJ13bBeBU9r-)xhPNDOp>gm z;iER3oSgz?e^MTMjYd;mYA-A7I`>|rN60ngHPK$h#jy>I9ryfh*Oo_-T2i}mFko^D zSE6fD#94HaAq-?xo!&Pr#Jb|xBjLsieE9oEUeVh>p2ufMe9fi}f8Ly{I$ zU5kq(I|$F=WL0u>)x~Xkq6>AFzDl?HuSgGZ&Je$RZX!{{~r zDF4s{>Wk^ZFCh|^Cy;D#Z-Ke#7*C&wFJ9u4{RbC?Hz}pdlsQI7x0vhbadv-p{!Ba# zAv-9>w@^iimT$d3yCw`F*(bv)h~TSyPde=ioe24roJ`LH%t%5Dd(>X2S2;moRS zIl0ijVD~L@b4Nd*wMGhCpeh5Aw6xxS1!o%}k7nmYb@oj}rs(mU3@{J* z331R5&#T4k8_|r}A*yq1^(xRlhu`^Rq-N|+NzdHTIB{!L9ha!>m!K2BK#d=m!mo}Q2HwiZJ)@~mVkg(HXK2UPb7dGESVq>f zaJ;A0|6BY#p`}Whrcm3dA0Zz%DUBwX-m|ufw~5=!IU^1|NFhLuB#Im}@0x;3N&F{T z?hdL0hEr-|4!Vux9R0whdjI~56u6K$6#eDO;6?9+J|G((<~yu!O^xXhX>hs5eTJgY zOW_^75^Y9SiE18;?3Di?w5-_uAol0eIM8c?4DNEb1ERxYDtFf}g_5QB6=h<+{@;dZ zl%znRXg|6v@?$^~|No-P|2aytu_w{Bce4K9>$Q3M!@P?xCBeIGh?TyWx2cvBKx8MgZb7-l|Chs!l&wNgv=c_T|3K(Z7 zW)GKZo@1A(*UaI`?eCAL-~ZxYVhJshqy*WHAKRmfRWt4~^tWaw!*<=0N|PfMLfhY1 zTL0p<|4l5f+U2q?+fljnQ@86V8<(ZhgSj+Xwo6KS4AW13w6x75m}1yzG1_zt^V}+N zcc&0O>uT(IwAeTb7zxM5a)R09g2jV>z?k|X_dx|P42)6;nsBv*clC5VTs|5e6+K9AkGG83(R1wjVJ3wU3p*QwU7&I$U`R zqB*4w1R<3Ai@72l^cJ3E^_q-HXY+XRwqZ4g6SfliRA!TwORIe3y;P!fmoy!$y-d(0 zQ}}M2?*+}Q7uO+r_vSE22%CALfY|RHw8isE@?s&{90sa0TLV8CS@20E*q7bR9W=Y~ zE%$do)1kNYZ3DMH)H^Jduyr0asK~Dd%M+m_KeSic0?WJiKk zh^F34An0E*_owwIeats4D7>Y>0Ac~@UC6?caS17`;}oiv=DwH=ee7)ZZM+_TgnUFHk_OvCA4;y zdNj507d><+-m!`L2Ep432Bec$(Wjwu=m4~a--%)amSdT;Wdxgzl`@CogP)ABBC-XOq#-OkrM`SCk zqhkWjS-DdXDIB+V#1E`jfH+Nn>)BzBBqL5}o11gM=!`;rpwCJF= z92?FWN`_;>393%pnbPH6$$6M$^_Xo7xaHjKuh4fgT@Wu_x4PYG^{hzz6q(X&1rmwsH9YbEV?-Nu94 z5?T>1eMS5UF5$CK#&mBOG5Xfv{)7V1MP(kON=Cb4pvp4SzZyOQ*l~C1RGDS6q^-`5 zGxxw=ULovez?L{#yoj(iqY6bdh~C0}z#YSLvezLPzKi6-4!YDyHOQcI^d4O}^#1x_jP|*N+Wk z3^LQeIMBCKF}L>*co$qUPNPm~WpY&WX$T|Z3ezI?}!7)V4wXpf4WcX1ZhNh8?} z8eM>Uv0&%c1l5+zkhh4SG45)jsH534pJ4ck_VA0;6{EW`ygkfu-{3B+-Zst0@Y zhTS8gG?-}*T%zA0Rt3~2)Jg10c&`Mue;zN@IEU8l-o=yY3$)odu66<|B2g~EJJNCn zB{}a@H02H2>Oo8RmXb1pPtYEhRDsn*Y>|j9WH1mY7nn5zVV8n1#5NwKushDfuMiXJ ze4NGevskDq|NFgR=r&WT$nQFE-;@N(2ZEXwP3WHfKa1l3aD`Fy>}+(900FV80Ri#; z*TnZfW%qxfi2aZHSPRl~Verw1xm((~el@0s?+;pa2x31OVGWTUJK)d1KS&JxQwAG< z+4LDNhBjf7OL!LCo7c*~%6Yg?ax2L}XUljRDwmqp)^&6i@$fo7HLbq4*_gX|`pAUV z-$o~FOpb8xtK1xBuD{-Us}W~m%B5#AuClIdy`GQW?vYC0x`b?0Ti!R`uDX6wWY4Rv zVV@s_;vd72ZnM;`|1f1lk?w`(d(Cdya-NY9mQ)cq5@A-#J`Q8h;cmuSZ{W#@pa&@e z)q+Z2NRuJ0J1;#4?sq;)EbnIhkO)Zse0G$*Y%gcz8qS*1H3`KZlS#7lpg1>GZEiD?lu=f=)bgzM?9%o(C zc1XoV^}Qu%!oWl~fccq41XgAvv|ZNBcGa zqH-K;f)%BX_BmXcVo+%cA&dR#o(q2*Bu@cp!)T~7g{tIgD1OH1|EA4mi{ub?K{zw5 zE@04tb_Ad}(_Y760h0Nr%A-O)fYhzi{K2$9vXaDMLV_qM&w^8$LZgWCR7g#&mX<$C z=}eX|8UX^MbU3ob8wBr1oBnl67vIbI!v+t(v5~xa>b!R47#z_5(GyHQ9x$U zzAD_lZz7J`9yd^0G$~QysZe1sg1JOuxS6@%REagFH7xFB#M>!%mV6v0_IO}6bOkqZ zdfcc`o&Ecfnr;JG`T^?AGyaH zH{q;qAaetA3~~ge?YpcF@R2da*CFs>9uPPlxEz&^-~Fd+fD7O?}NS z5~&JpL}`Or3Y$?ywBva>xTHq){s1N9bj`f=JTHe}Yw8ARB2C^_T(KI!<5S-+H_XB6 zDpMn>G!;p-U#dgD-`=<%kOZZU4Z!Qnh2yM97nhkGB)!4~c8XNNguliYtrpHV@m)LL ziJ4LM1dQ&O!B8oSz%tpPYX6u`O{E0FDWh1(L#(NdG;X)&IKvVG$3XH9}VVFHtT%#8^pu&f1zc0t=&&7IEqa6gbS6)Ca$^BQbb z^sk2q*3GJm>Gui;LJ!4T;9tsH(&yV1H08ObY+?mF@7_W+%eh^f*``z^r0=rm(>z-H z(yVlHWSIMxcpAX)C{c|Gacq!OVGSwJvb`V{Fo4RHt@^czi<9hbuzbec77&R z5W_HT85H7&7D={1M+r#1A*qIdsAwa{xg{8)jXL~{hWoK6|D^u%+I575=Ea$?CqrML zSL$SWpf28R$RYts88hKrY>e-1adMg9WJ7v51HwY@Th;yvdx&GSR*qGA7~G2a?y`tI z^u>zN;I5-RhHwUP;o8;H<_0MR&DR80`8qZry*nBD<1uEU7VKp%_YAGvU4VG|TMdlB zmB<;W$*YOZ2#UyK^uj3>XFIr;T0<$$!`72noq_UAJ$&iZ$ zO3|e#i=z>x((|H+OSd-ewqhp_j46ouFzChd#uQ)q24hko7FmdMz`W_S-c?p#?H;1B z-a2p=C8j$)8g)E=Rw>U$6D0&_rhT56w}-$=t7NreZ%>MDt@UI_!0KjtPr%HUmYeY$ zL{5`wG7tX@G<{c5eQMolFJaR?l$Jqu#C@4gCE6HKzB=a+B5oHVd!h^83s?>4mXWsq zzRx-)!dY~;(wwh7D*RE)5@SjzbGMbOEt8PdKKE~%xZI`K$56i676ldH%u@5hxTe1K z1O?!rr0;6sLlo7ivBb_dGBg@2w$~qVf;CRAmEo2RoQFQn%gX2=9o^KifZGRH&O!)kwkiV&=xk+; zWr#m+OfB)KoR$Gds`3SYPx_zT1d&n@I?lI@E>P16(ns(RX^k=u`FqCQc{s^jwT zLxVeLr;~Pr4MBUA*i^vDfi4FVuuR@X*ma7ki@ptF#QTPQ%4^Un%T3sIS$Mj~m3rwI zF3VlYI9R zyV_t-%^#b({Pt+0)6wSQ2D&U)`qX>+`sjX%`F`5-y}_m;e0xxf_*^_d)dYsSfcxZ{7o6n zWrgnu(35OvM9N+CJu`YuAz9oR;Tw$Cg2;$-cHvBlLNmCtk1qQp!Pvn|L#8mR;la3H zzjPG*>LO`gwoO4fQLR!N720+ZJDUb7mVLeJ%a(=fIg$`wsB{%Qk~HB_Ao1It*H>&* zLT1rXDVT=W-Cy;|wsa^SGqRtudNOomtfke=T+u}Dds4>aB^dZMV_`(&r~uC6#I_E- zRo6|$dnLK{28z}(FiNe4R-Re|FG?pee}>Y9-|h!7zhQhc@hw9DX5v$pF<75{na`Pa zL`o^ESb_H%5vACAdusm;?8{OyuaaVkv+}!=Q;y=b>xz{`jOh2= zY_9Y#5%KgQ4#XK-1LX~LJ=We26X0DBRfhVWuRcmFJX*RjSpzm2%ecP9mufj~W>mdI z^T;zdO?Eom>wT`>DfNwOhKQ_#+;}5!nuuID!R)=$n? z%<}AZ;K?z+P$$=G?U<)jPci!E?Ev@Axu}zVn5d4?#gdmRGUGPkZkJ7?}M- z#&_G4D2viKNmrU+9yuEP^Psc-?Gt-8uUqwyvu+oe6T4G7efCCmpc4>lhF~b89Pauh_TF$1+8B#a9=bGy}W8s zx*I|ZxbK=nq$($AX(w@|ob7@|yMQ`td5*dbZby>2?fD!xw%LGcRJrf$g-%@^J?c4e z4ElU_aJZ3fNBC-Y9Q^%6yWm#KndPHBkvlhcU5W4n<&HD|iGG1SflfU{ck`3H?1miR ztD&p1ROxIkY%Q&Nt4J!Ec+AfoMJ-;Q^W4!Q1l(}nS;6Z|YRz`pAD&GmB}yiHSR~3#~bfc>S;wj=TV9M9h*KxV{LAxvDVU7>LBjm zF>D@vcsrvI{cpN8Z)MqoCR>MJvzFXHNfFNi=HEYxc_(|Up2I#K! zw6jLPJ(6sv4&~8~#k*;wuAzD4tgozX8_mb12PC;5LG*Iac8N-HVlu(0`kXsLY3p;P z6*kAow|n*a%2XYTBo@&bJC5sKB=eI!)9JW@KU(zb*5&+ihX{XvN>aSo)mF`W#~RDX zA_ZI4>_#AQUzTmo%xq@qdku$55m$cE3O2l@=_M`BmRC)rl$SJHrlIpKbGnyEF&ezZ z=y|E}yXRZ>zgxS08aW1fdp>oFR3TkE%%OzAvfr9v5#CSwZu_R+tNj_dr3WWK%5(Fv z7-G(%hs8@$-xq0YT-N0aUG~STM~%MT2s+way}{ecll5D zZ4;^w|F9*!|Ii#kO9zIUO56ZNVi$zcF7*S;8i8iN^sU!%Dk_cBZIc7z+}4bW-#hvUa$ zI}kI%-c+*q1015+OP74iNBG_eCX)}cdBh^4=PsJs8XLa?bK5k&^W<&_Xk#5?k~9N` zP;)hW!p+Jbn}a^6;T75o+WZ}p!rzwzKF-Y-^u9R*EwufqcLavrfviUe-hoUrE8nKA zDWFhtyO~iaKsp@+fRoRv9)s(%wF!NMW;w(<2M?ktN7MxEaxh{v|GjGYbI4sVtf50K zz5V*jV6wq%XU;7x{+U9=>aN zX8q-ws7jcn;Jt~Re^KLYoIn-HN#pJ8-2Z`4?8}ugh*t_9*b`q{9DSa2W<=SMPFn&$ zu#gAtQb#0NQ1N<3+!0KqCGn`}|6uGKV>}7kem%Br+qP}n*s*PE$J((yvt!$~ZQJJm z?34GL9DF%%Qk6=7=%kZQSNg8}?(6D5&|`~u%UFh95^A($IGY*V^_A({5s3-y#rCsAZ#cRjD7t)A zGOGss`#1pJ;I4kvfDt~{zI1*cOOfgT#*r&!(-$h5K0j3|&)@b2x53M`t=8YIOnyeU zRNmJ-;jP!_E!F4M}7pPq?5q#3!kR zXe~LKg|Mod5;asX@f-p-n13c+%a~ty_XG%*7Kx);cmVnZI>Sdq+pko98X0Ce0RO2y zVAggXfd6Q2voze_3V0e={NmbcVnFxPnZX160_Tg$y?`||TBNYI31W`&DZqUUpnoiC zo5GziO!PqZn=ggejU&?1%zvtIoB`l<)rNOs$!k!u8W)pYu$t>D_Ntjr8}hoh)kOGn%!SP@o!)<&`3eTzYM$FFOXu{x z@^u46+4jr^lVsh3S2c>Tf(iuwYo0s5~rUoH@It12hudIlsYkDO_S2V3V)IdnNXk`I)Bebz*O!p3hQ- zbYR+g7j~b-j`g6RDx=zELeL!l;$v4!$(Tp(IsEZzl>_3um#sD;Y9v2 zazM#G=aQH|EYR}Q_41(af3tW?PoXph9k05Uq?0O;*0N-4OHoJF;l0)IO_f$t9l8QP zn@*heQzkt@%0wnp)8klXofYYu1kPY;&V`NSrzY;P+TdSTRWOMNW@fGDBW>9-V>U>z zGY%bpCD1FJ#8iMJMd7r__Xq1un9yq^ zOvbR=9E$Eb+xc#_ieMu_GHF;7NAy-GTwWdWb%DEXf{4SpC{-Nt4+za9D;rIdF{f!3pU+a6`exy z#kKp}0bwH2;=JCBZTVhlxrRZ!iUFh2@WUU>a;&8182FguD#E0)=(9XDOz3$oze@H_92nmu zzvRn^O)rFInsDD2mdDb2pd@)hea|h%Qg*^gQx??6`fI{r^+;FdM~BQi@YZUORts)5 zp7^7BEaqM*K6XlM?mh6S{7~$Zowpp>1#xP{KtM8ek9ASdC`lMCw~ zxM=Nj>7%?|NXk-IhfL0Dyz5ms`$xvgHNWv?H)=`$f*Vm35zvaw_5dGGy@D-x1NrkqzGTRe6%B%2O@G72OQ`EBF8@HwbJ#kpiEkQa2*ZJY z93IB{g}7=>xQ5WynF8Au-UcL#kn?&}<#ZQlatM4kXL6m^JOawc_pwt2N`+X>j-WJ< z^NKASK5Y0$^yeq|h`V2;tTAlfMx)PWY>>BmgA)HifS_AY*1)Swv?qoak?ZK5|ID`k zeN7QyW36UpYl*kbpZ#**M*CI)r8LIbRzXU&a_9#dcGb=8O*(T^%9H;z?^q zPR?S|D^>jA(Dn)d4fe@O&eQ@LhDuQvf1)w-B6k-UXn~LT*&b)qtAu>T-S=fJf}D`G z_0H*aioOY(@O_QcFl#YBK)|M5OQFkCfc8rkeI1i+9TR;$O@d?+)LkWTyKw3n zoda|E-I_`%6?}#FVr!AA+sSs)vRD3VCv=YE9`at&vR5yg;U~0~1Z>rG$mYO}W>Pw` z7kpY!_z`JC=ZqJvh>}`dao*0d6VYy0XwzZ-1=3qauDA@@u@~{XXFuCndzA>85K%+t z4NmMXF@k;vuHen(=ArsPm{>kfxv2X_P3Q|;T=`G=vvWY)Lph z3;bh&!1UDx|1;gUgX69Wlx80EPjZQNVCIpt)0qqD>HxgGN%!rsB%n_XI(_TRdJ&K{ z4i0JtSwf{^V}rY*7E;i&lFH)Hs&-!5GDrx?J^rRT^gPPhqAB!Xef}M%nl0^E260&RH4jG zYvHHhLSXHJC+e>^r@rE9QO+gf!=jWJ)sk~zRewOT8vLe&7tiX5iIx??l}P$92CMP}}%JM0c_yg@osyBRtz(rHOwyB(deIs{53{gu&N$5 zp$}GGT)%in6^d#fgBf0_@PrNbl)2(~0?+U-urB-f6?5GNj!l-TX^plwfb*mg->?xMcbj3&!{p|8 zNO}Fojn8prY9?iQwl3r`JWlts$*iQ_Q37SRNXxd2U3bq4egL0OLcgHB*L$7wS=EM8zuYIZjqY=-q^G_ zcBm!bG?T%$4QIGb@>$NohZBMK+-xUWruOX&_)5E~1^86NF<5+J{XhE@vbTX>b&KD~ zUQR(b@jMNkQ_=wEbuOY>*S^{$O-vv_8>qjX@tq>i-s&VS%=7Iy6XUD7c^Us2KHtw8 z=)>Yn;N;OXco_iOqR#?W0iaR#$>HTg4AHaq6rkLK4rF*dbt?;Azk4hcK<+Y}z3JBq z>Zd4t_KAN68J@9eq`?EpI&}#=+<%BTCaM4seb@(iBXk=RRMO%$^yusD$2^R974$DV z4=CKb>dBh_X1WqQ-UHyBrYn$HZYTfV^mvbXpmEPLzzz$`;-uUbv+=JSlE&KAL3{+&!^EZi`eOjFLOlzdr# z@F;KDcu-ff()}S=4*Y4B*IZqDh%c{cKDH^ZX*|X)7bxg=n1kCX54dhV&QsnlcG@wS z>@Dn=Obw89>!k-oUI6nu|6384Tc6qTmQa0UUi}nb`Kv#BYCrw+KmE%;bLY`=m*IY- zGzC|d6cIE;`~Ls>ks&9wQCQ%ln|a0W}q;8BUM#e&O_~&fDd`Y@)-=w@4Oy*On&H zI9s#|LLH(p$kBAOt#s{cHst}{oBvufY&RdAx2;BUOh>||+Zb4DHe;fxV%JHm-)@*) zedKdEeBsk~H|4q)?|LU&WZDIGrw&C#Pf0`pCXb&eqOU5VuSKN*mc@Yf^WK3cL#wxr zi95IE0-xB5T6GDt=Zx9J+2cWshEb0Qn=Ul)8iFr@dEl+2?)+(s znLVpi=_sEwOjHO3rE=UoCW&osJ~F>oupz6$;?L$}#aDb&)SDco?JLzG{gLOmW7@P= z0f_&1E{Z!?)^hA0)n$hW2#EW?my7y;X<7d>5~U64i+YM4Fq=xRjklJK1uSxa6lA6? zK_r1gVv)+uHN$$9JCxNdOVJoGz-BOdunB|K#|^BOZO4a+Uu_ z08R0fTz<0TP}|BE&Q5e=UGS^Vl!|B)$cN)?fX?#9y0H~G-Z?ce`yloQ4&wScd%r@`8i2O z7sYCk{kF_)QS%9Kf|bBskWVD_Al3yu6O@u^fXzjzpajw-qieEX2SGxY7c1mSmi3f( z`TkDI%_k;CbyR)q63$HasV!SNUte z){R2y(B)PY)QpFGNtK-qBIKlF74X1XBCCS)$4dHqIMM)us;ib;{9`ww^Jn{b#dw5~_iKBNo%<}bg9zi4LagzSI&rsTGu z^=%L6)vn=!P({Gj%xCoD>b!VvFOPzZD-y;R9}e^%64WLxuTuQgX)Hyfcu1VC9|qB( z2J#D!%qr?Snac5U3JtDM|Gh5ZvmgP3zww0ZU**RUd4$0JONoRytWj0$7--$hoGMe3 zq-xi=phj9;Qf^LWKoD=QbfIRbQ5}!j=oyqL415~}tno_5=nR@pb?5k8oqZ)D$#0*@aFiMOm*j@`UQIWgc{ zBS{20TMfp9P_kE*OPuN1$G#PaQLv(J|M5GSYhi+N1dD^%XHw#T!q%o;Fi6~2D@E}x zHCq$io+c;);X}-wB|ij*f|Ub2O?=cPts9)tRnUm55sFZ-RD6(Cr{Id-4B2JD`CoKb z;f+V{4aXdjqq!tylIyN2hQ?7`;&IBeM&nvTVW33du8Og*vnOA8b6g$*wIdt!uNg)v zxoAzK9kJYLqkh5Ef?S{@y7)5Ae~nzRCJ!rF9_Oev z16?+mwN%1@RZNqs67ITTZzj{t_F6<3ig@oVDA!`IcpBTH6^PiEvsLUL`j?jaw%qpl zRD#AwoMed)YFG*!U(|L^<{x=<*?7A`1^BZJ=yd?X{mk#kG1*>Ti$>~w{?bY~yHS3z zspeQ&U~-tU@0)2x{~45_J+l)sy`-JrNdY4mW!m~!Cbls|CyO*ODhxXjg1c{babCJ zE@d_JT0$;RcCAU^4G)viropm$OyTYyc2D=&p^qtS*YXDJ^Cd7!whDcI_!s*b>fc=C~bMiqH%xKdi$k+Ox zH%uBxcReMW3|yS+Jr}v0N8P~Q4CDt7nrDSA>Aw`LES=Uo4HXFYyK3Q`QEkob|D!aLN)+gh|r`XuRr=6bv^k#J2 z$U>8|a~B)@VO$y7eXvg0mr$x{I2?>J6AV5GbI9JpLycZ#{G8QCUa-3=`OMm|MxiQ9 zWo`*64d6AGy6R?Rfyx)#aGT&vBdg3U+aPU8QC7@`g^}vO`N@ucK3x1xG64KRje>q8pMGu?;dbCyo$8o;+i#v}FH)ca%|K?l3C1>R?>Bv@8^E~@_NMj(^j zzzQ)7R_;{WNJ{xK^>|A!Xv4qSl3UDpW^k7=Roh5^ch(W^cR>#b3=>@^MYPbAh?v6? zx_wLCFKH21DbCBooLM=>Mp`3p$f!yOQGWs*#_j~4DyBZ%h+P%ZJG z7pah;vkaspWga43pF$cQoWM96TK!Ves7|!W9sbt+l)H7~_VK348b5Va%#Qim4aLrp zl%cM$`fFkfQ_!iDza6hnV&e$RJ|@uPT;M@}C;r*&yAKu={!g6-gkvA9O$4<2s*)`4 zLNDZoe1cRWX6T0jIB-JpDWW%J>irC%DWB(NqnQOKyRn+`+L$dB?zmDr0?Hm3i-osyg@E~@D#s)7|WQx>H zsG&X>o+-|5VuH7l7al6DaVRnmrH9RfkCsCLbGRz*$gIqqn_pi8yQimRt^>v@CfZ%r ze8c`UTvPGGvXWObkhR^6n_NE=4d94s8zN?Tu>2oxOgQ)HMvnO%-k)4uj(7&v-az_i9eA$#7(74EEFzlX zR0ar~T2$fV>+DYkvs5N{x~w5A2%O4aIpuR5GxPr$2nJ?We(YPeR@<^R79Z+YfD9Vn zZl4r$o@&>pYPM(gw>Darfu@Ok>!{q&)+lukAtD}xR)St!d)XE~gl9e;gj-yx9njY1 z>`-1UF1Drn@pTlYJd8k%?AJYh$E(l+S|AT@GI*n($Jjy1Y3(6yQVOdm(XbY-&5}K$sVW&BYVZrn8ql!#p8)(@&Q^8ONj(PZM~xWx z6%Se#hvpu+ejl!FyTEip{CcilFaR2NKEr!J<_{OS3Cc7tun9jO_+ z&mNz?6NrPyM5COV_rwmjML5?VID+u6%>Td3Ba)AwI2MF|;7ej4Aol-WdGvomB=P3dJJ{IZPPoPOY&Gs=CzE7e4E# zo=!FQtC}R(hPhs_wGzoP!%sjHvs$=Hv0X2^Y-y40bc=Vdz1gnW+^{?ExfS@eo*LWz z0DG#J^O$q{%@fh}b5dpqF(;fH>dBL}a&UhCHYmZI%Q+&^{8Zt|Q;Qzm?&>QyY3|1A zUuz|IQR?=Ro-zq36k3|RVMU+23S)X7G@tCf0n;a`#cGZ-a^5)e0sOhSSxp&QS#Rqk zgso~bzfh&up-J_E*#JSD$uw2(xiNNjs8fOEk(lYtF*x%1x_Z1$N>O{Xru2jt+^Pi({D)y2j)>I}93~ z-BE2bSTB3-p(%c(I8Jn!K1U6@4-5A8FPuY(@H*s(nY|FelzSzxoa7jk5-veNkx7iDD7yldab^rCx&)&b*Yl)c{( zI%-|yrT;pOep_=AUhASt2AflW8gDR#8Q5Odaa0r3rMGKLL$e)8CI3wU*GVLFv_kWygUC<8Gn}wY|5drJVVT^I|#b<0o6Y38iCrB`0Xyv>T(8{|uRP zhxUa8`vPim7zEOF(q$f(Rb&3c9}lUT@JI`ZEL8Nd^FEuFy`FHuxIdTZO26*l^<2C9 zPpi71rFEFe3KJ#UxFRswI?%uD^J?=z{XqFWl(88-H#gYL@H`TPBVlJOvv*Sd41{SU z>_(`7->f>T1>Xw?V?$Qi3pvK9D{G*!LSk97uQcHpiiY?{<*-MP)(@&DQz+z}#z0cA zK@(QGJ)zPPAMGx51crjD42ku{M7Ktg}Q zj!M8S{zix^s4794S^gp%KeMu9v9NmI+I*H!h_r=Y(-Yh@j5FC;6)U1|6$JX)8WP_Z?$?;#U4}j&$p^_Z9Q!7@wmH zxmYPQC{k*gQrTdU1Ml4{4l_gxtb?QdrA0kRgRL=HClQWu!_giMU5pRS)xC-q!%wGM zjqElscGSSl-za!W55sYDn-qO@sUvBveu|uy7YD>Z&&6@oau|lha43GF^f9Gjzg49% zs;$dw{!3>z0rp0wsd@E zTsWlyS&cCw6ZR9k$h#md;4cZL&PKzVvqO`*d14?qk zTv_Gr^DTSp;-_z>le_ZbVcwweH2ae0CE|^g_M z!DD(wc5}d?3#KQgHuMhSXGvJkSiN8K_}~rVM~|h&fc|b{3~wRwk$O3i44*g8P#cvm zu(!uJMNiIK>5l#D8s!WACl2*k%Z<86*nu-I!WR@kL0q?ycnafC>=-4Y({ zJEuNLglAsb=Y|2lTb6i{{yJyv)bjp!rSkcc;5J#CT!cl^)!LDXRuNhJF*Efq1@TiA zhsbDE;k@wx^7y6AO_(rgbUoU?T#F@jtfdgAq6N#&Ru7ArG~S0gPF-n-qy9Q)7H*!f zFxz66U>_$mXSOv)uf1@mel)IGq{G*GdOC}GjdXq+vU5@qTY1(7TOn(MX~4;{Im%;b zkg-H|a54ewzp$YXWB!~&^D{Q{NZH9X2xj11Nx!^+SLA$0V?W~wN@ZzJs0BO-1#=z> zZw*{rO2hkS#M6S<*WB=HM(L=!)H8&BaNF1XL^@#-$BcFSGf5M3MPG@yG| z5xIdo{mwCFF{FX8!rY9*?I@h~P1r#hLbd&)gM!*3c`_#F(%rardUd(Y6UL!L+sXZW zkMD3V1>$NX0qv%;qQ^+NL|7OyWKxqwNd!8?=}TxMUO@JVjb8v9_M%c-=j9qF+Y!r0 zUKdiOJgq#nA}$EM;DlrS3*pwHb3Im{c0UdmP5ZXn`8}oth<|LFl5=Yzfc6O~2Wno| zD%5cj&1j)c`1O4KTcRT2oK=1hEVg+_*we%J^0NXzd=^EzC4y0I0qHR zjEYxOba6?Lpip_DK8;(soB~c`z-fAF9Ca@rj!u$9b1u0gQhD1|Q-r$cSLr{9CZS9~ zL0>U&`@kgP`Is!n#;sT^^ zwr{>aEF3wKgWy+PaV^FG**nBf6YD0`YMb8hYJuVlLy^-u#co>mE6vujnuA=1fau`RsrL!K zYw^}zy8el;Ay`AqUiinghgc16uc&Q#y}oS3no8l;La<3+ulQP%DDiuCHA4<{6kmLT z3@D>&vDESIf3dUJCOJ<;ompMjcBp;t7%2h}Y)q|dRQb(7E6OIA4Em{mZcXHJel?4| z>&+VmHCcl1ik$005 zl9+bU_1V7e{b1E9>ss(Daa>tFx}g}PD1T6%EBmLkK>t&@EM9p`9(M%0+1D0#`Cym#V6abvlhbi^nPyoM~v*;EwZicJ*zCP$wlK8CiAn1#gd?SRdBkn`|wiy ztk)ar%l_#Jm)`NCGPL+ckfBL*-;Xyz?^Nn1Q0^e5oe%#s@el3SaqIQ+c*Ruw_1W+? z*O*K0DTwY9wCkbv)c|H4u3SfJ=sy){1kxIRvRrg@Yv}8z*(q|@=rsMMPHBXfEM+kx_hcD zYq@=;(zZrH2YhY2S^#YCwMuuM8RlCx3Mwr5o6oXJO~Z9ViHJkAXze&7K;}%PJ=qw{ z8a1tbw$g2uXzY0(7L)N%Hu7b)PETX?L$s-!W#QmaxKWS<*;jG;&&w>!n8!Ybh{C)a0^mw)#cz5NRM5JBg|(!j1+3N zAf7+qnE5+r!oD#&Kesa+aNhz*Gc{k~NE|)(D6c6*$(uG4eOjqJsx>O}_7J>USrvL( z$*NW91J5_2e`p%o)UdW^d~M0PYsZ-i*g1~N5`$J?fkT{(vLlC z_1tV-IkM{>)RoE%@c4Aoh_UU(Q!g^^AVpVy4YNX3^fQjSD-NTcShP$x;fsy1f>ms1 zvOBh7k;CWHHtt9+Q%P^RcU@WcDRa5epK15tC5q=o6TmC&^zvTF5Wp$*@${yV+vfA5 zljHUB9$EL{kn8m7Kq}?u^V`z?3T=GLZuDf9J~R@*qhI{F zbWLcaxZJNRI!^e?14?OGnioA{>G`I~^y(6M?HPbX=!IyOd&TcjkPLr6V|L#;i)Onr zf?5D|9T={ghsUx9I=90_UA1y;`-X|tFGC6gkX+IgqdPzmBI9UEF#C5WSE zL1vzxFI#NStS@bCY8@^%wl*5tdz!l&ZB+dzlL-in8|dwZQM%WdhWoW}**jUgalD9S z)oJXCO%r(v=F`ulS>6YwD><>GC8h;PlVNyFw9OUq28NO%jqK@_IyyT73o7CwTbboA zI2Xg=%`?$wG^JEA0{M?CO(M0t;Z^OPna4UUX;rPB3#$z>g-5-{#2eE~HJ>xjc}NKy zqD!WmQ_Y033NFMk(Nc+$rA9xdjleEdwFsx|`6gvkT)QG<&cG=0@@*U47T8GS%$^HL z4m_<8rc=5fyNZ(?P`oKw=`-u}?0Leh#y!7U#H-eXyti|ksA*RuVuPBXMfp<3QJGcF zUw(b&0w-H}xp`LU=caHLwduPa;V{w{TO-oviyJIhCP66;9?8586TLn-A(o%9_Y*Vz z?iZ@^mz+q=rLW$nr)J$qn9_wZ9l+-CrJQm_iguhSX)79PDkVBEHiKxTq$fq5DmJ~} zqxyv}!LxuFSF)fBYf=pIBO>Gh-JFT$=3}dhq`>h7onCX?a9FgA;sU{_n!GSs@7fYhYMadEwF-jdGDb#$7liW8Z=$};!+;K25AK}YAb zz@=Q_pJACpo2+_LD>WnVmb;8cZz@DyZ3<$8$Rzi&geZr?!=y-wCJ_f_lU(TT= z3A8k2L|tD=XcQcoQ#G1shtGt*{#P9_1}DCa(|DPjz;U6iPd&Wjq~u`1i;+jhz_@lLw=Ip(Rek;$ZPJx$1f7yn{7bO2zmv zU$BI5G^ewJ(z982W^7md?U8^Gm|V6KS~HNw?a|>_k6p5T&BrZT zd})qdy0&;W=L8rBQIA{-eNTv9xfU)qKc={9Rxp31UB~qPCZi6>fN8Y-!CBHsdq`L^*l5F_{+qkDe$=GnkdaQUC!VsO;8Zhu&-Q-YTKLc!T#u5oCc9% zfjtnLEks3d47ZZy)VP{Z_mb}DilVyx8FiwrUsqBi#g{Rmb%MglAGF3-f2O4rAJ>!n zFqiz)#1!sp#iQ1|14fyOox+POYx(3RR<7pX#w8=Afj!eE>rAjCyIX8Qe(t4!l^*}E z17Udc8gFa6nvZ{mM~?_d3I`uMr~gcH0qoK}uA2isYFjEM$N+n7ZOBuMegN9JAN_Wf zx#JvNjo5jhIk874+tH3=J8iRc9x+r1eR1HvYZ#)0WN*am9huZ~p_e3g`QQIv9oq-9 zi1stMq>QhyG5c(Op68j{2lbX%wHc0b?2r7MFvh(k&NnZbK_y<0grG&HW(()2QfX7_CIjbCXn_|j2{;i3cI6T^4v`4q?&+L{X4$dAF+ z0O66GV#;iA5f{`cP)JrRTf>Oh+FJ5d@#S)H){m$X-5*8v#qmQ7#uEk9zu$`5olpV{ z>x)J60h43#%Ce#%5&)x)JAnLrSjlMrf{HnDv`NWSQ&n+EeGUW!Q;mb2oz?Q%%nt@B z$u&z==m-J!ipg4iOS85quQZGaRZ7$dItw5C;K)fhMyy}Si!5+Tg-*sbQfO4+6hjAl zi|O1sRvG=TJ)F$~$YW7$pUaI7@7U9EPii%g)0%r=g!ZH0fq1ED z^)NaCeRSC?IRk4AdhFx~ZcG~y9TBeh%nIOkR}_^D4Z`aU^D-P*9EMd#AcEwA*+Vp+ za>kD&=k{Dm4vWJB8&J-qB)cGI^2>(YS=ER(H8`X)F~|kZ4n@qshi5 zOl=JQ`&Ddc&I)u`jwuqVe`4Ar4D!Al)|3KiF0&-_Ze_ZmQaKm3>s+IE^u7NM;93aA zIsiV8zA6t?kfE0GZ{JhwgmZQovcaeuf%Cohket`UIIWZo48^>7u2x$RCzLc=s;U)E zgZIvu8vnc|4QGTCW<%9q&YES(ixNk1mAm!H$?2_weTtnbq*JYDXWD6WAzUD8R>Qr+ z%4jLdk<;m3B`UjLfT`fg?Jch*u`{i%&@|q+;PI|l#!%Vo>DiVz6`(i^VoaB`{H|ih z-&t$1V&Nm(!Q>z#M~O~p%yUqtX((%RW1~>Z#^%(+KSAV6p z{C%DpsN;W=`%>%Gr%SwmyE9+CY3&&CS9DEN%3$bz$-BFfC-|g1m$E2%Ehqie5C46d zG%`v3nV8J1oETQ-LSCMF?d^qmo8U&Zs<(_g+*tg^lF^2jTjFh6l-aIgt~9PNT_{7g zSWi%1qvzJ;n?e$y%apG8gCX`FU6jCL z_>R$Y4r^b+mYTm&F?>ks)$?z#ICMI>d&b?T6sqUuUIYh>%<4Gv<=#{EmywB~0wwn$ zIA&~HlwP#uw}eu+^KX?2S`}6GoIza$GeY;%pUB{WW$RnZP=6uddil@SN=D-M)PU7y z{8^{g&)9?Tnor^I^h3ZE+{vqDC5b{3%=+rU?wLBi>$j=K-s&VeM(%P|gW!fcN@$R( z0$?zKUE1$g*#!7o>F}e+OymMUy~n33hH(U88DMhY78^)v#l&|VuKnEco3|!?-Z|R$ zc1>XLc~Lk6EaV>Yv)$@xB6=_P)82fjPDY)??fusWYv+m#{BsSFcKnG%vn?_Tzyz+- z1DyH=4^}CISgf0zH^mEjc%P}PL|;~!7DwdT-zn=FbBoDS&yVx&vj~2ui}bR18|t{N z81)@q*vMETExV7l?In;s7O;Lzk2mSm^O|hTs@wmxJ2%Ul(}2@HJ}~aJzv2IsphaSO zzuEa?t`7REv!k3>(@;BCY}Q5`uh_CzrSmzqPC|Y~m_j#lFYemu%*2$@XVjCJhkUPG z+R2gaRfJ))ic_jWw?pX+08rlfBf5yjafz7$5(E`iGGUSpu!T`JN5llz5l5Ijmi#Ef z#ayF5*lei0{?W>qFMp)J_X&&FMO{sj0Z2JZU2D6~RMUoA%8d)^=L?nLV*obwalQP7 z<$6P?``aVoNplNe`cfUQ9tlM)lb>!rKTVS2Wv@X#mf5sF+A#b5t#CPF>`ae7b z`Qs^SF26aPB!v(ozJR-_!REZki}y^qxp+tW*S+xM!09oU=X}53sEu3}E*x2a%wQ;K z|Ag9!6!D|YwL;|}6f7o^W6aHBTAsGy(ak#5Ww*?OBR~@9-j)T0kaIl4qCY2D2 z3Muze6??#|dO)A+zd*aQGeRs&S=QS_Jmn_roFZWyLq2Iq^)4CETkJ6FL{maMd6qAr z&wYyi7~>?!Q|sojf_UQu%J7JFF6#;HqAoBB3TbW(5`Ww+x;{@dOfNqM#lfC&hSE$v;WnzaCT%_gwaeJe$%A}sY0Xs!Ph!qFK%e^z=QnJ* zfj@1=i3RvLJ$b}L|I8?#fqv+7t#uYiuzM&{gFpF*TF)h_D+~1^R^A|$klEZ)}A z5f;~0yJ~iD=L@o$e{zPOy~}X6^d>+81$eczK(t25C`@nQcr!-H7Oa!2p6Nc>X+5of zA^1fY1TX8)axQoP(;tR3h4e`7mN{=ya1KnjSyFG!v%t*5=tx>DxPR%z`M8kUKC$b_ z2b4C`d5yB@OkbZ#RuFJ6Ll6{8_@{6@bT(BCNy_&n7v#jrYtEs?MBWC;N7y{2iGEbJ zq;P=qJP{7$+dQp`1Pw==KP#-F9$nDsZ)v=M>2GWQ?VVpaU)Z(9EzUy+?O`XlyS@*+ zg;D|>BYoSa|NK@hpWlTAw|)`~dlKaJpfQ{M5jO|mEC6hlu67;A0IEd*e%@MuOSqMgvp$+#LS&)LnC@)A(W{3jnnXBs)@>vX?YpIY$0jm#~w=aTsu+V8f zs|T333W9fokfLyzHCTs`FzCMrChqNse?7iBC%X^wZ8cRy_r+%nz5X*NS3I+Pma>7- zI3=+DXvBHV7Tq#;?J9sDnC3(9b4B0rJCfm~eQCJz3}r_G;QVz*ljrmH)al;TUHHA?e?dG|F-p%8*q>-5Fa!OPftAGMvYFYi1^#)X23S=ZrpJu4f9J*ZMY zZR*T>L2t)$yh>27%K~5Ce=_@+437%wGNWBCGGfJpM=Dd{8o)~+7oCIzd zjDvQOMr5NqgRNARYs5W4JqXYILT_Ph~)v>f8$f9}nPy{gD#B8*SK&chLuS^h@ouIWq#jD{I(OTx^!4u}`S=84EI; zQ8C(q9R`}pyT6q6^_9#rtbM)Du^bTSft62=7mP2Jmv8xe zGhoy8^%cx~TuxGGJ|ZC$45T7_*ZV_Dgts?n zw)oFCX|~z&dDy7;wB?Ca-!HbzSKlwVOu_fJOUs{wLx;lmN}TWM(bS0AYVo zTcg=-1au;h$&KiTnhjZc!8@0Fj~dBcU{kM=51W)|=t~ z&NTdo4}aIvo09TRkc9!$)$HGClDnDnzsvthHKb_RsG?e+ z`5S;?3`9|bGcKt*cvy?{uhp&U^B)_-LN7th$yP z{SPEQdGW=IQ`o+uns@NVhx?Q}?KB(p=j$?U7f5d?H5?-d*=Csq-e!93Np$d8mbSFn zSgQs*JkCr_j{3Tf)jo4!=6xp>-?6el-RKEWethw{nh6r&MUs}?fG^Xihm7O`ayxeI zCk(;8sM84U{cw4bYSmV%$>Mq8Sppqo5S^w+<6!=kkEdNg`(E1f7G$SZa){GTp(AF~ zd*T__#o$Plp@U&L{VvWM{?E8x1na%I8(W47a(iJZ+Ntw=J~vmOG3x3{Lg7eu>-i$m z++_kOdlH5FexqC3X$ujz!HJ-IoQVpfXMJ;-wIHv#nVuswV)+b;UzUh;#<1=@0xi<6 zl^A!+%sIZ)|HsWJFwTF}!qeZsO-pX8gWZ53KEk*~iOSVTNhph+&H%fU31tu|31tA5GW3vHJ=fKeMA>lyeRZck)$?eqS&Vcv5{qH4%RBb`4M`I# zU%O(>K-s7*0~az52SJYNw-Y{UR0_iRDkHjjGEdDRY3Ujr#%(4rw+tunj$1<$##_8v zGm|AaQ^_HO^A)zUei`>|Xwq}DyxSi&H;(x*E8jxn@UZ$**kD&)^*#W zNvfg>DtKbswkx)+ify}6NuF30+qP}nwrxAPdG~GK{;=;o`#r6#`3J`AYs}sUuYudI z4mcx?l0mj?y;X)xZpvRCz#*I`O|%zilg^doisP+hWxOqx!g&uVqc2vRA~=2qaU_1& z@Z777Zp3XrzJGB0Ply>|4oHzSLTCOu2FErNGT8YZH|BO7#}(93uEf*>O1aOeH2>>VeV ztn4+FtvQx>a?mrsi27M?BP$}^Y)jcagLMpfmXUm-a?EYv(% z-v=0i92y7Em0@=d_g|Qa#OcxAZtedtr0!{llu$>b_Y=d8UUmEy*6J4w)ALiL@0}wb zpCX5>Ml`|lR9TOmDfCS$!DU|TR=DkX%M{)hN>me7&29UgZy_-=QGW|=?eh@;_x|f{eN3q{0~p3 zq-SqpAWRoi`6n10J`;3tgjYFi~|TJY#A!t$YlKW`e3*;U?o#ee>O z9V>K20+-{O)P!}{e58c_QgnE9iO}e(+=D)7KkIV93F-m)9g57>)XhqkK*1X_5hyuk zeV{my5bmDojG~BCjuT<>GQ`;##)OFM?DlaV|+L9I<;U(4)p6!3M22Trn4Iy}Wfy2lz&9C4E5c7Kn& zylo6iqNEgyXA>G8U^CC0h@Y(2ApUrFuQxKL9T#`gYBpP#fl^wG&oThNIBzR@Z$R8B zkqkj~MXnXilN!GbgPRUu@StRI{XP1S*X)}g;N-?p>?4{2@V9_FW--LbH5|8cH*#2x zb~H*qw#JI;x}?@*9qkBewcfKDu>o-G-}N34jOQb6Lk5}P{uoJpCTr%~p$6u7;%=#L zeg)iK^@`uxI=5Pd8ytfBM%_y6@gMx$RAin)5n6sm8p2BQ&U^uVrZxEp?a|qu4NrfE zWPi)BgfSs~-dpz)s?H!q`iO|62+r{osrDM~pl4ssbFmsK`z&5TY%B5Kx-4uChiPv1 z-?e2O6?PITs=Yix{n^?ceoIf|q+Arn?J4fJlJ+L8d|14GH*~(xL(_UqQ3C_X@>7rG z2Ol%HAW)`en8`D}@5U8g&~x8awjHP!wgWD8_3j>CL-@0Q#TA_Gic%cU&+q2(kA-)C zA4rbH+3^GYayNLoNzRsRV&_HBrrBzaRV>HupyU0lC16W*9O_$U>uiFi{-$ z5cM2Rs#4Tymcp;toP{SU=RXK!3Ixel5*L%tXw52*xKNRSWQ@U4@2KmEhu_~&1{8yP zy@;!e-nWg#ECc%P&s~Z-&bk61Sre>Zv7pdxTQKt4caWlFO8gN!Jm}m{PjEx z(g@zxJLF2R_RmpZqjvzv2&2)n)|1bNN6-xRjbtuSd`HbDyDDoQaV|b(PSo$izDZLh zRle@5t>0r)Rl}q(; zS!vAG^1aeBoJzMMFTqleL5Wg4>=$7Xkh{bPQNM{qKikqrFH&&V@Mj4JkE2&LV-9XX z+0@o!yAO3~VhbmYso^&!w(`+8kj0+_oiW}Oe#_dn6s4?|t@5)r7ePbwXAa`C#`pdm zDgb@KI0#yRp__heGjeJ{N*P0YPwg4uqS09Ae>9T8+ZhCsOoO}WA4aK*FP zd{A1#11p_5b8K9mH;lShh-q_W_(2QM%^|4v%RQ6{XfH6~_r4x}*(Ce-=gwA*%oG<4 z1Vs9i+>888VlQQ5pl7LQWangLZD1thWTkIp{~tU*FGf=qnIAClF%wU#JzxL(H<}QC zUp-V#e*y*bbW_kQ%^o%#Tex?<;ZIZ9sJ>#hk#^V>O z#vLDzuPB{gRvZ2pxKge|MTX+E7b%rMW5V zJ_WW^8gGx(JodIW@<0}rM9AJKo;JSQ}=3+3BF$6};xqUMpz zP7GO0X2Jy*!|7~);$?XTg=Ww{_>6LB<=3SW?#p+A@wB;V5sYCpZBZUU$SxTTlI_Oj zcx7K9IzTr50_Hso6zU(>#}XQgE-(V4%nSXLHNRRIR=Pt_v8c4`?SYhdXRCz_=OM}F zdGLY$6M>wc(vn*E?r`;UiFd&l5Re~#6M_H5uVjq{^(-y_2lmnwByDDXAiU?hvFFlK zh)bG%$=k~N3P!ajM#&CT5wH)HEBVQ8l^WhsS><;ov^{Z&H4OeW5SQaJ1wns4_|Ko> zpzWU4gA^O**PVq12M`=?+e#tV)C&8)vM~7fSC2pakxBh700&FvD7wSu(aX%|`SqE@f_AU?i)AlMVv>>Oa5Q4T)}H zy?n`UZ%bsqNCyAD%g$Bq2a)9okk;2Zv+y{5?t}Eym!ATe@Og`0-1ZL2>q*y@E`|Bt zk$FoYnV^nZqYF1ey`~O&f->)>C2X{g?NA54=6;J(0`$9gQCdF0lea$L%&>bab-xL# zX@ad9PTL$fXc(YmT`D#?|MV1G=%V=^MX;_*?>C0#G7Ra?h+ZmWM=j-b$ z=z{9)9N*hxKol@Jao!$0VjV-|z-$lucMPFVq_K)f&ji)5S9pv+qz!n!TsOZbcFBoi*Z(2leowf* zU;I!OALP9Qqx&Ty#uZK^kdK3Ffn_#|MjuF>wRi>A=CXcrd?@GaB~9)kK=MX};ntt= zmFcR84ZoK2gGVS-x2Q_cl#9s+!b`UG99Vt=em*V-X;(7E5hF<9iP5-?AHlvpY=DRY zW7OS4rH4`pJOP5M4(y=n467lrruL`siJ|Y(M@w8hHk)Wv%J;#+Pyy#K%)n>l^-Jjd3l_y9b&YtX zFZW0{yU!h%1!Hf_c2EtRsnrRx1aNI%6_Ao}p~p6}f~JNWXA^-W;HM@Mu*bNdEZ_ZY zM8mh8K_oE~%L48M`j`L4@u+P|4#%X663r?_o9=rH@;gLFzS@M1wO7|R_<8s{=5M4B zC4C+->VtoI68~~Yh}SaFMW3*$`h?a0w)W*83h?v&b2M^w{7drv$5WW5pe;N51Hj|b z@hxvSa4>MgRKFP^Nyw9)mVg0ES_;#(^YrDEJ-%yNfXnh#{n~d5vZsbG#I|4sp?ay% z0`HvT;XZwa%jNmy`hX6E?rKyp{8Gb9MWOJET{H^e(003$4p72S9-Sm2uZ~kzm`$?m z-P~m_%9wMKLzRaas^VRoXS5;?IA1RwzD6+H;~Y78Xq-_S$(jF!d5UmUgmkW@K-4SE zJN8Wo88usKD3{D(=el^Y5;7mZHTeAj7RR?B06GineX4++bz3mDuS$H!RnY z7Yd}Le*KMot&34zTo-O?gr8EoD7uI)Pq9_?<)t^~%j>v$RF)r3m5A~K1B@y>r3k&i zX^;oojD_x)MrB0Q9)<&A=DL)WH!>~EEjQO5n+os3xkcq?d~Rr4teUUhd|YF3zid{^ zDk55jqzeWxEskwv(=a|HuzAM65;3qYbQm0miNo;@sHki8!w%>!cDjZ}t-4TM!5f56 zZ9MvLbaTYFhqH52Q+Y$PbY_6lC=A9bx5x3HGjsj``QQP8CWaXmrsBvNy;g7Bfv^^8Bf_fyuM z9#cEMu=CRa2R@g*D%d7nk!fD8$|w+AG>r<&n-1X#t5cdh(mUL%=QcG1j8iR`g3FR9 zMC%ZEdyaIBdtus$F?=1Y9G6T?&+x*~Ul${kfv756rbN1jq|1dRM}ozxmF}ro32GGA zQMS#~;YSHcwCE5+AFLb(i=&i^C?omL7HqInb!nVMw2nq+pA-2WWk!J=klS)Nk=C`} z`u+e4M#&q#Z&Y4uBoKx0TUi@~>zhpdaBIV@^s)Ye$5MIF@rv)#9`#djnznBF8SLK; zjznxKI`C=io6o=Qf7^8TkH1dX)zQe>(8%z=4gc9k=j!$!RxgXzw)rfW4%nEfsFWkO zG?LSWC8p*4p_U8;D)oZrLFGb8YaF%3B+n9s`t8JD*EE9Jb$#CyC6I{@p)&&@v|nBg zyzuf4+#k^4@qsQ5lm}w!p|^$Q1{rVH4GHUS%ZXG7#SU^WL=EOT4Cm|DI)3ixI&w80 z!@?jv?o8fW$r48!uI?1{qklx6ga#2f@sX+X5G#CmAO-eMO2tKTvM!ru3m<;vRGv5( z$g1AymR*FEB8~~JZBDE}#j?(K=q7*st_%l-WqwrZNu5R<_R0Xa zVJOzWgNJ5US5Wt@7PcnKIXT3{q<>%iXa0#e4?Av&O9T`5le zH7{WkFS#jv7FpZVH^lIp6z+d$^n#?zH9}tR)rFk07LWdv*_h+;rY45<(@s1 zyPrd#hYOC*5{u4tPjDiQz9mK|TzT)ys{f7_P$D^k^iQ;?{a=tqDKl#$MI&21`@f=b z{{fOTd2NeN!NS9)W1(+pQF4`IekB|&fkVz4L?NI?2#8lno>ol?+i^Z_jv1G^X(|5x zjW=lGo&0K?G-wuo-mCFowdEnz!({&@l1>NI(tt?7|5B?>S)tIt&KxFc$&q@FD~nMb zAQBvW`?E!hm~?@NCrZZsL_bBgZpR&nxpmZWxTF3qDQ4zy1->o(Vq8;!_iBFI3qcwYnn({?{(r^tlN;}N#cb<#qD5nF<# z6=Mo|ipIS<5>f|?07;{Y4A&7SZ=~f0G~JY2Qv!4+wLu)05dH~GbjyuCDZo5K7n?_S zW=|G&bnJ6HAo9nSbm0ko0zPdMxy{Vmn2on*_FVTJ(JG0h_HZkBcN=SbrIcy-X_De| z9`r;_`{Qs1Fw1qYn6g{dsJ~*IVOxqG$-wJ|soYanfj`tBhq`==a^Swy=L(a^f5_pA zssEe78Ij63ohesdJ<|){0>pe5&E)WJZR-hb_f_QP~y1pB) zOjCg=^UGE4En~snMVm?lRr$^WJPWtHn!{H5j0(J;as8NX<%F%V>|EB&c|^G}UtPZ1ej9`$8oTwBw-if8m%B`ouve7sach!Y(47El zpjmHmVih3vX?KLO5~3u5uS2l<=mv?V%jMjMX|;I|616xXgRF5Bse)TeU2cbA#}Q{t zt)}l4tQN2{@v{e5nVCOu1lw$lFgh%5L=@FgN!E`fRTo0W45rXl5zG5Dmx;V-!YQ;O ziAE}U70O|)H%SG3YgvqRIAN*$x8v*uG-&)WM*HnT2|iTqAsiaV5N3+EjxWcUkrE3C zR4pD#pjVCP!A2n;@qO|@@Q`&Nz%U+zX0pT%O5^gpO@Vr?c|&b<%{?w18tiQA31@!J-Ly?I`l)8Ivjns zqMQlcjO>Gm<)CfS-A0=|$ladzy3Y6m-~}j!st4tVSQp(<}=*#zm3lN$15kTXK(R8Rj%TS^{2|^Nl9_A z6NjR(B2V}nteoIXLM~hMM^1@27f6^_+`D6Jr(IBvW68FG@`KVBvKI?!1Bg&luPg@@ zq(5{$dYWEyFk0I2>*Eo+^NTGUML^)S+&9|DM+>^m2$OIi_x>~@zpf-NqMqq9Egsaz z;;lzI7mF9A=^(x32TUc}!GT!7>G@{gyJUd5H+8-*S9jeb{jJr)G2^aFu0f0QV)gbZ;K2~FoZ=i` zZo~jl=g!N*54?KuOwt`-mdR@zVdCPe`bG^kV?7tkTII^?nk{rmV}90nr5gb)jz#0R zT;(Wz{Gc3Laux1GgX<=?btLlL8liP|))uPZUcv9Ssm0h{2dtCXyU9>+hS@N1Mhu1G zlvm$?q7Sm*<~TmnoM3oCeT*P+W=1&afIWW?4A!vsRv%$$nrWV+L$!Y8fbB`HyS%4a zm1hfwomB<7V~{nLXFSuIW=(+6pFj~hmc(kf=VCHdns&eUfNTJ55qEJ#7Pc~=-9BRL zR=H$p-a{)raF!?t*QOI?mXLl(x>JU*aQ^)_N&x=>Ol`xYNgC5?qC5|dow7KoX*IK2 z>?Hp9T~Gs}0rF3jwJvS_*-D^?A*uh15=qvE+`O(*`s7gA?k;H=C6&L*3zN#kWcrx6 zNk`*aSa#XJG=lu4W&ogniUL0oC-8|l+P~>7|GCuNOL62AW&j>!GN+s4(0E?OX$1*f z1i?PqJO$++`2K+aa&vX*{BowVUika3pccP;Nh}u~{nV7?im0O=(Rh6Z>J+E0#b}n8 z9L{+hCV1GMo_A&lev@diAR3SdS#{A&)uy}qVNj5S}|JEIh=ro~A(iIANd@c!HfHh?x)N2gt& z!6hv=89%Sl=>3D-h5Q3zp|x2+`8mNqx_p)jRwS!&96{%%-V#|oU~4D2!EG|PnZl4h zu?s-~)@uZj209=L7U>Yi<4?I)#f=n@6T zyk_`j(zT7K(gAq_342cwD1~PhT)V*?7B6#TJeS+~!DazZ1`FrpMqFBD&oTu@EzkQ7 zdJT2AtG{;9jWrRi<{q9xJtuED&8aTjIX5bAtVN3e`L?u<1QYZsk1l||JLdf=-EHo^ z4=Qp$7&YPx{{wSc?Q6YaRmnc->gJL_y;e~q!DpahK=4nIKNmiqIR!nJ!#LQbX3`$B zTG20(b8QiHr<#o1#DW`CdftgS3|O}wvG zVC*qH=fWhPP#e8QU8kb>?>cssqKHhn4jGhD>ZKxe60vI^&5FD((q^Efd{iSo3Kr$! zAl815B>nocw17|uYYmt468bq+Dz4bs++ zzb$CR8Xx}4fN77<_!SlF&($pd$*hf_mqo`#P1MH5x!ne=Q-gxwmVYVx`OA4+gCJe_ zd|H{}lV(f&O-swz*#5U36Sp?DvA5E5{9K0nAC@osBQ1-?fDo`Tv>*Vb;{)c8EFc7p zQa1||h@VRdj$#H5iQqDj7_L_}vqti!d6p-JjbQQ%aO{dq07L*3@s1{JxSb}w1g2<$ z=u{$Q{&>tEj|CKy{c2R|r9GB#B2c29nI)e}P|ruEg4g!Z6_) zhj;7_0U_xg@A!kuu#v|T9v+U10UWNcB3&T>q?92G6z#}3p$La9$cgyV<6xG2FQ;wc zBy{C^zE)P`x_r2<8v^Zr|Rg>#}#qdvy%jE29ynpO3e^t174USNnkxuylU0`*sFSZX<6u6ivd9DY(0TQ`Z5VsGR%o*PgYE=POwLD}9LAd* zJlyYh$bOr(%5CZ;GV!7}8(Ui7m1W1*RBJX@m0)nRsWHQqWx{lwwchvFe_KU`6sOY3 zrfWcP#W4N=PcAK;h=P@FdHqcgyF4Y?96xiTPD5nLlp#(3h&t9v5q~H}+}yP(t#Q$W zCk<67H`$FKmE_jm-qFx^*6^$nF~S_5b-?Pl5^KSBh_YfFrN?`xvm7MqAb(hY>33an zD1_D%PK{QQuMIfzr7z6w4)5ASE6V`K9<{`7IEN2_vo~%!;1}H3K5d z&F=k^X2@fqbderVOqG0-;ZPJ4^A|)g&_#&QRwZrDY;)%2*meh~amf=)%GUVhFL_XI zK7~Z%k3!lq%~+~qp~whHkD&mFP?-xJlUVA2qJTECBai7S-83Bl-4TcTNZp!~T%q%# z7LD#zb^1tDUhf@li>T27k1E6O71;N%IvXs{x!8vQI;WG|uZkGKjBh0j&+-pbhj|=t zCX;ssl^sTJKv4ko6)HUTCk00d@2Ssz(bF#S*Nn<1}P5( zIRxAfi~xWTKq|WY-e~%6bPmO-%rd+$lEE>^u&Eq%bZf`Xm}=be?q7yP{UrpHWaEbA zKLsq(XPFV}-}J1~LW2MKuc=rmBC7&^(LygFsPZcTLPKoO1?U0t@_&k3#h8Diz$llV zRa3@E%R-vaw=BUrbT2p_HXRQ@;;E}0&`Wkq?{kpJtkHh(j90kKAz8H zLE0Yq1=D^+Cb5PCn-X1j_mS1vm~0ZiBOA{T9#}C&F?nuWr}p*^URIt^YvQV6`hs~~ zWV2{#C9r^leJ?}t*`NJluq0*(M;4QK&$BWF3v~#ivP^FHhC!rR`BlKL-rz-0DcE@& z>TBQ{IF&DmBaR+3uu2jH4#9Lfi-34Cu^Pvsx{}$(ts(rWl%%aOKPruZTeDoUJF~;| z0Nh>iB87#hbmAr8K=jbDBjSrG%3@sAE5pjjiz3H{GmcN&)cEl#;Uh>Ob1ihQxw{h& zmHg$IWwxo&>hM0b?0_CNqG?_FW4himk+7|`dQ+*MhGhH>OlpYA%W-N+ym(^7aiORf zn5)(RFEf-WweYlf3z&!bA=GK=J;oX^N^#JPUHtO8Jtc-!pEG+nKpiNm%l@n)bi=_F zCDoJ!YZXb$^z4Jle%5JrYbpli*pWbkgO{zU%NE)dvUaQ0eNaJfKg@cPb(v@SBfdg* zKt0u9+q!E4C3iaUM0?2CMvZE>|LTx6E;;LdCp!QJShQUl0SX&k11p?qVBwX&kEdpA zv`i8OQQd0R0y90Pp<*P{N>-h_H|?tqD!5Z0X6o6rXiO6)T^+q*8Cw%a={JY2BpG1Z zsJA@M9-wn+N`&#IBVxW;Mle*qLffuUSpyS~*2V6q9u*q_E%glu?bpCaV<9IF5~9|e z(wMik6EbZlIKXVJxL{m^)jpy(r;wFGJ!GZ}kzt;=2P|5jvx9V5qJV#KeqkqHc)=}F z1sx5R$FN0z06*S7W6Yp)L{B_GXSU}UQP-86HNU5nheqsY4+O`F4nwI3mw*6@uD)LKVZ(zw&b=fPoC+3F!v?b*fZWL`ATj%50 zA0Ra{M1g-UQ7#Gc^*+yhv%BU?-R{Nc(1&^Nbt>wkhA7%LSd>}AX3~5jjfdXDeCTHF z?2c2MBld_QTWVjHd<9{*d@|Ifec2A)LD}>4ELU$@WpfpwmUeb38oG0D`prV?4F;yS zN}$V4lVp-9KSCMzs;_bR?Y7-%*Uxr;>@5<-NVn#Qi<~N!+Sd@jA~n^_2aM$w-!?kL z;49%BM+YfRC~`FiqlaPUb;dZ`>Crz0xP!Ob2qN!l7DdZQji;7D>JSW_B2R7=YcCy`kLbf@Iz3s@(FH0!m$(3% zVel=~f{~8^PW*PJ!{Bw?K`R3ao*@Yf>?9GXQSAeepn0-z6|Ae^faVwYONgER77*on zV`A~>$-0iI6-dEGXSdWVsv&VIJyfbR{_VB)O4Jjs$vZQM!ckPML;hDd!=^=SIPwE= zSJOB<8NFna4+Xd=-bo+%h;1$kRCLcnRNw?PVPhazJhUhz-R6L+fGm;GeJ%=pc5Op< z8~h$$Bf(JtKLQ!t4pI+>uHVmkD3(zQJ5#^ZQqEOJf6u4t-UOLBi&q```8%+Jh08hf zBv%4q#;oZg#SWX<8%@uGK{EEk=PR$mEt`L5MdK}6#l4^O7yFYL3H(hb{okdZveuSv z|D*gfPhm>tFLE?PtKCeEN~PZihJvDzLLXd#A56folsg@WnVyD|f3{hz>0BVx5unqV zko>p_`6%7*>Y@QkL`uqg+U9Yd#__OP^Kv$jPyzB&cSYDoPxd}<(|&LwI!ts3A8^f+ z5H-k1^CX6zGo6UH`zV)MY>n;Zi4su6xzJ5q1QV!tB$Nt+8|>QIvK1WNFC6Ui0doOI z88Dq5QMY75&Z;R2JI-%k$_=R6?CIkc%*!!wV&{cZepUfS=@&X9QDhTE9e-}Vh`=}w z)9bk53q50W-9{sxE;BxGA4wN?;$F0RQ@^(T{-90$VLV)WU;zFd9n~}wdfVVGYlW-cFz*qI6g=(594bCEZOz@(wsmOR|7VM&X|cV zXpjEHA3B>})BW@X$^Igx3McsacjF0}@vs5>wA<0C3#CjconZYWgwOob1kVTTMU2%8 zK(bz~hfvtt9mGX0ODbUN{Pa3VEHqYiMUo3yNoO7gt+4iFyygCD9rSU+ndC7ljR6XL zpA%*qe~-J3fhvZatJ&z+H9CPC#rAr%`_4!Q!vvFG``f|1STQ-9$Fd} zT&tRed^<`& zyUD2ImQNcf=Je)`GNuW2FKFY`?-Z6Gk6S50>#WZ#(B62b0hd*glPm+}u96FY=3MXj zI7;-p`XDRUZe40SD9$;9iQuHe3LI?A_hu-(ZI8B6j90wrj&yT2>9^#M-4 z4%j-MIw{3-dw0gBCe9_h>-gJsL3fxpOa!ZmZxlM@ybXivSg&tSl?uRwesqckJd7wT zR`!(Tf?gwRydS3@iY@W|Zd9+`Hj!4DCoq*pADX#-rX3ceD%`BQT)+hDl7S+V(AE_QRL%M=e-aUNhJO`^6o(CSU9RpKr z>+bv9ze)5V- zJ4kZQc^5LoaqH$k@%xGD-sPfO(nqHSyH;}z2-(E=7@@9gK4a z^|ol`GE-ZsrTEiydNaIlXC#|9mK>o(sdvA?j6)xzGIL0PJjvB;{JhOFwXfvDHmCS< zta>A>3jvNlGOiLjYh^}c%sLQbEV3C-)hmAkj5;khtD82=xrZEe3dnA=UUzM)5|LEHu^ zmbpM*BzsM4U~g6ZR*lDQxZ$|?_~#caKx@#sq$X&(cTEI%qp+?-gIQT*0n>cp7n{<; zRt2*MK_Vg|g;Qb9*GmYw;Gh8dH4l!W2+E=QMG2My_~auIB70W6p3>u_N}+-=Vu-n{Wnung1Lmo~Pvb1BDwXbP&_M1N;+xyY7WWGvFnWm*bM zr&2-WJBH`yQNx1H?JKbgHT#J2hb?PgU6;W@V3;AfwFSwOh?8Y({H;2LN8qhSO#~`M z#KhsLWi)zhXo{0%R~sx(^Ync-jyp+C`Y5ChgGQCKAl4i2eQ1QUWkCYt6{M8^ZXxkn zmI0Zwoy_<&#MCgAHVMgM*-qMGPa{6gmT}S>afknaEcz%s${ZWHtD=YCO?^Q9nC3$* zvn7QHY(9hrqhr|_XY=G3kPt<68j89#;0~vVrPs}R9fC$ghr!*pLy6rEBSBs&V!$6% zk*6t)8O9|JD4ODY0?|uE4XQ3sZgI(b!hP@D{Iw|rK6lE6bU9g^ytKi z9$ETbkz<7(%iVw!8RX+xs?5!hqoe<4@LvgZJb#z0>>ICdJ>1@L=f0z3t0h%tpGcPd zO`VT`!5;gxI-_006)v;{vq+5f%OX)f1w>4lieAe*`p1QG#HPxA z{$d1US`7HY?)Ngwg-ZgT>DD>SX|tU_UqwLhgp#BvIx2Q@7~figmGfimV5&w1Rf=W1 z@4q{}f=UF5>Em0KGEwJ;)>8?3GN=4h+`}Ea}<@xtWpt5y$In9a4eC#=r}b7G0n<1*Y97uno-#88#oPwBs}oRZS6Q)jB6Lz$lgvn& zr7E`-B8Bl4j3p-Qhd_`1;|8zUl{(W4d2QY_*i~x`#U%3!czj2At*1Yjp{nIR!^mbw z{>nFenI5l{Vp#?7rPy}ztUGOE{(9fxkBynDhet@2omz~Me5R`}#(pyp7i|*p?cFg` zLp?qiD{)7E7+>WEMic_fk}L<>mAH$_nW`fmuZUi20=)H~nloP~FEUqUFXX5&&~6oQ{tED};d-98)X`ZU zHI!O*R2SYWKM@=I=-Q{4$fw=y@kZhc7m2Tt8^~(@!+q1?^eUk8HRE(^kL;&eV-A%} znETF<3<|A}ln=8cDP3skuO-LiR_0gA-)xuh0c=A@8lL^tOa1c#19S|8a=%b^sDR(H zU=nO=IGni?LbFhdy8x7v*I2j6J6+RjQD@o0{;Fun)P~Kqg{wKmNteit!@JpPXwAfb z7Dz=go4AG16#JNc+@@c4oDt!#k2m14Ne=~g`AM3|;~LtFj+f_GQY6Y{6?>(A#1a$- zV}R8y3}`QV#nbxgv!3BjNKJl3dK9cvJdDo?Hzf}I7%hi=R}bcpwMPF5^cAW zK$E-E%~i4D)2m$CX#&P(91|urjJQLgnTuLH`|KY6PTrHCS2_SQt52TH$|nuXGnULX zmZW=m(@$-=P*cu3i$8f}e;*_}$FCM_@!Xat3L}r%4 z;m^r(kA9@$;5{$ZznF0rD=OktCBG^dbBmrN9n#X09Zj+vBUjlnKLHBwnn%NW@<{xi z$gq|?oNuuI+}P?dmbQu3WIhDOR@L4J3ecnd@ZgwXcjy`@$Z&X~>s(KUS2|(4_yp z&@xj?n%nSh=re2xy!k8LTIT<(Pt;uiA?*|$b_s87hsq8rZ9&eW_?4IwsP{|uO@Fyb z4=H%$v7gGr%xw+MsC{mQtq;r)ev61!7E}|=t|K{lLhlXWUp25fAV|?Drp+udN7p=x zi)oy|ExVs}hd?N!yn)@pq2-PoZYD(9P(6Tim%NA15iGx(HRGpIV-EAOpVvHqd8U=C z%(Q_j0)6c1$|f+3a1}}_czqm12zT0qtt;)(V9v^Lm!QItyKfAy*AQq+nBE^T4c$u& z*3j64r|$jst0^Xj^Sx|$U0E%1Zqbj0z6$<@{bXRx6$CGtMIBIK1WvviPMw+EZblowzm!3LG@1%rzY(T)QIO%@ew80lA35l% z@>=s;j=+1x7GC@4t3@aLEP*FAUbdo=`(gH6GqiuY?<6eyC=VkjSL!_ZJ?sMamkL6e z!f=8Y0~tymSp))s@Q7`B5(uWmF{#&(z+vuN!n${WW?pgVWxVHet>XYV_ksFZ{FRG< zj03@-;K<}FGAPDlM#C4r zL!90WxJ_%}7xsDXP%@V=(O>hV-yz!s(PQOlp(O*%+Dstrc(G?8t_~A>a-lkJJ z{=o7?_7-Ow?PXfMT5w#jw6FGaXJ`_mM!Q;t6nmm6PtW!I9DKVoF7LUbbU_veT(*B) z?*zaltoH&iN^iE5w_L*{8Pz=Yb}ei+;dylgb55LAFPk~TR9ztzE{Lgulhvo8XS~q6 zT{OCtyOA-vC7E{uW)k@Cc9_@58gEQNw~hCd(((YiaKO0Jm)`VH?^YqsAkD5Cu-s#4 zciL_TQtTqi@9qJYeuFWOqRk#2?A=fJKcSIqDj21aEz#s~sF&pr_;gMj7Rcdk&sD9x3}XOEFqGy{WMVcVKC|+IRiaF zaR)u$FFR98mbAdvBjpt>eozD3KSA-vTIjwOGgBdIMlyTo4TY9~`KGXE!V$eZV(x+V zj>gzNf4#cUxUYP!0UGH7oFmCh?JaR9(Me!#g+D4?@To>raIbizLp~_KFu;z^7oe61fi;EU{t(DJbkcIEtpL^kJ7qOOr3AsY%*Zg83Giqd{Nr*EcCY zCT=^k6|G7qn!QFGFXTX|+><%gZ|?T!{GaDR61=vi&+ZGs_Lc`H9h0!s7Z|_v8?r103%Av}b;b+%$0kM)>0h7or$Qq1 zinZVnXoS=1k~Q^*`F{6j7L0b}(jve^K=g$R>hI?y;w4Fr1P~du>*|V)66}$SK+?Yj zMY<9lAYUT6i@s)uC35p#_c3lT#18TZ>c5jWaWhkYZ&S7liw#L>vV`Fwx28Y|Wp^^Y z`L!Z?0wT*430rgJ5pT7d0JU{fN<5Jj72fOa=|9#7W7?;xo=Te;v$ZZ`^eHm?DuEOlzmTIiUU8%Z=kd+(d)K~ z`8FXEi1~Q=Ti}RW3xvZDv4#4)HwweZ`V1SGMz2AI`-216&GLKfe0yamEYw1v{yEtNjo~i7Y?(D5Cf^CyfwH!8W0}Uy`oqaM1dFaFj-B(e7>4rc80y^Q)@1un8mtfK zDQ$yVnD6$N-WiY|zvUkVLtYpce&qt-SE%j3O^i}-D?*Xag zDR?v_55|0N_GM_s(lm}!kE78n4uTZFJ$EWBC24i)KVhOefu%su z$3SV&7%HxIPokYfWDh!oSYUm{#c}KNqBH?69baD}Kkq2xz9_QR@a3%O^qoDr`G`q6 z5YnKG6-OnBZsDn@|0woGUL`t3<8iKll&(aiz{#@E9{-llvKf=z7uBk;=OvcF9ckdF zuh<^sn&zCVRc1?EKN!{cu<*}F#9t{SSOq=0-p{C08r0wKR9CREaTL^ZaxfAxvv+X( zKgK1>l(bzil>uvHu&|Tj5;6LM)O9-foqwbREtusr6>}wE%wW;a>}k$GVhkzAH%Ac^ zZ;tV%SG)KNj0DeF(F2*TRbJDn< zU$uBd-vRlBkXr^$?W6}4VvYPe-bnGKwM5qmyDXH)OKYk$4kD>u?+LN+iJYj_XVPVV!4>rY+EPVH)^dB07)l)3lkWnE>-&J!PU&v&h80)+lz1Kb>^}GexjP^d zX8TXV!~rhGby6w3B1^6Sm0kaqiM!8jA1KuLvgjqT2@*Q95+k8hp?85)*-wyQsNr^! zT`ijgNGE~HB{d;ChqBO;WRuT$goq>$>Au3NBw_Y&h|Z;1cTfR*d3E17Px#B$2i{3!-b4CffUgMVe_Zu zGrJ)O$gDRKiVi9uTSx`OAXngzy$-3WNgvGX!4JCo9NiO-^uFX31RwTD1+L2O-(B(c zw7bz|9^&{8G(kC^sPrSpfmhf&b5ildPLNlp@JM{;JK;|k<4ix1kQ+C5ex4rP+x1Zl zA?YuXuj?K`t!ytX*9d1+)A-b;{rS~T(oIXsXwJIyVc@5v9HVdoUT)-qD8KYNN@gzL z?!$3M)=KiuNZGN@&tJGouL`uZJVT3XM2eC@;!=st$kKx&B4?@`y?|-SA`YUuvVijST@ENik`aJ*J zVxoT(dHjzIhEX^Vd^bJ759gPL?lA=dHFt1aus?Kg7MZKtHxd$ad^jHLFOZvZL5@H0 zx4NoJC$4Xtyg}3qk_|F{*aJv8rsf)UJ@eGZi6d6#ziG3JAY(3@<4BosJpVDsm785< z;IO9TJX{u2O1uhW_;&MITN=x-n7>T@QBq6!MiaE8o}khe)D%kV#g^2(pZ;F^GUX9^q&A{Uz=u%DS| zx_~=ulvZ6L@fgbghqUj2r~3Q<7ZD;d%2u-X%*d9#w~S<5D_nb~G9t4?GNNRJiVBfL zkrlEcS&5>Om5fOK=S}1DHtxOO-~T=y_u=z>e7n!*d5!ZruXE1poFhOLbLmNKZp=O* zZ##wWMN7jI{&gSd#Kx1UZV1ncrboZaFd}u)@c%Sr8dx-c4>{P^wzj&;@QhpSfF5@7 zR4Ny}@1Xzw`Z&g(g3h3+@~Rk{Ht#Qbrzvq?DLl?JQn$LF!}R4qC$@3_ESJc4DeYj_ z6Ze#yniC|leI9r2ds$P}d|lRVXs=|D+07%@EcdHit1-N)xTnI!M644xIP0iH{Qgh( z{DK3@AL|-+*nqXeXR<6_In_)@+CH^5mz-R*W_^9&TIkh7={6!c2StO{y0bJt2cFI_ z6=B8B8PJ{`sTfb>vbr~hTe@P#+3xw{rO;y*dP_VJ`xDBQYytLn5!uBWU&>?2#W>n+ zM*MZ}Ui;Fw7biH=d~X|fxPbNh64|w1X5#GyxlFY7Zbri@7D^9B=sg=(FJ9&|qasg6 zK51p0%z1WhUbE~Wm15b2IqZ)rN z+4w8ksyk-t`1>v||57&=X-*`VNX<{7cF-N?T@`tBp4~GnNrYPZ^1Q7Qw-|QNyC>j% zF&k2ib9OF7r|#1l&qiN3js5B{TYr5~Iq&7cev()1$L~~?(2*mQF3ORJdz#-WJ^0)= zIH{m5vEPG%$89o~gt8`atT0xc%GR~{z1@cb#Wv@`;pdvE0?#`~OQwb|B@9P!UB6y) zSEP;CX-2vW`v{{nV-{MTg)~~CrhJHLNCiF^291u`a90&lFvFJ(j^f~aSQd+ zrdE3zIO{GYbNq_bFH<_1RXwvWOWRlA6?^sj7mc(;-^K>I;w{Wo3OlujSPxxu!%f&N zz|2b4F3`zv+bhHOAk}v!QP+@8W|z6^mp_LMm>h8nrITtg3%)3IeTFGFxkq?9qGOh? zp1bAZT4dtGL+oiboy;{AN68}{kTc*&qT>MYSOuz6{@&{}=rGgq}rDym#}?$V$k``Ksr=m*{o zO=z%w4pEWMCUZO-KNa+!jtGUEOjY+=Kf&%89;iOXbhktk;pKp|-QkdK4mjOS1`g@& z(+Stg*U8K2>^pEnA$lm=J>nA8-AICx=%a(>73QuH`L#s*^v}js?-CWMa4>&7BT7A* zLT&xpzmPX!*$dWgp`LQTfLn!XAlKFZo{w zvq?yNU3nUskmO}SUvdU{7w0TLIHkLM@VwE;+FfQ_#$y@e(k$8cmIV%XeGBY6PBZ7< za#)?cgkF34262Ui*cA(7ay1uA)kPCLtqVw^i+rPPl81`m>MvPJh^!xd4yHxj=PRg|5*OG;qviu~g#j>BTX}z9Uwv7A9 zA0ivu+|oZqvaZ z7nw45R13_pLxjqb5XRPUdXx=lkje zcUuuyN7p^<3YR0YzAv2Rpwv56#r(PIwtDCMHQvuBuhYnlNT`lJa-6&NU0-HFzidv4 zjFi;Xd`UoPy2^K2YH?_8DzI{X+V~`{+ioOB9=TXjhWbSO_cI?<`y*{9TVgV*s8sE} z8w9%IE2k=yo<}hkiCtH#2zVab*Ke`?*9KKO z)1-5rDETLG@*pTb-zj*nJ#nHowfl2U>0NWLR%d3@_ytwJqi=}%r66SP5&sH-Ch8H|;O|AC4iiPonUIUlvJmQY@w2KS)nF z#d6=f&HZz$&i)$d;EKo(rr&ApRT5-F`(L&|gVyy)(|A?qHyXVzS zXi_twmpQU8_}FMJBIbankdl@8jV2nhXoK|EdvocG!=!zOymkkSuJHvXf5cN(!}j{+ zN=Y(&@!7r+M!~&t$C7+C`>lg&EX@3e8+3y+)GNpZdB#`{Auzq6!i-H-a?4UUIn#bN7#ABO9FK}C(Y|- z`I^_xULk2RT;q~Uq3T*@tB&pQ1i=Y??7m0%l1)ozo>wuaeEe9=z(KiqByTw6*{^xS z2hKf>pWX(`=Oznr`_6du<;^gkYK$UFYVn#2|LIwK zQ=PfqDtHcd*!HzodN=CztE?KcZo)1KwB{)(vqRO8hTcPY1TwA(Ssc1lu zt)1$Y6UlVUN9@t6ybN#0$5}h`=MfZVE}wPXTM|VwdIXzO^s@7hrf;(~(o#%smjoyo z8`yUDb^7pHdc~HqboWgWU3#4tzk7{?;1>shbif4r4c%GC#}TWA7NvcsR2;stm7Tz1 zz}qL@TXj!HDTyz6*BJs!-5JCqb!4WqmVh*#o&DbM(Yz(jDkH5XQ|+GevesHCJMj*2WFKf^6S z%E+J|$F&sqY)Ir9d5>aqm96Ro?ZSggttrf>?-0knKQR6{{n$vEaMv5G>D#}MglAtU zAf9$K4N*MXyA=5~S|;aMQlK8gT^apZ&z~WI{Ty@QnrBAebIkXq{9L*!+a<^5HPh() z>1NijDDpI^jnH1nSlf3NdhV2b?!_&Jg>>m=_quPr-DR%-AchPFF~(A5V$6Nsu=3V0 zg4J8$V6piTo0$RdfF1e5tqdL-o3G3+$aiK}5yJOI4GF%81S>l^5A2<7wR(-MVxn<$ zaF!$V)c3Sny&2`PLM5B={QYN@wLVA(=|AFLNS5v7JbOO z?-`5CPR{$k{Wc`oQt4Z~xbLM|oam5l%6Lb!{Sls-srvCjI?eXf;lN9eLX7TFx-|FZ zL?XWSoUD<$(_0-gW2p5;ZnT*A3Nmnbw7Zacv2#HB>sWc3Ua2#llvqpI_tjx{e`|6eK8O4>61REX zU&b?sycw7x7?rRaW~i3=vbzB9THA>GrJ_^ZgidW z30jlaVQ>GjR`cV0P0n3smOY{l8mY%T>6M&tQ^I_R*(!_$WP&Q$lDVE|e0ggYBGgT8 z{vFSBvALXEr$+gym3m&7wq5}7?W1w(egTg6#8QptcQHi^zLF~;x7@?<(c3>czMkqW ze$MUv_9YXu>G?0%s-;8Q$asqkm*}Lm@5o($c95#r7N76*RhVK(v`MFzJtQarz3z4cvE;N&S5hDFjaN!BtW(xvimPnH;Xb}y|2 z{XB2kg{Z2h=nIu>=cM}eic{suUQ?&dXn*W z&14nX$=4y(&XvKIx4&?xsx%=JIFLP-HPc29u4st3dF4tLN6~s5G_Rei6}`6a-I-W{ z75)gKr*?jt@zcx1{%^!j^FI{-#ucj7BE*_--Skuo>u9510rFyi70>iuzrp^5^teVv?ul+60%~t(d z{?7>&Xb~(jNx}0csG;Vk#=?@qupDRO+8}T}t<|O^pwz@4ymUnQYs!`tNyd=({E$_o zcFq-zBwd~M^YH>Hy$)pj1O(~=l^Q3n1UG5;&DD%4ag{zP^|o}nP@sF~fDYOI=swf? zeLYT-b}lY=1{XVtqdKRnM1@kA$*q5Vy2Lm)?v7cKmC~wV0JC*+cSVkI-7Q+;glNJ6?D403 zcJ>(~6v?{ucL}(QPP^VAeBF&p+yBLhHpHcwCRC)9YxlP=J)dd4&mF(y^COL0h;Gu9 znLlN~UHy_NPe69t43n~~dm`t4F&>UWfp#~?`}ZVFjLj_j>72jIQ@UNfw)cY%)l(zi zgq*ab^LdmreS4of>`|np<HJOk;w{q9*1)s5BfR=taSAkhj?qO2K2T#j+ zvxu#8-y<*8G1c3hbIaOa8q%ate^a}cdx&=7O;24#g`Z0rQkP|o;JN{$NyhQPiv zGL!P{J7P`L>6s(8*O`><^ToPPtelT>Os>(NsL{>JEV@0&pEkd6@o+l%-p}y|28o*e ztvg)2BSx_gX3W^JohO?fk5qs6;oDa|O2p0PTrX-P&E6O@^}u^>+?;Msy0Z?pDsi3$ z*VV-o2pVV~D_-~(t)zdT=t{|Wz8K?PhjKq8volNMxE+&a`se$5bux$LgZ0A~oU)QS z5XqbetOVS<@1(hB8C4v~A}iI4RHHm-BXJeqn>KU)5g8%&i&>Rr_2ruQeYM|jMXB|C zdVjGa^MpXFv_kRzyLHYJ4guyu;9YNT-lRk9QYVGN33;xJgmOB$QwwA*F3<=Pz7&j) zGgV_RX^fVr@1Wtxm#fqJ%vVI|>F|NLNT-9Ha^?#?y&QoqUn(x4w%>*BD-RR}9}zAI z<|RDp9B`>Wsyg%b&3==7Yf2-bBm$Z}d|KS&ECNCltqJ$>TnG!9Yr?1VO!lUqii;?t z@geF~>%1JbuTh*uJ+vp67U8%eam1EKuf48BK+iJY*rZP4?(N%6n&oEoc7!PkIrS~n z1e~Vj5pM_{?f#OqCzX1BJ{XZeT8oGK6uZywE2joOlV`TLGd=DrhKA?)PrlC%9BzI+ z@igI-Rf2Hs*nT}SZt5IoO7U zR8XGDXGcBS;94NF_l-=mRPiPS{eA zw5o|AaF*<8b*|*Wh#8)@m(G}-nvJ{@P{VEW+Mn;_{!dPJck*4VpV)ZQ(rDVaTPty> zboJW=C9#@yWYV^NG%29qLn6xdN58uILATk?=k?t;SrYxCkqkoy6EQD(MSOcrt2s;0 z@^}U&KTqMgGVcBP`*fEc+p|+OMz4NE;*CXco@M^wfuEGUIz;-6xiazwcrux`gdkX< z&TQ#%7YVV*fHPf`Qke7w;k1B8e5DwMNRIqwKEp~L3mK6*?i;(BHL`>%-$q*slznih z$Wgt!sx%h-F76Y9Pzi1=xx&7)mt;7XaCZ5JSliPyiCUW1-MHMU=2T6d7SfCz`;hJB zbITb~+;fOBu?&}R=bIzbkMdqL7fZC$Ih@94U)u8|X0|w-m@8b{6zBbwj~z14+Yv?% z(-RczR9#AUzdXH8GM90xs!@>Wk=1zhB_dHZoBuu$ZXo)lMcCN_{YC)%(&cZIC$^*?T$6np^`hjnxgGKUCTp!ef zH2b^uogrJBYdw8Q`(gFvX^W}xx2N^RNAHL#-e`O0cr={|w<_(2*|WE%QvwXSpJ-nY zS@xW4`R2dq!MY$n#}VkBYo1ozpXB~1yZB=|foRm_P;0gCvv>7ga@9H)wtX!8qQa~w zP#xy}P58}^56$oUj#ceSe0`NJB(SW=mh{&#-6Pd=6Y3;>Q=^}APRwQ0$meV1_fxB` z@_tcnFJn|U8nY0*_~ptj^Hg8)b9g#3=Mk&y3s=RmSK06Seo9qpzq;>~_@$G&mI0)b zIV&@VtD>hG2<;6%pBx?|$oVl99>E!fV#FWiJ;pnO5`Wly5Vgc6rB&7a>>7MK&nebeeka+}NK$nl&Bd=k$l znJ{Lo!2R~TXFb(ErS;>vjc0K<+x3^5A>R3?DkPQ{(~0}~G*u@sAIHth%uaQV4j{Cg zAsSYHqIB_zpyt4b#PTK%_k*|P9Z86p#RJZ0TlWk$e!M-yka$exD;wFzWh{nQfr+OQ z(>#9q(VRc1g8ldb4$Hnbg#zUZ+2yvjc5lCEWo4fCS>|{_>qE+i$Mi`px-lbcxvZDH zF?A$OdG!bH$D#z`jFRaGELKVK8M*W|6a^1`KOVwEC=IJMNlSi|za!Zj?9EX9OrpX^ zszFKvr$ac6GS}J2AylDvSS1&qV7C=lB5r)cVNV2;vE*_3ry7iVb6D`)Z=Pg0OWI~< zXxAh*$Z-DR2qJpX)koFHQBLS#ZBfP31JdOpq_uyE#gBoTcFO-Ps{N z)^FV_5epWLuU2MxotDUh!yks4nEA*`ESxP-yOBiS`*}ErG2JnxX1<#YNuAOE>E z1DaNFf00rS0_)byU=s<`D+V+Xo}O0rTkikUZ3dUVQAm{)Ioz9GJpEqDG}gb{le zX6t}UKw~a22Jqw;hJ8cO(X#Xjs(Mje#G!BK>}uuz^ywnoKEi6Rqfb_EC+PGE2CF_I z_~A5}sN)cBUlAj@%*B4|IF*m)O%i00nS?|XK*l(%$wK@dSY#z|GfpLvFENC_Ns zUl~hyI$dt})WkZ7VWC-Q^hRU%do6Htl>5j1L5mt5?4CS1wT?t?_q=dpLSt;(T3U$f z>9X|C)!@G`Y>>Xzce~&Iz5WK+)b#XfPv}8MN{g9MgZb<6-7q)$NM50_O4zxHaW2;2q-05-&GavqDw_XRza7j>kH+QfvPD=wYjdUk%H| zAvvAEs;gA{hp60bSK@3W$8X+#nx_lKTWvz)fH<*O>XU(#i1w5A!cBDQc-DoS(Y&gGqje>hl7VMTL$b#}H$yqw~bFv@5KFVfyx8-NrO} zgGdGV+#&`Z+r%|wsYp22kD7!@7vsF4v|^h%$Yel3j+ePgYkf((?o+gK;|+Do`h#K4 z#Uh8OfWinHt)GU`eG7}?3F=7Gj$o>Mub@p@;4|!oe5Q~;iU4)Mf=t)nu8|`5e<{59 z#Ir51Ji}8vE{Do7Jxpt^A-qH5A=jYh^3+H9r3c*)kv~F&F0JrRG-SRsQ*^fKKYrEi z=k1d$uXWfGua+3Napw2@w8J~hCLHnX7kjeKr#*A+`z`VpP0Zf5MlxK$$y<@Fj`{Z5 zB2mQf1;v$`f%if^8CRx59{ylHp{V;-&-CW~yY0{LIMpBK@MpD420Ukd?|$K=_NUkq zTh%uwagH^;9?U*F{ht$akj?TAe6;@xy5Ls=%=ZKpT|K=$5Q=^_2sh|5kv|t~ZoDc~ zYGk2LYe;ogtJtcGg+jgmlv>?)98HzRM-)z)?D7hvPO@~DQv^q2B3d0EdcTc*vWMv8 zGGBqrP0^>bcyuZG0o~MVn$wkT1=FrIkG!$SW$aG1z408Ht881zSp4wjpo}ywe;fed zzK1&TiasR`)2CPk#hA=$>ppA$z|;EWr_Xee5#dla4EIR*YMvX&Ft8o`PBmrl>w>Q$ zUTKGQ{fz3egMO7VOGDBvj_8IX`?Q%p#JT00eNR93)Tzgr_p@_2@|W3)KAXgph(^$Z zk=ITi5dO-&55+XY49riJe-liNPGWHyNcBG5Zx%){A8B>@{jKLN{qgyaWH}ymUw*=o z^-9yM)}MLR&BC_)a$%)#Ij4nXPfG<}xVn4g1uOa8f!M7V%8Y!|i%j>w)+YUcFD@#a z?WS0V2tPBvB7HTNvcb^Y=Asn;N=b~?vnxci9p1_+{fwRE`dO60z zwI{-*C%T6PY_%&d6e*@^u%6_zeG*%1z3_G|U^a50fVrIvS<<#rN!zq0my_w7Zj(I4 zS-mg%8yCmXxF2HDFR&FWeUf>8cp1Nm52hySD=40%u^#%KUhUO#`tsrgRqdOr)zZH7 zi665vDyF<^5u9oJmoIhBO_qH>)VU}e>*YjU+R+i@@J@f6V&wZI0qdR)<#&F2&kKFJ zos{8no#nOcd8u()t5w^Qi2A*c!JXL8eyrd`237v(a&RS4cxTPDh%EMXjPu#zkPWsDuD1rWz?|} z(I^u9lv||-&a%E}3tOVDY3p1TXSY9jD9c)Mi8gXosXt{+{sPk=apEuDi@Pqj@JiLc z9pGb^k~i>|r@4B~qwSX;gFjh-l*TS>wGxowU3GNLkUVj-c#NHO5u3#9>y^xire}Og zfp`z7{64K*zWJ#1D0$(Jp{1734IR@L$tIHJg%+_37)v>ff9;0v0Y{KcGaUq>|0pOg z!1M-i=o-)+iVMKi@qcdscgW$kw55}=0#flECI>{R@?)mM+;pen)$_AUVko; zX?Uk2x@1CX%=;6Z&$i3mFQR$m)kx)7#`MZ7sm1P)|_I+D`9ry)e#P4 z!a`d3JT{y<)%MXo4aMC3r9KfaiBr2@J*HE8ukwa0BDigSjE>NxU5D9u5T7f$--P)C zH{}a5%a^iboJ#ZajG(sQgS!5t#22Q-n>GZ#!rbIWxpd99Vy;rHF56}GBPUGiq=-+4 z)riRU6DQ{UTauVVb=^>Rx3Fr@=!{Mzj#PlJ&K#y)walCy@+5m+YUxy&_uP5Z0WAJKrD zj~?8}50V{|+C%Wkxl7l5m#1^_?5+jz1q!lDX?xB{?6$afPCn!Qo24l0(J%BKu^(Qs zs4=?x8dSu;%@Hr-MdkdyMr-yI` zmtgrI3>>%K53av)-)QcjPp0z&109Zo(FdKcHFFv~ew}$o1ve)*A6FZ!~*ldgmN z>KI3&*RaW+H;2*$&B^$S7vDRTm{;Bky_QksSv5ELdAtbuZdda2TXFccA*(OOk}OIy zmNoB;9iwzbp74nkO)GQ}DNkgYxf^k-KBu2-!qp=2Oc4t<;Y2$X;Tkqy>8b*=!WAYx z#A&sYNdEhjQK}!`_-DPCEI6fdP1HZyOk_&DCzZ&&jYIGSvLb^EDRA8L2Ql8g4>AV` zj>ikP#~%M`HvSn;;YKjk$V&+qS>=PZ`41-|_w>(4;rICG9O#*GIoUrPeCMZ@PJ&@s zlMeS=2CtCJJYw@Y@>&Qu$7-Z#Jg9S6Wv_bKeyZo6r8<0?BB8PKo<<`V z?NRA>?{m2K8b_wYo&FxJKSdqIy8lOrs^%WE9)UE|TiI`peV_AE{M_TBb>><7F4wON zPWwp$?X1#O99koKYJC4hTktXm@O-en_V)vdZm={J4di%KwUqc=tb7ozd^`W+BU}Hm zjh&4ZuZ;t*JJOREl;l`j*_=iJ06jUmiETT8-#|Rj|HtEGds=|^=wDELEJW0_O4F&K z5;jmYw3lh4Xz2e4>V|aT^>cAT zR9hR!=bvMBeMWqqS%M%`WneHxmHM6g;AL)yFjb98>N?4kic8fJ9*f|H4WB}Dr5~53 zJjajUzxB@J@r!1QL7Vo8`9b6*2I=6#@+0?ERLJ~GIxX)XlTTyxxTI2_#e;wI=!?i1 z&8#eUstjKxW8OPI!VfPx&Jb(vZV~7l%QSOrcIyheJ)0@>jg{f~5RuF{HVCn-L$mFz zu{5e=O{^~xX0Gp|>uyR}X$U&w`6=luO?4w{UtN&U>aAqzyZ57P1Q8ux!fZ|L7BWt! zkINTuWJcI=dc9Z`zNuhrCR~5JM&0D@aWMC=N8o4jPw3X?#|6Asm|+et?@aP0l*{B=)!Lr_lR8*P&7W`}eS z<_h=N$Auo}f15U{;g)#M`$Dp8{!M9`uJe3FM-F6Kv*9r9o*PJxpt??X^~`~@Dj&G+ z-~8rzAv*H972o&x(L}aF4Z{9H^M^8CcUoC~O2#I069tx&Nb9+91wW_!VQpxF=coPn zwbE&V=~-eFo zk?T5NZ9#hTIX>At#FRZ9gdA9>-R}ga%BjE4%ThQ(PgZQ2ZAb4hVr*&P^A#cD)_uik z;L-TNRV&kr2YFwTJB_+tclF)-^1_5`orNlKyplaLrJokl0e9L(x^7Ls^NX|hcs^x> z-yk5Ql?nAwA?+2Pa><=8_P8#)ERdp}&)$20iSSPC!tCT+aasbdc(96HaBRZ!UiQiK z8&}#C0-fy-(Wa+ylHa)2t|3YC^Fgd`+(X?8-1v%fXZ73)M&3SSyAl(5)5rto*n?eD z)B9d&bC1bukrO)gs$7j9{NVat%D(zdgXg)g7Uv@_+~MhUB(;6V9@4)@n~sv>Xol#_ zh21%7)Ng}~zmf8`94*BA_{@^*exsTvqxnqz?GH`H=B6a2(YC5j&(~o;jXQcF>e$_p79~p51ZWh2ouKYHt%Y5v~Ih*t}~pLWyE!{zgB>hCZ33jU;;1C{)Byl_04|b-HLBtwqL>B zB}+yXmluDC=!EcvXLEUHv)+)&=GIHLER_(?=>NS0*v-~mR1(+ld?oc5m~=zAd$ zeM9fCr)p1Ig?cph+UoLn_KJ_**|&K&`nxEJrdoTgg^0orNA~VcI*Y|1Ua@>@`E2TK zL9LHLy}JyB3r|)klVl8e?qj4cS6*bGXOQ&!M!`t$T%nD4L5N%SDs!-(^SRC!S?#=Q zoX*|uZzj{YY=1diS2`<8PjHuRH7BHdU#OqbZu%5HD$c<#4Xp}pjUt1VU!1Ps3#!{b z4J#q&xo4_cSz~p&fbz^_oW+5X$?L6?M@)>ehQ;&b7E3#P(qFn?xj4Fy^{vTl0eR+G zW@F{a!Spcs!<>0fOm3I|?7Fz}t8Dt+uldma8L8L#Sps4Mao(mv`9F^Pr3T0MKmC+s zR>#5o*iG)+vq7a~p+-IGAy)0h@1_iU?bI&}tu75dF|Kxg5*9`#lWmgG=pwbp=FQLG zy{X4OiLX^I&#h_~z56xGxiynOIaVt|h&1+s`ewMX!Lz<3@6zKZ|%aUB|h z-8_(P;B{$7gr~lbcB?v%8n>#Zu1bNyj3&2w>!{vBYn%QIXR9uMi4On$5<$UI!BQQ! zefxCz1^I$Uo;cCHq_p5`WPZ8eQo zV`|)-O&aPNyt~vCE_lhk^eWbSNIc(C4wjd9VN>7`0wK00NMLd6_lFc~5-NTFm%#k{ z*@i|2d}MT;z&{8EUkd17{{CbKvw{Emo1$pSX{jnH>KpKCD*ZzM%buGuGcYar{eg&U z!GA;P5Xgi6wRQ7P;B6iI^An_pJ?v-D#>gLR=r5E5ZhRmnVz3Om&IJ9;)7ehg3HD=X zk%Pd7&xfXF6Qfb*NbKae1}U~ajtM;ix}zaskcBP{4wT>tqM$f;q!+-z>R z>J2yj@?SRo&tW#Jo)*RpT`&Kq#Sr%&1S=aGuq6g-%4Xdif&o244dm%)huWNsFtlH& z(OeO5u+2?lg@GLd3)U!Pgupxz9^kEen7Etu1{e1nYD@<&7kCHQ+`_}K7CuFd=7jXH zg63%djJg?)9R~Lk6F4gyXf+;&x>@8SFjVLj0u*Y5ROpPxE=(}MP}G24NEaI`xScmQ z5RO-i8qdzr*=v)HH}@_$9u5e{C02IY6aAIn?ucJ8#BO^cOEsEtu?G+ zo5L0h4670?mZyz}qZ?{lz&&~mHKY^5%gZ0u!p)|I`<^s742r@Oe@?vqw~K5B1VzTb zKTym)w*#OJ(gOi&7iud!LIs01<{kReqV-|m8!9YkD}SUn+yJOs#t&9Xw$s?UfDT9` zv}E%yo@`bYJ*;KUsIWH2;>}QSzqpMK%F`1bI5)#F!&)|m77l%2hxaRXFrx3Qx6NUF zbL-$(wy3bYy&O?X3Rm1sR9M@kI-8pYk45iL!EGIHHiN8ij6gpUvR_u1_R}h}H-z zS9sdDxusk%eU_oewL!YtIzqXI6>5KnM|>=BFa(VXHV>GaTM8e|1L!&@oygrZ2=@(M=NK94QesrPJ%>* zh)MbgcalO(;J|aGU{ZwAuxu~|e#ZoL<2g)J$s2sc69-E@JNDf_l5ZJJHroeo>7bo3 zovl1Q9c@sG47W=e8l){b^yWYXA2k-xz-^O8Zkkg+iw16sBSU2$e>)lY z4|t$?ga!_i#2W4}OK1?c=GL1%n&WSCp^2&(8EXA);9-!n!c+EhXkb0Ti_|vYtz}qO z-rQ0iSW9a#h1_nXXtUK1!Jvu3IxVVR=;Q*Q18i<6JV>acLE9!hf;Kmp_=G=U;$-`za zxNE;e59SK)3xj9pn-|F7V<<7$uRx_g(7tU}$WS|tE*eaGD?2+h*#q3jSI_|d8SDR> zI&9V?eA4(DL&VJ~2|gC&jw})BtBbp^utLC6;J-}=EUfHcx&yz}`ER>PW4*9{qbB@c z12=%I6S8b$08lYD7S=ygLqHl-TY$hrYs}!Q;EeP{SXnzGwudZ@7Je;(gN0=V*4+Me zJqVJPW-H|SBhE@7#v(oZx8gw~OlLwdFDJlK2PrW3e*#5z@Kum*ue;7aS=V>Rz(q!0 zjy4-&%R9P)DbM!E101t@eL#3k(As|^1JqIiVE&zvfevd>DX0hcf=E{3<$tf;RbT(O~@O|Li*60#nH>#3jyf^OxF~l-M_8+ zfV}FV6J^#Z&~Opp3~+r&139*ZUq=JiMSw}UtC#0iSV$kGtoA};U>)Zd@CII3t3QHK zZf96Muy9}tTD+70LK_Ke`RRdyszR*ZUNnR)O>5}AX)pv_R|~&ouD5~fB&Ti zQ0oSzwgCOfu701sQ(Av-7VOb%g@!Dzn3!B33)(lgd$WmD)pvxJw*vDK&==%vt=s@I zv%vP)vo*o1cL8oCa9VhG=+?v(dn+=ekRRkSx6Od@`-rfx{tYUSLYnnujCRD_u$rp9E7Ak_E6~d}p%H3uy8SJxLEs8HTOxyy`HtZ0 z7jXU#X4@h|&324CPUpUv3ttvC0Lmw0+8_D(do7$Dm*&w z)H_ZV5q~BIy<-M=@xM_VYVi1(9if4r{p%asH~D>3WWFJA2RncbZ?fb$RJa??u;ZW! z={Tk36{$6VZUfLDIQ;!&2M?Uz5gPIb=JkjAKt%UK_<89gY`i@jz5F$;T)_$6ZDI$c zczm0|aXLU_2($z5-zgzGQvHrcptl%!yKR?AK-8!l^DAC6d=<8RULsbEM45fpt{k`cLaobIA@WEsVyjPD69Ww-*w_af0&>1q9_vH?c4mWG+S-=XbQiP`XAAPK ztZk8D((ja|Ky7}yyRaJ?MGpX{fGc%z2jstF$ku)WHT9k`C*7TGo2r(xZBt>2-KnWi zH=*R#S@;5C+y}5a2=d*(pX^|n+%3qUJ8$2<;Rj_jm%wkUz!xsC<-IK^s<6gw1%x!H zwnXWm2DC>EnkMtNQIO;F75)YURZ!d16s<4m$+@{9prrS=qZ)dGUZw_>xojnav^#ga z-rXFGczVPewf}$kvV(i>qbJh`#YcbeLDaBwwDYVCc+G(4)((mu0Odw8tHxDW{90DucyEZB8S+c9sX?Flv;siv}F= zfCJ>0e?Qs5BCTjS{v(c#2SOj=0X8fg1J;9{0dR6pJCN#b7xWT<}EaD&hZ$ z%hL_4MePvVhC_@ie1VnHfC_p3=nnkN4i?>q5!uf3Wh?8@6)gbE0{SIfXFo_Wf(APK ztuIwqH*YU}FHpDOvb6(2v!W*Fuv;uZXX#s#!z{}GkxSd#3k})9nHR${pd&p3nTH@u zXDrm1k}0hh2X7Sy>OI`G@8&2#=Dh^051-KG!R+2)s}N9!{61!+;0PEl0|vMd z+QoX{HRC=x_5c!IfC2@?thq_-_TL~cd&ARFMd3%CU{r`bL1?jy_wh9plcM~Z%0SUr@1n?f73D%}Cmf*P6HrqE4 zepIuxGZ+Z5UVtw=Wid0x6yNcmDYj|}iiymNWj^}A-rXQ&0gLK?KiR?eO;D2j-ab~d za&>e?uFw7cj>KD;AcM~}bQpgJqL6}U5APrrmMEEYth~S?x$8!1q_|Ouw>R9bQU{h!1QC(rubQASa0HwbLt$-bZE5@Q57Np7gA9{M zpb=Zr%}(S6;uRX$jS1cFCCBZXeW^ay9i%u|kfXw#RMQJBKAPAKwZA>r_UjN(OBV1U z_^jlHH(Gqv|IA3YHXjN{B`YG#LX=oorM#On>J~q=@F>xty>$*#{wjvxw$_5q+d&WYirujV?Y0MF z88@seJ-dcE^mfP*7f;-S4la@cWZ*G>KiR>qsTd-=_yc8ZhwY}oV#*A#@c}k`!1@R_ zDN*#)f6n5D^z^d#Kx{(*MVNFan&(0wV`K*zBfRmZH_#Crm*08u0P07ahE1~cpz*JO zr$g5o{`q7Fzs*C5y>TY$_f!PrjCu%rFs5u*aR7}bOY^Pai@;$bK*|WG(Y%8JjT&?S z3r*00q|qvvX{iSbQIxEkhmy1+3~2sIvweC3Q54O;bZ`XXpL&@_u_IvJ7KmbK&4mo<6IAC&o z;8yUA@l6d%^gm@e;7yCo_s{+}#6g;pEz!F`2U@QSq7Zx<|F{7o4kd4A=iep)Lm5~c z+;OvgmY5HD6T~D_KnJJdZ^noU+*j%5iLl+~)~wA^Ay;@3psQWk0Tq0H&DDw#)o+P5 z-kw7t7i6YgMv2NqfQSTi8~F0X?lz3b{yGCH?e$F7ucQExpzUe6NOqkVu|OBy=_5b^ zIkbw1LL|s5;>@Ma+XAvd;M?$_)f^mXM-eUmc%GIV8V1ocHibICkOIVkXRc&mOvivh z58;CJLKu2(xw`egz5toWlH|C^T_A@Phy`%P3G`yfw7!y~01h}hqU%mNR}o}OfUI*1 znMD8pLZ$+aZ=jS6iau$HkA;VU4xemsiAzHmkpUZdfvPACgsZ)m0}6vdWGdKP)lio@ zvc+I6pbZ!pY~$)=Xg>)B6Xbl3V^6R%0FxnLf=^;^jbOwC?FBpQAh$f~_g~L|L{bwa z_;D5xi2@?IKSKogn;o3;0V5(k#KyYYZ#|-r3vxuQCh^JbHRv;jA>Fzo8tSQ{V1hKb zY)jaG9tbA5MKFy|7&1YfOI1hC))pi@o+#)bJwEPz;T;6%__xq;eZi1!T`(OFq!$tt zexji>_7`Ue1awQ=*?=NH_O5tWMC3QrVR%{+nph{ zFFc(DH^720bbJcFnEH7JBesp9_^(UuG@3vrdmbpkjt$JU3?!3>N%mn0Bd*^Aqz)KP zTo7Q$N2AFH-@+{dwzZkkPmK6B@=6S%hdE~#|MtC%<`+gxza;~EZYX4e`m>GD>s3bJ z9mhb52KSDcHH?_n;}oWy>|E1%&ijB(bBo1Xu(2_TzrW>@^YZd=v<9n`Xrya7`6?3X zWo*Dp;MrObxRM5gc(3aX4!?p0eXwMShDyM6>2M~XIsvHQxq$v2jHos;b_KAzi-HO2 zV%4Fs#ZaVz9s`G)Op5>`rr$~gG|<3_f(`0qhdq0i9s!d*-I7~#?8S&}sQxz5wKj z1Dg$su=u`u1Ra|ksGJ82OMh!wFsP@3)QHn%ejh9ote5}8R}YNXF{MPKN600d!aCKm}j2G~q-?g9aWl)7b|)>eoPsr6Jk8PLu$arcj&d&ms;e#{soK+w40)1VPe6 zSj(XO&@mSHLR6ptrUW~dVnU$+aeLv>JOHN!!xDT=qFxXM!S7?NiZ%|&oyr&>D_=2J zCQAp+?*v~sIsrI7v7>(0Z->!$@ba$gT%mn<_`LJ`|AfAM z$AH}D=WNM)8xWHVfOg=WoeR|epl<(haBa6g7|zhkVQeNi%K_v-045fosXw3W;13cg zSWqec`Rcpoa-bG=5JTXhP)8C4q@1U}tIZ$Bgw(=pjP%&nIU(N(&8$m$z5q!nT zLKX!HR05}M?F3GD8iTUwzZIBUZ47ZRm(A4;0sIB9ss$hI73I-z{E18$l-ohJMh4sN zPXZQb2K^bndlICChH2wvcrZHcv_1z(LO7OH^9q<20W_xY$Hd@ocCZa7joQ(d)(ZyL z>(Kzd>-v#cX82Pk+rW&tJ zT%4gS#4!{I7z?_PB1}LED+~w?JiI-5T(y#+fOL5^aDDDPlK01;6^Ls z`q>SHo|UUD(gh_KRB)ynSxv7n;{@WI&I9uqFeelDQ&YTKiQ5W&?J%}^2m4t8rd z9iee|z>HvfN8qwetA}d32!N8{LA22kGhCQ2tVg4*OprP9 zL;|56s3ydE4!-cgoaj7eoc}f6_TFJkb`^gBj7CT>L6d{Y1*Sbp*h_1%s|U%tULK&`{|A zrzn3tchp}$V58^l>bm_oc*sWN#@4oqAXr@6QWFz$1r48?rv86Z)$QfE82>0DAILET zzVHm?U!zS-y27cxV?v6#DM?!N@tYaK|szAvY7wu-R^8?G>DCsv6W7JlHBorC( zU;#BUSl@t@@Ki6d5)H-nirnd#^@NhK%tgnLw>A=>QTTm21^#LGl%h!5DQ z4va={mpBZzM^P$kds}T!lS*=CQ4B=VO0e*79Oe?YN6^rKJy5XL&$qE73T_WTfTyKA zHcF`#oE^8#O`w6VlcI?BIxr8kDg|eh`|^KcTyF*x9JZUkK&m{VR!|?n^)dur!iv%oeLZY_5hmPNYPQr zcmd}vF4!Ex^4k(_eSZA^uhbxWEPC%znVUre2r?o5pUwj*`W9(rCj#X|mv_P5_ zxN7M>2GS-?P_?ND<4ys$tz%-(9nKtWzkUNzo`18C7Z<3v8hqiigAuTwg$X6Ro9xs< zpfJffaGp>I@SFnbg(px7yD{TJ?=E6{Mjqt=6}o~M9bBH5xc>{sMpw`P)m?~fyC2ly zTPXS7W&tyS^NgF;?wScOnxxK2NRYJ8H^k~9k)%HpcLko?gS~=O2&e2e}`x5Ld2Mnz?}>e!MYjb z7W#n`*nv|aaL!N?%s5fS#_h)(2@zYu9FVF_fH8*))_-fLP;mYUxZC$q$kU$rJxqiO z>!Bk@@Eq+vnA-1XB@IVAgn~aPY2ESS1*ls}?1S}zTl;DPHIsL|L_{p%W1#ef6qBUh&E%GE&NG6CZbd?R2`00oCPbVd1} z%Nn*XtcM&(zd@c{7dTHT=n?P*JZ}+n=up+;?^6c`NH9-E`0dPd?_}!nGLZjFgUJd= z`Tu^hgBieGUOQ^)w-iu~*7iLslb^B+x}WJG&<;Flq?bpBtLO)=9|5rmiW-hK2&nNp z4gTd~*e3bFm7og~;L-3bI9`al`PX{Tyhx zDNqw!MgHdKkQJEa25P*1qWQ z|LdN=1D@s%Njqfbp7&b9#lVr+K$nJRoMvayQEhbRKN%X(8d$JXL1FZ%7ikqupi6uN zhKCQOPNC?ylpOsKw(DE2TOA4tOSpXVNm)RS0x(3tlb3TB&|xdO`s{4$GmPH@qk)~X zz!x6xPDh~wUT-g$dILk-?{F}1w|&;kU7(XipcA*%6$vLmlkE308!@ zW57237_uv=8O`hGz@|9+HzPZwVuHNAVWCcTkBm7KdKx|kL<#ty?3slQ`S(%|y1ooW zYm!3M7I4H9iys(R7WmMg&;M)fJHTr`+y9SI6g5&*YKE8zA@-{5J&@RnBRLtIoD*jt zs5Z7rt(vu4TBAl6DyY^TeW_J#y+o@uN|mCN^84IpMDFulPu~CEb)8q=t5@&O_ult& zKhJYNYjSn#G+}Z~`mD?phi)k+Aabjyn3$@t{Qdv<0139^5m&!huZ89adnQ{lVye8< zh@H91mw(X%04*RnuIVNpYXP{@n#_bm(sYS^pGR(mplaaLd5`ex&03UkR+!#;#C;>W zUaBG^0*bwMecoLF{RcoT-0HyJYjTfn)dF%%eN~pun9s-cj|OR+-SLQUWk1s*jb5tF zkQHr8GfTafB>zF$@4i$-PJ#z>$uIj{i#A=7k^gEE$ShsCC*OnW3B(1SjQ`xOLfJiB zlh$aNDIs>6CM^Hy-!+;Y^B%$j)r~x#)%;2Tpl}V6Y<8X?4YpY1E?N^WwL?3Wqir>R zL?XTrdFg-%lzVoPlo4{TEzR3>NP~XAg?@SB|Kq3tb*$Okt7R#D(sAzc3Ll??j=w`p z;&tho<0|x>LsSfo7cG&LEjGs;Zh46In-~0=jez>MWRLFKlY$UddJzdYV;nFvpw=S0 z^dXMs{r61#--s2*pnAS^TlPaS;S|{-z5Bg8x!+W1<`Oi+qxtVRUZj|Tib{^NB`>`x zO$Ilt3<&CT^4j}wL2+QhO{oexA~QQt-d1ruP;NnRoS7EC6bB{5oSLHmLo%EFVb3c| z5%|vI$6<&+A(=&+df*hCy9AV%*@n6O`&2+^`M#cKV81I0lcZ^DRLgeicdi887_I}c z@i^A!o*+NUdLe;jemklg4KN;z0K*R?p2G23A%SVAr1gHCVtgV3dFXMNd2`O===>MK#JU@IoY`Cr*N3W9~m| za`%)hEr^9m3pW+r`CSQ(IP)9uYS3+PHW2O0AU72LUX$ChyeJxi8ZP^~%~=VJ;##HB zUO_l%sf&XtgfX;nRYlRFgRu_RV;xTCIPlV^n@g$Y2=U9)ulkLLSu{ju)nqJu$ z5DDXc6K>0k;|@(kF{lVcj?2nc5*zvK&W%-vM!{!q!;5&n{vIX2SbT8TI7&EV1KTpn z&HMm3Ut?Vt%=~9`J5e0xAt$G$cqA1mv+@PuF3z9JS5l#8V}~k`*j*3GNRs1{!s`+|pB1 zSj))J-49SVMpXASj7B)XD`prXIEI$z=lQ|Xzl5dpwSpB}0Ae_91MFo;Q)B6?Qm70$}H>v{TOO{rlNO;3*(qljP_L3RCIHuIrjswgH1w@ zvuZv#Pa$Rsg*ldm3Hc!L@#;lyjzmmqjCv)C`LFL-Q9SpytE22LoT8;B%uaqMZr%qP zW*~WlrpLLOsE%h}3y*;+PqaPxpx6G7;Ju|KtG;kNlCB|2JMGdrSKi5H=czeon3CPa zA3ELvcPvODFon z49@qJ5O`^iL?+b};)=Lt^UJ^*$3v8SdPHY5pGCwdizsD}ym|7|d;`65-TXR=Azx#2hAVC^_98^Y2>W|} zI=HXimXbk5yF4QCb*5Eo6Uj0OuFcCDznz+hf;TM*=SQE(m*~pcJQzt3)7iwmnm8#% z-Z4(bL0)Inpf!n%IZ_cdw!^MI>w)$nk{GWF4}4QBv~Z(UF%lD7^~-&dxJnl2(Eefp zJ!ea5^W22gvrHMhUL2a5$1ou(i+LWx=zb+;~({%)KB(X8*`^YQ98IX$6bWu8ZyS|aRxexJ+AQjH| zoqC~IxMYoqmgmMVe+q~opY}g~jM_>iU^Tq+)BR^nNSYeys0XN5Cf6e;n@pdvZ2u7m z^Gh(sQ_JSxgb+f5qlfg(v}HJs(?Eju>}(9Zky;FaWmZ_7G7xS?n^N4(&RiD)bDF)% zMhn^H;=Cu%ZiAieuuIO;l;4F=U@>8 ztfUZiS_nHXU`lmBw%q=UR}LhgTXC_er+iA47NQ?br;)NPG`B{IKw575Fz?sLFsa4h zf@|P|mxT}#%yeND2}#Z$Nyj_=Lmtrx4Z2vw+Y^6Q6GCv5C@Stqf_leRwe|~$Utf58 zwtl~=Ap}w=D91?vm@f4Wq#`4%$W5mjHU&dh@#7m=^?ih}T;Ax|`j$eFR_3*>*9n(L zbYX}vJccc8AOyjDPwBALfJe3+=@8n7uXv(tY9xf>d@n`ChKZL?yBw$@&&%*uLMWUU znH_dg%EyZ;&cY}&-2y}`F0t`#giwmuvAn+%N~xzeVyPl{jHu61wzU&NamA}7*8|Z~ z?GwtUy6rU@f{*Gz3T5HGVpky)$G|UoV?EfE>aIV+%yz{GT{~6CPks>vM?B8Makl2* znGlU)Cz6ig;~+=jszvE~-aGC4wR!@hz7M13Y~7AkL9t*D7Hz{E-1@O*IxhJ*Z)U0A z@FzK1E4}ecDCBq@fP4uNmna74M8-Ts3(lv=UpyqBW=FqFn}IaBOw#bZ)=Lb?#aU6F zs}6>bOSDcM3Z^Q)n-u6{vr+}R+(274Zv$2!40hL%GeZO&U zUpJa^guNV(O@rvE+LRMbuJoy;6Jp}pgqYvzB96^PCy9IFlIhw|P6T-okxi}te8TO1 zNNGtZ_QRQoUcfVPidn|$^z%fM<7~b2vL|Oo9+G7D?-vEH(%^i0ii&qB_G0vv79>Xr zcI=%?&5dyS?J57ZyfOc=L>s5C-ePiM$x~l2_~1D@nN=2C@MF5G@P?lj7mfg?M4t3= z;mwDuX_D_)Y*{yBdg;Afg}ifwlf3N7m`?v1+c*ry6zk>r)$>=WkOe{K3pp4}uJ$PH zrtC$B7r~k~z{~l8>n7_}$h*A3y^AIlIDPuF{+9!mA|v(09uW6~@>^ACOD0fBsgu0R zmRUJ=1msOK?ztcQm9IiQ+jS0<>L9%Jl7buXXbW3C(ySDc7#d%<=oHCCcQ{el~Ca%J}?~a0gWUOv2 ze2;VT*$n|C7j0$DPWD>%K_z6ROK>`V1f$X|5&Cov*||-u`ivh5ZQJ#uC+WljW>I=% zsL@ygEBaiaQq;usm-pz$DWFXw**F`w@J^{F?F8%u8_ia_U#rQ+n}#Nth!MI|@C9B& zZG0#If|3C~s3_vwqKhGgIhW4rTC8`QS<_bS-A15$+Js3x89GBSN2Pv|D7h zLrFSeuPr}w8Q(k|IDFODrHTMXvL!P;9c>y@dJi*>z$jeUYWDBuVSxZ>14g(CMphL7 zAx2aXC{VTUFzv+0P(hEHo`K}PmjD9Yr9w}OPWzEMQX>+AlY7X=+0XV`24*81*2HQf zh$;Iq&QvIRh+8RyBN|i!LnbXMAACLG7pcOKtAwmi(M%~}zD#1_AqB7wb zut{41D2AYH(*>LN#4do>|AV$*G85lSoNmw*pR2`P$QSA$14i1zI!Jw*#z>|zr1F;Y zQ(-Dy;jKKx&3jGY3!FE20$jlEYx458vf8%i?P#RWFJLdBj9F{6I23Imz{ir!BMh|Y zhDR&zx*WM&W^4=q7Xpy;RwrH@u!rkC(M($oU2K!`M#1UehWx;K@aY5i@zniI4{@kq z3+`5r!Z3y`id6DQBcDW;m;%G3D~-I}+NGB`5-H5FBPJimi6v9xE0?BV*|!4AGcG;v zzT!YGM+ns$F=0Y4!xI_d;_`DcuS0U@p)4-FM+R{y5tBIZ>MH*NAW>tNuLinih$E5o z@Ppxz_m?({$;?X;GUGb3t7mqcpJd+tIH|%trRgZo) zFO|w~6odrFW&HLLKAP}B|dlIGjSBIG`TT2gf(eW-)9E++($5yFy?dP zu=dwfo2Rp}Vo)kWNB!{dYRU!}%4MMPtRAvc0MWD7Q?58mE%~&^yRiFxa5uir4BsUH z|5HtqF7B9Gl>}dJP~MVUSmh2_B{!eh zbu|eWid*{8HFSY`XgjR(@?ohW(I4(xNHY!$7SAPA{I8TTN^nOAuX)FXNfaA zM1!__ud?u(n&OLCj?yFhiIpy8zKHUJH;S!^8bC#JiYi8@Ki?l7fiSiY4Dr1CBuNXy z+2{@)t+yDIH8Cgqn{iK}iL=lI_uzN?7Xv_Qu%za&hqH!bR)cOH;u>#rU&Jy~)fM2y zXnQ<2S9uOd-wW#he!V@u9`6o#h$vu4F+rqU5J1Dklshdz9J>l0nQPln4FDyBQaZys zX?)icEoGrzOZi`+6uL(7TOOO~!6a|!hg;Smg9engdyv?g4!Q47%ZvxeJ;5vv?n&1G zP!wCZ$!3w+?I2rgUCMvn7Qo!bk8d?T9iaiIdFX=JsXR91>>|)Uf*)Vd{A<*pkM_9% zQ`qV7ZVEjhiMBa8rPSIes+_LVsdFSuAWKs1-OSR!ar#UzL$*;tM&I>$fF(##=F=Mpwe?8B)48=^}eT} zn;wAYyIr4-)_`{FpLo<`hKo%1m@HuAt9AF~fU(+=IPm=#4FpBzWZH}b<@29E79RyO zF<^!_{x*)&fP$PbfHzZb%pB_+JgQchljEelvTEo^_~`|(#k*ABjaR`+9Tq?{VUiq& zmmoQMEe7oy=l_?QHgQ$qq<`dHnBQ2KA5WOe&?Zw%2SDN=f9A0MtG$!{^Zvmc(l~y+DV=x zh8J&5>KUhqK~Aa<&Y%4r7}lF_f?n`Cccf zBl4|-w+BI3cw5k;K5Mf|j5?%*hci`mzOZq?F-%!-yeZ0yz$>f8KoapTtx*|-`tikLawb0^rmMBtqh$1JnAZ=YT;w>7GO5*bH5HyxVK;m=M%!(NC8?$3b zKVWnL22at?J`}@<3RGl*bl$q;?*TN%w;Dn|?_aE2rw$MnqBJs@K78MqD^rpY7!PBU zp9^Q%26eg=2t5P5)Emg>PQ@iW-ih!25gx&ty}{e~eDU^!3B9{i zb)k@LzWB^LbQnH+GX%qv_gu^wRdg^6md0Aq6p-!cf+=)T$$_`do7dL|Yta~}l-p?N zIdS^5{6Pa>p-QZ=Vcn0R5LF%&%ln)=E{S6}=hCZm-^hlphzz>^0fBS>3U>F;xhe)L3W6tmx| zx5dF6qH~^86zUm!e>&;HYM|l{oJU<3e^(sU^-=*=c*^|s+P3WIJ7^i@*7WqHsQcnb zMfj7Cm0MH0UZ>Y@+aQGTMB-nfoUkuBV59)#Of#;U-}gf$pI*PnzSGd>64J!Z|Q>f#fq z{S7$UI$8vl#QW2|$}8!KP&{hjaSU&ek2tK+F2pA#sXwiof1E7~7=u&Df_#SN=yBW+ zZzEGgR8c1h)?!>RgkGJ07aT?~!FFyW3>X5z_HsRttAR-|f5@_PKP~|#2LF3ZvI%Tb zEX;U)Iu5_X>g2y$dHYj5Rg)44A#A?Tz_WEZ4SqqT7;}+m23>ln| zM8&02!9+Mwb=GFnO`2RpOWw2^h)q60)(~tA=@zrygkx)-)}ven>ZX0Mm;%Bguo%fK zD7uv}G+B_S*^(*`UjFR#0$I@Tz+!=h6vH{|2ft;X3s4$-!+oWDTVc>**enHvl_QP* zGl7{4%n&Bsw(W&61$~nQyFd5kMGJu^4e#|j3geMBBP|9xbnIzI(mYIDmhQahtb7`) z)ma#|ScqRAocYr{@Hq`~4P|nz(6tzd`Wz7!NwAr7I~OZ72MPT{o?4Q5&JnoN6iArCNRYfedX%{AkWurDkUH3Y3;frF&kkKt*|WN z{n#nP1aMTSlWICl?lN%+T<9eFAH2Uc!5~20^?0Q7ex~Z(Nn&N&5p&1o09y!=@m{gqc4DiD3D`vC+3iYoo zdSf9w(j-fo+1T`Q({l(nG+LCmTH59afY6=-`3u@cu1#RMW9kItKmFO=Jb+N09n2zW z%2)xQ=u{N-xIrZ1oCFs>Y4vkTl>-^s?3xCYi62__T}7{DO1BT zX)ZA?g~?A=B7>;%{m}+J;XU;vXkWf5faY!>y5<7+rk!-hI60}#2<`R{@8+FDOg(_J zOx&9?CJLY>fk8I__;d~NRnl9t^D$$NK#;@Xx_n=7>2v|G_^?p2a1kN?-mHH993Z_5 zB;K~zlP7>g-F63*OLrP-BO~cQaR1o|1lN6NCGkGY);R)*BuJ%=PD&8pzC1Uk6Bv4i z?jrBXhA$8#4?Ve!Luw1eLewUopXY!DddP!!!%i($$G{*|v)vYuoE#VD46ITBVq(IX zkDFO>2Hh`Fr)$a_>9ghP065Twdxlb~WWpCM56476G^OD%ydiGfu1?i4j?gj3O=;;% zvGa=wWjfNOAGC`-#8NU}ojy!RWJ=t-*_nSIhRoxudz#LNd(;7p=JdA1X^k35OvKDo5Z6qu zet7a#cL(C)qUw8I03?&%{V9ZUJ`69lS@MKmao;l^{q0l8`rKw4U(g1MiBC#4XJcki zrb*#^r&ssmE6;&`8T8LN{npon==Zc6?0CmhiGKC*K8XcL87J#{RxN$+Y14OZayS*D zBqdVEqQ=9=w?Rcrj~4Ul>zz_Bsv49-=MIJAJv#$!YfAM%2#-4LpIQYu;=5{|a`LJw zfDoUo@dDt5OI!W#!xi2}wZb{Dcni>XnrupnAzRVuEUh-Ly#k*&25s79hRPo}RO{4h!a7gVc z`3SjRAboHf3vZ_l?VK#CEIeY){>gxw+riw2V2&g7>MnpF5O_}&M3~M1p&J4(uh#~K zXd~cS2Rz&nxi>ra^E#(@J z&9;XsIgdU22!j^YquY+8Jd#M~zfim18SwZC$~X=;x&QwJr*1Y4F68f^>stpTL3#U7 zZ8&#@qRx_W^VVk*;S4vy7Vmv@%v8t7uw@wo+(X5!R>gNMNN^Vet}iVOP8z=KSzcGk z5;`Mr+?_Wb83I$tSLpP@gK!lpJ za}rI_CL9jVwBhk;+;^o%IgC;_B@KOW?Ai`HBEmU@B5u>Irwf3AAG-C2R!4BEJ{w&( zDGJ$i<=(Bj-bZEJ9`!fh8hJ8X0L7)HXj7)maR^=xh9uXm!q0o=Lpiwk;Bf^lYJ~ty zxM`Gp536kUM;P*cgK%(Z8yx2(dgMDVVo(UE9)&E82vTi5hp5evAg2^HPk|)JRWjEp@ZL0^lArwz&5^z&EIc9OrA? zdgm*{z078t(^-|;Tm&|6^Sqw4nwgH(3}1kIeO?SObs!SsAIEMs*a*w(g)0htFDVhV zv^ZC;)ukFw%a{7Pt)jx!z=tQ`zL@Ij*F(W}ItB4{X*UE3N4%$0YvL6h}XnXVg&bXURUdEpRg zCZZS5%Des*0h7E;C?Aop{?a716|B+#tBhn4>{qJ1K0IY`S z%$FaxN~?ofT`#{B*6YswFn5V45BJ;gD&IZ?Z*=9FN0iHD1>sy4qKrcxJ^-Wj@ZgKC z8@w)p$+Go}f;dQ}ltbP7d|?Kf9zeM@G)~GJZ76iEVXZO?9`H66B^>iirD9?-?^DX+ z_!R9>z{%;>R7|G#stLE`>pcz z4=HSLub+obg;9JDTjYi@*H@dkM^1BKNtHwb`zN>I#_LsdI&)*sb&0ugv2o-f>TH`Z z8=I^;GgkCXnC)%spbp_klv1K3pShm})!hf#w1fh9ug(&rPBhIiO~AR~qhv~CzJAjO z4Lk(|8u79h&(_|Lms8VdJTUiJ$ zcOX0NAD0FQK_!~v^_CF^iwaAmpNv`;O09y?p2ClB7OxpBgcGd-&(x6R^AT_`JyiZ-Yf9F&^ZuRG5oX;9X3b9v#EcRFag6gv z3R7d`T**a|CxG!17~uyV&W#bm2n$srPiiT5XXugjkP|Mwd&IGOB>-KaZEPFPFq{B&E#-+p;VSRqHLhK5p;5^{*pc#m}plWMpr^lcH(Fbo|7#vxw zhdxuL$3^06Qu41&I4Z5Hfev(UmL8kT7J*T8OyB4K1~%^O=*h?J{EEF#w1tUGhKX>g zo?E2;3GOEi*!eug#{fvG>#DYIejn^!M}@|#rnL9eu^5Jw5t3!t?AM;%1ta5Nj-2?q z57ddX7k;F~sUTQ!YxLK(k)|ir^UQ8nKU619^SpYX-KnSDPn!D>syC+Ke6H+nH}P@n z^h)2$umyVGmiLDSZ_|ci)w1$(hk)+d*Bz+`fzgCh9zhpx7YEA1ZChn#$}Fk#-F#F9 z^Kb}+7g7~=YGc4|ojV3NEIB4ezF?+YF#cC>;|7R~M$T}Q`}?&~n8*|+@(@b>%AHmn zguL+dtjB?q`vTuF+Vrt>Q8}7O^zR>> znDrYZ^b|aB`sI#l)5lBTwlvIjl)pzw^69hUN|_zdbpv=eFUwy$u1%k`01t79sZXNR z3kl&)uXgom0@pEEEbnheeJ_S!u(+0Z8Uu_@bn1AEp0`bcuDNfV_(2rOxuHz24$5=0 z*lWzgBye&a5s`Cq>4G)}ww+Q&(9Af4`?YNH5h)URdYyp5?+-v&T!KCrKR}arSsMuf z3%A@Ubjed+?fc;HBJhxnDwgZL?KN%c+{dK|r1wz`@Be!glJbUi@eQ;(ceD|hf6JK` zIma(c{nyTg!dpY(E!>`mzt`k;exMDJlpHSa*ChSW8-0UrqK?3=b&s#F@kpC=krIr; zxl}*|aj-+zo8thn6iVg+u=l^(5RNmVEJw+sga!A?nSn;*Ss%{;(zrwg)uPBT)Ut?! zOX-sicI94M;syEt4mES9dsa!CJ~t#KJ(sPuGl0^>9sIZ{8LDYxL~{@+8>EctvwJ*v z3i97UA-w25T3rC5Xdsjac>Vlq)Aeu%bO}8w9q*dz02rZ#!83|S3FzxLj5*)>91Oo5 zIN+7}=)@F+OJR}dnZ4oAo%kjNIl z-r-Ush$|m)g!lRVng}8|Po-)}tR295%2y)LavcE`Vg)0y3;4jj6+0 z;(vR@mMB>bjeDK0oQ|mf{n7cWL7N!h3455d|xw^RTYHD0Rr)h)Yd! zRsoL(&Rm-Z(ltSvFT>V%6(yaOgKwAn?tv|J>qdfj zISKKJ-Gzx;6^KV??5H;t#9sk%?!iGJqQo&Tf`-P)Adm+qm%To3KM*QOij11!nh45c zw}|wBWevJ_K>>Er&r|G8q6A1QA7UfodHa?RssQ3mVdz|^TL!8VXSJ6!a8lOaV#_~E zLTM!N*s^AI;))M?OM$4{`u&}6A6x>+k5%xx4NEz`7ImO>eHtdW((adQiG@A&Fl_nZ zqKLtFND2;5(W=6dIm}L@FRepT@CqZ|{0o%-j)Jns?=8U^X$C4a-t`@qBlsPd2w=hm zKleAt<3u$4p#LaX+EeWNB{P1F^Mr8R^H8a@^&Miz5nxLwE~iCgTCBD>1I^lUb1E~w zlq4QGBy8kg$cJkX`9s+kBrg{F0=HSZ8HKQ&qE!GqG%Ro;O%{EKg-#*^T(?{ZP(j5; z$K5Oq@NT-ai$?$|JrG=WP4U4CElTbx5(#&XUwG;nRO69oN%3$MuvQ3;&XrMfQ1Owu zjr~oxA|cI-K;eaK@6Ut~A{~AszcL~gnl;kRpl(V8EHs*_>(-8906bTk+2T9IVmE0h zs_EW>3%h)=#^~qS@*KWL2=+N(kw75tgqulOP4DLHe1L7-gUviEtH#fSAe`3lTy}DXP1)wpZC@=|fT-~@ zDl5KyWUpFLb(xv%8UTo1h1$#}0?9qqv0x&Sffc65BgK#!Vj#(SOS%DZ(3Eb=a9*UP z8_`t02M-%&F^tMo?uusjYm!kHDUUj@5zOur>WG0mPUj{WM%vMYHze4zhB+ErSZygD zr}YoNf9(PmTpvjmTqo;^VLI9biD}Mu5Y(uIM&jMmp?~5(Kzj-_zE&yUKnxALGX?=L zT6$Hzn=o%Zz&-&O-@?%Qih+R}y1!1!(_pNs_Y`|&VEut#7*kzZV==747DANXlu9q_ zY9M;~W<=6T`7dzCgXH&3#1O;B*yzN4Y9X?tovr~}qG1mo+5zh)v6mN`i^0ZWgnE*} zwLPGLw(N+1`yTKJYX2lKv6k=`LvxO&i^@#TFycpvO=R`~6`&P{+LqH<<^*^n?|AHP zDTeJlO`yUeS!uNrbJkA-ObB3FG8O|`i^0ezQgXM0NiSTauGW40cu85Ztr+d+_r#Ul zns~UY^SYf2jAk&37{-IKofuAnIlIsdX)D2!<(N*dB0J*mx2PL+YXb8V$r_<|2QgfC zep3M=TS!h^aI`0E&tpwZTvb6XJ*!cYZ|{QY8YF*rJ{AF8*z)-%H3#A~ChS;j@s+!6eEJF#qC-k&$fo z+da1p_?rof=SuS(AO=D9fgyy7X_^>W9X;~>CoqjNh)KcB6gRyth7xbEWtdY15;ZBU zuFrpBF$7%qVr9=nU2dotoa=6iO>e;*9Yxj%YsSJ*>l1i!D{s#o`$`#NSkL#pG@$%% zbc=igQuKwsc=R>c#Gu^Aos?N3ZH?%Dzt?!+&|NZ~s5*}l!-19KYL^N-WO_&1ElGME zFuRegILu39#9#`$K1#WSVAj?6HJ!G_a3bEr_P)*$g9$fLm!n$;`UIy&9W2ghY6{@H&Y@GnC zh~MhqSgt=+bkClRom5d5AD$fCB03==AWJ{WU5O+7c}hy2YnT@cHVE2woE-=px*Lz*-DX9nrdF`ywFabcVNYM;#e@@$)7KBo!KX z29j=*B`nK*wH!#cIjiNEEVfrcO^UMn8kQLa$-IGIc%g)7XLv83m-7&Baj>#2W^~kS dnFec**cTAy@q~HFzf0ycDWO}EhmL{n{{VE518@KU literal 0 HcmV?d00001 diff --git a/ruoyi-modules/ruoyi-settlement/pom.xml b/ruoyi-modules/ruoyi-settlement/pom.xml new file mode 100644 index 0000000..8ca534b --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/pom.xml @@ -0,0 +1,194 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-settlement + + + ruoyi-settlement系统模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + org.dromara + ruoyi-api-settlement + + + + com.alipay.sdk + alipay-sdk-java + 4.31.84.ALL + + + + com.jcraft + jsch + 0.1.55 + + + + com.cfca + logback-cfca-jdk1.6 + 3.1.0.0 + system + ${project.basedir}/libs/logback-cfca-jdk1.6-3.1.0.0.jar + + + + cmbc.cfca + SADK-CMBCNew + 3.1.5.0 + system + ${project.basedir}/libs/SADK-CMBCNew-3.1.5.0.jar + + + + cryptokit.jni + cryptokit-jni + 1.0 + system + ${project.basedir}/libs/cryptokit.jni-1.0.jar + + + + + com.qiniu + qiniu-java-sdk + 7.4.0 + + + gson + com.google.code.gson + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java new file mode 100644 index 0000000..b9925d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/RuoYiSettlementApplication.java @@ -0,0 +1,31 @@ +package org.dromara.settlement; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +import java.security.Security; + +/** + * 系统模块 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiSettlementApplication { + static { + Security.addProvider(new BouncyCastleProvider()); + } + public static void main(String[] args) { + + SpringApplication application = new SpringApplication(RuoYiSettlementApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 结算模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java new file mode 100644 index 0000000..9f02a5d --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/BussinessVariable.java @@ -0,0 +1,66 @@ +package org.dromara.settlement.common; + +/** + * 系统业务常量 + * @author 张涛 + * @date 2016年11月15日 + */ +public class BussinessVariable { + /** + * 批量插入参数的最多数量(由于slqserver机制,最多2100个参数) + */ + public static final int DB_BATCH_INSERT_PARAM_SIZE = 2100; + + /** + * 默认短信签名 + */ + public static final String SMS_SIGN_DEFAULT = "【乐贝通】"; + + /** + * 获取批量插入最大数量 + * @author 张涛 + * @date 2016年11月15日 + * @param propertySize 每条的属性数量 + * @return 一次最大批量插入数量 + */ + public static int getMaxSizeOfInsert(int propertySize){ + return ((int)Math.floor(DB_BATCH_INSERT_PARAM_SIZE/propertySize)-1); + } + + /** + * 默认短信署名 + */ + public final static String SMS_SIGN = "乐贝通"; + + /**用户类型---老师*/ + public final static int USERTYPE_TEACHER = 1; + /**用户类型---家长*/ + public final static int USERTYPE_PARENT = 3; + /**用户类型---学生*/ + public final static int USERTYPE_STUDENT = 2; + + /** + * 短信字数限制(SP业务) + */ + public final static int SMS_WORDS_SP = 288; + + /** + * 短信字数限制(非SP业务) + */ + public final static int SMS_WORDS_NSP = 35; + + /** + * 短信字数限制(非SP业务:含短信猫) + */ + public final static int SMS_WORDS_FNSP = 139; + + /** + * 短信后缀 + */ + public final static String SMS_SUFFIX = "登录童忆园APP查看更多家校通知!下载APP:itongyiyuan.com"; + + /** + * 家长考勤业务对应的模块 + */ + public final static String MODULE_ATTENDANCE = "408,411"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java new file mode 100644 index 0000000..8426ce0 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PostDataTools.java @@ -0,0 +1,643 @@ +/** + * FileName: MessageAletsByJavaClient.java + * @Description: TODO(本类封装所有关于短信提醒工具类提供给第三方平台使用) + * All rights Reserved, Designed By 上海神洲数港有限公司 + * Copyright: Copyright(C) 2010-2011 + * Company 上海神洲数港有限公司 LTD. + * @author: chivalrous + * @version V1.0 + * Createdate: 2012-8-26 上午10:56:22 + * Modification History: + * Date Author Version Discription + * ---------------------------------------------------------------------------------- + * 2012-8-26 chivalrous 1.0 1.0 + * Why & What is modified: <修改原因描述> + */ +package org.dromara.settlement.common; + + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.common.http.MyX509TrustManager; +import org.dromara.settlement.common.http.SynRequestThread; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMethod; +import org.dromara.common.core.constant.Constants; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class PostDataTools { + + private static Logger log = LoggerFactory.getLogger(PostDataTools.class); + + // 定义一个私有构造方法 + private PostDataTools() { + } + //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用) + private static volatile PostDataTools instance; + + //定义一个共有的静态方法,返回该类型实例 + public static PostDataTools getIstance() { + // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率) + if (instance == null) { + //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建) + synchronized (PostDataTools.class) { + //未初始化,则初始instance变量 + if (instance == null) { + instance = new PostDataTools(); + } + } + } + return instance; + } + + private int HTTP_CONNECTTIMEOUT = 10000;//连接超时时间(10秒) + + private int HTTP_READTIMEOUT = 20000;//读取内容超时时间(20秒) + /** + * 采用HTTP BASIC AUTHENTICATION 进行加密帐号 + */ + private String userName; + + /** + * 采用HTTP BASIC AUTHENTICATION 进行加密密码 + */ + private String passwd; + + /** + * 异步请求线程 + */ + private SynRequestThread synThread; + + public SynRequestThread getSynThread() { + if (synThread == null || !synThread.isRunning()) { + //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建) + synchronized (this) { + //未初始化,则初始instance变量 + if (synThread == null || !synThread.isRunning()) { + if(synThread != null) + synThread.close(); + synThread = new SynRequestThread(); + synThread.start(); + } + } + } + return synThread; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPasswd() { + return passwd; + } + + public void setPasswd(String passwd) { + this.passwd = passwd; + } + + public void setBasicAuth(String userName, String passwd) { + this.userName = userName; + this.passwd = passwd; + } + + /** + * + * @Title: sendMessageInfo + * @Description: TODO(使用该工具类下需要手动将{@code SendInfoMessage}所用需要配置的字段 + * 一定必须SET相应的参数) + * @param: @param sendInfoMessage + * @param: @return + * @return: boolean + * @throws + */ + public String sendMessageInfo(String hostURl,Object o) { + return sendMessageInfo(hostURl,o,new String[]{"Content-Type:application/json;charset=utf-8"},true,true); + } + + public String sendMessageInfo(String hostURl,Object o,boolean auth) { + return sendMessageInfo(hostURl,o,new String[]{"Content-Type:application/json;charset=utf-8"},auth,true); + } + + /** + * 发送ajax请求,不等待结果 + * @author 张涛 + * @date 2016年12月3日 + * @param o 参数对象 + */ + public void sendMessageInfoOfAjax(String hostURl,Object o) { + sendMessageInfoOfAjax(hostURl,o,new String[]{"Content-Type:application/json;charset=utf-8"},true,true); + } + + /** + * 发送ajax请求,不等待结果 + * @author 张涛 + * @date 2016年12月3日 + * @param requestHeaders 请求头部内容 + * @param auth 是否有Basic验证 + * @param isJsonParam 是否json参数 + * @param o 参数对象 + */ + public void sendMessageInfoOfAjax(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam) { + //sendMessageInfo(o,new String[]{"Content-Type:application/json;charset=utf-8"},true,true,false); + try { + String bodyContent = ""; + if(isJsonParam && o != null) + bodyContent = JSONObject.toJSONString(o);// 将内容转换为JSON字符串进行转码 + else if(o != null) + bodyContent = o+""; + log.info("request url:"+hostURl + ",request body:" + bodyContent); + HttpPost postMethod = new HttpPost(hostURl); + postMethod.setConfig(RequestConfig.custom().setSocketTimeout(HTTP_READTIMEOUT).setConnectTimeout(HTTP_CONNECTTIMEOUT).build()); + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + postMethod.addHeader(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + postMethod.addHeader("Authorization", "Basic " + getAuthToken()); + } + if(StringUtils.isNotBlank(bodyContent)){ + if(isJsonParam) + postMethod.setEntity(new StringEntity(bodyContent,ContentType.APPLICATION_JSON)); + else + postMethod.setEntity(new StringEntity(bodyContent,ContentType.create(ContentType.APPLICATION_FORM_URLENCODED.getMimeType(), Constants.UTF8))); + } + getSynThread().sendRequest(postMethod); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + } + + /** + * 获取接口Basic认证token + * @author 张涛 + * @date 2016年10月17日 + * @param userName + * @param passwd + * @return + */ + public String getAuthToken(){ + String authString = this.userName + ":" + this.passwd; + byte[] authEncBytes = Base64.encodeBase64(authString.getBytes()); + return new String(authEncBytes); + } + + public String sendMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth){ + return sendMessageInfo(hostURl,o, requestHeaders, auth, true); + } + + public String sendMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam) { + return sendMessageInfo(hostURl,o, requestHeaders, auth, isJsonParam,true,null,null); + } + + public String sendHttpsMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam) { + return sendHttpsMessageInfo(hostURl,o, requestHeaders, auth, isJsonParam,true); + } + + /** + * 以表单方式发送请求 + * @author 张涛 + * @date 2017年5月12日 + * @param o + * @return + */ + public String sendFormMessageInfo(String hostURl,Object o) { + return sendMessageInfo(hostURl, + o, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" }, + false, false); + } + + /** + * 以表单方式发送请求 + * @author 张涛 + * @date 2017年5月31日 + * @param o + * @param readTimeout 读取请求结果最长时间(毫秒) + * @return + */ + public String sendFormMessageInfo(String hostURl,Object o,Integer readTimeout) { + return sendMessageInfo(hostURl, + o, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" }, + false, false,true,readTimeout,null); + } + + /** + * 以表单方式发送请求 + * @author 张涛 + * @date 2017年5月31日 + * @param o + * @param readTimeout 读取请求结果最长时间(毫秒) + * @param connectTimeout 请求连接最长时间(毫秒) + * @return + */ + public String sendFormMessageInfo(String hostURl,Object o,Integer readTimeout,Integer connectTimeout) { + return sendMessageInfo(hostURl, + o, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" }, + false, false,true,readTimeout,connectTimeout); + } + + /** + * 发送http请求 + * @author 张涛 + * @date 2016年12月3日 + * @param o 参数对象 + * @param requestHeaders 请求头部内容 + * @param auth 是否有Basic验证 + * @param isJsonParam 是否json参数 + * @param returnResult 是否等待返回结果 + * @param readTimeout 读取请求结果最长时间(毫秒) + * @param connectTimeout 请求连接最长时间(毫秒) + * @return + */ + public String sendMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam,boolean returnResult,Integer readTimeout,Integer connectTimeout) { + + String output = ""; + String s; + HttpURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + // 接口URL + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod(RequestMethod.POST.toString()); + if(connectTimeout == null) + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + else + conn.setConnectTimeout(connectTimeout); + if(readTimeout == null) + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + else + conn.setReadTimeout(readTimeout); + conn.setDoOutput(true); + if(!returnResult) + conn.setDoInput(false); + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + conn.setRequestProperty(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + } + String bodyContent = ""; + if(isJsonParam) + bodyContent = JSONObject.toJSONString(o);// 将内容转换为JSON字符串进行转码 + else if(o != null) + bodyContent = o.toString(); + log.info("request body:" + bodyContent); + os = conn.getOutputStream(); + os.write(bodyContent.getBytes("utf-8")); + os.flush(); + if(returnResult){ + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output += s; + } + }else + log.info("request url:"+hostURl); + } catch (Exception e) { + log.error("request url:"+hostURl, e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } + + /** + * 发送https请求 + * @author 张涛 + * @date 2016年12月3日 + * @param o 参数对象 + * @param requestHeaders 请求头部内容 + * @param auth 是否有Basic验证 + * @param isJsonParam 是否json参数 + * @param returnResult 是否等待返回结果 + * @return + */ + public String sendHttpsMessageInfo(String hostURl,Object o,String[] requestHeaders,boolean auth,boolean isJsonParam,boolean returnResult) { + String output = ""; + String s; + HttpsURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + //创建SSLContext + SSLContext sslContext=SSLContext.getInstance("SSL"); + TrustManager[] tm={new MyX509TrustManager()}; + //初始化 + sslContext.init(null, tm, new java.security.SecureRandom());; + //获取SSLSocketFactory对象 + SSLSocketFactory ssf=sslContext.getSocketFactory(); + // 接口URL + URL url = new URL(hostURl); + conn = (HttpsURLConnection) url.openConnection(); + conn.setRequestMethod(RequestMethod.POST.toString()); + //设置当前实例使用的SSLSoctetFactory + conn.setSSLSocketFactory(ssf); + conn.setConnectTimeout(30000);//设置连接主机超时(单位:毫秒) + conn.setReadTimeout(30000);//设置从主机读取数据超时(单位:毫秒) + conn.setDoOutput(true); + if(!returnResult) + conn.setDoInput(false); + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + conn.setRequestProperty(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + } + String bodyContent = ""; + if(isJsonParam) + bodyContent = JSONObject.toJSONString(o);// 将内容转换为JSON字符串进行转码 + else if(o != null) + bodyContent = o.toString(); + log.info("request body:" + bodyContent); + os = conn.getOutputStream(); + os.write(bodyContent.getBytes("utf-8")); + os.flush(); + if(returnResult){ + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output += s; + } + }else + log.info("request url:"+hostURl); + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } + + /** + * + * @Title: sendMessageInfo + * @Description: TODO(使用该工具类下需要手动将{@code SendInfoMessage}所用需要配置的字段 + * 一定必须SET相应的参数) + * @param: @param sendInfoMessage + * @param: @return + * @return: boolean + * @throws + */ + public String sendMessageInfoWithTimeOut(String hostURl,Object o) { + + String output = "error"; + String s; + HttpURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + conn.setDoOutput(true); + conn.setRequestMethod(RequestMethod.POST.toString()); + conn.setRequestProperty("Content-Type", + "application/json;charset=utf-8"); + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + // 将短信内容转换为JSON字符串进行转码 + String jsonString = JSONObject.toJSONString( + o); + os = conn.getOutputStream(); + os.write(jsonString.getBytes("utf-8")); + os.flush(); + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output = s; + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + System.out.println(output); + return output; + } + + /** + * 发送 + * @param hostURl + * @param o + * @return + */ + public String sendPRCUrlWithParam(String hostURl,Object o) { + + String output = "error"; + String s; + HttpURLConnection conn = null; + OutputStream os = null; + BufferedReader br = null; + try { + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + conn.setDoOutput(true); + conn.setRequestMethod(RequestMethod.POST.toString()); + conn.setRequestProperty("Content-Type", + "application/json;charset=utf-8"); + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + // 将短信内容转换为JSON字符串进行转码 + String jsonString = JSONObject.toJSONString( + o); + os = conn.getOutputStream(); + os.write(jsonString.getBytes("utf-8")); + os.flush(); + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()); + + if(200 == conn.getResponseCode()){ + return "1"; + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + if(os != null) + os.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } + + /** + * 无参数传递调用 + * + * @return + */ + public String sendMessageNullParam(String hostURl) { + return sendMessageNullParam(hostURl,RequestMethod.POST, + new String[] { "Content-Type:application/json" },null); + } + + /** + * 无参数指定请求 + * @author 张涛 + * @date 2017年5月27日 + * @param method + * @return + */ + public String sendFormMessageNullParam(String hostURl,RequestMethod method,Integer readTimeout) { + return sendMessageNullParam(hostURl,method, + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8" },readTimeout); + } + + /** + * 无参数传递调用 + * + * @author 张涛 + * @date 2015年12月21日 + * @param method + * get post + * @return + */ + public String sendMessageNullParam(String hostURl,RequestMethod method, + String[] requestHeaders,Integer readTimeout){ + return sendMessageNullParam(hostURl,method, requestHeaders, true,readTimeout); + } + + public String sendMessageNullParam(String hostURl,RequestMethod method, + String[] requestHeaders,boolean auth){ + return sendMessageNullParam(hostURl,method, requestHeaders, auth,null); + } + + /** + * 无参数传递调用 + * + * @author 张涛 + * @date 2015年12月21日 + * @param method + * get post + * @return + */ + public String sendMessageNullParam(String hostURl,RequestMethod method, + String[] requestHeaders,boolean auth,Integer readTimeout) { + String output = ""; + String s; + HttpURLConnection conn = null; + BufferedReader br = null; + try { + // 接口URL + URL url = new URL(hostURl); + conn = (HttpURLConnection) url.openConnection(); + conn.setDoOutput(true); + conn.setRequestMethod(method.toString()); + conn.setConnectTimeout(HTTP_CONNECTTIMEOUT);//设置连接主机超时(单位:毫秒) + if(readTimeout != null) + conn.setReadTimeout(readTimeout);//设置从主机读取数据超时(单位:毫秒) + else + conn.setReadTimeout(HTTP_READTIMEOUT);//设置从主机读取数据超时(单位:毫秒) + if (requestHeaders != null && requestHeaders.length > 0) { + for (String string : requestHeaders) { + conn.setRequestProperty(string.split(":")[0], + string.split(":")[1]); + } + } + if(auth){ + conn.setRequestProperty("Authorization", "Basic " + getAuthToken()); + } + + br = new BufferedReader(new InputStreamReader( + (conn.getInputStream()), "utf-8")); + + while ((s = br.readLine()) != null) { + output += s; + } + + log.info("request url:"+hostURl+ ",result code:" + conn.getResponseCode()+ ",response:" + output); + } catch (Exception e) { + log.error(e.getMessage(), e); + }finally{ + try { + if(br != null) + br.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + log.error(e.getMessage(), e); + } + if(conn != null) + conn.disconnect(); + } + return output; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java new file mode 100644 index 0000000..fd345b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/PropertyUtils.java @@ -0,0 +1,179 @@ +package org.dromara.settlement.common; + +import org.dromara.common.core.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.*; + + +public class PropertyUtils { + private static final Logger log=LoggerFactory.getLogger(PropertyUtils.class); + + public PropertyUtils(){} + + public PropertyUtils(String fileName){ + properties = new Properties(); + InputStream is = null; + InputStreamReader isr = null; + try { + is = PropertyUtils.class.getClassLoader().getResourceAsStream(fileName); + isr = new InputStreamReader(is, "UTF-8"); + properties.load(isr); + } catch (IOException e) { + log.error(e.getMessage(),e); + }finally{ + try { + if(isr != null) + isr.close(); + if(is != null) + is.close(); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("释放"+fileName+"配置文件失败",e); + } + } + } + + public static String getPropertiesByKey(String key ,String fileName) { + Properties p = new Properties(); + InputStream is = null; + InputStreamReader isr = null; + try { + is = PropertyUtils.class.getClassLoader().getResourceAsStream(fileName); + isr = new InputStreamReader(is, "UTF-8"); + p.load(isr); + } catch (IOException e) { + log.error(e.getMessage(),e); + }finally{ + try { + if(isr != null) + isr.close(); + if(is != null) + is.close(); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("释放"+fileName+"配置文件失败",e); + } + } + return p.getProperty(key); + } + + public List getList(String prefix) { + if (properties == null || prefix == null) { + return Collections.emptyList(); + } + List list = new ArrayList(); + Enumeration en = properties.propertyNames(); + String key; + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + list.add(properties.getProperty(key)); + } + } + return list; + } + + public Set getSet(String prefix) { + if (properties == null || prefix == null) { + return Collections.emptySet(); + } + Setset=new TreeSet(); + Enumeration en = properties.propertyNames(); + String key; + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + set.add(properties.getProperty(key)); + } + } + return set; + } + + + public Map getMap(String prefix) { + if (properties == null || prefix == null) { + return Collections.emptyMap(); + } + Map map = new HashMap(); + Enumeration en = properties.propertyNames(); + String key; + int len = prefix.length(); + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + map.put(key.substring(len), properties.getProperty(key)); + } + } + return map; + } + + public Properties getProperties(String prefix) { + Properties props = new Properties(); + if (properties == null || prefix == null) { + return props; + } + Enumeration en = properties.propertyNames(); + String key; + int len = prefix.length(); + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + if (key.startsWith(prefix)) { + props.put(key.substring(len), properties.getProperty(key)); + } + } + return props; + } + + public String getPropertiesString(String key) { + String property = ""; + if (properties == null || key == null) { + return property; + } + return properties.getProperty(key); + } + + public Integer getPropertiesInteger(String prefix) { + String value = getPropertiesString(prefix); + return StringUtils.isNotBlank(value) ? Integer.parseInt(value) : 0; + } + + public static Properties getProperties(File file) { + Properties props = new Properties(); + InputStream in = null; + try { + in = new FileInputStream(file); + props.load(in); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally{ + try { + if(in != null) + in.close(); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + if(file != null) + log.error("释放"+file.getName()+"配置文件失败",e); + } + } + return props; + } + + public static String getPropertyValue(File file,String key) { + Properties props=getProperties(file); + return (String) props.get(key); + } + + private Properties properties; + + public void setProperties(Properties properties) { + this.properties = properties; + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java new file mode 100644 index 0000000..dbde4ce --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/QiniuUtils.java @@ -0,0 +1,189 @@ +package org.dromara.settlement.common; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.qiniu.common.QiniuException; +import com.qiniu.common.Zone; +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import com.qiniu.util.StringMap; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.net.HttpURLConnection; +import java.net.URL; +import org.dromara.settlement.domain.qiniu.UploadPolicy; +import org.dromara.settlement.domain.qiniu.ImageInfo; + +public class QiniuUtils { + private static final Logger log = LoggerFactory.getLogger(QiniuUtils.class); + + /** + * 获取上传凭证 config 上传配置 + * + * @return + */ + public static String getUptoken(String accessKey,String secretKey,String bucket,UploadPolicy policy, String pipeline) { + try { + Auth auth = getAuth(accessKey,secretKey); + // 请确保该bucket已经存在 + if(policy != null && policy.getDeadline() == 0) + policy.setDeadline(3600L);// 默认1个小时,秒 + StringMap map = null; + if (policy != null) { + map = new StringMap(); + if (!StringUtils.isBlank(policy.getScope())) + map.put("scope",policy.getScope()); + if (!StringUtils.isBlank(policy.getCallbackUrl())) + map.put("callbackUrl",policy.getCallbackUrl()); + if (!StringUtils.isBlank(policy.getCallbackBody())) + map.put("callbackBody",policy.getCallbackBody()); + if (!StringUtils.isBlank(policy.getReturnUrl())) + map.put("returnUrl",policy.getReturnUrl()); + if (!StringUtils.isBlank(policy.getReturnBody())) + map.put("returnBody",policy.getReturnBody()); + if (!StringUtils.isBlank(policy.getEndUser())) + map.put("endUser",policy.getEndUser()); + if (!StringUtils.isBlank(policy.getSaveKey())) + map.put("saveKey",policy.getSaveKey()); + if (policy.getInsertOnly() > 0) + map.put("insertOnly",policy.getInsertOnly()); + if (policy.getDetectMime() > 0) + map.put("detectMime",policy.getDetectMime()); + if (policy.getFsizeLimit() > 0) + map.put("fsizeLimit",policy.getFsizeLimit()); + if (!StringUtils.isBlank(policy.getPersistentNotifyUrl())) + map.put("persistentNotifyUrl",policy + .getPersistentNotifyUrl()); + if (!StringUtils.isBlank(policy.getPersistentOps())) + map.put("persistentOps",policy.getPersistentOps()); + if (!StringUtils.isBlank(pipeline)) + map.put("persistentPipeline",pipeline); + } + if(map != null) + return auth.uploadToken(bucket, null, policy.getDeadline(), map); + return auth.uploadToken(bucket); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return ""; + } + + public static Auth getAuth(String accessKey,String secretKey) { + return Auth.create(accessKey, secretKey); + } + + public static String getFilePath(String domain,String key) { + if (StringUtils.isNotBlank(key) + && key.indexOf("/") == -1) { + return domain + key; + } + return key; + } + + /** + * 根据URL获取对应七牛的key + * + * @param url + * @return + */ + public static String getKeyByUrl(String domain,String url) { + String prefix = domain; + if (StringUtils.isNotBlank(url) && url.indexOf(prefix) != -1) + return url.substring(prefix.length()); + return url; + } + + /** + * 获取七牛中图片基础信息 + * @author 张涛 + * @date 2016年3月22日 + * @param url + * @return + */ + public static ImageInfo getImageInfo(String url){ + ImageInfo imageInfo = null; + String oldUrl = url; + try { + url += "?imageInfo"; + PostDataTools post = PostDataTools.getIstance(); + String result = post.sendMessageNullParam(url, RequestMethod.GET,null,false); + imageInfo = JSONObject.parseObject(result, ImageInfo.class); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + imageInfo = new ImageInfo(); + log.error(e.getMessage(), e); + } + imageInfo.setUrl(oldUrl); + return imageInfo; + } + + /** + * 获取上传七牛的文件大小 + * + * @param key + * @return + */ + public static Long getFileSize(String domain,String key) { + /* + * RSClient client = new RSClient(getMac()); Entry statRet = + * client.stat(getBucket(), key); if(statRet != null) return + * statRet.getFsize(); return Long.valueOf("0"); + */ + HttpURLConnection connection = null; + try { + URL url = new URL(getFilePath(domain,key)); + connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(5000); + connection.setRequestMethod("GET"); + int res = connection.getResponseCode(); + if (res == 200) { + return Integer.valueOf(connection.getContentLength()) + .longValue(); + } + } catch (Exception e) { + return Long.parseLong(0+""); + } finally { + if (connection != null) + connection.disconnect(); + } + return Long.parseLong(0+""); + } + + public static DefaultPutRet upLoadFile(String accessKey,String secretKey,String bucket,String display,String fileName) + { +// ImageUtil.GenerateImage(display, "d:/soft/" +fileName + ".jpg"); + DefaultPutRet putRet = null; + Configuration cfg = new Configuration(Zone.zone0()); //zong1() 代表华北地区 + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = getAuth(accessKey,secretKey); + String upToken = auth.uploadToken(bucket); + try { + byte[] b = Base64.decodeBase64(new String(display).getBytes()); + Response response = uploadManager.put(b, fileName, upToken); + //解析上传成功的结果 + putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + System.out.println(putRet.key); + System.out.println(putRet.hash); + } catch (QiniuException ex) { + Response r = ex.response; + System.err.println(r.toString()); + try { + System.err.println(r.bodyString()); + } catch (QiniuException ex2) { + //ignore + } + } + catch(Exception e) + { + e.printStackTrace(); + } + return putRet; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java new file mode 100644 index 0000000..08fb7ae --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongConfig.java @@ -0,0 +1,25 @@ +package org.dromara.settlement.common.bank.jiaotong; + +public class JiaoTongConfig { + public String CorpNo = "0009848835_"; + + public String UserNo = "00003_"; + + public String URL = "http://218.28.196.178:18899/_"; + + public String SUPERACC = "411611999011002389355_"; + + public String SUPERACCNAME = "河南晟润数字科技有限公司_"; + + public String CUSTNO = "0115684019501638_"; + + public String CALLBACKHOST = "218.28.196.178_"; + + public String CALLBACKPORT = "12022_"; + + public String CALLBACKNAME = "jiaotong_"; + + public String CALLBACKPASSWORD = "jichai@2022_"; + + public String PAYTYPE = "S_"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java new file mode 100644 index 0000000..9e92f82 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongResponse.java @@ -0,0 +1,45 @@ +package org.dromara.settlement.common.bank.jiaotong; + +import org.dom4j.Element; + +public class JiaoTongResponse { + private String resultcode; + + private String resultmsg; + + private String reqid; + + private Element data; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public Element getData() { + return data; + } + + public void setData(Element data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java new file mode 100644 index 0000000..9e161cf --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/jiaotong/JiaoTongUtil.java @@ -0,0 +1,243 @@ +package org.dromara.settlement.common.bank.jiaotong; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import com.alibaba.fastjson.JSONObject; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class JiaoTongUtil { + private static final Logger log = LoggerFactory.getLogger(JiaoTongUtil.class); + + private static class SingletonHolder { + private static final JiaoTongUtil INSTANCE = new JiaoTongUtil(); + } + + private JiaoTongUtil() { + } + + public static final JiaoTongUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + System.out.println(5%2); + } + + public Result request(JiaoTongConfig config, String funcode, String reqid, String body) { + // AES加密 + String request = ""; + String res = ""; + try { + StringBuilder sb = new StringBuilder(); + sb.append(""); + sb.append(""); + sb.append("" + funcode + ""); + sb.append("" + config.CorpNo + ""); + sb.append("" + config.UserNo + ""); + sb.append("" + reqid + ""); + Date curDate = new Date(); + sb.append("" + + DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, curDate).replace("-", "") + + ""); + sb.append("" + + DateUtils.parseDateToString(DateUtils.HH_mm_ss, curDate).replace("-", "") + + ""); + sb.append("1"); + sb.append("0"); + sb.append(""); + sb.append(""); + sb.append(body); + sb.append(""); + sb.append(""); + request = sb.toString(); + log.info("request: (" + config.URL+"),"+request); + res = doPostForm(config.URL, request); + log.info("response: " + res); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("交通银行api调用出错(" + JSONObject.toJSONString(config) + "," + funcode + "," + reqid + "," + body + + "):", e); + } + Result rtn = new Result(); + rtn.setResult(request); + rtn.setRtnData(res); + return rtn; + } + + public Result response(JiaoTongConfig config, String response) { + // 解密请求 + Result rtn = new Result(); + if (StringUtils.isBlank(response)) { + rtn.addError("响应内容不能为空"); + return rtn; + } + try { + Document doc = DocumentHelper.parseText(response); + Element rootElt = doc.getRootElement(); + Element head = rootElt.element("head"); + JiaoTongResponse data = new JiaoTongResponse(); + data.setData(rootElt.element("body")); + data.setReqid(head.elementText("req_no")); + data.setResultcode(head.elementText("particular_code")); + data.setResultmsg(head.elementText("ans_info") + ":" + head.elementText("particular_info")); + rtn.setRtnData(data); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("解析交通银行响应出错(" + JSONObject.toJSONString(config) + "," + response + "):", e); + } + return rtn; + } + + // 发送Post请求 + public String doPostForm(String httpUrl, String xml) throws Exception { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + if (StringUtils.isNotBlank(httpUrl)) { + URL url = new URL(httpUrl); + SSLContext sslcontext; + sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[] { new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } }, new java.security.SecureRandom()); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + + // 新建连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置为POST请求 + connection.setRequestMethod("POST"); + // 设置连接超时时长 + connection.setConnectTimeout(15000); + // 设置读取超时 + connection.setReadTimeout(60000); + connection.setInstanceFollowRedirects(true); + + connection.setDoOutput(true); + connection.setDoInput(true); + + connection.setRequestProperty("Content-Type", "application/xml"); + os = connection.getOutputStream(); + os.write(xml.getBytes("GBK")); + if (connection.getResponseCode() != 200) { + is = connection.getErrorStream(); + } else { + is = connection.getInputStream(); + } + br = new BufferedReader(new InputStreamReader(is, "GBK")); + StringBuilder sbf = new StringBuilder(); + String temp = null; + while ((temp = br.readLine()) != null) { + sbf.append(temp); + } + result = sbf.toString(); + } + } finally { + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 关闭连接 + if(connection != null) { + connection.disconnect(); + } + } + return result; + } + + /** + * 解析多域串内容 + * @author 张涛 + * @date 2022年7月1日 + * @param dataStr 多域串内容 + * @param fieldNum 字段数 + * @return + */ + public List> getMutiAreaData(String dataStr,int fieldNum){ + List> data = new ArrayList>(); + if (StringUtils.isNotBlank(dataStr)) { + String[] dataArr = dataStr.split("\\|"); + if (dataArr.length > fieldNum) { + //key:字段索引 value:字段名称 + Map fieldIndex = new HashMap(); + Map rowData = null; + for (int i = 0,len = dataArr.length; i < len; i++) { + if (i < fieldNum) { + fieldIndex.put(i, dataArr[i]); + }else { + Integer index = i % fieldNum;//当前字段索引 + if (index == 0) { + rowData = new HashMap(); + data.add(rowData); + } + rowData.put(fieldIndex.get(index), dataArr[i]); + } + } + } + } + return data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java new file mode 100644 index 0000000..82b8d46 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityResult.java @@ -0,0 +1,60 @@ +package org.dromara.settlement.common.bank.minsheng; + +/** + * 加解密实体类 + * + * @author adt-huangyh + */ +public class EcpSecurityResult { + /** + * 明文 + */ + private String plainText; + + /** + * 签名 + */ + private String signature; + + /** + * 密文 + */ + private String cipherText; + + /** + * 验签结果 + */ + private boolean verifyPass; + + public String getPlainText() { + return plainText; + } + + public void setPlainText(String plainText) { + this.plainText = plainText; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getCipherText() { + return cipherText; + } + + public void setCipherText(String cipherText) { + this.cipherText = cipherText; + } + + public boolean isVerifyPass() { + return verifyPass; + } + + public void setVerifyPass(boolean verifyPass) { + this.verifyPass = verifyPass; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java new file mode 100644 index 0000000..6283557 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/EcpSecurityUtil.java @@ -0,0 +1,263 @@ +package org.dromara.settlement.common.bank.minsheng; + +import cmbc.cfca.sm2.signature.SM2PublicKey; +import cmbc.cfca.sm2rsa.common.Mechanism; +import cmbc.cfca.util.CertUtil; +import cmbc.cfca.util.EnvelopeUtil; +import cmbc.cfca.util.KeyUtil; +import cmbc.cfca.util.SignatureUtil2; +import cmbc.cfca.util.cipher.lib.JCrypto; +import cmbc.cfca.x509.certificate.X509Cert; +import cmbc.cfca.x509.certificate.X509CertHelper; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.security.PrivateKey; +import java.security.PublicKey; + +/* * + * 加解密工具类 + * 使用民生定制cfca安全处理包,解决商户方多个jar包版本的冲突问题 + * @author adt-huangyh + * + */ +public class EcpSecurityUtil { + private static final Logger logger = LoggerFactory.getLogger(EcpSecurityUtil.class); + private static final String charset = "utf-8"; + private static final String signAlg = cmbc.cfca.sm2rsa.common.Mechanism.SM3_SM2; + private static cmbc.cfca.util.cipher.lib.Session session = null; + + static { + try { + JCrypto.getInstance().initialize(JCrypto.JSOFT_LIB, null); + session = JCrypto.getInstance().openSession(JCrypto.JSOFT_LIB); + } catch (cmbc.cfca.sm2rsa.common.PKIException e) { + logger.error("获取session失败:" + e.getMessage()); + } + } + + /** + * 加密加签 + * + * @param plainText 明文 + * @param priKeyPath 私钥路径 + * @param priKeyPwd 私钥密码 + * @param certPath 公钥路径 + * @return + * @throws Exception + */ + public static EcpSecurityResult encryptAndSign(String plainText, String priKeyPath, String priKeyPwd, + String certPath) throws Exception { + EcpSecurityResult sr = new EcpSecurityResult(); + String cipherText = encrypt(plainText, certPath); + sr.setCipherText(cipherText); + String signature = sign(plainText, priKeyPath, priKeyPwd); + sr.setSignature(signature); + return sr; + } + + /** + * 使用公钥进行Sm2加密 + * + * @param plainText 明文 + * @param certPath 公钥路径 + * @return + * @throws Exception + * @function + */ + public static String encrypt(String plainText, String certPath) throws Exception { + X509Cert cert = null; + logger.debug("明文:" + plainText); + try { + cert = X509CertHelper.parse(certPath); + } catch (Throwable t) { + String errMsg = "公钥文件加载失败。sm2Path=" + certPath; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + try { + X509Cert[] certs = {cert}; + byte[] base64Bytes = EnvelopeUtil.envelopeMessage(plainText.getBytes(charset), Mechanism.SM4_CBC, certs, session); + String cipherText = new String(base64Bytes, charset); + logger.debug("密文:" + cipherText); + return cipherText; + } catch (Throwable t) { + String msg = "加密失败"; + logger.error(msg); + throw new Exception(msg, t); + } + + } + + /** + * 签名 + * + * @param plainText 待签名的明文 + * @param priKeyPath 己方私钥文件路径 + * @param priKeyPwd 己方私钥文件密码 + * @return + * @throws Exception + * @function + */ + public static String sign(String plainText, String priKeyPath, String priKeyPwd) throws Exception { + String signature = null; + logger.debug("签名开始。。"); + String sm2FileData = readFileToString(priKeyPath, charset); + try { + PrivateKey priKey = KeyUtil.getPrivateKeyFromSM2(sm2FileData.getBytes(charset), priKeyPwd); + SignatureUtil2 signatureUtil = new SignatureUtil2(); + signatureUtil.setSm2WithZFlag(true); + // 签名 + byte[] base64P1SignedData = signatureUtil.p1SignMessage(signAlg, + plainText.getBytes(charset), priKey, session); + signature = new String(base64P1SignedData, charset); + logger.debug("签名内容:" + signature); + } catch (Exception e) { + logger.error("签名失败"); + throw new Exception("签名失败", e); + } + return signature; + } + + /** + * 解密 + * + * @param cipherText 密文 + * @param signature 签名 + * @param priKeyPath 私钥路径 + * @param priKeyPwd 私钥密码 + * @param pubKeyPath 公钥路径 + * @return + * @throws Exception + */ + public static EcpSecurityResult decryptAndVerify(String cipherText, String signature, String priKeyPath, String priKeyPwd, String pubKeyPath) throws Exception { + EcpSecurityResult sr = new EcpSecurityResult(); + sr.setCipherText(cipherText); + sr.setSignature(signature); + PrivateKey priKey; + X509Cert cert; + try { + priKey = getPrivateKeyFromSM2Path(priKeyPath, priKeyPwd); + cert = getX509CertFromSm2Path(priKeyPath); + byte[] base64Bytes = cipherText.getBytes(charset); + byte[] decryptBytes = EnvelopeUtil.openEvelopedMessage(base64Bytes, priKey, cert, session); + String decryptText = new String(decryptBytes, charset); + sr.setPlainText(decryptText); + } catch (Throwable t) { + String msg = "解密失败"; + logger.error(msg); + throw new Exception(msg, t); + } + //验签 + try { + PublicKey publicKey = getPublicKeyFromCertPath(pubKeyPath); + boolean verifyResult = verifySignature(sr.getPlainText(), + signature, publicKey); + sr.setVerifyPass(verifyResult); + } catch (Exception e) { + String msg = "验签失败"; + logger.error(msg); + throw new Exception(msg, e); + } + return sr; + } + + private static boolean verifySignature(String plainText, String signature, PublicKey publicKey) throws Exception { + if (plainText == null || signature == null) { + return true; + } + logger.debug("签名明文:" + plainText); + logger.debug("签名:" + signature); + //验签 + SignatureUtil2 signatureUtil = new SignatureUtil2(); + signatureUtil.setSm2WithZFlag(true); + SM2PublicKey pubKey = (SM2PublicKey) publicKey; + + boolean verifyResult = signatureUtil.p1VerifyMessage(signAlg, + plainText.getBytes(charset), signature.getBytes(charset), pubKey, + session); + logger.debug("验签结果:" + String.valueOf(verifyResult)); + return verifyResult; + } + + + /** + * 从文件路径读取sm2文件。首先从缓存中查找是否有该文件路径的文件,若有则直接取出。若无则从文件系统中读取,并写入缓存。 + * + * @param sm2FilePath + * @param sm2FilePwd + * @return + * @throws Exception + * @function + */ + private static PrivateKey getPrivateKeyFromSM2Path(String sm2FilePath, String sm2FilePwd) throws Exception { + + String sm2FileData = readFileToString(sm2FilePath, charset); + PrivateKey priKey; + try { + priKey = KeyUtil.getPrivateKeyFromSM2(sm2FileData.getBytes(charset), sm2FilePwd); + } catch (Throwable t) { + String errMsg = "私钥文件加载失败。sm2FilePath=" + sm2FilePath; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + return priKey; + + } + + private static X509Cert getX509CertFromSm2Path(String sm2Path) throws Exception { + X509Cert cert; + try { + cert = CertUtil.getCertFromSM2(sm2Path); + } catch (Throwable t) { + String errMsg = "公钥文件加载失败。sm2Path=" + sm2Path; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + + + return cert; + + } + + /** + * 从文件路径读取公钥。首先从缓存中查找是否有该文件路径的文件,若有则直接取出。若无则从文件系统中读取,并写入缓存。 + * + * @param certPath + * @return + * @throws Exception + * @function + */ + private static PublicKey getPublicKeyFromCertPath(String certPath) throws Exception { + + PublicKey publicKey; + String certData = readFileToString(certPath, charset); + try { + X509Cert cert = X509CertHelper.parse(certData.getBytes()); + publicKey = cert.getPublicKey(); + + } catch (Throwable t) { + String errMsg = "公钥文件加载失败。certPath=" + certPath; + logger.error(errMsg); + throw new Exception(errMsg, t); + } + return publicKey; + + } + + private static String readFileToString(String fileName, String encoding) { + File file = new File(fileName); + if (!file.exists()) { + throw new RuntimeException(fileName + "文件不存在"); + } + try { + return FileUtils.readFileToString(file, encoding); + } catch (IOException e) { + throw new RuntimeException(fileName + "读取文件失败", e); + } + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java new file mode 100644 index 0000000..108506e --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/FileEncryptAndDecryptUtil.java @@ -0,0 +1,136 @@ +package org.dromara.settlement.common.bank.minsheng; + +import cmbc.cfca.sm2rsa.common.Mechanism; +import cmbc.cfca.sm2rsa.common.PKIException; +import cmbc.cfca.util.CertUtil; +import cmbc.cfca.util.EnvelopeUtil; +import cmbc.cfca.util.KeyUtil; +import cmbc.cfca.util.SignatureUtil2; +import cmbc.cfca.util.cipher.lib.JCrypto; +import cmbc.cfca.util.cipher.lib.Session; +import cmbc.cfca.x509.certificate.X509Cert; +import cmbc.cfca.x509.certificate.X509CertHelper; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.security.PrivateKey; + + +/** + * 联调外联平台 用 bankcersm2.cer和corp.sm2 ,仅可用于加密 和 解密外联平台传输过来的文件和报文 + */ +public class FileEncryptAndDecryptUtil { + /** + * 以下用到的文件或存放文件的目录需提前建好,否则报错 + */ + public static void main(String[] args) { + + /*String path = Thread.currentThread().getContextClassLoader().getResource("file/mhtText.txt").getPath(); + + File file = new File(path); + String path1 = file.getPath(); + String name = file.getName(); + String filePath = path1.substring(0, path1.length() - name.length()); + // 商户私钥 + String sm2MhtPriCertPath = Thread.currentThread().getContextClassLoader().getResource(TestDemo.SM2_MERCHANT_PRIVATE_CERT_NAME).getPath(); + //银行公钥 + String sm2CmbcPubCertPath = Thread.currentThread().getContextClassLoader().getResource(TestDemo.SM2_CMBC_PUBLIC_CERT_NAME).getPath(); + String sm2Psword = TestDemo.SM2_MERCHANT_PRIVATE_CERT_PSWORD; + try { + //加密 + encryptFile(name, filePath, sm2MhtPriCertPath, sm2Psword, sm2CmbcPubCertPath); + //解密 + String encryptedFileName = "CMBC_LOAN_20230219.csv"; + decryptFile(encryptedFileName, filePath, sm2MhtPriCertPath, sm2Psword); + } catch (Exception e) { + e.printStackTrace(); + }*/ + } + + /** + * 文件加签加密 + * a.商户使用商户私钥对文件进行签名 + * b.商户使用银行公钥对签名后的文件进行加密(测试环境请用 corp.sm2和bankcersm2.cer) + * + * @param fileName 要加密的文件名 + * @param filePath 要加密的文件所在路径 + * @param sm2MhtPriCertPath 商户sm2私钥证书路径 + * @param sm2MhtPriCertPsword 商户sm2私钥证书密码 + * @param sm2CmbcPubCertPath 民生sm2 公钥证书路径 + * @throws Exception + */ + public static void encryptFile(String fileName, String filePath, String sm2MhtPriCertPath, String sm2MhtPriCertPsword, String sm2CmbcPubCertPath) throws Exception { + + //商户加密 + + // 签名 + X509Cert mhtSM2Cert = CertUtil.getCertFromSM2(sm2MhtPriCertPath); + PrivateKey mhtPriKey = KeyUtil.getPrivateKeyFromSM2(sm2MhtPriCertPath, sm2MhtPriCertPsword); + + // 待加密文件路径 + String sourceFilePath = filePath + fileName; + //签名后文件路径 + String signFilePath = filePath + "\\sign\\" + fileName; + //加密后文件路径 + String encryptFilePath = filePath + "\\encrypt\\" + fileName; + Session session = getSession(); + + SignatureUtil2 signatureUtil2 = new SignatureUtil2(); + // SM2签名包含Z值 + signatureUtil2.setSm2WithZFlag(true); + String signAlg = Mechanism.SM3_SM2; + signatureUtil2.p7SignFileAttach(signAlg, sourceFilePath, signFilePath, mhtPriKey, mhtSM2Cert, session); + + //加密 + X509Cert bankX509Cert = X509CertHelper.parse(FileUtils.readFileToByteArray(new File(sm2CmbcPubCertPath))); + X509Cert[] bankCertArr = new X509Cert[]{bankX509Cert}; + String encryptAlgrithm = Mechanism.SM4_CBC; + EnvelopeUtil.envelopeFile(signFilePath, encryptFilePath, encryptAlgrithm, bankCertArr, session); + + } + + /** + * 文件解密验签 + * a.商户使用银行公钥对文件进行解密 + * b.对文件进行验签(测试环境请用 corp.sm2和bankcersm2.cer) + * + * @param encryptFileName 要解密验签的文件 + * @param filePath 要加密的文件所在路径 + * @param sm2MhtPriCertPath 商户sm2私钥证书路径 + * @param sm2Psword 商户sm2私钥证书密码 + * @param outSourceFilePath 验签后文件路径--解密验签后的明文路径 + * @throws Exception + */ + public static String decryptFile(String encryptFileName, String filePath, String sm2MhtPriCertPath, String sm2Psword,String outSourceFilePath) throws Exception { + String encryptFilePath = filePath + encryptFileName; + // 解密后待验签文件路径 + String veryfiSignFilePath = filePath + "veryfiSign" + encryptFileName; + // 银行私钥 + SignatureUtil2 signatureUtil2 = new SignatureUtil2(); + // 解密 + Session session = getSession(); + + PrivateKey mhtPriKey = KeyUtil.getPrivateKeyFromSM2(sm2MhtPriCertPath, sm2Psword); + X509Cert mhtRcvX509Cert = CertUtil.getCertFromSM2(sm2MhtPriCertPath); + EnvelopeUtil.openEnvelopedFile(encryptFilePath, veryfiSignFilePath, mhtPriKey, mhtRcvX509Cert, session); + + // 校验 + boolean verifyResult = signatureUtil2.p7VerifyFileAttach(veryfiSignFilePath, outSourceFilePath, session); + System.out.println("验签结果:" + verifyResult); + new File(veryfiSignFilePath).delete(); + return outSourceFilePath; + } + + /** + * 获取Session + * + * @return + * @throws PKIException + */ + private static Session getSession() throws PKIException { + String deviceName = JCrypto.JSOFT_LIB; + JCrypto.getInstance().initialize(deviceName, null); + Session session = JCrypto.getInstance().openSession(deviceName); + return session; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java new file mode 100644 index 0000000..f3e3090 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConfig.java @@ -0,0 +1,74 @@ +package org.dromara.settlement.common.bank.minsheng; + +public class MinShengConfig { + /* + 商户号 + */ + public String merchantNum = "0009848835_"; + + /* + 系统编码 + */ + public String systemCode = "00003_"; + + /* + 接口URL + */ + public String URL = "https://ecptest.cmbc.com.cn:10061/ecp/httpMhtInFwd_"; + + /* + ssl证书 + */ + public String rsaCertPath = "cert/RSA_2048.pfx"; + /* + ssl证书密码 + */ + public String rsaCertPsword = "test123456"; + /* + 商户SM2私钥证书 + */ + public String sm2MhtPriCertPath = "cert/corp.sm2"; + /* + 商户SM2私钥证书密码 + */ + public String sm2MhtPriCertPsword = "test123456"; + /* + 银行公钥 + */ + public String sm2CmbcPubCert = "cert/bankcersm2.cer"; + + /** + * 安全开关 + */ + public Boolean securitySwitch = true; + + /** + * 是否走https + */ + public Boolean isSSL = true; + + /** + * 实账户账号 + */ + public String acctNo; + + /** + * 客户签约编码 + */ + public String customerSignId; + + /** + * 产品编码 + */ + public String productCode; + + public String CALLBACKHOST = "218.28.196.178_"; + + public String CALLBACKPORT = "12022_"; + + public String CALLBACKNAME = "jiaotong_"; + + public String CALLBACKPASSWORD = "jichai@2022_"; + + public String CALLBACKDIRECTORY = "home"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java new file mode 100644 index 0000000..62b2115 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengConstants.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.common.bank.minsheng; + +public interface MinShengConstants { + public static final String VERSION_02 = "02"; + public static final String DEFAULT_CHARSET = "utf-8"; + public static String CHANNEL_TYPE = "WG00"; + public static String TRANSL_TYPE = "000010"; + + public static final String TRANSCODE = "transCode"; + public static final String TRANSTYPE = "transType"; + public static final String VERSION = "version"; + public static final String REQ_SEQ = "reqSeq"; + public static final String REQ_TIME = "reqTime"; + public static final String TRANS_DATE = "transDate"; + public static final String TRANS_TIME = "transTime"; + public static final String CHARSET = "charset"; + public static final String MERCHANT_NUM = "merchantNum"; + public static final String SYSTEM_CODE = "systemCode"; + public static final String REMARK = "remark"; + public static final String RESERVE = "reserve"; + public static final String RESERVE2 = "reserve2"; + public static final String SGNTR = "sgntr"; + public static final String PRODUCT_CODE = "productCode"; + + public static final String BODY = "body"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java new file mode 100644 index 0000000..f98bb39 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengResponse.java @@ -0,0 +1,179 @@ +package org.dromara.settlement.common.bank.minsheng; + +import com.alibaba.fastjson.JSONObject; +import org.dom4j.Element; + +public class MinShengResponse { + private String reqid; + private String resultcode; + private String resultmsg; + private JSONObject data; + + private String transCode; // 交易码 + private String reqSeq; // 请求方流水号 + private String respSeq; // 响应方流水号 + private String merchantNum; //客户识别号 + private String txTime; // 账务交易时间 + private String respDate; // 交易日期 + private String respTime; // 响应时间 + private String respStatus; // 响应结果状态 + private String respCode; // 响应错误码 + private String respDesc; // 响应错误信息 + private String charset; // 参数编码字符集 + private String remark; // 备注 + private String reserve; // 备用字段 + private String reserve2; // 原样返回 + private String sgntr; // 签名 + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getReqSeq() { + return reqSeq; + } + + public void setReqSeq(String reqSeq) { + this.reqSeq = reqSeq; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public JSONObject getData() { + return data; + } + + public void setData(JSONObject data) { + this.data = data; + } + + public String getTransCode() { + return transCode; + } + + public void setTransCode(String transCode) { + this.transCode = transCode; + } + + public String getRespSeq() { + return respSeq; + } + + public void setRespSeq(String respSeq) { + this.respSeq = respSeq; + } + + public String getMerchantNum() { + return merchantNum; + } + + public void setMerchantNum(String merchantNum) { + this.merchantNum = merchantNum; + } + + public String getTxTime() { + return txTime; + } + + public void setTxTime(String txTime) { + this.txTime = txTime; + } + + public String getRespTime() { + return respTime; + } + + public void setRespTime(String respTime) { + this.respTime = respTime; + } + + public String getRespStatus() { + return respStatus; + } + + public void setRespStatus(String respStatus) { + this.respStatus = respStatus; + } + + public String getRespCode() { + return respCode; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public String getRespDesc() { + return respDesc; + } + + public void setRespDesc(String respDesc) { + this.respDesc = respDesc; + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getReserve() { + return reserve; + } + + public void setReserve(String reserve) { + this.reserve = reserve; + } + + public String getReserve2() { + return reserve2; + } + + public void setReserve2(String reserve2) { + this.reserve2 = reserve2; + } + + public String getSgntr() { + return sgntr; + } + + public void setSgntr(String sgntr) { + this.sgntr = sgntr; + } + + public String getRespDate() { + return respDate; + } + + public void setRespDate(String respDate) { + this.respDate = respDate; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java new file mode 100644 index 0000000..ab93da3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/minsheng/MinShengUtil.java @@ -0,0 +1,254 @@ +package org.dromara.settlement.common.bank.minsheng; + +import com.alibaba.fastjson.JSONObject; + +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.alibaba.nacos.shaded.com.google.gson.GsonBuilder; +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLDecoder; +import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.*; + +public class MinShengUtil { + private static final Logger log = LoggerFactory.getLogger(MinShengUtil.class); + + private static class SingletonHolder { + private static final MinShengUtil INSTANCE = new MinShengUtil(); + } + + /** + * 初始化状态 + */ + private static boolean sslInited = false; + private static SSLConnectionSocketFactory sslsf; + + private MinShengUtil() { + + } + + public static final MinShengUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + System.out.println(5%2); + } + + private void initSSL(String clientKeyStoryPath, String clientKeyStoryPassword) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableKeyException { + //构造SSL环境 + SSLContext sslContext = SSLContext.getInstance("SSL"); + //keyStore类型,JKS、pkcs12 + KeyStore keyStore = KeyStore.getInstance("pkcs12"); + //创建jks密钥访问库 + if (null != clientKeyStoryPassword && null != clientKeyStoryPath && clientKeyStoryPassword.length() > 0 && clientKeyStoryPath.length() > 0) { + keyStore.load(new FileInputStream(clientKeyStoryPath), clientKeyStoryPassword.toCharArray()); + } else { + throw new RuntimeException("SSL认证证书路径或密码为空。"); + } + //创建管理jks密钥库的x509密钥管理器,用来管理密钥,需要key的密码 + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); + keyManagerFactory.init(keyStore, clientKeyStoryPassword.toCharArray()); + //只允许使用TLSv1协议 + sslContext.init(keyManagerFactory.getKeyManagers(), null, null); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + sslsf = new SSLConnectionSocketFactory(sslContext, new String[]{"TLSv1"}, null, ignoreHostnameVerifier); + } + + public Result request(MinShengConfig config, String transCode, String reqid, String body) { + // AES加密 + String request = ""; + String res = ""; + CloseableHttpClient httpclient = null; + CloseableHttpResponse response = null; + try { + List params = null; + boolean securitySwitch = config.securitySwitch == null || config.securitySwitch; + //加密和加签 + if (securitySwitch) { + EcpSecurityResult sr = EcpSecurityUtil.encryptAndSign(body, config.sm2MhtPriCertPath, config.sm2MhtPriCertPsword, + config.sm2CmbcPubCert); + // 组装form表单数据 + params = getRequestForm(reqid,transCode,sr.getSignature(), sr.getCipherText(), config); + } else { + params = getRequestForm(reqid,transCode,null, body, config); + } + // 是否使用https + boolean isSSL = config.isSSL; + if (isSSL) { + if (!sslInited) { + initSSL(config.rsaCertPath, config.rsaCertPsword); + } + httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + } else { + httpclient = HttpClients.custom().build(); + } + HttpPost httpPost = new HttpPost(config.URL); + RequestConfig httpConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000) + .setConnectionRequestTimeout(60000).build(); + httpPost.setConfig(httpConfig); + UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity(params, MinShengConstants.DEFAULT_CHARSET); + httpPost.setEntity(reqEntity); + try { + StringWriter writer = new StringWriter(); + IOUtils.copy(reqEntity.getContent(), writer, "utf-8"); + request = URLDecoder.decode(writer.toString(), "UTF-8"); + } catch (IOException e) { + log.error("民生银行api参数解析出错:", e); + } + log.info("request: (" + config.URL+"),"+request); + response = httpclient.execute(httpPost); + if(response == null){ + throw new RuntimeException("发送请求后返回报文为空"); + } + HttpEntity respEntity = response.getEntity(); + if (respEntity != null) { + res = EntityUtils.toString(respEntity, MinShengConstants.DEFAULT_CHARSET); + } + log.info("response: " + res); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("民生银行api调用出错(" + JSONObject.toJSONString(config) + "," + transCode + "," + reqid + "," + body + + "):", e); + } finally { + try { + if (null != response) { + response.close(); + } + if (null != httpclient) { + httpclient.close(); + } + } catch (IOException e) { + log.error("民生银行api调用时IO出错(" + JSONObject.toJSONString(config) + "," + transCode + "," + reqid + "," + body + + "):", e); + } + } + Result rtn = new Result(); + rtn.setResult(request); + rtn.setRtnData(res); + return rtn; + } + + public Result response(MinShengConfig config, String response) { + // 解密请求 + Result rtn = new Result(); + if (StringUtils.isBlank(response)) { + rtn.addError("响应内容不能为空"); + return rtn; + } + try { + Gson gson = new GsonBuilder().create(); + Map headMap = gson.fromJson(response, Map.class); + if (headMap == null) { + rtn.addError("响应内容不能为空"); + return rtn; + } + MinShengResponse data = new MinShengResponse(); + data.setTransCode(headMap.get("transCode")); + data.setReqSeq(headMap.get("reqSeq")); + data.setRespSeq(headMap.get("respSeq")); + data.setMerchantNum(headMap.get("merchantNum")); + data.setTxTime(headMap.get("txTime")); + data.setRespDate(headMap.get("respDate")); + data.setRespTime(headMap.get("respTime")); + data.setRespStatus(headMap.get("respStatus")); + data.setRespDesc(headMap.get("respDesc")); + data.setRespCode(headMap.get("respCode")); + data.setCharset(headMap.get("charset")); + data.setRemark(headMap.get("remark")); + data.setReserve(headMap.get("reserve")); + data.setReserve2(headMap.get("reserve2")); + data.setSgntr(headMap.get("sgntr")); + String body = headMap.get("body"); + if (StringUtils.isNotEmpty(body)){ + String bodyJson = body; + if (config.securitySwitch) { + //log.debug("开始解密验签。密文:" + body); + EcpSecurityResult sr = EcpSecurityUtil.decryptAndVerify(body, data.getSgntr(), + config.sm2MhtPriCertPath, config.sm2MhtPriCertPsword, config.sm2CmbcPubCert); + if (StringUtils.isEmpty(sr.getCipherText())) { + rtn.addError("解密失败"); + return rtn; + } + if (!sr.isVerifyPass()) { + rtn.addError("验签失败"); + return rtn; + } + bodyJson = sr.getPlainText(); + } + data.setData(JSONObject.parseObject(bodyJson)); + } + data.setReqid(data.getReqSeq()); + data.setResultcode(data.getRespStatus()); + data.setResultmsg(data.getRespDesc() + "("+data.getRespCode()+")"); + rtn.setRtnData(data); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("解析民生银行响应出错(" + JSONObject.toJSONString(config) + "," + response + "):", e); + } + return rtn; + } + + /** + * 封装请求的form表单 + * + * @param sgntr + * @param body + * @param clientConfig + * @return + */ + private List getRequestForm( + String reqid, String transCode,String sgntr, String body, MinShengConfig clientConfig) { + List form = new ArrayList(); + form.add(new BasicNameValuePair(MinShengConstants.TRANSCODE, transCode)); + form.add(new BasicNameValuePair(MinShengConstants.PRODUCT_CODE, clientConfig.productCode)); + form.add(new BasicNameValuePair(MinShengConstants.MERCHANT_NUM, clientConfig.merchantNum)); + form.add(new BasicNameValuePair(MinShengConstants.SYSTEM_CODE, clientConfig.systemCode)); + form.add(new BasicNameValuePair(MinShengConstants.TRANSTYPE, MinShengConstants.TRANSL_TYPE)); + form.add(new BasicNameValuePair(MinShengConstants.VERSION, MinShengConstants.VERSION_02)); + form.add(new BasicNameValuePair(MinShengConstants.REQ_SEQ, reqid)); + String reqTime = new SimpleDateFormat("yyyyMMddHHmmssSSS") + .format(new Date(System.currentTimeMillis())); + form.add(new BasicNameValuePair(MinShengConstants.REQ_TIME, reqTime)); + form.add(new BasicNameValuePair(MinShengConstants.TRANS_DATE, reqTime.substring(0, 8))); + form.add(new BasicNameValuePair(MinShengConstants.TRANS_TIME, reqTime.substring(8, 17))); + form.add(new BasicNameValuePair(MinShengConstants.CHARSET, MinShengConstants.DEFAULT_CHARSET)); + + form.add(new BasicNameValuePair(MinShengConstants.REMARK, "")); + form.add(new BasicNameValuePair(MinShengConstants.RESERVE, "")); + form.add(new BasicNameValuePair(MinShengConstants.RESERVE2, "")); + + form.add(new BasicNameValuePair(MinShengConstants.SGNTR, sgntr)); + form.add(new BasicNameValuePair(MinShengConstants.BODY, body)); + return form; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java new file mode 100644 index 0000000..775f6ee --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCCryptor.java @@ -0,0 +1,138 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +import java.io.ByteArrayInputStream; +import java.math.BigInteger; +import java.util.Enumeration; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.bouncycastle.asn1.ASN1EncodableVector; +import org.bouncycastle.asn1.ASN1InputStream; +import org.bouncycastle.asn1.ASN1Integer; +import org.bouncycastle.asn1.ASN1Sequence; +import org.bouncycastle.asn1.DERSequence; +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPrivateKeyParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.crypto.params.ParametersWithID; +import org.bouncycastle.crypto.signers.SM2Signer; +import org.bouncycastle.jce.ECNamedCurveTable; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECPoint; + +public class DCCryptor { + + // sm4-cbc 加密 + public static byte[] CMBSM4EncryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception { + if (key == null || iv == null || input == null) { + throw new Exception("CMBSM4EncryptWithCBC 非法输入"); + } + return CMBSM4Crypt(key, iv, input, 1); + } + + // sm4-cbc解密 + public static byte[] CMBSM4DecryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception { + if (key == null || iv == null || input == null) { + throw new Exception("CMBSM4DecryptWithCBC 非法输入"); + } + return CMBSM4Crypt(key, iv, input, 2); + } + + // 签名 + public static byte[] CMBSM2SignWithSM3(byte[] id, byte privkey[], byte msg[]) throws Exception { + if (privkey == null || msg == null) { + throw new Exception("CMBSM2SignWithSM3 input error"); + } + ECPrivateKeyParameters privateKey = encodePrivateKey(privkey); + SM2Signer signer = new SM2Signer(); + ParametersWithID parameters = new ParametersWithID(privateKey, id); + signer.init(true, parameters); + signer.update(msg, 0, msg.length); + return decodeDERSignature(signer.generateSignature()); + } + + // 验签 + public static boolean CMBSM2VerifyWithSM3(byte[] id, byte pubkey[], byte msg[], byte signature[]) throws Exception { + + if (pubkey == null || msg == null || signature == null) { + throw new Exception("CMBSM2VerifyWithSM3 input error"); + } + ECPublicKeyParameters publicKey = encodePublicKey(pubkey); + SM2Signer signer = new SM2Signer(); + ParametersWithID parameters = new ParametersWithID(publicKey, id); + signer.init(false, parameters); + signer.update(msg, 0, msg.length); + return signer.verifySignature(encodeDERSignature(signature)); + } + + private static byte[] CMBSM4Crypt(byte key[], byte iv[], byte input[], int mode) throws Exception { + SecretKeySpec spec = new SecretKeySpec(key, "SM4"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME); + cipher.init(mode, spec, ivParameterSpec); + return cipher.doFinal(input); + } + + private static ECPrivateKeyParameters encodePrivateKey(byte[] value) { + BigInteger d = new BigInteger(1, value); + ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1"); + ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed()); + return new ECPrivateKeyParameters(d, ecParameters); + } + + private static ECPublicKeyParameters encodePublicKey(byte[] value) { + byte[] x = new byte[32]; + byte[] y = new byte[32]; + System.arraycopy(value, 1, x, 0, 32); + System.arraycopy(value, 33, y, 0, 32); + BigInteger X = new BigInteger(1, x); + BigInteger Y = new BigInteger(1, y); + ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1"); + ECPoint Q = spec.getCurve().createPoint(X, Y); + ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed()); + return new ECPublicKeyParameters(Q, ecParameters); + } + + private static byte[] decodeDERSignature(byte[] signature) throws Exception { + ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature)); + ASN1Sequence primitive = (ASN1Sequence) stream.readObject(); + Enumeration enumeration = primitive.getObjects(); + BigInteger R = ((ASN1Integer) enumeration.nextElement()).getValue(); + BigInteger S = ((ASN1Integer) enumeration.nextElement()).getValue(); + byte[] bytes = new byte[64]; + byte[] r = format(R.toByteArray()); + byte[] s = format(S.toByteArray()); + System.arraycopy(r, 0, bytes, 0, 32); + System.arraycopy(s, 0, bytes, 32, 32); + return bytes; + } + + private static byte[] encodeDERSignature(byte[] signature) throws Exception { + byte[] r = new byte[32]; + byte[] s = new byte[32]; + System.arraycopy(signature, 0, r, 0, 32); + System.arraycopy(signature, 32, s, 0, 32); + ASN1EncodableVector vector = new ASN1EncodableVector(); + vector.add(new ASN1Integer(new BigInteger(1, r))); + vector.add(new ASN1Integer(new BigInteger(1, s))); + return (new DERSequence(vector)).getEncoded(); + } + + private static byte[] format(byte[] value) { + if (value.length == 32) { + return value; + } else { + byte[] bytes = new byte[32]; + if (value.length > 32) { + System.arraycopy(value, value.length - 32, bytes, 0, 32); + } else { + System.arraycopy(value, 0, bytes, 32 - value.length, value.length); + } + return bytes; + } + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java new file mode 100644 index 0000000..325dd69 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/DCHelper.java @@ -0,0 +1,204 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +import com.alibaba.nacos.shaded.com.google.gson.JsonArray; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeSet; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + + +public class DCHelper { + + public static String serialJsonOrdered(JsonObject json) throws Exception { + StringBuilder appender = new StringBuilder(); + appender.append("{"); + Iterator keys = new TreeSet<>(json.keySet()).iterator(); + boolean isFirstEle = true; + while (keys.hasNext()) { + if (!isFirstEle) { + appender.append(","); + } + String key = keys.next(); + Object val = json.get(key); + if (val instanceof JsonObject) { + appender.append("\"").append(key).append("\":"); + appender.append(serialJsonOrdered((JsonObject) val)); + } else if (val instanceof JsonArray) { + JsonArray jarray = (JsonArray) val; + appender.append("\"").append(key).append("\":["); + boolean isFirstArrEle = true; + for (int i = 0; i < jarray.size(); i++) { + if (!isFirstArrEle) { + appender.append(","); + } + Object obj = jarray.get(i); + if (obj instanceof JsonObject) { + appender.append(serialJsonOrdered((JsonObject) obj)); + } else { + appender.append(obj.toString()); + } + isFirstArrEle = false; + } + appender.append("]"); + } else { + String value = val.toString(); +// if (val instanceof JsonPrimitive) { +// value = val.toString(); +// } else { +// value = replaceSlash(val.toString()); +// } + appender.append("\"").append(key).append("\":").append(value); + } + isFirstEle = false; + } + appender.append("}"); + return appender.toString(); + } + + public static String getTime() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + return dateFormat.format(new Date()); + } + + // 发送Post请求 + public static String doPostForm(String httpUrl, Map param) throws Exception { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + URL url = new URL(httpUrl); + SSLContext sslcontext; + sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[] { new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } }, new java.security.SecureRandom()); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + + // 新建连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置为POST请求 + connection.setRequestMethod("POST"); + // 设置连接超时时长 + connection.setConnectTimeout(15000); + // 设置读取超时 + connection.setReadTimeout(60000); + connection.setInstanceFollowRedirects(true); + + connection.setDoOutput(true); + connection.setDoInput(true); + + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + os = connection.getOutputStream(); + os.write(createLinkString(param).getBytes()); + if (connection.getResponseCode() != 200) { + is = connection.getErrorStream(); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + StringBuilder sbf = new StringBuilder(); + String temp = null; + // 获取错误返回 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } else { + is = connection.getInputStream(); + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + StringBuilder sbf = new StringBuilder(); + String temp = null; + // 获取返回 + boolean firstLine = true; + while ((temp = br.readLine()) != null) { + if (!firstLine) { + firstLine = false; + sbf.append("\r\n"); + } + sbf.append(temp); + } + result = sbf.toString(); + } + } finally { + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 关闭连接 + connection.disconnect(); + } + return result; + } + + private static String createLinkString(Map params) throws Exception { + ArrayList keys = new ArrayList<>(params.keySet()); + Collections.sort(keys); + + StringBuilder prestr = new StringBuilder(); + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = params.get(key); + if (i == keys.size() - 1) { + prestr.append(key).append("=").append(value); + } else { + prestr.append(key).append("=").append(value).append("&"); + } + } + return prestr.toString(); + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java new file mode 100644 index 0000000..c6df6d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangConfig.java @@ -0,0 +1,44 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +public class ZhaoShangConfig { + public String pubkeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Ec7viMyQC5SShRz1jP0IQRLLVGDQ4f1rgZwtxT4ZOgnWxUoAHquj2yIrgFjNpWVnt/1dJGtXWkpp2UN3jMI5ubjVQkL0OFD+8r0IFXYAARsCLAwVLF0LE487KvVRaQC7A7rPlFfBtE/v++KajzMuDauNlIASYobcFKYdZ89vIfE/xMg/44QJqQ2XBkoMnJ7ul0kMdh4YWOQnO0qqvXD2eK3KPaXMRtxieGsVBgsvtETprw98bTl9tPUBUrneyirrccS8/Z6raV6nioyx2RzrMld8YnjlnV2YTJpNAlG+y/wLoKY55Rkjcvg9wSe8qbI/VtYVQfQz8gfeUzFQTKKCwIDAQAB"; + public String prikeyStr = "MIIEowIBAAKCAQEAwN7xTseqQs1pNA/+gTgXRqcxCYfkxDTsckfqf3O2ndsvJS5T" + + "8Fb0oHTyjy0HjrKLASWWUKfhQGXPHbo1FQd+0TyHxSza55+HtXquUq7QsAITHCu3" + + "U7aslvC7xe6/2E7nhu1TausF1nSyB1o4xVEjZyjrdQpTID0JvG8BtA5Yem9YDBCM" + + "ZHBxvarQHVqdBsqo2G3M09qeUDbY3DuBgdiVAw0ApIM8mKGj4jsWmRSnypuxl40B" + + "jWAr6Xgk44MpSGHndhiFXGvfMRRYEd8Z30w32QlB+Gjk8rQwXnvxG8YCBPYqXVkq" + + "wld81bHFFz5zHQ0qekPhD8RrFimPn+RaD9VNfwIDAQABAoIBAQCxUUZQw0hJOkgq" + + "UToO2t6rWjK/LGyp5m4rcuqoWl3eKxDhAgKxx4AHtPz7nM6B5qvdVg0oAfAZIICW" + + "OAdtWgLBowC/yklHAWfm9O8nnQjHiGDBWX+mOx/ZdWFsy98cow5BAhfbCE/Jpme2" + + "UsA2yC3gPcKbS+64iOVWlEfgnf/CLte/dE0eAMfsp5wXpwv3ygA4wtyd2X2P+y6s" + + "+WYBKSvNMS08W4dsxwU9Q3AG3hS0Uab09qIPNS8tEMZ2L1tl0/VvkrAYjayM1CcK" + + "CrSnwtH6eJVi4WQxL1K3QxyxDKucsOlqSHg++4VMpGZNpvstn3IsY3PyCgfsODvH" + + "aoygvDBhAoGBAPxxdcI9stK9bIGSms0FqbVXYj8WmAjE/M9B7ECToWRQg65Gf8MY" + + "PyUSkY2mbDHwf+yPsUb5Oli+a2GW8BwmJWeXEIy0lQxa1TS2b7CN6XJtZVnjEgiZ" + + "d7bXy/j69r/C4CMlfbrRWnUGftKr/U7ynaGs10/bISeW12E7WdLV5+kDAoGBAMOW" + + "nEzAFMPFzG9p/GtYpWU5jMNSiakzfm6n9Nwr7dFGnLhVGtO6act1bm/WB26NAgIE" + + "ArhcitoKrI346nfkoZLXBpzzyJgFx4r31d1RN9Vsrt6AEywlwnLwHk2HXtCwmqre" + + "hZ4I741S2rHlaT8ifNwLyjW2sbw9QnpC3RL7R3rVAoGAOI/Dbs4cLxO6KB4NCTrn" + + "l3YI0VHiprRcYKPIp39sfel8V6P8JF5eZ5QNgMt1GotkXkCj298jr5aawLbs/aGe" + + "Z+N1FdGwQ6BmfPUTeV+SmszgFI/IDp00MYeQcCzq9HRZfAZ+cUlPF0FpURKwIuxB" + + "XWQ4qe/TMeeeQm7l5VOALrkCgYAljLa5LW9PHpxfD3P8j+pBAsl5flEbgN1XFTu3" + + "QV/I+8t+wCgEWheRjhwDsI2AteWayXZUOsAVmFMEdrNdDTHP5SRJ4auzM/jZPzd5" + + "4+vaN6Fi6ifEJAOu2VaX/9M+MYmgIFR6wLBs62k9GhQYoOBjxoetxENfJkuq+UdE" + + "K6XPeQKBgFvf+SUrg7hFpRRyCq+DehdMQk1TJnEPTNLOalfrA/319KA8LGa0Q+ay" + + "5c2mDc9F//yAJEAT1WTEqHnvKBQvjofFAGRntoCT8anAnskSytwwpltKqDcpoKx/" + + "hVK+eVL47wuFroCBLGj0Zm3I7S+saGGmVllEky4jceE7IMTN7i6W"; + + public String UID = "N002466952"; + public String ACCNBR = "755915707610905"; + //static String URL = "http://99.11.2.154:8080/cdcserver/api/v2"; + public String URL = "http://183.62.66.60:9080/cdcserver/api/v2"; + //static String URL = "http://99.12.250.6:9080/cdcserver/api/v2"; + public String AESKEY = "YSqdwE8vAQ1BcfYCpESUsnVzOOMA2ZSd"; + public String BBKNBR = "37"; + + //开户行 + public String KHH =""; + //联行号 + public String LHH = ""; + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java new file mode 100644 index 0000000..46fb087 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangResponse.java @@ -0,0 +1,46 @@ +package org.dromara.settlement.common.bank.zhaoshang; + + +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; + +public class ZhaoShangResponse { + private String resultcode; + + private String resultmsg; + + private String reqid; + + private JsonObject data; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public JsonObject getData() { + return data; + } + + public void setData(JsonObject data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java new file mode 100644 index 0000000..858fe80 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhaoshang/ZhaoShangUtil.java @@ -0,0 +1,141 @@ +package org.dromara.settlement.common.bank.zhaoshang; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.util.HashMap; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.nacos.shaded.com.google.gson.GsonBuilder; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.service.impl.ZhaoShangServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +public class ZhaoShangUtil { + private static final Logger log = LoggerFactory.getLogger(ZhaoShangUtil.class); + + private static class SingletonHolder { + private static final ZhaoShangUtil INSTANCE = new ZhaoShangUtil(); + } + + private ZhaoShangUtil() { + Security.addProvider(new BouncyCastleProvider()); + } + + public static final ZhaoShangUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + new ZhaoShangServiceImpl().createAccount(0,"1", "1", "1"); + } + + public Result request(ZhaoShangConfig config, String funcode, String reqid, JsonObject body) { + // AES加密 + String AesPlainxt = ""; + String res = ""; + try { + JsonObject jObject = new JsonObject(); + JsonObject head = new JsonObject(); + head.addProperty("funcode", funcode); + head.addProperty("userid", config.UID); + head.addProperty("reqid", reqid); + JsonObject request = new JsonObject(); + request.add("body", body); + request.add("head", head); + jObject.add("request", request); + + JsonObject object = new JsonObject(); + // 签名 + object.addProperty("sigdat", "__signature_sigdat__"); + // object.put("sigtim", GetTime()); + + object.addProperty("sigtim", DCHelper.getTime()); + jObject.add("signature", object); + String source = DCHelper.serialJsonOrdered(jObject); + log.info("签名原文: " + source); + //String data = signRsa2048(getPrivateKeyFromBytes(config.prikeyStr, "PKCS"),source.getBytes()); + String data = new String(java.util.Base64.getEncoder().encode(DCCryptor.CMBSM2SignWithSM3(getID_IV(config.UID), java.util.Base64.getDecoder().decode(config.prikeyStr), source.getBytes(StandardCharsets.UTF_8)))); + log.info("签名结果: " + data); + object.addProperty("sigdat", data); + //jObject.put("signature", object); + + AesPlainxt = DCHelper.serialJsonOrdered(jObject); + log.info("加密前req: " + AesPlainxt); + //String req = encryptAES256Str(AesPlainxt, config.AESKEY.getBytes()); + String req = new String(java.util.Base64.getEncoder().encode(DCCryptor.CMBSM4EncryptWithCBC(config.AESKEY.getBytes(), getID_IV(config.UID), AesPlainxt.getBytes(StandardCharsets.UTF_8)))); + log.info("加密后req: " + req); + + // 发送请求 + HashMap map = new HashMap<>(); + map.put("UID", config.UID); + map.put("DATA", URLEncoder.encode(req, "utf-8")); + map.put("FUNCODE", funcode); + map.put("ALG", "SM"); + res = DCHelper.doPostForm(config.URL, map); + log.info("res: " + res); + } catch (Exception e) { + e.printStackTrace(); + // TODO 自动生成的 catch 块 + log.error("招商银行api调用出错("+ JSONObject.toJSONString(config)+","+funcode+","+reqid+","+JSONObject.toJSONString(body)+"):",e); + } + Result rtn = new Result(); + rtn.setResult(AesPlainxt); + rtn.setRtnData(res); + return rtn; + } + + public Result response(ZhaoShangConfig config,String response){ + // 解密请求 + Result rtn = new Result(); + if (StringUtils.isBlank(response)) { + rtn.addError("响应内容不能为空"); + return rtn; + } + try { + //String resplain = decryptAES256(response, config.AESKEY.getBytes(), true); + String resplain = new String(DCCryptor.CMBSM4DecryptWithCBC(config.AESKEY.getBytes(), getID_IV(config.UID), java.util.Base64.getDecoder().decode(response)), StandardCharsets.UTF_8); + rtn.setResult(response); + log.info("res decrypt: " + resplain); + JsonObject object2 = new GsonBuilder().create().fromJson(resplain, JsonObject.class); + JsonObject object3 = object2.getAsJsonObject("signature"); + String resSign = object3.get("sigdat").getAsString(); + object3.addProperty("sigdat", "__signature_sigdat__"); + object2.add("signature", object3); + String resSignSource = DCHelper.serialJsonOrdered(object2); + log.info("验签原文: " + resSignSource); + rtn.setResult(resSignSource); + log.info("验签签名值: " + resSign); + //Boolean verify = signRsa2048Verify(resSignSource.getBytes(), Base64.decode(resSign), getPublicKeyFromBytes(config.pubkeyStr)); + Boolean verify = DCCryptor.CMBSM2VerifyWithSM3(getID_IV(config.UID), java.util.Base64.getDecoder().decode(config.pubkeyStr), resSignSource.getBytes(StandardCharsets.UTF_8), java.util.Base64.getDecoder().decode(resSign)); + log.info("验签结果: " + verify); + if (verify) { + JsonObject responseObj = object2.getAsJsonObject("response"); + JsonObject responseHead = responseObj.getAsJsonObject("head"); + ZhaoShangResponse data = new ZhaoShangResponse(); + data.setData(responseObj.getAsJsonObject("body")); + data.setReqid(responseHead.get("reqid").getAsString()); + data.setResultcode(responseHead.get("resultcode").getAsString()); + data.setResultmsg(responseHead.get("resultmsg").getAsString()); + rtn.setRtnData(data); + }else { + rtn.addError("验签失败"); + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("解析招商银行响应出错("+JSONObject.toJSONString(config)+","+response+"):",e); + } + return rtn; + } + + private byte[] getID_IV(String uid) { + String userid = uid + "0000000000000000"; + return userid.substring(0, 16).getBytes(); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java new file mode 100644 index 0000000..55fe8b8 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoConfig.java @@ -0,0 +1,12 @@ +package org.dromara.settlement.common.bank.zhifubao; + +public class ZhiFuBaoConfig { + public String prikeyStr = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCLD+qSMzvkMZHb9iNr2haC3OsDt1noDagXDa1NYYyV2DJ3wo3CnBPz6JP/T0+yJ9nh+XQzTjw/LApVLhTcgVOgdG4QYVPJTuTJ9DSVWK5QQ77ceDdOQdiC6gps2Ic0DocTBKOPcZltvtOtbeUxKM0wiPH01yjYyYAWRAeN/Y54LnjN49z6WhVWvU+nSYpov9Z9Gec+o1enetOsLh+zBsNWuBYzm9VkEVcsDs4FFqVz9OjSh6anjMbbq8HhFJYko5gzt7Vxj5HfAxo0m3AIO8Ua1HG8oAEYbt5cv+bUV5c5waYv05Vl+/wMQ+xfvWIsZkXQIpsLEygNL2A0zODCAXBpAgMBAAECggEBAIYTY3NwSFdcX6g3KbGrxLaJb2HW3q04tY78ldGcsuIqX4ZOI0W2HBq3bDHlcw5vE8inLZzl2nqB6Lh1xJFRc6KpfxD19cWK9lWsySIRLYefuZ5xnckq/ShDpKeLINhVBXCVsWj0+xvvt8FnymlaUHNyJe6NoAlcRc2x66LADCPcI5inM6anAhoLLWnw1ufFnrnAzMjzhqDIvp4GyLQMM6vYhVs9wyeCcX5nwsgOBmQZZCWyNc6FyX4lljsMStaUEv6wvHe9WQoTDpXgjPxFShN8iT45mMotoU2MdYa9kcy3396R0Xw9I2KPv4ly0GxTlBvaRk72VUP4UkHuGeRVJbECgYEA1vcJw6tLEO1rCz1v6GKObdHhJmWYERh9ejcQ77trO8e6ICjJDrJLh9YLXa28B1xVcXK/iXSwH9ViFk5Cukj+bSZK12LRUf1tkHwjQ+DzUy15JYEJCs2w33GjpWOhPkYqbcFxken02/WxPQu1T+eY5xfQ345sxeGvt3zZr1cG060CgYEApZuj/YQv2e+FX+f/5k4czRQwYoXI/9fPJyrkwW6GzJ+r0BCWjbWegbG93Lwijjv9YNf1ee4CR0Ga30m0cx64vAPN2tWx+XgTUS7BZz2iQavLF0sRI1ZKjBtzCrIxE4tw5CSGoWsjiB1mL+3ZG3cLYUZUZ9sHwWgQ0nnbEkKmhy0CgYEAqdQBotRxOa5YI0kmYDF81MY7WlppCRiQCT33423uCgyAv2d5cGLrySURVbEsG6SW3EoLiEzn2D58f6LUlNeWKiVWe1NWi6/sH3nzYm0Vz2DdlQOcYSyfz+e3obJUcR595rgtQVnUWPKCU/gsBjSyV+A45GVhCfSDHjNEx4G5owECgYB/y3wf7Tqz1aa5nKEXit2kz9iKnqy96T5c/jeqoOz6yJhgJfzX+/gGIy/dP3z2/4oGioBOiAFQFWs6tXi/gUyTIehf35nIZgWaFxd94MzuGnDNV8sw1q0OMzxyW5GNgIQsOZd+xtuTdQRfJg7sp8+rUAdgYWA5umGI2inYjIBPPQKBgQCydWm0nzMKC7grS44OH/gPd/l61TAP/ktqfyJDMzoZ9x8/LQidr218IEWiIxGPT80QKTiXbmwgNR55FNQvx8BLvBc+vsmQGteV1fgocC8/RJ3cxH3DF/TH4DWrPechz8nAi3GVlsLe2xwJI1A+vr6/Y5OVtphRPgn84h3jr1lW+w=="; + public String APPID = "2021003144629727"; + public String accName = ""; + public String URL = "https://openapi.alipay.com/gateway.do"; + public String alipayCertPublicKey = "D:/apache-tomcat-8.0.53/webapps/ROOT/80/alipayCertPublicKey_RSA2.crt"; + public String alipayRootCert = "D:/apache-tomcat-8.0.53/webapps/ROOT/80/alipayRootCert.crt"; + public String appCertPublicKey = "D:/apache-tomcat-8.0.53/webapps/ROOT/80/appCertPublicKey_2021003144629727.crt"; + public String notifyUrl = "https://notify.jichaihr.com/"; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java new file mode 100644 index 0000000..ea24369 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoResponse.java @@ -0,0 +1,45 @@ +package org.dromara.settlement.common.bank.zhifubao; + +import com.alipay.api.AlipayResponse; + +public class ZhiFuBaoResponse { + private String resultcode; + + private String resultmsg; + + private String reqid; + + private AlipayResponse data; + + public String getResultcode() { + return resultcode; + } + + public void setResultcode(String resultcode) { + this.resultcode = resultcode; + } + + public String getResultmsg() { + return resultmsg; + } + + public void setResultmsg(String resultmsg) { + this.resultmsg = resultmsg; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public AlipayResponse getData() { + return data; + } + + public void setData(AlipayResponse data) { + this.data = data; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java new file mode 100644 index 0000000..84580a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/bank/zhifubao/ZhiFuBaoUtil.java @@ -0,0 +1,62 @@ +package org.dromara.settlement.common.bank.zhifubao; + +import com.alibaba.fastjson.JSONObject; +import org.dromara.settlement.api.domain.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alipay.api.AlipayRequest; +import com.alipay.api.AlipayResponse; +import com.alipay.api.CertAlipayRequest; +import com.alipay.api.DefaultAlipayClient; + +public class ZhiFuBaoUtil { + private static final Logger log = LoggerFactory.getLogger(ZhiFuBaoUtil.class); + + private static class SingletonHolder { + private static final ZhiFuBaoUtil INSTANCE = new ZhiFuBaoUtil(); + } + + private ZhiFuBaoUtil() { + } + + public static final ZhiFuBaoUtil getInstance() { + return SingletonHolder.INSTANCE; + } + + public Result request(ZhiFuBaoConfig config, AlipayRequest request, boolean isPage) { + Result rtn = new Result(); + try { + CertAlipayRequest certAlipayRequest = new CertAlipayRequest (); + certAlipayRequest.setServerUrl(config.URL); + certAlipayRequest.setAppId(config.APPID); + certAlipayRequest.setPrivateKey(config.prikeyStr); + certAlipayRequest.setFormat("JSON"); + certAlipayRequest.setCharset("UTF-8"); + certAlipayRequest.setSignType("RSA2"); + certAlipayRequest.setCertPath(config.appCertPublicKey); + certAlipayRequest.setAlipayPublicCertPath(config.alipayCertPublicKey); + certAlipayRequest.setRootCertPath(config.alipayRootCert ); + DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + String reqStr = JSONObject.toJSONString(request); + log.info("req: " + reqStr); + rtn.setResult(reqStr); + AlipayResponse response = null; + if (isPage) { + response = alipayClient.pageExecute(request,"get"); + }else { + response = alipayClient.certificateExecute(request); + } + log.info("res: " + JSONObject.toJSONString(response)); + ZhiFuBaoResponse res = new ZhiFuBaoResponse(); + res.setData(response); + res.setResultcode(response.getCode()); + res.setResultmsg(response.getMsg()); + rtn.setRtnData(res); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("支付宝api调用出错("+JSONObject.toJSONString(config)+","+JSONObject.toJSONString(request)+"):",e); + } + return rtn; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java new file mode 100644 index 0000000..bfba9f8 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/FileUtils.java @@ -0,0 +1,100 @@ +package org.dromara.settlement.common.file; + +import org.dromara.common.core.utils.StringUtils; + +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Base64; + + +public class FileUtils { + public static String base64ToFile(String base64, String fileName, String savePath) { + File file = null; + // 创建文件目录 + String filePath = savePath; + File dir = new File(filePath); + if (!dir.exists() && !dir.isDirectory()) { + dir.mkdirs(); + } + BufferedOutputStream bos = null; + java.io.FileOutputStream fos = null; + try { + byte[] bytes = Base64.getDecoder().decode(base64); + filePath = filePath + fileName; + file = new File(filePath); + fos = new java.io.FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(bytes); + } catch (Exception e) { + e.printStackTrace(); + filePath = ""; + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return filePath; + } + + /** + * 读取txt文件 + * @author 张涛 + * @date 2022年8月3日 + * @param filePath + * @param rowSeparator 行分隔符 + * @return + */ + public static String readTxtFile(String filePath,String rowSeparator) { + + File file = new File(filePath); + if(file.isFile() && file.exists()){ + if(StringUtils.isBlank(rowSeparator)) { + rowSeparator = ""; + } + FileInputStream fileInputStream = null; + InputStreamReader inputStreamReader = null; + BufferedReader bufferedReader = null; + try { + fileInputStream = new FileInputStream(file); + inputStreamReader = new InputStreamReader(fileInputStream); + bufferedReader = new BufferedReader(inputStreamReader); + StringBuffer sb = new StringBuffer(); + String text = null; + while((text = bufferedReader.readLine()) != null){ + sb.append(text+rowSeparator); + } + return sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + }finally { + try { + if(bufferedReader != null) + bufferedReader.close(); + if(inputStreamReader != null) + inputStreamReader.close(); + if(fileInputStream != null) + fileInputStream.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java new file mode 100644 index 0000000..a6e7025 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/SftpUtils.java @@ -0,0 +1,225 @@ +package org.dromara.settlement.common.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.Iterator; +import java.util.Properties; +import java.util.Vector; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.ChannelSftp.LsEntry; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; + +/** + * SFTP上传下载文件 + */ +public class SftpUtils { + private final Logger logger = LoggerFactory.getLogger(SftpUtils.class);// SnowLog.getLogger(this.getClass()); + + /** + * 连接sftp服务器 + * @param host 主机 + * @param port 端口 + * @param username 用户名 + * @param password 密码 + * @return + */ + public ChannelSftp connect(String host, int port, String username, String password) { + ChannelSftp sftp = null; + Channel channel=null; + Session sshSession=null; + try { + JSch jsch = new JSch(); + jsch.getSession(username, host, port); + sshSession = jsch.getSession(username, host, port); + if(logger.isInfoEnabled()){ + logger.info("***************** Session created. **********************"); + logger.info("***************** stf host is "+host+"port is "+port+" username is "+username+" password is "+password+"**********************"); + } + sshSession.setPassword(password); + Properties sshConfig = new Properties(); + sshConfig.put("StrictHostKeyChecking", "no"); + sshSession.setConfig(sshConfig); + sshSession.connect(); + if(logger.isInfoEnabled()){ + logger.info("***************** Session connected. **********************"); + logger.info("***************** Opening Channel. **********************"); + } + channel = sshSession.openChannel("sftp"); + channel.connect(); + sftp = (ChannelSftp) channel; + if(logger.isInfoEnabled()){ + logger.info("***************** Connected to " + host + ". **********************"); + } + } catch (Throwable e) { + if (channel!=null) { + try { + channel.disconnect(); + }catch(Throwable e1) { + } + } + + if (sshSession!=null) { + try { + sshSession.disconnect(); + }catch(Throwable e1) { + } + } + + logger.error(e.getMessage(), e); + } + return sftp; + } + + /** + * 关闭连接 + * @param sftp + */ + public void disconnect(String host, ChannelSftp sftp){ + // 关闭连接 + try { + if (null != sftp) { + sftp.disconnect(); + if(logger.isInfoEnabled()){ + logger.info("***************** Closing Channel. **********************"); + } + if (null != sftp.getSession()) { + sftp.getSession().disconnect(); + if(logger.isInfoEnabled()){ + logger.info("***************** Session disconnect. **********************"); + } + } + } + if (logger.isInfoEnabled()) { + logger.info("**************** Disconnect to " + host + ". *******************"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 判断目录下是否存在文件或者文件夹 + * @param directory + * @param fileName + * @param sftp + * @return + */ + public boolean isExist(String directory, String fileName, ChannelSftp sftp) { + try { + Vector v = listFiles(directory, sftp); + Iterator it = v.iterator(); + while (it.hasNext()) { + LsEntry entry = it.next(); + String flName = entry.getFilename(); + if (flName.equals(fileName)) { + return true; + } + } + } catch (SftpException e) { + e.printStackTrace(); + } + return false; + } + + /** + * 上传文件 + * @param directory 上传的目录 + * @param uploadFile 要上传的文件 + * @param sftp + */ + public String upload(String directory, String uploadFile, ChannelSftp sftp) { + String successFlg = "0"; + try { + sftp.cd(directory); + File file = new File(uploadFile); + sftp.put(new FileInputStream(file), file.getName()); + if(logger.isInfoEnabled()){ + logger.info("***************** Finished **********************"); + } + } catch (Exception e) { + successFlg = "1"; + e.printStackTrace(); + } + return successFlg; + } + + /** + * 下载文件 + * @param directory 下载目录 + * @param downloadFile 下载的文件 + * @param saveFile 存在本地的路径 + * @param sftp + */ + public boolean download(String directory, String downloadFile, String saveFile, ChannelSftp sftp) { + try { + sftp.cd(directory); + File file = new File(saveFile); + if(!file.getParentFile().exists()){ + file.getParentFile().mkdirs(); + } + sftp.get(downloadFile, new FileOutputStream(file)); + if(logger.isInfoEnabled()){ + logger.info("***************** Finished **********************"); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * 删除文件 + * @param directory 要删除文件所在目录 + * @param deleteFile 要删除的文件 + * @param sftp + */ + public void delete(String directory, String deleteFile, ChannelSftp sftp) { + try { + sftp.cd(directory); + sftp.rm(deleteFile); + if(logger.isInfoEnabled()){ + logger.info("***************** Finished **********************"); + } + if (null != sftp) { + sftp.disconnect(); + if (null != sftp.getSession()) { + sftp.getSession().disconnect(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 列出目录下的文件 + * @param directory 要列出的目录 + * @param sftp + * @return + * @throws SftpException + */ + @SuppressWarnings("unchecked") + public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException { + return sftp.ls(directory); + } + + /** + * 判断本地路径是否存在,不存在就创建路径 + */ + public void makeDirs(String localSavePath) { + File localFile = new File(localSavePath); + if (!localFile.exists()) { + localFile.mkdirs(); + } + } +} + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java new file mode 100644 index 0000000..b0dbbfa --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/file/ZipUtils.java @@ -0,0 +1,291 @@ +package org.dromara.settlement.common.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +/** + * 压缩(实现的Zip)工具 + */ +public class ZipUtils { + + /********************************** 压缩start ***************************************/ + /** + * 压缩文件-由于out要在递归调用外,所以封装一个方法用来 调用ZipFiles(ZipOutputStream out,String + * path,File... srcFiles) + * + * @param zip + * @param path + * @param srcFiles + * @throws IOException + */ + public static void zipFiles(File zip, File... srcFiles) throws IOException { + String path = ""; + ZipOutputStream out = null; + try { + out = new ZipOutputStream(new FileOutputStream(zip)); + ZipFiles(out, path, srcFiles); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } finally { + if (out != null) + out.close(); + } + System.out.println("*****************压缩完毕*******************"); + } + + public static void zipFiles(String zip, List srcFilePaths) + throws IOException { + File zipFile = new File(zip); + File[] srcFiles = new File[srcFilePaths.size()]; + for (int i = 0, len = srcFilePaths.size(); i < len; i++) { + srcFiles[i] = new File(srcFilePaths.get(i)); + } + zipFiles(zipFile, srcFiles); + } + + /** + * 压缩文件-File + * + * @param zipFile + * zip文件 + * @param srcFiles + * 被压缩源文件 + */ + private static void ZipFiles(ZipOutputStream out, String path, + File... srcFiles) { + path = path.replaceAll("\\*", "/"); + if (!path.endsWith("/")) { + path += "/"; + } + byte[] buf = new byte[1024]; + FileInputStream in = null; + try { + for (File srcFile : srcFiles) { + if (srcFile.isDirectory()) { + File[] files = srcFile.listFiles(); + out.putNextEntry(new ZipEntry(path)); + ZipFiles(out, path, files); + } else { + in = new FileInputStream(srcFile); + System.out.println(path + srcFile.getName()); + out.putNextEntry(new ZipEntry(path + srcFile.getName())); + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + out.closeEntry(); + in.close(); + in = null; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + } + } + } + + /********************************** 压缩end ***************************************/ + + /********************************** 解压缩start ***************************************/ + /** + * 解压到指定目录 + * + * @param zipPath + * @param descDir + */ + public static void unZipFiles(String zipPath, String descDir) + throws IOException { + unZipFiles(new File(zipPath), descDir); + } + + /** + * 解压文件到指定目录 + * + * @param zipFile + * @param descDir + */ + private static void unZipFiles(File zipFile, String descDir) + throws IOException { + File pathFile = new File(descDir); + if (!pathFile.exists()) { + pathFile.mkdirs(); + } + ZipFile zip = new ZipFile(zipFile); + for (Enumeration entries = zip.entries(); entries.hasMoreElements();) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + String zipEntryName = entry.getName(); + InputStream in = zip.getInputStream(entry); + String outPath = (descDir + zipEntryName).replaceAll("\\*", "/"); + ; + // 判断路径是否存在,不存在则创建文件路径 + File file = new File(outPath.substring(0, outPath.lastIndexOf('/'))); + if (!file.exists()) { + file.mkdirs(); + } + // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 + if (new File(outPath).isDirectory()) { + continue; + } + // 输出文件路径信息 + System.out.println(outPath); + + OutputStream out = new FileOutputStream(outPath); + byte[] buf1 = new byte[1024]; + int len; + while ((len = in.read(buf1)) > 0) { + out.write(buf1, 0, len); + } + in.close(); + out.close(); + } + zip.close(); + System.out.println("******************解压完毕********************"); + } + + /********************************** 解压缩end ***************************************/ + + /** + * 解压缩一个文件 + * + * @param zipFile + * 压缩文件 + * @param folderPath + * 解压缩的目标目录 + * @throws IOException + * 当解压缩过程出错时抛出 + */ + public static void upZipFile(File zipFile, String folderPath) + throws ZipException, IOException { + File desDir = new File(folderPath); + if (!desDir.exists()) { + desDir.mkdirs(); + } + ZipFile zf = new ZipFile(zipFile); + for (Enumeration entries = zf.entries(); entries.hasMoreElements();) { + ZipEntry entry = ((ZipEntry) entries.nextElement()); + InputStream in = zf.getInputStream(entry); + String str = folderPath + File.separator + entry.getName(); + str = new String(str.getBytes("8859_1"), "GB2312"); + File desFile = new File(str); + if (!desFile.exists()) { + File fileParentDir = desFile.getParentFile(); + if (!fileParentDir.exists()) { + fileParentDir.mkdirs(); + } + desFile.createNewFile(); + } + OutputStream out = new FileOutputStream(desFile); + byte buffer[] = new byte[1024 * 1024]; + int realLength; + while ((realLength = in.read(buffer)) > 0) { + out.write(buffer, 0, realLength); + } + out.close(); + in.close(); + } + zf.close(); + } + + /** 第一个参数是压缩文件路径,第二个参数是要解压的文件夹路径,文件夹可以不存在会自动生成 */ + public static void ZipDecompress(String frompath, String topath) + throws IOException { + ZipFile zf = new ZipFile(new File(frompath)); + InputStream inputStream; + Enumeration en = zf.entries(); + while (en.hasMoreElements()) { + ZipEntry zn = (ZipEntry) en.nextElement(); + if (!zn.isDirectory()) { + inputStream = zf.getInputStream(zn); + File f = new File(topath + zn.getName()); + File file = f.getParentFile(); + file.mkdirs(); + System.out.println(zn.getName() + "---" + zn.getSize()); + + FileOutputStream outputStream = new FileOutputStream(topath + + File.separator + zn.getName()); + int len = 0; + byte bufer[] = new byte[1024]; + while (-1 != (len = inputStream.read(bufer))) { + outputStream.write(bufer, 0, len); + } + outputStream.close(); + } + } + zf.close(); + } + + /** + * 解压文件名包含传入文字的文件 + * + * @param zipFile + * 压缩文件 + * @param folderPath + * 目标文件夹 + * @param nameContains + * 传入的文件匹配名 + * @throws ZipException + * 压缩格式有误时抛出 + * @throws IOException + * IO错误时抛出 + */ + public static ArrayList upZipSelectedFile(File zipFile, + String folderPath, String nameContains) throws ZipException, + IOException { + ArrayList fileList = new ArrayList(); + + File desDir = new File(folderPath); + if (!desDir.exists()) { + desDir.mkdir(); + } + + ZipFile zf = new ZipFile(zipFile); + for (Enumeration entries = zf.entries(); entries.hasMoreElements();) { + ZipEntry entry = ((ZipEntry) entries.nextElement()); + if (entry.getName().contains(nameContains)) { + InputStream in = zf.getInputStream(entry); + String str = folderPath + File.separator + entry.getName(); + str = new String(str.getBytes("8859_1"), "GB2312"); + // str.getBytes("GB2312"),"8859_1" 输出 + // str.getBytes("8859_1"),"GB2312" 输入 + File desFile = new File(str); + if (!desFile.exists()) { + File fileParentDir = desFile.getParentFile(); + if (!fileParentDir.exists()) { + fileParentDir.mkdirs(); + } + desFile.createNewFile(); + } + OutputStream out = new FileOutputStream(desFile); + byte buffer[] = new byte[1024 * 1024]; + int realLength; + while ((realLength = in.read(buffer)) > 0) { + out.write(buffer, 0, realLength); + } + in.close(); + out.close(); + fileList.add(desFile); + } + } + return fileList; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java new file mode 100644 index 0000000..8192ac6 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/GCMD5Util.java @@ -0,0 +1,234 @@ +package org.dromara.settlement.common.http; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; + +/** + * + * @ClassName: GCMD5Util + * @Description:TODO(完成密码MD5的加密) + * @author: Chivalrous + * @date: 2012-11-23 下午3:57:08 + */ +public class GCMD5Util { + private static final Logger log = LoggerFactory.getLogger(GCMD5Util.class); + private static final String HEX_NUMS_STR = "0123456789ABCDEF"; + private static final Integer SALT_LENGTH = 12; + + /** + * 将16进制字符串转换成字节数组 + * + * @param hex + * @return + */ + public static byte[] hexStringToByte(String hex) { + int len = (hex.length() / 2); + byte[] result = new byte[len]; + char[] hexChars = hex.toCharArray(); + for (int i = 0; i < len; i++) { + int pos = i * 2; + result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR + .indexOf(hexChars[pos + 1])); + } + return result; + } + + /** + * 将指定byte数组转换成16进制字符串 + * + * @param b + * @return + */ + public static String byteToHexString(byte[] b) { + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + String hex = Integer.toHexString(b[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + hexString.append(hex.toUpperCase()); + } + return hexString.toString(); + } + + /** + * 验证口令是否合法 + * + * @param password + * @param passwordInDb + * @return + * @throws NoSuchAlgorithmException + * @throws UnsupportedEncodingException + */ + public static boolean validPassword(String password, String passwordInDb) { + try { + // 将16进制字符串格式口令转换成字节数组 + byte[] pwdInDb = hexStringToByte(passwordInDb); + // 声明盐变量 + byte[] salt = new byte[SALT_LENGTH]; + // 将盐从数据库中保存的口令字节数组中提取出来 + System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH); + // 创建消息摘要对象 + MessageDigest md = MessageDigest.getInstance("MD5"); + // 将盐数据传入消息摘要对象 + md.update(salt); + // 将口令的数据传给消息摘要对象 + md.update(password.getBytes("UTF-8")); + // 生成输入口令的消息摘要 + byte[] digest = md.digest(); + // 声明一个保存数据库中口令消息摘要的变量 + byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH]; + // 取得数据库中口令的消息摘要 + System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, + digestInDb.length); + // 比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同 + if (Arrays.equals(digest, digestInDb)) { + // 口令正确返回口令匹配消息 + return true; + } else { + // 口令不正确返回口令不匹配消息 + return false; + } + } catch (Exception e) { + log.error(e.getMessage()); + log.error("对比数据中的MD5摘要和传入校验的进行匹配失败!"); + return false; + } + } + + /** + * 获得加密后的16进制形式口令 + * + * @param password + * @return + * @throws NoSuchAlgorithmException + * @throws UnsupportedEncodingException + */ + public static String getEncryptedPwd(String password) + throws NoSuchAlgorithmException, UnsupportedEncodingException { + // 声明加密后的口令数组变量 + byte[] pwd = null; + // 随机数生成器 + SecureRandom random = new SecureRandom(); + // 声明盐数组变量 + byte[] salt = new byte[SALT_LENGTH]; + // 将随机数放入盐变量中 + random.nextBytes(salt); + + // 声明消息摘要对象 + MessageDigest md = null; + // 创建消息摘要 + md = MessageDigest.getInstance("MD5"); + // 将盐数据传入消息摘要对象 + md.update(salt); + // 将口令的数据传给消息摘要对象 + md.update(password.getBytes("UTF-8")); + // 获得消息摘要的字节数组 + byte[] digest = md.digest(); + + // 因为要在口令的字节数组中存放盐,所以加上盐的字节长度 + pwd = new byte[digest.length + SALT_LENGTH]; + // 将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐 + System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); + // 将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节 + System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); + // 将字节数组格式加密后的口令转化为16进制字符串格式的口令 + return byteToHexString(pwd); + } + + public static byte uniteBytes(byte src0, byte src1) { + byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })) + .byteValue(); + _b0 = (byte) (_b0 << 4); + byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })) + .byteValue(); + byte ret = (byte) (_b0 ^ _b1); + return ret; + } + + public static byte[] HexString2Bytes(String src) { + byte[] ret = new byte[src.length() / 2]; + byte[] tmp = src.getBytes(); + for (int i = 0; i < src.length() / 2; i++) { + ret[i] = uniteBytes(tmp[(i * 2)], tmp[(i * 2 + 1)]); + } + return ret; + } + + public static String byte2MD5(byte[] src) { + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + return ""; + } + byte[] md5Bytes = md5.digest(src); + StringBuffer hexValue = new StringBuffer(); + for (int i = 0; i < md5Bytes.length; i++) { + int val = md5Bytes[i] & 0xFF; + if (val < 16) + hexValue.append("0"); + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } + + /** + * 对字符串md5加密 + * + * @param str + * @return + */ + public static String getMD5(String encStr) { + char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(encStr.getBytes("UTF-8")); + byte[] md = mdTemp.digest(); + int j = md.length; + char str[] = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + return null; + } + } + + public static String string2MD5(String inStr) { + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + return ""; + } + char[] charArray = inStr.toCharArray(); + byte[] byteArray = new byte[charArray.length]; + + for (int i = 0; i < charArray.length; i++) + byteArray[i] = (byte) charArray[i]; + byte[] md5Bytes = md5.digest(byteArray); + StringBuffer hexValue = new StringBuffer(); + for (int i = 0; i < md5Bytes.length; i++) { + int val = md5Bytes[i] & 0xFF; + if (val < 16) + hexValue.append("0"); + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java new file mode 100644 index 0000000..fb75df5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpResultData.java @@ -0,0 +1,24 @@ +package org.dromara.settlement.common.http; + + +/** + * http结果bean + * @author 张涛 + * @date 2016年11月2日 + */ +public class HttpResultData{ + /** 状态返回码*/ + private String code; + /** + * 状态返回码 + * @author 张涛 + * @date 2016年11月2日 + * @return + */ + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java new file mode 100644 index 0000000..08a81c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/HttpUtil.java @@ -0,0 +1,200 @@ +package org.dromara.settlement.common.http; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.StatusLine; +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.conn.ConnectTimeoutException; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.InputStream; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.security.*; +import java.security.cert.CertificateException; + + +public class HttpUtil { + + /** + * 微信退款 + * 发送xml请求到server端 + * @param url xml请求数据地址 + * @param xmlString 发送的xml数据流 + * @return null发送失败,否则返回响应内容 + * @throws KeyStoreException + * @throws NoSuchAlgorithmException + * @throws UnrecoverableKeyException + * @throws KeyManagementException + * @throws IOException + * @throws CertificateException + */ + public static String httpXMLRefundPost(String url,String xmlString,String matchid) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException{ + + //指定读取证书格式为PKCS12 + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + //读取本机存放的PKCS12证书文件 + InputStream instream = HttpUtil.class.getResourceAsStream("/config/apiclient_cert.p12"); + try { + //指定PKCS12的密码(商户ID) + keyStore.load(instream,matchid.toCharArray()); + } finally { + instream.close(); + } + SSLContext sslcontext = SSLContexts.custom() + .loadKeyMaterial(keyStore, matchid.toCharArray()).build(); + //指定TLS版本 + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + sslcontext,new String[] { "TLSv1" },null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + HttpPost httpPost = null; + StringBuilder reponseXml = new StringBuilder(); + try { + // 定义HttpPost请求 + httpPost = new HttpPost(url); + // 定义请求实体 + HttpEntity requestEntity = new StringEntity(xmlString, "UTF-8"); + httpPost.setEntity(requestEntity); + + // 定义HttpClient + //设置httpclient的SSLSocketFactory + CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + + + + // 以post方式发送Http请求 + HttpResponse httpResponse = httpclient.execute(httpPost); + + // 获取响应实体 + HttpEntity responsetEntity = httpResponse.getEntity(); + InputStream inputStream = responsetEntity.getContent(); + + + byte[] b = new byte[2048]; + int length = 0; + while ((length = inputStream.read(b)) != -1) { + reponseXml.append(new String(b, 0, length)); + } + System.out.println(reponseXml); + } catch (Exception e) { + //释放请求的连接 + if(httpPost!=null){ + httpPost.abort(); + } + + if(SocketTimeoutException.class.isInstance(e)){ + throw new RuntimeException("Http请求响应超时",e); + } + else if(ConnectTimeoutException.class.isInstance(e)){ + throw new RuntimeException("Http请求连接超时", e); + } + else if(ConnectException.class.isInstance(e)){ + throw new RuntimeException("Http请求异常", e); + }else{ + throw new RuntimeException("其他异常", e); + } + } + + return reponseXml.toString(); + } + + + /** + * post请求(用于请求json格式的参数) + * @param url + * @param params + * @return + */ + public static String doPost(String url, String params) throws Exception { + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url);// 创建httpPost + httpPost.setHeader("Accept", "application/json"); + httpPost.setHeader("Content-Type", "application/json"); + String charSet = "UTF-8"; + StringEntity entity = new StringEntity(params, charSet); + httpPost.setEntity(entity); + CloseableHttpResponse response = null; + try { + response = httpclient.execute(httpPost); + StatusLine status = response.getStatusLine(); + int state = status.getStatusCode(); + if (state == HttpStatus.SC_OK) { + HttpEntity responseEntity = response.getEntity(); + String jsonString = EntityUtils.toString(responseEntity); + return jsonString; + } + else{ + + } + } + finally { + if (response != null) { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * get请求(用于请求json格式的参数) + * @param url + * @param params + * @return + */ + public static String doGet(String url) + { + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url);// 创建HttpGet + httpGet.setHeader("Accept", "application/json"); + httpGet.setHeader("Content-Type", "application/json"); + CloseableHttpResponse response = null; + try { + response = httpclient.execute(httpGet); + StatusLine status = response.getStatusLine(); + int state = status.getStatusCode(); + if (state == HttpStatus.SC_OK) { + HttpEntity responseEntity = response.getEntity(); + String jsonString = EntityUtils.toString(responseEntity); + return jsonString; + } + } + catch(Exception e) + { + e.printStackTrace(); + } + finally { + if (response != null) { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java new file mode 100644 index 0000000..435554e --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/MyX509TrustManager.java @@ -0,0 +1,29 @@ +package org.dromara.settlement.common.http; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + // TODO 自动生成的方法存根 + + } + + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + // TODO 自动生成的方法存根 + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO 自动生成的方法存根 + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java new file mode 100644 index 0000000..bf435d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynRequestThread.java @@ -0,0 +1,108 @@ +package org.dromara.settlement.common.http; + +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; +import org.apache.http.impl.nio.client.HttpAsyncClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 异步请求线程 + * @author 张涛 + * @date 2017年4月11日 + */ +public class SynRequestThread extends Thread{ + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + public SynRequestThread(){ + synClient = HttpAsyncClients.custom().setMaxConnTotal(1000).setMaxConnPerRoute(1000).build(); + synReqOpen = new CountDownLatch(1); + synReqCount = new AtomicInteger(0); + synClient.start(); + status = 1; + log.debug(":SynRequestThread synClient初始化了"); + } + + /** + * 异步请求客户端 + */ + private CloseableHttpAsyncClient synClient; + + /** + * 当前异步请求数量 + */ + public AtomicInteger synReqCount = null; + + /** + * 异步请求结束开关(计数器) + */ + public CountDownLatch synReqOpen = null; + + private int status = 0;//0:已结束 1:运行中 + + + + @Override + public void run() { + // TODO 自动生成的方法存根 + try { + log.debug(":SynRequestThread synThread开始执行了"); + synReqOpen.await(); + status = 0; + log.debug(":SynRequestThread synClient请求发送完毕了"); + synClient.close(); + log.debug(":SynRequestThread synThread释放了"); + //System.out.println("异步请求释放了"); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("释放线程失败:",e); + } + } + + /** + * 是否正在运行 + * @author 张涛 + * @date 2017年12月2日 + * @return + */ + public boolean isRunning(){ + return status == 1 && synClient != null && synClient.isRunning(); + } + + /** + * 释放锁 + * @author 张涛 + * @date 2017年12月4日 + */ + public void close(){ + if (status == 1) {//请求未发送完毕 + log.debug(":SynRequestThread close时剩余请求数量" + "("+synReqCount.get()+")"); + synReqOpen.countDown(); + } + } + + /** + * 发送请求 + * @author 张涛 + * @date 2017年4月11日 + * @param postMethod + */ + public void sendRequest(HttpPost postMethod){ + //System.out.println("异步请求+1"); + try { + synReqCount.incrementAndGet(); + synClient.execute(postMethod,new SynResponse(this,postMethod)); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("发送异步请求失败("+postMethod.getURI()+"):",e); + int num = synReqCount.decrementAndGet(); + if (num <= 0){ + synReqOpen.countDown(); + log.debug(":SynRequestThread请求完毕了,计数为0了,释放线程"); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java new file mode 100644 index 0000000..4b7610a --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/common/http/SynResponse.java @@ -0,0 +1,54 @@ +package org.dromara.settlement.common.http; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.concurrent.FutureCallback; + +/** + * 异步请求回调 + * @author 张涛 + * @date 2016年12月11日 + */ +public class SynResponse implements FutureCallback{ + private HttpPost postMethod; + /** + * 异步请求线程 + */ + private SynRequestThread synThread; + + public SynResponse(SynRequestThread synThread,HttpPost postMethod){ + this.synThread = synThread; + this.postMethod = postMethod; + } + + @Override + public void completed(HttpResponse paramT) { + // TODO 自动生成的方法存根 + releaseConnection(); + } + + @Override + public void cancelled() { + // TODO 自动生成的方法存根 + releaseConnection(); + } + + @Override + public void failed(Exception paramException) { + // TODO 自动生成的方法存根 + releaseConnection(); + } + + /** + * 释放连接 + * @author 张涛 + * @date 2017年4月10日 + */ + private void releaseConnection(){ + if(postMethod != null) + postMethod.releaseConnection(); + int num = synThread.synReqCount.decrementAndGet(); + if (num <= 0) + synThread.synReqOpen.countDown(); + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java new file mode 100644 index 0000000..b577f4f --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/controller/ZhiFuBaoController.java @@ -0,0 +1,66 @@ +package org.dromara.settlement.controller; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.dromara.common.web.core.BaseController; +import org.dromara.settlement.service.IPublicService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/public") +public class ZhiFuBaoController extends BaseController { + + private final IPublicService publicService; + + /** + * 支付宝充值通知 + * + * @param msg + * @return + * @author 张涛 + * @date 2022年8月25日 + */ + public String zfbNotify(HttpServletRequest request) { + return publicService.zfbNotify(getParamMap(request)); + } + + /** + * 支付宝签约通知 + * + * @param request + * @return + * @author 张涛 + * @date 2022年8月29日 + */ + public String signNotify(HttpServletRequest request) { + return publicService.signNotify(getParamMap(request)); + } + + private Map getParamMap(HttpServletRequest request) { + Map params = new HashMap(); + Enumeration paramNames = request.getParameterNames(); + while (paramNames.hasMoreElements()) { + String paramName = paramNames.nextElement(); + String[] paramValues = request.getParameterValues(paramName); + if (paramValues.length > 0) { + params.put(paramName, paramValues[0]); + } else { + params.put(paramName, ""); + } + } + return params; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java new file mode 100644 index 0000000..6d9c1f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SelectData.java @@ -0,0 +1,62 @@ +package org.dromara.settlement.domain; + +import java.io.Serializable; + + +/** + * 选择项bean + * @author 张涛 + * @date 2016年5月30日 + */ +public class SelectData implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 4496625459732466108L; + + public SelectData(){} + + + + public SelectData(String value, String text) { + this.value = value; + this.text = text; + } + + + + private String value; + + private String text; + + /** + * 选项值 + * @author 张涛 + * @date 2016年10月10日 + * @return + */ + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + /** + * 选项描述 + * @author 张涛 + * @date 2016年10月10日 + * @return + */ + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java new file mode 100644 index 0000000..6fccf29 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysLog.java @@ -0,0 +1,75 @@ +package org.dromara.settlement.domain; + +import java.util.Date; + +public class SysLog { + private Long id; + + private String reqid; + + private String request; + + private String response; + + private Date requestTime; + + private Date responseTime; + + private Long tranId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getReqid() { + return reqid; + } + + public void setReqid(String reqid) { + this.reqid = reqid; + } + + public String getRequest() { + return request; + } + + public void setRequest(String request) { + this.request = request; + } + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public Date getRequestTime() { + return requestTime; + } + + public void setRequestTime(Date requestTime) { + this.requestTime = requestTime; + } + + public Date getResponseTime() { + return responseTime; + } + + public void setResponseTime(Date responseTime) { + this.responseTime = responseTime; + } + + public Long getTranId() { + return tranId; + } + + public void setTranId(Long tranId) { + this.tranId = tranId; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java new file mode 100644 index 0000000..018f5c2 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfig.java @@ -0,0 +1,145 @@ +package org.dromara.settlement.domain; + +import java.util.Date; + +public class SysUnitConfig extends SysUnitConfigKey { + private Integer confUnitType; + + private String confValue; + + private String confGroup; + + private Integer confGroupSort; + + private String confGroupName; + + private Integer confSort; + + private String confRemark; + + private Integer confIsEditor; + + private Date updateTime; + + private String updateBy; + + private String className; + + private String classAlias; + + private Integer isEnable; + + private Integer classSort; + + public Integer getConfUnitType() { + return confUnitType; + } + + public void setConfUnitType(Integer confUnitType) { + this.confUnitType = confUnitType; + } + + public String getConfValue() { + return confValue; + } + + public void setConfValue(String confValue) { + this.confValue = confValue; + } + + public String getConfGroup() { + return confGroup; + } + + public void setConfGroup(String confGroup) { + this.confGroup = confGroup; + } + + public Integer getConfGroupSort() { + return confGroupSort; + } + + public void setConfGroupSort(Integer confGroupSort) { + this.confGroupSort = confGroupSort; + } + + public String getConfGroupName() { + return confGroupName; + } + + public void setConfGroupName(String confGroupName) { + this.confGroupName = confGroupName; + } + + public Integer getConfSort() { + return confSort; + } + + public void setConfSort(Integer confSort) { + this.confSort = confSort; + } + + public String getConfRemark() { + return confRemark; + } + + public void setConfRemark(String confRemark) { + this.confRemark = confRemark; + } + + public Integer getConfIsEditor() { + return confIsEditor; + } + + public void setConfIsEditor(Integer confIsEditor) { + this.confIsEditor = confIsEditor; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getClassAlias() { + return classAlias; + } + + public void setClassAlias(String classAlias) { + this.classAlias = classAlias; + } + + public Integer getIsEnable() { + return isEnable; + } + + public void setIsEnable(Integer isEnable) { + this.isEnable = isEnable; + } + + public Integer getClassSort() { + return classSort; + } + + public void setClassSort(Integer classSort) { + this.classSort = classSort; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java new file mode 100644 index 0000000..b15d1a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/SysUnitConfigKey.java @@ -0,0 +1,23 @@ +package org.dromara.settlement.domain; + +public class SysUnitConfigKey { + private String confItem; + + private Long confUnit; + + public String getConfItem() { + return confItem; + } + + public void setConfItem(String confItem) { + this.confItem = confItem; + } + + public Long getConfUnit() { + return confUnit; + } + + public void setConfUnit(Long confUnit) { + this.confUnit = confUnit; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java new file mode 100644 index 0000000..9e463c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/ImageInfo.java @@ -0,0 +1,52 @@ +package org.dromara.settlement.domain.qiniu; + +import java.io.Serializable; + +/** + * 七牛图片信息 + * @author zhangtao + * + */ +public class ImageInfo implements Serializable{ + /** + * + */ + private static final long serialVersionUID = 6140518322901971437L; + private String format; + private int width; + private int height; + private String colorModel; + private String url; + public String getFormat() { + return format; + } + public void setFormat(String format) { + this.format = format; + } + public int getWidth() { + return width; + } + public void setWidth(int width) { + this.width = width; + } + public int getHeight() { + return height; + } + public void setHeight(int height) { + this.height = height; + } + public String getColorModel() { + return colorModel; + } + public void setColorModel(String colorModel) { + this.colorModel = colorModel; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java new file mode 100644 index 0000000..7605c86 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/domain/qiniu/UploadPolicy.java @@ -0,0 +1,213 @@ +package org.dromara.settlement.domain.qiniu; + +import java.io.Serializable; + +/** + * 千牛上传文件,上传策略 + * + * @author 张涛(370017892@qq.com) + * @date 2014-7-3 + * + */ +public class UploadPolicy implements Serializable { + + // 目标资源空间 + private String scope; + + public UploadPolicy() { + } + + public UploadPolicy(String scope, String callbackUrl, String callbackBody, + String returnUrl, String returnBody, String endUser, + String saveKey, int insertOnly, int detectMime, long fsizeLimit, + String persistentNotifyUrl, String persistentOps, long deadline) { + super(); + this.scope = scope; + this.callbackUrl = callbackUrl; + this.callbackBody = callbackBody; + this.returnUrl = returnUrl; + this.returnBody = returnBody; + this.endUser = endUser; + this.saveKey = saveKey; + this.insertOnly = insertOnly; + this.detectMime = detectMime; + this.fsizeLimit = fsizeLimit; + this.persistentNotifyUrl = persistentNotifyUrl; + this.persistentOps = persistentOps; + this.deadline = deadline; + } + + /* + * 上传成功后,七牛云向App-Server发送POST请求的URL (必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 + * OK的有效URL) 返回包 Content-Type 为 "application/json",即返回的内容必须是合法的 JSON 文本 + */ + private String callbackUrl; + + /* + * 上传成功后,七牛云向App-Server发送POST请求的数据 支持魔法变量和自定义变量。callbackBody 要求是合法的 url + * query + * string。如:key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo. + * height)。 + */ + private String callbackBody; + + /* + * Web端文件上传成功后,浏览器执行303跳转的URL 通常用于HTML Form上传。 + * 文件上传成功后会跳转到?upload_ret=, + * 包含returnBody内容。 如不设置returnUrl,则直接将returnBody的内容返回给客户端。 + */ + private String returnUrl; + + /* + * 上传成功后,自定义七牛云最终返回給上传端(在指定returnUrl时是携带在跳转路径参数中)的数据 支持魔法变量和自定义变量。returnBody + * 要求是合法的 JSON 文本。如:{"key": $(key), "hash": $(etag), "w": + * $(imageInfo.width), "h": $(imageInfo.height)}。 + */ + private String returnBody; + + /* + * 唯一属主标识 特殊场景下非常有用,比如根据App-Client标识给图片或视频打水印。 + */ + private String endUser; + + /* + * 自定义资源名 支持魔法变量及自定义变量。这个字段仅当用户上传的时候没有主动指定key的时候起作用。 + */ + private String saveKey; + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getCallbackUrl() { + return callbackUrl; + } + + public void setCallbackUrl(String callbackUrl) { + this.callbackUrl = callbackUrl; + } + + public String getCallbackBody() { + return callbackBody; + } + + public void setCallbackBody(String callbackBody) { + this.callbackBody = callbackBody; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public String getReturnBody() { + return returnBody; + } + + public void setReturnBody(String returnBody) { + this.returnBody = returnBody; + } + + public String getEndUser() { + return endUser; + } + + public void setEndUser(String endUser) { + this.endUser = endUser; + } + + public String getSaveKey() { + return saveKey; + } + + public void setSaveKey(String saveKey) { + this.saveKey = saveKey; + } + + public int getInsertOnly() { + return insertOnly; + } + + public void setInsertOnly(int insertOnly) { + this.insertOnly = insertOnly; + } + + public int getDetectMime() { + return detectMime; + } + + public void setDetectMime(int detectMime) { + this.detectMime = detectMime; + } + + public long getFsizeLimit() { + return fsizeLimit; + } + + public void setFsizeLimit(long fsizeLimit) { + this.fsizeLimit = fsizeLimit; + } + + public String getPersistentNotifyUrl() { + return persistentNotifyUrl; + } + + public void setPersistentNotifyUrl(String persistentNotifyUrl) { + this.persistentNotifyUrl = persistentNotifyUrl; + } + + public String getPersistentOps() { + return persistentOps; + } + + public void setPersistentOps(String persistentOps) { + this.persistentOps = persistentOps; + } + + public long getDeadline() { + return deadline; + } + + public void setDeadline(long deadline) { + this.deadline = deadline; + } + + /* + * 限定为“新增”语意 如果设置为非0值,则无论scope设置为什么形式,仅能以新增模式上传文件。 + */ + private int insertOnly; + + /* + * 开启MimeType侦测功能 设为非0值,则忽略上传端传递的文件MimeType信息,使用七牛服务器侦测内容后的判断结果 + * 默认设为0值,如上传端指定了MimeType则直接使用该值,否则按如下顺序侦测MimeType值: 1. 检查文件扩展名 2. 检查Key扩展名 + * 3. 侦测内容。 + */ + private int detectMime; + + /* + * 限定上传文件的大小,单位:字节(Byte) 超过限制的上传内容会被判为上传失败,返回413状态码。 + */ + private long fsizeLimit; + + /* + * 接收预转持久化结果通知的URL 必须是公网上可以正常进行POST请求并能响应HTTP/1.1 200 OK的有效URL。 + */ + private String persistentNotifyUrl; + + /* + * 资源上传成功后触发执行的预转持久化处理指令列表 每个指令是一个API规格字符串,多个指令用“;”分隔。 + */ + private String persistentOps; + + /* + * 上传请求授权的截止时间 UNIX时间戳,单位:秒。 + */ + private long deadline; +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java new file mode 100644 index 0000000..2488a31 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAccountServiceImpl.java @@ -0,0 +1,685 @@ +package org.dromara.settlement.dubbo; + +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.RemoteAccountService; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.mapper.AccountLogMapper; +import org.dromara.settlement.mapper.AccountMapper; +import org.dromara.settlement.mapper.AccountSynMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.dromara.settlement.service.impl.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +@DubboService +public class RemoteAccountServiceImpl implements RemoteAccountService +{ + private static final Logger log = LoggerFactory.getLogger(RemoteAccountServiceImpl.class); + + @Autowired + private ZhaoShangServiceImpl zhaoShangServiceImpl;//招商银行业务 + + @Autowired + private AccountServiceTransactionImpl transactionImpl; + + @Autowired + private JitaoTongServiceImpl jitaoTongServiceImpl;//交通银行业务 + + @Autowired + private ZhiFuBaoServiceImpl zhiFuBaoServiceImpl;//支付宝业务 + + @Autowired + private MinShengServiceImpl minShengServiceImpl;//民生银行业务 + + @Autowired + private AccountMapper accountDao;//银行账户dao + + @Autowired + private AccountLogMapper accountLogDao;//银行账户同步明细dao + + @Autowired + private AccountSynMapper accountSynDao;//银行账户同步dao + + @Autowired + private TransactionLogMapper transactionLogDao;//交易记录dao + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Override + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType,Long code) { + return addAccount(unitId, userType, userId, userName, bankType, null, null,code); + } + + @Override + public Result addAccount(long unitId, int userType, Long userId, String userName, String bankType, String bindAcctNo, String bindAcctName,Long code) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + Account account = null; + if (bankType.equals("招商银行")) { + account = zhaoShangServiceImpl.createAccount(unitId, code.toString(), userName, userType + ""); + } else if (bankType.equals("交通银行")) { + account = jitaoTongServiceImpl.createAccount(unitId, userId.toString(), userName, userType + ""); + } else if (bankType.equals("支付宝")) { + account = zhiFuBaoServiceImpl.createAccount(unitId, userId.toString(), userName, userType + ""); + } else if (bankType.equals("民生银行")) { + account = minShengServiceImpl.createAccount(unitId, userId.toString(), userName, userType + "", bindAcctNo, bindAcctName); + } + if (account == null) { + result.tip("创建虚拟银行账号:调用银行接口出错"); + return result; + } + account.setAddTime(new Date()); + account.setEditTime(new Date()); + account.setStatus((short) 1); + account.setType((short) 1); + account.setUnitId(unitId); + if (StringUtils.isBlank(account.getName())) { + account.setName(getMainAccountName(unitId, bankType).getAccountName()); + } + Integer row = accountDao.insertSelective(account); + if (row == 0) { + Account acc = accountDao.selectByCardAndType(account.getBankCard(), account.getBankType()); + account.setId(acc.getId()); + } + result.setRtnData(account); + } catch (Exception e) { + String msgStr = "创建虚拟银行账号出错("+userType+","+userId+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result addAccount(Account account) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + Account exist = accountDao.selectByCardAndType(account.getBankCard(), account.getBankType()); + if(exist != null) { + //if (exist.getType() == 3 || exist.getType() == 2) {//真实企业账户或真实个人账户 + Account upd = new Account(); + if (StringUtils.isNotBlank(account.getName())) { + upd.setId(exist.getId()); + upd.setName(account.getName()); + exist.setName(account.getName()); + } + if (StringUtils.isNotBlank(account.getBankAddress())) { + upd.setId(exist.getId()); + upd.setBankAddress(account.getBankAddress()); + exist.setBankAddress(account.getBankAddress()); + } + if (StringUtils.isNotBlank(account.getBankArgNo())) { + upd.setId(exist.getId()); + upd.setBankArgNo(account.getBankArgNo()); + exist.setBankArgNo(account.getBankArgNo()); + } + + if (StringUtils.isNotBlank(account.getBankNo())) { + upd.setId(exist.getId()); + upd.setBankNo(account.getBankNo()); + exist.setBankNo(account.getBankNo()); + } + if (upd.getId() != null) { + accountDao.updateByPrimaryKeySelective(upd); + } + //} + exist.setBankTypeName(exist.getBankType()); + result.setRtnData(exist); + return result; + }else { + account.setAddTime(new Date()); + account.setEditTime(new Date()); + account.setStatus((short)1); + account.setBalance(0l); + Integer row = accountDao.insertSelective(account); + if (row == 0) { + account = accountDao.selectByCardAndType(account.getBankCard(), account.getBankType()); + } + account.setBankTypeName(account.getBankType()); + result.setRtnData(account); + } + } catch (Exception e) { + String msgStr = "创建虚拟银行账号出错(" + JSONObject.toJSONString(account) + "):"; + log.error(msgStr, e); + result.addError(msgStr + "," + e.getMessage()); + } + return result; + } + + public MainAccount getMainAccountName(long unitId, String bankType) { + // TODO 自动生成的方法存根 + MainAccount main = new MainAccount(); + if (bankType.equals("招商银行")) { + String accnbrname = "zhaoshang_accnbrname"; + String khh = "zhaoshang_khh"; + Map config = wConfigService.getItems(unitId, accnbrname, khh); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + if (config.containsKey(khh) && StringUtils.isNotEmpty(config.get(khh))) { + main.setKhh(config.get(khh)); + } + } else if (bankType.equals("交通银行")) { + String accnbrname = "jiaotong_super_acc_name"; + String khh = "jiaotong_khh"; + Map config = wConfigService.getItems(unitId, accnbrname, khh); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + if (config.containsKey(khh) && StringUtils.isNotEmpty(config.get(khh))) { + main.setKhh(config.get(khh)); + } + } else if (bankType.equals("支付宝")) { + String accnbrname = "zhifubao_acc_name"; + Map config = wConfigService.getItems(unitId, accnbrname); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + } else if (bankType.equals("民生银行")) { + String accnbrname = "minsheng_bank_acctName"; + Map config = wConfigService.getItems(unitId, accnbrname); + if (config.containsKey(accnbrname) && StringUtils.isNotEmpty(config.get(accnbrname))) { + main.setAccountName(config.get(accnbrname)); + } + } + return main; + } + + @Override + public Result getMainAccount(long unitId, String bankType) { + Result result = new Result(); + try { + result.setRtnData(getMainAccountName(unitId, bankType)); + } catch (Exception e) { + String msgStr = "获取虚拟银行账号收款账户出错(" + unitId + "," + bankType + "):"; + log.error(msgStr, e); + result.addError(msgStr + "," + e.getMessage()); + } + return result; + } + + @Override + public Result getAccountName(long unitId, String bankType, String bankCard) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + result.setRtnData(getMainAccountName(unitId, bankType).getAccountName()); + } catch (Exception e) { + String msgStr = "获取虚拟银行账号收款账户名出错(" + unitId + "," + bankType + "," + bankCard + "):"; + log.error(msgStr, e); + result.addError(msgStr + "," + e.getMessage()); + } + return result; + } + + @Override + public Result synAccount(int id, Short trxdir, long synPosition, List exclude) { + // TODO 自动生成的方法存根 + Result result = new Result(); + AccountSyn syn = null; + boolean locked = false; + try { + syn = accountSynDao.selectByPrimaryKey(id); + Account acc = accountDao.selectByPrimaryKey(id); + if (syn == null) { + syn = new AccountSyn(); + syn.setId(acc.getId()); + syn.setUnitId(acc.getUnitId()); + syn.setType(acc.getType()); + syn.setBankCard(acc.getBankCard()); + syn.setBankType(acc.getBankType()); + syn.setType(acc.getType()); + syn.setSynLock((byte)0); + accountSynDao.insertSelective(syn); + } + if (accountSynDao.lock(acc.getId()) == 0) { + result.tip("正在同步"); + syn = null; + return result; + } + locked = true; + syn.setBalance(acc.getBalance()); + syn.setAddAmount(0l); + syn.setReductionAmount(0l); + syn.setTrxnbrs(""); + boolean isSyn = false; + if (syn.getBankType().equals("招商银行")) { + syn = zhaoShangServiceImpl.synAccount(syn); + isSyn = true; + }else if (syn.getBankType().equals("交通银行")) { + syn = jitaoTongServiceImpl.synAccount(syn); + isSyn = true; + } else if (syn.getBankType().equals("民生银行")) { + syn = minShengServiceImpl.synAccount(syn); + isSyn = true; + } + if (isSyn) { + transactionImpl.saveAccountLog(syn); + } + syn.setLogs(accountLogDao.selectByAccId(id, synPosition, trxdir)); + Iterator iter = syn.getLogs().iterator(); + while (iter.hasNext()) { + AccountLog log = (AccountLog) iter.next(); + if(exclude != null && exclude.contains(log.getTrxtxt())) { + iter.remove(); + }else { + if (log.getTrxdir().intValue() == 1) {//收入 + syn.setAddAmount(syn.getAddAmount()+log.getTrxamt()); + }else if (log.getTrxdir().intValue() == 2) {//支出,Trxamt是复数 + syn.setReductionAmount(syn.getReductionAmount()-log.getTrxamt()); + } + } + } + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "同步银行账户出错("+id+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + }finally { + if(locked) { + try { + AccountSyn unlock = new AccountSyn(); + unlock.setId(syn.getId()); + unlock.setSynLock((byte)0); + unlock.setSynPosition(syn.getSynPosition()); + unlock.setSynTime(syn.getSynTime()); + accountSynDao.updateByPrimaryKeySelective(unlock); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("同步银行账户时解锁出错:("+JSONObject.toJSONString(syn)+")",e); + } + } + } + return result; + } + + @Override + public Result applyTransfer(int sourceAccId, int targetAccId, Long amount, String order, String remark) { + // TODO 自动生成的方法存根 + Result result = new Result(); + TransactionLog syn = null; + /*boolean sourceAccLocked = false; + boolean targetAccLocked = false;*/ + try { + Account source = accountDao.selectByPrimaryKey(sourceAccId); + if(source == null) { + result.tip("付款账户("+sourceAccId+")不存在"); + return result; + } + Account target = accountDao.selectByPrimaryKey(targetAccId); + if(target == null) { + result.tip("收款账户("+targetAccId+")不存在"); + return result; + } + /*if (source.getBalance() < amount) { + result.tip("付款账户("+sourceAccId+")余额不足"); + return result; + }*/ + syn = new TransactionLog(); + syn.setUnitId(source.getUnitId()); + syn.setOrderNo(order); + syn.setAddTime(new Date()); + syn.setAmount(amount); + syn.setRemark(remark); + syn.setResult((short)-1); + syn.setSourceAccId(sourceAccId); + syn.setSourceCard(source.getBankCard()); + syn.setTargetAccId(targetAccId); + syn.setTargetCard(target.getBankCard()); + syn.setTargetAccName(target.getName()); + syn.setBankType(source.getBankType()); + transactionLogDao.insertSelective(syn); + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "申请银行账户转账出错("+sourceAccId+","+targetAccId+","+amount+","+order+","+remark+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result transfer(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + TransactionLog syn = null; + /*boolean sourceAccLocked = false; + boolean targetAccLocked = false;*/ + Account target = null; + try { + syn = transactionLogDao.selectByPrimaryKey(tranId); + if (syn == null) { + result.tip("交易记录不存在"); + return result; + } + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + if(source == null) { + result.tip("付款账户("+syn.getSourceAccId()+")不存在"); + return result; + } + syn.setBankType(source.getBankType()); + if (transactionLogDao.lock(tranId) == 0) { + result.tip("交易记录已处理"); + result.setRtnData(syn); + return result; + } + target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + if(target == null) { + result.tip("收款账户("+syn.getTargetAccId()+")不存在"); + return result; + } + /*if (source.getBalance() < syn.getAmount()) { + result.tip("付款账户("+syn.getSourceAccId()+")余额不足"); + return result; + }*/ + /*if (accountDao.lock(sourceAccId) == 0) { + result.tip("付款账户("+sourceAccId+")交易中"); + return result; + } + sourceAccLocked = true; + if (accountDao.lock(targetAccId) == 0) { + result.tip("收款账户("+targetAccId+")交易中"); + return result; + } + targetAccLocked = true;*/ + if(syn.getAmount() > 0) { + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 1) {//虚拟账户 + syn = zhaoShangServiceImpl.innerTransfer(syn); + }else if (target.getType() == 2) {//真实个人账户 + syn = zhaoShangServiceImpl.crossPersionTransfer(syn); + }else if (target.getType() == 3) {//真实企业账户 + syn.setBankType(target.getBankType()); + syn.setTargetAccName(target.getName()); + syn.setTargetAccBankAddr(target.getBankAddress()); + syn = zhaoShangServiceImpl.crossEnterpriseTransfer(syn); + } + }else if (source.getBankType().equals("交通银行")) { + syn.setBankType(target.getBankType()); + syn.setSourceAccName(source.getName()); + if (target.getType() == 1) {//虚拟账户 + syn = jitaoTongServiceImpl.innerTransfer(syn); + }else if (target.getType() == 2) {//真实个人账户 + syn = jitaoTongServiceImpl.crossPersionTransfer(syn,source.getBankArgNo()); + }else if (target.getType() == 3) {//真实企业账户 + syn = jitaoTongServiceImpl.transfer(syn); + } + }else if (source.getBankType().equals("支付宝")) { + syn.setSourceCard(source.getBankArgNo()); + if (target.getType() == 1) {//虚拟账户 + syn.setTargetCard(target.getBankArgNo()); + syn = zhiFuBaoServiceImpl.innerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = zhiFuBaoServiceImpl.transfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = zhiFuBaoServiceImpl.transfer(syn); + } + } else if (source.getBankType().equals("民生银行")) { + syn.setBankType(target.getBankType()); + syn.setSourceAccName(source.getName()); + if (target.getType() == 1) {//虚拟账户 + syn = minShengServiceImpl.innerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = minShengServiceImpl.crossPersionTransfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = minShengServiceImpl.transfer(syn, target.getBankNo()); + } + } + }else { + syn.setResult((short)2); + } + syn.setBankType(source.getBankType()); + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "银行账户转账出错("+tranId+"):"; + log.error(msgStr,e); + if (target == null || target.getType() != 1) {//非虚拟账户,则出现异常就失败 + syn.setResult((short)3);//失败 + syn.setReason(e.getMessage()); + } + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + }finally { + try { + /*Account unlock = new Account(); + unlock.setStatus((short)1); + if(sourceAccLocked) { + unlock.setId(sourceAccId); + accountDao.updateByPrimaryKeySelective(unlock); + } + if(targetAccLocked) { + unlock.setId(targetAccId); + accountDao.updateByPrimaryKeySelective(unlock); + }*/ + if(syn != null) { + if (syn.getResult() == -1) { + transactionLogDao.unlock(syn.getId()); + }else { + TransactionLog upd = new TransactionLog(); + upd.setId(syn.getId()); + upd.setSourceBankNo(syn.getSourceBankNo()); + upd.setTargetBankNo(syn.getTargetBankNo()); + upd.setTranTime(new Date()); + upd.setResult(syn.getResult()); + upd.setReason(syn.getReason()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("保存银行账户交易结果出错:("+JSONObject.toJSONString(syn)+")",e); + } + } + return result; + } + + @Override + public Result synTransfer(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + TransactionLog syn = null; + try { + syn = transactionLogDao.selectByPrimaryKey(tranId); + if (syn == null) { + result.tip("交易记录不存在"); + return result; + } + if (syn.getResult().intValue() > 1) { + result.setRtnData(syn); + return result; + } + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + Account target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + syn.setBankType(source.getBankType()); + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 2) {//真实个人账户 + syn = zhaoShangServiceImpl.synPersionTransfer(syn); + }else if (target.getType() == 3) {//真实企业账户 + syn = zhaoShangServiceImpl.synEnterpriseTransfer(syn); + } + }else if (source.getBankType().equals("交通银行")) { + if (target.getType() == 1) {//云账户 + syn = jitaoTongServiceImpl.synInnerTransfer(syn); + }else if (target.getType() == 2) {//真实个人账户 + syn = jitaoTongServiceImpl.synPersionTransfer(syn); + }else if (target.getType() == 3) {//真实企业账户 + syn = jitaoTongServiceImpl.synTransfer(syn); + } + }else if (source.getBankType().equals("支付宝")) { + if (target.getType() == 1) {//记账本 + syn = zhiFuBaoServiceImpl.synInnerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = zhiFuBaoServiceImpl.synTransfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = zhiFuBaoServiceImpl.synTransfer(syn); + } + } else if (source.getBankType().equals("民生银行")) { + if (target.getType() == 1) {//云账户 + syn = minShengServiceImpl.synInnerTransfer(syn); + } else if (target.getType() == 2) {//真实个人账户 + syn = minShengServiceImpl.synTransfer(syn); + } else if (target.getType() == 3) {//真实企业账户 + syn = minShengServiceImpl.synTransfer(syn); + } + } + result.setRtnData(syn); + } catch (Exception e) { + String msgStr = "同步银行账户交易结果出错("+tranId+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + }finally { + try { + if(syn != null) { + TransactionLog upd = new TransactionLog(); + upd.setId(syn.getId()); + upd.setSourceBankNo(syn.getSourceBankNo()); + upd.setTargetBankNo(syn.getTargetBankNo()); + upd.setTranTime(syn.getTranTime()); + upd.setResult(syn.getResult()); + upd.setReason(syn.getReason()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("保存银行账户交易结果出错:("+JSONObject.toJSONString(syn)+")",e); + } + } + return result; + } + + @Override + public Result getTransfer(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + result.setRtnData(transactionLogDao.selectByPrimaryKey(tranId)); + if (result.getRtnData() != null) { + Account source = accountDao.selectByPrimaryKey(result.getRtnData().getSourceAccId()); + if(source != null) + result.getRtnData().setBankType(source.getBankType()); + } + } catch (Exception e) { + String msgStr = "查询交易记录出错("+tranId+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result getTransferCallBack(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + TransactionLog syn = transactionLogDao.selectByPrimaryKey(tranId); + if (StringUtils.isNotBlank(syn.getPayReceipt())) { + result.setRtnData(syn.getPayReceipt()); + return result; + } + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + Account target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 2) {//真实个人账户 + result.setRtnData(zhaoShangServiceImpl.getTransferCallback(syn)); + }else if (target.getType() == 3) {//真实企业账户 + result.setRtnData(zhaoShangServiceImpl.getTransferCallback(syn)); + } + }else if (source.getBankType().equals("交通银行")) { + result.setRtnData(jitaoTongServiceImpl.getTransferCallback(syn)); + }else if (source.getBankType().equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.getTransferCallback(syn)); + } else if (source.getBankType().equals("民生银行")) { + result.setRtnData(minShengServiceImpl.getTransferCallback(syn)); + } + } catch (Exception e) { + String msgStr = "获取交易回置单出错("+tranId+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result getTransferBankNo(long tranId) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + TransactionLog syn = transactionLogDao.selectByPrimaryKey(tranId); + Account source = accountDao.selectByPrimaryKey(syn.getSourceAccId()); + Account target = accountDao.selectByPrimaryKey(syn.getTargetAccId()); + if (source.getBankType().equals("招商银行")) { + if (target.getType() == 2) {//真实个人账户 + result.setRtnData(zhaoShangServiceImpl.getTransferBankNo(syn,"")); + }else if (target.getType() == 3) {//真实企业账户 + result.setRtnData(zhaoShangServiceImpl.getTransferBankNo(syn,"")); + } +// else if(target.getType() == 1){//虚拟户 +// result.setRtnData(zhaoShangServiceImpl.getTransferBankNo(syn,"")); +// } + }else if (source.getBankType().equals("交通银行")) { + result.setRtnData(jitaoTongServiceImpl.getTransferBankNo(syn)); + }else if (source.getBankType().equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.getTransferBankNo(syn)); + } else if (source.getBankType().equals("民生银行")) { + result.setRtnData(minShengServiceImpl.getTransferBankNo(syn)); + } + if (StringUtils.isNotBlank(result.getRtnData())) { + TransactionLog upd = new TransactionLog(); + upd.setId(tranId); + upd.setTargetBankNo(result.getRtnData()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } catch (Exception e) { + String msgStr = "获取交易流水号出错("+tranId+"):"; + log.error(msgStr,e); + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result getSignInfo(long unitId, String unitName, String bankType) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + if (bankType.equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.getAgreementQrcode(unitId, unitName)); + } + } catch (Exception e) { + String msgStr = "获取签约信息出错("+unitId+","+unitName+","+bankType+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java new file mode 100644 index 0000000..3b59988 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteAuthServiceImpl.java @@ -0,0 +1,182 @@ +package org.dromara.settlement.dubbo; + +import java.net.URLEncoder; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.RemoteAuthService; +import org.dromara.settlement.api.domain.Result; +import org.dromara.settlement.api.domain.auth.BankCardInfo; +import org.dromara.settlement.api.domain.auth.BankInfo; +import org.dromara.settlement.api.domain.auth.CardIdBack; +import org.dromara.settlement.api.domain.auth.CardIdPositive; +import org.dromara.settlement.common.PostDataTools; +import org.dromara.settlement.service.impl.ZhiFuBaoServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestMethod; + + +@Service +@DubboService +public class RemoteAuthServiceImpl implements RemoteAuthService +{ + private static final Logger log = LoggerFactory.getLogger(RemoteAuthServiceImpl.class); + + @Autowired + private ZhiFuBaoServiceImpl zhiFuBaoServiceImpl;//支付宝业务 + + @Override + public Result authCardIdPositive(String positive) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageInfo("https://ocridcard.market.alicloudapi.com/idimages", "image="+positive+"&idCardSide=front", + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" }, + false, false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证身份证正面出错,请检查参数"); + } + + Map param = JSONObject.parseObject(json,Map.class); + if (param.get("code").equals("1")) { + CardIdPositive worker = JSONObject.parseObject(JSONObject.toJSONString(param.get("result")), CardIdPositive.class); + worker.setBirthday(worker.getBirthday().substring(0,4)+"-"+worker.getBirthday().substring(4,6)+"-"+worker.getBirthday().substring(6,8)); + result.setRtnData(worker); + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证身份证正面出错("+positive+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result authCardIdBack(String back) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageInfo("https://ocridcard.market.alicloudapi.com/idimages", "image="+back+"&idCardSide=back", + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" }, + false, false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证身份证反面出错,请检查参数"); + } + Map param = JSONObject.parseObject(json,Map.class); + if (param.get("code").equals("1")) { + CardIdBack worker = JSONObject.parseObject(JSONObject.toJSONString(param.get("result")), CardIdBack.class); + worker.setIssueDate(worker.getIssueDate().substring(0,4)+"-"+worker.getIssueDate().substring(4,6)+"-"+worker.getIssueDate().substring(6,8)); + if(worker.getExpiryDate().length() == 8) { + worker.setExpiryDate(worker.getExpiryDate().substring(0,4)+"-"+worker.getExpiryDate().substring(4,6)+"-"+worker.getExpiryDate().substring(6,8)); + } + result.setRtnData(worker); + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证身份证反面出错("+back+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result authBankMatch(String bankcard, String name, String idcard) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageNullParam("https://bankcard234.shumaidata.com/bankcard234?bankcard="+bankcard+"&idcard="+idcard+"&name="+URLEncoder.encode(name,"UTF-8"), RequestMethod.GET, + new String[] { "Content-Type:application/json; charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" },false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证银行卡出错,请检查参数"); + } + Map param = JSONObject.parseObject(json,Map.class); + if (param.get("code").toString().equals("200") && param.containsKey("data")) { + Map data = (Map)param.get("data"); + if (data.get("result").toString().equals("0") && data.containsKey("bank_info")) { + result.setRtnData(JSONObject.parseObject(JSONObject.toJSONString(data.get("bank_info")), BankInfo.class)); + } + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证银行卡是否一致出错("+bankcard+","+name+","+idcard+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result authBankInfo(String bankcardUrl) { + // TODO 自动生成的方法存根 + Result result = new Result(); + try { + String json = PostDataTools.getIstance().sendMessageInfo("https://cardid.market.alicloudapi.com/ai_market/ai_ocr_universal/yin_hang_ka/v1", "IMAGE="+bankcardUrl+"&IMAGE_TYPE=1", + new String[] { "Content-Type:application/x-www-form-urlencoded;charset=utf-8","Authorization:APPCODE a8b81c2f4630449398ad5649fd72425d" }, + false, false); + if(StringUtils.isBlank(json)) { + throw new ServiceException("认证银行卡出错,请检查参数"); + } + Map param = JSONObject.parseObject(json,Map.class); + if (param.containsKey("银行卡实体信息")) { + Map map = (Map)param.get("银行卡实体信息"); + BankCardInfo bank = new BankCardInfo(); + bank.setCard(map.get("银行卡号")+""); + bank.setExpireDate(map.get("银行卡有效期")+""); + bank.setName(map.get("银行名称")+""); + bank.setType(map.get("银行卡类型")+""); + bank.setTypeName(map.get("银行卡类型名称")+""); + result.setRtnData(bank); + }else { + throw new ServiceException(param.get("msg")+""); + } + } catch (Exception e) { + String msgStr = "认证银行卡信息出错("+bankcardUrl+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } + + @Override + public Result valiAccount(long unitId, String bankType, String bankCard, String mobile, String name, + String cardId) { + // TODO 自动生成的方法存根 + Result result = new Result(false); + try { + if (bankType.equals("支付宝")) { + result.setRtnData(zhiFuBaoServiceImpl.valiAccount(bankCard, mobile, name, cardId)); + } + } catch (Exception e) { + String msgStr = "验证银行账号是否有效出错("+unitId+","+bankType+","+bankCard+","+mobile+","+name+","+cardId+"):"; + log.error(msgStr,e); + if(e instanceof ServiceException) + result.tip(e.getMessage()); + else + result.addError(msgStr+","+e.getMessage()); + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java new file mode 100644 index 0000000..c7ccfa5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/dubbo/RemoteConfigServiceImpl.java @@ -0,0 +1,441 @@ +package org.dromara.settlement.dubbo; + + +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.constant.SystemConfig; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.PropertyUtils; +import org.dromara.settlement.common.QiniuUtils; +import org.dromara.settlement.domain.SelectData; +import org.dromara.settlement.domain.SysUnitConfig; +import org.dromara.settlement.mapper.SysUnitConfigMapper; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Service +@DubboService +public class RemoteConfigServiceImpl implements RemoteConfigService { + private static final Logger log = LoggerFactory.getLogger(RemoteConfigServiceImpl.class); + /** + * 空值 + */ + public final String EMPTY = "-empty-"; + + @Autowired + private SysUnitConfigMapper unitConfigDao;//单位配置 + + @Override + public Boolean valiServiceAccess(long unitId, String key) { + // TODO 自动生成的方法存根 + try { + Map items = getItemsMap(unitId, key); + if(items.containsKey(key) && StringUtils.isNotBlank(items.get(key))) + return true; + } catch (Exception e) { + // TODO 自动生成的 catch 块 + String msg = "验证服务是否能访问出错:("+ unitId + "," + key +")"; + log.error(msg,e); + } + return false; + } + + @Override + public String getItem(long unitId, String key) { + // TODO 自动生成的方法存根 + try { + Map items = getItemsMap(unitId, key); + return items.get(key); + } catch (Exception e) { + e.printStackTrace(); + // TODO 自动生成的 catch 块 + String msg = "获取配置项出错:("+ unitId + "," + key +")"; + log.error(msg,e); + } + return null; + } + + @Override + public Map getItems(long unitId, String... keys) { + // TODO 自动生成的方法存根 + try { + return getItemsMap(unitId, keys); + } catch (Exception e) { + // TODO 自动生成的 catch 块 + String msg = "获取配置项出错:("+ unitId + "," + keys +")"; + log.error(msg,e); + } + return null; + } + + private String getUnitConfigKey(long unitId){ + return "config:"+unitId; + } + + private String getItemValue(String redisKey,String key,Object itemObj){ + String itemValue = null; + if (itemObj == null) { + itemValue = EMPTY; + RedisUtils.setCacheMapValue(redisKey, key, itemValue); + }else { + itemValue = itemObj.toString(); + } + if(itemValue.equals(EMPTY)){ + itemValue = null; + } + return itemValue; + } + + private Map getItemsMap(long unitId, String... keys) throws InterruptedException { + // TODO 自动生成的方法存根 + Map configMap = new HashMap(); + if(keys.length > 0){ + String redisKey = getUnitConfigKey(unitId); + boolean read = false;//需要读取数据库 + if(keys.length == 1){ + if(RedisUtils.hasKey(redisKey)){ + Object itemObj = RedisUtils.getCacheMapValue(redisKey, keys[0]); + String itemValue = getItemValue(redisKey, keys[0], itemObj); + configMap.put(keys[0], itemValue); + return configMap; + }else{ + read = true; + } + }else { + Map map = RedisUtils.getCacheMap(redisKey); + if (map != null && map.size() > 0) { + for (String key : keys) { + Object itemObj = map.get(key); + String itemValue = getItemValue(redisKey, key, itemObj); + configMap.put(key, itemValue); + } + } else { + read = true; + } + } + if (read) { + int lockTime = 10 * 1000;//毫秒 + RLock lock = RedisUtils.getClient().getLock(redisKey); + boolean lockResult = lock.tryLock(lockTime,TimeUnit.MILLISECONDS); + if(lockResult){ + try { + Map unitConfig = new HashMap(); + int common = 0;//公共配置 + List configList = unitConfigDao.selectByUnit(unitId+","+common, null); + //默认的配置 + for (SysUnitConfig con : configList) { + if(con.getConfUnit() == common){ + unitConfig.put(con.getConfItem(), con.getConfValue() == null ?"":con.getConfValue()); + if(con.getIsEnable() != null && con.getIsEnable() == 1 && StringUtils.isNotEmpty(con.getClassAlias()))//key:配置分类别名 value:配置组 + unitConfig.put(con.getClassAlias(), con.getConfGroup()); + } + } + //单位配置 + for (SysUnitConfig con : configList) { + if(con.getConfUnit() == unitId){ + unitConfig.put(con.getConfItem(), con.getConfValue() == null ?"":con.getConfValue()); + if(con.getIsEnable() != null && con.getIsEnable() == 1 && StringUtils.isNotEmpty(con.getClassAlias()))//key:配置分类别名 value:配置组 + unitConfig.put(con.getClassAlias(), con.getConfGroup()); + } + } + //防止穿透 + for (String key : keys) { + configMap.put(key, unitConfig.containsKey(key) ? unitConfig.get(key)+"" : null); + if (!unitConfig.containsKey(key)) { + unitConfig.put(key, EMPTY); + } + } + + RedisUtils.setCacheMap(redisKey, unitConfig); + RedisUtils.expire(redisKey, 60 * 60 * 24 * 6);//6天 + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("读取数据库配置出错:("+unitId+")",e); + }finally{ + if(lock.isLocked() && lock.isHeldByCurrentThread()){ + lock.unlock(); + } + } + }else { + // 设置失败次数计数器, 当到达5次时, 返回失败 + int failCount = 1; + int sleepTime = 100;//毫秒 + int maxFailCount = lockTime / sleepTime; + while(failCount <= maxFailCount){ + // 等待100ms重试 + try { + TimeUnit.MILLISECONDS.sleep(sleepTime); + } catch (InterruptedException e) { + log.error("等待缓存读取出错:("+unitId+","+keys+")",e); + } + configMap = getItemsMap(unitId, keys); + if (configMap.size() > 0){ + // 执行逻辑操作 + break; + }else{ + failCount ++; + } + } + } + } + } + return configMap; + } + + @Override + public String getUploadNetPath(long unitId) { + // TODO 自动生成的方法存根 + String key = "download_root_path"; + //String path = propertyUtils.getPropertiesString(key); + String path = ""; + if (StringUtils.isBlank(path)) { + path = getItem(unitId, key); + } + if (StringUtils.isBlank(path)) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):缺少配置"); + return ""; + } + if (!path.substring(path.length()-1).equals("/")) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):应以/结尾"); + return ""; + } + path = path + unitId + "/"; + return path; + } + + @Override + public SystemConfig.StoreType getStoreType(long unitId) { + // TODO 自动生成的方法存根 + String storeType = getItem(unitId, "store.type"); + return SystemConfig.StoreType.valueOfs(storeType); + } + + @Override + public String getUploadPhyPath(long unitId) { + // TODO 自动生成的方法存根 + String key = "upload_root_pathpage"; + //String path = propertyUtils.getPropertiesString(key); + String path = ""; + if (StringUtils.isBlank(path)) { + path = getItem(unitId, key); + } + if (StringUtils.isBlank(path)) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):缺少配置"); + return ""; + } + if (!path.substring(path.length()-1).equals("/")) { + log.warn("文件访问路径配置错误("+unitId+","+key+"):应以/结尾"); + return ""; + } + path = path + unitId; + return path; + } + + @Override + public String getQiNiuDomain(long unitId) { + // TODO 自动生成的方法存根 + return getItem(unitId, "QiNiu_DOMAIN"); + } + + @Override + public String getQiNiuUptoken(long unitId) { + // TODO 自动生成的方法存根 + try { + String bucketKey = "QiNiu_BUCKET"; + String accesskeyKey = "QiNiu_AccessKey"; + String secretkeyKey = "QiNiu_SecretKey"; + Map configs = getItemsMap(unitId, bucketKey,accesskeyKey,secretkeyKey); + return QiniuUtils.getUptoken(configs.get(accesskeyKey), configs.get(secretkeyKey), configs.get(bucketKey), null, null); + } catch (Exception e) { + String msg = "获取七牛上传凭证出错:("+ unitId +")"; + log.error(msg,e); + } + return ""; + } + + @Override + public Result> getConfClass(Long unit_id, String unitType) { + Result> result = new Result>(); + try { + List confClass = unitConfigDao.getConfClass(unit_id,unitType); + result.setRtnData(confClass); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + public Result> getConfGroupByUnit(Long unit_id, String class_alias) { + Result> result = new Result>(); + try { + //查询默认的大类下的组分类 + List defGroups = unitConfigDao.getConfGroupByUnit(0L,class_alias); + if(!CollectionUtils.isEmpty(defGroups)) { + List schoolGroups = unitConfigDao.getConfGroupByUnit(unit_id,class_alias); + if(!CollectionUtils.isEmpty(schoolGroups)) {//如果学校下面这个大类配置了,把默认选中的置为不选中 + for(UnitConfGroup def : defGroups) { + def.setIs_enable(0); + for(UnitConfGroup school:schoolGroups) { + if(def.getConf_group().equals(school.getConf_group())) { + def.setIs_enable(school.getIs_enable()); + } + } + } + }else{ + int i = 0; + for(UnitConfGroup def : defGroups) { + if(i == 0){ + def.setIs_enable(1); + }else{ + def.setIs_enable(0); + } + i++; + } + } + } + result.setRtnData(defGroups); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + public Result> getConfDetailByUnit(Long unit_id, String conf_group) { + Result> result = new Result>(); + try { + List unitDetails = unitConfigDao.getConfDetailByUnit(unit_id,conf_group); + List exists = new ArrayList(); + for (UnitConfDetail d : unitDetails) { + exists.add(d.getConf_item()); + } + List defaultDetails =unitConfigDao.getConfDetailByUnit(0L,conf_group); + for(UnitConfDetail de :defaultDetails) { + de.setConf_value(""); + if (!exists.contains(de.getConf_item())) { + unitDetails.add(de); + } + } + result.setRtnData(unitDetails); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + @Transactional + public Result editConfDetail(List lendReco) { + Result result = new Result(); + try { + //缓存配置 + Map unitConfig = new HashMap(); + for(UnitConfDetail detail : lendReco) { + detail.setIs_enable(1); + detail.setConf_is_editor(1); + detail.setConf_unit_type(1); + if(detail.getConf_unit()==null||detail.getConf_unit().intValue()==0) { + result.addError("企业配置信息内容项不完整"); + return result; + } + unitConfig.put(detail.getConf_item(), detail.getConf_value()); + if(detail.getIs_enable() != null && detail.getIs_enable() == 1 && StringUtils.isNotEmpty(detail.getClass_alias()))//key:配置分类别名 value:配置组 + unitConfig.put(detail.getClass_alias(), detail.getConf_group()); + } + //该企业下这个大类置为不可用 + unitConfigDao.updateIsEnableByUnit(lendReco.get(0).getConf_unit(),lendReco.get(0).getClass_alias()); + //删除企业下这个组的配置信息 + unitConfigDao.delConfIsEnableByUnit(lendReco.get(0).getConf_unit(),lendReco.get(0).getConf_group()); + //保存企业配置 + unitConfigDao.addConf(lendReco); + //如果缓存已加载,则更新缓存 + String redisKey = getUnitConfigKey(lendReco.get(0).getConf_unit()); + if (RedisUtils.hasKey(redisKey) && unitConfig.size() > 0) { + RedisUtils.setCacheMap(redisKey, unitConfig);//6天 + RedisUtils.expire(redisKey, 60 * 60 * 24 * 6);//6天 + } + result.setRtnData(true); + }catch(Exception ex) { + String msgStr = "查询企业大类异常"; + log.error(msgStr,ex); + result.addError(msgStr); + } + return result; + } + + @Override + public Result getQiniuConfg(Long unit_id) { + Result result = new Result(); + try { + String bucketKey = "QiNiu_BUCKET"; + String accesskeyKey = "QiNiu_AccessKey"; + String secretkeyKey = "QiNiu_SecretKey"; + String secretregion = "QiNiu_Region"; + String secretdomain = "QiNiu_DOMAIN"; + Map configs = getItemsMap(unit_id, bucketKey,accesskeyKey,secretkeyKey,secretregion,secretdomain); + String token = QiniuUtils.getUptoken(configs.get(accesskeyKey), configs.get(secretkeyKey), configs.get(bucketKey), null, null); + QiNiuConfig con = new QiNiuConfig(); + con.setQiNiu_BUCKET(configs.get(bucketKey)); + con.setQiNiu_AccessKey(configs.get(accesskeyKey)); + con.setQiNiu_SecretKey(configs.get(secretkeyKey)); + con.setQiNiu_Region(configs.get(secretregion)); + con.setQiNiu_DOMAIN(configs.get(secretdomain)); + con.setToken(token); + result.setRtnData(con); + } catch (Exception e) { + String msg = "获取七牛上传配置出错:("+ unit_id +")"; + log.error(msg,e); + result.setRtnCode(ResultCodeEnum.ERROR); + } + return result; + } + + @Override + @Transactional + public Result saveConfigById(Long unitId, String key,String value) { + Result result = new Result(); + try { + //删除原来老的配置 + unitConfigDao.delConfig(unitId,key); + unitConfigDao.saveConfig(unitId,key,value); + String redisKey = getUnitConfigKey(unitId); + Map unitConfig = new HashMap(); + unitConfig.put(key, value); + if (RedisUtils.hasKey(redisKey) && unitConfig.size() > 0) { + RedisUtils.setCacheMap(redisKey, unitConfig); + RedisUtils.expire(redisKey, 60 * 60 * 24 * 6);//6天 + } + result.setRtnData(true); + }catch (Exception e) { + String msg = "配置信息失败"; + log.error(msg,e); + result.setRtnCode(ResultCodeEnum.ERROR); + } + return result; + } + + + + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java new file mode 100644 index 0000000..9cded05 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountLogMapper.java @@ -0,0 +1,53 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.AccountLog; + +import java.util.List; + +public interface AccountLogMapper extends BaseMapperPlus { + /** + * 查询已同步的交易流水号 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 账户id + * @param trxnbrs 验证的流水号(多个逗号分隔) + * @param beginTime 交易开始时间 + * @param endTime 交易结束时间 + * @return + */ + public List selectTrxnbrByAccId(@Param("accId") int accId,@Param("trxnbrs") String trxnbrs,@Param("beginTime") String beginTime,@Param("endTime") String endTime); + + /** + * 查询已同步的内部交易流水号 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 账户id + * @param trxnbrs 验证的流水号(多个逗号分隔) + * @param beginTime 交易开始时间 + * @param endTime 交易结束时间 + * @return + */ + public List selectNarinnByAccId(@Param("accId") int accId,@Param("trxnbrs") String trxnbrs,@Param("beginTime") String beginTime,@Param("endTime") String endTime); + + /** + * 批量插入 + * @author 张涛 + * @date 2016年6月23日 + * @param list + * @return + */ + public int insertAll(@Param("list") List list); + + /** + * 查询账户大于指定id的交易记录 + * @author 张涛 + * @date 2021年9月10日 + * @param accId 账户id + * @param minId 最小流水id + * @param trxdir 流水方向(1:收入 2:支出) + * @return + */ + public List selectByAccId(@Param("accId") int accId,@Param("minId") long minId,@Param("trxdir") Short trxdir); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java new file mode 100644 index 0000000..6abaa16 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountMapper.java @@ -0,0 +1,44 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.AccountSyn; + +public interface AccountMapper extends BaseMapperPlus { + int insertSelective(Account record); + + int updateByPrimaryKeySelective(Account record); + + public Account selectByPrimaryKey(Integer id); + /** + * 银行账户加锁 + * @author 张涛 + * @date 2021年9月6日 + * @param accId 银行账户id + * @return + */ + public Integer lock(@Param("accId") int accId); + + /** + * 查询银行账户 + * @author 张涛 + * @date 2021年9月15日 + * @param bankCard 账户卡号 + * @param bankType 银行类型 + * @return + */ + public Account selectByCardAndType(@Param("bankCard") String bankCard,@Param("bankType") String bankType); + + /** + * 根据协议编号查询银行账户 + * @author 张涛 + * @date 2022年8月30日 + * @param unitId + * @param bankType + * @param bankArgNo + * @return + */ + public Account selectByArgNoAndType(@Param("unitId") long unitId,@Param("bankType") String bankType,@Param("bankArgNo") String bankArgNo); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java new file mode 100644 index 0000000..8d74c2a --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/AccountSynMapper.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.checkerframework.checker.units.qual.K; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.AccountSyn; + + +public interface AccountSynMapper extends BaseMapperPlus { + /** + * 锁定同步的账户 + * @author 张涛 + * @date 2021年9月6日 + * @param id 账户id + * @return + */ + public Integer lock(@Param("id") int id); + + + public AccountSyn selectByPrimaryKey(Integer id); + + int insertSelective(AccountSyn record); + + int updateByPrimaryKeySelective(AccountSyn record); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java new file mode 100644 index 0000000..845e4a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SignZhifubaoMapper.java @@ -0,0 +1,37 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.settlement.api.domain.TransactionLog; + + +public interface SignZhifubaoMapper extends BaseMapperPlus { + /** + * 查询支付宝签约信息 + * @author 张涛 + * @date 2022年8月30日 + * @param appId 应用id + * @return + */ + public SignZhifubao selectByAppId(@Param("appId") String appId); + + /** + * 根据appid和单位id更新签约信息 + * @author 张涛 + * @date 2022年9月13日 + * @param info + * @return + */ + public Integer updateByAppId(SignZhifubao info); + + /** + * 查询一个有效的支付宝签约信息 + * @author 张涛 + * @date 2022年12月8日 + * @return + */ + public SignZhifubao selectValid(); + + int insertSelective(SignZhifubao record); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java new file mode 100644 index 0000000..07b1384 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysLogMapper.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.poi.ss.formula.functions.T; +import org.checkerframework.checker.units.qual.K; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.domain.SysLog; + +import java.util.List; + +public interface SysLogMapper extends BaseMapperPlus { + /** + * 根据交易id删除日志 + * @author 张涛 + * @date 2021年9月17日 + * @param tranId 交易id + * @param id 删除时排除的日志id + * @return + */ + public Integer deleteByTranId(@Param("tranId") long tranId,@Param("id") Long id); + + + int deleteByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysLog record); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java new file mode 100644 index 0000000..a73ded7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/SysUnitConfigMapper.java @@ -0,0 +1,133 @@ +package org.dromara.settlement.mapper; + + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.UnitConfClass; +import org.dromara.settlement.api.domain.UnitConfDetail; +import org.dromara.settlement.api.domain.UnitConfGroup; +import org.dromara.settlement.domain.SysUnitConfig; +import org.dromara.settlement.domain.SysUnitConfigKey; + +import java.util.List; + +public interface SysUnitConfigMapper extends BaseMapperPlus { + /** + * 查询单位的配置项 + * @author 张涛 + * @date 2021年1月13日 + * @param unitIds 单位id(多个逗号分隔) + * @param items 配置项唯一标识(多个逗号分隔) + * @return + */ + public List selectByUnit(@Param("conf_units") String unitIds,@Param("conf_items") String items); + + + + /** + * Description: {功能简述} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public List getConfClass(@Param("unit_id") Long unit_id, @Param("unit_type") String unit_type); + + /** + * Description: {查询大类下的组信息} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public List getConfGroupByUnit(@Param("unit_id") Long unit_id, @Param("class_alias") String class_alias); + + /** + * Description: {功能简述} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public List getConfDetailByUnit(@Param("unit_id") Long unit_id, @Param("conf_group") String conf_group); + + /** + * Description: {更新企业下大类的所有配置都是不可用} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public void updateIsEnableByUnit(@Param("unit_id") Long conf_unit,@Param("class_alias") String class_alias); + + /** + * Description: {删除配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public void delConfIsEnableByUnit(@Param("unit_id") Long conf_unit,@Param("conf_group") String conf_group); + + /** + * Description: {保存配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.user.dao.unit + * @author: dinghongbo + * @date :2021年1月27日 + * Note: Nothing much. + */ + public void addConf(List lendReco); + + + + + + /** + * Description: {删除配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.config.dao.unit + * @author: dinghongbo + * @date :2021年2月3日 + * Note: Nothing much. + */ + public void delConfig(@Param("unit_id") Long conf_unit,@Param("key") String key); + + + + /** + * Description: {保存单个配置项} + * @param : + * @return : + * @throws : + * @see :com.tyy.config.dao.unit + * @author: dinghongbo + * @date :2021年2月3日 + * Note: Nothing much. + */ + public void saveConfig(@Param("unit_id") Long conf_unit,@Param("key") String key,@Param("value") String value); + + + + + +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java new file mode 100644 index 0000000..77c8af8 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/mapper/TransactionLogMapper.java @@ -0,0 +1,55 @@ +package org.dromara.settlement.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.api.domain.TransactionLog; +import org.dromara.settlement.domain.SysLog; + +public interface TransactionLogMapper extends BaseMapperPlus { + /** + * 锁定交易记录 + * @author 张涛 + * @date 2021年9月6日 + * @param id 交易记录id + * @return + */ + public Integer lock(@Param("id") long id); + + /** + * 解锁交易记录 + * @author 张涛 + * @date 2021年9月6日 + * @param id 交易记录id + * @return + */ + public Integer unlock(@Param("id") long id); + + /** + * 记录交易的回执单地址 + * + * @param bankType 银行类型 + * @param trans 回执单列表 + * @return + * @author 张涛 + * @date 2022年8月3日 + */ + public Integer updatePayReceipt(@Param("bankType") String bankType, @Param("trans") List trans); + + /** + * 查询交易记录 + * + * @param sourceCard 付款方卡号 + * @param sourceBankNo 付款交易号(银行流水号) + * @return + */ + public TransactionLog selectBySourceBankNo(@Param("sourceCard") String sourceCard, @Param("sourceBankNo") String sourceBankNo); + + int updateByPrimaryKeySelective(TransactionLog record); + + int insertSelective(TransactionLog record); + + public TransactionLog selectByPrimaryKey(Long id); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java new file mode 100644 index 0000000..39ee3e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/IPublicService.java @@ -0,0 +1,26 @@ +package org.dromara.settlement.service; + +import java.util.Map; + +/** + * 公开业务 + */ +public interface IPublicService { + /** + * 支付宝充值通知 + * @author 张涛 + * @date 2022年8月25日 + * @param msg + * @return + */ + public String zfbNotify(Map paramss); + + /** + * 支付宝签约通知 + * @author 张涛 + * @date 2022年8月29日 + * @param request + * @return + */ + public String signNotify(Map paramss); +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java new file mode 100644 index 0000000..74772c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/AccountServiceTransactionImpl.java @@ -0,0 +1,117 @@ +package org.dromara.settlement.service.impl; + +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.AccountLog; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.common.BussinessVariable; +import org.dromara.settlement.mapper.AccountLogMapper; +import org.dromara.settlement.mapper.AccountMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + + +@Service +public class AccountServiceTransactionImpl +{ + @Autowired + private AccountMapper accountDao;//银行账户dao + + @Autowired + private AccountLogMapper accountLogDao;//银行账户同步明细dao + + @Transactional + public void saveAccountLog(AccountSyn syn) { + // TODO 自动生成的方法存根 + if (syn.getLogs() != null && syn.getLogs().size() > 0) { + Collections.sort(syn.getLogs(),new Comparator() { + @Override + public int compare(AccountLog o1, AccountLog o2) { + // 返回值为int类型,大于0表示正序,小于0表示逆序 + if(o2.getTranTime().getTime() > o1.getTranTime().getTime()) { + return -1; + }else if (o2.getTranTime().getTime() < o1.getTranTime().getTime()) { + return 1; + }else { + return 0; + } + } + }); + String beginTime = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD_HH_MM_SS, syn.getLogs().get(0).getTranTime()); + String endTime = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD_HH_MM_SS, syn.getLogs().get(syn.getLogs().size()-1).getTranTime()); + List exists = accountLogDao.selectTrxnbrByAccId(syn.getId(), syn.getTrxnbrs(), beginTime, endTime); + Iterator iter = syn.getLogs().iterator(); + //key:银行交易流水号,value:交易记录 + Map refundTrxnbrs = new HashMap(); + String refundBeginTime = null;//退票记录所属开始时间 + String refundEndTime = null;//退票记录所属结束时间 + boolean balanceChange = false;//账户余额是否变动 + while (iter.hasNext()) { + AccountLog log = (AccountLog) iter.next(); + if (exists.contains(log.getTrxnbr())) { + iter.remove(); + }else { + if (log.getTrxdir().intValue() == 1) {//收入 + syn.setBalance(syn.getBalance()+log.getTrxamt()); + }else if (log.getTrxdir().intValue() == 2) {//支出,Trxamt是复数 + syn.setBalance(syn.getBalance()+log.getTrxamt()); + } + log.setBalance(syn.getBalance()); + balanceChange = true; + if (StringUtils.isNotBlank(log.getRefundTrxnbr())) { + refundTrxnbrs.put(log.getRefundTrxnbr(),log); + if (StringUtils.isBlank(refundBeginTime) || DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, log.getRefundDate()+" 00:00:00").getTime() < + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, refundBeginTime).getTime()) { + refundBeginTime = log.getRefundDate()+" 00:00:00"; + } + if (StringUtils.isBlank(refundEndTime) || DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, log.getRefundDate()+" 23:59:59").getTime() > + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, refundEndTime).getTime()) { + refundEndTime = log.getRefundDate()+" 23:59:59"; + } + } + } + } + if (refundTrxnbrs.size() > 0) { + StringBuffer sf = new StringBuffer(""); + for (String code : refundTrxnbrs.keySet()) { + if ("".equals(sf.toString())) { + sf.append("'" + code + "'"); + } else { + sf.append("," + "'" + code + "'"); + } + } + List refundTrxnbrList = accountLogDao.selectNarinnByAccId(syn.getId(), sf.toString(), refundBeginTime, refundEndTime); + for (AccountLog l : refundTrxnbrList) { + refundTrxnbrs.get(l.getTrxnbr()).setNarinn(l.getNarinn()); + } + } + int batchSize = BussinessVariable.getMaxSizeOfInsert(17);//每批插入条数 + int batchNum = (int)Math.ceil(syn.getLogs().size()/(double)batchSize); + for (int i = 0,total = syn.getLogs().size(); i < batchNum; i++) { + int fromIndex = i * batchSize;//list中开始索引 + int toIndex = fromIndex + batchSize;//list中结束索引 + if(toIndex >= total) + toIndex = total; + accountLogDao.insertAll(syn.getLogs().subList(fromIndex, toIndex)); + } + if(balanceChange) { + Account accUpd = new Account(); + accUpd.setId(syn.getId()); + accUpd.setBalance(syn.getBalance()); + accUpd.setEditTime(new Date()); + accountDao.updateByPrimaryKeySelective(accUpd); + } + } + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java new file mode 100644 index 0000000..4292eff --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/JitaoTongServiceImpl.java @@ -0,0 +1,665 @@ +package org.dromara.settlement.service.impl; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.jiaotong.JiaoTongConfig; +import org.dromara.settlement.common.bank.jiaotong.JiaoTongResponse; +import org.dromara.settlement.common.bank.jiaotong.JiaoTongUtil; +import org.dromara.settlement.common.file.FileUtils; +import org.dromara.settlement.common.file.SftpUtils; +import org.dromara.settlement.common.file.ZipUtils; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SysLogMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.SftpException; + +@Service +public class JitaoTongServiceImpl { + private Logger log = LoggerFactory.getLogger(JitaoTongServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private TransactionLogMapper transactionLogDao;//交易记录dao + + @Autowired + private SysLogMapper sysLogDao;// 日志 + + private JiaoTongResponse request(long unitId, String funcode, StringBuilder body, boolean record) { + return request(unitId, funcode, body, record, null); + } + + private JiaoTongResponse request(long unitId, String funcode, StringBuilder body, boolean record, Long tranId) { + JiaoTongResponse response = null; + JiaoTongConfig config = getBankConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if (record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if (record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = JiaoTongUtil.getInstance().request(config, funcode, reqid, body.toString()); + if (record && requsetRtn != null) { + sysLog.setRequest(requsetRtn.getResult()); + } + if (requsetRtn != null) { + Result responseRtn = JiaoTongUtil.getInstance().response(config, requsetRtn.getRtnData()); + if (record) { + sysLog.setResponseTime(new Date()); + } + if (responseRtn.hasError()) { + log.error(responseRtn.getResult()); + } + response = responseRtn.getRtnData(); + if (record && responseRtn != null) { + sysLog.setResponse(responseRtn.getResult()); + } + } + if (sysLog.getId() != null) { + if (record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + } else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + private JiaoTongConfig getBankConfig(long unitId) { + JiaoTongConfig config = new JiaoTongConfig(); + if (wConfigService != null && unitId > 0) { + config.CorpNo = wConfigService.getItem(unitId, "jiaotong_corpno"); + config.UserNo = wConfigService.getItem(unitId, "jiaotong_userno"); + config.SUPERACC = wConfigService.getItem(unitId, "jiaotong_super_acc"); + config.URL = wConfigService.getItem(unitId, "jiaotong_api"); + config.PAYTYPE = wConfigService.getItem(unitId, "jiaotong_pay_type"); + config.CUSTNO = wConfigService.getItem(unitId, "jiaotong_cust_no"); + config.CALLBACKHOST = wConfigService.getItem(unitId, "jiaotong_callback_host"); + config.CALLBACKPORT = wConfigService.getItem(unitId, "jiaotong_callback_port"); + config.CALLBACKNAME = wConfigService.getItem(unitId, "jiaotong_callback_name"); + config.CALLBACKPASSWORD = wConfigService.getItem(unitId, "jiaotong_callback_password"); + config.SUPERACCNAME = wConfigService.getItem(unitId, "jiaotong_super_acc_name"); + if (StringUtils.isBlank(config.SUPERACCNAME)) { + String key = "config:"+unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置(" + unitId + "):" + config.CorpNo + "," + config.UserNo); + } + return config; + } + + /** + * 创建交通银行云账户 + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 云账户编号 + * @param name 云账户名称 + * @param prefix 云账户编号前缀 + */ + public Account createAccount(long unitId, String code, String name, String prefix) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(unitId); + int total = 10; + if(StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0"+code; + } + if(StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + body.append("").append(1).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(code).append(""); + body.append("").append(config.SUPERACC+"-"+code).append(""); + body.append("").append(config.SUPERACCNAME).append(""); + body.append("").append(name).append(""); + body.append("").append(1).append(""); + body.append("").append(1).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(1).append(""); + body.append("").append(0).append(""); + body.append("").append(0).append(""); + body.append("").append(1).append(""); + body.append("").append(0).append(""); + JiaoTongResponse res = request(unitId, "710713", body, false); + if (res != null && (res.getResultcode().equals("0000") || res.getResultcode().equals("0084"))) { + Account account = new Account(); + account.setBankType("交通银行"); + account.setBankTypeName("交通银行"); + account.setBankCard(config.SUPERACC+"-"+code); + account.setBalance(0l); + return account; + } + return null; + } + + /** + * 同步交通银行账户 + * + * @author 张涛 + * @date 2021年9月6日 + * @param bankCard 银行卡号 + * @return + */ + public AccountSyn synAccount(AccountSyn acc) { + StringBuilder body = new StringBuilder(); + String curDate = DateUtils.getDate(); + String synDate = null;// 最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + } else { + synDate = curDate; + } + body.append("").append(acc.getBankCard()).append(""); + body.append("").append(2).append(""); + body.append("").append(synDate.replace("-", "")).append(""); + body.append("").append(synDate.replace("-", "")).append(""); + JiaoTongResponse res = request(acc.getUnitId(), "710714", body, false); + if (res != null) { + String record_num = "0"; + if(!res.getResultcode().equals("2018")) {//非无符合条件的记录 + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行账户失败"); + } + record_num = res.getData().elementText("record_num"); + } + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (Map item : list) { + String frmcod = item.containsKey("账号") ? item.get("账号") : ""; + if (frmcod.equals(acc.getBankCard())) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + log.setRpyacc(item.containsKey("对方账号") ? item.get("对方账号") : null); + log.setRpynam(item.containsKey("对方户名") ? item.get("对方户名") : null); + String trxtim = item.get("交易时间"); + String trxdat = item.containsKey("交易日期") ? item.get("交易日期") : ""; + if (StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0, 4) + "-" + trxdat.substring(4, 6) + "-" + + trxdat.substring(6, 8) + " " + trxtim.substring(0, 2) + ":" + + trxtim.substring(2, 4) + ":" + trxtim.substring(4, 6); + } else { + trxtim = curDate + " " + trxtim.substring(0, 2) + ":" + trxtim.substring(2, 4) + ":" + + trxtim.substring(4, 6); + } + log.setTranTime( + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + log.setTrxamt(new BigDecimal(item.get("交易金额")).multiply(new BigDecimal(100)) + .longValue()); + log.setTrxnbr(item.get("会计流水号")); + String trxdir = item.get("借贷标志"); + String narinn = null; + if (item.containsKey("传票业务摘要区")) { + if (item.get("传票业务摘要区").indexOf("〉〉") != -1) { + String[] trxtxtArr = item.get("传票业务摘要区").split("〉〉"); + narinn = trxtxtArr[0]; + log.setTrxtxt(trxtxtArr[trxtxtArr.length-1]); + }else { + log.setTrxtxt(item.get("传票业务摘要区")); + } + if (log.getTrxtxt().equals("代收小额支付业务手续费")) { + //手续费的会计流水号与当笔交易相同,这里做兼容处理 + log.setTrxnbr(log.getTrxnbr()+"-1"); + } + } + if (trxdir.equals("D")) { + log.setTrxamt(-log.getTrxamt()); + log.setTrxdir((short) 2); + } else if (trxdir.equals("C")) { + log.setTrxdir((short) 1); + String narinnStr = item.containsKey("备用字段1") ? item.get("备用字段1") : null; + if (StringUtils.isNotBlank(narinnStr)) { + String[] narinnStrArr = narinnStr.split("#"); + if (narinnStrArr[0].equals("1") && narinnStrArr.length > 2) {//退汇 + log.setRefundDate(narinnStrArr[1].substring(0, 4) + "-" + narinnStrArr[1].substring(4, 6) + "-" + + narinnStrArr[1].substring(6, 8)); + log.setRefundTrxnbr(narinnStrArr[2]); + } + } + } + log.setNarinn(narinn); + log.setBalance(acc.getBalance()); + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs() + ","); + } + acc.setTrxnbrs(acc.getTrxnbrs() + "'" + log.getTrxnbr() + "'"); + } + } + } + // 不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate, 1); + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccount(acc); + } + acc.setSynTime(new Date()); + } + return acc; + } + + /** + * 内部转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String cert_no = DateUtils.parseDateToString("yyyyMMddHHmmss", new Date())+log.getId(); + body.append("").append(cert_no).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(1).append(""); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.append("").append(amt).append(""); + body.append(""); + body.append(""); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(log.getSourceAccName()).append(""); + body.append("").append(log.getTargetCard()).append(""); + body.append("").append(log.getTargetAccName()).append(""); + body.append("").append(log.getBankType().equals("交通银行") ? 0 : 1).append(""); + body.append("").append(log.getBankType()).append(""); + body.append("").append(amt).append(""); + body.append("").append(log.getRemark()).append(""); + body.append("").append(log.getOrderNo()).append(""); + body.append(""); + body.append(""); + JiaoTongResponse res = request(log.getUnitId(), "710716", body, true, log.getId()); + if (res == null || !res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("ebank_batflw"))) { + this.log.error(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "内部转账失败"); + log.setResult((short)-1); + return log; + } + log.setSourceBankNo(res.getData().elementText("ebank_batflw")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 对私跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @param busiNo 代发协议编号 + * @return + */ + public TransactionLog crossPersionTransfer(TransactionLog log,String busiNo) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String cert_no = DateUtils.parseDateToString("yyyyMMddHHmmss", new Date())+log.getId(); + body.append("").append(cert_no).append(""); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(config.PAYTYPE).append(""); + body.append("").append(1).append(""); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.append("").append(amt).append(""); + body.append("").append(DateUtils.parseDateToString("yyyyMM", new Date())).append(""); + body.append("").append(busiNo).append(""); + body.append(""); + body.append(""); + body.append("").append(log.getTargetCard()).append(""); + body.append("").append(log.getTargetAccName()).append(""); + body.append("").append(log.getBankType().equals("交通银行") ? "A" : "B").append(""); + body.append("").append(amt).append(""); + body.append("").append(log.getOrderNo()).append(""); + body.append("").append(log.getOrderNo()+"〉〉"+log.getRemark()).append(""); + body.append(""); + body.append(""); + JiaoTongResponse res = request(log.getUnitId(), "330012", body, true, log.getId()); + if (res == null || !res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("ebank_batflw"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "代发转账失败"); + } + log.setSourceBankNo(res.getData().elementText("ebank_batflw")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog transfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String cert_no = DateUtils.parseDateToString("yyyyMMddHHmmss", new Date())+log.getId(); + body.append("").append(cert_no).append(""); + body.append("").append(config.SUPERACC).append(""); + body.append("").append(1).append(""); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.append("").append(amt).append(""); + body.append(""); + body.append(""); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(log.getSourceAccName()).append(""); + body.append("").append(log.getTargetCard()).append(""); + body.append("").append(log.getTargetAccName()).append(""); + body.append("").append(log.getBankType().equals("交通银行") ? 0 : 1).append(""); + body.append("").append(log.getBankType()).append(""); + body.append("").append(amt).append(""); + body.append("").append(log.getRemark()).append(""); + body.append("").append(log.getOrderNo()).append(""); + body.append(""); + body.append(""); + JiaoTongResponse res = request(log.getUnitId(), "710716", body, true, log.getId()); + if (res == null || !res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("ebank_batflw"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "转账失败"); + } + log.setSourceBankNo(res.getData().elementText("ebank_batflw")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 同步对私银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synPersionTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + body.append("").append(log.getSourceBankNo()).append(""); + body.append("").append(2).append(""); + body.append("").append("A").append(""); + JiaoTongResponse res = request(log.getUnitId(), "310404", body, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行对私交易结果失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (list.size() > 0 && list.get(0).containsKey("状态")) { + if (list.get(0).get("状态").equals("F")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (list.get(0).get("状态").equals("E")) { + log.setResult((short) 3); + if(list.get(0).containsKey("错误原因")) { + log.setReason(list.get(0).get("错误原因")); + } + log.setTranTime(new Date()); + } + + } + } + } + return log; + } + + /** + * 同步内部交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synInnerTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + body.append("").append(log.getSourceBankNo()).append(""); + body.append("").append(2).append(""); + JiaoTongResponse res = request(log.getUnitId(), "710717", body, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行交易结果失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (list.size() > 0 && list.get(0).containsKey("交易状态")) { + if (list.get(0).get("交易状态").equals("0")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (list.get(0).get("交易状态").equals("3")) { + log.setResult((short) -1); + if(list.get(0).containsKey("备用字段1")) { + log.setReason(list.get(0).get("备用字段1")); + } + log.setTranTime(new Date()); + } + + } + } + } + return log; + } + + /** + * 同步交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synTransfer(TransactionLog log) { + StringBuilder body = new StringBuilder(); + body.append("").append(log.getSourceBankNo()).append(""); + body.append("").append(2).append(""); + JiaoTongResponse res = request(log.getUnitId(), "710717", body, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行交易结果失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + if (list.size() > 0 && list.get(0).containsKey("交易状态")) { + if (list.get(0).get("交易状态").equals("0")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (list.get(0).get("交易状态").equals("3")) { + log.setResult((short) 3); + if(list.get(0).containsKey("备用字段1")) { + log.setReason(list.get(0).get("备用字段1")); + } + log.setTranTime(new Date()); + } + + } + } + } + return log; + } + + /** + * 获取交易回置单 + * + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + * @throws IOException + * @throws SftpException + */ + public String getTransferCallback(TransactionLog log) throws IOException, InterruptedException { + String callBackFile = ""; + String synDate = DateUtils.parseDateToString(DateUtils.YYYYMMDD,log.getTranTime()); + String lockKey = "jiaotongback:"+log.getUnitId()+":"+synDate; + RLock lock = RedisUtils.getClient().getLock(lockKey); + if(lock.tryLock(1000*60*30, TimeUnit.MILLISECONDS)) { + JiaoTongConfig config = getBankConfig(log.getUnitId()); + String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId())+"/"; + String flName = config.CUSTNO+"_"+synDate+".zip"; + String saveFile = uploadPhyPath + flName; + File saveFileObj = new File(saveFile); + if(!saveFileObj.exists()) { + saveFileObj = null; + SftpUtils sftpUtils = new SftpUtils(); + ChannelSftp sftp = null; + try { + String directory = "/"; + sftp = sftpUtils.connect(config.CALLBACKHOST, Integer.parseInt(config.CALLBACKPORT), config.CALLBACKNAME, config.CALLBACKPASSWORD); + if (sftpUtils.isExist(directory, flName, sftp)) { + if(sftpUtils.download(directory, flName, saveFile, sftp)) { + saveFileObj = new File(saveFile); + sftpUtils.delete(directory, flName, sftp); + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + this.log.error("下载交通银行交易回置单文件出错("+flName+"):",e); + } finally { + sftpUtils.disconnect(config.CALLBACKHOST, sftp); + } + } + if (saveFileObj != null) { + String descDir = saveFile.substring(0,saveFile.lastIndexOf("."))+"/"; + ZipUtils.unZipFiles(saveFile, descDir); + File dir = new File(descDir); + File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组 + if (files != null) { + String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); + //回执单列表 + Map callBackFileList = new HashMap(); + for (int i = 0,len = files.length; i < len; i++) { + String fileName = files[i].getName(); + if (files[i].isFile() && fileName.endsWith(".zip")) { // 判断是文件 + String fileDir = descDir + fileName.substring(0,fileName.lastIndexOf("."))+"/"; + ZipUtils.unZipFiles(descDir+fileName, fileDir); + String payListFile = fileDir + fileName.substring(0,fileName.lastIndexOf("."))+".txt"; + List> payList = JiaoTongUtil.getInstance().getMutiAreaData(FileUtils.readTxtFile(payListFile,"|"), 12); + for (Map pay : payList) { + if (pay.get("!借贷标志").equals("!借方")) { + String key = pay.get("!会计流水号").substring(1); + //主账户下的回执单:代发的收款人是真实收款人 + //云账户下的回执单:代发的收款人是主账户 + //会计流水号不存在,或属于主账户下的回执单(同一会计流水号会存在多个账户文件夹中) + String payReceipt = fileDir.replace(uploadPhyPath, uploadNetPath)+pay.get("回单日期")+"_"+pay.get("!回单编号").substring(1)+"_"+key+".pdf"; + if (!callBackFileList.containsKey(key)) { + TransactionLog callBack = new TransactionLog(); + callBack.setTargetBankNo(key); + callBack.setPayReceipt(payReceipt); + callBackFileList.put(key, callBack); + }else if (callBackFileList.containsKey(key) && fileName.indexOf("-") == -1) { + callBackFileList.get(key).setPayReceipt(payReceipt); + } + } + } + } + } + transactionLogDao.updatePayReceipt("交通银行", new ArrayList(callBackFileList.values())); + if (callBackFileList.containsKey(log.getTargetBankNo())) { + callBackFile = callBackFileList.get(log.getTargetBankNo()).getPayReceipt(); + } + } + } + lock.unlock(); + } + return callBackFile; + } + + /** + * 获取交易流水号 + * + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log) { + String result = ""; + if(log.getTranTime() != null) { + StringBuilder body = new StringBuilder(); + //同步到结果的日期(结束日期) + String synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, log.getTranTime()); + //开始日期(解决同步到结果的日期与银行出结果的时间差问题) + String startDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, DateUtils.addOneHour(log.getTranTime(), -1)); + body.append("").append(log.getSourceCard()).append(""); + body.append("").append(2).append(""); + body.append("").append(startDate.replace("-", "")).append(""); + body.append("").append(synDate.replace("-", "")).append(""); + JiaoTongResponse res = request(log.getUnitId(), "710714", body, false); + if (res != null) { + if (!res.getResultcode().equals("0000") || StringUtils.isBlank(res.getData().elementText("serial_record"))) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步交通银行交易流水号失败"); + } + String record_num = res.getData().elementText("record_num"); + if (Integer.parseInt(record_num) > 0) { + List> list = JiaoTongUtil.getInstance().getMutiAreaData(res.getData().elementText("serial_record"), Integer.parseInt(res.getData().elementText("field_num"))); + for (Map item : list) { + String frmcod = item.containsKey("账号") ? item.get("账号") : ""; + if (frmcod.equals(log.getSourceCard())) { + String narinn = null; + if (item.get("传票业务摘要区").indexOf("〉〉") != -1) { + narinn = item.get("传票业务摘要区").split("〉〉")[0]; + } + if (StringUtils.isNotBlank(narinn) && narinn.equals(log.getOrderNo())) { + result = item.get("会计流水号"); + break; + } + } + } + } + } + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java new file mode 100644 index 0000000..47878a2 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/MinShengServiceImpl.java @@ -0,0 +1,719 @@ +package org.dromara.settlement.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.SftpException; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.minsheng.FileEncryptAndDecryptUtil; +import org.dromara.settlement.common.bank.minsheng.MinShengConfig; +import org.dromara.settlement.common.bank.minsheng.MinShengResponse; +import org.dromara.settlement.common.bank.minsheng.MinShengUtil; +import org.dromara.settlement.common.file.SftpUtils; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SysLogMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.redisson.api.RLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Service +public class MinShengServiceImpl { + private Logger log = LoggerFactory.getLogger(MinShengServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private TransactionLogMapper transactionLogDao;//交易记录dao + + @Autowired + private SysLogMapper sysLogDao;// 日志 + + private MinShengResponse request(long unitId, String funcode, String body, boolean record) { + return request(unitId, funcode, body, record, null); + } + + private MinShengResponse request(long unitId, String funcode, String body, boolean record, Long tranId) { + MinShengResponse response = null; + MinShengConfig config = getBankConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if (record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if (record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = MinShengUtil.getInstance().request(config, funcode, reqid, body); + if (record && requsetRtn != null) { + sysLog.setRequest(requsetRtn.getResult()); + } + if (requsetRtn != null) { + Result responseRtn = MinShengUtil.getInstance().response(config, requsetRtn.getRtnData()); + if (record) { + sysLog.setResponseTime(new Date()); + } + if (responseRtn.hasError()) { + log.error(responseRtn.getResult()); + } + response = responseRtn.getRtnData(); + if (record && responseRtn != null) { + sysLog.setResponse(responseRtn.getResult()); + } + } + if (sysLog.getId() != null) { + if (record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + } else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + private MinShengConfig getBankConfig(long unitId) { + MinShengConfig config = new MinShengConfig(); + if (wConfigService != null && unitId > 0) { + config.merchantNum = wConfigService.getItem(unitId, "minsheng_bank_merchantNum"); + config.systemCode = wConfigService.getItem(unitId, "minsheng_bank_systemCode"); + String uploadPhyPath = wConfigService.getUploadPhyPath(unitId) + "/"; + config.rsaCertPath = uploadPhyPath + + wConfigService.getItem(unitId, "minsheng_bank_rsaCertPath"); + config.rsaCertPsword = wConfigService.getItem(unitId, "minsheng_bank_rsaCertPsword"); + config.URL = wConfigService.getItem(unitId, "minsheng_bank_api"); + config.sm2CmbcPubCert = uploadPhyPath + + wConfigService.getItem(unitId, "minsheng_bank_sm2CmbcPubCert"); + config.sm2MhtPriCertPath = uploadPhyPath + + wConfigService.getItem(unitId, "minsheng_bank_sm2MhtPriCertPath"); + config.sm2MhtPriCertPsword = wConfigService.getItem(unitId, "minsheng_bank_sm2MhtPriCertPsword"); + config.CALLBACKHOST = wConfigService.getItem(unitId, "minsheng_bank_callback_host"); + config.CALLBACKPORT = wConfigService.getItem(unitId, "minsheng_bank_callback_port"); + config.CALLBACKNAME = wConfigService.getItem(unitId, "minsheng_bank_callback_name"); + config.CALLBACKPASSWORD = wConfigService.getItem(unitId, "minsheng_bank_callback_password"); + config.CALLBACKDIRECTORY = wConfigService.getItem(unitId, "minsheng_bank_callback_directory"); + config.customerSignId = wConfigService.getItem(unitId, "minsheng_bank_customerSignId"); + config.acctNo = wConfigService.getItem(unitId, "minsheng_bank_acctNo"); + if (StringUtils.isBlank(config.merchantNum)) { + String key = "config:"+unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置(" + unitId + "):" + config.merchantNum + "," + config.systemCode); + } + return config; + } + + /** + * 创建民生银行云账户 + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 云账户编号 + * @param name 云账户名称 + * @param prefix 云账户编号前缀 + * @param bindAcctNo 绑卡账户号码(真实公户) + * @param bindAcctName 绑卡账户名称(真实公户) + */ + public Account createAccount(long unitId,String code,String name,String prefix,String bindAcctNo,String bindAcctName) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(unitId); + int total = 10; + if(StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0"+code; + } + if(StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + body.put("customerSignId",config.customerSignId); + body.put("acctNo",config.acctNo); + body.put("vacctBusiId",code); + body.put("vacctBusiName",name); + body.put("isApprove",0); + body.put("isBindAcct",1); + body.put("bindAcctNo",bindAcctNo); + body.put("bindAcctName",bindAcctName); + MinShengResponse res = request(unitId, "EIST_T01010401", body.toJSONString(), false); + if (res != null && (res.getResultcode().equals("S") || "EIPSC_D_Q005000_E00010".equals(res.getRespCode()))) { + if("EIPSC_D_Q005000_E00010".equals(res.getRespCode())){ + JSONObject old = getAccount(unitId,code); + if (old == null){ + throw new ServiceException("民生银行子账户修改时不存在"); + } + updateAccount(unitId,old,bindAcctNo,bindAcctName); + res.setData(old); + } + Account account = new Account(); + account.setBankType("民生银行"); + account.setBankTypeName("民生银行"); + account.setBankCard(res.getData().getString("vacctNo")); + account.setName(res.getData().getString("vacctName")); + account.setBalance(0l); + return account; + } + return null; + } + + public void updateAccount(long unitId,JSONObject old,String bindAcctNo,String bindAcctName) { + if(!old.getString("bindAcctNo").equals(bindAcctNo) || !old.getString("bindAcctName").equals(bindAcctName)) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(unitId); + body.put("customerSignId", config.customerSignId); + body.put("vacctNo", old.getString("vacctNo")); + body.put("operType", 2); + body.put("bindAcctNo", bindAcctNo); + body.put("bindAcctName", bindAcctName); + MinShengResponse res = request(unitId, "EIST_T01000410", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "修改民生银行子账户失败"); + } + } + } + } + + public JSONObject getAccount(long unitId,String code) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(unitId); + body.put("customerSignId",config.customerSignId); + body.put("acctNo",config.acctNo); + body.put("bindFlag",1); + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(unitId, "EIST_Q01010402", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "查询民生银行子账户失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + if(StringUtils.isNotBlank(item.getString("vacctBusiId"))) { + if (item.getString("vacctBusiId").equals(code)) { + return item; + } + }else{ + listSize = 0; + } + } + page++; + } + } + }while (listSize > 0); + return null; + } + + /** + * 同步民生银行账户 + * + * @author 张涛 + * @date 2021年9月6日 + * @param bankCard 银行卡号 + * @return + */ + public AccountSyn synAccount(AccountSyn acc) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(acc.getUnitId()); + String curDate = DateUtils.getDate(); + String synDate = null;// 最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + } else { + synDate = curDate; + } + body.put("customerSignId",config.customerSignId); + body.put("vacctNo",acc.getBankCard()); + body.put("dateFrom",synDate.replace("-", "")); + body.put("dateTo",synDate.replace("-", "")); + boolean continueSyn = true;//是否继续同步 + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(acc.getUnitId(), "EIST_Q01000404", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + continueSyn = false; + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行账户失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + if(acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + if(StringUtils.isNotBlank(item.getString("transSeqNo"))) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + log.setRpyacc(item.containsKey("otherAcctNo") ? item.getString("otherAcctNo") : null); + log.setRpynam(item.containsKey("otherAcctName") ? item.getString("otherAcctName") : null); + String trxtim = item.getString("transTime"); + String trxdat = item.containsKey("transDate") ? item.getString("transDate") : ""; + if (StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0, 4) + "-" + trxdat.substring(4, 6) + "-" + + trxdat.substring(6, 8) + " " + trxtim.substring(0, 2) + ":" + + trxtim.substring(2, 4) + ":" + trxtim.substring(4, 6); + } else { + trxtim = curDate + " " + trxtim.substring(0, 2) + ":" + trxtim.substring(2, 4) + ":" + + trxtim.substring(4, 6); + } + log.setTranTime( + DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + log.setTrxamt(new BigDecimal(item.getString("transAmt")).multiply(new BigDecimal(100)) + .longValue()); + log.setTrxnbr(item.getString("transSeqNo")); + String trxdir = item.getString("dcFlag"); + String narinn = null; + if (trxdir.equals("1")) { + log.setTrxamt(-log.getTrxamt()); + log.setTrxdir((short) 2); + } else if (trxdir.equals("2")) { + log.setTrxdir((short) 1); + String postscript = item.getString("postscript"); + log.setTrxtxt(postscript); + if (item.getString("detStat").equals("00") && StringUtils.isNotBlank(postscript) && postscript.indexOf("退汇") != -1) { + //验证退汇的情况 + JSONObject refund = getRefund(acc, synDate, item.getString("otherAcctNo"),item.getString("otherAcctName"),item.getString("transAmt")); + if (refund != null) {//退汇 + TransactionLog oldLog = transactionLogDao.selectBySourceBankNo(acc.getBankCard(), refund.getString("oriApplyId")); + log.setRefundDate(refund.getString("refundTime").substring(0, 10)); + log.setRefundTrxnbr(oldLog.getOrderNo()); + narinn = oldLog.getOrderNo(); + } + } + } + log.setNarinn(narinn); + log.setBalance(acc.getBalance()); + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs() + ","); + } + acc.setTrxnbrs(acc.getTrxnbrs() + "'" + log.getTrxnbr() + "'"); + }else{ + listSize = 0; + } + } + page++; + } + } + }while (listSize > 0); + if(continueSyn){ + // 不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate, 1); + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccount(acc); + } + acc.setSynTime(new Date()); + } + return acc; + } + + /** + * 获取民生银行退汇信息 + * @param acc 子账簿信息 + * @param synDate 退汇日期 + * @param oriPayeeAcctNo 退汇账号 + * @param oriPayeeAcctName 退汇账号名称 + * @param oriTransAmt 退汇金额 + * @return + */ + public JSONObject getRefund(AccountSyn acc,String synDate,String oriPayeeAcctNo,String oriPayeeAcctName,String oriTransAmt) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(acc.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("acctNo",config.acctNo); + body.put("oriDraweeVacctNo",acc.getBankCard()); + body.put("dateFrom",synDate.replace("-", "")); + body.put("dateTo",synDate.replace("-", "")); + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(acc.getUnitId(), "EIST_Q01000415", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取民生银行退汇信息失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + if(oriPayeeAcctNo.equals(item.getString("oriPayeeAcctNo")) && oriPayeeAcctName.equals(item.getString("oriPayeeAcctName")) && oriTransAmt.equals(item.getString("oriTransAmt"))) { + return item; + }else { + listSize = 0; + } + } + page++; + } + } + }while (listSize > 0); + return null; + } + + /** + * 内部转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("draweeVacctNo",log.getSourceCard()); + body.put("payeeVacctNo",log.getTargetCard()); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.put("transAmt",amt); + body.put("summary",log.getOrderNo()); + body.put("postscript",log.getRemark()); + MinShengResponse res = request(log.getUnitId(), "EIST_T01000406", body.toJSONString(), true, log.getId()); + if (res == null || !res.getResultcode().equals("S")) { + this.log.error(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "内部转账失败"); + log.setResult((short)-1); + return log; + } + log.setSourceBankNo(res.getReqSeq()); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 对私跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog crossPersionTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("draweeVacctNo",log.getSourceCard()); + body.put("payeeAcctNo",log.getTargetCard()); + body.put("payeeAcctName",log.getTargetAccName()); + body.put("payeeAcctType",1); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.put("transAmt",amt); + String remark = log.getRemark().replace("代发服务费","服务费"); + body.put("postscript",remark); + body.put("summary",log.getOrderNo()+"〉〉"+remark); + MinShengResponse res = request(log.getUnitId(), "EIST_T01000404", body.toJSONString(), true, log.getId()); + if (res == null || !res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "代发转账失败"); + } + log.setSourceBankNo(res.getData().getString("applyId")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 对公转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @param targetKhhNo 收款人开户行行号 + * @return + */ + public TransactionLog transfer(TransactionLog log,String targetKhhNo) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("draweeVacctNo",log.getSourceCard()); + body.put("payeeBankNo",targetKhhNo); + body.put("payeeAcctNo",log.getTargetCard()); + body.put("payeeAcctName",log.getTargetAccName()); + body.put("payeeAcctType",0); + String amt = String.format("%.2f", log.getAmount() / 100.0); + body.put("transAmt",amt); + body.put("postscript",log.getRemark()); + body.put("summary",log.getOrderNo()+"〉〉"+log.getRemark()); + MinShengResponse res = request(log.getUnitId(), "EIST_T01000404", body.toJSONString(), true, log.getId()); + if (res == null || !res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "转账失败"); + } + log.setSourceBankNo(res.getData().getString("applyId")); + log.setTargetBankNo(log.getSourceBankNo()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 同步内部交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synInnerTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + body.put("channelReqSeq",log.getSourceBankNo()); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01000409", body.toJSONString(), false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行子账户间交易结果失败"); + } + if (res.getData().getString("transStatus").equals("02")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (res.getData().getString("transStatus").equals("03")) { + log.setResult((short) -1); + if (StringUtils.isNotEmpty(res.getData().getString("postscript"))) { + log.setReason(res.getData().getString("postscript")); + } + if(StringUtils.isNotEmpty(log.getReason())){ + log.setReason(log.getReason() + "、"); + } + if (StringUtils.isNotEmpty(res.getData().getString("summary"))) { + log.setReason(log.getReason() + res.getData().getString("summary")); + } + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 同步交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synTransfer(TransactionLog log) { + JSONObject body = new JSONObject(); + body.put("applyId",log.getSourceBankNo()); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01000405", body.toJSONString(), false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行对私交易结果失败"); + } + if (res.getData().getString("transStatus").equals("02")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (res.getData().getString("transStatus").equals("03")) { + log.setResult((short) 3); + log.setReason(res.getData().getString("retMsg")); + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 获取交易回置单 + * + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + * @throws IOException + * @throws SftpException + */ + public String getTransferCallback(TransactionLog log) throws IOException, InterruptedException { + String callBackFile = ""; + String synDate = DateUtils.parseDateToString(DateUtils.YYYYMMDD,log.getTranTime()); + String lockKey = "minsheng:"+log.getUnitId()+":"+synDate; + RLock lock = RedisUtils.getClient().getLock(lockKey); + if(lock.tryLock(1000*60*30, TimeUnit.MILLISECONDS)) { + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + if(StringUtils.isBlank(log.getPayReceiptId())) { + body.put("customerSignId",config.customerSignId); + body.put("transSeqNo",log.getTargetBankNo()); + body.put("transDate",synDate); + body.put("acctNo",config.acctNo); + MinShengResponse res = request(log.getUnitId(), "EIST_T01010301", body.toJSONString(), false); + if (res != null) { + if (res.getResultcode().equals("S")) { + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(res.getReqSeq()); + transactionLogDao.updateByPrimaryKeySelective(upd); + log.setPayReceiptId(upd.getPayReceiptId()); + } + } + } + if(StringUtils.isNotBlank(log.getPayReceiptId())) { + body = new JSONObject(); + body.put("channelReqSeq",log.getPayReceiptId()); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01010302", body.toJSONString(), false); + if (res != null) { + if (res.getResultcode().equals("S")) { + if("3".equals(res.getData().getString("status"))){ + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(""); + transactionLogDao.updateByPrimaryKeySelective(upd); + }else if("2".equals(res.getData().getString("status"))) { + String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId()) + "/"; + String flName = res.getData().getString("fileName"); + String saveFile = uploadPhyPath + config.acctNo + flName; + File saveFileObj = new File(saveFile); + if (!saveFileObj.exists()) { + saveFileObj = null; + SftpUtils sftpUtils = new SftpUtils(); + ChannelSftp sftp = null; + try { + String directory = "/"; + if(StringUtils.isNotBlank(config.CALLBACKDIRECTORY)){ + directory += config.CALLBACKDIRECTORY + "/"; + } + sftp = sftpUtils.connect(config.CALLBACKHOST, Integer.parseInt(config.CALLBACKPORT), config.CALLBACKNAME, config.CALLBACKPASSWORD); + if (sftpUtils.isExist(directory, flName, sftp)) { + String downloadFileName = "encrypt"+config.acctNo + flName; + if (sftpUtils.download(directory, flName, uploadPhyPath + downloadFileName, sftp)) { + FileEncryptAndDecryptUtil.decryptFile(downloadFileName,uploadPhyPath,config.sm2MhtPriCertPath,config.sm2MhtPriCertPsword,saveFile); + saveFileObj = new File(saveFile); + if(saveFileObj.exists()) { + sftpUtils.delete(directory, flName, sftp); + }else{ + saveFileObj = null; + } + new File(uploadPhyPath + downloadFileName).delete(); + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + this.log.error("下载民生银行交易回置单文件出错(" + flName + "):", e); + } finally { + sftpUtils.disconnect(config.CALLBACKHOST, sftp); + } + } + if (saveFileObj != null) { + String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); + //回执单列表 + List callBackFileList = new ArrayList(); + TransactionLog callBack = new TransactionLog(); + callBack.setTargetBankNo(log.getTargetBankNo()); + callBack.setPayReceipt(saveFile.replace(uploadPhyPath, uploadNetPath)); + callBackFileList.add(callBack); + transactionLogDao.updatePayReceipt("民生银行", callBackFileList); + callBackFile = callBack.getPayReceipt(); + } + } + } + } + } + lock.unlock(); + } + return callBackFile; + } + + /** + * 获取交易流水号 + * + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log) { + return log.getSourceBankNo().substring(0,23); + /*if(log.getTranTime() != null) { + //同步到结果的日期(结束日期) + String synDate = DateTimeUtils.parseDateToString(DateTimeUtils.pattern_yyyy_MM_dd, log.getTranTime()); + //开始日期(解决同步到结果的日期与银行出结果的时间差问题) + String startDate = DateTimeUtils.parseDateToString(DateTimeUtils.pattern_yyyy_MM_dd, DateTimeUtils.addOneHour(log.getTranTime(), -1)); + + JSONObject body = new JSONObject(); + MinShengConfig config = getBankConfig(log.getUnitId()); + body.put("customerSignId",config.customerSignId); + body.put("vacctNo",log.getSourceCard()); + body.put("dateFrom",startDate.replace("-", "")); + body.put("dateTo",synDate.replace("-", "")); + int page = 1; + int listSize = 0; + do{ + listSize = 0; + body.put("currentPage",page); + body.put("pageSize",50); + MinShengResponse res = request(log.getUnitId(), "EIST_Q01000404", body.toJSONString(), false); + if (res != null) { + if (!res.getResultcode().equals("S")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步民生银行交易流水号失败"); + } + JSONArray resultList = res.getData().getJSONArray("resultList"); + listSize = resultList.size(); + if (listSize > 0) { + for (int i = 0; i < listSize; i++) { + JSONObject item = resultList.getJSONObject(i); + String summary = item.getString("summary"); + if (summary.indexOf("〉〉") != -1) { + String[] summaryArr = summary.split("〉〉"); + if (summaryArr[0].equals(log.getOrderNo())){ + return item.getString("transSeqNo").substring(0,23); + } + } + } + page++; + } + } + }while (listSize > 0); + } + return "";*/ + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java new file mode 100644 index 0000000..76484fe --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/PublicServiceImpl.java @@ -0,0 +1,146 @@ +package org.dromara.settlement.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.internal.util.AlipaySignature; +import com.fasterxml.jackson.core.type.TypeReference; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.settlement.api.domain.Account; +import org.dromara.settlement.api.domain.AccountLog; +import org.dromara.settlement.api.domain.AccountSyn; +import org.dromara.settlement.api.domain.SignZhifubao; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoConfig; +import org.dromara.settlement.mapper.AccountMapper; +import org.dromara.settlement.mapper.AccountSynMapper; +import org.dromara.settlement.mapper.SignZhifubaoMapper; +import org.dromara.settlement.service.IPublicService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.*; + +@Service("publicServiceImpl") +public class PublicServiceImpl implements IPublicService { + private static final Logger log = LoggerFactory.getLogger(PublicServiceImpl.class); + + @Autowired + private ZhiFuBaoServiceImpl zhiFuBaoServiceImpl; + + @Autowired + private AccountServiceTransactionImpl transactionImpl; + + @Autowired + private SignZhifubaoMapper signZhifubaoDao;//支付宝签约信息 + + @Autowired + private AccountMapper accountDao;//银行账户dao + + @Autowired + private AccountSynMapper accountSynDao;//银行账户同步dao + + @Override + public String zfbNotify(Map paramss) { + // TODO 自动生成的方法存根 + String ret = "success"; + try { + if(paramss.size() > 0 && paramss.containsKey("app_id")) { + SignZhifubao sign = signZhifubaoDao.selectByAppId(paramss.get("app_id")); + if(sign != null) { + long unitId = sign.getUnitId(); + ZhiFuBaoConfig config = zhiFuBaoServiceImpl.getBankConfig(unitId); + if(AlipaySignature.certVerifyV1(paramss, config.alipayCertPublicKey, "UTF-8", "RSA2")) { + Map params = JSONObject.parseObject(paramss.get("biz_content"), Map.class); + if(params.containsKey("payee_identity_type") && params.get("payee_identity_type").equals("ACCOUNT_BOOK_ID")) {//记账本 + Account acc = accountDao.selectByArgNoAndType(unitId, "支付宝", params.get("payee_identity")); + if (acc == null) { + log.info("银行账户的支付宝协议编号["+params.get("payee_identity")+"]不存在,延迟接收支付宝充值通知"); + return "fail"; + } + AccountSyn syn = accountSynDao.selectByPrimaryKey(acc.getId()); + if (syn == null) { + syn = new AccountSyn(); + syn.setId(acc.getId()); + syn.setUnitId(acc.getUnitId()); + syn.setType(acc.getType()); + syn.setBankCard(acc.getBankCard()); + syn.setBankType(acc.getBankType()); + syn.setType(acc.getType()); + syn.setSynLock((byte)0); + accountSynDao.insertSelective(syn); + } + syn.setBalance(acc.getBalance()); + syn.setAddAmount(0l); + syn.setReductionAmount(0l); + syn.setTrxnbrs(""); + AccountLog log = new AccountLog(); + log.setAccId(syn.getId()); + log.setAddBy("系统"); + log.setAddTime(new Date()); + log.setBankCard(syn.getBankCard()); + log.setBankType(syn.getBankType()); + log.setRpyacc(params.get("payer_identity")); + log.setRpynam(params.get("payer_name")); + log.setTranTime(log.getAddTime()); + log.setTrxamt(new BigDecimal(params.get("amount")).multiply(new BigDecimal(100)) + .longValue()); + log.setTrxnbr(params.get("order_no")); + log.setTrxdir((short) 1); + log.setBalance(syn.getBalance()); + log.setUnitId(syn.getUnitId()); + syn.setLogs(new ArrayList()); + syn.getLogs().add(log); + if (StringUtils.isNotBlank(syn.getTrxnbrs())) { + syn.setTrxnbrs(syn.getTrxnbrs() + ","); + } + syn.setTrxnbrs(syn.getTrxnbrs() + "'" + log.getTrxnbr() + "'"); + transactionImpl.saveAccountLog(syn); + } + } + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("支付宝充值通知解析出错("+JSONObject.toJSONString(paramss)+"):",e); + ret = "fail"; + } + return ret; + } + + @Override + public String signNotify(Map paramss) { + // TODO 自动生成的方法存根 + Map params = null; + String ret = "success"; + try { + //params = getParamMap(request); + if(params.size() > 0) { + long unitId = Long.parseLong(params.get("external_agreement_no")); + ZhiFuBaoConfig config = zhiFuBaoServiceImpl.getBankConfig(unitId); + if(AlipaySignature.certVerifyV1(params, config.alipayCertPublicKey, "UTF-8", "RSA2")) { + SignZhifubao upd = new SignZhifubao(); + upd.setAgreementNo(params.get("agreement_no")); + upd.setAlipayLogonId(params.get("alipay_logon_id")); + upd.setAppId(params.get("app_id")); + upd.setSignTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, params.get("sign_time"))); + upd.setStatus(params.get("status")); + upd.setUnitId(unitId); + upd.setValidTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, params.get("valid_time"))); + upd.setEditTime(new Date()); + upd.setAddTime(upd.getEditTime()); + Integer row = signZhifubaoDao.insertSelective(upd); + if (row == 0) { + upd.setAddTime(null); + signZhifubaoDao.updateByAppId(upd); + } + } + } + } catch (Exception e) { + // TODO 自动生成的 catch 块 + log.error("支付宝签约通知解析出错("+JSONObject.toJSONString(params)+"):",e); + ret = "fail"; + } + return ret; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java new file mode 100644 index 0000000..5479e39 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhaoShangServiceImpl.java @@ -0,0 +1,833 @@ +package org.dromara.settlement.service.impl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Date; + +import com.alibaba.nacos.shaded.com.google.gson.JsonArray; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.settlement.api.RemoteConfigService; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.zhaoshang.ZhaoShangConfig; +import org.dromara.settlement.common.bank.zhaoshang.ZhaoShangResponse; +import org.dromara.settlement.common.bank.zhaoshang.ZhaoShangUtil; +import org.dromara.settlement.common.file.FileUtils; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SysLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class ZhaoShangServiceImpl +{ + private static final Logger log = LoggerFactory.getLogger(ZhaoShangServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private SysLogMapper sysLogDao;//日志 + + + @DubboReference + private RemoteFileService remoteFileService; + + private ZhaoShangResponse request(long unitId, String funcode, JsonObject body, boolean record) { + return request(unitId, funcode, body, record, null); + } + + private ZhaoShangResponse request(long unitId,String funcode,JsonObject body,boolean record,Long tranId) { + ZhaoShangResponse response = null; + ZhaoShangConfig config = getZhaoShangConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if(record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if(record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = ZhaoShangUtil.getInstance().request(config,funcode, reqid, body); + if(record && requsetRtn != null) { + sysLog.setRequest(requsetRtn.getResult()); + } + if (requsetRtn != null) { + Result responseRtn = ZhaoShangUtil.getInstance().response(config,requsetRtn.getRtnData()); + if(record) { + sysLog.setResponseTime(new Date()); + } + if (responseRtn.hasError()) { + log.error(responseRtn.getResult()); + } + response = responseRtn.getRtnData(); + if(record && responseRtn != null) { + sysLog.setResponse(responseRtn.getResult()); + } + } + if (sysLog.getId() != null) { + if(record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + }else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + private ZhaoShangConfig getZhaoShangConfig(long unitId) { + ZhaoShangConfig config = new ZhaoShangConfig(); + if (wConfigService != null && unitId > 0) { + config.ACCNBR = wConfigService.getItem(unitId, "zhaoshang_accnbr"); + config.AESKEY = wConfigService.getItem(unitId, "zhaoshang_aeskey"); + config.prikeyStr = wConfigService.getItem(unitId, "zhaoshang_prikey"); + config.pubkeyStr = wConfigService.getItem(unitId, "zhaoshang_pubkey"); + config.UID = wConfigService.getItem(unitId, "zhaoshang_uid"); + config.URL = wConfigService.getItem(unitId, "zhaoshang_api"); + config.BBKNBR = wConfigService.getItem(unitId, "zhaoshang_bbknbr"); + config.KHH = wConfigService.getItem(unitId, "zhaoshang_khh"); + config.LHH = wConfigService.getItem(unitId, "zhaoshang_llh"); + if (StringUtils.isBlank(config.BBKNBR)) { + String key = "config:"+unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置("+unitId+"):"+config.ACCNBR+","+config.UID+","+config.AESKEY); + } + return config; + } + + /** + * 创建招商银行记账子单位(虚拟账户) + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 记账子单元编号 + * @param name 记账子单元名称 + * @param prefix 记账子单元编号前缀 + */ + public Account createAccount(long unitId,String code,String name,String prefix) { + JsonObject body = new JsonObject(); + JsonObject ntdmaaddx = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(unitId); + ntdmaaddx.addProperty("accnbr", config.ACCNBR); + int total = 10; + if(StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0"+code; + } + if(StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + ntdmaaddx.addProperty("dmanbr", code); + ntdmaaddx.addProperty("dmanam", name); + ntdmaaddx.addProperty("ovrctl", "N"); + ntdmaaddx.addProperty("bcktyp", "Y"); + ntdmaaddx.addProperty("clstyp", "N"); + body.add("ntdmaaddx", ntdmaaddx); + ZhaoShangResponse res = request(unitId,"NTDMAADD", body,false); + if (res != null) { + //新开通主账户,发现code存在时,Resultcode不一致,所以这里也用中文判断了 + if (res.getResultcode().equals("SUC0000") || res.getResultcode().equals("NCB6608") || (StringUtils.isNotBlank(res.getResultmsg()) && res.getResultmsg().indexOf("子单元编号已存在") != -1)) {//成功或已存在 + Account account = new Account(); + account.setBankType("招商银行"); + account.setBankTypeName("招商银行"); + account.setBankNo(config.LHH); + account.setBankName(config.KHH); + account.setBankCard(config.ACCNBR + code); + account.setBalance(0l); + return account; + } + } + return null; + } + + + + public AccountSyn synAccountNew(AccountSyn acc) { + try{ + Thread.sleep(1000*10); + }catch (Exception e){ + + } + JsonObject body = new JsonObject(); + String curDate = DateUtils.getDate(); + String synDate = null;//最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + if (StringUtils.isBlank(acc.getSynPosition()) && DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //如果交易日同步完成,则开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate,1); + } + }else { + synDate = curDate; + } + ZhaoShangConfig config = getZhaoShangConfig(acc.getUnitId()); + + JsonObject ntdmtqrdy1 = new JsonObject(); + ntdmtqrdy1.addProperty("bbknbr", config.BBKNBR); + ntdmtqrdy1.addProperty("inbacc", config.ACCNBR); + ntdmtqrdy1.addProperty("dyanbr", acc.getBankCard().replace(config.ACCNBR,"")); + String funcode = "NTDMTQRD"; + if (StringUtils.isNotBlank(acc.getSynPosition())) { + ntdmtqrdy1.addProperty("ctnkey", acc.getSynPosition()); + } + + if(!curDate.equals(synDate)){ + ntdmtqrdy1.addProperty("begdat",synDate.replaceAll("-","")); + ntdmtqrdy1.addProperty("enddat",synDate.replaceAll("-","")); + funcode ="NTDMTQRY"; + body.add("ntdmtqryy1",ntdmtqrdy1); + }else{ + body.add("ntdmtqrdy1",ntdmtqrdy1); + } + + ZhaoShangResponse res = request(acc.getUnitId(),funcode, body,false); + String todaySynPosition = ""; + if (res != null) { + JsonArray rtnBody = null; + if(res.getData().has("ntdmtqryz1")) { + rtnBody = res.getData().getAsJsonArray("ntdmtqryz1"); + } + if(res.getData().has("ntdmtqryy1")) { + JsonArray ntdmtlsty = res.getData().getAsJsonArray("ntdmtqryy1"); + JsonObject ntdmtlstyItem = ntdmtlsty.get(0).getAsJsonObject(); + todaySynPosition = ntdmtlstyItem.get("ctnkey").getAsString(); + if(StringUtils.isEmpty(todaySynPosition)) {//已查完交易日的所有交易 + acc.setSynPosition(""); + }else { + acc.setSynPosition(todaySynPosition); + } + }else { + acc.setSynPosition(""); + } + if (rtnBody != null && rtnBody.size() > 0) { + if (acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (int i = 0, len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + String frmcod = item.has("dyanbr") ? item.get("dyanbr").getAsString() : ""; + if ((config.ACCNBR + frmcod).equals(acc.getBankCard())) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + //log.setCcynbr(item.getString("ccynbr")); + //R:冲账,冲正标志 + log.setMthflg(item.has("rvstag") ? item.get("rvstag").getAsString() : null); + //交易识别编码, + log.setNarinn(item.has("narinn") ? item.get("narinn").getAsString() : null); + log.setRpyacc(item.has("rpyacc") ? item.get("rpyacc").getAsString() : null); + log.setRpynam(item.has("rpynam") ? item.get("rpynam").getAsString() : null); + //交易时间 + String trxtim = item.get("trxtim").getAsString(); + //交易日期 + String trxdat = item.has("trxdat") ? item.get("trxdat").getAsString() : ""; + + if(StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0,4)+"-"+trxdat.substring(4,6)+"-"+trxdat.substring(6,8) + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + }else { + trxtim = curDate + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + } + log.setTranTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + //交易金额 + log.setTrxamt(new BigDecimal(item.get("trxamt").getAsString()).multiply(new BigDecimal(100)).longValue()); + //交易方向 D:借方(支出) C:贷方(收入) + String trxdir = item.get("trxdir").getAsString(); + if(trxdir.equals("D")) { + log.setTrxdir((short)2); + }else if (trxdir.equals("C")) { + log.setTrxdir((short)1); + //退款交易:关联原交易 + if(item.get("rlttrx") != null ){ + log.setRefundTrxnbr(item.get("rlttrx").getAsString()); + log.setRefundDate(trxdat); + } + } + log.setBalance(acc.getBalance()); + //记账流水号 + log.setTrxnbr(item.get("trxnbr").getAsString()); + //交易摘要 + if(item.has("trxtxt")) { + log.setTrxtxt(item.get("trxtxt").getAsString()); + } + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs()+","); + } + acc.setTrxnbrs(acc.getTrxnbrs()+"'"+log.getTrxnbr()+"'"); + } + } + } + //不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime() || StringUtils.isNotBlank(acc.getSynPosition())) { + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccountNew(acc); + }else if(StringUtils.isNotBlank(todaySynPosition)){//今天时间还没有过完,需要根据同步位置继续同步 + acc.setSynPosition(todaySynPosition); + } + acc.setSynTime(new Date()); + } + return acc; + } + + /** + * 同步招商银行账户 + * @author 张涛 + * @date 2021年9月6日 + * @param bankCard 银行卡号 + * @return + */ + + @Deprecated + public AccountSyn synAccount(AccountSyn acc) { + JsonObject body = new JsonObject(); + String curDate = DateUtils.getDate(); + String synDate = null;//最近同步日期 + if (acc.getSynTime() != null) { + synDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, acc.getSynTime()); + if (StringUtils.isBlank(acc.getSynPosition()) && DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime()) { + //如果交易日同步完成,则开始同步下一天的 + synDate = DateUtils.getEndDateByDays(synDate,1); + } + }else { + synDate = curDate; + } + ZhaoShangConfig config = getZhaoShangConfig(acc.getUnitId()); + body.addProperty("bbknbr", config.BBKNBR); + body.addProperty("accnbr", config.ACCNBR); + body.addProperty("trsdat", synDate.replace("-", "")); + if (StringUtils.isNotBlank(acc.getSynPosition())) { + body.addProperty("trsseq", Integer.parseInt(acc.getSynPosition())+1); + } + ZhaoShangResponse res = request(acc.getUnitId(),"DCTRSINF", body,false); + String todaySynPosition = ""; + if (res != null) { + JsonArray rtnBody = null; + if(res.getData().has("ntqactrsz2")) { + rtnBody = res.getData().getAsJsonArray("ntqactrsz2"); + } + if(res.getData().has("ntrbptrsz1")) { + JsonArray ntdmtlsty = res.getData().getAsJsonArray("ntrbptrsz1"); + JsonObject ntdmtlstyItem = ntdmtlsty.get(0).getAsJsonObject(); + todaySynPosition = ntdmtlstyItem.get("trsseq").getAsString(); + if(ntdmtlstyItem.get("cotflg").getAsString().equals("N")) {//已查完交易日的所有交易 + acc.setSynPosition(""); + }else { + acc.setSynPosition(todaySynPosition); + } + }else { + acc.setSynPosition(""); + } + if (rtnBody != null && rtnBody.size() > 0) { + if (acc.getLogs() == null) { + acc.setLogs(new ArrayList()); + } + Date curTime = new Date(); + for (int i = 0, len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + String frmcod = item.has("frmcod") ? item.get("frmcod").getAsString() : ""; + if ((config.ACCNBR + frmcod).equals(acc.getBankCard())) { + AccountLog log = new AccountLog(); + log.setAccId(acc.getId()); + log.setAddBy("系统"); + log.setAddTime(curTime); + log.setBankCard(acc.getBankCard()); + log.setBankType(acc.getBankType()); + //log.setCcynbr(item.getString("ccynbr")); + log.setMthflg(item.has("rsvflg") ? item.get("rsvflg").getAsString() : null); + log.setNarinn(item.has("yurref") ? item.get("yurref").getAsString() : null); + log.setRpyacc(item.has("rpyacc") ? item.get("rpyacc").getAsString() : null); + log.setRpynam(item.has("rpynam") ? item.get("rpynam").getAsString() : null); + String trxtim = item.get("etytim").getAsString(); + String trxdat = item.has("etydat") ? item.get("etydat").getAsString() : ""; + if(StringUtils.isNotBlank(trxdat)) { + trxtim = trxdat.substring(0,4)+"-"+trxdat.substring(4,6)+"-"+trxdat.substring(6,8) + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + }else { + trxtim = curDate + " " + trxtim.substring(0,2)+":"+trxtim.substring(2,4)+":"+trxtim.substring(4,6); + } + log.setTranTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, trxtim)); + log.setTrxamt(new BigDecimal(item.get("trsamt").getAsString()).multiply(new BigDecimal(100)).longValue()); + String trxdir = item.get("amtcdr").getAsString(); + if(trxdir.equals("D")) { + log.setTrxdir((short)2); + }else if (trxdir.equals("C")) { + log.setTrxdir((short)1); + } + log.setBalance(acc.getBalance()); + log.setTrxnbr(item.get("refnbr").getAsString()); + if(item.has("naryur")) { + log.setTrxtxt(item.get("naryur").getAsString()); + } + log.setUnitId(acc.getUnitId()); + acc.getLogs().add(log); + if (StringUtils.isNotBlank(acc.getTrxnbrs())) { + acc.setTrxnbrs(acc.getTrxnbrs()+","); + } + acc.setTrxnbrs(acc.getTrxnbrs()+"'"+log.getTrxnbr()+"'"); + } + } + } + //不是今天,或者当前没有同步完 + if (DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate).getTime() < DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, curDate).getTime() || StringUtils.isNotBlank(acc.getSynPosition())) { + acc.setSynTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD, synDate)); + acc = synAccount(acc); + }else if(!"0".equals(todaySynPosition)){//今天时间还没有过完,需要根据同步位置继续同步 + acc.setSynPosition(todaySynPosition); + } + acc.setSynTime(new Date()); + } + return acc; + } + + + /** + * 查询记账子单元信息(只用于提供测试报告) + */ + public void synAccountOld(long unitId,String accnbr,String dmanbr) { + JsonObject body = new JsonObject(); + JsonArray ntdmalstx = new JsonArray(); + JsonObject ntdmalstx1 = new JsonObject(); + ntdmalstx1.addProperty("accnbr", accnbr); + ntdmalstx1.addProperty("dmanbr", dmanbr); + ntdmalstx.add(ntdmalstx1); + body.add("ntdmalstx", ntdmalstx); + request(unitId,"NTDMALST", body,false); + } + + /** + * 关闭记账子单元(只用于提供测试报告) + */ + public void delAccount(long unitId,String accnbr,String dmanbr) { + JsonObject body = new JsonObject(); + JsonObject ntdmaaddx = new JsonObject(); + ntdmaaddx.addProperty("accnbr", accnbr); + ntdmaaddx.addProperty("dmanbr", dmanbr); + ntdmaaddx.addProperty("dmanam", "测试"); + ntdmaaddx.addProperty("ovrctl", "N"); + ntdmaaddx.addProperty("bcktyp", "Y"); + ntdmaaddx.addProperty("clstyp", "N"); + body.add("ntdmaaddx", ntdmaaddx); + request(unitId,"NTDMAADD", body,false); + body = new JsonObject(); + JsonArray ntdmadltx1 = new JsonArray(); + JsonArray ntdmadltx2 = new JsonArray(); + JsonObject ntdmadltx11 = new JsonObject(); + ntdmadltx11.addProperty("accnbr", accnbr); + JsonObject ntdmadltx21 = new JsonObject(); + ntdmadltx21.addProperty("dmanbr", dmanbr); + ntdmadltx1.add(ntdmadltx11); + ntdmadltx2.add(ntdmadltx21); + body.add("ntdmadltx1", ntdmadltx1); + body.add("ntdmadltx2", ntdmadltx2); + request(unitId,"NTDMADLT", body,false); + } + + /** + * 内部转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + JsonObject body = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject ntdmatrxx1 = new JsonObject(); + ntdmatrxx1.addProperty("accnbr", config.ACCNBR); + ntdmatrxx1.addProperty("dmadbt", log.getSourceCard().substring(config.ACCNBR.length())); + ntdmatrxx1.addProperty("dmacrt", log.getTargetCard().substring(config.ACCNBR.length())); + ntdmatrxx1.addProperty("trxamt", String.format("%.2f", log.getAmount()/100.0)); + ntdmatrxx1.addProperty("trxtxt", log.getRemark()); + body.add("ntdmatrxx1", ntdmatrxx1); + + + + ZhaoShangResponse res = request(log.getUnitId(),"NTDMATRX", body,true,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000") || !res.getData().has("ntdmatrxz1")) { + ZhaoShangServiceImpl.log.error(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "内部转账失败"); + log.setResult((short)-1); + return log; + } + JsonArray rtnBody = res.getData().getAsJsonArray("ntdmatrxz1"); + for (int i = 0,len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + if (item.get("trxdir").getAsString().equals("D")) {//D:付款方 + log.setSourceBankNo(item.get("trxnbr").getAsString()); + }else if (item.get("trxdir").getAsString().equals("C")) {//C:收款方 + log.setTargetBankNo(item.get("trxnbr").getAsString()); + } + } + + JsonArray ntoprrtnz = res.getData().getAsJsonArray("ntoprrtnz"); + + if(ntoprrtnz != null && ntoprrtnz.size() > 0){ + if(!"S".equals(ntoprrtnz.get(0).getAsJsonObject().get("rtnflg").getAsString())){ + throw new ServiceException("内部转账交易失败"); + } + } + + + if (StringUtils.isBlank(log.getSourceBankNo()) || StringUtils.isBlank(log.getTargetBankNo())) { + throw new ServiceException("内部转账交易失败"); + } + log.setResult((short)2); + return log; + } + + /*** + * 业务模式 + * @param log + */ + public void dcLismod(TransactionLog log){ + JsonObject body = new JsonObject(); + body.addProperty("buscod","N03020"); + ZhaoShangResponse res = request(log.getUnitId(),"DCLISMOD", body,true,log.getId()); + } + + /** + * 对私跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog crossPersionTransfer(TransactionLog log) { +// test(log); + JsonObject body = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject ntbusmody = new JsonObject(); + ntbusmody.addProperty("busmod", wConfigService.getItem(log.getUnitId(), "zhaoshang_busmod")); + JsonObject ntagcsaix1 = new JsonObject(); + ntagcsaix1.addProperty("yurref", log.getOrderNo()); + ntagcsaix1.addProperty("bbknbr", wConfigService.getItem(log.getUnitId(), "zhaoshang_bbknbr")); + ntagcsaix1.addProperty("payacc", config.ACCNBR); + ntagcsaix1.addProperty("bustya", "BYBK"); + ntagcsaix1.addProperty("trxrmk", log.getRemark()); + ntagcsaix1.addProperty("begtag", "Y"); + ntagcsaix1.addProperty("endtag", "Y"); + String amount = String.format("%.2f", log.getAmount()/100.0); + ntagcsaix1.addProperty("ttlamt", amount); + ntagcsaix1.addProperty("ttlcnt", "1"); + ntagcsaix1.addProperty("curamt", amount); + ntagcsaix1.addProperty("curcnt", "1"); + ntagcsaix1.addProperty("ttlnum", "1"); + ntagcsaix1.addProperty("jzbnbr", log.getSourceCard().substring(config.ACCNBR.length())); + JsonArray ntagcsaix2 = new JsonArray(); + JsonObject ntagcsaixItem = new JsonObject(); + ntagcsaixItem.addProperty("trxseq", "00000001"); + ntagcsaixItem.addProperty("eacnbr", log.getTargetCard()); + ntagcsaixItem.addProperty("eacnam", log.getTargetAccName()); + ntagcsaixItem.addProperty("rcvamt", amount); + ntagcsaix2.add(ntagcsaixItem); + body.add("ntbusmody", ntbusmody); + body.add("ntagcsaix1", ntagcsaix1); + body.add("ntagcsaix2", ntagcsaix2); + ZhaoShangResponse res = request(log.getUnitId(),"NTAGCAPI", body,true,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000") || !res.getData().has("ntagcagcz1")) { + throw new ServiceException(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "对私跨行转账失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("ntagcagcz1"); + log.setSourceBankNo(rtnBody.get(0).getAsJsonObject().get("reqnbr").getAsString()); + log.setTargetBankNo(log.getSourceBankNo()); + if (StringUtils.isBlank(log.getSourceBankNo()) || StringUtils.isBlank(log.getTargetBankNo())) { + throw new ServiceException("对私跨行转账申请失败"); + } + log.setResult((short)1); + return log; + } + + + /*** + * 业务模式 + * @param log + */ + public void dcLismod1(TransactionLog log){ + JsonObject body = new JsonObject(); + body.addProperty("buscod","N02030"); + ZhaoShangResponse res = request(log.getUnitId(),"DCLISMOD", body,true,log.getId()); + } + /** + * 对公跨行转账 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog crossEnterpriseTransfer(TransactionLog log) { +// dcLismod1(log); + JsonObject body = new JsonObject(); + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonArray bb1paybmx1 = new JsonArray(); + JsonObject bb1paybmx1Item = new JsonObject(); + bb1paybmx1Item.addProperty("busCod", "N02030"); + bb1paybmx1Item.addProperty("busMod", wConfigService.getItem(log.getUnitId(), "zhaoshang_busmod_enterprise")); + bb1paybmx1.add(bb1paybmx1Item); + JsonArray bb1payopx1 = new JsonArray(); + JsonObject bb1payopx1Item = new JsonObject(); + bb1payopx1Item.addProperty("ccyNbr", "10"); + bb1payopx1Item.addProperty("crtAcc", log.getTargetCard()); + bb1payopx1Item.addProperty("crtNam", log.getTargetAccName()); + bb1payopx1Item.addProperty("crtBnk", log.getBankType()); + bb1payopx1Item.addProperty("crtAdr", log.getTargetAccBankAddr()); + bb1payopx1Item.addProperty("dmaNbr", log.getSourceCard().substring(config.ACCNBR.length())); + bb1payopx1Item.addProperty("dbtAcc", config.ACCNBR); + bb1payopx1Item.addProperty("nusAge", log.getRemark()); + //测试 +// bb1payopx1Item.addProperty("brdNbr","102100099996"); +// bb1payopx1Item.addProperty("crtAdr","北京市"); + bb1payopx1Item.addProperty("bnkFlg", log.getBankType().contains("招商银行") ? "Y" : "N"); + String amount = String.format("%.2f", log.getAmount()/100.0); + bb1payopx1Item.addProperty("trsAmt", amount); + bb1payopx1Item.addProperty("yurRef", log.getOrderNo()); + bb1payopx1Item.addProperty("busNar", log.getRemark()); + bb1payopx1.add(bb1payopx1Item); + body.add("bb1paybmx1", bb1paybmx1); + body.add("bb1payopx1", bb1payopx1); + ZhaoShangResponse res = request(log.getUnitId(),"BB1PAYOP", body,true,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000") || !res.getData().has("bb1payopz1")) { + throw new ServiceException(res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "对公跨行转账失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("bb1payopz1"); + log.setSourceBankNo(rtnBody.get(0).getAsJsonObject().get("reqNbr").getAsString()); + log.setTargetBankNo(log.getSourceBankNo()); + if (StringUtils.isBlank(log.getSourceBankNo()) || StringUtils.isBlank(log.getTargetBankNo())) { + throw new ServiceException("对公跨行转账申请失败"); + } + log.setResult((short)1); + return log; + } + + /** + * 同步对私银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synPersionTransfer(TransactionLog log) { + JsonObject body = new JsonObject(); + JsonObject ntagcinyx1 = new JsonObject(); + ntagcinyx1.addProperty("buscod", "N03020"); + ntagcinyx1.addProperty("yurref", log.getOrderNo()); + String endDate = DateUtils.getDate(); + String beginDate = DateUtils.getEndDateByDays(endDate, -3); + ntagcinyx1.addProperty("bgndat", beginDate.replace("-", "")); + ntagcinyx1.addProperty("enddat", endDate.replace("-", "")); + body.add("ntagcinyx1", ntagcinyx1); + ZhaoShangResponse res = request(log.getUnitId(),"NTAGCINY", body,false,log.getId()); + if(res != null) { + if (!res.getResultcode().equals("SUC0000") || !res.getData().has("ntagcinqz")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步对私银行账户交易结果失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("ntagcinqz"); + JsonObject item = rtnBody.get(0).getAsJsonObject(); + if (item.get("reqsta").getAsString().equals("FIN")) { + String rtnFlg = item.get("rtnflg").getAsString(); + if(rtnFlg.equals("S")) { + body = new JsonObject(); + JsonObject ntagdinfy1 = new JsonObject(); + ntagdinfy1.addProperty("reqnbr", item.get("reqnbr").getAsString()); + body.add("ntagdinfy1", ntagdinfy1); + ZhaoShangResponse ores = request(log.getUnitId(),"NTAGDINF", body,false,log.getId()); + if(ores != null) { + if (!ores.getResultcode().equals("SUC0000") || !ores.getData().has("ntagcdtly1")) { + throw new ServiceException(StringUtils.isNotBlank(ores.getResultmsg()) ? ores.getResultmsg() : "同步对私银行账户交易结果2失败"); + } + JsonArray ortnBody = ores.getData().getAsJsonArray("ntagcdtly1"); + JsonObject oitem = ortnBody.get(0).getAsJsonObject(); + String stscod = oitem.get("stscod").getAsString(); + if (stscod.equals("S")) { + log.setResult((short)2); + }else if(stscod.equals("E")){ + String errdsp = oitem.has("errdsp") ? oitem.get("errdsp").getAsString() : ""; + if (StringUtils.isNotBlank(errdsp)) { + log.setReason(errdsp); + }else{ + log.setReason("银行支付失败[NTAGDINF]"); + } + } + } + }else{ + String errdsp = item.has("errdsp") ? item.get("errdsp").getAsString() : ""; + if (StringUtils.isNotBlank(errdsp)) { + log.setReason(errdsp); + }else if (rtnFlg.equals("F")) { + log.setReason("银行支付失败"); + }else if (rtnFlg.equals("B")) { + log.setReason("支付被退票"); + }else if (rtnFlg.equals("R")) { + log.setReason("审批否决"); + }else if (rtnFlg.equals("D")) { + log.setReason("过期不审批"); + }else if (rtnFlg.equals("C")) { + log.setReason("企业撤销"); + }else if (rtnFlg.equals("M")) { + log.setReason("商户撤销订单"); + }else if (rtnFlg.equals("V")) { + log.setReason("委托贷款被借款方拒绝"); + }else if (rtnFlg.equals("E")) { + log.setReason("已提交到银行"); + }else if (rtnFlg.equals("U")) { + log.setReason("银行挂账"); + } + log.setResult((short)3); + } + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 同步对公银行账户交易结果 + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synEnterpriseTransfer(TransactionLog log) { + JsonObject body = new JsonObject(); + JsonArray bb1payqrx1 = new JsonArray(); + JsonObject bb1payqrx1Item = new JsonObject(); + bb1payqrx1Item.addProperty("busCod", "N02030"); + bb1payqrx1Item.addProperty("yurRef", log.getOrderNo()); + bb1payqrx1.add(bb1payqrx1Item); + body.add("bb1payqrx1", bb1payqrx1); + ZhaoShangResponse res = request(log.getUnitId(),"BB1PAYQR", body,false,log.getId()); + if(res != null) { + if (!res.getResultcode().equals("SUC0000") || !res.getData().has("bb1payqrz1")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "同步对公银行账户交易结果失败"); + } + JsonArray rtnBody = res.getData().getAsJsonArray("bb1payqrz1"); + JsonObject item = rtnBody.get(0).getAsJsonObject(); + if (item.get("reqSts").getAsString().equals("FIN")) { + String rtnFlg = item.get("rtnFlg").getAsString(); + if(rtnFlg.equals("S")) { + log.setResult((short)2); + }else{ + String rtnNar = item.has("rtnNar") ? item.get("rtnNar").getAsString() : ""; + if (StringUtils.isNotBlank(rtnNar)) { + log.setReason(rtnNar); + }else if (rtnFlg.equals("F")) { + log.setReason("银行支付失败"); + }else if (rtnFlg.equals("B")) { + log.setReason("支付被退票"); + }else if (rtnFlg.equals("R")) { + log.setReason("审批否决"); + }else if (rtnFlg.equals("D")) { + log.setReason("过期不审批"); + }else if (rtnFlg.equals("C")) { + log.setReason("企业撤销"); + }else if (rtnFlg.equals("U")) { + log.setReason("银行挂账"); + } + log.setResult((short)3); + } + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 获取交易回置单 + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + */ + public String getTransferCallback(TransactionLog log) { + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject body = new JsonObject(); + body.addProperty("eacnbr", config.ACCNBR); + String endDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, log.getTranTime()); + body.addProperty("quedat", endDate); + body.addProperty("trsseq", log.getTargetBankNo()); + ZhaoShangResponse res = request(log.getUnitId(),"DCSIGREC", body,false,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000")) { + if(!res.getResultcode().equals("HOST001")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取交易回置单失败"); + } + } + String callBackFile = ""; + if(res.getData().has("fildat")) { + String fildat = res.getData().get("fildat").getAsString(); + + byte[] bytes = Base64.getDecoder().decode(fildat); + String fileName = log.getTargetBankNo()+"_cb.pdf"; + RemoteFile remoteFile = this.remoteFileService.upload(fileName,fileName,"application/pdf",bytes); +// String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); +// String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId())+"/"; +// +// FileUtils.base64ToFile(fildat, fileName, uploadPhyPath); +// callBackFile = uploadNetPath + fileName; + callBackFile = remoteFile.getUrl(); + } + return callBackFile; + } + + /** + * 获取交易流水号 + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log,String trsseq) { + ZhaoShangConfig config = getZhaoShangConfig(log.getUnitId()); + JsonObject body = new JsonObject(); + body.addProperty("bbknbr", wConfigService.getItem(log.getUnitId(), "zhaoshang_bbknbr")); + String endDate = DateUtils.parseDateToString(DateUtils.YYYY_MM_DD, log.getTranTime()); + body.addProperty("trsdat", endDate.replace("-", "")); + body.addProperty("accnbr", config.ACCNBR); + body.addProperty("trsseq", trsseq); + ZhaoShangResponse res = request(log.getUnitId(),"DCTRSINF", body,false,log.getId()); + if (res == null || !res.getResultcode().equals("SUC0000")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取交易回置单失败"); + } + String result = ""; + if(res.getData().has("ntrbptrsz1")) { + JsonArray ntrbptrsz1 = res.getData().getAsJsonArray("ntrbptrsz1"); + JsonObject ntrbptrsz1Item = ntrbptrsz1.get(0).getAsJsonObject(); + if(res.getData().has("ntqactrsz2")) { + JsonArray rtnBody = res.getData().getAsJsonArray("ntqactrsz2"); + for (int i = 0,len = rtnBody.size(); i < len; i++) { + JsonObject item = rtnBody.get(i).getAsJsonObject(); + if (item.get("yurref").getAsString().equals(log.getOrderNo())) { + result = item.get("refnbr").getAsString(); + break; + } + } + } + if(StringUtils.isBlank(result) && ntrbptrsz1Item.get("cotflg").getAsString().equals("Y")) { + return getTransferBankNo(log,(Long.parseLong(ntrbptrsz1Item.get("trsseq").getAsString()) + 1)+""); + } + } + return result; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java new file mode 100644 index 0000000..7927efe --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/java/org/dromara/settlement/service/impl/ZhiFuBaoServiceImpl.java @@ -0,0 +1,622 @@ +package org.dromara.settlement.service.impl; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Date; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.io.FileUtils; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.settlement.api.domain.*; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoConfig; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoResponse; +import org.dromara.settlement.common.bank.zhifubao.ZhiFuBaoUtil; +import org.dromara.settlement.domain.SysLog; +import org.dromara.settlement.mapper.SignZhifubaoMapper; +import org.dromara.settlement.mapper.SysLogMapper; +import org.dromara.settlement.mapper.TransactionLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import org.dromara.settlement.api.RemoteConfigService; +import com.alipay.api.AlipayRequest; +import com.alipay.api.request.AlipayDataBillAccountbookereceiptQueryRequest; +import com.alipay.api.request.AlipayDataBillEreceiptagentApplyRequest; +import com.alipay.api.request.AlipayFundAccountbookCreateRequest; +import com.alipay.api.request.AlipayFundAccountbookNotifyQueryRequest; +import com.alipay.api.request.AlipayFundAccountbookNotifySubscribeRequest; +import com.alipay.api.request.AlipayFundAccountbookNotifyUnsubscribeRequest; +import com.alipay.api.request.AlipayFundTransCommonQueryRequest; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; +import com.alipay.api.request.AlipayUserAgreementPageSignRequest; +import com.alipay.api.request.AlipayUserAgreementQueryRequest; +import com.alipay.api.request.AlipayUserAgreementUnsignRequest; +import com.alipay.api.request.AlipayUserCertdocCertverifyConsultRequest; +import com.alipay.api.request.AlipayUserCertdocCertverifyPreconsultRequest; +import com.alipay.api.response.AlipayDataBillAccountbookereceiptQueryResponse; +import com.alipay.api.response.AlipayDataBillEreceiptagentApplyResponse; +import com.alipay.api.response.AlipayFundAccountbookCreateResponse; +import com.alipay.api.response.AlipayFundAccountbookNotifyQueryResponse; +import com.alipay.api.response.AlipayFundTransCommonQueryResponse; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; +import com.alipay.api.response.AlipayUserAgreementPageSignResponse; +import com.alipay.api.response.AlipayUserAgreementQueryResponse; +import com.alipay.api.response.AlipayUserCertdocCertverifyConsultResponse; +import com.alipay.api.response.AlipayUserCertdocCertverifyPreconsultResponse; +import com.jcraft.jsch.SftpException; + + +@Service +public class ZhiFuBaoServiceImpl { + private Logger log = LoggerFactory.getLogger(ZhiFuBaoServiceImpl.class); + + @Autowired + private RemoteConfigService wConfigService;// 配置 + + @Autowired + private TransactionLogMapper transactionLogDao;// 交易记录dao + + @Autowired + private SysLogMapper sysLogDao;// 日志 + + @Autowired + private SignZhifubaoMapper signZhifubaoDao;// 支付宝签约信息 + + private ZhiFuBaoResponse request(long unitId, AlipayRequest request, boolean record) { + return request(unitId, request, record, null, false); + } + + private ZhiFuBaoResponse requestPage(long unitId, AlipayRequest request, boolean record) { + return request(unitId, request, record, null, true); + } + + private ZhiFuBaoResponse request(long unitId, AlipayRequest request, boolean record, Long tranId) { + return request(unitId, request, record, tranId, false); + } + + private ZhiFuBaoResponse request(long unitId, AlipayRequest request, boolean record, Long tranId, boolean isPage) { + ZhiFuBaoResponse response = null; + ZhiFuBaoConfig config = getBankConfig(unitId); + String reqid = DateUtils.parseDateToString("yyyyMMddHHmmssSSS", new Date()); + SysLog sysLog = new SysLog(); + if (record) { + sysLog.setTranId(tranId); + } + sysLogDao.insert(sysLog); + reqid = reqid + sysLog.getId(); + if (record) { + sysLog.setReqid(reqid); + sysLog.setRequestTime(new Date()); + } + Result requsetRtn = ZhiFuBaoUtil.getInstance().request(config, request, isPage); + if (requsetRtn != null) { + response = requsetRtn.getRtnData(); + if (record) { + sysLog.setRequest(requsetRtn.getResult()); + sysLog.setResponseTime(new Date()); + if (requsetRtn.getRtnData() != null) { + sysLog.setResponse(JSONObject.toJSONString(requsetRtn.getRtnData())); + } + } + } + if (sysLog.getId() != null) { + if (record) { + if (tranId != null) { + sysLogDao.deleteByTranId(tranId, sysLog.getId()); + } + sysLogDao.updateByPrimaryKeySelective(sysLog); + } else + sysLogDao.deleteByPrimaryKey(sysLog.getId()); + } + return response; + } + + public ZhiFuBaoConfig getBankConfig(long unitId) { + ZhiFuBaoConfig config = new ZhiFuBaoConfig(); + if (wConfigService != null && unitId > 0) { + config.URL = wConfigService.getItem(unitId, "zhifubao_bank_api"); + //config.URL = config.URL.replace("test://", "https://");//测试时使用 + config.APPID = wConfigService.getItem(unitId, "zhifubao_bank_appid"); + config.accName = wConfigService.getItem(unitId, "zhifubao_acc_name"); + config.prikeyStr = wConfigService.getItem(unitId, "zhifubao_bank_prikey"); + String uploadPhyPath = wConfigService.getUploadPhyPath(unitId) + "/"; + config.alipayCertPublicKey = uploadPhyPath + + wConfigService.getItem(unitId, "zhifubao_bank_alipayCertPublicKey"); + config.alipayRootCert = uploadPhyPath + wConfigService.getItem(unitId, "zhifubao_bank_alipayRootCert"); + config.appCertPublicKey = uploadPhyPath + wConfigService.getItem(unitId, "zhifubao_bank_appCertPublicKey"); + config.notifyUrl = wConfigService.getItem(unitId, "zhifubao_bank_notifyUrl"); + if (StringUtils.isBlank(config.APPID)) { + String key = "config:" + unitId; + RedisUtils.deleteObject(key); + } + log.info("读取结算中心的账户配置(" + unitId + "):" + config.APPID); + } + return config; + } + + /** + * 解约支付宝协议 + * + * @author 张涛 + * @date 2022年8月29日 + * @param unitId 结算单位id + * @return + */ + public void cancelAgreement(long unitId) { + AlipayUserAgreementUnsignRequest request = new AlipayUserAgreementUnsignRequest(); + request.setBizContent("{" + " \"personal_product_code\":\"FUND_SAFT_SIGN_WITHHOLDING_P\"," + + " \"sign_scene\":\"INDUSTRY|SATF_ACC\"," + " \"external_agreement_no\":\"" + unitId + "\"," + + " \"third_party_type\":\"PARTNER\"" + "}"); + request(unitId, request, false); + } + + /** + * 获取支付宝协议二维码 + * + * @author 张涛 + * @date 2022年8月29日 + * @param unitId 结算单位id + * @return + */ + public SignZhifubao getAgreementQrcode(long unitId, String unitName) { + ZhiFuBaoConfig config = getBankConfig(unitId); + if (StringUtils.isBlank(config.APPID)) { + return new SignZhifubao(); + } + AlipayUserAgreementQueryRequest queryReq = new AlipayUserAgreementQueryRequest(); + queryReq.setBizContent("{" + + " \"personal_product_code\": \"FUND_SAFT_SIGN_WITHHOLDING_P\"," + + " \"sign_scene\": \"INDUSTRY|SATF_ACC\"," + + " \"product_code\": \"FUND_SAFT_SIGN_WITHHOLDING\"," + + " \"external_agreement_no\": \""+unitId+"\"," + + " \"third_party_type\": \"PARTNER\"" + + "}");//设置业务参数 + ZhiFuBaoResponse queryRes = request(unitId, queryReq, false); + if (queryRes == null) { + throw new ServiceException("请检查结算中心的配置是否正确"); + } + SignZhifubao result = new SignZhifubao(); + if (queryRes.getResultcode().equals("10000")) { + AlipayUserAgreementQueryResponse queryResObj = (AlipayUserAgreementQueryResponse)queryRes.getData(); + result.setAppId(config.APPID); + result.setAgreementNo(queryResObj.getAgreementNo()); + result.setAlipayLogonId(queryResObj.getAlipayLogonId()); + result.setSignTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, queryResObj.getSignTime())); + result.setStatus(queryResObj.getStatus()); + result.setValidTime(DateUtils.parseStringToDate(DateUtils.YYYY_MM_DD_HH_MM_SS, queryResObj.getValidTime())); + } + AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest(); + request.setNotifyUrl(config.notifyUrl + "public/signAgr"); + request.setBizContent("{" + " \"external_logon_id\": \"" + unitName + "\"," + + " \"personal_product_code\": \"FUND_SAFT_SIGN_WITHHOLDING_P\"," + + " \"sign_scene\": \"INDUSTRY|SATF_ACC\"," + " \"external_agreement_no\": \"" + unitId + "\"," + + " \"third_party_type\": \"PARTNER\"," + " \"product_code\": \"FUND_SAFT_SIGN_WITHHOLDING\"," + + " \"access_params\": {" + " \"channel\": \"QRCODE\"" + " }" + "}");// 设置业务参数 + ZhiFuBaoResponse res = requestPage(unitId, request, false); + if (res != null) { + AlipayUserAgreementPageSignResponse response = (AlipayUserAgreementPageSignResponse) res.getData(); + System.out.println(response.getBody()); + result.setSignUrl(response.getBody()); + } + return result; + } + + /** + * 创建支付宝记账本 + * + * @author 张涛 + * @date 2021年8月24日 + * @param unitId 结算单位id + * @param code 记账本编号 + * @param name 记账本名称 + * @param prefix 记账本编号前缀 + */ + public Account createAccount(long unitId, String code, String name, String prefix) { + ZhiFuBaoConfig config = getBankConfig(unitId); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + throw new ServiceException("未签约协议"); + } + int total = 10; + if (StringUtils.isNotEmpty(prefix)) { + total -= prefix.length(); + } + if (code.length() < 10) { + for (int i = code.length(); i < total; i++) { + code = "0" + code; + } + if (StringUtils.isNotEmpty(prefix)) { + code = prefix + code; + } + } + AlipayFundAccountbookCreateRequest request = new AlipayFundAccountbookCreateRequest(); + request.setBizContent(" {" + " \"merchant_user_id\":\"" + code + "\"," + + " \"merchant_user_type\":\"BUSINESS_ORGANIZATION\"," + " \"scene_code\":\"SATF_FUND_BOOK\"," + + " \"ext_info\":\"{\\\"agreement_no\\\":\\\"" + sign.getAgreementNo() + "\\\",\\\"userId\\\":\\\"" + + code + "\\\",\\\"userName\\\":\\\"" + name + "\\\",\\\"userType\\\":\\\"" + prefix + + "\\\",\\\"unitId\\\":\\\"" + unitId + "\\\"}\"" + " }"); + ZhiFuBaoResponse res = request(unitId, request, false); + if (res != null && res.getResultcode().equals("10000")) { + AlipayFundAccountbookCreateResponse book = (AlipayFundAccountbookCreateResponse) res.getData(); + String subscribeBiz = "{" + " \"product_code\":\"SATF_FUND_BOOK\"," + " \"biz_scene\":\"DEFAULT\"," + + " \"account_book_id\":\"" + book.getAccountBookId() + "\"," + " \"agreement_no\":\"" + + sign.getAgreementNo() + "\"" + "}"; + AlipayFundAccountbookNotifyQueryRequest subSearch = new AlipayFundAccountbookNotifyQueryRequest(); + subSearch.setBizContent(subscribeBiz); + ZhiFuBaoResponse subRes = request(unitId, subSearch, false); + if (subRes != null) { + boolean subSuccess = true;// 是否订阅成功 + AlipayFundAccountbookNotifyQueryResponse subSearchRes = (AlipayFundAccountbookNotifyQueryResponse) subRes + .getData(); + if ("SUBSCRIPTION_RELATION_NOT_EXIST".equals(subSearchRes.getSubCode()) || "ACCOUNT_BOOK_INFO_QUERY_FAIL".equals(subSearchRes.getSubCode()) + || (StringUtils.isNotBlank(subSearchRes.getSubscribeStatus()) && subSearchRes.getSubscribeStatus().equals("INVALID"))) { + if (StringUtils.isNotBlank(subSearchRes.getSubscribeStatus()) && subSearchRes.getSubscribeStatus().equals("INVALID")) { + AlipayFundAccountbookNotifyUnsubscribeRequest unsubReq = new AlipayFundAccountbookNotifyUnsubscribeRequest(); + unsubReq.setBizContent(subscribeBiz); + request(unitId, unsubReq, false); + } + AlipayFundAccountbookNotifySubscribeRequest subReq = new AlipayFundAccountbookNotifySubscribeRequest(); + subReq.setBizContent(subscribeBiz); + subRes = request(unitId, subReq, false); + if (subRes == null || !subRes.getResultcode().equals("10000")) { + subSuccess = false; + } + } + if (subSuccess) { + Account account = new Account(); + account.setBankType("支付宝"); + account.setBankTypeName("支付宝"); + account.setBankCard(book.getExtCardInfo().getCardNo()); + account.setBankArgNo(book.getAccountBookId()); + account.setBankAddress(book.getExtCardInfo().getCardLocation()); + account.setBalance(0l); + return account; + } + } + } + return null; + } + + /** + * 记账本内部转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog innerTransfer(TransactionLog log) { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + log.setResult((short)3);//失败 + log.setReason("未签约协议"); + return log; + } + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + String amt = String.format("%.2f", log.getAmount() / 100.0); + request.setBizContent("{" + + "\"out_biz_no\":\""+log.getOrderNo()+"\"," + + "\"trans_amount\":"+amt+"," + + "\"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + + "\"biz_scene\":\"ENTRUST_ALLOCATION\"," + + "\"order_title\":\""+log.getRemark()+"\"," + + "\"payee_info\":{" + + "\"identity_type\":\"ACCOUNT_BOOK_ID\"," + + "\"identity\":\""+log.getTargetCard()+"\"," + + "\"name\":\""+log.getTargetAccName()+"\"," + + " \"ext_info\": \"{\\\"agreement_no\\\":\\\""+sign.getAgreementNo()+"\\\"}\"" + + " }," + + "\"payer_info\":{" + + "\"identity_type\":\"ACCOUNT_BOOK_ID\"," + + "\"identity\":\""+log.getSourceCard()+"\"," + + " \"ext_info\": \"{\\\"agreement_no\\\":\\\""+sign.getAgreementNo()+"\\\"}\"" + + " }," + + "\"remark\":\""+log.getRemark()+"\"," + + "\"business_params\":\"{\\\"payer_show_name_use_alias\\\":\\\"true\\\"}\"," + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, true, log.getId()); + AlipayFundTransUniTransferResponse tranRes = null; + if(res.getData() != null) { + tranRes = (AlipayFundTransUniTransferResponse)res.getData(); + } + if (res == null || !res.getResultcode().equals("10000")) { + String msg = "内部转账失败"; + if (tranRes != null) { + if (StringUtils.isNotBlank(tranRes.getSubMsg())) { + msg = tranRes.getSubMsg(); + }else if (StringUtils.isNotBlank(tranRes.getMsg())) { + msg = tranRes.getMsg(); + } + }else if (StringUtils.isNotBlank(res.getResultmsg())) { + msg = res.getResultmsg(); + } + this.log.error(msg); + log.setResult((short) -1); + return log; + } + log.setSourceBankNo(tranRes.getOrderId()); + log.setTargetBankNo(tranRes.getPayFundOrderId()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 转账 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog transfer(TransactionLog log) { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + log.setResult((short)3);//失败 + log.setReason("未签约协议"); + return log; + } + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + String amt = String.format("%.2f", log.getAmount() / 100.0); + request.setBizContent("{" + + "\"out_biz_no\":\""+log.getOrderNo()+"\"," + + "\"trans_amount\":"+amt+"," + + "\"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + + "\"biz_scene\":\"ENTRUST_TRANSFER\"," + + "\"order_title\":\""+log.getRemark()+"\"," + + "\"payee_info\":{" + + "\"identity\":\""+log.getTargetCard()+"\"," + + "\"identity_type\":\"ALIPAY_LOGON_ID\"," + + "\"name\":\""+log.getTargetAccName()+"\"" + + " }," + + "\"remark\":\""+log.getRemark()+"\"," + + "\"business_params\":\"{\\\"payer_show_name_use_alias\\\":\\\"true\\\"}\"," + + "\"payer_info\":{" + + "\"identity\":\""+log.getSourceCard()+"\"," + + "\"identity_type\":\"ACCOUNT_BOOK_ID\"," + + " \"ext_info\": \"{\\\"agreement_no\\\":\\\""+sign.getAgreementNo()+"\\\"}\"" + + " }" + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, true, log.getId()); + AlipayFundTransUniTransferResponse tranRes = null; + if(res.getData() != null) { + tranRes = (AlipayFundTransUniTransferResponse)res.getData(); + } + if (res == null || !res.getResultcode().equals("10000")) { + String msg = "转账失败"; + if (tranRes != null) { + if (StringUtils.isNotBlank(tranRes.getSubMsg())) { + msg = tranRes.getSubMsg(); + }else if (StringUtils.isNotBlank(tranRes.getMsg())) { + msg = tranRes.getMsg(); + } + }else if (StringUtils.isNotBlank(res.getResultmsg())) { + msg = res.getResultmsg(); + } + throw new ServiceException(msg); + } + log.setSourceBankNo(tranRes.getOrderId()); + log.setTargetBankNo(tranRes.getPayFundOrderId()); + log.setResult((short) 1); + log.setReason(""); + return log; + } + + /** + * 同步内部交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synInnerTransfer(TransactionLog log) { + AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest(); + request.setProdCode("SINGLE_TRANSFER_NO_PWD"); + request.setBizContent("{" + " \"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + " \"biz_scene\":\"ENTRUST_ALLOCATION\"," + + " \"out_biz_no\":\"" + log.getOrderNo() + "\"}"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("10000")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() + : "同步支付宝对私交易结果失败"); + } + AlipayFundTransCommonQueryResponse queryRes = (AlipayFundTransCommonQueryResponse)res.getData(); + if (queryRes.getStatus().equals("SUCCESS")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (!queryRes.getStatus().equals("WAIT_PAY")) { + log.setResult((short) 3); + log.setReason(queryRes.getFailReason()); + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 同步交易结果 + * + * @author 张涛 + * @date 2021年9月7日 + * @param log + * @return + */ + public TransactionLog synTransfer(TransactionLog log) { + AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest(); + request.setProdCode("SINGLE_TRANSFER_NO_PWD"); + request.setBizContent("{" + " \"product_code\":\"SINGLE_TRANSFER_NO_PWD\"," + " \"biz_scene\":\"ENTRUST_TRANSFER\"," + + " \"out_biz_no\":\"" + log.getOrderNo() + "\"}"); + ZhiFuBaoResponse res = request(log.getUnitId(), request, false, log.getId()); + if (res != null) { + if (!res.getResultcode().equals("10000")) { + throw new ServiceException( + res != null && StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() + : "同步支付宝交易结果失败"); + } + AlipayFundTransCommonQueryResponse queryRes = (AlipayFundTransCommonQueryResponse)res.getData(); + if (queryRes.getStatus().equals("SUCCESS")) { + log.setResult((short) 2); + log.setTranTime(new Date()); + }else if (!queryRes.getStatus().equals("WAIT_PAY")) { + log.setResult((short) 3); + log.setReason(queryRes.getFailReason()); + log.setTranTime(new Date()); + } + } + return log; + } + + /** + * 获取交易回置单 + * + * @author 张涛 + * @date 2021年9月16日 + * @param log + * @return + * @throws IOException + * @throws SftpException + */ + + public String getTransferCallback(TransactionLog log) throws IOException { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + throw new ServiceException("未签约协议"); + } + AlipayDataBillAccountbookereceiptQueryRequest queryReq = new AlipayDataBillAccountbookereceiptQueryRequest(); + queryReq.setBizContent("{" + + "\"file_id\":\""+log.getPayReceiptId()+"\"," + + "\"agreement_no\":\""+sign.getAgreementNo()+"\"" + + " }"); + String callBackFile = ""; + ZhiFuBaoResponse res = request(log.getUnitId(),queryReq,false,log.getId()); + if (res != null && res.getResultcode().equals("10000")) { + AlipayDataBillAccountbookereceiptQueryResponse queryRes = (AlipayDataBillAccountbookereceiptQueryResponse)res.getData(); + if(queryRes.getStatus().equals("SUCCESS")) { + String uploadPhyPath = wConfigService.getUploadPhyPath(log.getUnitId()) + "/"; + String uploadNetPath = wConfigService.getUploadNetPath(log.getUnitId()); + String fileName = log.getOrderNo()+".pdf"; + FileUtils.copyURLToFile(new URL(queryRes.getDownloadUrl()), new File(uploadPhyPath, fileName)); + callBackFile = (uploadPhyPath+fileName).replace(uploadPhyPath, uploadNetPath); + } + } + return callBackFile; + } + + /** + * 获取交易流水号 + * + * @author 张涛 + * @date 2021年9月22日 + * @param log + * @param trsseq 断点续传编号 + * @return + */ + public String getTransferBankNo(TransactionLog log) { + ZhiFuBaoConfig config = getBankConfig(log.getUnitId()); + SignZhifubao sign = signZhifubaoDao.selectByAppId(config.APPID); + if (sign == null) { + throw new ServiceException("未签约协议"); + } + String result = ""; + boolean isApply = true;//是否需要申请回单 + if(StringUtils.isNotBlank(log.getPayReceiptId())) { + isApply = false; + AlipayDataBillAccountbookereceiptQueryRequest queryReq = new AlipayDataBillAccountbookereceiptQueryRequest(); + queryReq.setBizContent("{" + + "\"file_id\":\""+log.getPayReceiptId()+"\"," + + "\"agreement_no\":\""+sign.getAgreementNo()+"\"" + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(),queryReq,false,log.getId()); + if (res != null) { + if(res.getResultcode().equals("10000")) { + AlipayDataBillAccountbookereceiptQueryResponse queryRes = (AlipayDataBillAccountbookereceiptQueryResponse)res.getData(); + if(queryRes.getStatus().equals("SUCCESS")) { + result = log.getTargetBankNo(); + }else if (queryRes.getStatus().equals("FAIL")) { + isApply = true; + } + }else if (res.getData() != null && StringUtils.isNotBlank(res.getData().getSubMsg()) && res.getData().getSubMsg().indexOf("业务异常申请记录不存在") > -1) { + isApply = true; + } + if (isApply) { + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(""); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } + } + if(isApply) { + AlipayDataBillEreceiptagentApplyRequest request = new AlipayDataBillEreceiptagentApplyRequest(); + request.setBizContent("{" + + "\"type\":\"FUND_DETAIL\"," + + "\"key\":\""+log.getTargetBankNo()+"\"," + + "\"agreement_no\":\""+sign.getAgreementNo()+"\"" + + " }"); + ZhiFuBaoResponse res = request(log.getUnitId(),request,false,log.getId()); + if (res == null || !res.getResultcode().equals("10000")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "获取交易回置单失败"); + } + + AlipayDataBillEreceiptagentApplyResponse applyRes = (AlipayDataBillEreceiptagentApplyResponse)res.getData(); + if(StringUtils.isNotBlank(applyRes.getFileId())) { + TransactionLog upd = new TransactionLog(); + upd.setId(log.getId()); + upd.setPayReceiptId(applyRes.getFileId()); + transactionLogDao.updateByPrimaryKeySelective(upd); + } + } + return result; + } + + public boolean valiAccount(String bankCard, String mobile, String name, + String cardId) { + SignZhifubao sign = signZhifubaoDao.selectValid(); + if (sign == null) { + throw new ServiceException("支付宝账户认证失败【错误代码:1】"); + } + AlipayUserCertdocCertverifyPreconsultRequest request = new AlipayUserCertdocCertverifyPreconsultRequest(); + StringBuffer bizContentStr = new StringBuffer("{"); + bizContentStr.append(" \"user_name\":\""+name+"\","); + bizContentStr.append(" \"cert_type\":\"IDENTITY_CARD\","); + bizContentStr.append(" \"cert_no\":\""+cardId+"\","); + if(StringUtils.isNotBlank(mobile)) { + bizContentStr.append(" \"mobile\":\""+mobile+"\","); + } + bizContentStr.append(" \"logon_id\":\""+bankCard+"\""); + bizContentStr.append("}"); + request.setBizContent(bizContentStr.toString()); + ZhiFuBaoResponse res = request(sign.getUnitId(),request,false); + if (res == null || !res.getResultcode().equals("10000")) { + throw new ServiceException(StringUtils.isNotBlank(res.getResultmsg()) ? res.getResultmsg() : "支付宝账户认证失败【错误代码:2】"); + } + AlipayUserCertdocCertverifyPreconsultResponse verifyRes = (AlipayUserCertdocCertverifyPreconsultResponse)res.getData(); + if (StringUtils.isBlank(verifyRes.getVerifyId())) { + throw new ServiceException("支付宝账户认证失败【错误代码:3】"); + } + AlipayUserCertdocCertverifyConsultRequest consultRequest = new AlipayUserCertdocCertverifyConsultRequest(); + consultRequest.setBizContent("{" + + " \"verify_id\":\""+verifyRes.getVerifyId()+"\"" + + "}"); + ZhiFuBaoResponse consultRes = request(sign.getUnitId(),consultRequest,false); + if (consultRes == null || !consultRes.getResultcode().equals("10000")) { + throw new ServiceException(StringUtils.isNotBlank(consultRes.getResultmsg()) ? consultRes.getResultmsg() : "支付宝账户认证失败【错误代码:4】"); + } + AlipayUserCertdocCertverifyConsultResponse response = (AlipayUserCertdocCertverifyConsultResponse)consultRes.getData(); + if (!"T".equals(response.getPassed())) { + throw new ServiceException(StringUtils.isNotBlank(response.getFailReason()) ? response.getFailReason() : "支付宝账户认证失败【错误代码:5】"); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml b/ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml new file mode 100644 index 0000000..8758f15 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9206 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-settlement + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml new file mode 100644 index 0000000..5dc1463 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountLogMapper.xml @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, unit_id, acc_id, bank_type, bank_card, trxdir, trxamt, balance, add_time, add_by, + narinn, trxnbr, ccynbr, tran_time, rpyacc, rpynam, trxtxt, mthflg + + + + + + + + + + + delete from acc_account_log + where id = #{id,jdbcType=BIGINT} + + + + insert into acc_account_log (unit_id, acc_id, + bank_type, bank_card, trxdir, + trxamt, balance, add_time, + add_by, narinn, trxnbr, + ccynbr, tran_time, rpyacc, + rpynam, trxtxt, mthflg) + + select #{item.unitId,jdbcType=BIGINT}, #{item.accId,jdbcType=INTEGER}, + #{item.bankType,jdbcType=VARCHAR}, #{item.bankCard,jdbcType=VARCHAR}, #{item.trxdir,jdbcType=SMALLINT}, + #{item.trxamt,jdbcType=BIGINT}, #{item.balance,jdbcType=BIGINT}, #{item.addTime,jdbcType=TIMESTAMP}, + #{item.addBy,jdbcType=VARCHAR}, #{item.narinn,jdbcType=VARCHAR}, #{item.trxnbr,jdbcType=VARCHAR}, + #{item.ccynbr,jdbcType=VARCHAR}, #{item.tranTime,jdbcType=TIMESTAMP}, #{item.rpyacc,jdbcType=VARCHAR}, + #{item.rpynam,jdbcType=VARCHAR}, #{item.trxtxt,jdbcType=VARCHAR}, #{item.mthflg,jdbcType=VARCHAR} + + + + + insert into acc_account_log (id, unit_id, acc_id, + bank_type, bank_card, trxdir, + trxamt, balance, add_time, + add_by, narinn, trxnbr, + ccynbr, tran_time, rpyacc, + rpynam, trxtxt, mthflg + ) + values (#{id,jdbcType=BIGINT}, #{unitId,jdbcType=BIGINT}, #{accId,jdbcType=INTEGER}, + #{bankType,jdbcType=VARCHAR}, #{bankCard,jdbcType=VARCHAR}, #{trxdir,jdbcType=SMALLINT}, + #{trxamt,jdbcType=BIGINT}, #{balance,jdbcType=BIGINT}, #{addTime,jdbcType=TIMESTAMP}, + #{addBy,jdbcType=VARCHAR}, #{narinn,jdbcType=VARCHAR}, #{trxnbr,jdbcType=VARCHAR}, + #{ccynbr,jdbcType=VARCHAR}, #{tranTime,jdbcType=TIMESTAMP}, #{rpyacc,jdbcType=VARCHAR}, + #{rpynam,jdbcType=VARCHAR}, #{trxtxt,jdbcType=VARCHAR}, #{mthflg,jdbcType=VARCHAR} + ) + + + insert into acc_account_log + + + id, + + + unit_id, + + + acc_id, + + + bank_type, + + + bank_card, + + + trxdir, + + + trxamt, + + + balance, + + + add_time, + + + add_by, + + + narinn, + + + trxnbr, + + + ccynbr, + + + tran_time, + + + rpyacc, + + + rpynam, + + + trxtxt, + + + mthflg, + + + + + #{id,jdbcType=BIGINT}, + + + #{unitId,jdbcType=BIGINT}, + + + #{accId,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{trxdir,jdbcType=SMALLINT}, + + + #{trxamt,jdbcType=BIGINT}, + + + #{balance,jdbcType=BIGINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{addBy,jdbcType=VARCHAR}, + + + #{narinn,jdbcType=VARCHAR}, + + + #{trxnbr,jdbcType=VARCHAR}, + + + #{ccynbr,jdbcType=VARCHAR}, + + + #{tranTime,jdbcType=TIMESTAMP}, + + + #{rpyacc,jdbcType=VARCHAR}, + + + #{rpynam,jdbcType=VARCHAR}, + + + #{trxtxt,jdbcType=VARCHAR}, + + + #{mthflg,jdbcType=VARCHAR}, + + + + + update acc_account_log + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + acc_id = #{accId,jdbcType=INTEGER}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + trxdir = #{trxdir,jdbcType=SMALLINT}, + + + trxamt = #{trxamt,jdbcType=BIGINT}, + + + balance = #{balance,jdbcType=BIGINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + add_by = #{addBy,jdbcType=VARCHAR}, + + + narinn = #{narinn,jdbcType=VARCHAR}, + + + trxnbr = #{trxnbr,jdbcType=VARCHAR}, + + + ccynbr = #{ccynbr,jdbcType=VARCHAR}, + + + tran_time = #{tranTime,jdbcType=TIMESTAMP}, + + + rpyacc = #{rpyacc,jdbcType=VARCHAR}, + + + rpynam = #{rpynam,jdbcType=VARCHAR}, + + + trxtxt = #{trxtxt,jdbcType=VARCHAR}, + + + mthflg = #{mthflg,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update acc_account_log + set unit_id = #{unitId,jdbcType=BIGINT}, + acc_id = #{accId,jdbcType=INTEGER}, + bank_type = #{bankType,jdbcType=VARCHAR}, + bank_card = #{bankCard,jdbcType=VARCHAR}, + trxdir = #{trxdir,jdbcType=SMALLINT}, + trxamt = #{trxamt,jdbcType=BIGINT}, + balance = #{balance,jdbcType=BIGINT}, + add_time = #{addTime,jdbcType=TIMESTAMP}, + add_by = #{addBy,jdbcType=VARCHAR}, + narinn = #{narinn,jdbcType=VARCHAR}, + trxnbr = #{trxnbr,jdbcType=VARCHAR}, + ccynbr = #{ccynbr,jdbcType=VARCHAR}, + tran_time = #{tranTime,jdbcType=TIMESTAMP}, + rpyacc = #{rpyacc,jdbcType=VARCHAR}, + rpynam = #{rpynam,jdbcType=VARCHAR}, + trxtxt = #{trxtxt,jdbcType=VARCHAR}, + mthflg = #{mthflg,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml new file mode 100644 index 0000000..a2511e7 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountMapper.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + id, bank_type, bank_card, balance, status, add_time, edit_time, unit_id, type, name, bank_address, bank_arg_no, + bank_no + + + + + + + + + delete from acc_account + where id = #{id,jdbcType=INTEGER} + + + insert into acc_account (id, bank_type, bank_card, + balance, status, add_time, + edit_time) + values (#{id,jdbcType=INTEGER}, #{bankType,jdbcType=VARCHAR}, #{bankCard,jdbcType=VARCHAR}, + #{balance,jdbcType=DECIMAL}, #{status,jdbcType=SMALLINT}, #{addTime,jdbcType=TIMESTAMP}, + #{editTime,jdbcType=TIMESTAMP}) + + + insert into acc_account + + + id, + + + bank_type, + + + name, + + + bank_card, + + + balance, + + + status, + + + add_time, + + + edit_time, + + + type, + + + unit_id, + + + bank_address, + + + bank_arg_no, + + + bank_no, + + + bank_name, + + + + + #{id,jdbcType=INTEGER}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + #{balance,jdbcType=DECIMAL}, + + + #{status,jdbcType=SMALLINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{editTime,jdbcType=TIMESTAMP}, + + + #{type,jdbcType=SMALLINT}, + + + #{unitId,jdbcType=BIGINT}, + + + #{bankAddress,jdbcType=VARCHAR}, + + + #{bankArgNo,jdbcType=VARCHAR}, + + + #{bankNo,jdbcType=VARCHAR}, + + + #{bankName,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.id + FROM + acc_account t + WHERE + t.bank_type = #{bankType,jdbcType=VARCHAR} + AND t.bank_card = #{bankCard,jdbcType=VARCHAR}) + + + update acc_account + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + balance = #{balance,jdbcType=DECIMAL}, + + + status = #{status,jdbcType=SMALLINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + bank_address = #{bankAddress,jdbcType=VARCHAR}, + + + name = #{name,jdbcType=VARCHAR}, + + + bank_arg_no = #{bankArgNo,jdbcType=VARCHAR}, + + + bank_no = #{bankNo,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + update acc_account + set bank_type = #{bankType,jdbcType=VARCHAR}, + bank_card = #{bankCard,jdbcType=VARCHAR}, + balance = #{balance,jdbcType=DECIMAL}, + status = #{status,jdbcType=SMALLINT}, + add_time = #{addTime,jdbcType=TIMESTAMP}, + edit_time = #{editTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + + + UPDATE acc_account + SET `status` = 2 + WHERE + `status` = 1 + AND acc_id = #{accId,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml new file mode 100644 index 0000000..27ab46a --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/AccountSynMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + id, unit_id, syn_lock, syn_time, syn_position, type, bank_type, bank_card + + + + delete from acc_account_syn + where id = #{id,jdbcType=INTEGER} + + + insert into acc_account_syn (id, unit_id, syn_lock, + syn_time, syn_position, type, + bank_type, bank_card) + values (#{id,jdbcType=INTEGER}, #{unitId,jdbcType=BIGINT}, #{synLock,jdbcType=TINYINT}, + #{synTime,jdbcType=TIMESTAMP}, #{synPosition,jdbcType=VARCHAR}, #{type,jdbcType=SMALLINT}, + #{bankType,jdbcType=VARCHAR}, #{bankCard,jdbcType=VARCHAR}) + + + insert into acc_account_syn + + + id, + + + unit_id, + + + syn_lock, + + + syn_time, + + + syn_position, + + + type, + + + bank_type, + + + bank_card, + + + + + #{id,jdbcType=INTEGER}, + + + #{unitId,jdbcType=BIGINT}, + + + #{synLock,jdbcType=TINYINT}, + + + #{synTime,jdbcType=TIMESTAMP}, + + + #{synPosition,jdbcType=VARCHAR}, + + + #{type,jdbcType=SMALLINT}, + + + #{bankType,jdbcType=VARCHAR}, + + + #{bankCard,jdbcType=VARCHAR}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.id + FROM + acc_account_syn t + WHERE + t.id = #{id,jdbcType=INTEGER}) + + + update acc_account_syn + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + syn_lock = #{synLock,jdbcType=TINYINT}, + + + syn_time = #{synTime,jdbcType=TIMESTAMP}, + + + syn_position = #{synPosition,jdbcType=VARCHAR}, + + + type = #{type,jdbcType=SMALLINT}, + + + bank_type = #{bankType,jdbcType=VARCHAR}, + + + bank_card = #{bankCard,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=INTEGER} + + + update acc_account_syn + set unit_id = #{unitId,jdbcType=BIGINT}, + syn_lock = #{synLock,jdbcType=TINYINT}, + syn_time = #{synTime,jdbcType=TIMESTAMP}, + syn_position = #{synPosition,jdbcType=VARCHAR}, + type = #{type,jdbcType=SMALLINT}, + bank_type = #{bankType,jdbcType=VARCHAR}, + bank_card = #{bankCard,jdbcType=VARCHAR} + where id = #{id,jdbcType=INTEGER} + + + + UPDATE acc_account_syn + SET syn_lock = 1 + WHERE + syn_lock = 0 + AND id = #{id,jdbcType=INTEGER} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml new file mode 100644 index 0000000..2621b2c --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SignZhifubaoMapper.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + id, unit_id, app_id, agreement_no, alipay_logon_id, valid_time, sign_time, status, + add_time + + + + + + + + + delete from sign_zhifubao + where id = #{id,jdbcType=INTEGER} + + + insert into sign_zhifubao (id, unit_id, app_id, + agreement_no, alipay_logon_id, valid_time, + sign_time, status, add_time + ) + values (#{id,jdbcType=INTEGER}, #{unitId,jdbcType=BIGINT}, #{appId,jdbcType=VARCHAR}, + #{agreementNo,jdbcType=VARCHAR}, #{alipayLogonId,jdbcType=VARCHAR}, #{validTime,jdbcType=TIMESTAMP}, + #{signTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{addTime,jdbcType=TIMESTAMP} + ) + + + insert into sign_zhifubao + + + id, + + + unit_id, + + + app_id, + + + agreement_no, + + + alipay_logon_id, + + + valid_time, + + + sign_time, + + + status, + + + add_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{unitId,jdbcType=BIGINT}, + + + #{appId,jdbcType=VARCHAR}, + + + #{agreementNo,jdbcType=VARCHAR}, + + + #{alipayLogonId,jdbcType=VARCHAR}, + + + #{validTime,jdbcType=TIMESTAMP}, + + + #{signTime,jdbcType=TIMESTAMP}, + + + #{status,jdbcType=VARCHAR}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + FROM + DUAL + WHERE + NOT EXISTS ( + SELECT + t.id + FROM + sign_zhifubao t + WHERE + t.unit_id = #{unitId,jdbcType=BIGINT} + AND t.app_id = #{appId,jdbcType=VARCHAR}) + + + update sign_zhifubao + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + app_id = #{appId,jdbcType=VARCHAR}, + + + agreement_no = #{agreementNo,jdbcType=VARCHAR}, + + + alipay_logon_id = #{alipayLogonId,jdbcType=VARCHAR}, + + + valid_time = #{validTime,jdbcType=TIMESTAMP}, + + + sign_time = #{signTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=INTEGER} + + + + update sign_zhifubao + set unit_id = #{unitId,jdbcType=BIGINT}, + app_id = #{appId,jdbcType=VARCHAR}, + agreement_no = #{agreementNo,jdbcType=VARCHAR}, + alipay_logon_id = #{alipayLogonId,jdbcType=VARCHAR}, + valid_time = #{validTime,jdbcType=TIMESTAMP}, + sign_time = #{signTime,jdbcType=TIMESTAMP}, + status = #{status,jdbcType=VARCHAR}, + add_time = #{addTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + + + update sign_zhifubao + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + agreement_no = #{agreementNo,jdbcType=VARCHAR}, + + + alipay_logon_id = #{alipayLogonId,jdbcType=VARCHAR}, + + + valid_time = #{validTime,jdbcType=TIMESTAMP}, + + + sign_time = #{signTime,jdbcType=TIMESTAMP}, + + + status = #{status,jdbcType=VARCHAR}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + where app_id = #{appId,jdbcType=VARCHAR} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml new file mode 100644 index 0000000..5269371 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysLogMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + id, reqid, request, response, request_time, response_time, tran_id + + + + + delete from sys_log + where tran_id = #{tranId,jdbcType=BIGINT} + + AND id != #{id,jdbcType=BIGINT} + + + + + delete from sys_log + where id = #{id,jdbcType=BIGINT} + + + insert into sys_log (reqid, request, + response, request_time, response_time, + tran_id) + values (#{reqid,jdbcType=VARCHAR}, #{request,jdbcType=VARCHAR}, + #{response,jdbcType=VARCHAR}, #{requestTime,jdbcType=TIMESTAMP}, #{responseTime,jdbcType=TIMESTAMP}, + #{tranId,jdbcType=BIGINT}) + + + insert into sys_log + + + id, + + + reqid, + + + request, + + + response, + + + request_time, + + + response_time, + + + tran_id, + + + + + #{id,jdbcType=BIGINT}, + + + #{reqid,jdbcType=VARCHAR}, + + + #{request,jdbcType=VARCHAR}, + + + #{response,jdbcType=VARCHAR}, + + + #{requestTime,jdbcType=TIMESTAMP}, + + + #{responseTime,jdbcType=TIMESTAMP}, + + + #{tranId,jdbcType=BIGINT}, + + + + + update sys_log + + + reqid = #{reqid,jdbcType=VARCHAR}, + + + request = #{request,jdbcType=VARCHAR}, + + + response = #{response,jdbcType=VARCHAR}, + + + request_time = #{requestTime,jdbcType=TIMESTAMP}, + + + response_time = #{responseTime,jdbcType=TIMESTAMP}, + + + tran_id = #{tranId,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_log + set reqid = #{reqid,jdbcType=VARCHAR}, + request = #{request,jdbcType=VARCHAR}, + response = #{response,jdbcType=VARCHAR}, + request_time = #{requestTime,jdbcType=TIMESTAMP}, + response_time = #{responseTime,jdbcType=TIMESTAMP}, + tran_id = #{tranId,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml new file mode 100644 index 0000000..65f2086 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/SysUnitConfigMapper.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + conf_item, conf_unit, conf_unit_type, conf_value, conf_group, conf_group_sort, conf_group_name, + conf_sort, conf_remark, conf_is_editor, update_time, update_by, class_name, class_alias, + is_enable, class_sort + + + + + + + delete from sys_unit_config + where conf_item = #{confItem,jdbcType=VARCHAR} + and conf_unit = #{confUnit,jdbcType=BIGINT} + + + insert into sys_unit_config (conf_item, conf_unit, conf_unit_type, + conf_value, conf_group, conf_group_sort, + conf_group_name, conf_sort, conf_remark, + conf_is_editor, update_time, update_by, + class_name, class_alias, is_enable, + class_sort) + values (#{confItem,jdbcType=VARCHAR}, #{confUnit,jdbcType=BIGINT}, #{confUnitType,jdbcType=INTEGER}, + #{confValue,jdbcType=VARCHAR}, #{confGroup,jdbcType=VARCHAR}, #{confGroupSort,jdbcType=INTEGER}, + #{confGroupName,jdbcType=VARCHAR}, #{confSort,jdbcType=INTEGER}, #{confRemark,jdbcType=VARCHAR}, + #{confIsEditor,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}, + #{className,jdbcType=VARCHAR}, #{classAlias,jdbcType=VARCHAR}, #{isEnable,jdbcType=INTEGER}, + #{classSort,jdbcType=INTEGER}) + + + insert into sys_unit_config + + + conf_item, + + + conf_unit, + + + conf_unit_type, + + + conf_value, + + + conf_group, + + + conf_group_sort, + + + conf_group_name, + + + conf_sort, + + + conf_remark, + + + conf_is_editor, + + + update_time, + + + update_by, + + + class_name, + + + class_alias, + + + is_enable, + + + class_sort, + + + + + #{confItem,jdbcType=VARCHAR}, + + + #{confUnit,jdbcType=BIGINT}, + + + #{confUnitType,jdbcType=INTEGER}, + + + #{confValue,jdbcType=VARCHAR}, + + + #{confGroup,jdbcType=VARCHAR}, + + + #{confGroupSort,jdbcType=INTEGER}, + + + #{confGroupName,jdbcType=VARCHAR}, + + + #{confSort,jdbcType=INTEGER}, + + + #{confRemark,jdbcType=VARCHAR}, + + + #{confIsEditor,jdbcType=INTEGER}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{updateBy,jdbcType=VARCHAR}, + + + #{className,jdbcType=VARCHAR}, + + + #{classAlias,jdbcType=VARCHAR}, + + + #{isEnable,jdbcType=INTEGER}, + + + #{classSort,jdbcType=INTEGER}, + + + + + update sys_unit_config + + + conf_unit_type = #{confUnitType,jdbcType=INTEGER}, + + + conf_value = #{confValue,jdbcType=VARCHAR}, + + + conf_group = #{confGroup,jdbcType=VARCHAR}, + + + conf_group_sort = #{confGroupSort,jdbcType=INTEGER}, + + + conf_group_name = #{confGroupName,jdbcType=VARCHAR}, + + + conf_sort = #{confSort,jdbcType=INTEGER}, + + + conf_remark = #{confRemark,jdbcType=VARCHAR}, + + + conf_is_editor = #{confIsEditor,jdbcType=INTEGER}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + update_by = #{updateBy,jdbcType=VARCHAR}, + + + class_name = #{className,jdbcType=VARCHAR}, + + + class_alias = #{classAlias,jdbcType=VARCHAR}, + + + is_enable = #{isEnable,jdbcType=INTEGER}, + + + class_sort = #{classSort,jdbcType=INTEGER}, + + + where conf_item = #{confItem,jdbcType=VARCHAR} + and conf_unit = #{confUnit,jdbcType=BIGINT} + + + update sys_unit_config + set conf_unit_type = #{confUnitType,jdbcType=INTEGER}, + conf_value = #{confValue,jdbcType=VARCHAR}, + conf_group = #{confGroup,jdbcType=VARCHAR}, + conf_group_sort = #{confGroupSort,jdbcType=INTEGER}, + conf_group_name = #{confGroupName,jdbcType=VARCHAR}, + conf_sort = #{confSort,jdbcType=INTEGER}, + conf_remark = #{confRemark,jdbcType=VARCHAR}, + conf_is_editor = #{confIsEditor,jdbcType=INTEGER}, + update_time = #{updateTime,jdbcType=TIMESTAMP}, + update_by = #{updateBy,jdbcType=VARCHAR}, + class_name = #{className,jdbcType=VARCHAR}, + class_alias = #{classAlias,jdbcType=VARCHAR}, + is_enable = #{isEnable,jdbcType=INTEGER}, + class_sort = #{classSort,jdbcType=INTEGER} + where conf_item = #{confItem,jdbcType=VARCHAR} + and conf_unit = #{confUnit,jdbcType=BIGINT} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update sys_unit_config set is_enable =0 where conf_unit=#{unit_id} and class_alias=#{class_alias} + + + + delete from sys_unit_config where conf_unit=#{unit_id} and conf_group=#{conf_group} + + + + insert into sys_unit_config (conf_unit, conf_unit_type,conf_item,conf_value,conf_group,conf_group_name,conf_remark,conf_is_editor,class_name,class_alias,is_enable) + values + + (#{item.conf_unit},#{item.conf_unit_type},#{item.conf_item},#{item.conf_value},#{item.conf_group} ,#{item.conf_group_name},#{item.conf_remark},#{item.conf_is_editor},#{item.class_name},#{item.class_alias},#{item.is_enable}) + + + + + delete from sys_unit_config where conf_unit=#{unit_id} and conf_item=#{key} + + + + +insert into sys_unit_config(conf_unit,conf_unit_type,conf_item,conf_value,conf_is_editor,is_enable)values(#{unit_id},1,#{key},#{value},0,1) + + + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml new file mode 100644 index 0000000..ae5d4ef --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/mapper/settlement/TransactionLogMapper.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id, unit_id, order_no, source_acc_id, source_bank_no, source_card, target_acc_id, bank_type, pay_receipt_id , + target_card, target_bank_no, amount, add_time, result, remark, tran_time, target_acc_name, reason, pay_receipt + + + + + + + delete from acc_transaction_log + where id = #{id,jdbcType=BIGINT} + + + insert into acc_transaction_log (id, unit_id, order_no, + source_acc_id, source_bank_no, source_card, + target_acc_id, target_card, target_bank_no, + amount, add_time, result, + remark, tran_time) + values (#{id,jdbcType=BIGINT}, #{unitId,jdbcType=BIGINT}, #{orderNo,jdbcType=VARCHAR}, + #{sourceAccId,jdbcType=INTEGER}, #{sourceBankNo,jdbcType=VARCHAR}, #{sourceCard,jdbcType=VARCHAR}, + #{targetAccId,jdbcType=INTEGER}, #{targetCard,jdbcType=VARCHAR}, #{targetBankNo,jdbcType=VARCHAR}, + #{amount,jdbcType=BIGINT}, #{addTime,jdbcType=TIMESTAMP}, #{result,jdbcType=SMALLINT}, + #{remark,jdbcType=VARCHAR}, #{tranTime,jdbcType=TIMESTAMP}) + + + insert into acc_transaction_log + + + id, + + + unit_id, + + + order_no, + + + source_acc_id, + + + source_bank_no, + + + source_card, + + + target_acc_id, + + + target_card, + + + target_bank_no, + + + target_acc_name, + + + amount, + + + add_time, + + + result, + + + remark, + + + tran_time, + + + reason, + + + bank_type, + + + + + #{id,jdbcType=BIGINT}, + + + #{unitId,jdbcType=BIGINT}, + + + #{orderNo,jdbcType=VARCHAR}, + + + #{sourceAccId,jdbcType=INTEGER}, + + + #{sourceBankNo,jdbcType=VARCHAR}, + + + #{sourceCard,jdbcType=VARCHAR}, + + + #{targetAccId,jdbcType=INTEGER}, + + + #{targetCard,jdbcType=VARCHAR}, + + + #{targetBankNo,jdbcType=VARCHAR}, + + + #{targetAccName,jdbcType=VARCHAR}, + + + #{amount,jdbcType=BIGINT}, + + + #{addTime,jdbcType=TIMESTAMP}, + + + #{result,jdbcType=SMALLINT}, + + + #{remark,jdbcType=VARCHAR}, + + + #{tranTime,jdbcType=TIMESTAMP}, + + + #{reason,jdbcType=VARCHAR}, + + + #{bankType,jdbcType=VARCHAR}, + + + + + update acc_transaction_log + + + unit_id = #{unitId,jdbcType=BIGINT}, + + + order_no = #{orderNo,jdbcType=VARCHAR}, + + + source_acc_id = #{sourceAccId,jdbcType=INTEGER}, + + + source_bank_no = #{sourceBankNo,jdbcType=VARCHAR}, + + + source_card = #{sourceCard,jdbcType=VARCHAR}, + + + target_acc_id = #{targetAccId,jdbcType=INTEGER}, + + + target_card = #{targetCard,jdbcType=VARCHAR}, + + + target_bank_no = #{targetBankNo,jdbcType=VARCHAR}, + + + amount = #{amount,jdbcType=BIGINT}, + + + add_time = #{addTime,jdbcType=TIMESTAMP}, + + + result = #{result,jdbcType=SMALLINT}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + tran_time = #{tranTime,jdbcType=TIMESTAMP}, + + + reason = #{reason,jdbcType=VARCHAR}, + + + pay_receipt_id = #{payReceiptId,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update acc_transaction_log + set unit_id = #{unitId,jdbcType=BIGINT}, + order_no = #{orderNo,jdbcType=VARCHAR}, + source_acc_id = #{sourceAccId,jdbcType=INTEGER}, + source_bank_no = #{sourceBankNo,jdbcType=VARCHAR}, + source_card = #{sourceCard,jdbcType=VARCHAR}, + target_acc_id = #{targetAccId,jdbcType=INTEGER}, + target_card = #{targetCard,jdbcType=VARCHAR}, + target_bank_no = #{targetBankNo,jdbcType=VARCHAR}, + amount = #{amount,jdbcType=BIGINT}, + add_time = #{addTime,jdbcType=TIMESTAMP}, + result = #{result,jdbcType=SMALLINT}, + remark = #{remark,jdbcType=VARCHAR}, + tran_time = #{tranTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + update acc_transaction_log set pay_receipt = + + when '${item.targetBankNo}' then '${item.payReceipt}' + + where bank_type = '${bankType}' and target_bank_no in + + '${item.targetBankNo}' + + + + + UPDATE acc_transaction_log + SET result = 0 + WHERE + result = -1 + AND id = #{id,jdbcType=BIGINT} + + + + UPDATE acc_transaction_log + SET result = -1 + WHERE + result = 0 + AND id = #{id,jdbcType=BIGINT} + + diff --git a/ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java b/ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java new file mode 100644 index 0000000..e25d0ca --- /dev/null +++ b/ruoyi-modules/ruoyi-settlement/src/test/java/org/dromara/settlement/Test.java @@ -0,0 +1,40 @@ +package org.dromara.settlement; + +import cn.hutool.core.codec.Base64; +import org.dromara.settlement.service.impl.ZhaoShangServiceImpl; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + +/** + * @author sunzexing + * @version 1.0 + * @title Test + * @description + * @create 2024-07-28 14:13 + */ + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class Test { + + + + @Resource + private ZhaoShangServiceImpl zhaoShangService; + + + + @org.junit.jupiter.api.Test + public void test(){ + +// this.zhaoShangService.synAccountOld(1811245410163494912L,"655905386710005","6000000002"); +// this.zhaoShangService.delAccount(1811245410163494912L,"655905386710005","3000000003"); +// System.out.println(); + + + + } +} diff --git a/ruoyi-modules/ruoyi-system/Dockerfile b/ruoyi-modules/ruoyi-system/Dockerfile new file mode 100644 index 0000000..2989fbf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/Dockerfile @@ -0,0 +1,23 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/system/logs \ + /ruoyi/system/temp \ + /ruoyi/skywalking/agent + +WORKDIR /ruoyi/system + +ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE ${SERVER_PORT} + +ADD ./target/ruoyi-system.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + #-Dskywalking.agent.service_name=ruoyi-system \ + #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ + -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} + diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml new file mode 100644 index 0000000..20d5055 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -0,0 +1,140 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-system + + + ruoyi-system系统模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.dromara + ruoyi-common-sentinel + + + + + org.dromara + ruoyi-common-log + + + + org.dromara + ruoyi-common-dict + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-dubbo + + + + org.dromara + ruoyi-common-seata + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-translation + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + + org.dromara + ruoyi-api-system + + + + org.dromara + ruoyi-api-resource + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java new file mode 100644 index 0000000..7e38306 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java @@ -0,0 +1,24 @@ +package org.dromara.system; + +import cn.hutool.crypto.SecureUtil; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; + +/** + * 系统模块 + * + * @author ruoyi + */ +@EnableDubbo +@SpringBootApplication +public class RuoYiSystemApplication { + public static void main(String[] args) { + SpringApplication application = new SpringApplication(RuoYiSystemApplication.class); + application.setApplicationStartup(new BufferingApplicationStartup(2048)); + SecureUtil.disableBouncyCastle(); + application.run(args); + System.out.println("(♥◠‿◠)ノ゙ 系统模块启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java new file mode 100644 index 0000000..51ca79d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -0,0 +1,55 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.domain.vo.CacheListInfoVo; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; + +/** + * 缓存监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/cache") +public class CacheController { + + private final RedissonConnectionFactory connectionFactory; + + /** + * 获取缓存监控列表 + */ + @SaCheckPermission("monitor:cache:list") + @GetMapping() + public R getInfo() throws Exception { + RedisConnection connection = connectionFactory.getConnection(); + Properties commandStats = connection.commands().info("commandstats"); + + List> pieList = new ArrayList<>(); + if (commandStats != null) { + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + } + + CacheListInfoVo infoVo = new CacheListInfoVo(); + infoVo.setInfo(connection.commands().info()); + infoVo.setDbSize(connection.commands().dbSize()); + infoVo.setCommandStats(pieList); + return R.ok(infoVo); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..0f23e5c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -0,0 +1,89 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 系统访问记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/logininfor") +public class SysLogininforController extends BaseController { + + private final ISysLogininforService logininforService; + + /** + * 获取系统访问记录列表 + */ + @SaCheckPermission("monitor:logininfor:list") + @GetMapping("/list") + public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { + return logininforService.selectPageLogininforList(logininfor, pageQuery); + } + + /** + * 导出系统访问记录列表 + */ + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:logininfor:export") + @PostMapping("/export") + public void export(SysLogininforBo logininfor, HttpServletResponse response) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); + } + + /** + * 批量删除登录日志 + * @param infoIds 日志ids + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public R remove(@PathVariable Long[] infoIds) { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + /** + * 清理系统访问记录 + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + logininforService.cleanLogininfor(); + return R.ok(); + } + + @SaCheckPermission("monitor:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public R unlock(@PathVariable("userName") String userName) { + String loginName = GlobalConstants.PWD_ERR_CNT_KEY + userName; + if (RedisUtils.hasKey(loginName)) { + RedisUtils.deleteObject(loginName); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..5af1a01 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -0,0 +1,75 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/operlog") +public class SysOperlogController extends BaseController { + + private final ISysOperLogService operLogService; + + /** + * 获取操作日志记录列表 + */ + @SaCheckPermission("monitor:operlog:list") + @GetMapping("/list") + public TableDataInfo list(SysOperLogBo operLog, PageQuery pageQuery) { + return operLogService.selectPageOperLogList(operLog, pageQuery); + } + + /** + * 导出操作日志记录列表 + */ + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:operlog:export") + @PostMapping("/export") + public void export(SysOperLogBo operLog, HttpServletResponse response) { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response); + } + + /** + * 批量删除操作日志记录 + * @param operIds 日志ids + */ + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @SaCheckPermission("monitor:operlog:remove") + @DeleteMapping("/{operIds}") + public R remove(@PathVariable Long[] operIds) { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + /** + * 清理操作日志记录 + */ + @SaCheckPermission("monitor:operlog:remove") + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + operLogService.cleanOperLog(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..3ea4b91 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,89 @@ +package org.dromara.system.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.system.api.domain.SysUserOnline; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 在线用户监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/online") +public class SysUserOnlineController extends BaseController { + + /** + * 获取在线用户监控列表 + * + * @param ipaddr IP地址 + * @param userName 用户名 + */ + @SaCheckPermission("monitor:online:list") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + // 获取所有未过期的 token + List keys = StpUtil.searchTokenValue("", 0, -1, false); + List userOnlineDTOList = new ArrayList<>(); + for (String key : keys) { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + continue; + } + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); + } + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) + ); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退用户 + * + * @param tokenId token值 + */ + @SaCheckPermission("monitor:online:forceLogout") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public R forceLogout(@PathVariable String tokenId) { + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException ignored) { + } + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java new file mode 100644 index 0000000..a1e7fab --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaController.java @@ -0,0 +1,122 @@ +package org.dromara.system.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.system.domain.bo.SysAreaBo; +import org.dromara.system.service.ISysAreaService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 区域 + * 前端访问路由地址为:/system/area + * + * @author LionLi + * @date 2024-04-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/area") +public class SysAreaController extends BaseController { + + private final ISysAreaService sysAreaService; + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-19 15:10 + * 说明:省市级联 + **/ + @PostMapping("/queryList") + @Log(title = "区域查询", businessType = BusinessType.OTHER) + public R> queryList(SysAreaBo bo){ + return R.ok(this.sysAreaService.queryList(bo)); + } + +// +// /** +// * 查询区域列表 +// */ +// @SaCheckPermission("system:area:list") +// @GetMapping("/list") +// public TableDataInfo list(SysAreaBo bo, PageQuery pageQuery) { +// return sysAreaService.queryPageList(bo, pageQuery); +// } +// +// /** +// * 导出区域列表 +// */ +// @SaCheckPermission("system:area:export") +// @Log(title = "区域", businessType = BusinessType.EXPORT) +// @PostMapping("/export") +// public void export(SysAreaBo bo, HttpServletResponse response) { +// List list = sysAreaService.queryList(bo); +// ExcelUtil.exportExcel(list, "区域", SysAreaVo.class, response); +// } +// +// /** +// * 获取区域详细信息 +// * +// * @param areaId 主键 +// */ +// @SaCheckPermission("system:area:query") +// @GetMapping("/{areaId}") +// public R getInfo(@NotNull(message = "主键不能为空") +// @PathVariable Long areaId) { +// return R.ok(sysAreaService.queryById(areaId)); +// } +// +// /** +// * 新增区域 +// */ +// @SaCheckPermission("system:area:add") +// @Log(title = "区域", businessType = BusinessType.INSERT) +// @RepeatSubmit() +// @PostMapping() +// public R add(@Validated(AddGroup.class) @RequestBody SysAreaBo bo) { +// return toAjax(sysAreaService.insertByBo(bo)); +// } +// +// /** +// * 修改区域 +// */ +// @SaCheckPermission("system:area:edit") +// @Log(title = "区域", businessType = BusinessType.UPDATE) +// @RepeatSubmit() +// @PutMapping() +// public R edit(@Validated(EditGroup.class) @RequestBody SysAreaBo bo) { +// return toAjax(sysAreaService.updateByBo(bo)); +// } +// +// /** +// * 删除区域 +// * +// * @param areaIds 主键串 +// */ +// @SaCheckPermission("system:area:remove") +// @Log(title = "区域", businessType = BusinessType.DELETE) +// @DeleteMapping("/{areaIds}") +// public R remove(@NotEmpty(message = "主键不能为空") +// @PathVariable Long[] areaIds) { +// return toAjax(sysAreaService.deleteWithValidByIds(List.of(areaIds), true)); +// } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java new file mode 100644 index 0000000..c8938e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java @@ -0,0 +1,115 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.service.ISysClientService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 客户端管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/client") +public class SysClientController extends BaseController { + + private final ISysClientService sysClientService; + + /** + * 查询客户端管理列表 + */ + @SaCheckPermission("system:client:list") + @GetMapping("/list") + public TableDataInfo list(SysClientBo bo, PageQuery pageQuery) { + return sysClientService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户端管理列表 + */ + @SaCheckPermission("system:client:export") + @Log(title = "客户端管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysClientBo bo, HttpServletResponse response) { + List list = sysClientService.queryList(bo); + ExcelUtil.exportExcel(list, "客户端管理", SysClientVo.class, response); + } + + /** + * 获取客户端管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:client:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysClientService.queryById(id)); + } + + /** + * 新增客户端管理 + */ + @SaCheckPermission("system:client:add") + @Log(title = "客户端管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.insertByBo(bo)); + } + + /** + * 修改客户端管理 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysClientBo bo) { + return toAjax(sysClientService.updateUserStatus(bo.getId(), bo.getStatus())); + } + + /** + * 删除客户端管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:client:remove") + @Log(title = "客户端管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysClientService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java new file mode 100644 index 0000000..1d7878b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -0,0 +1,137 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.service.ISysConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 参数配置 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/config") +public class SysConfigController extends BaseController { + + private final ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @SaCheckPermission("system:config:list") + @GetMapping("/list") + public TableDataInfo list(SysConfigBo config, PageQuery pageQuery) { + return configService.selectPageConfigList(config, pageQuery); + } + + /** + * 导出参数配置列表 + */ + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:config:export") + @PostMapping("/export") + public void export(SysConfigBo config, HttpServletResponse response) { + List list = configService.selectConfigList(config); + ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); + } + + /** + * 根据参数编号获取详细信息 + * + * @param configId 参数ID + */ + @SaCheckPermission("system:config:query") + @GetMapping(value = "/{configId}") + public R getInfo(@PathVariable Long configId) { + return R.ok(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + * + * @param configKey 参数Key + */ + @GetMapping(value = "/configKey/{configKey}") + public R getConfigKey(@PathVariable String configKey) { + return R.ok("操作成功", configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @SaCheckPermission("system:config:add") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.insertConfig(config); + return R.ok(); + } + + /** + * 修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.updateConfig(config); + return R.ok(); + } + + /** + * 根据参数键名修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateByKey") + public R updateByKey(@RequestBody SysConfigBo config) { + configService.updateConfig(config); + return R.ok(); + } + + /** + * 删除参数配置 + * + * @param configIds 参数ID串 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public R remove(@PathVariable Long[] configIds) { + configService.deleteConfigByIds(configIds); + return R.ok(); + } + + /** + * 刷新参数缓存 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + configService.resetConfigCache(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java new file mode 100644 index 0000000..cf60988 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -0,0 +1,123 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.service.ISysDeptService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 部门信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dept") +public class SysDeptController extends BaseController { + + private final ISysDeptService deptService; + + /** + * 获取部门列表 + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list") + public R> list(SysDeptBo dept) { + List depts = deptService.selectDeptList(dept); + return R.ok(depts); + } + + /** + * 查询部门列表(排除节点) + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list/exclude/{deptId}") + public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new SysDeptBo()); + depts.removeIf(d -> d.getDeptId().equals(deptId) + || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); + return R.ok(depts); + } + + /** + * 根据部门编号获取详细信息 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:query") + @GetMapping(value = "/{deptId}") + public R getInfo(@PathVariable Long deptId) { + deptService.checkDeptDataScope(deptId); + return R.ok(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @SaCheckPermission("system:dept:add") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDeptBo dept) { + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @SaCheckPermission("system:dept:edit") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDeptBo dept) { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())) { + if (deptService.selectNormalChildrenDeptById(deptId) > 0) { + return R.fail("该部门包含未停用的子部门!"); + } else if (deptService.checkDeptExistUser(deptId)) { + return R.fail("该部门下存在已分配用户,不能禁用!"); + } + } + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:remove") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public R remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { + return R.warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return R.warn("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java new file mode 100644 index 0000000..f978e91 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -0,0 +1,117 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dict/data") +public class SysDictDataController extends BaseController { + + private final ISysDictDataService dictDataService; + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典数据列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictDataBo dictData, PageQuery pageQuery) { + return dictDataService.selectPageDictDataList(dictData, pageQuery); + } + + /** + * 导出字典数据列表 + */ + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictDataBo dictData, HttpServletResponse response) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); + } + + /** + * 查询字典数据详细 + * + * @param dictCode 字典code + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictCode}") + public R getInfo(@PathVariable Long dictCode) { + return R.ok(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public R> dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(data); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictDataBo dict) { + dictDataService.insertDictData(dict); + return R.ok(); + } + + /** + * 修改保存字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictDataBo dict) { + dictDataService.updateDictData(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictCodes 字典code串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public R remove(@PathVariable Long[] dictCodes) { + dictDataService.deleteDictDataByIds(dictCodes); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..1e51539 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -0,0 +1,125 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/dict/type") +public class SysDictTypeController extends BaseController { + + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典类型列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(SysDictTypeBo dictType, PageQuery pageQuery) { + return dictTypeService.selectPageDictTypeList(dictType, pageQuery); + } + + /** + * 导出字典类型列表 + */ + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(SysDictTypeBo dictType, HttpServletResponse response) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); + } + + /** + * 查询字典类型详细 + * + * @param dictId 字典ID + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictId}") + public R getInfo(@PathVariable Long dictId) { + return R.ok(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.insertDictType(dict); + return R.ok(); + } + + /** + * 修改字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysDictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.updateDictType(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictIds 字典ID串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public R remove(@PathVariable Long[] dictIds) { + dictTypeService.deleteDictTypeByIds(dictIds); + return R.ok(); + } + + /** + * 刷新字典缓存 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + dictTypeService.resetDictCache(); + return R.ok(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return R.ok(dictTypes); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java new file mode 100644 index 0000000..d55e820 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysIndustryController.java @@ -0,0 +1,118 @@ +package org.dromara.system.controller.system; + +import java.util.List; +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.system.service.ISysIndustryService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 行业字典信息 + * 前端访问路由地址为:/system/industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/industry") +public class SysIndustryController extends BaseController { + + private final ISysIndustryService sysIndustryService; + + + /*** + * 查询行业字典信息列表 + * @return + */ + @GetMapping("/selList") + @Log(title = "查询行业字典信息", businessType = BusinessType.OTHER) + public R> selectIndustryList() { + return R.ok(sysIndustryService.selectIndustryList()); + } +// +// /** +// * 查询行业字典信息列表 +// */ +// @SaCheckPermission("system:industry:list") +// @GetMapping("/list") +// public TableDataInfo list(SysIndustryBo bo, PageQuery pageQuery) { +// return sysIndustryService.queryPageList(bo, pageQuery); +// } +// +// /** +// * 导出行业字典信息列表 +// */ +// @SaCheckPermission("system:industry:export") +// @Log(title = "行业字典信息", businessType = BusinessType.EXPORT) +// @PostMapping("/export") +// public void export(SysIndustryBo bo, HttpServletResponse response) { +// List list = sysIndustryService.queryList(bo); +// ExcelUtil.exportExcel(list, "行业字典信息", SysIndustryVo.class, response); +// } +// +// /** +// * 获取行业字典信息详细信息 +// * +// * @param id 主键 +// */ +// @SaCheckPermission("system:industry:query") +// @GetMapping("/{id}") +// public R getInfo(@NotNull(message = "主键不能为空") +// @PathVariable Long id) { +// return R.ok(sysIndustryService.queryById(id)); +// } +// +// /** +// * 新增行业字典信息 +// */ +// @SaCheckPermission("system:industry:add") +// @Log(title = "行业字典信息", businessType = BusinessType.INSERT) +// @RepeatSubmit() +// @PostMapping() +// public R add(@Validated(AddGroup.class) @RequestBody SysIndustryBo bo) { +// return toAjax(sysIndustryService.insertByBo(bo)); +// } +// +// /** +// * 修改行业字典信息 +// */ +// @SaCheckPermission("system:industry:edit") +// @Log(title = "行业字典信息", businessType = BusinessType.UPDATE) +// @RepeatSubmit() +// @PutMapping() +// public R edit(@Validated(EditGroup.class) @RequestBody SysIndustryBo bo) { +// return toAjax(sysIndustryService.updateByBo(bo)); +// } +// +// /** +// * 删除行业字典信息 +// * +// * @param ids 主键串 +// */ +// @SaCheckPermission("system:industry:remove") +// @Log(title = "行业字典信息", businessType = BusinessType.DELETE) +// @DeleteMapping("/{ids}") +// public R remove(@NotEmpty(message = "主键不能为空") +// @PathVariable Long[] ids) { +// return toAjax(sysIndustryService.deleteWithValidByIds(List.of(ids), true)); +// } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java new file mode 100644 index 0000000..31a354c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -0,0 +1,192 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.lang.tree.Tree; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MenuTreeSelectVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.service.ISysMenuService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/menu") +public class SysMenuController extends BaseController { + + private final ISysMenuService menuService; + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("/getRouters") + public R> getRouters() { + LoginUser loginUser = LoginHelper.getLoginUser(); + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId(),loginUser.getRoleDataRange()); + return R.ok(menuService.buildMenus(menus)); + } + + /** + * 获取菜单列表 + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:list") + @GetMapping("/list") + public R> list(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menus); + } + + /** + * 根据菜单编号获取详细信息 + * + * @param menuId 菜单ID + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/{menuId}") + public R getInfo(@PathVariable Long menuId) { + return R.ok(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @SaCheckPermission("system:menu:query") + @GetMapping("/treeselect") + public R>> treeselect(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId(),roleId); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + + /** + * 加载操作员对应角色菜单列表树 + * + */ + @SaCheckPermission("system:menu:oper:query") + @GetMapping(value = "/userMenuTreeselect/{uid}") + public R userMenuTreeselect(@PathVariable("uid") Long uid) { + SysMenuBo smb = new SysMenuBo(); + List menus = menuService.selectCurrentUserMenuList(smb,LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByUserId(uid)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 加载对应租户套餐菜单列表树 + * + * @param packageId 租户套餐ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") + public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId(),null); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 新增菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:add") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:edit") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + * + * @param menuId 菜单ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:remove") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public R remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return R.warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return R.warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java new file mode 100644 index 0000000..76da8d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -0,0 +1,100 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.service.DictService; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 公告 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/notice") +public class SysNoticeController extends BaseController { + + private final ISysNoticeService noticeService; + private final DictService dictService; + + @DubboReference + private final RemoteMessageService remoteMessageService; + + /** + * 获取通知公告列表 + */ + @SaCheckPermission("system:notice:list") + @GetMapping("/list") + public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); + } + +// @SaCheckPermission("system:notice:listByUser") + @GetMapping("/listByUser") + public TableDataInfo listByUser(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeListByUser(notice, pageQuery); + } + + /** + * 根据通知公告编号获取详细信息 + * + * @param noticeId 公告ID + */ +// @SaCheckPermission("system:notice:query") + @GetMapping(value = "/{noticeId}") + public R getInfo(@PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @SaCheckPermission("system:notice:add") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysNoticeBo notice) { + int rows = noticeService.insertNotice(notice); + if (rows <= 0) { + return R.fail(); + } + String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); + remoteMessageService.publishAll("[" + type + "] " + notice.getNoticeTitle()); + return R.ok(); + } + + /** + * 修改通知公告 + */ + @SaCheckPermission("system:notice:edit") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysNoticeBo notice) { + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + * + * @param noticeIds 公告ID串 + */ + @SaCheckPermission("system:notice:remove") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public R remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java new file mode 100644 index 0000000..9932cb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -0,0 +1,121 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.service.ISysPostService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 岗位信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/post") +public class SysPostController extends BaseController { + + private final ISysPostService postService; + + /** + * 获取岗位列表 + */ + @SaCheckPermission("system:post:list") + @GetMapping("/list") + public TableDataInfo list(SysPostBo post, PageQuery pageQuery) { + return postService.selectPagePostList(post, pageQuery); + } + + /** + * 导出岗位列表 + */ + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:post:export") + @PostMapping("/export") + public void export(SysPostBo post, HttpServletResponse response) { + List list = postService.selectPostList(post); + ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); + } + + /** + * 根据岗位编号获取详细信息 + * + * @param postId 岗位ID + */ + @SaCheckPermission("system:post:query") + @GetMapping(value = "/{postId}") + public R getInfo(@PathVariable Long postId) { + return R.ok(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @SaCheckPermission("system:post:add") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @SaCheckPermission("system:post:edit") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysPostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } else if (UserConstants.POST_DISABLE.equals(post.getStatus()) + && postService.countUserPostById(post.getPostId()) > 0) { + return R.fail("该岗位下存在已分配用户,不能禁用!"); + } + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + * + * @param postIds 岗位ID串 + */ + @SaCheckPermission("system:post:remove") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public R remove(@PathVariable Long[] postIds) { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + SysPostBo postBo = new SysPostBo(); + postBo.setStatus(UserConstants.POST_NORMAL); + List posts = postService.selectPostList(postBo); + return R.ok(posts); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java new file mode 100644 index 0000000..fa74f4b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -0,0 +1,135 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.bo.SysUserPasswordBo; +import org.dromara.system.domain.bo.SysUserProfileBo; +import org.dromara.system.domain.vo.AvatarVo; +import org.dromara.system.domain.vo.ProfileVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysUserService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; + +/** + * 个人信息 业务处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/user/profile") +public class SysProfileController extends BaseController { + + private final ISysUserService userService; + + @DubboReference + private RemoteFileService remoteFileService; + + /** + * 个人信息 + */ + @GetMapping + public R profile() { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + ProfileVo profileVo = new ProfileVo(); + profileVo.setUser(user); + profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserName())); + profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserName())); + return R.ok(profileVo); + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public R updateProfile(@RequestBody SysUserProfileBo profile) { + SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); + String username = LoginHelper.getUsername(); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + username + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); + } + user.setUserId(LoginHelper.getUserId()); + if (userService.updateUserProfile(user) > 0) { + return R.ok(); + } + return R.fail("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + * + * @param bo 新旧密码 + */ + @ApiEncrypt + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public R updatePwd(@Validated @RequestBody SysUserPasswordBo bo) { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + String password = user.getPassword(); + if (!BCrypt.checkpw(bo.getOldPassword(), password)) { + return R.fail("修改密码失败,旧密码错误"); + } + if (BCrypt.checkpw(bo.getNewPassword(), password)) { + return R.fail("新密码不能与旧密码相同"); + } + + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword())) > 0) { + return R.ok(); + } + return R.fail("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + * + * @param avatarfile 用户头像 + */ + @GlobalTransactional(rollbackFor = Exception.class) + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) throws IOException { + if (!avatarfile.isEmpty()) { + String extension = FileUtil.extName(avatarfile.getOriginalFilename()); + if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { + return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); + } + RemoteFile oss = remoteFileService.upload(avatarfile.getName(), avatarfile.getOriginalFilename(), avatarfile.getContentType(), avatarfile.getBytes()); + String avatar = oss.getUrl(); + if (userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())) { + AvatarVo avatarVo = new AvatarVo(); + avatarVo.setImgUrl(avatar); + return R.ok(avatarVo); + } + } + return R.fail("上传图片异常,请联系管理员"); + } + + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java new file mode 100644 index 0000000..2ca7679 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -0,0 +1,228 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.DeptTreeSelectVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysDeptService; +import org.dromara.system.service.ISysRoleService; +import org.dromara.system.service.ISysUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 角色信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/role") +public class SysRoleController extends BaseController { + + private final ISysRoleService roleService; + private final ISysUserService userService; + private final ISysDeptService deptService; + + /** + * 获取角色信息列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/list") + public TableDataInfo list(SysRoleBo role, PageQuery pageQuery) { + return roleService.selectPageRoleList(role, pageQuery); + } + + /** + * 导出角色信息列表 + */ + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:role:export") + @PostMapping("/export") + public void export(SysRoleBo role, HttpServletResponse response) { + List list = roleService.selectRoleList(role); + ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); + } + + /** + * 根据角色编号获取详细信息 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:query") + @GetMapping(value = "/{roleId}") + public R getInfo(@PathVariable Long roleId) { + roleService.checkRoleDataScope(roleId); + return R.ok(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @SaCheckPermission("system:role:add") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + + if (roleService.updateRole(role) > 0) { + roleService.cleanOnlineUserByRole(role.getRoleId()); + return R.ok(); + } + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public R dataScope(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); + } + + /** + * 删除角色 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:remove") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public R remove(@PathVariable Long[] roleIds) { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @SaCheckPermission("system:role:query") + @GetMapping("/optionselect") + public R> optionselect() { + return R.ok(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectAllocatedList(user, pageQuery); + } + + /** + * 查询未分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUserBo user, PageQuery pageQuery) { + return userService.selectUnallocatedList(user, pageQuery); + } + + /** + * 取消授权用户 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public R cancelAuthUser(@RequestBody SysUserRole userRole) { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public R cancelAuthUserAll(Long roleId, Long[] userIds) { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public R selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:list") + @GetMapping(value = "/deptTree/{roleId}") + public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); + selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); + selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); + return R.ok(selectVo); + } +} + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java new file mode 100644 index 0000000..0d95d0e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java @@ -0,0 +1,38 @@ +package org.dromara.system.controller.system; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.service.ISysSocialService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 社会化关系 + * + * @author thiszhc + * @date 2023-06-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/social") +public class SysSocialController extends BaseController { + + private final ISysSocialService socialUserService; + + /** + * 查询社会化关系列表 + */ + @GetMapping("/list") + public R> list() { + return R.ok(socialUserService.queryListByUserId(LoginHelper.getUserId())); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java new file mode 100644 index 0000000..0d43114 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -0,0 +1,178 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import com.baomidou.lock.annotation.Lock4j; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 租户管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tenant") +public class SysTenantController extends BaseController { + + private final ISysTenantService tenantService; + + /** + * 查询租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) { + return tenantService.queryPageList(bo, pageQuery); + } + + /** + * 导出租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:export") + @Log(title = "租户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantBo bo, HttpServletResponse response) { + List list = tenantService.queryList(bo); + ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); + } + + /** + * 获取租户详细信息 + * + * @param id 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tenantService.queryById(id)); + } + + /** + * 新增租户 + */ + @ApiEncrypt + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:add") + @Log(title = "租户", businessType = BusinessType.INSERT) + @Lock4j + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); + } + return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); + } + + /** + * 修改租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); + } + return toAjax(tenantService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + return toAjax(tenantService.updateTenantStatus(bo)); + } + + /** + * 删除租户 + * + * @param ids 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:remove") + @Log(title = "租户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tenantService.deleteWithValidByIds(Arrays.asList(ids), true)); + } + + /** + * 动态切换租户 + * + * @param tenantId 租户ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/{tenantId}") + public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) { + TenantHelper.setDynamic(tenantId); + return R.ok(); + } + + /** + * 清除动态租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/clear") + public R dynamicClear() { + TenantHelper.clearDynamic(); + return R.ok(); + } + + + /** + * 同步租户套餐 + * + * @param tenantId 租户id + * @param packageId 套餐id + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @GetMapping("/syncTenantPackage") + public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, + @NotNull(message = "套餐ID不能为空") Long packageId) { + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java new file mode 100644 index 0000000..d01a4b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -0,0 +1,135 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 租户套餐管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/tenant/package") +public class SysTenantPackageController extends BaseController { + + private final ISysTenantPackageService tenantPackageService; + + /** + * 查询租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantPackageBo bo, PageQuery pageQuery) { + return tenantPackageService.queryPageList(bo, pageQuery); + } + + /** + * 查询租户套餐下拉选列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/selectList") + public R> selectList() { + return R.ok(tenantPackageService.selectList()); + } + + /** + * 导出租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:export") + @Log(title = "租户套餐", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantPackageBo bo, HttpServletResponse response) { + List list = tenantPackageService.queryList(bo); + ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response); + } + + /** + * 获取租户套餐详细信息 + * + * @param packageId 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:query") + @GetMapping("/{packageId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long packageId) { + return R.ok(tenantPackageService.queryById(packageId)); + } + + /** + * 新增租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:add") + @Log(title = "租户套餐", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.insertByBo(bo)); + } + + /** + * 修改租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updatePackageStatus(bo)); + } + + /** + * 删除租户套餐 + * + * @param packageIds 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:remove") + @Log(title = "租户套餐", businessType = BusinessType.DELETE) + @DeleteMapping("/{packageIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] packageIds) { + return toAjax(tenantPackageService.deleteWithValidByIds(Arrays.asList(packageIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java new file mode 100644 index 0000000..faae3c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUnitDomainController.java @@ -0,0 +1,116 @@ +package org.dromara.system.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.domain.bo.SysUnitDomainBo; +import org.dromara.system.service.ISysUnitDomainService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 单位域名配置 + * 前端访问路由地址为:/system/unitDomain + * + * @author LionLi + * @date 2024-03-29 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/unitDomain") +public class SysUnitDomainController extends BaseController { + + private final ISysUnitDomainService sysUnitDomainService; + + /** + * 查询单位域名配置列表 + */ + @SaCheckPermission("system:unitDomain:list") + @GetMapping("/list") + public TableDataInfo list(SysUnitDomainBo bo, PageQuery pageQuery) { + return sysUnitDomainService.queryPageList(bo, pageQuery); + } + + /** + * 导出单位域名配置列表 + */ + @SaCheckPermission("system:unitDomain:export") + @Log(title = "单位域名配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysUnitDomainBo bo, HttpServletResponse response) { + List list = sysUnitDomainService.queryList(bo); + ExcelUtil.exportExcel(list, "单位域名配置", SysUnitDomainVo.class, response); + } + + /** + * 获取单位域名配置详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:unitDomain:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysUnitDomainService.queryById(id)); + } + + /** + * 根据域名获取站点配置信息 + * @param domain 域名地址 + * @return + */ + @PostMapping("/queryByDomain") + public R queryByDomainName(@NotBlank(message = "域名不能为空") String domain) { + return R.ok(sysUnitDomainService.queryByDomainName(domain)); + } + + /** + * 新增单位域名配置 + */ + @SaCheckPermission("system:unitDomain:add") + @Log(title = "单位域名配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysUnitDomainBo bo) { + return toAjax(sysUnitDomainService.insertByBo(bo)); + } + + /** + * 修改单位域名配置 + */ + @SaCheckPermission("system:unitDomain:edit") + @Log(title = "单位域名配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysUnitDomainBo bo) { + return toAjax(sysUnitDomainService.updateByBo(bo)); + } + + /** + * 删除单位域名配置 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:unitDomain:remove") + @Log(title = "单位域名配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysUnitDomainService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java new file mode 100644 index 0000000..d701168 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -0,0 +1,527 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.DesensitizedUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.enums.SmsType; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.api.RemoteSmsService; +import org.dromara.resource.api.domain.RemoteSms; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.bo.*; +import org.dromara.system.domain.vo.*; +import org.dromara.system.listener.SysUserImportListener; +import org.dromara.system.service.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/user") +public class SysUserController extends BaseController { + + private final ISysUserService userService; + private final ISysRoleService roleService; + private final ISysPostService postService; + private final ISysDeptService deptService; + private final ISysTenantService tenantService; + + @DubboReference + private RemoteSmsService remoteSmsService; + + + + + /** + * 获取用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list") + public TableDataInfo list(SysUserBo user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); + } + + + /** + * 获取操作员表 + */ + @SaCheckPermission("system:user:listNew") + @GetMapping("/listNew") + public TableDataInfo listNew(SysUserBo user, PageQuery pageQuery) { + return userService.selNewUserList(user, pageQuery); + } + + + /** + * 导出用户列表 + */ + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:user:export") + @PostMapping("/export") + public void export(SysUserBo user, HttpServletResponse response) { + List list = userService.selectUserList(user); + List listVo = MapstructUtils.convert(list, SysUserExportVo.class); + ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response); + } + + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @SaCheckPermission("system:user:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("/getInfo") + public R getInfo() { + LoginUser loginUser = LoginHelper.getLoginUser(); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 如果重新加载用户信息需清除动态租户 + TenantHelper.clearDynamic(); + } + UserInfoVo userInfoVo = new UserInfoVo(); + + SysUserVo user = userService.selectUserById(loginUser.getUserId()); + if (ObjectUtil.isNull(user)) { + return R.fail("没有权限访问用户数据!"); + } + userInfoVo.setUser(user); + userInfoVo.setPermissions(loginUser.getMenuPermission()); + userInfoVo.setRoles(loginUser.getRolePermission()); + return R.ok(userInfoVo); + } + + /** + * 根据用户编号获取详细信息 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}"}) + public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { + userService.checkUserDataScope(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + SysRoleBo roleBo = new SysRoleBo(); + roleBo.setStatus(UserConstants.ROLE_NORMAL); + SysPostBo postBo = new SysPostBo(); + postBo.setStatus(UserConstants.POST_NORMAL); + List roles = roleService.selectRoleList(roleBo); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + userInfoVo.setPosts(postService.selectPostList(postBo)); + if (ObjectUtil.isNotNull(userId)) { + SysUserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + userInfoVo.setRoleIds(StreamUtils.toList(sysUser.getRoles(), SysRoleVo::getRoleId)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); + } + return R.ok(userInfoVo); + } + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:add") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysUserBo user) { + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + if (TenantHelper.isEnable()) { + if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) { + return R.fail("当前租户下用户名额不足,请联系管理员"); + } + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:addNew") + @Log(title = "新增操作员", businessType = BusinessType.INSERT) + @PostMapping("/addNew") + public R addNew(@Validated @RequestBody SysUserBo user) { + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增操作员'" + user.getUserName() + "'失败,登录账号已存在"); + } + + if(!user.getPassword().equals(user.getRepwd())){ + return R.fail("密码与确认密码不一致"); + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + user.setRoleDataRange(2); + return toAjax(userService.insertUserNew(user)); + } + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + return toAjax(userService.updateUser(user)); + } + + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:editNew") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/updNew") + public R editNew(@Validated @RequestBody SysUserBo user) { + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + return toAjax(userService.updateUserNew(user)); + } + + + + @Log(title = "更新管理员登录阅读协议标识", businessType = BusinessType.UPDATE) + @PutMapping("/updReadTag") + public R updateReadProTag(){ + return R.ok(this.userService.updateReadProTag()); + } + + + /** + * 删除用户 + * + * @param userIds 角色ID串 + */ + @SaCheckPermission("system:user:remove") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public R remove(@PathVariable Long[] userIds) { + if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { + return R.fail("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwd") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public R resetPwd(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwdNew") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwdNew") + public R resetPwdNew(@RequestBody SysUserBo user) { + + if(!user.getPassword().equals(user.getRepwd())){ + return R.fail("密码与确认密码不一致!"); + } + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + + /*** + * 操作员分配权限 + * @param user + * @return + */ + + @SaCheckPermission("system:user:cfgPer") + @Log(title = "用户管理-操作员分配权限", businessType = BusinessType.UPDATE) + @PostMapping("/cfgPer") + public R configUserPer(@RequestBody SysUserBo user){ + return toAjax(userService.configUserPer(user)); + } + + + /** + * 登录密码修改 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetMyPwd") + @Log(title = "登录密码修改", businessType = BusinessType.UPDATE) + @PutMapping("/resetMyPwd") + public R resetMyPwd(@RequestBody SysUserPasswordBo bo) { + return toAjax(userService.resetMyPwd(bo.getOldPassword(),bo.getNewPassword(),bo.getSurePwd())); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:status") + @Log(title = "用户管理-状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + + + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeSt") + public R changeSt(@RequestBody SysUserBo user) { + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + /** + * 根据用户编号获取授权角色 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/authRole/{userId}") + public R authRole(@PathVariable Long userId) { + SysUserVo user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + userInfoVo.setUser(user); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 用户授权角色 + * + * @param userId 用户Id + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public R insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return R.ok(); + } + + /** + * 获取部门树列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/deptTree") + public R>> deptTree(SysDeptBo dept) { + return R.ok(deptService.selectDeptTreeList(dept)); + } + + /** + * 获取部门下的所有用户信息 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list/dept/{deptId}") + public R> listByDept(@PathVariable @NotNull Long deptId) { + return R.ok(userService.selectUserListByDept(deptId)); + } + + + + /*** + * 修改登录方式 + * @param loginType + * @return + */ + @SaCheckPermission("system:user:updLoginWay") + @GetMapping("/updLoginWay") + public R updLoginWay(Integer loginType){ + return toAjax(userService.updLoginWay(LoginHelper.getUserId(),loginType)); + } + + + + /*** + * 修改登录方式 + * @param loginType + * @return + */ +// @SaCheckPermission("system:user:updLoginWay") + @GetMapping("/selLoginWay") + public R selLoginWay(Integer loginType){ + return R.ok(userService.selLoginWay(LoginHelper.getUserId())); + } + + + /** + * 获取用户手机号 + * @param userName 用户名称 + */ + @PostMapping("/getPhonenumber") + public R getPhonenumber(@NotBlank(message = "用户名称不能为空") String userName) { + SysUserVo user = userService.selectUserByUserName(userName); + return R.ok("操作成功",user != null ? DesensitizedUtil.mobilePhone(user.getPhonenumber()) : null); + } + + /** + * 发送找回密码短信验证码 + * @param userName 用户名称 + * @return + */ + @PostMapping("/sendForgotSmsCode") + public R sendForgotSmsCode(@NotBlank(message = "站点名称不能为空") String domain,@NotBlank(message = "用户名称不能为空") String userName) { + SysUserVo user = userService.selectUserByUserName(userName); + if(user == null){ + throw new ServiceException("发送失败,用户名称不存在"); + } + SmsType smsType = SmsType.RESET_PWD; + String key = smsType.getCacheKey(user.getPhonenumber()); + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(smsType.getExpireTime())); + LinkedHashMap map = new LinkedHashMap<>(); + map.put("code", code); + remoteSmsService.send(domain,user.getPhonenumber(),smsType,map); + return R.ok(); + } + + + /** + * 通过验证码找回密码 + * @param body + * @return + */ + @ApiEncrypt + @PostMapping("/forgotPassword") + public R forgotPassword(@RequestBody String body) { + JSONObject param = JSONObject.parseObject(body); + if(!param.containsKey("userName") || !param.containsKey("code") || !param.containsKey("password") || StringUtils.isBlank(param.getString("userName")) || StringUtils.isBlank(param.getString("code")) || StringUtils.isBlank(param.getString("password"))){ + throw new ServiceException("参数异常,操作失败"); + } + SysUserVo user = userService.selectUserByUserName(param.getString("userName")); + if(user == null){ + throw new ServiceException("用户不存在,操作失败"); + } + SmsType smsType = SmsType.RESET_PWD; + String key = smsType.getCacheKey(user.getPhonenumber()); + String code = RedisUtils.getCacheObject(key); + if(StringUtils.isBlank(code)){ + throw new ServiceException("验证码已失效"); + } + if (!code.equals(param.getString("code"))){ + throw new ServiceException("验证码不正确"); + } + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(param.getString("password"))) == 0) { + throw new ServiceException("操作失败"); + } + RedisUtils.deleteObject(key); + return R.ok(); + } + + + /*** + * 获取绑定二维码 + * @param domain + * @return + */ + @GetMapping("/getBindQr") + public R getQrCode(String domain){ + return R.ok(this.userService.getBindingQr(domain)); + } + + + + + /*** + * 绑定二维码 + * @param domain + * @return + */ + @PostMapping("/bindUserOpenId") + public R bindUserOpenId(String domain,String code,String username){ + return R.ok(this.userService.bindWeixinOpenId(domain,code,username)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java new file mode 100644 index 0000000..c9c25b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BpmOrderNum.java @@ -0,0 +1,42 @@ +package org.dromara.system.domain; + +import java.io.Serializable; + +public class BpmOrderNum implements Serializable { + + private static final long serialVersionUID = 1L; + + private String dtm_time; + + private String v_process_name; + + private Long i_max_num; + + + + public String getDtm_time() { + return dtm_time; + } + + public void setDtm_time(String dtm_time) { + this.dtm_time = dtm_time; + } + + public String getV_process_name() { + return v_process_name; + } + + public void setV_process_name(String v_process_name) { + this.v_process_name = v_process_name; + } + + public Long getI_max_num() { + return i_max_num; + } + + public void setI_max_num(Long i_max_num) { + this.i_max_num = i_max_num; + } + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java new file mode 100644 index 0000000..c741766 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysArea.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 区域对象 sys_area + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_area") +public class SysArea extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区域id + */ + @TableId(value = "area_id") + private Long areaId; + + /** + * 区域名 + */ + private String areaName; + + /** + * 上级 + */ + private Long up; + + /** + * 级别 + */ + private Long level; + + /** + * 排序 + */ + private Long sort; + + /** + * 区域code + */ + private String code; + + /** + * 1 可用/ 0 不可用 + */ + private Integer isUse; + + /** + * 区域编码 + */ + private String areaCode; + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java new file mode 100644 index 0000000..c659470 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysClient.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 授权管理对象 sys_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_client") +public class SysClient extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java new file mode 100644 index 0000000..df1355c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 参数配置表 sys_config + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_config") +public class SysConfig extends TenantEntity { + + /** + * 参数主键 + */ + @TableId(value = "config_id") + private Long configId; + + /** + * 参数名称 + */ + private String configName; + + /** + * 参数键名 + */ + private String configKey; + + /** + * 参数键值 + */ + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java new file mode 100644 index 0000000..9733500 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + + +/** + * 部门表 sys_dept + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dept") +public class SysDept extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId(value = "dept_id") + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 祖级列表 + */ + private String ancestors; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java new file mode 100644 index 0000000..5eb5ca1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_data") +public class SysDictData extends TenantEntity { + + /** + * 字典编码 + */ + @TableId(value = "dict_code") + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格字典样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 备注 + */ + private String remark; + + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java new file mode 100644 index 0000000..dfd10a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java @@ -0,0 +1,41 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_type") +public class SysDictType extends TenantEntity { + + /** + * 字典主键 + */ + @TableId(value = "dict_id") + private Long dictId; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java new file mode 100644 index 0000000..baf9861 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysIndustry.java @@ -0,0 +1,63 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 行业字典信息对象 sys_industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_industry") +public class SysIndustry extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 名称 + */ + private String name; + + /** + * 父ID + */ + private Long parentId; + + /** + * 是否可用 1 是 0 否 + */ + private Integer isUse; + + /** + * 排序 + */ + private Long sort; + + /** + * 级别 + */ + private Integer level; + + + /** + * 创建部门 + */ + @TableField(exist = false) + private Long createDept; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java new file mode 100644 index 0000000..c57dc0a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java @@ -0,0 +1,85 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@TableName("sys_logininfor") +public class SysLogininfor implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "info_id") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java new file mode 100644 index 0000000..94eabdc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -0,0 +1,194 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_menu + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_menu") +public class SysMenu extends BaseEntity { + + /** + * 菜单ID + */ + @TableId(value = "menu_id") + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + /** + * 父菜单名称 + */ + @TableField(exist = false) + private String parentName; + + /** + * 子菜单 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + + + private String useType; + + /** + * 获取路由名称 + */ + public String getRouteName() { + String routerName = StringUtils.capitalize(path); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame()) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + */ + public String getRouterPath() { + String routerPath = this.path; + // 内链打开外网方式 + if (getParentId() != 0L && isInnerLink()) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0L == getParentId() && UserConstants.TYPE_DIR.equals(getMenuType()) + && UserConstants.NO_FRAME.equals(getIsFrame())) { + routerPath = "/" + this.path; + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame()) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + */ + public String getComponentInfo() { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(this.component) && !isMenuFrame()) { + component = this.component; + } else if (StringUtils.isEmpty(this.component) && getParentId() != 0L && isInnerLink()) { + component = UserConstants.INNER_LINK; + } else if (StringUtils.isEmpty(this.component) && isParentView()) { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + */ + public boolean isMenuFrame() { + return getParentId() == 0L && UserConstants.TYPE_MENU.equals(menuType) && isFrame.equals(UserConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + */ + public boolean isInnerLink() { + return isFrame.equals(UserConstants.NO_FRAME) && StringUtils.ishttp(path); + } + + /** + * 是否为parent_view组件 + */ + public boolean isParentView() { + return getParentId() != 0L && UserConstants.TYPE_DIR.equals(menuType); + } + + /** + * 内链域名特殊字符替换 + */ + public static String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"}, + new String[]{"", "", "", "/", "/"}); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java new file mode 100644 index 0000000..b24829b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java @@ -0,0 +1,65 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + + +/** + * 通知公告表 sys_notice + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_notice") +public class SysNotice extends TenantEntity { + + /** + * 公告ID + */ + @TableId(value = "notice_id") + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 角色id(0:所有 5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 接收单位(0:所有) + */ + private Integer unitId; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java new file mode 100644 index 0000000..41a8c59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@TableName("sys_oper_log") +public class SysOperLog implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @TableId(value = "oper_id") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java new file mode 100644 index 0000000..7fe7039 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 sys_post + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_post") +public class SysPost extends TenantEntity { + + /** + * 岗位序号 + */ + @TableId(value = "post_id") + private Long postId; + + /** + * 岗位编码 + */ + private String postCode; + + /** + * 岗位名称 + */ + private String postName; + + /** + * 岗位排序 + */ + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java new file mode 100644 index 0000000..1b262a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 角色表 sys_role + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +public class SysRole extends TenantEntity { + + /** + * 角色ID + */ + @TableId(value = "role_id") + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private Integer roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; + + public SysRole(Long roleId) { + this.roleId = roleId; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java new file mode 100644 index 0000000..ba77694 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和部门关联 sys_role_dept + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_dept") +public class SysRoleDept { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..ba28f17 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author Lion Li + */ + +@Data +@TableName("sys_role_menu") +public class SysRoleMenu { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java new file mode 100644 index 0000000..10f2936 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysSocial.java @@ -0,0 +1,136 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 社会化关系对象 sys_social + * + * @author thiszhc + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_social") +public class SysSocial extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java new file mode 100644 index 0000000..94e5230 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -0,0 +1,103 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 租户对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant") +public class SysTenant extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java new file mode 100644 index 0000000..5556d9f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -0,0 +1,56 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 租户套餐对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant_package") +public class SysTenantPackage extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @TableId(value = "package_id") + private Long packageId; + /** + * 套餐名称 + */ + private String packageName; + /** + * 关联菜单id + */ + private String menuIds; + /** + * 备注 + */ + private String remark; + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + /** + * 状态(0正常 1停用) + */ + private String status; + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java new file mode 100644 index 0000000..ccdc67c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUnitDomain.java @@ -0,0 +1,140 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 单位域名配置对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_unit_domain") +public class SysUnitDomain extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 域名地址 + */ + private String domainName; + + /** + * 站点名称 + */ + private String websiteName; + + /** + * 客服热线 + */ + private String hotline; + + /** + * 版权信息 + */ + private String copyright; + + /** + * 备案号 + */ + private String recordNo; + + /** + * 备案号链接地址 + */ + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + private String loginPageBanner; + + /** + * PC主页LOGO + */ + private String homePageLogo; + + /** + * 手机端LOGO + */ + private String wapLogo; + + /** + * 手机端广告图 + */ + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + private String weChatPub; + + /** + * 短信配置 + */ + private String smsConfig; + + /** + * 是否开通短信(0:否 1:是) + */ + private Integer openSms; + + /** + * PC登录协议 + */ + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + private String mobileUserAgreement; + + /** + * 私有协议 + */ + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 微信公众号配置 + */ + private String wxPubConfig; + + private String weChatThirdParams; + + private String weChatDomainName; + + private String signConfig; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java new file mode 100644 index 0000000..4748868 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -0,0 +1,179 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; + +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user") +public class SysUser extends TenantEntity { + + /** + * 用户ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别 + */ + private String sex; + + /** + * 用户头像 + */ + private Long avatar; + + /** + * 密码 + */ + @TableField( + insertStrategy = FieldStrategy.NOT_EMPTY, + updateStrategy = FieldStrategy.NOT_EMPTY, + whereStrategy = FieldStrategy.NOT_EMPTY + ) + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + @TableField(value = "role_id") + private Long curRoleId; + + @TableField(value = "role_name") + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:37 + * 说明:主体编码 + **/ + private String busNo; + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:38 + * 说明:角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + **/ + private Integer roleId; + + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + /** + * 是否支付密码(0:否 1:是) + */ + private Integer isResetPaypass; + + private String ids; + + private String roleName; + + public SysUser(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java new file mode 100644 index 0000000..ba2e00d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserMenu.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 角色和菜单关联对象 sys_user_menu + * + * @author LionLi + * @date 2024-04-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user_menu") +public class SysUserMenu extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 菜单ID + */ + private Long menuId; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java new file mode 100644 index 0000000..119c117 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和岗位关联 sys_user_post + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_post") +public class SysUserPost { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 岗位ID + */ + private Long postId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java new file mode 100644 index 0000000..0a50e80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和角色关联 sys_user_role + * + * @author Lion Li + */ + +@Data +@TableName("sys_user_role") +public class SysUserRole { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java new file mode 100644 index 0000000..f02b5bc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaBo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysArea; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 区域业务对象 sys_area + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysArea.class, reverseConvertGenerate = false) +public class SysAreaBo extends BaseEntity { + + /** + * 区域id + */ + @NotNull(message = "区域id不能为空", groups = { EditGroup.class }) + private Long areaId; + + /** + * 区域名 + */ + @NotBlank(message = "区域名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String areaName; + + /** + * 上级 + */ + @NotNull(message = "上级不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long up; + + /** + * 级别 + */ + @NotNull(message = "级别不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long level; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 区域code + */ + @NotBlank(message = "区域code不能为空", groups = { AddGroup.class, EditGroup.class }) + private String code; + + /** + * 1 可用/ 0 不可用 + */ + @NotNull(message = "1 可用/ 0 不可用不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 区域编码 + */ + @NotBlank(message = "区域编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String areaCode; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java new file mode 100644 index 0000000..82a9180 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysClientBo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysClient; + +import java.util.List; + +/** + * 授权管理业务对象 sys_client + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysClient.class, reverseConvertGenerate = false) +public class SysClientBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + @NotBlank(message = "客户端key不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientKey; + + /** + * 客户端秘钥 + */ + @NotBlank(message = "客户端秘钥不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientSecret; + + /** + * 授权类型 + */ + @NotNull(message = "授权类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java new file mode 100644 index 0000000..4affa64 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java @@ -0,0 +1,60 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysConfig; + +/** + * 参数配置业务对象 sys_config + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false) +public class SysConfigBo extends BaseEntity { + + /** + * 参数主键 + */ + private Long configId; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") + private String configName; + + /** + * 参数键名 + */ + @NotBlank(message = "参数键名不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") + private String configKey; + + /** + * 参数键值 + */ + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过{max}个字符") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java new file mode 100644 index 0000000..a5031d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -0,0 +1,70 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDept; + +/** + * 部门业务对象 sys_dept + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDept.class, reverseConvertGenerate = false) +public class SysDeptBo extends BaseEntity { + + /** + * 部门id + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过{max}个字符") + private String deptName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + @Size(min = 0, max = 11, message = "联系电话长度不能超过{max}个字符") + private String phone; + + /** + * 邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java new file mode 100644 index 0000000..042946c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictData; + +/** + * 字典数据业务对象 sys_dict_data + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictData.class, reverseConvertGenerate = false) +public class SysDictDataBo extends BaseEntity { + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过{max}个字符") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过{max}个字符") + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java new file mode 100644 index 0000000..cfc82de --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java @@ -0,0 +1,50 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysDictType; + +/** + * 字典类型业务对象 sys_dict_type + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictType.class, reverseConvertGenerate = false) +public class SysDictTypeBo extends BaseEntity { + + /** + * 字典主键 + */ + private Long dictId; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过{max}个字符") + private String dictName; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + private String dictType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java new file mode 100644 index 0000000..56ff41a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysIndustryBo.java @@ -0,0 +1,62 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.system.domain.SysIndustry; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 行业字典信息业务对象 sys_industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysIndustry.class, reverseConvertGenerate = false) +public class SysIndustryBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 名称 + */ + @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 父ID + */ + @NotNull(message = "父ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long parentId; + + /** + * 是否可用 1 是 0 否 + */ + @NotNull(message = "是否可用 1 是 0 否不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer isUse; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 级别 + */ + @NotNull(message = "级别不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer level; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java new file mode 100644 index 0000000..1cbe129 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java @@ -0,0 +1,87 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysLogininfor; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录业务对象 sys_logininfor + * + * @author Michelle.Chung + */ + +@Data +@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false) +public class SysLogininforBo { + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java new file mode 100644 index 0000000..3872696 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -0,0 +1,111 @@ +package org.dromara.system.domain.bo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysMenu; + +/** + * 菜单权限业务对象 sys_menu + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysMenu.class, reverseConvertGenerate = false) +public class SysMenuBo extends BaseEntity { + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 路由地址 + */ + @Size(min = 0, max = 200, message = "路由地址不能超过{max}个字符") + private String path; + + /** + * 组件路径 + */ + @Size(min = 0, max = 200, message = "组件路径不能超过{max}个字符") + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + @NotBlank(message = "菜单类型不能为空") + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + + private String useType; + + /** + * 权限标识 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @Size(min = 0, max = 100, message = "权限标识长度不能超过{max}个字符") + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java new file mode 100644 index 0000000..9310e80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysNotice; + +/** + * 通知公告业务对象 sys_notice + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysNotice.class, reverseConvertGenerate = false) +public class SysNoticeBo extends BaseEntity { + + /** + * 公告ID + */ + private Long noticeId; + + private Integer[] busRoles; + + /** + * 公告标题 + */ + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过{max}个字符") + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + private Long userId; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + private Integer busRole; //(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + + /** + * 备注 + */ + private String remark; + + /** + * 创建人名称 + */ + private String createByName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java new file mode 100644 index 0000000..407947c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java @@ -0,0 +1,127 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMappers; +import lombok.Data; +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.system.domain.SysOperLog; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录业务对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ + +@Data +@AutoMappers({ + @AutoMapper(target = SysOperLog.class, reverseConvertGenerate = false), + @AutoMapper(target = OperLogEvent.class) +}) +public class SysOperLogBo { + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java new file mode 100644 index 0000000..b93c39c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysPost; + +/** + * 岗位信息业务对象 sys_post + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysPost.class, reverseConvertGenerate = false) +public class SysPostBo extends BaseEntity { + + /** + * 岗位ID + */ + private Long postId; + + /** + * 岗位编码 + */ + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过{max}个字符") + private String postCode; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过{max}个字符") + private String postName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java new file mode 100644 index 0000000..0c8b4dc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -0,0 +1,94 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysRole; + +/** + * 角色信息业务对象 sys_role + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysRole.class, reverseConvertGenerate = false) +public class SysRoleBo extends BaseEntity { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") + private String roleName; + + /** + * 角色权限字符串 + */ + @NotBlank(message = "角色权限字符串不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") + private String roleKey; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + public SysRoleBo(Long roleId) { + this.roleId = roleId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java new file mode 100644 index 0000000..7784271 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -0,0 +1,142 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.system.domain.SysSocial; + +/** + * 社会化关系业务对象 sys_social + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false) +public class SysSocialBo extends TenantEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 的唯一ID + */ + @NotBlank(message = "的唯一ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String authId; + + /** + * 用户来源 + */ + @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class }) + private String source; + + /** + * 用户的授权令牌 + */ + @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class }) + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 平台唯一id + */ + private String openId; + + /** + * 用户的 ID + */ + @NotBlank(message = "用户的 ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java new file mode 100644 index 0000000..d98b3a8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java @@ -0,0 +1,114 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysTenant; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.util.Date; + +/** + * 租户业务对象 sys_tenant + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false) +public class SysTenantBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactUserName; + + /** + * 联系电话 + */ + @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactPhone; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String companyName; + + /** + * 用户名(创建系统用户) + */ + @NotBlank(message = "用户名不能为空", groups = { AddGroup.class }) + private String username; + + /** + * 密码(创建系统用户) + */ + @NotBlank(message = "密码不能为空", groups = { AddGroup.class }) + private String password; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class }) + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java new file mode 100644 index 0000000..9086f5c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java @@ -0,0 +1,60 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMapping; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysTenantPackage; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 租户套餐业务对象 sys_tenant_package + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenantPackage.class, reverseConvertGenerate = false) +public class SysTenantPackageBo extends BaseEntity { + + /** + * 租户套餐id + */ + @NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class }) + private Long packageId; + + /** + * 套餐名称 + */ + @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String packageName; + + /** + * 关联菜单id + */ + @AutoMapping(target = "menuIds", expression = "java(org.dromara.common.core.utils.StringUtils.join(source.getMenuIds(), \",\"))") + private Long[] menuIds; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java new file mode 100644 index 0000000..0b012a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUnitDomainBo.java @@ -0,0 +1,145 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 单位域名配置业务对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUnitDomain.class, reverseConvertGenerate = false) +public class SysUnitDomainBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 域名地址 + */ + @NotBlank(message = "域名地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String domainName; + + /** + * 站点名称 + */ + @NotBlank(message = "站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String websiteName; + + /** + * 客服热线 + */ + @NotBlank(message = "客服热线不能为空", groups = { AddGroup.class, EditGroup.class }) + private String hotline; + + /** + * 版权信息 + */ + @NotBlank(message = "版权信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyright; + + /** + * 备案号 + */ + @NotBlank(message = "备案号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String recordNo; + + /** + * 备案号链接地址 + */ + @NotBlank(message = "备案号链接地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @NotBlank(message = "PC登录页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @NotBlank(message = "PC登录页广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @NotBlank(message = "PC主页LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String homePageLogo; + + /** + * 手机端LOGO + */ + @NotBlank(message = "手机端LOGO不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapLogo; + + /** + * 手机端广告图 + */ + @NotBlank(message = "手机端广告图不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @NotBlank(message = "微信公众号站点名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String weChatPub; + + /** + * 短信配置 + */ + @NotBlank(message = "短信配置不能为空", groups = { AddGroup.class, EditGroup.class }) + private String smsConfig; + + /** + * PC登录协议 + */ + @NotBlank(message = "PC登录协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @NotBlank(message = "手机端用户协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @NotBlank(message = "私有协议不能为空", groups = { AddGroup.class, EditGroup.class }) + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @NotNull(message = "状态(1:正常 2:禁用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @NotNull(message = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @NotNull(message = "主体id(结算中心id或运营商id或渠道商id或商户id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long busId; + + + private String signConfig; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java new file mode 100644 index 0000000..a2f003a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -0,0 +1,145 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysUser; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUser.class, reverseConvertGenerate = false) +public class SysUserBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "操作员账号不能包含脚本字符") + @NotBlank(message = "操作员户账号不能为空") + @Size(min = 0, max = 30, message = "操作员账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "操作员名称不能包含脚本字符") + @NotBlank(message = "操作员名称不能为空") + @Size(min = 0, max = 30, message = "操作员名称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 密码 + */ + private String password; + + /** + * 确认密码 + */ + private String repwd; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 角色组 + */ +// @Size(min = 1, message = "用户角色不能为空") + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + + private String unitName; + + private String unitNo; + + private String ids; + + private Integer roleDataRange; + + private Long[] menuIds; + + + public SysUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + + private Integer isResetPaypass; +} + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java new file mode 100644 index 0000000..7b78b7c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserMenuBo.java @@ -0,0 +1,36 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysUserMenu; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 角色和菜单关联业务对象 sys_user_menu + * + * @author LionLi + * @date 2024-04-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysUserMenu.class, reverseConvertGenerate = false) +public class SysUserMenuBo extends BaseEntity { + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空", groups = { EditGroup.class }) + private Long userId; + + /** + * 菜单ID + */ + @NotNull(message = "菜单ID不能为空", groups = { EditGroup.class }) + private Long menuId; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java new file mode 100644 index 0000000..9c7cdc0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserPasswordBo.java @@ -0,0 +1,34 @@ +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户密码修改bo + */ +@Data +public class SysUserPasswordBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 旧密码 + */ + @NotBlank(message = "旧密码不能为空") + private String oldPassword; + + /** + * 新密码 + */ + @NotBlank(message = "新密码不能为空") + private String newPassword; + + + //确认密码 + private String surePwd; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java new file mode 100644 index 0000000..501107f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java @@ -0,0 +1,66 @@ +package org.dromara.system.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Size; + +/** + * 个人信息业务处理 + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java new file mode 100644 index 0000000..59e0009 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysClientVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.domain.vo.SysClientVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysClientVoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java new file mode 100644 index 0000000..852aaec --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysDictDataVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 字典数据转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysDictDataVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java new file mode 100644 index 0000000..a36b0ba --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysLogininforBoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 登录日志转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysLogininforBoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java new file mode 100644 index 0000000..1106bdf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysNoticeVoConvert.java @@ -0,0 +1,13 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysNoticeVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java new file mode 100644 index 0000000..5f17281 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysOperLogBoConvert.java @@ -0,0 +1,25 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 操作日志转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysOperLogBoConvert extends BaseMapper { + + /** + * RemoteOperLogBoToSysOperLogBo + * @param remoteOperLogBo 待转换对象 + * @return 转换后对象 + */ + @Mapping(target = "businessTypes", ignore = true) + SysOperLogBo convert(RemoteOperLogBo remoteOperLogBo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java new file mode 100644 index 0000000..97b4c12 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialBoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.domain.bo.SysSocialBo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 社交数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysSocialBoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java new file mode 100644 index 0000000..2d19ee7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysSocialVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 社交数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysSocialVoConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java new file mode 100644 index 0000000..e1c5cf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysTenantVoConvert.java @@ -0,0 +1,17 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 租户转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysTenantVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java new file mode 100644 index 0000000..9ff7dfc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainRemoteConvert.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUnitDomainRemoteConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java new file mode 100644 index 0000000..7eda7d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUnitDomainVoConvert.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 单位域名配置Convert接口 + * + * @author LionLi + * @date 2024-03-29 + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUnitDomainVoConvert extends BaseMapper { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java new file mode 100644 index 0000000..b0115f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserBoConvert.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; +import org.mapstruct.factory.Mappers; + +/** + * 用户信息转换器 + * @author zhujie + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUserBoConvert extends BaseMapper { + + /** + * RemoteUserBoToSysUserBo + * @param remoteUserBo 待转换对象 + * @return 转换后对象 + */ + @Mapping(target = "roleIds", ignore = true) + @Mapping(target = "postIds", ignore = true) + SysUserBo convert(RemoteUserBo remoteUserBo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java new file mode 100644 index 0000000..de25bc2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/convert/SysUserRemoteConvert.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.convert; + +import io.github.linpeilie.BaseMapper; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysClientVo; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +/** + * 客户端数据转换器 + * + * @author Michelle.Chung + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface SysUserRemoteConvert extends BaseMapper { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java new file mode 100644 index 0000000..79046ff --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java @@ -0,0 +1,24 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户头像信息 + * + * @author Michelle.Chung + */ +@Data +public class AvatarVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 头像地址 + */ + private String imgUrl; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java new file mode 100644 index 0000000..19a6b02 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java @@ -0,0 +1,28 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * 缓存监控列表信息 + * + * @author Michelle.Chung + */ +@Data +public class CacheListInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Properties info; + + private Long dbSize; + + private List> commandStats; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java new file mode 100644 index 0000000..e8d3b34 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java @@ -0,0 +1,31 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 角色部门列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class DeptTreeSelectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 选中部门列表 + */ + private List checkedKeys; + + /** + * 下拉树结构列表 + */ + private List> depts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java new file mode 100644 index 0000000..ad112fa --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java @@ -0,0 +1,31 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 角色菜单列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class MenuTreeSelectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 选中菜单列表 + */ + private List checkedKeys; + + /** + * 菜单下拉树结构列表 + */ + private List> menus; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..a7e2549 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; +import org.dromara.common.core.utils.StringUtils; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 路由显示信息 + * + * @author ruoyi + */ + +@Data +public class MetaVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) { + this.link = link; + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java new file mode 100644 index 0000000..f40cfb8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户个人信息 + * + * @author Michelle.Chung + */ +@Data +public class ProfileVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 用户所属角色组 + */ + private String roleGroup; + + /** + * 用户所属岗位组 + */ + private String postGroup; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..824e104 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 路由配置信息 + * + * @author Lion Li + */ +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java new file mode 100644 index 0000000..6a60c66 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaVo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysArea; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 区域视图对象 sys_area + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysArea.class) +public class SysAreaVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区域id + */ + @ExcelProperty(value = "区域id") + private Long areaId; + + /** + * 区域名 + */ + @ExcelProperty(value = "区域名") + private String areaName; + + /** + * 上级 + */ + @ExcelProperty(value = "上级") + private Long up; + + /** + * 级别 + */ + @ExcelProperty(value = "级别") + private Long level; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 区域code + */ + @ExcelProperty(value = "区域code") + private String code; + + /** + * 1 可用/ 0 不可用 + */ + @ExcelProperty(value = "1 可用/ 0 不可用") + private Integer isUse; + + /** + * 区域编码 + */ + @ExcelProperty(value = "区域编码") + private String areaCode; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java new file mode 100644 index 0000000..04d2842 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java @@ -0,0 +1,89 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysClient; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys_client + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysClient.class) +public class SysClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 客户端id + */ + @ExcelProperty(value = "客户端id") + private String clientId; + + /** + * 客户端key + */ + @ExcelProperty(value = "客户端key") + private String clientKey; + + /** + * 客户端秘钥 + */ + @ExcelProperty(value = "客户端秘钥") + private String clientSecret; + + /** + * 授权类型 + */ + @ExcelProperty(value = "授权类型") + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + @ExcelProperty(value = "token活跃超时时间") + private Long activeTimeout; + + /** + * token固定超时时间 + */ + @ExcelProperty(value = "token固定超时时间") + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java new file mode 100644 index 0000000..946f3df --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysConfig; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 参数配置视图对象 sys_config + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysConfig.class) +public class SysConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 参数主键 + */ + @ExcelProperty(value = "参数主键") + private Long configId; + + /** + * 参数名称 + */ + @ExcelProperty(value = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @ExcelProperty(value = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @ExcelProperty(value = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String configType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java new file mode 100644 index 0000000..a1ba194 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -0,0 +1,96 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDept; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 部门视图对象 sys_dept + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDept.class) +public class SysDeptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 父部门id + */ + private Long parentId; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人ID + */ + private Long leader; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String leaderName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String phone; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java new file mode 100644 index 0000000..cd84881 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -0,0 +1,88 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDictData; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictData.class) +public class SysDictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + @ExcelProperty(value = "字典编码") + private Long dictCode; + + /** + * 字典排序 + */ + @ExcelProperty(value = "字典排序") + private Integer dictSort; + + /** + * 字典标签 + */ + @ExcelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典键值 + */ + @ExcelProperty(value = "字典键值") + private String dictValue; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String isDefault; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java new file mode 100644 index 0000000..1b1f95a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -0,0 +1,57 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysDictType; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典类型视图对象 sys_dict_type + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictType.class) +public class SysDictTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + @ExcelProperty(value = "字典主键") + private Long dictId; + + /** + * 字典名称 + */ + @ExcelProperty(value = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java new file mode 100644 index 0000000..98c07f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysIndustryVo.java @@ -0,0 +1,68 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysIndustry; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 行业字典信息视图对象 sys_industry + * + * @author LionLi + * @date 2024-04-18 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysIndustry.class) +public class SysIndustryVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 名称 + */ + @ExcelProperty(value = "名称") + private String name; + + /** + * 父ID + */ + @ExcelProperty(value = "父ID") + private Long parentId; + + /** + * 是否可用 1 是 0 否 + */ + @ExcelProperty(value = "是否可用 1 是 0 否") + private Integer isUse; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 级别 + */ + @ExcelProperty(value = "级别") + private Integer level; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java new file mode 100644 index 0000000..7ec7047 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -0,0 +1,106 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysLogininfor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 系统访问记录视图对象 sys_logininfor + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysLogininfor.class) +public class SysLogininforVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + @ExcelProperty(value = "序号") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "用户账号") + private String userName; + + /** + * 客户端 + */ + @ExcelProperty(value = "客户端") + private String clientKey; + + /** + * 设备类型 + */ + @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_device_type") + private String deviceType; + + /** + * 登录状态(0成功 1失败) + */ + @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private String status; + + /** + * 登录IP地址 + */ + @ExcelProperty(value = "登录地址") + private String ipaddr; + + /** + * 登录地点 + */ + @ExcelProperty(value = "登录地点") + private String loginLocation; + + /** + * 浏览器类型 + */ + @ExcelProperty(value = "浏览器") + private String browser; + + /** + * 操作系统 + */ + @ExcelProperty(value = "操作系统") + private String os; + + + /** + * 提示消息 + */ + @ExcelProperty(value = "提示消息") + private String msg; + + /** + * 访问时间 + */ + @ExcelProperty(value = "访问时间") + private Date loginTime; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java new file mode 100644 index 0000000..e01ad21 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -0,0 +1,118 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysMenu; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 菜单权限视图对象 sys_menu + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysMenu.class) +public class SysMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 创建部门 + */ + private Long createDept; + + private String useType; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 子菜单 + */ + private List children = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java new file mode 100644 index 0000000..348a18d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java @@ -0,0 +1,89 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysNotice; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 通知公告视图对象 sys_notice + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysNotice.class) +public class SysNoticeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + private Integer isRead; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 角色id(0:所有 5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 接收单位(0:所有) + */ + private Integer unitId; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java new file mode 100644 index 0000000..145e11c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java @@ -0,0 +1,144 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysOperLog; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 操作日志记录视图对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysOperLog.class) +public class SysOperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @ExcelProperty(value = "日志主键") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + @ExcelProperty(value = "操作模块") + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_oper_type") + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + @ExcelProperty(value = "请求方法") + private String method; + + /** + * 请求方式 + */ + @ExcelProperty(value = "请求方式") + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** + * 操作人员 + */ + @ExcelProperty(value = "操作人员") + private String operName; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 请求URL + */ + @ExcelProperty(value = "请求地址") + private String operUrl; + + /** + * 主机地址 + */ + @ExcelProperty(value = "操作地址") + private String operIp; + + /** + * 操作地点 + */ + @ExcelProperty(value = "操作地点") + private String operLocation; + + /** + * 请求参数 + */ + @ExcelProperty(value = "请求参数") + private String operParam; + + /** + * 返回参数 + */ + @ExcelProperty(value = "返回参数") + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") + private Integer status; + + /** + * 错误消息 + */ + @ExcelProperty(value = "错误消息") + private String errorMsg; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date operTime; + + /** + * 消耗时间 + */ + @ExcelProperty(value = "消耗时间") + private Long costTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java new file mode 100644 index 0000000..e3ad4cc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -0,0 +1,73 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysPost; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 岗位信息视图对象 sys_post + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysPost.class) +public class SysPostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @ExcelProperty(value = "岗位序号") + private Long postId; + + /** + * 岗位编码 + */ + @ExcelProperty(value = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @ExcelProperty(value = "岗位名称") + private String postName; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "岗位排序") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java new file mode 100644 index 0000000..ce8442c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -0,0 +1,100 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysRole; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 角色信息视图对象 sys_role + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysRole.class) +public class SysRoleVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @ExcelProperty(value = "角色序号") + private Long roleId; + + /** + * 角色名称 + */ + @ExcelProperty(value = "角色名称") + private String roleName; + + /** + * 角色权限字符串 + */ + @ExcelProperty(value = "角色权限") + private String roleKey; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "角色排序") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + @ExcelProperty(value = "部门树选择项是否关联显示") + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java new file mode 100644 index 0000000..1c029fe --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -0,0 +1,144 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysSocial; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 社会化关系视图对象 sys_social + * + * @author thiszhc + */ +@Data +@AutoMapper(target = SysSocial.class) +public class SysSocialVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + /** + * 显示绑定时间 + */ + private Date createTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java new file mode 100644 index 0000000..a413d63 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -0,0 +1,66 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenantPackage; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户套餐视图对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenantPackage.class) +public class SysTenantPackageVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @ExcelProperty(value = "租户套餐id") + private Long packageId; + + /** + * 套餐名称 + */ + @ExcelProperty(value = "套餐名称") + private String packageName; + + /** + * 关联菜单id + */ + @ExcelProperty(value = "关联菜单id") + private String menuIds; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java new file mode 100644 index 0000000..90502da --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenant; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenant.class) +public class SysTenantVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 租户编号 + */ + @ExcelProperty(value = "租户编号") + private String tenantId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUserName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactPhone; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String companyName; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String licenseNumber; + + /** + * 地址 + */ + @ExcelProperty(value = "地址") + private String address; + + /** + * 域名 + */ + @ExcelProperty(value = "域名") + private String domain; + + /** + * 企业简介 + */ + @ExcelProperty(value = "企业简介") + private String intro; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 租户套餐编号 + */ + @ExcelProperty(value = "租户套餐编号") + private Long packageId; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + @ExcelProperty(value = "用户数量") + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java new file mode 100644 index 0000000..5cab4aa --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUnitDomainVo.java @@ -0,0 +1,173 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.dromara.system.domain.SysUnitDomain; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 单位域名配置视图对象 sys_unit_domain + * + * @author LionLi + * @date 2024-03-29 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUnitDomain.class) +public class SysUnitDomainVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 域名地址 + */ + @ExcelProperty(value = "域名地址") + private String domainName; + + /** + * 站点名称 + */ + @ExcelProperty(value = "站点名称") + private String websiteName; + + /** + * 客服热线 + */ + @ExcelProperty(value = "客服热线") + private String hotline; + + /** + * 版权信息 + */ + @ExcelProperty(value = "版权信息") + private String copyright; + + /** + * 备案号 + */ + @ExcelProperty(value = "备案号") + private String recordNo; + + /** + * 备案号链接地址 + */ + @ExcelProperty(value = "备案号链接地址") + private String copyrightUrl; + + /** + * PC登录页LOGO + */ + @ExcelProperty(value = "PC登录页LOGO") + private String loginPageLogo; + + /** + * PC登录页广告图 + */ + @ExcelProperty(value = "PC登录页广告图") + private String loginPageBanner; + + /** + * PC主页LOGO + */ + @ExcelProperty(value = "PC主页LOGO") + private String homePageLogo; + + /** + * 手机端LOGO + */ + @ExcelProperty(value = "手机端LOGO") + private String wapLogo; + + /** + * 手机端广告图 + */ + @ExcelProperty(value = "手机端广告图") + private String wapBanner; + + /** + * 微信公众号站点名称 + */ + @ExcelProperty(value = "微信公众号站点名称") + private String weChatPub; + + /** + * 短信配置 + */ + @JsonIgnore + private String smsConfig; + + /** + * 是否开通短信(0:否 1:是) + */ + private Integer openSms; + + /** + * PC登录协议 + */ + @ExcelProperty(value = "PC登录协议") + private String pcLoginProtocol; + + /** + * 手机端用户协议 + */ + @ExcelProperty(value = "手机端用户协议") + private String mobileUserAgreement; + + /** + * 私有协议 + */ + @ExcelProperty(value = "私有协议") + private String privacyAgreement; + + /** + * 状态(1:正常 2:禁用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:正常,2=:禁用") + private Integer status; + + /** + * 角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户) + */ + @ExcelProperty(value = "角色id(5:平台 6:服务商 7:运营商 8:代理商 9:商户)") + private Long busRole; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + @ExcelProperty(value = "主体id(结算中心id或运营商id或渠道商id或商户id)") + private Long busId; + + /** + * 微信公众号配置 + */ + @JsonIgnore + private String wxPubConfig; + + + @JsonIgnore + private String weChatThirdParams; + + @JsonIgnore + private String weChatDomainName; + + @JsonIgnore + private String signConfig; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java new file mode 100644 index 0000000..a1448f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -0,0 +1,99 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.ReverseAutoMapping; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户对象导出VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@AutoMapper(target = SysUserVo.class, convertGenerate = false) +public class SysUserExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 最后登录IP + */ + @ExcelProperty(value = "最后登录IP") + private String loginIp; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date loginDate; + + /** + * 部门名称 + */ + @ReverseAutoMapping(target = "deptName", source = "dept.deptName") + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 负责人 + */ + @ReverseAutoMapping(target = "leaderName", source = "dept.leaderName") + @ExcelProperty(value = "部门负责人") + private String leaderName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java new file mode 100644 index 0000000..d3ac159 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -0,0 +1,77 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户对象导入VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 +public class SysUserImportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门编号") + private Long deptId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java new file mode 100644 index 0000000..2525c89 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java @@ -0,0 +1,45 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户信息 + * + * @author Michelle.Chung + */ +@Data +public class SysUserInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 角色ID列表 + */ + private List roleIds; + + /** + * 角色列表 + */ + private List roles; + + /** + * 岗位ID列表 + */ + private List postIds; + + /** + * 岗位列表 + */ + private List posts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java new file mode 100644 index 0000000..d5dfe72 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserMenuVo.java @@ -0,0 +1,44 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysUserMenu; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 角色和菜单关联视图对象 sys_user_menu + * + * @author LionLi + * @date 2024-04-30 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysUserMenu.class) +public class SysUserMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户ID") + private Long userId; + + /** + * 菜单ID + */ + @ExcelProperty(value = "菜单ID") + private Long menuId; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java new file mode 100644 index 0000000..00a65f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -0,0 +1,203 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysUser; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysUser.class) +public class SysUserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + @Translation(type = TransConstant.OSS_ID_TO_URL) + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 是否登录过(0:否 1:是) + */ + private Integer loginFirst; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 部门对象 + */ + private SysDeptVo dept; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID(作废) + */ + private Integer roleId; + + + /** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-20 14:37 + * 说明:主体编码 + **/ + private String busNo; + + + + + + + private Long curRoleId; + + private String curRoleName; + + /** + * 主体id(结算中心id或运营商id或渠道商id或商户id) + */ + private Long busId; + + /** + * 权限范围(1:角色 2:个人) + */ + private Integer roleDataRange; + + /** + * 登录验证方式(1:短信 2:微信) + */ + private Integer loginType; + + /** + * 绑定微信open_id + */ + private String bindOpenId; + + /** + * 是否阅读平台使用协议(0:否 1:是) + */ + private Integer isReadProt; + + /** + * 是否重置密码(0:否 1:是) + */ + private Integer isResetPass; + + + private Integer isResetPaypass; + + private String unitName; + + private String unitNo; + + private String ids; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java new file mode 100644 index 0000000..0606d26 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Set; + +/** + * 登录用户信息 + * + * @author Michelle.Chung + */ +@Data +public class UserInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户基本信息 + */ + private SysUserVo user; + + /** + * 菜单权限 + */ + private Set permissions; + + /** + * 角色权限 + */ + private Set roles; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java new file mode 100644 index 0000000..b03dce2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteClientServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteClientService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.service.ISysClientService; +import org.springframework.stereotype.Service; + +/** + * 客户端服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteClientServiceImpl implements RemoteClientService { + + private final ISysClientService sysClientService; + + /** + * 根据客户端id获取客户端详情 + */ + @Override + public RemoteClientVo queryByClientId(String clientId) { + SysClientVo vo = sysClientService.queryByClientId(clientId); + return MapstructUtils.convert(vo, RemoteClientVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java new file mode 100644 index 0000000..3fe0edf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java @@ -0,0 +1,49 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteConfigService; +import org.dromara.system.api.domain.RemoteSysUnitDomainVo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUnitDomainService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 配置服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteConfigServiceImpl implements RemoteConfigService { + + private static final Logger log = LoggerFactory.getLogger(RemoteConfigServiceImpl.class); + private final ISysConfigService configService; + + private final ISysUnitDomainService sysUnitDomainService; + + /** + * 获取注册开关 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + return configService.selectRegisterEnabled(tenantId); + } + + @Override + public RemoteSysUnitDomainVo queryByDomainName(String domain) { + log.info("查询域名信息"+domain+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + SysUnitDomainVo vo = sysUnitDomainService.queryByDomainName(domain); + log.info("查询域名信息"+vo+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + RemoteSysUnitDomainVo domainVo = MapstructUtils.convert(vo, RemoteSysUnitDomainVo.class); + log.info("查询域名信息"+domainVo+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + domainVo.setWeChatThirdParams(vo.getWeChatThirdParams()); + return vo != null ? domainVo: null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java new file mode 100644 index 0000000..ea59a99 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java @@ -0,0 +1,60 @@ +package org.dromara.system.dubbo; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.system.api.RemoteDataScopeService; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 数据权限 实现 + *

+ * 注意: 此Service内不允许调用标注`数据权限`注解的方法 + * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteDataScopeServiceImpl implements RemoteDataScopeService { + + private final SysRoleDeptMapper roleDeptMapper; + private final SysDeptMapper deptMapper; + + @Override + public String getRoleCustom(Long roleId) { + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); + } + return null; + } + + @Override + public String getDeptAndChild(Long deptId) { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(deptId); + if (CollUtil.isNotEmpty(ids)) { + return StreamUtils.join(ids, Convert::toStr); + } + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java new file mode 100644 index 0000000..bc9a466 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java @@ -0,0 +1,25 @@ +package org.dromara.system.dubbo; + +import org.dromara.system.api.RemoteDeptService; +import org.dromara.system.service.ISysDeptService; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Service; + +/** + * 部门服务 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteDeptServiceImpl implements RemoteDeptService { + + private final ISysDeptService sysDeptService; + + @Override + public String selectDeptNameByIds(String deptIds) { + return sysDeptService.selectDeptNameByIds(deptIds); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java new file mode 100644 index 0000000..10f9dff --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java @@ -0,0 +1,33 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典服务 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteDictServiceImpl implements RemoteDictService { + + private final ISysDictTypeService sysDictTypeService; + + + @Override + public List selectDictDataByType(String dictType) { + List list = sysDictTypeService.selectDictDataByType(dictType); + return MapstructUtils.convert(list, RemoteDictDataVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java new file mode 100644 index 0000000..fd2a69e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java @@ -0,0 +1,39 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteLogService; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.service.ISysLogininforService; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.stereotype.Service; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteLogServiceImpl implements RemoteLogService { + + private final ISysOperLogService operLogService; + private final ISysLogininforService logininforService; + + @Override + public void saveLog(RemoteOperLogBo remoteOperLogBo) { + SysOperLogBo sysOperLogBo = MapstructUtils.convert(remoteOperLogBo, SysOperLogBo.class); + operLogService.insertOperlog(sysOperLogBo); + } + + @Override + public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) { + SysLogininforBo sysLogininforBo = MapstructUtils.convert(remoteLogininforBo, SysLogininforBo.class); + logininforService.insertLogininfor(sysLogininforBo); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java new file mode 100644 index 0000000..6c6b24a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteNoticeServiceImpl.java @@ -0,0 +1,37 @@ +package org.dromara.system.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteLogService; +import org.dromara.system.api.RemoteNoticeService; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.api.domain.vo.RemoteSysNoticeVo; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.mapper.SysNoticeMapper; +import org.dromara.system.service.ISysLogininforService; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.stereotype.Service; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteNoticeServiceImpl implements RemoteNoticeService { + private final SysNoticeMapper noticeMapper; + + @Override + public void addNotice(RemoteSysNoticeVo noticeVo) { + SysNotice add =BeanUtil.copyProperties(noticeVo,SysNotice.class); +// SysNotice add = MapstructUtils.convert(noticeVo,SysNotice.class); + noticeMapper.insert(add); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java new file mode 100644 index 0000000..b2b587c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteOrderNumServiceImpl.java @@ -0,0 +1,37 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.system.api.RemoteOrderNumService; +import org.dromara.system.service.IOrderNum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author sunzexing + * @version 1.0 + * @title RemoteOrderNumServiceImpl + * @description + * @create 2024-07-16 14:57 + */ + +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteOrderNumServiceImpl implements RemoteOrderNumService { + + + + @Autowired + private IOrderNum orderNum; + + @Override + public Long getOrderNum(String bpmType, int size){ + try{ + return this.orderNum.getOrderLongNum(bpmType,size); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java new file mode 100644 index 0000000..3ddef24 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSocialServiceImpl.java @@ -0,0 +1,63 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteSocialService; +import org.dromara.system.api.domain.bo.RemoteSocialBo; +import org.dromara.system.api.domain.vo.RemoteSocialVo; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.mapper.SysSocialMapper; +import org.dromara.system.service.ISysSocialService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 社会化关系服务 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSocialServiceImpl implements RemoteSocialService { + + private final ISysSocialService sysSocialService; + private final SysSocialMapper sysSocialMapper; + + /** + * 根据 authId 查询用户信息 + */ + @Override + public List selectByAuthId(String authId) { + List list = sysSocialService.selectByAuthId(authId); + return MapstructUtils.convert(list, RemoteSocialVo.class); + } + + /** + * 保存社会化关系 + */ + @Override + public void insertByBo(RemoteSocialBo bo) { + sysSocialService.insertByBo(MapstructUtils.convert(bo, SysSocialBo.class)); + } + + /** + * 更新社会化关系 + */ + @Override + public void updateByBo(RemoteSocialBo bo) { + sysSocialService.updateByBo(MapstructUtils.convert(bo, SysSocialBo.class)); + } + + /** + * 删除社会化关系 + */ + @Override + public Boolean deleteWithValidById(Long socialId) { + return sysSocialService.deleteWithValidById(socialId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java new file mode 100644 index 0000000..7dc5839 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java @@ -0,0 +1,43 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author zhujie + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteTenantServiceImpl implements RemoteTenantService { + + private final ISysTenantService tenantService; + + /** + * 根据租户id获取租户详情 + */ + @Override + public RemoteTenantVo queryByTenantId(String tenantId) { + SysTenantVo vo = tenantService.queryByTenantId(tenantId); + return MapstructUtils.convert(vo, RemoteTenantVo.class); + } + + /** + * 获取租户列表 + */ + @Override + public List queryList() { + List list = tenantService.queryList(new SysTenantBo()); + return MapstructUtils.convert(list, RemoteTenantVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java new file mode 100644 index 0000000..788ff369 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -0,0 +1,263 @@ +package org.dromara.system.dubbo; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteSysUserVo; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.api.model.RoleDTO; +import org.dromara.system.api.model.XcxLoginUser; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysPermissionService; +import org.dromara.system.service.ISysUserService; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 用户服务 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteUserServiceImpl implements RemoteUserService { + + private final ISysUserService userService; + private final ISysPermissionService permissionService; + private final ISysConfigService configService; + private final SysUserMapper userMapper; + + @Override + public LoginUser getUserInfo(String username, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserName, SysUser::getStatus) + .eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", username); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", username); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByUserName(username)); + }); + } + + @Override + public LoginUser getUserInfo(Long userId, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserName, SysUser::getStatus) + .eq(SysUser::getUserId, userId)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", ""); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", sysUser.getUserName()); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByUserName(sysUser.getUserName())); + }); + } + + @Override + public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getPhonenumber, SysUser::getStatus) + .eq(SysUser::getPhonenumber, phonenumber)); + if (ObjectUtil.isNull(sysUser)) { + throw new UserException("user.not.exists", phonenumber); + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + throw new UserException("user.blocked", phonenumber); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByPhonenumber(phonenumber)); + }); + } + + @Override + public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException { + return TenantHelper.dynamic(tenantId, () -> { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getEmail, SysUser::getStatus) + .eq(SysUser::getEmail, email)); + if (ObjectUtil.isNull(user)) { + throw new UserException("user.not.exists", email); + } + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + throw new UserException("user.blocked", email); + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return buildLoginUser(userMapper.selectUserByEmail(email)); + }); + } + + @Override + public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException { + // todo 自行实现 userService.selectUserByOpenid(openid); + SysUser sysUser = new SysUser(); + if (ObjectUtil.isNull(sysUser)) { + // todo 用户不存在 业务逻辑自行实现 + } + if (UserStatus.DISABLE.getCode().equals(sysUser.getStatus())) { + // todo 用户已被停用 业务逻辑自行实现 + } + // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + XcxLoginUser loginUser = new XcxLoginUser(); + loginUser.setUserId(sysUser.getUserId()); + loginUser.setUsername(sysUser.getUserName()); + loginUser.setNickname(sysUser.getNickName()); + loginUser.setUserType(sysUser.getUserType()); + loginUser.setOpenid(openid); + return loginUser; + } + + @Override + public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException { + SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class); + String username = sysUserBo.getUserName(); + boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { + throw new ServiceException("当前系统没有开启注册功能"); + } + return userMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, sysUserBo.getUserName()) + .ne(ObjectUtil.isNotNull(sysUserBo.getUserId()), SysUser::getUserId, sysUserBo.getUserId())); + }); + if (exist) { + throw new UserException("user.register.save.error", username); + } + return userService.registerUser(sysUserBo, remoteUserBo.getTenantId()); + } + + @Override + public String selectUserNameById(Long userId) { + return userService.selectUserNameById(userId); + } + + @Override + public String selectNicknameById(Long userId) { + return userService.selectNicknameById(userId); + } + + /** + * 构建登录用户 + */ + private LoginUser buildLoginUser(SysUserVo userVo) { + LoginUser loginUser = new LoginUser(); + loginUser.setTenantId(userVo.getTenantId()); + loginUser.setUserId(userVo.getUserId()); + loginUser.setDeptId(userVo.getDeptId()); + loginUser.setUsername(userVo.getUserName()); + loginUser.setNickname(userVo.getNickName()); + loginUser.setPassword(userVo.getPassword()); + loginUser.setUserType(userVo.getUserType()); + loginUser.setPhonenumber(userVo.getPhonenumber()); + loginUser.setCurRoleId(userVo.getCurRoleId()); + loginUser.setCurRoleName(userVo.getCurRoleName()); + loginUser.setRoleDataRange(userVo.getRoleDataRange()); + loginUser.setBusId(userVo.getBusId()); + loginUser.setBusNo(userVo.getBusNo()); + loginUser.setBusRole(userVo.getCurRoleId() != null ? userVo.getCurRoleId().intValue() : null); + loginUser.setIds(userVo.getIds()); + loginUser.setBindOpenId(userVo.getBindOpenId()); + loginUser.setMenuPermission(permissionService.getMenuPermission(userVo.getUserId())); + loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId())); + loginUser.setDeptName(ObjectUtil.isNull(userVo.getDept()) ? "" : userVo.getDept().getDeptName()); + List roles = BeanUtil.copyToList(userVo.getRoles(), RoleDTO.class); + loginUser.setRoles(roles); + return loginUser; + } + + /** + * 更新用户信息 + * + * @param userId 用户ID + * @param ip IP地址 + */ + @Override + public void recordLoginInfo(Long userId, String ip) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(ip); + sysUser.setLoginDate(DateUtils.getNowDate()); + sysUser.setUpdateBy(userId); + DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); + } + + @Override + public int insertBusUser(RemoteUserBo userBo) { + + SysUser sysUser = new SysUser(); + sysUser.setUserName(userBo.getUserName()); + sysUser.setRoleId(userBo.getRoleId()); + sysUser.setNickName(userBo.getNickName()); + sysUser.setUserType(userBo.getUserType()); + sysUser.setBusNo(userBo.getBusNo()); + sysUser.setBusId(userBo.getBusId()); + sysUser.setRoleId(userBo.getRoleId()); + sysUser.setCurRoleName(userBo.getRoleName()); + sysUser.setPhonenumber(userBo.getPhonenumber()); + sysUser.setPassword(userBo.getPassword()); + sysUser.setStatus("0"); + sysUser.setDelFlag("0"); + sysUser.setCreateBy(userBo.getCreateBy()); + sysUser.setCreateTime(userBo.getCreateTime()); + return this.userService.insertBusUser(sysUser); + } + + @Override + public int updateUserResetPayTag(Long userId) { + SysUser sysUserBo = new SysUser(); + sysUserBo.setUserId(userId); + sysUserBo.setIsResetPaypass(1); + sysUserBo.setUpdateTime(new Date()); + sysUserBo.setUpdateBy(userId); + return this.userService.updateUserInfos(sysUserBo); + } + + @Override + public RemoteSysUserVo selectUserByName(String userName) { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getStatus, 0) + .eq(SysUser::getDelFlag, 0) + .eq(SysUser::getUserName, userName)); + return sysUser != null ? MapstructUtils.convert(sysUser, RemoteSysUserVo.class) : null; + } + + @Override + public RemoteSysUserVo selectUserById(long userId) { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getStatus, 0) + .eq(SysUser::getDelFlag, 0) + .eq(SysUser::getUserId, userId)); + return sysUser != null ? MapstructUtils.convert(sysUser, RemoteSysUserVo.class) : null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java new file mode 100644 index 0000000..9cd144d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -0,0 +1,119 @@ +package org.dromara.system.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { + + private final ISysUserService userService; + + private final String password; + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public SysUserImportListener(Boolean isUpdateSupport) { + String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); + this.userService = SpringUtils.getBean(ISysUserService.class); + this.password = BCrypt.hashpw(initPassword); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(SysUserImportVo userVo, AnalysisContext context) { + SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName()); + try { + // 验证是否存在这个用户 + if (ObjectUtil.isNull(sysUser)) { + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + ValidatorUtils.validate(user); + user.setPassword(password); + user.setCreateBy(operUserId); + userService.insertUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); + } else if (isUpdateSupport) { + Long userId = sysUser.getUserId(); + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); + user.setUserId(userId); + ValidatorUtils.validate(user); + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(operUserId); + userService.updateUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + userVo.getUserName() + " 导入失败:"; + failureMsg.append(msg).append(e.getMessage()); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java new file mode 100644 index 0000000..f8e3237 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommonMapper.java @@ -0,0 +1,29 @@ +package org.dromara.system.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.system.domain.BpmOrderNum; + +import java.util.List; +import java.util.Map; + +/** + * 公共接口服务接口 + * + * @author wuchuang + * @since 2023-12-04 17:44:28 + */ +public interface CommonMapper { + + + + + public int insertIntoOrderNum(BpmOrderNum orderNum); + + + public int updateOrderNumByProName(BpmOrderNum orderNum); + + + public BpmOrderNum selectOrderNumByBpmDefInfo(BpmOrderNum orderNum); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java new file mode 100644 index 0000000..f3f0dcc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysArea; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 区域Mapper接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface SysAreaMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java new file mode 100644 index 0000000..a8943de --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysClientMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.vo.SysClientVo; + +/** + * 授权管理Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysClientMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..0eaaee8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.vo.SysConfigVo; + +/** + * 参数配置 数据层 + * + * @author Lion Li + */ +public interface SysConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..45ad77e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -0,0 +1,46 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.vo.SysDeptVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author Lion Li + */ +public interface SysDeptMapper extends BaseMapperPlus { + + /** + * 查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + SysDeptVo selectDeptById(Long deptId); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..c2f1a7c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java @@ -0,0 +1,23 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictDataMapper extends BaseMapperPlus { + + default List selectDictDataByType(String dictType) { + return selectVoList( + new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType) + .orderByAsc(SysDictData::getDictSort)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..9a9bdd5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysDictType; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.vo.SysDictTypeVo; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +public interface SysDictTypeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java new file mode 100644 index 0000000..6a3da3a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysIndustryMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 行业字典信息Mapper接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface SysIndustryMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..85edd1d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.vo.SysLogininforVo; + +/** + * 系统访问日志情况信息 数据层 + * + * @author Lion Li + */ +public interface SysLogininforMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..6cad9de --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -0,0 +1,94 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.system.domain.SysMenu; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.vo.SysMenuVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单表 数据层 + * + * @author Lion Li + */ +public interface SysMenuMapper extends BaseMapperPlus { + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @param queryWrapper 查询条件 + * @return 菜单列表 + */ + List selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + List selectMenuListByUserIdNew(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + List selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + default List selectMenuTreeAll() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .in(SysMenu::getMenuType, UserConstants.TYPE_DIR, UserConstants.TYPE_MENU) + .eq(SysMenu::getStatus, UserConstants.MENU_NORMAL) + .apply("FIND_IN_SET({0}, use_type) > 0", BusRole.PLATFORM.getId()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum); + return this.selectList(lqw); + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + List selectMenuTreeByUserIdNew(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + + List selectOperMenuListByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..ef49a32 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java @@ -0,0 +1,30 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; + +/** + * 通知公告表 数据层 + * + * @author Lion Li + */ +public interface SysNoticeMapper extends BaseMapperPlus { + + Page selectPageNoticeListByUser(@Param("page") Page build, + @Param("ew") QueryWrapper lqw, + @Param("userId") Long userId); + + + int selectNoticeReadByUser(@Param("userId") Long userId, @Param("noticeId") Long noticeId); + + void insertNoticeRead(@Param("userId") Long userId, @Param("noticeId") Long noticeId); + + void insertNoticeRole(@Param("noticeId") Long noticeId, @Param("busRoles") Integer[] busRoles); + + void deleteNoticeRole(@Param("noticeId") Long noticeId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..5d20404 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.vo.SysOperLogVo; + +/** + * 操作日志 数据层 + * + * @author Lion Li + */ +public interface SysOperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..48e6a12 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -0,0 +1,32 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 数据层 + * + * @author Lion Li + */ +public interface SysPostMapper extends BaseMapperPlus { + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + List selectPostsByUserName(String userName); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..3de0bb6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleDeptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..55ca769 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -0,0 +1,71 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.vo.SysRoleVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询角色数据 + * + * @param queryWrapper 查询条件 + * @return 角色数据集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + List selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + SysRoleVo selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolePermissionByUserId(Long userId); + + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + List selectRolesByUserName(String userName); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..0a657b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysRoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author Lion Li + */ +public interface SysRoleMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java new file mode 100644 index 0000000..b942061 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysSocialMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysSocial; +import org.dromara.system.domain.vo.SysSocialVo; + +/** + * 社会化关系Mapper接口 + * + * @author thiszhc + */ +public interface SysSocialMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java new file mode 100644 index 0000000..7e1167a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 租户Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java new file mode 100644 index 0000000..10ca170 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.vo.SysTenantPackageVo; + +/** + * 租户套餐Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantPackageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java new file mode 100644 index 0000000..16e4b27 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUnitDomainMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 单位域名配置Mapper接口 + * + * @author LionLi + * @date 2024-03-29 + */ +public interface SysUnitDomainMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..773a4d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -0,0 +1,130 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.annotation.DataColumn; +import org.dromara.common.mybatis.annotation.DataPermission; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author Lion Li + */ +public interface SysUserMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询用户列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + SysUserVo selectUserByPhonenumber(String phonenumber); + + /** + * 通过邮箱查询用户 + * + * @param email 邮箱 + * @return 用户对象信息 + */ + SysUserVo selectUserByEmail(String email); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + SysUserVo selectUserById(Long userId); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int update(@Param(Constants.ENTITY) SysUser user, @Param(Constants.WRAPPER) Wrapper updateWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) SysUser user); + + + /*** + * 子操作员管理 + * @param page + * @param queryWrapper + * @return + */ + Page selNewUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /*** + * 更新用户绑定openid + * @param user + * @return + */ + int updateBindUserOpenid(SysUser user); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java new file mode 100644 index 0000000..31eabe0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMenuMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysUserMenu; +import org.dromara.system.domain.vo.SysUserMenuVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 角色和菜单关联Mapper接口 + * + * @author LionLi + * @date 2024-04-30 + */ +public interface SysUserMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..07c1371 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserPostMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..e2f706c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,17 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysUserRole; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author Lion Li + */ +public interface SysUserRoleMapper extends BaseMapperPlus { + + List selectUserIdsByRoleId(Long roleId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java new file mode 100644 index 0000000..65511ca --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IOrderNum.java @@ -0,0 +1,16 @@ +package org.dromara.system.service; + +/****************** + * + * 流程工单号生成接口 + * + * @author Administrator + */ +public interface IOrderNum { + + public String getOrderNum(String bpmType,int size ) throws Exception; + + + + public Long getOrderLongNum(String bpmType,int size )throws Exception; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java new file mode 100644 index 0000000..02e73f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaService.java @@ -0,0 +1,55 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SysArea; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.system.domain.bo.SysAreaBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 区域Service接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface ISysAreaService { + + + + + + /** + * 查询区域 + */ + SysAreaVo queryById(Long areaId); + + /** + * 查询区域列表 + */ + TableDataInfo queryPageList(SysAreaBo bo, PageQuery pageQuery); + + + + /** + * 查询区域列表 + */ + List queryList(SysAreaBo bo); + + /** + * 新增区域 + */ + Boolean insertByBo(SysAreaBo bo); + + /** + * 修改区域 + */ + Boolean updateByBo(SysAreaBo bo); + + /** + * 校验并批量删除区域信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java new file mode 100644 index 0000000..4382844 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java @@ -0,0 +1,58 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service接口 + * + * @author Michelle.Chung + */ +public interface ISysClientService { + + /** + * 查询客户端管理 + */ + SysClientVo queryById(Long id); + + /** + * 查询客户端信息基于客户端id + */ + SysClientVo queryByClientId(String clientId); + + /** + * 查询客户端管理列表 + */ + TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery); + + /** + * 查询客户端管理列表 + */ + List queryList(SysClientBo bo); + + /** + * 新增客户端管理 + */ + Boolean insertByBo(SysClientBo bo); + + /** + * 修改客户端管理 + */ + Boolean updateByBo(SysClientBo bo); + + /** + * 修改状态 + */ + int updateUserStatus(Long id, String status); + + /** + * 校验并批量删除客户端管理信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java new file mode 100644 index 0000000..f7efda7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -0,0 +1,87 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; + +import java.util.List; + +/** + * 参数配置 服务层 + * + * @author Lion Li + */ +public interface ISysConfigService { + + + TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery); + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + SysConfigVo selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + String selectConfigByKey(String configKey); + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + List selectConfigList(SysConfigBo config); + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String insertConfig(SysConfigBo bo); + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String updateConfig(SysConfigBo bo); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + void deleteConfigByIds(Long[] configIds); + + /** + * 重置参数缓存数据 + */ + void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + boolean checkConfigKeyUnique(SysConfigBo config); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java new file mode 100644 index 0000000..3625486 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -0,0 +1,125 @@ +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author Lion Li + */ +public interface ISysDeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(SysDeptBo dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + List> selectDeptTreeList(SysDeptBo dept); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + List> buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + SysDeptVo selectDeptById(Long deptId); + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + long selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + boolean checkDeptNameUnique(SysDeptBo dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int insertDept(SysDeptBo bo); + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int updateDept(SysDeptBo bo); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java new file mode 100644 index 0000000..30442ce --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -0,0 +1,67 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictDataService { + + + TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery); + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + List selectDictDataList(SysDictDataBo dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + SysDictDataVo selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List insertDictData(SysDictDataBo bo); + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List updateDictData(SysDictDataBo bo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..3b32d6c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -0,0 +1,95 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISysDictTypeService { + + + TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery); + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + List selectDictTypeList(SysDictTypeBo dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + SysDictTypeVo selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + void deleteDictTypeByIds(Long[] dictIds); + + /** + * 重置字典缓存数据 + */ + void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List insertDictType(SysDictTypeBo bo); + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List updateDictType(SysDictTypeBo bo); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + boolean checkDictTypeUnique(SysDictTypeBo dictType); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java new file mode 100644 index 0000000..a0dd507 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysIndustryService.java @@ -0,0 +1,62 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 行业字典信息Service接口 + * + * @author LionLi + * @date 2024-04-18 + */ +public interface ISysIndustryService { + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-19 13:39 + * 说明:查询所有行业 + **/ + + List selectIndustryList(); + + /** + * 查询行业字典信息 + */ + SysIndustryVo queryById(Long id); + + /** + * 查询行业字典信息列表 + */ + TableDataInfo queryPageList(SysIndustryBo bo, PageQuery pageQuery); + + /** + * 查询行业字典信息列表 + */ + List queryList(SysIndustryBo bo); + + /** + * 新增行业字典信息 + */ + Boolean insertByBo(SysIndustryBo bo); + + /** + * 修改行业字典信息 + */ + Boolean updateByBo(SysIndustryBo bo); + + /** + * 校验并批量删除行业字典信息信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java new file mode 100644 index 0000000..6b3b7a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java @@ -0,0 +1,47 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层 + * + * @author Lion Li + */ +public interface ISysLogininforService { + + + TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery); + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + void insertLogininfor(SysLogininforBo bo); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + List selectLogininforList(SysLogininforBo logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + void cleanLogininfor(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java new file mode 100644 index 0000000..8a3f257 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -0,0 +1,169 @@ +package org.dromara.system.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; + +import java.util.List; +import java.util.Set; + +/** + * 菜单 业务层 + * + * @author Lion Li + */ +public interface ISysMenuService { + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @param useType 菜单的使用类型 + * @return 菜单列表 + */ + List selectMenuList(Long userId,Long useType); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(SysMenuBo menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @param roleDataRange 权限范围(1:角色 2:个人) + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId,Integer roleDataRange); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(Long roleId); + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + List selectMenuListByPackageId(Long packageId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + List buildMenus(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + SysMenuVo selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int insertMenu(SysMenuBo bo); + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int updateMenu(SysMenuBo bo); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + boolean checkMenuNameUnique(SysMenuBo menu); + + + + /*** + * @Param + * @Return + * @Author sunzexing + * @Date 2024-04-30 16:24 + * 说明:查询当前用户的菜单权限 + **/ + + List selectCurrentUserMenuList(SysMenuBo menu, Long userId); + + + /*** + * 查询操作员已经分配的菜单列表 + * @param userId + * @return + */ + List selectMenuListByUserId(Long userId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java new file mode 100644 index 0000000..f6b23ed --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java @@ -0,0 +1,69 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; + +import java.util.List; + +/** + * 公告 服务层 + * + * @author Lion Li + */ +public interface ISysNoticeService { + + + TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery); + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + SysNoticeVo selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + List selectNoticeList(SysNoticeBo notice); + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int insertNotice(SysNoticeBo bo); + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int updateNotice(SysNoticeBo bo); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + int deleteNoticeByIds(Long[] noticeIds); + + TableDataInfo selectPageNoticeListByUser(SysNoticeBo notice, PageQuery pageQuery); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java new file mode 100644 index 0000000..9573510 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java @@ -0,0 +1,54 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author Lion Li + */ +public interface ISysOperLogService { + + TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery); + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + void insertOperlog(SysOperLogBo bo); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + List selectOperLogList(SysOperLogBo operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + SysOperLogVo selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + void cleanOperLog(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java new file mode 100644 index 0000000..0116df5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -0,0 +1,28 @@ +package org.dromara.system.service; + +import java.util.Set; + +/** + * 用户权限处理 + * + * @author Lion Li + */ +public interface ISysPermissionService { + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + Set getRolePermission(Long userId); + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + Set getMenuPermission(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java new file mode 100644 index 0000000..c6409c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -0,0 +1,106 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; + +import java.util.List; + +/** + * 岗位信息 服务层 + * + * @author Lion Li + */ +public interface ISysPostService { + + + TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + List selectPostList(SysPostBo post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + SysPostVo selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostNameUnique(SysPostBo post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostCodeUnique(SysPostBo post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + long countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int insertPost(SysPostBo bo); + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int updatePost(SysPostBo bo); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java new file mode 100644 index 0000000..d2ee61f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -0,0 +1,183 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + * + * @author Lion Li + */ +public interface ISysRoleService { + + + TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery); + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + List selectRoleList(SysRoleBo role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + SysRoleVo selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleNameUnique(SysRoleBo role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleKeyUnique(SysRoleBo role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + void checkRoleAllowed(SysRoleBo role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + long countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int insertRole(SysRoleBo bo); + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int updateRole(SysRoleBo bo); + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + int updateRoleStatus(Long roleId, String status); + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int authDataScope(SysRoleBo bo); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + int insertAuthUsers(Long roleId, Long[] userIds); + + void cleanOnlineUserByRole(Long roleId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java new file mode 100644 index 0000000..0950b60 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysSocialService.java @@ -0,0 +1,56 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; + +import java.util.List; + +/** + * 社会化关系Service接口 + * + * @author thiszhc + */ +public interface ISysSocialService { + + + /** + * 查询社会化关系 + */ + SysSocialVo queryById(String id); + + /** + * 查询社会化关系列表 + */ + List queryList(); + + /** + * 查询社会化关系列表 + */ + List queryListByUserId(Long userId); + + /** + * 新增授权关系 + */ + Boolean insertByBo(SysSocialBo bo); + + /** + * 更新社会化关系 + */ + + Boolean updateByBo(SysSocialBo bo); + + /** + * 删除社会化关系信息 + */ + Boolean deleteWithValidById(Long id); + + + /** + * 根据 authId 查询 SysSocial 表和 SysUser 表,返回 SysSocialAuthResult 映射的对象 + * @param authId 认证ID + * @return SysSocial + */ + List selectByAuthId(String authId); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java new file mode 100644 index 0000000..cdb887c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -0,0 +1,57 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantPackageService { + + /** + * 查询租户套餐 + */ + SysTenantPackageVo queryById(Long packageId); + + /** + * 查询租户套餐列表 + */ + TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery); + + /** + * 查询租户套餐已启用列表 + */ + List selectList(); + + /** + * 查询租户套餐列表 + */ + List queryList(SysTenantPackageBo bo); + + /** + * 新增租户套餐 + */ + Boolean insertByBo(SysTenantPackageBo bo); + + /** + * 修改租户套餐 + */ + Boolean updateByBo(SysTenantPackageBo bo); + + /** + * 修改套餐状态 + */ + int updatePackageStatus(SysTenantPackageBo bo); + + /** + * 校验并批量删除租户套餐信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java new file mode 100644 index 0000000..d12ed95 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -0,0 +1,82 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantService { + + /** + * 查询租户 + */ + SysTenantVo queryById(Long id); + + /** + * 基于租户ID查询租户 + */ + SysTenantVo queryByTenantId(String tenantId); + + /** + * 查询租户列表 + */ + TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery); + + /** + * 查询租户列表 + */ + List queryList(SysTenantBo bo); + + /** + * 新增租户 + */ + Boolean insertByBo(SysTenantBo bo); + + /** + * 修改租户 + */ + Boolean updateByBo(SysTenantBo bo); + + /** + * 修改租户状态 + */ + int updateTenantStatus(SysTenantBo bo); + + /** + * 校验租户是否允许操作 + */ + void checkTenantAllowed(String tenantId); + + /** + * 校验并批量删除租户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 校验企业名称是否唯一 + */ + boolean checkCompanyNameUnique(SysTenantBo bo); + + /** + * 校验账号余额 + */ + boolean checkAccountBalance(String tenantId); + + /** + * 校验有效期 + */ + boolean checkExpireTime(String tenantId); + + /** + * 同步租户套餐 + */ + Boolean syncTenantPackage(String tenantId, Long packageId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java new file mode 100644 index 0000000..ea46e71 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUnitDomainService.java @@ -0,0 +1,58 @@ +package org.dromara.system.service; + +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.domain.bo.SysUnitDomainBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 单位域名配置Service接口 + * + * @author LionLi + * @date 2024-03-29 + */ +public interface ISysUnitDomainService { + + /** + * 查询单位域名配置 + */ + SysUnitDomainVo queryById(Long id); + + /** + * 根据域名获取站点配置信息 + * @param domain 域名 + * @return + */ + public SysUnitDomainVo queryByDomainName(String domain); + + /** + * 查询单位域名配置列表 + */ + TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery); + + /** + * 查询单位域名配置列表 + */ + List queryList(SysUnitDomainBo bo); + + /** + * 新增单位域名配置 + */ + Boolean insertByBo(SysUnitDomainBo bo); + + /** + * 修改单位域名配置 + */ + Boolean updateByBo(SysUnitDomainBo bo); + + /** + * 校验并批量删除单位域名配置信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java new file mode 100644 index 0000000..31d5724 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -0,0 +1,313 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author Lion Li + */ +public interface ISysUserService { + + + TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + List selectUserList(SysUserBo user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + SysUserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + SysUserVo selectUserByPhonenumber(String phonenumber); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + SysUserVo selectUserById(Long userId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkUserNameUnique(SysUserBo user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkPhoneUnique(SysUserBo user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkEmailUnique(SysUserBo user); + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + void checkUserAllowed(Long userId); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int insertUser(SysUserBo user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + boolean registerUser(SysUserBo user, String tenantId); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUser(SysUserBo user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserNew(SysUserBo user); + + + + int updateUserInfos(SysUser sysUser); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + int updateUserStatus(Long userId, String status); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserProfile(SysUserBo user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + boolean updateUserAvatar(Long userId, Long avatar); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + int resetUserPwd(Long userId, String password); + + + + /** + * 重置用户密码 + * @param srcPwd 用户ID + * @param newPwd 密码 + * @param newPwd 确认密码 + * @return 结果 + */ + int resetMyPwd(String srcPwd,String newPwd,String surePwd); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + int deleteUserByIds(Long[] userIds); + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectNicknameById(Long userId); + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId + * @return + */ + List selectUserListByDept(Long deptId); + + + /*** + * 操作员查询 + * @param user + * @param pageQuery + * @return + */ + TableDataInfo selNewUserList(SysUserBo user, PageQuery pageQuery); + + + /*** + * 添加操作员 + * @param user + * @return + */ + int insertUserNew(SysUserBo user); + + /*** + * 操作员分配权限 + * @param user + * @return + */ + Boolean configUserPer(SysUserBo user); + + /*** + * 修改登录方式 + * @param userId + * @param loginType + * @return + */ + int updLoginWay(Long userId, Integer loginType); + + + /*** + * 查询登录方式 + * @param userId + * @return + */ + Integer selLoginWay(Long userId); + + + + /*** + * 添加业务管理员 + * @param sysUser + * @return + */ + int insertBusUser(SysUser sysUser); + + + public String getBindingQr(String domain); + + public Boolean bindWeixinOpenId(String domain,String code,String username); + + + /*** + * 更新管理员已读协议标识 + * @return + */ + String updateReadProTag(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java new file mode 100644 index 0000000..9fe3e15 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BpmOrderNumImpl.java @@ -0,0 +1,97 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.date.DateUtil; +import org.dromara.system.domain.BpmOrderNum; +import org.dromara.system.mapper.CommonMapper; +import org.dromara.system.service.IOrderNum; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author sunzexing + * @version 1.0 + * @title BpmOrderNumImpl + * @description + * @create 2024-02-20 18:17 + */ + +@Service +public class BpmOrderNumImpl implements IOrderNum { + + private Map cacheMap = Collections.synchronizedMap(new HashMap<>()); + + @Resource + private CommonMapper commonMapper; + + private static String PRI = "NUM_"; + @Override + public synchronized String getOrderNum(String bpmType,int size ) throws Exception { + + String date = DateUtil.format(new Date(), DateTimeFormatter.ofPattern("yyyyMMdd")); + Long num = cacheMap.get(PRI+bpmType+"_"+date); + BpmOrderNum orderNum = new BpmOrderNum(); + orderNum.setV_process_name(bpmType); + orderNum.setDtm_time(date); + + if(num == null){ + BpmOrderNum resultOrder = this.commonMapper.selectOrderNumByBpmDefInfo(orderNum); + if(resultOrder == null){ + orderNum.setI_max_num(1L); + this.commonMapper.insertIntoOrderNum(orderNum); + cacheMap.put(PRI+bpmType+"_"+date,1L); + }else{ + long i = resultOrder.getI_max_num()+1; + this.getNextNumber(orderNum,i); + } + }else{ + num += 1; + this.getNextNumber(orderNum,num); + } + + return String.format("%0" + size + "d", orderNum.getI_max_num()); + } + + + @Override + public synchronized Long getOrderLongNum(String bpmType,int size ) throws Exception { + +// String date = DateUtil.format(new Date(), DateTimeFormatter.ofPattern("yyyyMMdd")); + String date = "20240816"; + Long num = cacheMap.get(PRI+bpmType+"_"+date); + BpmOrderNum orderNum = new BpmOrderNum(); + orderNum.setV_process_name(bpmType); + orderNum.setDtm_time(date); + + if(num == null){ + BpmOrderNum resultOrder = this.commonMapper.selectOrderNumByBpmDefInfo(orderNum); + if(resultOrder == null){ + orderNum.setI_max_num(1L); + this.commonMapper.insertIntoOrderNum(orderNum); + cacheMap.put(PRI+bpmType+"_"+date,1L); + }else{ + long i = resultOrder.getI_max_num()+1; + this.getNextNumber(orderNum,i); + } + }else{ + num += 1; + this.getNextNumber(orderNum,num); + } + + return orderNum.getI_max_num(); + } + + + private void getNextNumber(BpmOrderNum orderNum, long i) throws Exception { + + this.cacheMap.put(PRI+orderNum.getV_process_name()+"_"+orderNum.getDtm_time(), i); + orderNum.setI_max_num(i); + this.commonMapper.updateOrderNumByProName(orderNum); + } +} + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java new file mode 100644 index 0000000..3e29a3f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaServiceImpl.java @@ -0,0 +1,118 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysAreaBo; +import org.dromara.system.domain.vo.SysAreaVo; +import org.dromara.system.domain.SysArea; +import org.dromara.system.mapper.SysAreaMapper; +import org.dromara.system.service.ISysAreaService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 区域Service业务层处理 + * + * @author LionLi + * @date 2024-04-18 + */ +@RequiredArgsConstructor +@Service +public class SysAreaServiceImpl implements ISysAreaService { + + private final SysAreaMapper baseMapper; + + /** + * 查询区域 + */ + @Override + public SysAreaVo queryById(Long areaId){ + return baseMapper.selectVoById(areaId); + } + + /** + * 查询区域列表 + */ + @Override + public TableDataInfo queryPageList(SysAreaBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询区域列表 + */ + @Override + public List queryList(SysAreaBo bo) { + bo.setIsUse(1); + QueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByAsc("sort"); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(SysAreaBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.like(StringUtils.isNotBlank(bo.getAreaName()), "area_name", bo.getAreaName()); + lqw.eq(bo.getUp() != null, "up", bo.getUp()); + lqw.eq(bo.getLevel() != null, "level", bo.getLevel()); + lqw.eq(bo.getSort() != null, "sort", bo.getSort()); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), "code", bo.getCode()); + lqw.eq(bo.getIsUse() != null, "is_use", bo.getIsUse()); + lqw.eq(StringUtils.isNotBlank(bo.getAreaCode()), "area_code", bo.getAreaCode()); + return lqw; + } + + /** + * 新增区域 + */ + @Override + public Boolean insertByBo(SysAreaBo bo) { + SysArea add = MapstructUtils.convert(bo, SysArea.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setAreaId(add.getAreaId()); + } + return flag; + } + + /** + * 修改区域 + */ + @Override + public Boolean updateByBo(SysAreaBo bo) { + SysArea update = MapstructUtils.convert(bo, SysArea.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysArea entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除区域 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java new file mode 100644 index 0000000..9ed56af --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -0,0 +1,143 @@ +package org.dromara.system.service.impl; + +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysClient; +import org.dromara.system.domain.bo.SysClientBo; +import org.dromara.system.domain.vo.SysClientVo; +import org.dromara.system.mapper.SysClientMapper; +import org.dromara.system.service.ISysClientService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service业务层处理 + * + * @author Michelle.Chung + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysClientServiceImpl implements ISysClientService { + + private final SysClientMapper baseMapper; + + /** + * 查询客户端管理 + */ + @Override + public SysClientVo queryById(Long id) { + SysClientVo vo = baseMapper.selectVoById(id); + vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + return vo; + } + + + /** + * 查询客户端管理 + */ + @Override + public SysClientVo queryByClientId(String clientId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysClient::getClientId, clientId)); + } + + /** + * 查询客户端管理列表 + */ + @Override + public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + return TableDataInfo.build(result); + } + + /** + * 查询客户端管理列表 + */ + @Override + public List queryList(SysClientBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysClientBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getClientId()), SysClient::getClientId, bo.getClientId()); + lqw.eq(StringUtils.isNotBlank(bo.getClientKey()), SysClient::getClientKey, bo.getClientKey()); + lqw.eq(StringUtils.isNotBlank(bo.getClientSecret()), SysClient::getClientSecret, bo.getClientSecret()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysClient::getStatus, bo.getStatus()); + lqw.orderByAsc(SysClient::getId); + return lqw; + } + + /** + * 新增客户端管理 + */ + @Override + public Boolean insertByBo(SysClientBo bo) { + SysClient add = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(add); + add.setGrantType(String.join(",", bo.getGrantTypeList())); + // 生成clientid + String clientKey = bo.getClientKey(); + String clientSecret = bo.getClientSecret(); + add.setClientId(SecureUtil.md5(clientKey + clientSecret)); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户端管理 + */ + @Override + public Boolean updateByBo(SysClientBo bo) { + SysClient update = MapstructUtils.convert(bo, SysClient.class); + validEntityBeforeSave(update); + update.setGrantType(String.join(",", bo.getGrantTypeList())); + return baseMapper.updateById(update) > 0; + } + + /** + * 修改状态 + */ + @Override + public int updateUserStatus(Long id, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysClient::getStatus, status) + .eq(SysClient::getId, id)); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysClient entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除客户端管理 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..7f72159 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,205 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; +import org.dromara.system.mapper.SysConfigMapper; +import org.dromara.system.service.ISysConfigService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 参数配置 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysConfigServiceImpl implements ISysConfigService { + + private final SysConfigMapper baseMapper; + + @Override + public TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DS("master") + public SysConfigVo selectConfigById(Long configId) { + return baseMapper.selectVoById(configId); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey") + @Override + public String selectConfigByKey(String configKey) { + SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, configKey)); + if (ObjectUtil.isNotNull(retConfig)) { + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, "sys.account.registerUser")); + }); + if (ObjectUtil.isNull(retConfig)) { + return false; + } + return Convert.toBool(retConfig.getConfigValue()); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfigBo config) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getConfigName()), SysConfig::getConfigName, bo.getConfigName()); + lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), SysConfig::getConfigType, bo.getConfigType()); + lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), SysConfig::getConfigKey, bo.getConfigKey()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysConfig::getConfigId); + return lqw; + } + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String insertConfig(SysConfigBo bo) { + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + int row = baseMapper.insert(config); + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String updateConfig(SysConfigBo bo) { + int row = 0; + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); + if (config.getConfigId() != null) { + SysConfig temp = baseMapper.selectById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { + CacheUtils.evict(CacheNames.SYS_CONFIG, temp.getConfigKey()); + } + row = baseMapper.updateById(config); + } else { + row = baseMapper.update(config, new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, config.getConfigKey())); + } + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) { + for (Long configId : configIds) { + SysConfig config = baseMapper.selectById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + } + baseMapper.deleteBatchIds(Arrays.asList(configIds)); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() { + CacheUtils.clear(CacheNames.SYS_CONFIG); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfigBo config) { + long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { + return false; + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..44383a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,326 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysDeptService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 部门管理 服务实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDeptServiceImpl implements ISysDeptService{ + + private final SysDeptMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysUserMapper userMapper; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + public List selectDeptList(SysDeptBo dept) { + LambdaQueryWrapper lqw = buildQueryWrapper(dept); + return baseMapper.selectDeptList(lqw); + } + + /** + * 查询部门树结构信息 + * + * @param bo 部门信息 + * @return 部门树信息集合 + */ + @Override + public List> selectDeptTreeList(SysDeptBo bo) { + // 只查询未禁用部门 + bo.setStatus(UserConstants.DEPT_NORMAL); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List depts = baseMapper.selectDeptList(lqw); + return buildDeptTreeSelect(depts); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysDept::getDelFlag, "0"); + lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); + lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); + lqw.orderByAsc(SysDept::getParentId); + lqw.orderByAsc(SysDept::getOrderNum); + lqw.orderByAsc(SysDept::getDeptId); + return lqw; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildDeptTreeSelect(List depts) { + if (CollUtil.isEmpty(depts)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(depts, (dept, tree) -> + tree.setId(dept.getDeptId()) + .setParentId(dept.getParentId()) + .setName(dept.getDeptName()) + .setWeight(dept.getOrderNum())); + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly()); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public SysDeptVo selectDeptById(Long deptId) { + SysDeptVo dept = baseMapper.selectVoById(deptId); + if (ObjectUtil.isNull(dept)) { + return null; + } + SysDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() + .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); + dept.setParentName(ObjectUtil.isNotNull(parentDept) ? parentDept.getDeptName() : null); + return dept; + } + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + public String selectDeptNameByIds(String deptIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(deptIds, Convert::toLong)) { + SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(id); + if (ObjectUtil.isNotNull(vo)) { + list.add(vo.getDeptName()); + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public long selectNormalChildrenDeptById(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper() + .eq(SysDept::getStatus, UserConstants.DEPT_NORMAL) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) { + return baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDept::getParentId, deptId)); + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) { + return userMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getDeptId, deptId)); + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(SysDeptBo dept) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDept::getDeptName, dept.getDeptName()) + .eq(SysDept::getParentId, dept.getParentId()) + .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId())); + return !exist; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + SysDeptVo dept = baseMapper.selectDeptById(deptId); + if (ObjectUtil.isNull(dept)) { + throw new ServiceException("没有权限访问部门数据!"); + } + } + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @Override + public int insertDept(SysDeptBo bo) { + SysDept info = baseMapper.selectById(bo.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { + throw new ServiceException("部门停用,不允许新增"); + } + SysDept dept = MapstructUtils.convert(bo, SysDept.class); + dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); + return baseMapper.insert(dept); + } + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId") + @Override + public int updateDept(SysDeptBo bo) { + SysDept dept = MapstructUtils.convert(bo, SysDept.class); + SysDept oldDept = baseMapper.selectById(dept.getDeptId()); + if (!oldDept.getParentId().equals(dept.getParentId())) { + // 如果是新父部门 则校验是否具有新父部门权限 避免越权 + this.checkDeptDataScope(dept.getParentId()); + SysDept newParentDept = baseMapper.selectById(dept.getParentId()); + if (ObjectUtil.isNotNull(newParentDept) && ObjectUtil.isNotNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + } + int result = baseMapper.updateById(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals(UserConstants.DEPT_NORMAL, dept.getAncestors())) { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysDept::getStatus, UserConstants.DEPT_NORMAL) + .in(SysDept::getDeptId, Arrays.asList(deptIds))); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + private void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + List children = baseMapper.selectList(new LambdaQueryWrapper() + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List list = new ArrayList<>(); + for (SysDept child : children) { + SysDept dept = new SysDept(); + dept.setDeptId(child.getDeptId()); + dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + list.add(dept); + } + if (CollUtil.isNotEmpty(list)) { + if (baseMapper.updateBatchById(list)) { + list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId())); + } + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public int deleteDeptById(Long deptId) { + return baseMapper.deleteById(deptId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..c0a62c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,138 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.service.ISysDictDataService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictDataServiceImpl implements ISysDictDataService { + + private final SysDictDataMapper baseMapper; + + @Override + public TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictDataBo dictData) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictDataBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDictSort() != null, SysDictData::getDictSort, bo.getDictSort()); + lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), SysDictData::getDictLabel, bo.getDictLabel()); + lqw.eq(StringUtils.isNotBlank(bo.getDictType()), SysDictData::getDictType, bo.getDictType()); + lqw.orderByAsc(SysDictData::getDictSort); + return lqw; + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysDictData::getDictLabel) + .eq(SysDictData::getDictType, dictType) + .eq(SysDictData::getDictValue, dictValue)) + .getDictLabel(); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictDataVo selectDictDataById(Long dictCode) { + return baseMapper.selectVoById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + SysDictData data = baseMapper.selectById(dictCode); + baseMapper.deleteById(dictCode); + CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); + } + } + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.insert(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List updateDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); + int row = baseMapper.updateById(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..8f958e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,206 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.mapper.SysDictTypeMapper; +import org.dromara.system.service.ISysDictTypeService; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService { + + private final SysDictTypeMapper baseMapper; + private final SysDictDataMapper dictDataMapper; + + @Override + public TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictTypeBo dictType) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictTypeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDictName()), SysDictType::getDictName, bo.getDictName()); + lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(SysDictType::getDictId); + return lqw; + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + return baseMapper.selectVoList(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (CollUtil.isNotEmpty(dictDatas)) { + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeById(Long dictId) { + return baseMapper.selectVoById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictTypeVo selectDictTypeByType(String dictType) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + SysDictType dictType = baseMapper.selectById(dictId); + if (dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType.getDictType()))) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); + } + baseMapper.deleteBatchIds(Arrays.asList(dictIds)); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + CacheUtils.clear(CacheNames.SYS_DICT); + } + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + int row = baseMapper.insert(dict); + if (row > 0) { + // 新增 type 下无 data 数据 返回空防止缓存穿透 + return new ArrayList<>(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); + SysDictType oldDict = baseMapper.selectById(dict.getDictId()); + dictDataMapper.update(null, new LambdaUpdateWrapper() + .set(SysDictData::getDictType, dict.getDictType()) + .eq(SysDictData::getDictType, oldDict.getDictType())); + int row = baseMapper.updateById(dict); + if (row > 0) { + CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); + return dictDataMapper.selectDictDataByType(dict.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictTypeBo dictType) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDictType::getDictType, dictType.getDictType()) + .ne(ObjectUtil.isNotNull(dictType.getDictId()), SysDictType::getDictId, dictType.getDictId())); + return !exist; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java new file mode 100644 index 0000000..04029b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysIndustryServiceImpl.java @@ -0,0 +1,155 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.system.domain.vo.SysIndustryVo; +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.mapper.SysIndustryMapper; +import org.dromara.system.service.ISysIndustryService; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 行业字典信息Service业务层处理 + * + * @author LionLi + * @date 2024-04-18 + */ +@RequiredArgsConstructor +@Service +public class SysIndustryServiceImpl implements ISysIndustryService { + + private final SysIndustryMapper baseMapper; + + @Override + public List selectIndustryList() { + List list = new ArrayList(); + SysIndustryBo bo = new SysIndustryBo(); + bo.setIsUse(1); + List voList = this.baseMapper.selectVoList(this.buildQueryWrapper(bo)); + voList.forEach(vo -> { + if(vo.getParentId().equals(0L) && vo.getLevel().equals(1)){ + Map map = new TreeMap(); + map.put("value",vo.getId()); + map.put("label",vo.getName()); + list.add(map); + }else{ + Map map = getSubMap(vo.getParentId(),list); + + List subList = (List)map.get("children"); + if(subList == null){ + subList = new ArrayList(); + map.put("children",subList); + } + + Map submap = new HashMap(); + submap.put("value",vo.getId()); + submap.put("label",vo.getName()); + subList.add(submap); + } + }); + return list; + } + + private Map getSubMap(Long id, List list) { + for(Map m : list){ + Object v = m.get("value"); + if(v != null && id.equals(v)){ + return m; + } + } + return null; + } + + /** + * 查询行业字典信息 + */ + @Override + public SysIndustryVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 查询行业字典信息列表 + */ + @Override + public TableDataInfo queryPageList(SysIndustryBo bo, PageQuery pageQuery) { + QueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询行业字典信息列表 + */ + @Override + public List queryList(SysIndustryBo bo) { + QueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private QueryWrapper buildQueryWrapper(SysIndustryBo bo) { + Map params = bo.getParams(); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.like(StringUtils.isNotBlank(bo.getName()), "name", bo.getName()); + + lqw.eq(bo.getParentId() != null, "parent_id", bo.getParentId()); + lqw.eq(bo.getIsUse() != null, "is_use", bo.getIsUse()); + lqw.eq(bo.getSort() != null, "i_sort", bo.getSort()); + lqw.eq(bo.getLevel() != null, "i_level", bo.getLevel()); + lqw.orderByAsc("parent_id","sort"); + return lqw; + } + + /** + * 新增行业字典信息 + */ + @Override + public Boolean insertByBo(SysIndustryBo bo) { + SysIndustry add = MapstructUtils.convert(bo, SysIndustry.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改行业字典信息 + */ + @Override + public Boolean updateByBo(SysIndustryBo bo) { + SysIndustry update = MapstructUtils.convert(bo, SysIndustry.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysIndustry entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除行业字典信息 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..ebea956 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,108 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; +import org.dromara.system.mapper.SysLogininforMapper; +import org.dromara.system.service.ISysLogininforService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class SysLogininforServiceImpl implements ISysLogininforService { + + private final SysLogininforMapper baseMapper; + + + private String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } + + @Override + public TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) { + Map params = logininfor.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("info_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininforBo bo) { + SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class); + logininfor.setLoginTime(new Date()); + baseMapper.insert(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininforBo logininfor) { + Map params = logininfor.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(SysLogininfor::getInfoId)); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + return baseMapper.deleteBatchIds(Arrays.asList(infoIds)); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..82b4317 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,476 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.TreeBuildUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MetaVo; +import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; +import org.dromara.system.mapper.SysMenuMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysMenuService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 菜单 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysMenuServiceImpl implements ISysMenuService { + + private final SysMenuMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysTenantPackageMapper tenantPackageMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId,Long useType) { + return selectMenuList(new SysMenuBo(), userId,useType); + } + + /** + * 查询系统菜单列表 + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuList(SysMenuBo menu, Long userId,Long useType) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) +// .apply("FIND_IN_SET({0}, use_type) > 0",useType == null ? BusRole.PLATFORM.getId():useType) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + List menuList1 = new ArrayList<>(); + for(SysMenuVo menuVo:menuList){ + if(!"F".equals(menuVo.getMenuType()) && menuVo.getUseType() != null && menuVo.getUseType().contains( + (useType == null ? BusRole.PLATFORM.getId():useType)+"")){ + menuList1.add(menuVo); + } else if("F".equals(menuVo.getMenuType())){ + menuList1.add(menuVo); + } + } + menuList = menuList1; + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("sur.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + return menuList; + } + + + /** + * 查询系统菜单列表 + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenuBo menu, Long userId) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) +// .apply("FIND_IN_SET({0}, use_type)",) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("sur.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + return menuList; + } + + + /*** + * 查询当前用户的菜单 + * @param menu + * @param userId + * @return + */ + public List selectCurrentUserMenuList(SysMenuBo menu, Long userId) { + List menuList; + LoginUser loginUser = LoginHelper.getLoginUser(); + + menu.setVisible("0"); + menu.setStatus("0"); + + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) + .orderByAsc(SysMenu::getParentId) + .orderByAsc(SysMenu::getOrderNum)); + } else { + if(loginUser.getRoleDataRange().intValue() == 1){ + //取角色 + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("sur.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + }else{ + //取个人 + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("rm.user_id", userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserIdNew(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); + } + + + } + return menuList; + } + + + + + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = baseMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = baseMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId,Integer roleDataRange) { + List menus; + if (LoginHelper.isSuperAdmin(userId)) { + menus = baseMapper.selectMenuTreeAll(); + } else { + if(roleDataRange == 2) { + menus = baseMapper.selectMenuTreeByUserIdNew(userId); + }else { + menus = baseMapper.selectMenuTreeByUserId(userId); + } + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = roleMapper.selectById(roleId); + return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); + } + + + @Override + public List selectMenuListByUserId(Long userId) { + return baseMapper.selectOperMenuListByUserId(userId); + } + + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByPackageId(Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + if (CollUtil.isEmpty(menuIds)) { + return new ArrayList<>(); + } + List parentIds = null; + if (tenantPackage.getMenuCheckStrictly()) { + parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() + .select(SysMenu::getParentId) + .in(SysMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); + } + return baseMapper.selectObjs(new LambdaQueryWrapper() + .in(SysMenu::getMenuId, menuIds) + .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList<>(); + for (SysMenu menu : menus) { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(menu.getRouteName()); + router.setPath(menu.getRouterPath()); + router.setComponent(menu.getComponentInfo()); + router.setQuery(menu.getQueryParam()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (CollUtil.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (menu.isMenuFrame()) { + router.setMeta(null); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQueryParam()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList<>(); + RouterVo children = new RouterVo(); + String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildMenuTreeSelect(List menus) { + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(menus, (menu, tree) -> + tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum())); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenuVo selectMenuById(Long menuId) { + return baseMapper.selectVoById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + return baseMapper.exists(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + return roleMenuMapper.exists(new LambdaQueryWrapper().eq(SysRoleMenu::getMenuId, menuId)); + } + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.insert(menu); + } + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); + return baseMapper.updateById(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return baseMapper.deleteById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenuBo menu) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysMenu::getMenuName, menu.getMenuName()) + .eq(SysMenu::getParentId, menu.getParentId()) + .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())); + return !exist; + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + private List getChildPerms(List list, int parentId) { + List returnList = new ArrayList<>(); + for (SysMenu t : list) { + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); + t.setChildren(childList); + for (SysMenu tChild : childList) { + // 判断是否有子节点 + if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { + recursionFn(list, tChild); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..c4e081c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,172 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysNoticeMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 公告 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysNoticeServiceImpl implements ISysNoticeService { + + private final SysNoticeMapper baseMapper; + private final SysUserMapper userMapper; + + @Override + public TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + + @Override + public TableDataInfo selectPageNoticeListByUser(SysNoticeBo notice, PageQuery pageQuery) { + Integer busRole = LoginHelper.getBusRole(); + notice.setBusRole(busRole); + + QueryWrapper lqw = buildQueryWrapper2(notice); + Page page = baseMapper.selectPageNoticeListByUser(pageQuery.build(), lqw, LoginHelper.getUserId()); + return TableDataInfo.build(page); + } + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public SysNoticeVo selectNoticeById(Long noticeId) { + //产看详情 + //在 阅读表里 产看是否存在 + if(baseMapper.selectNoticeReadByUser(LoginHelper.getUserId(),noticeId) == 0){ + baseMapper.insertNoticeRead(LoginHelper.getUserId(),noticeId); + } + + return baseMapper.selectVoById(noticeId); + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(SysNoticeBo notice) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysNoticeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + SysUserVo sysUser = userMapper.selectUserByUserName(bo.getCreateByName()); + lqw.eq(SysNotice::getCreateBy, ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); + } + lqw.orderByAsc(SysNotice::getNoticeId); + return lqw; + } + + + private QueryWrapper buildQueryWrapper2(SysNoticeBo bo) { + QueryWrapper lqw = Wrappers.query(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), "sys_notice.notice_title", bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), "sys_notice.notice_type", bo.getNoticeType()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), "sys_notice_role.bus_role", bo.getBusRole()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + SysUserVo sysUser = userMapper.selectUserByUserName(bo.getCreateByName()); + lqw.eq("sys_notice.create_by", ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); + } + lqw.orderByDesc("sys_notice.create_time"); + return lqw; + } + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int insertNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); + + if(null == bo.getBusRoles() || bo.getBusRoles().length == 0){ + throw new IllegalArgumentException("接收角色不能为空"); + } + int count = baseMapper.insert(notice); + baseMapper.deleteNoticeRole(notice.getNoticeId()); + baseMapper.insertNoticeRole(notice.getNoticeId(), bo.getBusRoles()); + //处理角色 公告信息 + return count; + } + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int updateNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); + + if(null == bo.getBusRoles() || bo.getBusRoles().length == 0){ + throw new IllegalArgumentException("接收角色不能为空"); + } + int count = baseMapper.updateById(notice); + baseMapper.deleteNoticeRole(notice.getNoticeId()); + baseMapper.insertNoticeRole(notice.getNoticeId(), bo.getBusRoles()); + + return count; + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) { + return baseMapper.deleteById(noticeId); + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) { + return baseMapper.deleteBatchIds(Arrays.asList(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..ce9ab23 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,129 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; +import org.dromara.system.mapper.SysOperLogMapper; +import org.dromara.system.service.ISysOperLogService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 操作日志 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysOperLogServiceImpl implements ISysOperLogService { + + private final SysOperLogMapper baseMapper; + + + @Override + public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { + Map params = operLog.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) + .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + SysOperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null, + SysOperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("oper_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLogBo bo) { + SysOperLog operLog = MapstructUtils.convert(bo, SysOperLog.class); + operLog.setOperTime(new Date()); + baseMapper.insert(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLogBo operLog) { + Map params = operLog.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) + .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + SysOperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null && operLog.getStatus() > 0, + SysOperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(SysOperLog::getOperId)); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) { + return baseMapper.deleteBatchIds(Arrays.asList(operIds)); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLogVo selectOperLogById(Long operId) { + return baseMapper.selectVoById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..7ccae4b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,61 @@ +package org.dromara.system.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.service.ISysMenuService; +import org.dromara.system.service.ISysPermissionService; +import org.dromara.system.service.ISysRoleService; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.Set; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@RequiredArgsConstructor +@Service +public class SysPermissionServiceImpl implements ISysPermissionService { + + private final ISysRoleService roleService; + private final ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + @Override + public Set getRolePermission(Long userId) { + Set roles = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(userId)); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + @Override + public Set getMenuPermission(Long userId) { + Set perms = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + perms.add("*:*:*"); + } else { + perms.addAll(menuService.selectMenuPermsByUserId(userId)); + } + return perms; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..1c65a48 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,188 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysUserPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.mapper.SysPostMapper; +import org.dromara.system.mapper.SysUserPostMapper; +import org.dromara.system.service.ISysPostService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 岗位信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysPostServiceImpl implements ISysPostService { + + private final SysPostMapper baseMapper; + private final SysUserPostMapper userPostMapper; + + @Override + public TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(post); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPostBo post) { + LambdaQueryWrapper lqw = buildQueryWrapper(post); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()); + lqw.like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()); + lqw.orderByAsc(SysPost::getPostSort); + return lqw; + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + return baseMapper.selectVoList(new QueryWrapper<>()); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPostVo selectPostById(Long postId) { + return baseMapper.selectVoById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + return baseMapper.selectPostListByUserId(userId); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostName, post.getPostName()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostCode, post.getPostCode()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + return !exist; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public long countUserPostById(Long postId) { + return userPostMapper.selectCount(new LambdaQueryWrapper().eq(SysUserPost::getPostId, postId)); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + return baseMapper.deleteById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) { + for (Long postId : postIds) { + SysPost post = baseMapper.selectById(postId); + if (countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); + } + } + return baseMapper.deleteBatchIds(Arrays.asList(postIds)); + } + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.insert(post); + } + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); + return baseMapper.updateById(post); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..e46497e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,486 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.mapper.SysRoleMapper; +import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysUserRoleMapper; +import org.dromara.system.service.ISysRoleService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 角色 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysRoleServiceImpl implements ISysRoleService { + + private final SysRoleMapper baseMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysRoleDeptMapper roleDeptMapper; + + @Override + public TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery) { + Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + public List selectRoleList(SysRoleBo role) { + return baseMapper.selectRoleList(this.buildQueryWrapper(role)); + } + + private Wrapper buildQueryWrapper(SysRoleBo bo) { + Map params = bo.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("r.del_flag", UserConstants.ROLE_NORMAL) + .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) + .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), "r.status", bo.getStatus()) + .like(StringUtils.isNotBlank(bo.getRoleKey()), "r.role_key", bo.getRoleKey()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "r.create_time", params.get("beginTime"), params.get("endTime")) + .orderByAsc("r.role_sort").orderByAsc("r.create_time");; + return wrapper; + } + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) { + List userRoles = baseMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRoleVo role : roles) { + for (SysRoleVo userRole : userRoles) { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) { + List perms = baseMapper.selectRolePermissionByUserId(userId); + Set permsSet = new HashSet<>(); + for (SysRoleVo perm : perms) { + if (ObjectUtil.isNotNull(perm)) { + permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() { + return this.selectRoleList(new SysRoleBo()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + return baseMapper.selectRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRoleVo selectRoleById(Long roleId) { + return baseMapper.selectRoleById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleNameUnique(SysRoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleName, role.getRoleName()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(SysRoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleKey, role.getRoleKey()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRoleBo role) { + if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) { + throw new ServiceException("不允许操作超级管理员角色"); + } + String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY}; + // 新增不允许使用 管理员标识符 + if (ObjectUtil.isNull(role.getRoleId()) + && StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + // 修改不允许修改 管理员标识符 + if (ObjectUtil.isNotNull(role.getRoleId())) { + SysRole sysRole = baseMapper.selectById(role.getRoleId()); + // 如果标识符不相等 判断为修改了管理员标识符 + if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())) { + if (StringUtils.equalsAny(sysRole.getRoleKey(), keys)) { + throw new ServiceException("不允许修改系统内置管理员角色标识符!"); + } else if (StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + } + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + List roles = this.selectRoleList(new SysRoleBo(roleId)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public long countUserRoleByRoleId(Long roleId) { + return userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + } + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 新增角色信息 + baseMapper.insert(role); + bo.setRoleId(role.getRoleId()); + return insertRoleMenu(bo); + } + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, role.getRoleId())); + return insertRoleMenu(bo); + } + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + @Override + public int updateRoleStatus(Long roleId, String status) { + if (UserConstants.ROLE_DISABLE.equals(status) && this.countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysRole::getStatus, status) + .eq(SysRole::getRoleId, roleId)); + } + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int authDataScope(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, role.getRoleId())); + // 新增角色和部门信息(数据权限) + return insertRoleDept(bo); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + private int insertRoleMenu(SysRoleBo role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + rows = roleMenuMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + private int insertRoleDept(SysRoleBo role) { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleById(Long roleId) { + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, roleId)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, roleId)); + return baseMapper.deleteById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + SysRole role = baseMapper.selectById(roleId); + checkRoleAllowed(BeanUtil.toBean(role, SysRoleBo.class)); + checkRoleDataScope(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", role.getRoleName())); + } + } + List ids = Arrays.asList(roleIds); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); + return baseMapper.deleteBatchIds(ids); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(SysUserRole::getRoleId, userRole.getRoleId()) + .eq(SysUserRole::getUserId, userRole.getUserId())); + if (rows > 0) { + cleanOnlineUserByRole(userRole.getRoleId()); + } + return rows; + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(SysUserRole::getRoleId, roleId) + .in(SysUserRole::getUserId, Arrays.asList(userIds))); + if (rows > 0) { + cleanOnlineUserByRole(roleId); + } + return rows; + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) { + // 新增用户与角色管理 + int rows = 1; + List list = StreamUtils.toList(List.of(userIds), userId -> { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + if (CollUtil.isNotEmpty(list)) { + rows = userRoleMapper.insertBatch(list) ? list.size() : 0; + } + if (rows > 0) { + cleanOnlineUserByRole(roleId); + } + return rows; + } + + @Override + public void cleanOnlineUserByRole(Long roleId) { + // 如果角色未绑定用户 直接返回 + Long num = userRoleMapper.selectCount(new LambdaQueryWrapper().eq(SysUserRole::getRoleId, roleId)); + if (num == 0) { + return; + } + List keys = StpUtil.searchTokenValue("", 0, -1, false); + if (CollUtil.isEmpty(keys)) { + return; + } + // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 + keys.parallelStream().forEach(key -> { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(token); + if (loginUser != null && loginUser.getRoles() != null && loginUser.getRoles().stream().anyMatch(r -> roleId.equals(r.getRoleId()))) { + try { + StpUtil.logoutByTokenValue(token); + } catch (NotLoginException ignored) { + } + } + }); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 0000000..369ac6a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotEmpty(roleKey); + boolean permsExist = StringUtils.isNotEmpty(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java new file mode 100644 index 0000000..a35a708 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java @@ -0,0 +1,107 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.domain.SysSocial; +import org.dromara.system.domain.bo.SysSocialBo; +import org.dromara.system.domain.vo.SysSocialVo; +import org.dromara.system.mapper.SysSocialMapper; +import org.dromara.system.service.ISysSocialService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 社会化关系Service业务层处理 + * + * @author thiszhc + * @date 2023-06-12 + */ +@RequiredArgsConstructor +@Service +public class SysSocialServiceImpl implements ISysSocialService { + + private final SysSocialMapper baseMapper; + + + /** + * 查询社会化关系 + */ + @Override + public SysSocialVo queryById(String id) { + return baseMapper.selectVoById(id); + } + + /** + * 授权列表 + */ + @Override + public List queryList() { + return baseMapper.selectVoList(); + } + + @Override + public List queryListByUserId(Long userId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getUserId, userId)); + } + + + /** + * 新增社会化关系 + */ + @Override + public Boolean insertByBo(SysSocialBo bo) { + SysSocial add = MapstructUtils.convert(bo, SysSocial.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + if (add != null) { + bo.setId(add.getId()); + } else { + return false; + } + } + return flag; + } + + /** + * 更新社会化关系 + */ + @Override + public Boolean updateByBo(SysSocialBo bo) { + SysSocial update = MapstructUtils.convert(bo, SysSocial.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysSocial entity) { + //TODO 做一些数据校验,如唯一约束 + } + + + /** + * 删除社会化关系 + */ + @Override + public Boolean deleteWithValidById(Long id) { + return baseMapper.deleteById(id) > 0; + } + + + /** + * 根据 authId 查询用户信息 + * + * @param authId 认证id + * @return 授权信息 + */ + @Override + public List selectByAuthId(String authId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getAuthId, authId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java new file mode 100644 index 0000000..f7f8d46 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -0,0 +1,145 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.mapper.SysTenantMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantPackageServiceImpl implements ISysTenantPackageService { + + private final SysTenantPackageMapper baseMapper; + private final SysTenantMapper tenantMapper; + + /** + * 查询租户套餐 + */ + @Override + public SysTenantPackageVo queryById(Long packageId){ + return baseMapper.selectVoById(packageId); + } + + /** + * 查询租户套餐列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List selectList() { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(SysTenantPackage::getStatus, TenantConstants.NORMAL)); + } + + /** + * 查询租户套餐列表 + */ + @Override + public List queryList(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenantPackage::getPackageId); + return lqw; + } + + /** + * 新增租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantPackageBo bo) { + SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + add.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + add.setMenuIds(""); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPackageId(add.getPackageId()); + } + return flag; + } + + /** + * 修改租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysTenantPackageBo bo) { + SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + update.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + update.setMenuIds(""); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 修改套餐状态 + * + * @param bo 套餐信息 + * @return 结果 + */ + @Override + public int updatePackageStatus(SysTenantPackageBo bo) { + SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class); + return baseMapper.updateById(tenantPackage); + } + + /** + * 批量删除租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids)); + if (exists) { + throw new ServiceException("租户套餐已被使用"); + } + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java new file mode 100644 index 0000000..516149f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,372 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysTenantService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 租户Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantServiceImpl implements ISysTenantService { + + private final SysTenantMapper baseMapper; + private final SysTenantPackageMapper tenantPackageMapper; + private final SysUserMapper userMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysRoleDeptMapper roleDeptMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysDictTypeMapper dictTypeMapper; + private final SysDictDataMapper dictDataMapper; + private final SysConfigMapper configMapper; + + /** + * 查询租户 + */ + @Override + public SysTenantVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 基于租户ID查询租户 + */ + @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") + @Override + public SysTenantVo queryByTenantId(String tenantId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId)); + } + + /** + * 查询租户列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询租户列表 + */ + @Override + public List queryList(SysTenantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()); + lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName()); + lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); + lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); + lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); + lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); + lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenant::getId); + return lqw; + } + + /** + * 新增租户 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantBo bo) { + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);}); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); + + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); + + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); + + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); + + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); + //新增系统用户后,默认当前用户为部门的负责人 + SysDept sd = new SysDept(); + sd.setLeader(user.getUserId()); + sd.setDeptId(deptId); + deptMapper.updateById(sd); + + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); + return true; + } + + /** + * 生成租户id + * + * @param tenantIds 已有租户id列表 + * @return 租户id + */ + private String generateTenantId(List tenantIds) { + // 随机生成6位 + String numbers = RandomUtil.randomNumbers(6); + // 判断是否存在,如果存在则重新生成 + if (tenantIds.contains(numbers)) { + generateTenantId(tenantIds); + } + return numbers; + } + + /** + * 根据租户菜单创建租户角色 + * + * @param tenantId 租户编号 + * @param packageId 租户套餐id + * @return 角色id + */ + private Long createTenantRole(String tenantId, Long packageId) { + // 获取租户套餐 + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + if (ObjectUtil.isNull(tenantPackage)) { + throw new ServiceException("套餐不存在"); + } + // 获取套餐菜单id + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + + // 创建角色 + SysRole role = new SysRole(); + role.setTenantId(tenantId); + role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); + role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); + role.setRoleSort(1); + role.setStatus(TenantConstants.NORMAL); + roleMapper.insert(role); + Long roleId = role.getRoleId(); + + // 创建角色菜单 + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.insertBatch(roleMenus); + + return roleId; + } + + /** + * 修改租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public Boolean updateByBo(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + tenant.setTenantId(null); + tenant.setPackageId(null); + return baseMapper.updateById(tenant) > 0; + } + + /** + * 修改租户状态 + * + * @param bo 租户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public int updateTenantStatus(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + return baseMapper.updateById(tenant); + } + + /** + * 校验租户是否允许操作 + * + * @param tenantId 租户ID + */ + @Override + public void checkTenantAllowed(String tenantId) { + if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + throw new ServiceException("不允许操作管理租户"); + } + } + + /** + * 批量删除租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) { + throw new ServiceException("超管租户不能删除"); + } + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 校验企业名称是否唯一 + */ + @Override + public boolean checkCompanyNameUnique(SysTenantBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenant::getCompanyName, bo.getCompanyName()) + .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); + return !exist; + } + + /** + * 校验账号余额 + */ + @Override + public boolean checkAccountBalance(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果余额为-1代表不限制 + if (tenant.getAccountCount() == -1) { + return true; + } + Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>()); + // 如果余额大于0代表还有可用名额 + return tenant.getAccountCount() - userNumber > 0; + } + + /** + * 校验有效期 + */ + @Override + public boolean checkExpireTime(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果未设置过期时间代表不限制 + if (ObjectUtil.isNull(tenant.getExpireTime())) { + return true; + } + // 如果当前时间在过期时间之前则通过 + return new Date().before(tenant.getExpireTime()); + } + + /** + * 同步租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean syncTenantPackage(String tenantId, Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java new file mode 100644 index 0000000..cb50e70 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUnitDomainServiceImpl.java @@ -0,0 +1,133 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysUnitDomainBo; +import org.dromara.system.domain.vo.SysUnitDomainVo; +import org.dromara.system.domain.SysUnitDomain; +import org.dromara.system.mapper.SysUnitDomainMapper; +import org.dromara.system.service.ISysUnitDomainService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 单位域名配置Service业务层处理 + * + * @author LionLi + * @date 2024-03-29 + */ +@RequiredArgsConstructor +@Service +public class SysUnitDomainServiceImpl implements ISysUnitDomainService { + + private final SysUnitDomainMapper baseMapper; + + /** + * 查询单位域名配置 + */ + @Override + public SysUnitDomainVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + @Override + public SysUnitDomainVo queryByDomainName(String domain) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysUnitDomain::getDomainName,domain); + return baseMapper.selectVoOne(lqw); + } + + /** + * 查询单位域名配置列表 + */ + @Override + public TableDataInfo queryPageList(SysUnitDomainBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询单位域名配置列表 + */ + @Override + public List queryList(SysUnitDomainBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysUnitDomainBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDomainName()), SysUnitDomain::getDomainName, bo.getDomainName()); + lqw.like(StringUtils.isNotBlank(bo.getWebsiteName()), SysUnitDomain::getWebsiteName, bo.getWebsiteName()); + lqw.eq(StringUtils.isNotBlank(bo.getHotline()), SysUnitDomain::getHotline, bo.getHotline()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyright()), SysUnitDomain::getCopyright, bo.getCopyright()); + lqw.eq(StringUtils.isNotBlank(bo.getRecordNo()), SysUnitDomain::getRecordNo, bo.getRecordNo()); + lqw.eq(StringUtils.isNotBlank(bo.getCopyrightUrl()), SysUnitDomain::getCopyrightUrl, bo.getCopyrightUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageLogo()), SysUnitDomain::getLoginPageLogo, bo.getLoginPageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getLoginPageBanner()), SysUnitDomain::getLoginPageBanner, bo.getLoginPageBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getHomePageLogo()), SysUnitDomain::getHomePageLogo, bo.getHomePageLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapLogo()), SysUnitDomain::getWapLogo, bo.getWapLogo()); + lqw.eq(StringUtils.isNotBlank(bo.getWapBanner()), SysUnitDomain::getWapBanner, bo.getWapBanner()); + lqw.eq(StringUtils.isNotBlank(bo.getWeChatPub()), SysUnitDomain::getWeChatPub, bo.getWeChatPub()); + lqw.eq(StringUtils.isNotBlank(bo.getPcLoginProtocol()), SysUnitDomain::getPcLoginProtocol, bo.getPcLoginProtocol()); + lqw.eq(StringUtils.isNotBlank(bo.getMobileUserAgreement()), SysUnitDomain::getMobileUserAgreement, bo.getMobileUserAgreement()); + lqw.eq(StringUtils.isNotBlank(bo.getPrivacyAgreement()), SysUnitDomain::getPrivacyAgreement, bo.getPrivacyAgreement()); + lqw.eq(bo.getStatus() != null, SysUnitDomain::getStatus, bo.getStatus()); + lqw.eq(bo.getBusRole() != null, SysUnitDomain::getBusRole, bo.getBusRole()); + lqw.eq(bo.getBusId() != null, SysUnitDomain::getBusId, bo.getBusId()); + return lqw; + } + + /** + * 新增单位域名配置 + */ + @Override + public Boolean insertByBo(SysUnitDomainBo bo) { + SysUnitDomain add = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改单位域名配置 + */ + @Override + public Boolean updateByBo(SysUnitDomainBo bo) { + SysUnitDomain update = MapstructUtils.convert(bo, SysUnitDomain.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysUnitDomain entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除单位域名配置 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..9470b57 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,822 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.BusRole; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.BaseService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.resource.api.RemoteWeiXinService; +import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 用户 业务层处理 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysUserServiceImpl extends BaseService implements ISysUserService { + + private final SysUserMapper baseMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysPostMapper postMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysUserPostMapper userPostMapper; + private final SysUserMenuMapper sysUserMenuMapper; + + + @Value("${weixin.scanUrl}") + private String scanUrl; + private String scanRedirectUrl; + + @DubboReference + public RemoteWeiXinService remoteWeiXinService; + + + @Override + public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserList(SysUserBo user) { + return baseMapper.selectUserList(this.buildQueryWrapper(user)); + } + + private Wrapper buildQueryWrapper(SysUserBo user) { + Map params = user.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "u.create_time", params.get("beginTime"), params.get("endTime")) + .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors"))); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(user.getDeptId()); + w.in("u.dept_id", ids); + }).orderByAsc("u.user_id"); + return wrapper; + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery) { + List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) + .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds) + .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserByUserName(String userName) { + return baseMapper.selectUserByUserName(userName); + } + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserByPhonenumber(String phonenumber) { + return baseMapper.selectUserByPhonenumber(phonenumber); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUserVo selectUserById(Long userId) { + return baseMapper.selectUserById(userId); + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) { + List list = roleMapper.selectRolesByUserName(userName); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, SysRoleVo::getRoleName); + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) { + List list = postMapper.selectPostsByUserName(userName); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, SysPostVo::getPostName); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(SysUserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, user.getUserName()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + */ + @Override + public boolean checkPhoneUnique(SysUserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getPhonenumber, user.getPhonenumber()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + */ + @Override + public boolean checkEmailUnique(SysUserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getEmail, user.getEmail()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + @Override + public void checkUserAllowed(Long userId) { + if (ObjectUtil.isNotNull(userId) && LoginHelper.isSuperAdmin(userId)) { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) { + if (ObjectUtil.isNull(userId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (ObjectUtil.isNull(baseMapper.selectUserById(userId))) { + throw new ServiceException("没有权限访问用户数据!"); + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertUser(SysUserBo user) { + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 新增用户信息 + int rows = baseMapper.insert(sysUser); + user.setUserId(sysUser.getUserId()); + // 新增用户岗位关联 + insertUserPost(user, false); + // 新增用户与角色管理 + insertUserRole(user, false); + return rows; + } + + + @Transactional + public int insertUserNew(SysUserBo user){ + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + LoginUser loginUser = LoginHelper.getLoginUser(); + sysUser.setStatus("0"); + sysUser.setRoleId(LoginHelper.getBusRole()); + sysUser.setCreateBy(LoginHelper.getUserId()); + sysUser.setRoleName(BusRole.getName(sysUser.getRoleId())); + if(StringUtils.isNotEmpty(loginUser.getIds())){ + sysUser.setIds(loginUser.getIds()+","+loginUser.getUserId()); + }else{ + sysUser.setIds(loginUser.getUserId()+""); + } + sysUser.setBusId(LoginHelper.getBusId()); + sysUser.setBusNo(LoginHelper.getNo()); + sysUser.setDelFlag("0"); + return this.baseMapper.insert(sysUser); + } + + + /*** + * 给操作员分配权限 + * @param user + * @return + */ + @Override + @Transactional + public Boolean configUserPer(SysUserBo user) { + + if(user.getUserId() == null){ + this.invalidationParamsException("操作员用户ID不能为空"); + } + +// if(user.getMenuIds() == null || user.getMenuIds().length == 0){ +// this.invalidationParamsException("权限列表不能为空"); +// } + + this.sysUserMenuMapper.delete(new LambdaQueryWrapper().eq(SysUserMenu::getUserId,user.getUserId())); + + List list = new ArrayList<>(); + for (Long menuId : user.getMenuIds()) { + SysUserMenu sysUserMenu = new SysUserMenu(); + sysUserMenu.setUserId(user.getUserId()); + sysUserMenu.setMenuId(menuId); + list.add(sysUserMenu); + } + this.sysUserMenuMapper.insertBatch(list); + + return true; + } + + + /*** + * 变更登录方式 + * @param userId + * @param loginType + * @return + */ + @Override + public int updLoginWay(Long userId, Integer loginType) { + + if(loginType == null || (loginType != 1 && loginType != 2)){ + this.invalidationParamsException("传入参数无效"); + } + + SysUserVo suv = this.selectUserById(userId); + if(suv == null){ + this.invalidationParamsException("无效用户"); + } + + if(StringUtils.isEmpty(suv.getBindOpenId()) && loginType == 2){ + this.invalidationParamsException("请先进行扫码绑定微信!"); + } + SysUser user = new SysUser(); + user.setUserId(userId); + user.setLoginType(loginType); + user.setUpdateTime(new Date()); + user.setUpdateBy(userId); + return this.baseMapper.updateById(user); + } + + + /*** + * 查询登录方式 + * @param userId + * @return + */ + @Override + public Integer selLoginWay(Long userId) { + SysUserVo vo = this.baseMapper.selectUserById(userId); + return vo.getLoginType(); + } + + + + @Override + @Transactional + public int insertBusUser(SysUser sysUser) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, sysUser.getUserName()) + .ne(ObjectUtil.isNotNull(sysUser.getUserId()), SysUser::getUserId, sysUser.getUserId())); + if(exist){ + return -1; + } + int rows = baseMapper.insert(sysUser); + SysUserRole ur = new SysUserRole(); + ur.setUserId(sysUser.getUserId()); + ur.setRoleId(Long.valueOf(sysUser.getRoleId().toString())); + this.userRoleMapper.insert(ur); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUserBo user, String tenantId) { + user.setCreateBy(user.getUserId()); + user.setUpdateBy(user.getUserId()); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + sysUser.setTenantId(tenantId); + return baseMapper.insert(sysUser) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateUser(SysUserBo user) { + // 新增用户与角色管理 + insertUserRole(user, true); + // 新增用户与岗位管理 + insertUserPost(user, true); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sysUser); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; + } + + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateUserNew(SysUserBo user) { + // 新增用户与角色管理 + // 新增用户与岗位管理 + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sysUser); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; + } + + @Override + public int updateUserInfos(SysUser sysUser) { + if(sysUser.getUserId() == null){ + this.invalidationParamsException("用户ID不能为空"); + } + return this.baseMapper.updateById(sysUser); + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void insertUserAuth(Long userId, Long[] roleIds) { + insertUserRole(userId, roleIds, true); + } + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + @Override + public int updateUserStatus(Long userId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getStatus, status) + .eq(SysUser::getUserId, userId)); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUserBo user) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName()) + .set(StringUtils.isNotBlank(user.getPhonenumber()),SysUser::getPhonenumber, user.getPhonenumber()) + .set(StringUtils.isNotBlank(user.getEmail()),SysUser::getEmail, user.getEmail()) + .set(StringUtils.isNotBlank(user.getSex()),SysUser::getSex, user.getSex()) + .set(StringUtils.isNotBlank(user.getIsReadProt()),SysUser::getIsReadProt, user.getIsReadProt()) + .set(StringUtils.isNotBlank(user.getIsResetPass()),SysUser::getIsResetPass, user.getIsResetPass()) + .eq(SysUser::getUserId, user.getUserId())); + } + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(Long userId, Long avatar) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getAvatar, avatar) + .eq(SysUser::getUserId, userId)) > 0; + } + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(Long userId, String password) { + return baseMapper.update( null, new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserId, userId)); + } + + @Override + public int resetMyPwd(String srcPwd, String newPwd, String surePwd) { + if(StringUtils.isEmpty(srcPwd)){ + this.invalidationParamsException("原始密码不能为空"); + } + if(StringUtils.isEmpty(newPwd)){ + this.invalidationParamsException("新密码不能为空"); + } + if(StringUtils.isEmpty(surePwd)){ + this.invalidationParamsException("确认新密码不能为空"); + } + + if(!newPwd.equals(surePwd)){ + this.invalidationParamsException("新密码和确认新密码不一致"); + } + Long userId = LoginHelper.getUserId(); + + SysUserVo sysUserVo = this.baseMapper.selectUserById(userId); + + if(!BCrypt.checkpw(srcPwd,sysUserVo.getPassword())){ + this.invalidationParamsException("原始密码错误"); + } + + String password = BCrypt.hashpw(newPwd); + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .set(SysUser::getIsResetPass,1) + .eq(SysUser::getUserId, userId)); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(SysUserBo user, boolean clear) { + this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserPost(SysUserBo user, boolean clear) { + Long[] posts = user.getPostIds(); + if (ArrayUtil.isNotEmpty(posts)) { + if (clear) { + // 删除用户与岗位关联 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, user.getUserId())); + } + // 新增用户与岗位管理 + List list = StreamUtils.toList(Arrays.asList(posts), postId -> { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + return up; + }); + userPostMapper.insertBatch(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { + if (ArrayUtil.isNotEmpty(roleIds)) { + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList(new LambdaQueryWrapper<>()); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色的数据"); + } + List roleList = StreamUtils.toList(roles, SysRoleVo::getRoleId); + if (!LoginHelper.isSuperAdmin(userId)) { + roleList.remove(UserConstants.SUPER_ADMIN_ID); + } + List canDoRoleList = StreamUtils.filter(Arrays.asList(roleIds), roleList::contains); + if (CollUtil.isEmpty(canDoRoleList)) { + throw new ServiceException("没有权限访问角色的数据"); + } + if (clear) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + } + // 新增用户与角色管理 + List list = StreamUtils.toList(canDoRoleList, roleId -> { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + userRoleMapper.insertBatch(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserById(Long userId) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteById(userId); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserByIds(Long[] userIds) { + for (Long userId : userIds) { + checkUserAllowed(userId); + checkUserDataScope(userId); + } + List ids = Arrays.asList(userIds); + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, ids)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().in(SysUserPost::getUserId, ids)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteBatchIds(ids); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId + * @return + */ + @Override + public List selectUserListByDept(Long deptId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysUser::getDeptId, deptId); + lqw.orderByAsc(SysUser::getUserId); + return baseMapper.selectVoList(lqw); + } + + @Override + public TableDataInfo selNewUserList(SysUserBo user, PageQuery pageQuery) { + LoginUser loginUser = LoginHelper.getLoginUser(); + QueryWrapper lqw = Wrappers.query(); + + lqw.like(StringUtils.isNotEmpty(user.getUserName()),"t.user_name",user.getUserName()); + lqw.like(StringUtils.isNotEmpty(user.getNickName()),"t.nick_name",user.getNickName()); + lqw.like(StringUtils.isNotEmpty(user.getPhonenumber()),"t.phonenumber",user.getPhonenumber()); + lqw.like(StringUtils.isNotEmpty(user.getUnitNo()),"t1.no",user.getUnitNo()); + lqw.like(StringUtils.isNotEmpty(user.getUnitName()),"t1.name",user.getUnitName()); + lqw.eq(user.getRoleId() != null ,"t.role_id",user.getRoleId()); + lqw.eq("t.del_flag","0"); + lqw.ne("t.user_id",loginUser.getUserId()); + + lqw.eq(StringUtils.isNotEmpty(user.getStatus()),"t.status",user.getStatus()); + int busRole = loginUser.getBusRole(); + if(busRole != BusRole.PLATFORM.getId()){ + int roleDataRange = loginUser.getRoleDataRange(); + if(roleDataRange == 1){ + lqw.eq("t1.id",loginUser.getBusId()); +// lqw.ne("t.id",loginUser.getUserId()); + }else{ + lqw.eq("t1.id",loginUser.getBusId()); +// lqw.ne("t.id",loginUser.getUserId()); + lqw.likeRight(StringUtils.isNotEmpty(loginUser.getIds()),"t.ids",loginUser.getIds()); + } + } + + lqw.orderByDesc("t.create_time"); + Page page = baseMapper.selNewUserList(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + @Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId") + @Override + public String selectUserNameById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName(); + } + + @Override + @Cacheable(cacheNames = CacheNames.SYS_NICKNAME, key = "#userId") + public String selectNicknameById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getNickName).eq(SysUser::getUserId, userId)); + return ObjectUtil.isNull(sysUser) ? null : sysUser.getNickName(); + } + + + /**** + * 绑定二维码 + * @param domain + * @return + */ + @Override + public String getBindingQr(String domain){ + Long userId = LoginHelper.getUserId(); + SysUserVo userVo = this.baseMapper.selectUserById(userId); + String url=scanUrl+"index.html"+"?username="+userVo.getUserName()+"&domain="+ Base64.encode(domain); + String qrUrl = this.remoteWeiXinService.genPubAuthQrcode(domain,url); + if(StringUtils.isEmpty(qrUrl)){ + this.invalidationParamsException("获取二维码失败"); + } + return qrUrl; + } + + + @Override + public Boolean bindWeixinOpenId(String domain,String code,String username){ + + domain = Base64.decodeStr(domain); + String openId = this.remoteWeiXinService.getOpenId(domain,code); + if(StringUtils.isEmpty(openId)){ + this.invalidationParamsException("获取OpenId失败"); + } + + SysUserVo vo = this.baseMapper.selectUserByUserName(username); + if(vo == null){ + this.invalidationParamsException("用户名无效!"); + } + SysUser user = new SysUser(); + user.setUserId(vo.getUserId()); + user.setBindOpenId(openId); + user.setUpdateTime(new Date()); + this.baseMapper.updateBindUserOpenid(user); + return true; + + } + + @Override + public String updateReadProTag() { + Long userId = LoginHelper.getUserId(); + SysUser user = new SysUser(); + user.setIsReadProt(1); + user.setUserId(userId); + user.setUpdateTime(new Date()); + user.setUpdateBy(userId); + this.baseMapper.updateById(user); + return "true"; + } + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/application.yml b/ruoyi-modules/ruoyi-system/src/main/resources/application.yml new file mode 100644 index 0000000..4000023 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/application.yml @@ -0,0 +1,36 @@ +# Tomcat +server: + port: 9201 + +# Spring +spring: + application: + # 应用名称 + name: ruoyi-system + profiles: + # 环境配置 + active: @profiles.active@ + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + username: nacos + password: baidu123 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + username: nacos + password: baidu123 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/banner.txt b/ruoyi-modules/ruoyi-system/src/main/resources/banner.txt new file mode 100644 index 0000000..fbd45f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ + (_) | | + _ __ _ _ ___ _ _ _ ______ ___ _ _ ___ | |_ ___ _ __ ___ +| '__|| | | | / _ \ | | | || ||______|/ __|| | | |/ __|| __| / _ \| '_ ` _ \ +| | | |_| || (_) || |_| || | \__ \| |_| |\__ \| |_ | __/| | | | | | +|_| \__,_| \___/ \__, ||_| |___/ \__, ||___/ \__| \___||_| |_| |_| + __/ | __/ | + |___/ |___/ \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml b/ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md new file mode 100644 index 0000000..c938b1e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml new file mode 100644 index 0000000..d37a05c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/CommonMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + insert into bpm_order_num(dtm_time,v_process_name,i_max_num)values( + #{dtm_time},#{v_process_name},#{i_max_num} ) + + + + + + update bpm_order_num set i_max_num = #{i_max_num} where v_process_name = #{v_process_name} and dtm_time = #{dtm_time} + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml new file mode 100644 index 0000000..a7e7f0c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAreaMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml new file mode 100644 index 0000000..fd150ad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysClientMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..e542a10 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..bba949d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..6bcce51 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..6975da4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml new file mode 100644 index 0000000..1da9ac6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysIndustryMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..c64b551 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..a5da51f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 0000000..f666773 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + insert into sys_notice_user_reader(notice_id,user_id,create_time ) + values (#{noticeId},#{userId},now()) + + + + insert into sys_notice_role(notice_id,bus_role ) + values + + + + (#{noticeId},#{item} ) + + + + + + delete from sys_notice_role where notice_id = #{noticeId} + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..5ef14ee --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..d2108eb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..1705bb2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..b191698 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark + from sys_role r + left join sys_user_role sur on sur.role_id = r.role_id + left join sys_user u on u.user_id = sur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..f01dc5e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml new file mode 100644 index 0000000..baa4b59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysSocialMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml new file mode 100644 index 0000000..0d96e13 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml new file mode 100644 index 0000000..79cf4c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml new file mode 100644 index 0000000..d501f23 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUnitDomainMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..c7e53e3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, + u.tenant_id, + u.dept_id, + u.user_name, + u.nick_name, + u.user_type, + u.email, + u.avatar, + u.phonenumber, + u.password, + u.sex, + u.status, + u.ids, + u.del_flag, + u.login_first, + u.login_ip, + u.login_date, + u.create_by, + u.create_time, + u.remark, + u.login_type, + u.bind_open_id, + u.is_read_prot, + u.is_reset_pass, + u.is_reset_paypass, + u.bus_id, + u.bus_no, + u.role_id cur_role_id, + u.role_name cur_role_name, + u.bus_id, + u.role_data_range, + d.dept_id, + d.parent_id, + d.ancestors, + d.dept_name, + d.order_num, + d.leader, + d.status as dept_status, + r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.status as role_status, + su.name as unitName + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role sur on u.user_id = sur.user_id + left join sys_role r on r.role_id = sur.role_id + left join sys_unit su on u.bus_id = su.id + + + + + + + + + + + + + + + + + + + + + + + + + update sys_user set bind_open_id = #{bindOpenId},update_time = now() where user_id = #{userId} + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml new file mode 100644 index 0000000..0401f2e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMenuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 0000000..e9f2496 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..bc52d1a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml new file mode 100644 index 0000000..b7125c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/UserWorkerMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/spy.properties b/ruoyi-modules/ruoyi-system/src/main/resources/spy.properties new file mode 100644 index 0000000..abbd893 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/spy.properties @@ -0,0 +1,28 @@ +# p6spy 性能分析插件配置文件 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +#deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 +# 是否过滤 Log +filter=true +# 过滤 Log 时所排除的 sql 关键字,以逗号分隔 +exclude=SELECT 1 diff --git a/ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java b/ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java new file mode 100644 index 0000000..df2d500 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/test/java/org/dromara/system/service/impl/SysIndustryServiceImplTest.java @@ -0,0 +1,142 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.IdUtil; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysIndustry; +import org.dromara.system.domain.bo.SysIndustryBo; +import org.dromara.system.mapper.SysDictDataMapper; +import org.dromara.system.mapper.SysIndustryMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class SysIndustryServiceImplTest { + + @Autowired + private SysIndustryServiceImpl sysIndustryService; + + @Autowired + private SysIndustryMapper baseMapper; + + @Autowired + private SysDictDataMapper sysDictDataMapper; + + + + @Test + public void testInsertDictData(){ + + String json = "{\"success\":true,\"message\":\"操作成功!\",\"code\":0,\"result\":[{\"value\":\"102100099996\",\"text\":\"中国工商银行\",\"title\":\"中国工商银行\"},{\"value\":\"103100000026\",\"text\":\"中国农业银行\",\"title\":\"中国农业银行\"},{\"value\":\"104100000004\",\"text\":\"中国银行\",\"title\":\"中国银行\"},{\"value\":\"403100000004\",\"text\":\"中国邮政储蓄银行\",\"title\":\"中国邮政储蓄银行\"},{\"value\":\"301290000007\",\"text\":\"交通银行\",\"title\":\"交通银行\"},{\"value\":\"302100011000\",\"text\":\"中信银行\",\"title\":\"中信银行\"},{\"value\":\"303100000006\",\"text\":\"中国光大银行\",\"title\":\"中国光大银行\"},{\"value\":\"304100040000\",\"text\":\"华夏银行\",\"title\":\"华夏银行\"},{\"value\":\"305100000013\",\"text\":\"中国民生银行\",\"title\":\"中国民生银行\"},{\"value\":\"306581000003\",\"text\":\"广发银行\",\"title\":\"广发银行\"},{\"value\":\"307584007998\",\"text\":\"平安银行\",\"title\":\"平安银行\"},{\"value\":\"308584000013\",\"text\":\"招商银行\",\"title\":\"招商银行\"},{\"value\":\"309391000011\",\"text\":\"兴业银行\",\"title\":\"兴业银行\"},{\"value\":\"310290000013\",\"text\":\"上海浦东发展银行\",\"title\":\"上海浦东发展银行\"},{\"value\":\"313100000013\",\"text\":\"北京银行\",\"title\":\"北京银行\"},{\"value\":\"313110000017\",\"text\":\"天津银行\",\"title\":\"天津银行\"},{\"value\":\"313121006888\",\"text\":\"河北银行\",\"title\":\"河北银行\"},{\"value\":\"313124000018\",\"text\":\"唐山银行\",\"title\":\"唐山银行\"},{\"value\":\"313126001022\",\"text\":\"秦皇岛银行\",\"title\":\"秦皇岛银行\"},{\"value\":\"313127000013\",\"text\":\"邯郸银行\",\"title\":\"邯郸银行\"},{\"value\":\"313131000016\",\"text\":\"邢台银行\",\"title\":\"邢台银行\"},{\"value\":\"313134000011\",\"text\":\"保定银行\",\"title\":\"保定银行\"},{\"value\":\"313138000019\",\"text\":\"张家口银行\",\"title\":\"张家口银行\"},{\"value\":\"313141052422\",\"text\":\"承德银行\",\"title\":\"承德银行\"},{\"value\":\"313143005157\",\"text\":\"沧州银行\",\"title\":\"沧州银行\"},{\"value\":\"313146000019\",\"text\":\"廊坊银行\",\"title\":\"廊坊银行\"},{\"value\":\"313148053964\",\"text\":\"衡水银行\",\"title\":\"衡水银行\"},{\"value\":\"313161000017\",\"text\":\"晋商银行\",\"title\":\"晋商银行\"},{\"value\":\"313162055820\",\"text\":\"大同银行\",\"title\":\"大同银行\"},{\"value\":\"313163000004\",\"text\":\"阳泉市商业银行\",\"title\":\"阳泉市商业银行\"},{\"value\":\"313164000006\",\"text\":\"长治银行\",\"title\":\"长治银行\"},{\"value\":\"313168000003\",\"text\":\"晋城银行\",\"title\":\"晋城银行\"},{\"value\":\"313175000011\",\"text\":\"晋中银行\",\"title\":\"晋中银行\"},{\"value\":\"313191000011\",\"text\":\"内蒙古银行\",\"title\":\"内蒙古银行\"},{\"value\":\"313192000013\",\"text\":\"包商银行\",\"title\":\"包商银行\"},{\"value\":\"313193057846\",\"text\":\"乌海银行\",\"title\":\"乌海银行\"},{\"value\":\"313221030008\",\"text\":\"盛京银行\",\"title\":\"盛京银行\"},{\"value\":\"313205057830\",\"text\":\"鄂尔多斯银行\",\"title\":\"鄂尔多斯银行\"},{\"value\":\"313222080002\",\"text\":\"大连银行\",\"title\":\"大连银行\"},{\"value\":\"313223007007\",\"text\":\"鞍山银行\",\"title\":\"鞍山银行\"},{\"value\":\"313224000015\",\"text\":\"抚顺银行\",\"title\":\"抚顺银行\"},{\"value\":\"313225000017\",\"text\":\"本溪市商业银行\",\"title\":\"本溪市商业银行\"},{\"value\":\"313226009000\",\"text\":\"丹东银行\",\"title\":\"丹东银行\"},{\"value\":\"313227000012\",\"text\":\"锦州银行\",\"title\":\"锦州银行\"},{\"value\":\"313227600018\",\"text\":\"葫芦岛银行\",\"title\":\"葫芦岛银行\"},{\"value\":\"313228000276\",\"text\":\"营口银行\",\"title\":\"营口银行\"},{\"value\":\"313228060009\",\"text\":\"营口沿海银行\",\"title\":\"营口沿海银行\"},{\"value\":\"313229000008\",\"text\":\"阜新银行\",\"title\":\"阜新银行\"},{\"value\":\"313231000013\",\"text\":\"辽阳银行\",\"title\":\"辽阳银行\"},{\"value\":\"313232000015\",\"text\":\"盘锦银行\",\"title\":\"盘锦银行\"},{\"value\":\"313233000017\",\"text\":\"铁岭银行\",\"title\":\"铁岭银行\"},{\"value\":\"313234001089\",\"text\":\"朝阳银行\",\"title\":\"朝阳银行\"},{\"value\":\"313241066661\",\"text\":\"吉林银行\",\"title\":\"吉林银行\"},{\"value\":\"313261000018\",\"text\":\"哈尔滨银行\",\"title\":\"哈尔滨银行\"},{\"value\":\"313261099913\",\"text\":\"龙江银行\",\"title\":\"龙江银行\"},{\"value\":\"313301008887\",\"text\":\"南京银行\",\"title\":\"南京银行\"},{\"value\":\"313301099999\",\"text\":\"江苏银行\",\"title\":\"江苏银行\"},{\"value\":\"313305066661\",\"text\":\"苏州银行\",\"title\":\"苏州银行\"},{\"value\":\"313312300018\",\"text\":\"江苏长江商业银行\",\"title\":\"江苏长江商业银行\"},{\"value\":\"313331000014\",\"text\":\"杭州银行\",\"title\":\"杭州银行\"},{\"value\":\"313332040018\",\"text\":\"宁波东海银行\",\"title\":\"宁波东海银行\"},{\"value\":\"313332082914\",\"text\":\"宁波银行\",\"title\":\"宁波银行\"},{\"value\":\"313332090019\",\"text\":\"宁波通商银行\",\"title\":\"宁波通商银行\"},{\"value\":\"313333007331\",\"text\":\"温州银行\",\"title\":\"温州银行\"},{\"value\":\"313335081005\",\"text\":\"嘉兴银行\",\"title\":\"嘉兴银行\"},{\"value\":\"313336071575\",\"text\":\"湖州银行\",\"title\":\"湖州银行\"},{\"value\":\"313337009004\",\"text\":\"绍兴银行\",\"title\":\"绍兴银行\"},{\"value\":\"313338009688\",\"text\":\"金华银行\",\"title\":\"金华银行\"},{\"value\":\"313338707013\",\"text\":\"浙江稠州商业银行\",\"title\":\"浙江稠州商业银行\"},{\"value\":\"313345001665\",\"text\":\"台州银行\",\"title\":\"台州银行\"},{\"value\":\"313345010019\",\"text\":\"浙江泰隆商业银行\",\"title\":\"浙江泰隆商业银行\"},{\"value\":\"313345400010\",\"text\":\"浙江民泰商业银行\",\"title\":\"浙江民泰商业银行\"},{\"value\":\"313391080007\",\"text\":\"福建海峡银行\",\"title\":\"福建海峡银行\"},{\"value\":\"313393080005\",\"text\":\"厦门银行\",\"title\":\"厦门银行\"},{\"value\":\"313397075189\",\"text\":\"泉州银行\",\"title\":\"泉州银行\"},{\"value\":\"313421087506\",\"text\":\"江西银行\",\"title\":\"江西银行\"},{\"value\":\"313424076706\",\"text\":\"九江银行\",\"title\":\"九江银行\"},{\"value\":\"313428076517\",\"text\":\"赣州银行\",\"title\":\"赣州银行\"},{\"value\":\"313433076801\",\"text\":\"上饶银行\",\"title\":\"上饶银行\"},{\"value\":\"313451000019\",\"text\":\"齐鲁银行\",\"title\":\"齐鲁银行\"},{\"value\":\"313452060150\",\"text\":\"青岛银行\",\"title\":\"青岛银行\"},{\"value\":\"313453001017\",\"text\":\"齐商银行\",\"title\":\"齐商银行\"},{\"value\":\"313454000016\",\"text\":\"枣庄银行\",\"title\":\"枣庄银行\"},{\"value\":\"313455000018\",\"text\":\"东营银行\",\"title\":\"东营银行\"},{\"value\":\"313456000108\",\"text\":\"烟台银行\",\"title\":\"烟台银行\"},{\"value\":\"313458000013\",\"text\":\"潍坊银行\",\"title\":\"潍坊银行\"},{\"value\":\"313461000012\",\"text\":\"济宁银行\",\"title\":\"济宁银行\"},{\"value\":\"313463000993\",\"text\":\"泰安银行\",\"title\":\"泰安银行\"},{\"value\":\"313463400019\",\"text\":\"莱商银行\",\"title\":\"莱商银行\"},{\"value\":\"313465000010\",\"text\":\"威海市商业银行\",\"title\":\"威海市商业银行\"},{\"value\":\"313468000015\",\"text\":\"德州银行\",\"title\":\"德州银行\"},{\"value\":\"313473070018\",\"text\":\"临商银行\",\"title\":\"临商银行\"},{\"value\":\"313473200011\",\"text\":\"日照银行\",\"title\":\"日照银行\"},{\"value\":\"313491000232\",\"text\":\"郑州银行\",\"title\":\"郑州银行\"},{\"value\":\"313491099996\",\"text\":\"中原银行\",\"title\":\"中原银行\"},{\"value\":\"313493080539\",\"text\":\"洛阳银行\",\"title\":\"洛阳银行\"},{\"value\":\"313495081900\",\"text\":\"平顶山银行\",\"title\":\"平顶山银行\"},{\"value\":\"313501080608\",\"text\":\"焦作中旅银行\",\"title\":\"焦作中旅银行\"},{\"value\":\"313521000011\",\"text\":\"汉口银行\",\"title\":\"汉口银行\"},{\"value\":\"313521006000\",\"text\":\"湖北银行\",\"title\":\"湖北银行\"},{\"value\":\"313551070008\",\"text\":\"华融湘江银行\",\"title\":\"华融湘江银行\"},{\"value\":\"313551088886\",\"text\":\"长沙银行\",\"title\":\"长沙银行\"},{\"value\":\"313581003284\",\"text\":\"广州银行\",\"title\":\"广州银行\"},{\"value\":\"313585000990\",\"text\":\"珠海华润银行\",\"title\":\"珠海华润银行\"},{\"value\":\"313586000006\",\"text\":\"广东华兴银行\",\"title\":\"广东华兴银行\"},{\"value\":\"313591001001\",\"text\":\"广东南粤银行\",\"title\":\"广东南粤银行\"},{\"value\":\"313602088017\",\"text\":\"东莞银行\",\"title\":\"东莞银行\"},{\"value\":\"313611001018\",\"text\":\"广西北部湾银行\",\"title\":\"广西北部湾银行\"},{\"value\":\"313614000012\",\"text\":\"柳州银行\",\"title\":\"柳州银行\"},{\"value\":\"313617000018\",\"text\":\"桂林银行\",\"title\":\"桂林银行\"},{\"value\":\"313641099995\",\"text\":\"海南银行\",\"title\":\"海南银行\"},{\"value\":\"313651099999\",\"text\":\"成都银行\",\"title\":\"成都银行\"},{\"value\":\"313653000013\",\"text\":\"重庆银行\",\"title\":\"重庆银行\"},{\"value\":\"313655091983\",\"text\":\"自贡银行\",\"title\":\"自贡银行\"},{\"value\":\"313651071504\",\"text\":\"四川银行\",\"title\":\"四川银行\"},{\"value\":\"313657092617\",\"text\":\"泸州市商业银\",\"title\":\"泸州市商业银\"},{\"value\":\"313658000014\",\"text\":\"长城华西银行\",\"title\":\"长城华西银行\"},{\"value\":\"313659000016\",\"text\":\"绵阳市商业银行\",\"title\":\"绵阳市商业银行\"},{\"value\":\"313662000015\",\"text\":\"遂宁银行\",\"title\":\"遂宁银行\"},{\"value\":\"313665092924\",\"text\":\"乐山市商业银行\",\"title\":\"乐山市商业银行\"},{\"value\":\"313671000017\",\"text\":\"宜宾市商业银\",\"title\":\"宜宾市商业银\"},{\"value\":\"313673093259\",\"text\":\"四川天府银行\",\"title\":\"四川天府银行\"},{\"value\":\"313675090019\",\"text\":\"达州市商业银行\",\"title\":\"达州市商业银行\"},{\"value\":\"313677000010\",\"text\":\"雅安市商业银行\",\"title\":\"雅安市商业银行\"},{\"value\":\"313684093748\",\"text\":\"凉山州商业银行\",\"title\":\"凉山州商业银行\"},{\"value\":\"313701098010\",\"text\":\"贵阳银行\",\"title\":\"贵阳银行\"},{\"value\":\"313701099012\",\"text\":\"贵州银行\",\"title\":\"贵州银行\"},{\"value\":\"313731010015\",\"text\":\"富滇银行\",\"title\":\"富滇银行\"},{\"value\":\"313736000019\",\"text\":\"曲靖市商业银行\",\"title\":\"曲靖市商业银行\"},{\"value\":\"313741095715\",\"text\":\"云南红塔银行\",\"title\":\"云南红塔银行\"},{\"value\":\"313770000016\",\"text\":\"西藏银行\",\"title\":\"西藏银行\"},{\"value\":\"313791000015\",\"text\":\"西安银行\",\"title\":\"西安银行\"},{\"value\":\"313791030003\",\"text\":\"长安银行\",\"title\":\"长安银行\"},{\"value\":\"313821001016\",\"text\":\"兰州银行\",\"title\":\"兰州银行\"},{\"value\":\"313821050016\",\"text\":\"甘肃银行\",\"title\":\"甘肃银行\"},{\"value\":\"313851000018\",\"text\":\"青海银行\",\"title\":\"青海银行\"},{\"value\":\"313871000007\",\"text\":\"宁夏银行\",\"title\":\"宁夏银行\"},{\"value\":\"313872097457\",\"text\":\"石嘴山银行\",\"title\":\"石嘴山银行\"},{\"value\":\"313881000002\",\"text\":\"乌鲁木齐银行\",\"title\":\"乌鲁木齐银行\"},{\"value\":\"313882000012\",\"text\":\"昆仑银行\",\"title\":\"昆仑银行\"},{\"value\":\"313884000016\",\"text\":\"哈密市商业银行\",\"title\":\"哈密市商业银行\"},{\"value\":\"313888000013\",\"text\":\"库尔勒银行\",\"title\":\"库尔勒银行\"},{\"value\":\"313898100016\",\"text\":\"新疆汇和银行\",\"title\":\"新疆汇和银行\"},{\"value\":\"314110000011\",\"text\":\"天津滨海农村商业银行\",\"title\":\"天津滨海农村商业银行\"},{\"value\":\"314222001893\",\"text\":\"大连农村商业银行\",\"title\":\"大连农村商业银行\"},{\"value\":\"314302066666\",\"text\":\"无锡农村商业银行\",\"title\":\"无锡农村商业银行\"},{\"value\":\"314302200018\",\"text\":\"江苏江阴农村商业银行\",\"title\":\"江苏江阴农村商业银行\"},{\"value\":\"314304099999\",\"text\":\"江苏江南农村商业银行\",\"title\":\"江苏江南农村商业银行\"},{\"value\":\"314305106644\",\"text\":\"太仓农村商业银行\",\"title\":\"太仓农村商业银行\"},{\"value\":\"314305506621\",\"text\":\"江苏常熟农村商业银行\",\"title\":\"江苏常熟农村商业银行\"},{\"value\":\"314305670002\",\"text\":\"张家港农村商业银行\",\"title\":\"张家港农村商业银行\"},{\"value\":\"314581000011\",\"text\":\"广州农村商业银行\",\"title\":\"广州农村商业银行\"},{\"value\":\"314588000016\",\"text\":\"广东顺德农村银行\",\"title\":\"广东顺德农村银行\"},{\"value\":\"314641000014\",\"text\":\"海口联合农村银行\",\"title\":\"海口联合农村银行\"},{\"value\":\"314651000000\",\"text\":\"成都农商银行\",\"title\":\"成都农商银行\"},{\"value\":\"314653000011\",\"text\":\"重庆农村商业银行\",\"title\":\"重庆农村商业银行\"},{\"value\":\"315456000105\",\"text\":\"恒丰银行\",\"title\":\"恒丰银行\"},{\"value\":\"316331000018\",\"text\":\"浙商银行\",\"title\":\"浙商银行\"},{\"value\":\"317110010019\",\"text\":\"天津农村商业银行\",\"title\":\"天津农村商业银行\"},{\"value\":\"318110000014\",\"text\":\"渤海银行\",\"title\":\"渤海银行\"},{\"value\":\"319361000013\",\"text\":\"徽商银行\",\"title\":\"徽商银行\"},{\"value\":\"321667090019\",\"text\":\"重庆三峡银行\",\"title\":\"重庆三峡银行\"},{\"value\":\"322290000011\",\"text\":\"上海农商银行\",\"title\":\"上海农商银行\"},{\"value\":\"323110000008\",\"text\":\"天津金城银行\",\"title\":\"天津金城银行\"},{\"value\":\"323290000016\",\"text\":\"上海华瑞银行\",\"title\":\"上海华瑞银行\"},{\"value\":\"323331000001\",\"text\":\"浙江网商银行\",\"title\":\"浙江网商银行\"},{\"value\":\"323653010015\",\"text\":\"重庆富民银行\",\"title\":\"重庆富民银行\"},{\"value\":\"325290000012\",\"text\":\"上海银行\",\"title\":\"上海银行\"},{\"value\":\"402100000018\",\"text\":\"北京农村商业银行\",\"title\":\"北京农村商业银行\"},{\"value\":\"402121000009\",\"text\":\"河北省农村信用社联合社\",\"title\":\"河北省农村信用社联合社\"},{\"value\":\"402191009992\",\"text\":\"内蒙古自治区农村信用社联合社\",\"title\":\"内蒙古自治区农村信用社联合社\"},{\"value\":\"402221010013\",\"text\":\"辽宁省农村商业银行\",\"title\":\"辽宁省农村商业银行\"},{\"value\":\"402241000015\",\"text\":\"吉林省农村信用社联合社\",\"title\":\"吉林省农村信用社联合社\"},{\"value\":\"402301099998\",\"text\":\"江苏省农村信用社联合社\",\"title\":\"江苏省农村信用社联合社\"},{\"value\":\"402331000007\",\"text\":\"浙江省农村信用社联合社\",\"title\":\"浙江省农村信用社联合社\"},{\"value\":\"402332010004\",\"text\":\"宁波鄞州农村商业银行\",\"title\":\"宁波鄞州农村商业银行\"},{\"value\":\"402361018886\",\"text\":\"安徽省农村信用社联合社\",\"title\":\"安徽省农村信用社联合社\"},{\"value\":\"402391000068\",\"text\":\"福建省农村信用社联合社\",\"title\":\"福建省农村信用社联合社\"},{\"value\":\"402421099990\",\"text\":\"江西省农村信用社联合社\",\"title\":\"江西省农村信用社联合社\"},{\"value\":\"402451000010\",\"text\":\"山东省农村信用社联合社\",\"title\":\"山东省农村信用社联合社\"},{\"value\":\"402521000032\",\"text\":\"湖北省农村信用社联合社\",\"title\":\"湖北省农村信用社联合社\"},{\"value\":\"402521090019\",\"text\":\"武汉农村商业银行\",\"title\":\"武汉农村商业银行\"},{\"value\":\"402551080008\",\"text\":\"湖南省农村商业银行\",\"title\":\"湖南省农村商业银行\"},{\"value\":\"402584009991\",\"text\":\"深圳农村商业银行\",\"title\":\"深圳农村商业银行\"},{\"value\":\"402602000018\",\"text\":\"东莞农村商业银行\",\"title\":\"东莞农村商业银行\"},{\"value\":\"402641000014\",\"text\":\"海南省农村商业银行\",\"title\":\"海南省农村商业银行\"},{\"value\":\"402651020006\",\"text\":\"四川省农村信用社联合社\",\"title\":\"四川省农村信用社联合社\"},{\"value\":\"402701002999\",\"text\":\"贵州省农村信用社联合社\",\"title\":\"贵州省农村信用社联合社\"},{\"value\":\"402731057238\",\"text\":\"云南省农村信用社联合社\",\"title\":\"云南省农村信用社联合社\"},{\"value\":\"402791000010\",\"text\":\"陕西省农村信用社联合社\",\"title\":\"陕西省农村信用社联合社\"},{\"value\":\"402821000015\",\"text\":\"甘肃省农村商业银行\",\"title\":\"甘肃省农村商业银行\"},{\"value\":\"402851000016\",\"text\":\"青海省农村信用社联合社\",\"title\":\"青海省农村信用社联合社\"},{\"value\":\"402871099996\",\"text\":\"宁夏省农村信用社联合社\",\"title\":\"宁夏省农村信用社联合社\"},{\"value\":\"402881061690\",\"text\":\"新疆省农村商业银行\",\"title\":\"新疆省农村商业银行\"},{\"value\":\"501290000012\",\"text\":\"汇丰银行\",\"title\":\"汇丰银行\"},{\"value\":\"502290000006\",\"text\":\"东亚银行\",\"title\":\"东亚银行\"},{\"value\":\"503290000007\",\"text\":\"南洋商业银行\",\"title\":\"南洋商业银行\"},{\"value\":\"504290005116\",\"text\":\"恒生银行\",\"title\":\"恒生银行\"},{\"value\":\"506391000019\",\"text\":\"集友银行\",\"title\":\"集友银行\"},{\"value\":\"507586000014\",\"text\":\"创兴银行\",\"title\":\"创兴银行\"},{\"value\":\"508584000017\",\"text\":\"大众银行\",\"title\":\"大众银行\"},{\"value\":\"512584050103\",\"text\":\"永隆银行\",\"title\":\"永隆银行\"},{\"value\":\"513584000007\",\"text\":\"大新银行\",\"title\":\"大新银行\"},{\"value\":\"514584000002\",\"text\":\"中信银行国际(中国)有限公司上海分行\",\"title\":\"中信银行国际(中国)有限公司上海分行\"},{\"value\":\"525290094215\",\"text\":\"第一商业银行\",\"title\":\"第一商业银行\"},{\"value\":\"531290088881\",\"text\":\"花旗银行\",\"title\":\"花旗银行\"},{\"value\":\"781393010011\",\"text\":\"厦门国际银行\",\"title\":\"厦门国际银行\"},{\"value\":\"787290000019\",\"text\":\"富邦华一银行\",\"title\":\"富邦华一银行\"},{\"value\":\"904290099992\",\"text\":\"城市商业银行\",\"title\":\"城市商业银行\"},{\"value\":\"905290000008\",\"text\":\"中国银联股份有限公司\",\"title\":\"中国银联股份有限公司\"},{\"value\":\"906731000014\",\"text\":\"昆明银行\",\"title\":\"昆明银行\"},{\"value\":\"911100000005\",\"text\":\"网联清算有限公司\",\"title\":\"网联清算有限公司\"},{\"value\":\"105100000017\",\"text\":\"中国建设银行\",\"title\":\"中国建设银行\"},{\"value\":\"323333000013\",\"text\":\"温州民商银行\",\"title\":\"温州民商银行\"},{\"value\":\"323584000888\",\"text\":\"深圳前海微众银行\",\"title\":\"深圳前海微众银行\"},{\"value\":\"323651066666\",\"text\":\"四川新网银行\",\"title\":\"四川新网银行\"},{\"value\":\"523290000011\",\"text\":\"国泰世华商业银行\",\"title\":\"国泰世华商业银行\"},{\"value\":\"742100000016\",\"text\":\"瑞士银行\",\"title\":\"瑞士银行\"},{\"value\":\"323521012066\",\"text\":\"众邦银行\",\"title\":\"众邦银行\"},{\"value\":\"320177510009\",\"text\":\"襄汾县万都村镇银行\",\"title\":\"襄汾县万都村镇银行\"},{\"value\":\"203100000019\",\"text\":\"中国农业发展银行\",\"title\":\"中国农业发展银行\"},{\"value\":\"402491000026\",\"text\":\"河南省农村信用社联合社\",\"title\":\"河南省农村信用社联合社\"},{\"value\":\"314305400015\",\"text\":\"苏州农村商业银行\",\"title\":\"苏州农村商业银行\"},{\"value\":\"320372500018\",\"text\":\"太和中银富登村镇银行\",\"title\":\"太和中银富登村镇银行\"},{\"value\":\"320372400017\",\"text\":\"临泉中银富登村镇银行\",\"title\":\"临泉中银富登村镇银行\"},{\"value\":\"320372800011\",\"text\":\"阜南中银富登村镇银行\",\"title\":\"阜南中银富登村镇银行\"},{\"value\":\"320373100016\",\"text\":\"界首中银富登村镇银行\",\"title\":\"界首中银富登村镇银行\"},{\"value\":\"320372900012\",\"text\":\"颍上中银富登村镇银行\",\"title\":\"颍上中银富登村镇银行\"},{\"value\":\"320651000852\",\"text\":\"大邑交银兴民村镇银行\",\"title\":\"大邑交银兴民村镇银行\"},{\"value\":\"314305206650\",\"text\":\"昆山农村商业银行\",\"title\":\"昆山农村商业银行\"},{\"value\":\"320493881409\",\"text\":\"洛宁兴福村镇银行\",\"title\":\"洛宁兴福村镇银行\"},{\"value\":\"320428090311\",\"text\":\"江西赣州银座村镇银行\",\"title\":\"江西赣州银座村镇银行\"},{\"value\":\"402261001015\",\"text\":\"哈尔滨农村商业银行\",\"title\":\"哈尔滨农村商业银行\"},{\"value\":\"402161002352\",\"text\":\"山西省农村信用社联合社\",\"title\":\"山西省农村信用社联合社\"},{\"value\":\"402261000004\",\"text\":\"黑龙江省农村信用社联合社\",\"title\":\"黑龙江省农村信用社联合社\"},{\"value\":\"320491000112\",\"text\":\"新郑郑银村镇银行\",\"title\":\"新郑郑银村镇银行\"},{\"value\":\"320308000015\",\"text\":\"江苏淮安光大村镇银行\",\"title\":\"江苏淮安光大村镇银行\"},{\"value\":\"314585070516\",\"text\":\"珠海农村商业银行\",\"title\":\"珠海农村商业银行\"},{\"value\":\"320491000112\",\"text\":\"新郑郑银村镇银行\",\"title\":\"新郑郑银村镇银行\"},{\"value\":\"402581090008\",\"text\":\"广东省农村信用社联合社\",\"title\":\"广东省农村信用社联合社\"},{\"value\":\"402191030166\",\"text\":\"内蒙古呼和浩特金谷农村商业银行\",\"title\":\"内蒙古呼和浩特金谷农村商业银行\"},{\"value\":\"402611099974\",\"text\":\"广西壮族自治区农村信用社联合社\",\"title\":\"广西壮族自治区农村信用社联合社\"}],\"timestamp\":1713497531761}"; + + Map resultMap = JsonUtils.parseObject(json, Map.class); + List list = (List)resultMap.get("result"); + List insertlist = new ArrayList(); + Map keyMap = new HashMap(); + int i = 0 ; + for(Map m : list) { + String value =(String)m.get("value"); + String text =(String)m.get("text"); + SysDictData sd = new SysDictData(); + + Object obj = keyMap.get(value); + + if(obj == null){ + sd.setDictValue(value); + sd.setDictLabel(text); + sd.setDictSort(i); + sd.setCreateTime(new Date()); + sd.setDictType("bank_list"); + sd.setListClass("default"); + sd.setIsDefault("N"); + + keyMap.put(value,""); + + insertlist.add(sd); + } + i++; + + } + + this.sysDictDataMapper.insertBatch(insertlist,10000); + + } + + @Test + public void testInsertByBo() { + +// String json = "{\"success\": true,\"message\": \"操作成功!\",\"code\": 200,\"result\": [{\"id\": \"1321641787514806274\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"电信服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048496324610\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"出租或出售网络元素\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048496324612\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电子数据和信息的传输及应用服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048496324613\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网接入服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048500518913\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播电视信号传输服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713217\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"卫星电视信号落地转接服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713218\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他增值电信服务\",\"parentId\": \"1321641787514806274\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787594498050\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"文化创意服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048517296130\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296131\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296132\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文印晒图服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296133\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296134\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"知识产权服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296135\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"影视、广播广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490434\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"报纸、杂志广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490435\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"灯箱广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490436\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"路牌广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490437\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"建筑物广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490438\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490439\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"流动广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048521490440\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他广告发布服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684738\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告代理服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684739\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会议服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684740\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"展览服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029567281041410\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"组织活动服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029567591419905\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文艺创作服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029567914381313\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文艺表演服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568132485122\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文艺表演\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568463835138\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化比赛服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568690327554\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他文化艺术经纪代理\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029568891654145\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网文化活动\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029569063620610\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"档案管理\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029569441107970\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会议展览服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029569814401026\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育指导服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570154139649\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育训练服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570380632065\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育经纪人服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570556792833\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育活动服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570716176385\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育管理服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029570946863106\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育表演服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571127218177\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育比赛服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343098556139016193\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:37:04\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"设计服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"},{\"id\": \"1402568931805253633\",\"createBy\": \"admin@wangquanxin\",\"createTime\": \"2021-06-09 18:11:06\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告服务\",\"parentId\": \"1321641787594498050\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787607080962\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"邮政服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048487936005\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"函件寄递服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048487936006\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"包裹寄递服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048487936007\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他邮件寄递服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048487936009\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"报刊发行服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048492130310\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"邮政代理服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029533210710017\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他邮政服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029533542060034\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础电信服务\",\"parentId\": \"1321641787607080962\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787607080963\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"物流辅助服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048525684741\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"机场服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048525684744\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空摄影\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879042\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空培训\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879043\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空测量\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879044\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空勘探\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879045\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空护林\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048529879047\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空降雨\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048534073349\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"铁路货运客运场站服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048534073350\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"道路货运客运场站服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048534073351\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"打捞救助服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048538267654\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他仓储服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048538267655\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"装卸搬运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048538267656\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"收件服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048542461954\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"分拣服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048542461955\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"派送服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559802597378\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"运输组织服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029560201056258\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"收派服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029561010556930\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他辅助服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029561262215169\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"票务服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029561690034178\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"客运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562117853186\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562398871553\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物装卸\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562616975361\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物中转服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029562872827905\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物配载服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029563074154498\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物打包整理\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029563309035522\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物保管\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029563493584898\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航拍服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029564324057089\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:16\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航空播撒农药\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029564558938114\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航道疏浚服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029564726710273\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"航道管理服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565091614722\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"打捞救援服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565267775489\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"打捞服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565536210945\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"船舶移泊服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565733343233\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"船舶调度服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029565976612866\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"车辆调度服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029566475735042\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:17\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"车辆挂运服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343099169350430722\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:39:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"港口码头服务\",\"parentId\": \"1321641787607080963\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787611275265\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:50:28\",\"type\": \"1\",\"name\": \"现代服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048580210697\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他现代服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547353903105\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"营销服务费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547513286657\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"业务推广费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547894968321\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"销售推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029548461199361\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"营销推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029548754800641\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"音视频服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029548914184193\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"业务外包服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549174231041\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息技术外包服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549325225986\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"洗车服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549492998145\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流装卸、搬运、包装服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029549715296257\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流配送服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550008897537\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化创意策划服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550151503873\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网络推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550298304513\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场营销策划\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550432522242\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场营销\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550570934273\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场销售服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029550776455170\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场拓展\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551036502018\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场售后服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551216857090\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场管理咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551434960897\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场策划服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551619510274\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:13\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"设计服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551816642562\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务信息咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029551984414721\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务信息服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552147992578\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552265433090\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源管理咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552429010946\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552630337538\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"渠道搭建及使用\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552793915394\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"清障服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029552890384386\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"汽车装饰\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553104293889\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"汽车美容\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553280454658\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"汽车检测服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553506947074\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"企业管理咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553725050882\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"培训服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029553947348993\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"居民日常服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554131898370\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"救援服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554362585089\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"经济服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554639409154\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育信息咨询\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029554853318658\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"家政服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555054645249\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"家庭服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555318886401\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术推广\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555562156033\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术交流\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029555771871234\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:14\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"机动车公共停车管理服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556002557954\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"货物运输代理服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556254216193\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会展服务费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556417794050\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告制作费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556572983297\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广告服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556765921282\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"供应链外包\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029556933693442\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:50:28\",\"type\": \"2\",\"name\": \"电梯等设备维保\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557151797250\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"道路救援\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557365706754\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理经纪服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557629947905\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理服务费\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557789331457\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代驾服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029557986463746\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代办年检\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558208761857\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"畜牧业技术咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558456225794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"财务顾问服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558657552385\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"保洁服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029558858878978\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"(市场、网络等)渠道搭建及使用服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559022456834\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场营销服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559148285953\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场推广服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559290892289\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场调查\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029559550939137\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:15\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"维持秩序服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343109571966742529\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:20:50\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343110414820544513\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:24:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"营销策划服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343110783122378753\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:25:39\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息咨询服务\",\"parentId\": \"1321641787611275265\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787611275266\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"鉴证咨询服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048550850564\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"认证服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048550850565\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程监理服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048550850566\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"涉税鉴证\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044866\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"纳税情况审查\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044867\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"审计服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044868\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他鉴证服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048555044869\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"一般税务咨询\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239169\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业税务顾问\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239170\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"税收策划\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239171\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他涉税服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239172\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会计服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239173\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"会计咨询\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239174\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"法律咨询\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048559239175\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他咨询服务\",\"parentId\": \"1321641787611275266\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663873\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"生活服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048584404998\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048584404999\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048584405000\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"学历教育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048584405001\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"非学历教育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599297\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育辅助服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599298\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"医疗服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599299\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"旅游服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599300\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"娱乐服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599301\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"餐饮服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599302\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"住宿服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599303\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"殡葬服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048588599304\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"养老服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793602\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"员工制家政服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793603\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"育养服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793604\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他居民日常服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048592793605\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他生活服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571324350466\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化娱乐经纪人服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571492122626\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业保洁、清洗、消毒服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571773140993\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"钟点服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029571949301762\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"植物养护服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029572121268225\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"植物养护\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029572666527745\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:18\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"照料和护理服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029573006266370\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"养生保健服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029573165649922\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"洗染服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029573585080322\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"文化体育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574008705025\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"外卖递送服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574251974657\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育健康指导\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574415552514\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育表演\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574600101890\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"摄影扩印服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029574872731649\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"社会看护与帮助服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029575065669634\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"庆典策划\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029575472517121\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"旅游娱乐服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029575845810178\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"临床检验服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576122634241\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"老年人、残疾人养护服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576344932353\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"居民服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576529481730\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029576760168449\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:19\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"健康体检服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029577179598850\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"家居产品维保\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029577338982402\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"活动策划\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029577796161538\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"外卖配送服务\",\"parentId\": \"1321641787619663873\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663874\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": \"yychenqiangming\",\"updateTime\": \"2022-07-18 17:34:19\",\"type\": \"1\",\"name\": \"研发和技术服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048504713219\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"研发服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713220\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"合同能源管理服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048504713221\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程勘察服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907521\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"矿产地质勘查服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907522\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础地质勘查服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907523\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他地质勘查服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907524\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"专业技术服务\",\"parentId\": \"1321641787619663874\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663875\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"商务辅助服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048563433484\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物业管理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048567627777\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他企业管理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048571822084\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理报关服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048576016385\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"婚姻介绍服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048576016386\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"纳税申报代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048576016387\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他税务事项代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210690\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"诉讼代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210691\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"非诉讼代理\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210692\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"代理记账\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210693\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他经纪代理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210694\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"劳务派遣服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210695\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他人力资源服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048580210696\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"安全保护服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029583378780161\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:21\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"职业中介服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029583634632705\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:21\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"企业管理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029584016314370\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:21\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"经纪代理服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"},{\"id\": \"1402804841830416385\",\"createBy\": \"admin@wangquanxin\",\"createTime\": \"2021-06-10 09:48:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源服务\",\"parentId\": \"1321641787619663875\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787619663876\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"广播影视服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048559239176\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播节目制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433474\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电视节目制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433475\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433476\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"音像制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433477\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播节目发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433478\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电视节目发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433479\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433480\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播节目播出服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433481\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电视节目播出服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433482\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"现场电影放映服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048563433483\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网电影播出服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029619453988865\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"制作费\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029619869224962\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播影视节目(作品)制作服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620074745857\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播影视节目(作品)发行服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620234129409\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播影视节目(作品)播映服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620653559809\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"广播电视集成播控\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029620913606658\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影摄制服务\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029621152681986\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电影放映\",\"parentId\": \"1321641787619663876\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1321641787628052482\",\"createBy\": null,\"createTime\": \"2020-10-29 10:35:32\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"信息技术服务\",\"parentId\": null,\"list\": [{\"id\": \"1321644048508907525\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件开发服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907526\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件维护服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048508907527\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件测试服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101825\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他软件服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101826\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电路设计服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101827\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电路测试服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101828\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"相关电路技术支持服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101829\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048513101830\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"业务流程管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1321644048517296129\",\"createBy\": null,\"createTime\": \"2020-10-29 10:44:31\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统增值服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029535530160129\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"桌面管理与维护服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029535903453186\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"在线杀毒服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536180277249\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"虚拟主机服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536482267137\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统应用服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536696176642\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据库管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029536893308929\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据存储服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537174327297\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据处理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537346293761\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统数据备份服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537568591874\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统容灾服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537803472898\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统集成服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029537992216578\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息系统分析和整合服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538176765954\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息技术咨询服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538373898242\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息技术基础设施管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538675888129\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029538873020417\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"信息安全服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539313422337\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流信息管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539523137538\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网站维护\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539732852737\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网站内容维护服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029539946762242\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网站建设\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540139700225\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网络运营服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540349415426\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"网络管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540584296450\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"托管中心服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029540814983169\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"推广服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541003726849\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"税务管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541163110402\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据中心服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541397991425\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据库维护\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541603512322\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据加密\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541783867393\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据恢复\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029541985193985\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据处理和存储支持服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542152966146\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"数据备份\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542333321218\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"系统设计\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542517870594\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件维护\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029542777917441\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件外包服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543033769986\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件开发费用\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543247679490\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件测试费\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543419645954\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"人力资源管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543746801666\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"经营信息管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029543948128257\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术转让\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544078151682\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术开发服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544317227010\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术服务费\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544547913729\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"计算机软件开发\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544778600450\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础信息技术管理平台整合服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029544979927041\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"呼叫中心管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545172865026\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"供应链管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545369997313\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电子商务平台服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545600684034\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电商平台服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029545831370753\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"电路设计及测试服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029546234023937\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"大数据分析\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029546397601794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"财务经济管理服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029546699591681\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件咨询服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029547181936641\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:12\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"互联网信息服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343108755432247298\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:17:36\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"软件服务\",\"parentId\": \"1321641787628052482\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029524901793794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"咨询服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029525342195714\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"市场调查服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029525619019778\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务咨询\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029526168473601\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:07\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"技术咨询\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029526512406529\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"管理咨询\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029526847950850\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"翻译服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527196078081\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"策划服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527376433153\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"医疗咨询服务费\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527573565442\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"医疗健康咨询服务费\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029527762309122\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:08\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"一般咨询服务\",\"parentId\": \"1342029524901793794\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029533932130305\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:51:59\",\"type\": \"1\",\"name\": \"研发与技术服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029534469001217\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"其他地质勘察服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029534674522113\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"矿产地质勘察服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029534863265794\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:09\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"基础地质勘察服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029535131701250\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:10\",\"updateBy\": \"admin@wangquanxin\",\"updateTime\": \"2022-07-08 14:51:59\",\"type\": \"2\",\"name\": \"工程勘察勘探服务\",\"parentId\": \"1342029533932130305\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029609509294082\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": \"admin@songya\",\"updateTime\": \"2024-01-11 18:21:45\",\"type\": \"1\",\"name\": \"教育医疗服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029609752563714\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"招生服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029609907752962\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"考试服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029610109079553\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育信息咨询服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029610369126401\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"教育测评服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"},{\"id\": \"1744924304161181697\",\"createBy\": \"admin@songya\",\"createTime\": \"2024-01-10 11:29:08\",\"updateBy\": \"admin@songya\",\"updateTime\": \"2024-01-11 18:21:45\",\"type\": \"2\",\"name\": \"医疗服务\",\"parentId\": \"1342029609509294082\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029614076891138\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"鉴证服务\",\"parentId\": null,\"list\": [{\"id\": \"1342029614190137345\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"质检技术服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029614357909505\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"物流信息咨询服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029614513098753\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:28\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"商务咨询费\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029614743785473\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"认证认可服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029615255490562\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"工程管理服务\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"},{\"id\": \"1342029615523926017\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"财务咨询\",\"parentId\": \"1342029614076891138\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1342029622457110529\",\"createBy\": \"admin\",\"createTime\": \"2020-12-24 16:49:30\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"餐饮住宿服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"},{\"id\": \"1343101669654736897\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:49:26\",\"updateBy\": \"admin\",\"updateTime\": \"2020-12-27 16:38:05\",\"type\": \"1\",\"name\": \"文化体育服务\",\"parentId\": null,\"list\": [{\"id\": \"1343101790371000321\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 15:49:55\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"认证服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343114618586894338\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:40:54\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育指导服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343114738829201409\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:41:22\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育训练服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343114941946736642\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:42:11\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育活动服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115233178259458\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:43:20\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育管理服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115402657476609\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:44:01\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115600632844289\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:44:48\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育表演服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"},{\"id\": \"1343115766676951042\",\"createBy\": \"admin\",\"createTime\": \"2020-12-27 16:45:27\",\"updateBy\": null,\"updateTime\": null,\"type\": \"2\",\"name\": \"体育比赛服务\",\"parentId\": \"1343101669654736897\",\"list\": null,\"status\": \"1\"}],\"status\": \"1\"},{\"id\": \"1377464354886131713\",\"createBy\": \"admin@wangquanxin\",\"createTime\": \"2021-04-01 11:34:29\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"教育辅助服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"},{\"id\": \"1596068477544751105\",\"createBy\": \"yangquan\",\"createTime\": \"2022-11-25 17:09:13\",\"updateBy\": \"yangquan\",\"updateTime\": \"2022-11-25 17:09:50\",\"type\": \"1\",\"name\": \"人力资源服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"},{\"id\": \"1596069139343007746\",\"createBy\": \"yangquan\",\"createTime\": \"2022-11-25 17:11:51\",\"updateBy\": null,\"updateTime\": null,\"type\": \"1\",\"name\": \"文化服务\",\"parentId\": null,\"list\": [],\"status\": \"1\"}],\"timestamp\": 1713423211831}"; + String json = ""; + Map resultMap = JsonUtils.parseObject(json, Map.class); + + List list = (List)resultMap.get("result"); + + long i = 1; + List insertList = new ArrayList(); + for(Map m : list){ + String name = (String)m.get("name"); + System.out.println(name); + SysIndustry sysIndustry = new SysIndustry(); + long id = IdUtil.getSnowflakeNextId(); + + sysIndustry.setId(id); + sysIndustry.setName(name); + sysIndustry.setParentId(0l); + sysIndustry.setIsUse(1); + sysIndustry.setLevel(1); + sysIndustry.setSort(i); + i = i+2; + sysIndustry.setCreateTime(new Date()); + insertList.add(sysIndustry); + List sublist = (List)m.get("list"); + + for (Map subM: sublist){ + String name1 = (String)subM.get("name"); + SysIndustry sysIndustry1 = new SysIndustry(); + long id1 = IdUtil.getSnowflakeNextId(); + sysIndustry1.setId(id1); + sysIndustry1.setName(name1); + sysIndustry1.setParentId(sysIndustry.getId()); + sysIndustry1.setIsUse(1); + sysIndustry1.setSort(i); + sysIndustry1.setLevel(2); + sysIndustry1.setCreateTime(new Date()); + insertList.add(sysIndustry1); + i = i + 2; + } + } + +// this.baseMapper.insertBatch(insertList,1000); + + + + // Arrange +// SysIndustry sysIndustry = new SysIndustry(); +// sysIndustry.setId(100L); +// when(baseMapper.insert(any(SysIndustry.class))).thenReturn(1); // Simulate successful insert +// +// // Act +// Boolean result = sysIndustryService.insertByBo(sysIndustryBo); +// +// // Assert +// assertTrue(result); +// verify(baseMapper, times(1)).insert(any(SysIndustry.class)); +// assertEquals(sysIndustryBo.getId(), sysIndustryBo.getId()); // Check if ID is set correctly + } + + + // Add more tests for edge cases and validation logic as needed... +}

SjWUUTVgK=)q6#zy!QaQ$s@OKKna#yy>eva( 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�tE7S+so+q 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°NI&Og~OspmkUC$W>i5E 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 z z%amm|U!%f&USYXI9RdT~0gS-Vez?O)f&GHt;Ys?TE=U!sQVtp`I@%pXuuwx7^ZYpg z75ICsqEx3!eYN1dwy!n$GUSo2HRyG`W7f6otYdw2VbwZYPopyOBe~qLXr69vR-tXV zo?CV|n;0Q;Y`uazu>(9o<(>OjrsuRI#DX15*~*?(9b9%Y13mQJ4Kd`m4XSm>W>1Qi zot~}n+GxZ*@0V0tB*g-Z1taji76b?O@_R~ zhUPxBMEu_}xV3&{iW{?+OjwD+zj(uc5OU~64(B!4ezM!h$fYa0Kx?#+6ysTgESq z-BAuXsUh@Ox#Pge<_*N#?Mk#uo$+3*e~D3#r=KAAUs3KH5&BnoSiJXhU#O8>b2HBW zusR#1;l$ftWjP>A;g+F=yG1G7Mg6EjG(^%G_G-gQHEq`kmQ&4~0@4``8Js(iv8GTOHy+nc5%`?g3y-v_A~VW|HMq;7ryVW*j&ffyI|8j-JxRr`?gut@XCLp5hF%jT^$R-UH?vHW zX?q&XFD~Bl5_?4@|BKQzk}}WmLuDB`FT0HQKZf34&|=KCemO$EFOKb>myAERga1`$ z_;ImCLO6pw($h-Zn6{9RLOT}6%rVeGQe_p$2;Y* zdDwpWnsNK?{MmL1ct?0Vz?iWxGYdoi>oymgS2qwrRaID~!!q0xu@4j1hiixH1+>5Z zySBP|3d&VR-K{GpVYbWTI3g}RjR}Zm(V6$btR`J1QMvX?xW*z4vnmDM&}`6GVMEQhB4>J-#=xj$3&L1z6N*-&BO`eui~D=Q_3?3o z^|J27O6m^8h%yn-#YIs5s4(@RDyTMHBPFdxs)IxgKS0|X&H7^D6WCyaYSe?(j(zKkJI zf9TIPWk8`!+_ALh{iXdo$w9+;A$TFL(8^CjqpE~+njm(m_-Cg1+v4CdHhghv70N_r zYx6n{nl#k1YE4847dhNXFXI~sbH$RTs`1FY;vW{Lpr&O`DtcazK474|pE~_mx6uF*6nz z{N4L6Xe)4n=syIY(9PIMoO!;Dslj*WnICp_8@ad39<)l(!{>xevrpGI7hZZOjV6H0 ztP#PoM`gtJ z1+FLrt^j_s`JD-YHHa%cT34$BcBvm)(`UPn9tysjwt3$Ff-T+_sg}d;y1JjcnYj{Y z*!Ez=(44YVd2ZVx+oiPo5bOZOC_)3ue=y^31)&crm@xC@5yP4= zuL)(hiEq3m&*(hu;Ss%Mf^{-_@c4i6=izr50CXY0{_yg<-u|3$^TW^k)|X=5<1rJR zf7IO^s{ie7I~QYHO+Y7<_5fu-$vxoEiidm@=a=!t?YN-9*F8c1aq!~;uNUrM5RRV~ z&=5(l2Ckv(I)lzkEu78tQ2)e`l`gY3U=O8y*NNx+3Q~2UIrLji>#?iWI#wPl;v2|i zF`81TJI9h;{YE(aSg0$jBy4VaGO?nDqK2(WOX9vlQiv+CJXem*({0knf{?JCMZ@`u zDM`7?%-dzUq&%H|FlpB}4Ks}o)Np1o#)IWMwQC~XT{}Rj=5QX}A+C*XGM~*KVem1o zD}3EZz$k4}4Pkb-Iz@!_TDZDoT;JB zMoHSke`;pP5&V`fI6yqP`Yy-5 zV~isr(@AznQ36M1XkXL9vX&L4VdotXo6XWAkavE&kt&+S-=_|?JnBkXK8wDz?MsK} z-|h}c19nZvPl7%T$y2RbRibAK&6r1A*?RC$C+oM*!g^ z1;dGrl{W8W5ase zZRYF#*NVD)-4g$~s(&^(uK&v5{;{e;b~g5oCQeQkcD8?COq-~`QIIIYhgQ-oiCd)g z*ThR2P^tkzy85>|q_rc#>rpZPurs32Ef(P0l+>YHSMaaFQu-dQF0+eEriqp!pic z{Qwrerco_q2^mZK6^nF;>uI%=EBfvSwU2^PB!4%)Njoz_giKTvz0=e?*WpI$^Y!hi z8^F)$>*@e2JdR4QX8&|L+m`0@9k?I2JdwR;ph7k4m<(5$?s|;MUIzKDX7RC-5B=gw z#vSNVIp9Q)QC$!>XAIJqzaI9CNqjhydVj_P`=Lw`rAoz`YCbcK6lt89aos;Uw{p*U zl4szR8b>HAlSo`dp&2BUJYov9tmE5)3z{|C4Bt{(RPzND4UvMzJMCO^sO;5zCtIX4 zR9{sKwwC3izu${fio0gyy_#qmQ~)$RTe}} z)>*6A!drp)`Dx^pwmAK)DGdH`Iujd5a*>sKgc9fb%hd9l8)=;Io~cH#ZJV2-2{i{P ziZj?9Er$I}web>IK6tBoNckn68gHvT`jm_Os!f5-U$&8`Hk-3&aOR1K^xj8#n>Elj_LuK)eG z6)5n^0SO}bj4e_U5l}6y_yZ{zzbOp1 z03#bkGOmoTdN5y_m>%ArKZ6P&H}K4=yHp?OuL~v;HdXo9z+=qbi)IndL4t+n{GRXR ziW;nBI_$jZ0}^?nmjZf)IE*KSx+=lbL31205|PlC%D;H4xjc6mtxLb`mRO4 zC$^E966~{mEU1Ucn?W^aYJV4Lc=Wr<*AXdabMLW@o7Pt_Coghdh&D)t*NVu3IBzBD zE4!EvCFAm>#~kcU9~!Al&ZX(yxDN z4V(15>YT6Q+8{(G|7g#dy45c{W-#waeh?DV!1WaJjFFOFew@@8F#-j;4s5SRc$h-( zSHvTPQVrSdm57E^!n}q{Wu%@+0+I~ph^l;_6rhbtQ|HR5acLDPK z6|DRN8UBoynF?dFK#V9I`>YH^1Si$5;Azt-7)Jfggbu9!pn*O`$~4E)5=BP6ddH*v zLHJu@n3pi|=H9|P2fw^*y=3K97n=^z0XTx9p+%P5wz~a=z?KtyRXw0+YL#sF=Dv%P= z??){yRiulk@JJdU^#f4;h0OG0C^y z8~ZXN;Qickk^2Usr0d)|i;j!PTquNsx(EEKgtHS(6lgT39jZ}qZZmDpA4VXfv%hx* zO-1S@6M^-e5afk|)Of#v>>;KDDc7j72^AYu9Cko+hk`uY((#GW=628_LxQ6d=< ziYE(8&G)$y9w+Cjx19*M%fQZ`6%9?c+7-UJHQwjlr5{st2IXRnG-}70tEM@&*B_VO zE>qXOUv7AOU_20p;QdKzF$fqn!MpvXv4uvNkc6T03`2e3yOHQa{iVG@GwhU4B*vLg zyN`4#yB+X4vGl|y$|4+6eA2ll0yBfP=KkqPvm{3m`c^|`;3DWLHvniwfyJKDI7KA1 zx0pwg5TXn01qXBLJZVb{0$Wq0Q?JoE6Q;(KR1blAQ%D(}-PA#$ZX3>_hP<+9A3g!T zeN*|q-O;4z3gHSud+X=uk1%^!V{r0e8grRZmpsUF?FC|NTilL99eE@Xp11}`;t-Cu zbk3Q(?!WiX$BYA7+-7QTa^xvXmx>l^g@q<`HDyPs7Fc`hNN*8C&NAO^`e?P&ljZ1F zNs~bdz05}|x-dkq8?Bv-H@M5o1giFV-A|-pod3QTCZ@!?6+03(#W7;4s!0zH*k%s7#q5 zmR_8#JgLK}Id+;{uY`j5RD9ROJ&)>0bJm2*7+zaxQLO3Q2z{ zf75rh4yh58cZDVa2ynfjxn6YK_Sx-20MWc$=mVv%H1L1F&brQova`) zE=x{wH8AHkNs>|=5{2X$stQ?kz`&HzHRvL$)NHfpH>R@oWjU5f8=RNoo<}#aVJLwa zKiweK-&e%MZI>&W;gl#*^L3s~@E)hEg9O?@zMuay#FYWJe`2Onn?tj1SMD|(uQDr7 z9aWTlN0l^N?-1it?1`qrnD$c?}P&);4yr`pk~MQ)@2xuJ~?%J5O81s4OkN z;8@6O@6Ph|SN&ESG}x%I&}cHf)o#p}2@gF5Jjx}2vYX6zil1x+Aad35ODu)Frto2W z$z5#oQJ3!%73CRqCnGh`xAc=`Dm04w^G$DnH|aF`#TU{UB>yKQ5EQtK5RhYRdjJ%; zv{0a9=|z0O9aW!p-jkUbu5!Ixey_UHw#efz73qb_?EZA!E1s8fZ&XX)qw84P7~VZJ zJXblaV~V|;!8Tp_gtpU^@7FDVo|Eo5hHf|lneVXyz=y5D>HH)l%2!ng%#35Lp_{Yt zt&b`EWiI$ww^fH*Fo$F!4bh7Kgj{ERjO0Z~-~6zV+gF^**@aIJ`j!5!d@049&9tY4!#R#e{jL|@ta&MoiP&A)M5TyOIiq!NBkrNh*(te}`hfR0!TGTHI6 zF)!}dJ&Fo?;mSWtWsI8%W{8^NdC;E- zS*B!unoXc1nHBAHa3GqkXOG9u+?N44j;eAjjrlrKRtzjHUV4Em^+uMZuKHzeU^cM) z`p`L&3cb9&CLBr3%i=3}Wh_764@D10%9Tj6%<)HK z0}+q=Q1}%VB>=Jv+5~5qAMNdc_a8w6#uC&E;Wy*x^4-<`e;+jbdrsB=OeciIge8sL zh20Fz^leQ47aCcsVhJPrfC?mAH3i?1lvP#PG6T<{KsCUq5hD``{KN_`-WfMZ16bcL zZ9=d#dPMu&RD2w(_5{KzF+spj6Vuq zWCqQNP$o*v`XAv5Qeg~X@x;w_ib#rf3{kSw!cBeplr~RZz(6 zB`fJB0CL8T>ggC-aQZk{3Kx$R-UND6AiE5}Wz>ZwwG30kY0`r$%Q9T01Zh{GP ztdI$aMbblC+fL~(4lU}n)biT&Rs}sE&Eo94i~|q&ngY-qD%B&_fK<4|h6+g)9HS(P zcxQHXluR!(O<4t6)pK$TQ(XdKaztNaz)#xB0Q{zhLLqprWsm^?Fd!Os{ZI?-mA!)viVh!4>LnE+}v$SaGM5H3O8dRYo*DClLK zE(LX;pQ7D7-3p^e)Cpo{QkS?(u@9q;NMJEtlkXHB3_u`#l&(CGbL5|o z=B+FB<&z_hC~~iLs4(Ltp;C&fV^fA`k8D{J+FD}|>9g^0avH*$kFHxE1`Z-~nZuz|s%WA!rN1DYE7u zvsvKSt+~nn{_P{p<($9Hx5!q3VLodcrW2Bd?#D%4=L>!C8?Ge9(IM704DI~%_ZUJP@VB4@2|Uz6yC6D+Kg99`g>Ur=ZHKF5>6(A9fiON zv1gjxqF!9OL|%<8va>_r)7MS|1=sm1rQ#!&z!-kXiVf8!I(eC69U8F0D{T!ya4JE=g?yp&lY$N#lcxL>!XU4mWl=L_@<% zmOG8?R^On_7VX1YEj)&+m#^I_`*JVohmo(`6PV?P?s?Ed%a9>3uS|oK+(^nMpCPUp z_e@JiQwuqK4G1R5SO;I(LW|q{*ROvjW3|`rm)}e&$$wKz|7$Y#@2AsBR*u4g|DXS? zYOk(H-!0}zq!}lj)Yc8gNx%)#n}C5S8j#z6G%2hJNEjp7b9g8ETS<|KZNLkGJmd7j z$irpt(|W+7#yZ}({hj2M_}C(nhAedc^* zxYKV3FZrhglh92h`pKf>La|m?5CzuE4HfM0kR2xErUM(}jzI$k$q*A5))IXf0VNsm z%0`hCBhE+Vth4U&#`nnGA142{*Sp( z{F9pzQ<`|H`n(t?Jp%ou)tIXfWeW6ODLfW`7Hu+&xk&eyAc)C4V`_kT&w`5CwqsfVf0Rh@L|oLVSEAmWqLx zOfcaE6XBh>$+<+^kwqa$r@Bm2X@2e`q4%t(lR15C(-2ah3jC8E@!6O{MZAVL1PDLt z)2@|7Jl>&0AwvQE_{9`QK#vz#Tk8aJk|X4W!VFhJO3N;G7bfSWGb@> zTfXQ@wDSrB`v!HisZhH4{4Vq1wX%z&9gd-=oxtJK(UR`W*p`(z{i=uhnHWnK6(o@fgUZWSDq;kpzr& z=5nW|_iD65&s(ol3ReP0TEH}krO}3JKuBkFN&0$VA)j>~=tzj?^0EqrsYq#QhhrW`!OASk*gEuoSdzm4a3iFcj6!fKSfs`jzGD)#E4 zuV?c1A-k4ufjC-duiA_M#3mMbhFD1N_TW$@f}^&{DP6I`MW~kZ++yRQO?8IRRy3w; z(P*c4*pgx_SWNR@+Ecmr0iPOK!NDCx&7+BCyRQ|ltSy}$s+BIg-Sg5FEllBO zO)QWLxd7fe=-3r|tCHQo6hYzaK$qxX^wh^5@(UxW50Y$tnL6s@OpTT88d(7pFgRv5 zTXMJ;fc#YDgaz(4Dzn*(!W$QpOgHqe=ZMUuQZL{)+a`(6Eb;{SJNb^hLnG1e`Kn1Nb+d#!xvX|tZd)cky!u2R@Dn&^Z?cMKcq3y#l zkMWquyxIKG-s*KJs<$U-xDJwRh+`NJ4Ok^<&LtGt*d)Rm7+0G$w@X|Mb|Y$8NUJ$c zZ`u?wpu#ZS&k`T~YZN#!xp3_BJy<8%5m9Z(w!0|y>(}2}YX5*k?8m$SUq4J64KJLr z8tk_l@R~bM^WBGC6ol3^*{k=GpZw12WssgNn;C{yauI0_PP*FgZJ}l5Ak{p;#o`tUB zxHItjUzks<84b#F3ZN8uO47wDi!2Wy56vA4lU6d2&p|Apw7SU*8+BLs3*3U;jO^6L??kQd*xIh*d3K$*5Aut}e+dQhUu3zdTjLI@p! z4>V^7s5hhaO#UF8lucCTUEUx#laefdF9P%2E?)Oo`tIs&4>(|=PjuL$uHqwNGi^{7QzKWU7=Zc^NG z1^d)Fa)kZ*9^4}3EbY6O7eQv!6C0!i%(%|%3x3xvYe9d-p&P46)l%6%zrw#SEb6lw ze9SsyK1C!?Ej=;%mSJ|IpIh{biK;R(ewm?m5Ryrod_Va5N(=JiUi;9nR0KK#{uopO z89jIQS19W0N4r(?foga9TkE1K-ND-WBi=ti(3+n;BK14DP(l2!$;H3cD%k#Ql1ole z@*4*Qzt!V5PXEDjWvOl|ezRO(o3U_+zr^MKl4(>nF#}uv6%m#fDwU_RfXAvmGii-o zB#y{{Ndhx{TR?kfubMAo^gdNA$vQPFkTRg zAeb8c8-QiKlM12F5+H*tI3v)4*5?gyQO=-sa8#0~?$U0xf9R#vYU!&6XjP9OH!|fQIjWqZG0O90DT+ya)+2l>N|P|67fxd`*=H3} z;V^evS+pmI(Q*z|l6r_(gR2Fqw>(}m0LG;Nn+yeTAAI(HKEk+4@unSQq)Zh?@qo94 zPDO%g*wwfYR9c9f2Rq8!&JrrJ)9|9xQz(g6voI_8jFAz+q-jk9O>hpult0hOu`oG= zFY)^3j1lZMG7Ht+3eHsVlr7sJbj0Y%-aj>7AZ+p z%;|kO6W|%R)5(wChq6ZlBFT=sWhe={`@}qw-6)cv2eMnp>!m=JTt=+qocG0fh)&AN zu3JsSmc`O4#_pR})i4el{Op|rXyo(4MNE1-GG|S?#|Ej8!!}MG;iyi zUo>? zr(T?NgS!TDAjzbMXk7+O%x9xw8kP~iD0T9w_gT9vCI8c zxbGgLLx}F3pfitk@`z7P?q+N^d-MoIEUmU7{^5T@>wqN;%2j+0px`n8lR5kqvFJ(~=5`ee z(;(AJncilVzl7}MNwX$_lZ!yrhB*#dX>#Nk_P1+#J`f>bb zP>hxU7H;0~X`6M8?Muc5kW=H3pnrGl&3;<_%$YX$Iuus%uBb%6Y~pZ^e2?t|^L+_r zrs#R!ZGV}adbFUl9xDk{ zkO6Xk_P9A^mJ?gbMy>3>(!qTFcqK9)f1g*e!2_O6w#FrSy0>_L>|j4Ju8iuT?H0oB z9bHE5ha2|F`x8<|+Sz-E(h_5&Cotoy6hli(Q?C+b!wkBR_lC+AmyD6dfbXBP?iIDj zl|VniM^hyCaaI?F{wsGm6A(Gu* z+h(~_AFQn&G~T%RHHHAo0km(eoo3#uhZxk4HwNO!`SFp8@T>1f8zwXYi(aXlqWrSx zn9-j_(+4ZpcDhf{f81T#8pQtlZ;&k+bAQG^v zYN%rczCLg|Ya(P!2y&@xz(%PMGC|5NoH`v6xp5j}RKANjT@N0ENU2pL4hSRdO&dL; zq7O#J>UGSJAgP;N!!()C6gFv`GRmebxGvI8T}8>GXAvejkV|^@@I^e9{G7-z(+ipT zIz|&H>F86aKEA+Lm(aJ5#2f>)U<-(8J0~tBbLx1EXx#1D+{?7`%giPdY+?%#oabiUw6f}1c+0OW(yIJlxz znLAKLoXzjrLfKa{QkVt%1<)T;1=wc3q}_3 zp+tpfq~=+L9fc1-b|LzZs(x$m{~33718P2-B`$9JL(n&Gr`ex@xuuXxoKI=0Mo6}qsN`b%>s4QXA z8lg(Lj;Z}=o#Q$qg7I9lqfP^hC~r18M0rq6_1YMvnz1>ni_^_NcZ|D?CyC20NB#&^ z<)`SV8EQC%Sv4PS>?oROiPL9jC)6%jjxr`R!CG~q+HF-~nIv<)F$${+a$bLM$Hcb| z)*8DB3K;pbQdw8W#5EBgIsqFK`65}LsiL_WHYjX^fK(@qJEt&3Oli5&fG;|z)|g}( z&c)O(DC57oDEHPvQK32jf$K2YF-pyy)BK*QIK?vPYfH=o+|13%bq-chi0q^aYZ$LG z^;^XGZyt#)i8ciBfw2Q*A4JIx$)semlF+O=zz`)TDKOxRr2{od(>m6j)-S5r|$`L&L?iVDxkNKq53d*Cok}L<}Yf) zq%FDoieAOLjySr%tM?@l5?b>2DQCM-Z@FmBQ~7G5ZEvao*G^uv=yqiuHSx6U@G4t1rpc*m zTdixP6LsACoKmD+*PQN?6Oy#rC@!!Ps`uH&hhcM}&Gj_-KsYgmiUK;j3prYxts&mP_mWS za8Gms=e+ThmzUt%ppq<@7t`BkeD+;X-pDe{fz9%*M1WlMd0h%}C_P4jLG2K4CUYPs zO3b>#4MS{sJkT1yjt$|yjDC2Y8seSJNWi_%%B+8UX4_U=l=REW-*RWea&ZWam6?t1 z<1FwvNoZ>eZVC=(T3CXAh1`>xX&W5wu_ZIN^#2ZlW}9g_$<(F(iE$nQ=n}_)E6(3N%mB8lP{5 zFh3h;EqsBx-?db?`j;+(b_%QWB;%Uq=lGGP8PC=6Odrzp>y)NlSb8EEFP8s!cUXdD zdO^V&FFjd5_l3ONz?Skw!C#2*NuY*|zWx;pA4K=J3D@vxGD}Cj?pO z= zD=qd$_I$~*Nd)||sJqw5*Rn~vGZA%}ym?-zuz92E_H|K%IH59H6lX_H3sn{9txsmb=-n2>Dsct%+k@1-scF2Vc$O zP)E9eWVT^jMRR(dhqK!cf{L+(h*vXc(bcr6T{@aYfsa2jWcT`YgQ;_92U2oig^#vm29vyFDMt7YDi>`@(4E4`KzT^ z+O&(TUamJiIPqD(FrUWR+{WvdzZ0u}HWLV{n2mCaAIV-;56V#?lgbgZ+0RRtlmv6h z`;0sAX8iFUzIF!{FGQC>TCY^@iw-6+hkfscYUwTO5-{`Ezoy+cT**pBjsN4%rY-ap zHYeE)la68xDl9_Z#s0%HpD2K-Dl9j(kEtpR-_IbKpdZ>q^gu8i!PoX2CN6~Df#mmb zh#$i0^bwuxJ3ZBJ*7#LoDZ34*d^Df|+~LHd?p3j17F3{xInsZucXh{DX6Sc-VDbMe z2o#c{`7ORRe8RpM`$GE!@D3p@we|^7^_HRbl3qXKv6NwbqLfy9>;iQEy9LFHH|J0m<~GnNI4;^^`M?8}W4R+_g++24+wj zreC-*VaA6Y@Yysel;fC+tlR6dl5VXG$2lZi4;{BGR+DX8P?Wp39S*Zf=i`)wzx4gO z%*0xH>E72b-q^>qjktR@|H)Hz4v<=oe+RfS|1Glm*GTW@sG1Yp!^?tnF{Q;{-Xmg?#VGlFxq@=IK zJgn>}FzlE*W2X>O%#$;R(0gxj7hs{YPzy?X$_Aq-DDapJ5XXs%<(T?iCZfn;m8m?* zjsvTJIme+98y3r4p)yr5q^u|#^_T9hn*xR%1`W7e6z~j1g~ws3L$^;ppA-JPHrm@j zn=rRIIK59Q0&L;3ZoYnf#MJiL!dFVmNDguqa?yZ2RfIT)!-@o}nhsz{KE-C$)|`Zj z!1o<{0%n0xFAG9xo>DX6+9%l$lcKSf)+|2eWUy(SSLa1~#-Zi8a{B-p_FBI!?Mm9K z%rtzf^UYm;u&N+El}L*>*WHn5_!Xu;&#b7^;j71#VrO;!ClgnhaxSI1*^>WnwYR^? z2DRQtnU23$6PbqIwt+O_Og*vmFYX8ydA^KHNI9gFYQA)JU^XAxJ!BMm(_LGsu?DBW z5nxPf)g29{9MS9shw4k&;o${7T;}6Kq?RVIJ8!3i{lNn} z%P#5Zr{q#%nhZlFFAwy>J;9}v7tyh)<7eu%1f#M%)h8uh1%po6&IYBfo;kjzq|Xs! z1tRMhX>WLYQ1sNQo-z`u<3Z*Ht9JrpV~#TcWqntcxF;qJB$F;3jwgfI!|ZC7kNfPR zslM8jCT00Fx#9q@_6Tacs?lqX5zlo~roimdFa!H?JeZYo)Vb-oWeTLfe@U&3-m?Kk zpuc1)%MF9h>`l4<@=Y7x*HD%C*qj0!cpb4{* z;kfFWA1`w~if(f~sxNCjtS?JFNEUB6)lgPyC%sfN@E1BEkEA^DY?Rd5V3UI|+-wSK zd|ZE(Ve1N2>NM}#U9MnvwF|ygy{V25aNMaa4k?){-a&^aH`o?$TUH*!bJ4$A3tooWxKBv7XyDx(5Xkjw0#C(aXX#Re0dp{M+8$9zPIPF}y=ol%L6;Lbcdz!+b zUsV&`CFK1estplrw$UY{sQ$yHgF%%o& z?3RsGyw;#;;)T+~^_g{Xjv%@4{7!{vVm&iKJe!(=FI*Vp=4kmWJR3?RM4(K_cVf@p zZS2shgS*?gb%5ArRu(^@5LKZ;#f(|Y#AYvG!ln=$ESbRMDR~Ln6$}xMEI?IWUs>iW zosYCmtY`D=<=OB-+B^2s_x1<(;%KaAz5@=;3-kugI-#KBEQBSWZFU!K2|FXisl^E5 zSTlvkz3K=~&yl!G|JA0lkPqXm7G_cjY1DlDYCZ(m8C>iO*&&gr5e8y0glf$wbEkx< zDK^O#2bnBs)tKzMWMQ(X=AN_1iVJ&Mkv?Hmo1+IZRCy-+d5Aft6=4i4cPh*Hh(`F!6p%adJ$_r7jKyTG~m_6|5 zTaxt?NSyQg2qKnJN5JmkSAdBn6`JC&#_rnkX#RUH%0JNB zf(WPx<(s!khySm<)&D)S@(nx+iv0g?^_A+mWI+07z6mC5hAS{O*36u^ z^ehRpGJO>}vAGEhbxB!Mf~U@OzW3CADuF1CrgSw(uY9kaSs_*U*&~1nRdR9bgaqBB z!GZJ18v9QynKQsuCdosxgs@pB+3z`P89D-t85ovCY0@<2ViLs#BpffCxSk?Fi_cWVviV)Rx;+vzh5*?b!l_P4_7GFbi)%@%gVNh1tVRv677Vm;3x z24<6WVpMGMR8$=6P{EK))vLEtnU=xJeyI>-Wa_6U#0Yn_xWWC(s8_n& z%R`l=-&A^wl3K#APfd4uguaa}rDdnm8_rChBOQtHlPtI}NnR}+DT8d9(Y?4Vl#%5f zELZvU*X?lSS9zuuV3lhTu}jP6OwB3)Q(Jl!q*VginMYCq6}3%g(PI2IS_zai*E}3! zV(+azSJ-n+X=Q%5vffBh+Q6EOnEAS1ja~7rqB)ZJ3}X&GjKQ92x{9rhhI4U}t6Fo`IZo>x1!~>O3kHmW_Vs-1ZHxYG3fE%_el8 z@CGkCdh5SfUM<} z#Dx!*DrQA&HC^&iE$xIKg-9DYKl!MO^T@FC8{+%}Cu)bBbutJ6ox9H59SChn5ai87 z+b2B{!2lk-Gz*e`)V%-Oe&nPNUo|y1Bji4Q@O0Mz94?t`5lv2lEDxD=JdjO#Cr?=! z5Aq^6kyWLS-a(2?fLq4Kqm&nc!nK;V%daYMcfNfs`_oU+x*hiGf`(+2kCAKtxy4Jz zGr9TsBTKG@-nFmq~C^9Z|e&~Q*&jMIp}hzf@dI>){5zq)Zz*xu)?o(kl7XxDV>KZ!gpe} zbwK7ph8rHtBOC2T^|3H~ynN>uHG>q*%YR8I1Vt3j*((5(`Gem&J2#n6M^nJgzi*N7 z2jhJiM z#Vk0As!X1?%eBbERur_>em>i z+33Vhp?BfrUV}B7t!ii}L<%YpXSSP^66^r;hiz*rD2mor>8G%f53?P8C>6$* zZ{@wi^b0_2qY$F>L0ZV-&?2)jYREtv1Fhn}hvZt&mtpE#%Q?zl7Z$8T3~3l9bRWfJt|5}_r@t32CY$4iaMTR=Y3fAWg7LWhgABJS>2%YttYH^##$2$A~h2h|}G zjro6G(5tyntu}uF&E>851Y1QW^ZW7q+7E1%SQRVr_hYAuQ2>^jhB0h8>Z2ea)mXib z?eehuDUXdxH#-H22H0&|=8|rI)re&s4!rh!SJeLCulWKj>)O2wcJTVof9Uw#()h)K z(M4y_^cb#9GK9H(>~NOs+ANb1Y>^Q-;WY<8aH3%eAMqA|BfN004QBAREY~N$ z5x}Y;Na5QU+g;R`lArt~%7b=dqT|=S0`CeWd^v@hA;ru5-GZSSjqr9^+wwE*f`~hm z%jBf{`zyzJ2MBZZJEV*-Z=g+wh$8KE%_F~$n4TckjkG$jg23rL0q;%*1sMu;^)8F2 ziv7(hlqK?)AqW%VLB3vx7h&MP&fN9?{dx1xZH2Zz5P9`&2pj(f*y%A`9PyeM@%Gwn!AH4iT>@q#pfFk z8%P!xyAIZw_q>KMCnCa^kQKY`{7WppwQBjgX?`sPz<}Z1Y`1;Z+}zxHS>Pp=fy6H# z+-@Zh{2NF3If39SF285{1fsFb!V0$J{!sz;Y3e10->GoWZaBN;Mu&L~?eZMVXx9~+ zzrt43zbt0jz_f@3R`ir>>s(-Omx_!82IsNV-0b`U#(;Cx#;3ig7Y0o(Ax#|FzsL*| zILvq%T_Imrn3|7QM6#o^TO3zcMD|^)V{ylPXDnBWMowx|kjBL;m$PeemJz$TMNp8U z!>M8Zl}!Q{;!u=o5|nP&Hhs*sBSua^R)NJR8$P-eYP0e;Pk;W2-NH<*T?GmNaK31g z3qJ*7mwj^)m88$^Z}X2>h%p{J5y2HCEV*=}in3aEppUv(xo2}WH?R(vRa@94Arpt? zj9u6SFB;`hs3>}nFQzm*E#O)OGj{S;Dm552!HT0d5y417PN+=DAyHvQb}U!P>L}-m zKC~b^R;qD1p}?_FPNR)y- zuMMBkJc3K&E^DK=FFFtlrW0=#jH{8}970iPkf70{$Lg=w_A6>li5O;eNYv^f+Pw6mHeTZj(k__W@l{UWhb)4@ ziFtR89VSAaMRJ)UORTfV7bbF(%%OT^l$@(rnJVu72f2oKZl%+-r`?6IdbejWMYkqv zmd2}0C(F*UO@X50VoggF)y3l?bxX(FSM#McEl>Y@jSR{5%;hz$)-n64$>0i{@6%=z zJ6SXHXIpS5Hx2HJwZB^;-OW|ZJJ#B(s5h6_%j#hgv_ zRKom@M3^?0>q{tCw_xpUx6<;CRLB=s&`(0p6|{`|ngpE+3oIc`&cRxF(s{X*OZBUZ zDCZFX7eGMg?bRR3g?dL%uA^|*=eCWwOU*v+t}ZdI4yAA{-O3tLWE~883Y5885Y0f& z0QWu5+d$;SuXY9tjN|sUz}d;_rs}F)IW47d{k{{|dNQOm0?AzK{cB7DFkBhjpU3f{ zeeMTdZpf`aXoz9}5hI2>-vw1S>{ehJ;*?!o_SRpxve`dmiDUyv6DW7d56W(s?ws5} z-ATA2xUjMXv!SL5r$f+Uwe3(^F{|;H` zfCq?)jp=Jnxc0jy+6LK{?gHyd@xt@sef{~uelQ8&E*d|0}5c>nuX%e>+waaCb76 zcQ$tZPiI$>^0p)5Ke%nGKlnmO&|&y9)hvy`kqe)5p&G;_$*A`UMAF`5;|};4-^R7N z(wBwqqJ-ftwt4gtj@vTYj{*+vXPPi^CyqfJ zNSh50>4O-3&C=@+R}8?6^H|VhnTn+6uXX14gEkdIo8i}Jw44AN>yv8oC+~ti>kJ&g zxp9FqjNgKp4;~*sYl);bD^ zB25O)D(y|CO)q~L1Dm<$@mKaEqD$=8Pg$Cof6CosOT(k4;m+2Mq&GXYr|I5n&D)^1 z7b_prFc+>^GqqGee1F1>f!aVk{5UlEkRl;VS;Uh?dS5N6%|>_IRwE^UzQa87o4b~HCWbC%P^@|s^)+b zVYQODhO%8oJO{Vwg&MF)*>I0n+Trr!7ZSki#CvqG;_qb-oS5bT$K5uMX}dLUz=b#$ zPlUiJ5J@_jR=z0H&)XSddVsyh1I-+bAH>`Ijab%^XtjAOU^K)eqEMt=xQT)?PDj6TW(eCuH0x?DhE;qS!18e)Dp;8lP;sI9~kl zl{VOjfyh{BOn*@qFqp68%Q=-$h}{D|$~M@==a86BLbkUO=B4-|Ri{6q*Oqfl-MJ#r zU}NkX5-)dls!RWXnOEiZ@*}RfwLkIC1o*gRsU{eDsHm<1o$Cu??F+oQd0r;rA@NiM z7BUInm!3e`k;17ex{p2R0SvT3axO|~gX<0a^9|vZWUTHh-R{N`7d=T#!(O4o2QG)XvtR*`H_ka?I#>R& zVvjZs{c|gv^hJ3-=m6Wo<*5G{HgPHhNu=;?pUVAjji&zZD{?aW*2YGH&JHgB(~p|G zu8O6MJk;&a2aC_gwvnf1-U!n`N3@HYS43QdJYFRui6w8(Ak{x(6p-+xP#>25&oAOVQ4#a3C0xN17j&PJpj0$uAfXWUO#geyPv3E7=YZ* z)DPWH)vpY22M7Z!p)vbm02$Dyzqg?Gs6m*8=j{v$!#L?d#wr8alzM5}+Ae9%TdC{g zC6vebWu(wi;t|k94zuGP2!F-PhnL<(xdpHwia4*{Cx9S&|<1M-fOore)GGJd*l<|pktitreg4p|GTLdmF1 zA~#tXF3&{ROew*by3SLV+EkZ@3oI$*6Rox2Tei)Y5pUwpGvjC+2{<)9^Hw&HD}{M`gCC`uBk+<`u@uHO;piW2!1V-n~_8~J?8kB+yegO0bm zPsf9BN6v%f>0SN%ZdnBd8rNCQSHqaTp8w07>Drf*>`kR&&8fTtTDlo<#NBuFln9pqH`y)7O=*vQuW x4sm-%Doiejou+ z_jecBEwa7Dp5(whqAp2x+zaGw<$x@bZjxKHo6a7{o^V)7XpQ(^=vtCn=RGV$TBPm7 z7gT$VJ<~8%BA@6N_b^?)61Uq>&nzwvxHwE93U7)%nrlz+Lw<56>5T(o#$SpX%{o79 z2q|ssD*Nvey7^;$`hO&3`8S4D*T}6uQd8i1OY=fs&Esj`zSi^RI^=z!>HiJlYy0w4 zn*HvcAB!s@J1H1+b#3bzkPMb3?KedtaNJw=KPY?W=t{#a+dHV(&W>%{wr$%sE4HnQ zlL{-gZQHh!it(jS_Z?sN>3e(h8ROk!|Np#uJbSIV=K9TRx3l^zuk(CAIid8^Ha)EE%g@tW4{%OEAZ8`GkF^Mw*>PYr1ZkDS!%y}w#* znd}y)1aTIYL)eWjMVZcX1olLx9T^Rw&GDfg)RwgN#Bld+b6i`3TGQN;*d7>`!T7|s z2b)FN{9WdbE%@qxf_#DgZFeWT zmK91(Q}8G2&fs>x>ik}%;XeN5ebo7KO}z|6GsrKj5ojzLzSGj;E3?5zXD46wECLC} zQL>jrh#L8*9OA(hjQ9&_KNr1u`nLyLFfxyN@bsQDp%314*bP`m-d+@yTrkIeQ6zoH zjcEr5n0~J`p%0oq3XHzmtt;9#WIo6?>U1>$>c^C+tpZp|b( zh3hp-jxGE7YG76@qwM0iU=_`x`#G}`4+1K2Bvn@u=1e)^k7BOt5rBl>i&;*INaSYX zTt;rn6D-JbN$rUW%J6{BtXMJc2a)D{0n2Z*TE?ZBdtVJI%_Q!MuFwGTdQB{*nsytr znOHMcCp4C`faGZ^UNdown>~*mN2<;$*%lyHBxiPUe#I6b_U3Q{*BZobKUz61us%Sy z4CbVBV+7E(k>NF?ZsB*|#})@7xRH^!OnYD(=PBSG5~0jr$_No&pwqA?lPMMKeLWj} z?JhQJ4m41%i|V3ZH6x40J@qIxbUn#o?8@k(1uPo3yN;v!UYpLGGG0Q3=-j7Ptzs5# zp*<2ZAHLR(*5KU#1QfeQpIPP0hBL<`8K&g<2oy%1uk*oZzh2!L8}~xtKi-AoC)X3$RR{WaGg{055+u-%@y&JF*)dxd|uJMXj?PE5f=y2bg6Q6D$|Q)M8G+J(s5JE0{Z}@}MS%C^c|v?yaP4Ny`&{=j1-0 zUTR>T$d}}H=7YmG-@+ELt&iqNVW@N?wgQ;&YUtM66O*5$&L&5fx(u5rjheB7g*h9N zWdZ7691_Q^@XVr5pw(oZc-7q#sg6c1xWuBenr#+rnKL;NQE_t9MTxT&ntjzIrlOQq zg_)D@azu-Rwh|-SWZ6A$xRYFkW#P~3!hDi4&Jr|5B+$xgD#VQ#5zE0F*9IsZ`3A)x zXPYF&$A2g2vZcrPbSc~n*m5&s7!8#v-@!wvLN7A|w?O#+=FMm-7&24FnLz80TN~^X zgOgn;H^g1CZb5*shrhb6`6AJIvP%(!BN*J^;1Y3d8aD#d%`I=%G_swD96vd7#GCK44ZfDBQM%vO6db%Co$q z+LwDs_pd)^guc}V9PipL7V$iiY0SK#TR(I9-Ky6f*<*di`des(9%7xHsR!ongEq1NNW%SCpj87m|+F?x2K`p~oVu*kVJ+fc4UxL_I0%76{{FvrTXRfK7f8hYEA8w!Rof7?G*dPY zE)NTGS?7wRA6uXqO*-ePH#gXOtD1yg*EgchxGRJsRoQdwVx^ zssP#KmM10X^VNQGMUcacG?miCXK}g2z1K&Pw<X z7(r6pt}h7>X#{~ngDHUJ49w;#!+qor7_^kg6+;2+OpaFpHQ?C%E>E|~!5HSv zyUDBa_Ded!^T>-g&3n3h#4njPFNQEenbmzORm_Q4o>1ony5>#Xu zO=V58(fk}uRn522#2iaS3$@WCuFDy!fSMH994PfCjQbL>e@0HOaY6!i97k#1*_gk& zPPgqC$R^Um?)2+iUV>{f67|Ek>Qh&&c|ulM&Fa@9^cJmS|4Sw0T`J%D$(+M{ zyCf5;l__foEnON@_}T%4ZnsOY;&cO9d1e&-9;Rk{cbwVhF2;e5*yf5Dz)3YBxLj(do(-wb4VJlIt6FUyKAfq2>2UT zRsb_AaMP2H*Fd@i>#ioYint|>l0x|VdKiLd0k{Bq|8e1QKlaiS?*6R0Gy2l?Uae!# zE?l+aj`#4qn5TL2el2e~(pG)@*pr4RnLD-g;p5n6Y3rp(dcceiuUBPhe$pfH6_0!} zF21d_=*n=fjKqh3UtMA)sn!SqcTtk|PSQ8|jgVmguOH(WxXe0WrO3H%PFU%_wDl8! zzYj*t;PL&qC*W7zqXA<6zIN1!*a*S2q`vIdY?cWg0spB{^m zKCCy;=`nizD+JJwUJ#bRzQ7AXxu%*wshpqPZZsvE9B!Mu9QX3Dl%wf6m{_Tt?4D_P z5G^m~DJI8h%*rPt2O=pi7nX)s9-PgtK!rtk#zY0mL0xy2F z6+Ravc?f}9UaOwGDzC{7=qVdF)T2L4BVLfE2cmUz1Bi2Mf(X$YP(oL50%I37I8K)5Urh5VPV!BI1;97N5%fjQgZN$-esoY8fs&fP! zMZSB|gLwBcdj+N4&kjPF%e4%<{DPZ1^#VBY;h|d{0YTp@+;E`7jykZ(V`2Gu%r9iAO`-kYHAT!S@pUH@TgIU60(v}a2La*ByHu{G5QXofw zR)J5vDh+XJgAMdAZcGC&(godZ6yPKSyEoCOEQ!l zE2h!p{IPnWa1F#fk^J`R3xB$3{6Ib0~yDCS6R0K0q;8>uq)bW_b)wO%6-Ab^;qIJh(p>Zn?_ zMVrJ%cQjxQLPdW>HKY!*>6Zgv)it;jqzt;~7X+v5H$<-0AN)MtIr&Gz(y`8AgW0!z zS>V6;zW-S;`Ip|Nkd3{u^?&99H>&%(;HaW~$-23jySuq1vE_^<`bGATZMx(q+e%vI zpN5HmR24O(f^3dnkpNaMO4^gyEWxxYwSdtSder!e2oxzHLrQ2v0t>=VZuj&2Jz@)v zDa1J)c5vRK{42Yk%<9&SE>|B3R>S*3@vbuVhIdzdEV4sa(lFrG`ee&StAR!nkp%pP9 zV9BSh9BiPR^Ph|wUY9aumkmR3T-erIO7%A&u+~)S| z_Z_&F0)D~e=<3epXy})9^i?2~suTg19g{YGObtH%B5fleXN%*=s&J8^fz>p%o^cDA z2;`zkxJY5~)#oJ~xsj>1Dzn+xYXQa1nS?%*jQdkvUQri2r)ynSmry*7rKwwk(;X+0 z$lLd%hBP4=v@{Zl)NE7LbjQR&6Gy2wh1&#;pR0zWC{QR&q{zF#q%x05u@bEN7*B#CDDP*0~`T7V8hgg@z6)x{+v&#*?66xpIknRrp<|=(QoHhdZFOBjnsL9bc9m zn+uPnB6&t z^ilIN0MD*&!9Eko2I@Ru%!kK(Lz!*8!;@`K5OL4SW4F`p@f|@Ba2;{`2JZKh9IZ&M z)EQ>+4OS;~98JeZY>b;4bHD+hn^meUknb2VX!zu zFyMA#g8fLK^n0YB;<{Ir?3?6?s`V^uU2&H*$;CAiC$3InlUo4(l3u^dXKq-hzs%Ux z#82x{C@V$Yb}z$<-Hvi`Gzim9@dJO0gj5C;J!B^HBi>y~m6gLuH&5C|DGgnvr>Ctm zr%~ENDKLE(MP1!}l0chN7UM&Qd^RMl`OW&5KA1D^MtM8wLYJzgNVJJO^HQ6|VKnP$ zi@`=pl-e;@!Z$*49tCenFp6~n6>0pUZXscMz)D77Eq&-Bm=vX77f z90!Jj|XH@}kx{r~v?>09E?fLa7 z`ikaXPnhvl5;`tux?ApM_jkoRI6v|u_e0&8RkJyqWL}BoNjawyjMLvK8}2#N>@8!V zhYi;66@C%U_D~X#keBX)@WI6eq;+}Xtaiv#ZQMBSu9Bnuii_ekG{q+Bm;t75#udr4 zodW)CTL!AK=m(Ua2f&i}9hOfyLKe7{&K1oN=4L-);Vg5BNQAp9KsM+0EGcu(Yb5%H9u;RKwjVKB1FB(JjVyZiu3oh{?S=^k zT;Fts7}hU4z}{>I!{ILzcwW+!ecs#0$cR1Yz#tD6ecJBXz0h8mv;t9C zWRZv#HVG**cDzccmx?4U30m?3>B2WmmyU+0*zx*u!;}$aJ3`yS6rxIb5F$8t@Z%uX zK?YaQ#W_p~#8e05<(^|2V6Qm(^KzS&(^PE=n(Wt~hk|t`~ zFdKJ(i|$8##>z@%VenVnR{s@dir2$c`Q0NNPpfAp?!MxRnE)@ zyJ-f(uovE@&+BadwAV{VoJtBmb-o>b)vlVH35$fuPf#~$#i|wam^l=%*-vMjo-dp}#lFdc7nX0JjMpC$|I2T)cN1R+ijsp2ti zLIG;7Z*Z^ud2JBrMi|$w*wcB?5r>1Y<5zM;c+soJ6HdPR<7r({VDh%n9 z(0GNTS`RL$6_C$py;g02zk%YWM2}rDy{9JA)4VkBcSxvzCMg-v8&XuEJSsw`*3_JK zG>5NtH1H?ZsjLjTJW7;e_Ad0e2HG-Jw z$`<~_TltL}T0rK@FO5d6tg>>7ibeow<~%|BS-i_uo^e*ueR+%di?%&c+|2r%&;`rn z8ivM3!B!hYZ4R7NRNLRVTH~*8Y>*+iDv*D1V6)^$kfLYU@L@X--xjgcRvOvl-GZvD zRl@o`ceGAcktDQEnd9^Jzim$37BhT>e+%Q`=>NHU`R97~Uy8vHGjuVu`Bn*>{tsJ9 zQC3>$I|ie0db(2Pt%2=wK{QCDf+${wp$I+m%`wwv@2}VvHu0Byg#`+#V3eQ0N9hTd zB+{kUMCX&v6z{Rq@#X#@ngATOriaETLF^*xk`e{u0Wq4@?vo0pB}#S^7VJg1;bYH_ z1hjxlDE}hl#^s5(OI@r1j4o(fVNs?9VQJ!lYX*`hm%K~9AoVL1uVna%45M`Wa{=7A z>Q}0Z$S(ODp>>Hm6cZ_rwTFw4SWLIIyK?$gp0vO$hn_bx)R9`$guiHMyB-#B&3*&z zeha8-&wod$+F=I+>i+Uu500a0(X2BTDwLPF9d(m6(+xI`5QhE5sY^Fp`3&Q2l{aZ& z>u`1QAYP2~M#yrpjHAOBhJqqF^`Q)#dl;Erj7Co{<`Dla$sxw6?F(K}%}@Ba!*P## zECDm{H#~WBDj9IP#+Sz*YBQVzs6NQ!9O+N~qyzZR)=V zCbH$=d)R!pFzo*YiT}^@j(;h?;NOs$|E(#l(tz?oT?Bk}Pm(3kfCj|>gaS4Kg39WN zBxp_``B|is00dS$Y{DGO=smEiOQKR`j&PaZ7}j8=Z7o}|6et8#7RlSN*ksk1rgphI zJHPd0_;r10!lcP&n3VqRw*Arh<=%C@KK%96BMfvD1pr>yUn0s5T4(X$`q}ZY!;Hm; zEdXq{=-^Grhao_C6@Qy6gKmY7w*F9MP#qDO* zJyikW4WraO*?L}ZJMFe({esO?>+`XK{WbIik{)G#Fj0SZ{+76d0P;-eSF}4^=PNhG zLl68R(hmbn(_3|SF8cCU35b7in&n-mpPr?ICNE^awy2ezvc|-hV+|cX#62WNVdDz2 zaZtI|!F@%7gxHM2#@(HCKi`A|X$@JDMU;j))kZ2;hmN6S{z9*ly<NR1@{Lsd&zXT-;5~Xu%|$W^C?@4?i!Itr}dM_I1VWiQN_YJQYtF*YVrr?Wc>yz zBXR_p(qFsucn-i!Akq#J#fJA|hVXx3n4U5K-H9Dq#$z}F~-2f@A;}|5+MMj4*GFoP8JgZpO;>2K6EJad>T$aqb%5e}h z@96MFIX)g5TQ+*R3@E9CY^0MF&TO?tQE7N{!t4qt^L*;~+>0xw(L{Um3Sz3^`VOQb zc@@pnRQO?YUO`bO7D6AUPElfFa)m8JCOhd>>H^RQ&8!S-BR7~@gqY@43LQUmJHxdU;IuJ+Uy>gF*8lzth9OeDaba@$= zERBkagfVPPLoHToj93p{F2D6zX@=@L6{HM|xjUU%0{Ni+*eSKs@-4rKk@s_QW?%W| zWmQ&hj(r_&GKFUtibkyrxtEwvOAAM@xAJ=6`mU3!syD z)Bkoem0Bve5Ut}FY*NHJ%fnOUBG7h7$&9i@s80EAqf-)CO!5klWOu#sB#!nk zAHM6@*x5=PKXR!VHum)GlKAFPRiTQ;dD z)Kbm&>YIvi?KP!r;HJoQlpB*`xv&&OP^wRPEX^Ph!6ES-CyrQS`IYUfKR1SMpFGq0 zmF~LYb`RsbRQ7txNP$nogPn<&vg5KFcgHpwbgFWyWR~s5aeW5!TR%s|cJF;pO{(|t zpG#w#4RG-*6;&x@0zx&nJmJruF+QvIxpe;Q^FRNI#datR{W|psqWq26b`!y)`z+c; z27MqfFPcv=Cn5kpbh4pP6je*4kFj49=Xp($3lT6h%MYAMu{7wx7;r==<-(|#d{!VM zGv~-!Jv(5cn@u+69LQx7KQ9_WvFr#|y)cNXn32Q?hc-YmQ`VMFR$^Tsg;5%16+lW{ zHTCTAw7yTKiU~V>2%(U9V)mBBQ?0DFPg(i=u2~EJ_x;6M%aqxFMUpegF=J~!Tm1^h z^)E}ZcuwX|DW9ZOXe!NNSiq&cW*jYFqk)nnHL}xm6=RE_(DCd|f-zvIIi5I1u>MJeo z!%;;`ZlBOya|A*nYbcOSk*K1QjXFc0|2`qB3og8b{EgS<#)hB|!Z;?HOrlFBm)%H>>w`&1>qol zHBKOHbgpt!;1Vr#itn#{Ep*UwQ_EpD9)9fF2o-1<>Q9=z~O}EeaQE)gzX>z4w^$znPLXdwA+Ov>Jp zfv+3Gkfz%lNr5%e0o;lK0tWHG2N#ej%{E1H^Ag++w9e6v5_Ky_(`)vtTq;PEx=AAW zLXr@2G0EtrwmYTNC$cqUgLWBYn9*(cxd$oQdqq?+Pfd-Y+{-IX_-~bz2FUu$Y5>e! z!vN~s*s)Z>BVy$J)SAL_)Gc<9bDUA1Ve&(sM~1$x5;Z*(p3tW;KD$$ z&gNQiH(fimsY`Rld$c4w>Z75xqD6uK~` z!U_$h?Q@pc*=k&)eR$%=giu$RJhS&hA0O{>g)KcsbolCXXMaj;^~I0hftIUDnh>Zj z1dV3HE0P|mtGwIC2fs7ErBGk8BNVN=fZts_FE&bR&?O+U=ls0|2)iSW`OgwO1koe( zWt1i6&s<3O+8>cru7+C-E}>@pOCJoF%uBAs1@Zf76L&wy$tV*xWz_5hq3nc7ukxI? zPZg(a(rQ;5N=!n%lvefyEF1}v=cr3~LXA$vlDrsW)-t#Jw>d~F+dZ~^n(>4Hu^t0jzKI$i z9vF14dl$t#^zutd5mrO7-yQEt+zZa+frS~p+2t^7?9|RlwBE#498;_nN4X;LHOC2(MQAy432K{FLbp8C0gQVw%!i}lNp~r;!&YAGs0>k z1$5AscC2NNjmtv`u7!#H--pf$&AS{&SHFvIhH(0M1Q|ovmL@L;Gfd3=zI;i~CX|al zSg3AbOZGLF2_?omy~(Oo-%;mEwt}AST)<@Cd_B6I_Rk$U`!jSB*f^*qmZppxt_A~9 zG)CBE-KNz7JZ72vTf46)(9N-~oK3zwWqM#9RxvyerJ=|ASOhV~XdoglBUp{qf$ID)9#EFD!5=11wz3=Y6PJj>`TJ(YjP}(ge#`d+{zAfP z-ZE3V@J{>nkD-W=eH+dZ%y*MW{GXe|f408=?>h=*Q)5>rOBYWCL#J;)smu4W;(u`S z6vw4N8BuvNYOv89CJ728yNJ zlRu9-B#OjNOA@sJp&NFH5N2_N^-X@GJ9s3^k%k3G17}6JFH-uD{3Io75=D^oA@CQS z@@+?K5`ZRbraRI!cBLDU=9b(B`+p^tgnH3t-f^US>P&Wu(1nwpfGu!nm=$wy*URu6Z(eu9&R*> znxrYOt`mLY7l)@j;=Zq?VlRnmCS1vDS9ZDY_)_i;4{Wp(Z{53aHg32z@nFXG-k8Mg zgGB9{HV>~7&-@$f8`QsP0W}V4?%v;x z0M}EIT9#@VAob3ul!T|2vIXNTQXP6!>V$Sdg-5GcmArK!Zvdus}x0H4?C<6a`@S3&8*unE>H(L6glt2jhL3=ntw*v0Bs3 zFsmh!?$Jo&=j&|lclcBVn|mILeK5vHXiPI*iq}{NNbG|4P%-<1mLe3ILKv2Ws;Rtt zQ2aUTGHknsM<2^J7Uy2mlqGi6pe0?}TXOnfc`)iJ+hE;)U&xX-kHI~u`|O$C9s%%j z%IYy+X%(lB1qZdMZKVYlTen%Vk_?1d8PL3@m(OT>XHuIk*`BsZOW*9VBTyH3Hx-7Lh z2IReTgq~*hjX6jbGAD7_v>@vYhRWq;6Daw-hdm{M;Q7vFRq*P;N4vAZGgz$hH!)eT8(8#~C^YN+V?^yYDgw)eTOht&n0+r|R;(5eCqX zw#f(?T2#)0C$YMx#ci{yg%3~XCR5T^`B89vr~Yrq;Hs?*Hs*VDxzqrMpWtVvwQ=Zc z;oQr~B6@HA=eMGZ8^1eG!ZQONZ@+=7u@8lAR`o%XzdNsilwix}jVk2ey1!2u0y2yR z^aA<&V#)gc{J&5AUvl97JG@@l-p<9;<3Du9m^eoHeg@Rw>0%NENZRn~iOayjz+i)l zfnX8Qymn(eMJjT!Cgp_gp&9(1I3W(p$UNP%Uh+-v?U(nzAFV$eLh2EN5KCb{l67S2 zSRP0s)pMA2qK6QiYY{h=+>WR|-TlTHbcp@f(8LZ7Ml?dX5yp5Dbh;#a8znsp#)Z_B zG)lvzl{>j7bLxDu9&17IxfKCuc1JNX7_jWz}?T2_k%wmLFqf=BFhcS}*E_vsUo zT%q@Wx}10ct6$drvyV$2Lo-pXmL!|zk?(W$brp{&x*V?#X{`MYo!VcrYfsxg z%mxN0d3=Ith6uVn=X`-;-#j3%6)Obs7(C*;AN>*C+$UfEICT|-K^EBW69@SpuXC3F z^>zMzk^d(aTd@|D5B6fl7hhaa!eMRUKthDi0TD^0&9I{nNv$(Cn`2Fm0VnuyfJUmR zwn%DptN|z(NWN^VRNgvzDs4O-&S5B)uu^^dW?hKev|XB8^EzlMtxHg_SakYHCBi^zmH>d_*m<*AonRN#K%v+lRVr9d!xr|qeo)K_pl&8 z8GgmnQuw+kRsO=|!F~3Dn_MH0dBHDHe)k#eho+PR|1s^oS^9ySZK{vBAoO`|s*gEA z&xZ;cue48fo)><`cP-fKh+SWZk5E7AqW3Am?ox!{1ODF+;t*AcTJAHsDz7tw6$6vv zGVo?oBPJoV@J)4-y;SSC*`x3&^*AbhTIlA^v6$#4bx9bJhDbn;c4VQ0drPLrJdj8C zOpG*0En6u4Z*FcCD#trMbcpuQg9;?*bgG^iW8?W7$JSgr%L^LYb3@6qt>Yeh753kh z??rnm_~lFM+ug=F%B}ULV50m1whgbPCT7jE0$#xqFxh;G8dA;~+~~%a_I{7L-;`K4 zVe22Y@h$9lTF4*y9P_UwJp%4|G&9&YX`;ryrkk@SBn&t=!zjB3ngnb->EWrQeYbT@ z4(|d)sIki+qpGzEL>>gFk~T(TPtTdvH~4?kLJCaZ5+iy|`qIL|K0q5mkiu@3A*>5# zlG#7FMk?^3e?Xw*TaZ-WL6a@+pKmNuJW_9t>ZJoNFJmB35En<1O{wVrps!(@FI9VC z!Eu(!VpGjuQ?WrJd7CpD{6VaDk4(1;pFP;@68uUTB?zauakobxj(#P?HbkEQoY(Gt0}?i>%H%?qVO?4lcd)G0{w3;NL*NKfUd9 z3`Vw&tl^%)456&heL_Mt;k^WpazAaZpdo-85ix7-^%@}Dsj@_1gBhet9TPyp?3;RL zegKcu!M_@R2DH{vqz#SJLBn5T)Ef|C2K{)1A;_=T1%=1)nxI#v`b8K;)R6p91$Sym zbrJWFvP&SGz&Bc0$?^I9QmyXXA^Hn!WHcet4L^!$;k)`rrT~seYmO8nkir>EnEk?N zZSZOML;bJLT(KDmrc#}JlJ&HRF+bi7)~*tc$+w)@KLg#!134D<<$nlH1+;V{m@G^} z_u|JTr@^UKZR@yEhPD~dAf3SpdLaTO28b}BSElf#I+BbwTvaBzEjM35lghNwY!W7v zr0gK>d|Oh)KNN^C84HZxhJ)j190mxC(?pDcv2@ChfW;TSLM+HYMr)>Ss~uPz4seJt zeMNLRP@_rC3KD)eEMN^|$AwYfNCf9$&FC}QX8uvYS>93HO%0M^bw=HT0Z)`jEsIBP zS~L2TkViGNgd1EB_P-ZI+Tm3tT6q0%@I_e)dB$G|V{Mv)l@7zj%={94_gJmAU~D}=F(8>43B%T>2r5PBQ9 z0EvNDDiuppEFG(0)$7MA8QfR>?WZ5K%2M8;R%pFap%`3{KHG>j2w7!PJ4C8ee#aFv z?$J4Pcroh{6tC<9Uk13r)RkK7sHV)klyFos+uK!prBe^RXtOs)?4ammzvJU+LUuAn4j>iu%DiC^8GXR7mNKSgz9>B z#_C%2g(xPgMe`6n=IPcig?_0e#h0qt(&y*;aqx`8A8-y64|B{@Nd>2fu{5iVUI^B! z17RxtlG{U-(py7D7pTN{m+v)S6$o>|D=j=6tcUUU!dc%346H>IDb2^9u*HX7NNSvU zjtCH}YhaWO+OS^|U%}bFcK93=gp|kI%f6xvK-*KS?M=QV+r_QMUdq7&@w^y9+r%(o zi-paYt@AE^MErT}$@&f!NuBiqvLM+jRrb+QkM3)F$YWT?2i5Zr%008>bxKvGwYSC( zMV6z+nB*)3QesT#!hT4&R?ZYS=-a3a0NoD|3Y$lLq?ioEgCqr#OUYBt2gE?jX&v?c zusoUEbIuLI-5(FwQ4)G5BS!^YbSx|Q(Z!4KtEyxWqSQoPgtNmE_6ptwaQWdBP+qyQ z^<$E^ix(L9L}LOJMDHbvT~iNH@@)bxh`Bs^^7AIgmA2VO2`Y_8Hd{rdZaAW9L~Yg_ zNGx5r_dLq;-7=rr{A&0h^gyk)?LLT~YOPI}YXN3){Pfv*UhrhO{Y5 z_424`kTo$DtWOCb_x2K~;Cj%Eh3vHKaj(^L5|Q-q>M3H-zP;NBfr?-HX(2LD5nTqb z`ZH$L>pbmGlbIg6O5Z9yIxv%Y#{6SX)=@hK9eUbQBbICfdi-PD_7TvZXWC(wt)-;{ zZmljn7zi?#(TeHRQIjL&N~w9W6m_i_+)Q^wjWbpnB2*#(4Dx#FlC@^h@#~ zv5l17u@WT zniS-_2i1mLy3}s#_1`Hz@oS;2V9TINR_(x+2tCwFR)(LWO`}TcLT4{ZXHLGVnG4be z6yvMK3jvFD`D`^;gI2Ztr5xLq-B=FfhEoZ1OYu28$+Fh-4#xt*VGHrha92StBR!k3 z=0c$;E%|#U+K&0f)`4Jcu}UWz;xGcfW6-5#{gzt0ELANN4F#JuLf$9N`A}oHyJ-Bs5hQ z(fEv%9$1(7*kZkOGLJONQh!k#=!3loJEv}oe}ul%>4Ze{m|Ew%U!Zb!hNuSq-UqzT zh+oUefh-e2>4g1or=6REJ90EpsFnfo0)Y;g&On|)a^NZ4at-V`{fig2B`J{i}2$4f@K@CUI?j=c~Dp%NP8Ke161rSK<$e zBIn-=K1I#wz0f+~{t;8949q5U)GY`7OsP`e-#4Mj-zzFU@cYO4k1&Y-^yP29ma*Lv zDmn5{Woy73lA}Ug;e}-3@`kw#B^+Qvuh~e} zWK0$Q0U7E?PFBaT4b=L641a0~ggD3{rJde{TCDthVsL{hY?ciq54DQ=aat$S<5}-K z>aaU0cYIS@kd^beYfLvjIgH1SL@&yK!V8}v4>XuG^MwlOh4sK2Rr&53(WbO)QLtrG zP|c#42KcRef>}K@!36xp3JHw+#n+$j6xCUHa1*`+|GqCUpD&!XO! zaUzu~&~R!6k5zpToLWf>W_~eAnr=xdFYC109m=^aLiB-s^1c+zX0owD(}p()lDkK6 z2A;t+&x)6&X8cHlr5`eJEwJXEe|v4Vu)-K5#=R-Q4#1+Wm2W_R|D&|qs1mItCzZC< z^y#d%e#VfVMRDG;Di>2I57P;S{Fm7i?%5AWlRq2yrNwxqB%(GeA?ZQLvr}Wq-xA5>xnx!J@3i7l!%q}1f~`EN4?QyqS#H-OUJ5Z?W!p{{w=zb z%-Ls8p}by4lkSZYx{cQE9P)7ANO_~F7Ky5dMH!IaC%uuu+H|UyMnO8n71lMCpWLRR zuGTGWHCXf=ttDo8dP{>^>#fYw(8E@s-~a1r;A=Pt_7&S?W}C?V6JGAi`(Yk`r~fie z&i+%0r{DH>JFIdncV0};cr#0 z!niqIG5ZIK&6o_39|$w%r_(*xM#&k|`4bueM|R1XT+cg9*`vJir68++DR^=3sP}*K zV=lZh|FfTN|M4R~}K(^Yzd&s5v}1Zj?Zli3*Gr{)qpZe`Zh45QkB zS63U1Azvriwr^)v?(KvFWMdkRV;wrM(H`N99fLJQ<}?IgD8kW~TwWAxW{cbU;QhTp zuE~*K-tmftkqv!|zQ*poaU7){UBx){8@+K%+TBm&1f$V|h&}IdfKT^EoUYvQLj0@D zkR5k)BAs6L{A(>rOA8{jxsZDquoZ*y5oxj#i}exOIFr^!(}pF3ii8gYVSe_}FlI$FIMlTgMzy~pnPQ6($GujG=$9c|Yp4U`YHKjM z6D8VBTLX(C32xHCg*9>sF4zmBWGk-dCloPuCq=|^R`?=uLrLp_X*rE&C=YQ%Q}Ki8 z-A^X_7}25tqhcdMUzePlnZR@CtI~^kmAPG=C!UlpmeZi%+l0xKB1cxpjqr=Qj8rE$ zG-q1X8@07DZqhm1nGV$adlD=-7!Y%$Ot_Dk=&ZYP8Z{Wigq>m1u)<#Z5L|^|j6N?C=|Eht>AzA7v`mbX7a3aJ<6Ux|-Nlbx3}z zk=))FU~49X%~VCyMwtFPO%!%fo=IgL0$FHn1GZTmGokKRGWSEfa}OzWaNkusV32&q zLZA@zH5nv^iUR@tm-DaU|AzA4rxzK)iw@n}biC^FFxI?+(ByXn!e@1u(theWYBBJ?^=5 zN95J#m-9t@UdUbW1T%c4%GCQxRMC%u1d z=N3cu6EDFoU@!HMZoNs@>?AGqP>fmM)8Tj5cU-moIPEgx7B$@c4*S)oREwNGA}u3T zekUHkiKE%Y*BoYj9yZ^MO%`_9-w)@24#Nx<)`1EO@4q6!*`qRfs<1@R7sj}6bcyE| z6zswSe1c;gU|Xig5s&*PUhT-w^7;gJjpdeUSAfNv8w z&?4E@9kZu-j(QFkd>4E>^~ylJ@Z(9W%U8n8yddUvw)sR{-cIMKV*kyc3-O! zDuZ7%svpkF3zWei1Rj6P#yf1)KxbGkGrz1ZNA({-%(T*eGf2qN4!6*|iDg*jwPMi3 z(3jDt-4Ux_EcKQRcJbx( zoS32n$0G23+N`$^nBEJ+FF$>(yZ^|0n>I&R=|uqo(x&^LgjuG4MIw|nH2yy!SpN>o z-aM)uHOohc#==ulA&`|8E=IMWoKM0^tn*;q0pQ(A}gh~q!21{3Wwg1F6s&6huyoR=$k zMVQ3oxz2E_79Q|olmDX`idfomex|ur<=DzRnPYg>VxqdbDM|*8vtAFkPQ@9S9KBZk z|B?32(Uo=Ew`f&t+qUggY}?$iZQD-8729UTwr$&}=;b@-r*rPRw|)1$*4Ao!|2^ki zV~p8HAHDC_w|e3?h z#Tk*(q)mgsTzuOv~rhMQE63ao9u zRv$OV==AfJ=``v3zJVcS+|~ku7;sA28Y3kuUlS53gyy4Z0hW`9EaNtpZyDWI-I-ijK8Kovse%-%6V&oc zmtWenNXtc0MTMzb%19Q((NZJ_0t<2%SU^S((knKNe=5s?yY-ep1%`8jLYCZD+oY~_ zmjy@ zDC&gZO93HS4vX(GCWtr6jCdWS{&x@rq6=li?=&+Uv1P(;cwMB=VlKk(Gu=Qy7d^r> zZs0xb@`s2P+QL6~;O6xZ315IwK53u5ttFLP!`u3i8sdvUE7FEmwMvSt812G z2LmEYDtqaj^if^ntVDzM(ImK}8_ulZ7&gz0;#!v2LO{Ec^9Bw5rre(sya*dJCrE9*Rt@w z;`xOq8MIC71enw6{6Hnt6UObEibcTm`X)e2e2>s$_~kkqS5lBc97L6N{rH3C`l$>@8n57{YttZAv>s*sdAzhbk& zckIt7O4piFUJ_{1{m9@;+Fefm{w8y!dA-eH>~};9c&WY`Tf_`+4ov7RvfFn16bn+- zHY<7yi5P`Ajz+PRP1$V(GW#S8gKuoIy@aorx7YgHMCSA}r%Y8lP&V7NUa{rR;ax98 z>h6M!6cnKlD)U=kOxwe2D!4KENkS17HBz;_Q!j@FvNQSseET3-IE2Kry3>GyoZO&C zg&N*j9O5m6ER8@P&0t9TA4M0>{C_q46nc~Ep1-sb7hwKRd4>OP=M|x^VFGg#^Dhrk zz?ZbOxrzIKT4s4iGurgZBM6&9ZU;pq5XXhUia-fN<_Svr2jvy~(Oo>w$H%Vxjo5`H z0@t03;8KR7P=pbEFUq{Mc7WZD5(p9tnGF$6-%R(6Yry!SJ*GxQlg2@3HD#`FpcqMQ zB<}*?JGeU=i`v50DiO(Xw^v}Fp$bnvd3yukw=bJyx?WKdjfZcCaH~x=-<7 zu@-RTeLYgE;2R7uqIijA?XB6^+rH)fT?n4MOpd^1CZf{|+$MAS>uJxMgtp}$%8~>Z zP;fn8YXR{u?a_ZH?EigV(62_FlA`?o3t#`m7v%u+bJ8SnL>3GwfM5*JZCU?)QCJuv zRU!_nCyp#3LVaz-L|ydJ!2~Uw-9qakmzTGkx1w=%HG&kR->{Sxuha5s^|k92{eJH1 zb@CiEqbB^_VAFkT<>-xX>a}C4z54y>#puh#0w0#TmOlvEJ{02;rB8=yvoLq@_05K{ zLu_CJOK`b*7Y`P8_kGi&L#_{|L+|b5JL5Wa$ZP+#04n~h9T*=@uh_K$EPmfR7G8HC z6`nLL@xam0z;zlJkN;Gen_}O}b7n~Kbwk8d`Ex+X zU9BDiAMyEX9!6Kejs^~b_Eh*mYH&axVbo3>0u!A{sLGezNk>FJ)Vv$nMf$7umk`mQ zQs0fbm)d$5;9S^>BT;HdY%gSwY(jkP`PV%aM7+baWPyy9fagO1FPdaUvuH_=gBU7^i;H6xE6!0!6mQElO767ya#0$QdsI|ykN<}X9=pgwW&LbQyFd?V{E6Xad%dTr>sefYzMM(W zPj;KeSra`vR;yJttUd`J^Ud^d>=DAgrvBAW3@2ADC#MM%BBtrzg&5jc{6i~70B`_= zhxA&bi-vt);c6!QX->@QMwn^<{p ziCC9p4_sJMx{?CV+%)4JX9jj_&5HQC27m%gZl|zcQ_M>0l4z)!euk<56-r7c$1a&| zp7a)(od4vJToOMgDB#62x`4G8BPGbOyMxb^Ydqv(PFycXBX1L@nxH{bpKAENzLy@k ziSn#C-YG&uVW*f?iSmbt=t+0QbLp+Bj9g}bU9Yhh$h@MN#%V}oX*=yv%8?Dh9*V`| z$ZzI6&vBU$O9~EV`mQZDrG~+VG|eW7{=j%u`!2IQq9gbU@FKs69Q8T5KmB{Ec(NCm zt+8;%nQ3X!o;QtWr7=e6xZ{xzQ7z!Z9n8s7CrqrCaLf(ttr@*ZG^31(gbG}XL2&eD zYN622)T3Fs79pkC^m)g07F?`N&`8@8)|~~{8Bys^pQ&QXpVMPfufIgUrtN{~>y4$o zXiD8ghRWS!2H2gwptn?SaB;T=o}AVLv|62IZKIN>f)bFZ&tJM?@VA|D`TNhPdu{uERB6zv^7gL2nXrh0->%S|yGlB&o5yhwF!v`uitwcSqT@(I>EdxrHX z-*x5kiRC|jCjKbcoBAhTp6V~YJQ2@l|8J)^t^VU(a~CS8^oZPLGP#*DtEb>(iF6%~ z)u!ZcjO2>5feaX`T!d1J3``WdD*B#^q(?JklOSjfQZ8L5sz&b_NCebHTBWZD;9CWx zXAKilsE8A-s!XceYgYXmQ4@Up{RuMEfGOXz0@gn)qRL8+a;^qpGB;uRf|`?YW)zY( zbQxuw=48zU4;G-*WlaF?ct8N_0XKHU>Lmuzh-VpyQ*Y)Os)n8jYPnO+jt$a_YOabl zyL(esmBxA1`lG7vAyl!`ZIsm*mQ};5TJi%ipt9kZ7%QTn996hXr4Jeh+r@IJL>+4r zt|Iz6WN3R)#G|u(^YjE~hiJP(|HaL-b%z2*M-{GI_ubE{U>}Dr+$GL6D4RQ zF`s?cOKkFoY|1aQW|aLR;~%I3cd{9ciInK#+4I&ZjWv)+XLQ}Cxq2UPF1R#A~5bB6QN zbaikOFewrkAABjKl*}#5htEg3Gd<_pgZG)M=~8jy#Y!coJpdB3ou5EFPz~FH6+r=! z2!irX!QZy5U=A{PtGw#PlCEGsGA0_lTwg4k=5Hqke_ny{W!#`icEZS~D+Fr#v~qI6 zk(Naf5`V|#8_A>d$$a_r!sRf(1ikb>(;y~2$mJ#X6CznUH2Rf;RXMe$ z+oLeMuuS2I?M2QsF|vrD#~7$OyLhX0nGv zBO0XJJQD!8w+3yJcg0_=1;%X&fw&-I@)VCJW#Zg*K#p(COi=aciua)=Fa;74nFNXW z&WZfIFr4;-VR))5$SHyZt#W{bRZ zdUtH$zXN>uYzO@4Ut#fI2?<{h6j!Xl8JmmtA^@RwCVEaU2IEHB*}_Jq@(B%)NIiYz zb|81aZp)^+ggzQ<(9QUR0l@Q(5Jz9sLt9huN+9BD2i8cJiTs>Mv#C}Lq6LDyW!e6! zyeYN0&t^ventYTX@j&u@z$4l<4$%a{!#J^nEwQQJ?IHt}+FZS2jw{-=_Q_r;Y8LIb zI=OGHE zHJ`QF`0#t$Hu#7&U?cc( zWOwIxK=F|gc0n@_GpDvKI@a?N0l&d%;KiT=dEs0I37oM+8DZFK78}73zo`mkWan4u zz(|8%3I!-yn9uPpPiWxMwkPIlPZ_TXOI7VvWUD?nW<1KT(Y~ecOH)HzN8ovy*ZJQ9 zCl-zD&4#w(sr2Z=ViFZ4NpyC_d0BgbR6A^w7|12>XDSjNS@r6T)O^(V6}KOh)sVvlsq zfB{USuPoe)1eDM}KFN0Wb0y80Zun651%1R4FCkS~nn*r`s*;XJXVlb%egxUIzspKD1c5(;G^> z`8{R~s97j!)U08OZKxC!V@#AeXP_=5h7M-)!`UJmy0nl>4-MXnkQfaHSpJ$;8;@YG z?Nk4Yv-+l-2HH!Ik-P(hKnt|*mxxmbQ11O!mLp8je#jz@@rJAQDUdCF&@jZP2nVoJ z!!Lir^o9@Iwl&B!WTB(L*NHVN#WU*a;GQu4P{-Dq38FME(GEe`FubAhmk5H(?@!l0 zjWY@-*n}{%$Y{dlKslOUPGFg5#4SoJv7B@E)%Ul6hz5kFOvP2$H5z%1KwRicl@$yz zqtpYI`AQe-vXBbnFtF<1RP+fp9e){{PdPYgrB~>YBY~?aFm% zy{Z&?t=uIbkMg_SD#}DXd80*r6GF%15^EZ0OZDlO;fkxes6YJO>neP!QRQ={s}Z+g zub{iOo5;-{P1BA#+>~F$IRBG{$hR-jbAh_g_0L1He`Mev9^TP%z3t$l5+9*giTRCK zxDc+foXz!plv8i2Qc=FCEEu6J8^+&Y$xKOT$f&GaY+i(b4zD~AbHO>duqqN`CJ`wE z4lLg+O*=4~+9|sSeR8H&QgTY01Vd)!BOR(d+>A-D?^*%^^uBU758j7}q!74uCT58- z%!7$_z@t%D2Pe~Fz9;vQ{Yt!!P8(-=&_sP1Vbif}JUU{;hEroHO`TSyb&6UtcXU6B zk3{@7lF+(y!kue2eWz>u%YqkAorQHD`Gh7S@ukEofBa$FqIPHqIX*n&f_#I00B;~+ zlmA@rp{u3~>PDMCW*aiFHOerfuzdjCbn)?$Y=To91fzDZ2FxslMDIG8 z!l6VQIEiSCF+|voC(Jf^`VDl|j@p+=lr}kboSh<;_8{ty$Dju3N3gJB$;Y4$!TEBx zc8W3-wed0u9--H{O2DF|ow}ms03@kJ+t0*TD)YCWnW{=_B7?B^{O>rpF!P*_ADo+E z+b0{aPIN4C)qCes5)PR}G0EC2l5-hB>w^-~l4^{-vVw)nA^Q>SO}i&~99yI@*i5`7 zCDXp@bguipf59i7QVrrCUy8-^{{o-5+o$Z%_Ss&cZk#p8owLV3YWG)68IC5msAXI(rt^T$(JQ@GE%?SGH`^=jba^g@q@h)QGMr`nS&HJKSwQd8a3?S8AA0ftWaEv+B-&k@(V zXV7=7Fab|++h`hCGOc{|0Jar4cX~>-d`EA$D-T!TO>(=;OajCAg0k}DU~ z_9!|88?6?>np;)4FrY5Aou`r5<0#;dfOV)Dy7*=wXHN}h*=TC2eCgkYH`~C`JLtkW zlM40_kHBOaXv!FWBIKPf(EmCf?B~X{bzfK!%)e;V{rmBd{Qr=V1xy_P0PC-8{J$jS zN>xiGY!wV2xMo-bN>bWX!yb7HNJu9sY7wYHlJ7Luk_r@p3TGyc5Rn-Zle#r8$UZlb z5Ae?_rcml>rF-P2ZwfJ2D?gCv3cqJbPabeyy=Fc+OnN?E`TF=m>tm=Q@M0uiOMEjD znBUeV9%Mx9e*Z=m=;l}YZ5Ig%DM5h6paF5?X9@$c0b3Ya?z1^UB?jzv?(q@GT0Q|D zF=>%p&~t}bHk-lsobbat0<>C^owOhTq#gqZtI$zV#(vY79eLrwYR4n>O0MLXU6Gl6t)J(E-AqC{OgTF+ zw3HkBce->F7o@D#2uP9#tPAR@);i-)JzTCrt{5ie4KC@`<=H!Qn6e{h1ryBkCuKYG z-!#V{H=iN|GY&%iEy5@|Wl7g=H3?Lh2K}SrB*Q6SDZD3OxbgfHk zzV}49g~`{+QPnqjRzihVla5{zl_p8jT51O-ZeE1rLih|k2Cp#9`EXBhJ!R)zsz1ERc&C=; z?_hsQqrX)IUTX^KiMaL{`sTXBvzF(s>de0*dPe_g=D#3@1;XS}Pkmc~0|Fn5=DQ{j zsGi2!5Slxs+qY)8$zKzjvsEfF#SxHWEl6RTd^Rfmw%UVi+R*k|05%)uBcvQK3*B{%l8#7@kBqwLl3H;=ruQ1w zmB`i+80&2*<`vTZ3G`R+>kbPh3I58BVqf#9|NB{@zi-3zU-yuIX2ePb895+E1aDAd zROf?TU%yCLQ`y}i5u|VoIEPa>V9Jxrgr@RKy}NDrZ81zO=@!F0UMH?Z_Pfmvo8NqV z-(jX@?6L_^TSx#UOrv*+9vP=9xn2MbKaage50zO)71dWw**#*v2$3}Sp(Ilha|y{5 z7t;DVsuHq;4g-m%&1XfMB$d|0rK(BCN7Xstr9^e3DHjg>ha+PD$qnwC!LvF$NIDS3 zI-G*>FB~f}Z6%!Xn5SvedUMY2FP1TfV-HdIUKUVAT zM=DMlKk$mK2S>cMpIRR|`aw=7JxBCxAnXH6~ zuaX2|Xhv+uWy5#UnE{dObUy%_EqpOhb5 z2mAO82eDi}A50TKMeRgF+m@g@LJD$jX_-*M7)KeU8dL|#=FScxP012(N7pB;m;G$RwJl9d&c*14~r> z)=wA4nTZ_8EAM+d?*|BV!$FBd!97Q0H!j`BfD z^2)j;0G;Y*zwZEFr8LU5VO6=dY1=f_UGBKU6mex^gfZisfllJo@Zk9bXl~?s_etAe zDv&6?H!@2XtF^yxhuqYBYkD_q3+48Uukn$Z1SV6tcAEF_lsqy{4_Jd782EIkjP4;p zC0NLKDwkK9`}_{$T|uAL_!@3D)0LB3s{7&&?;$mA*J#Jqj^+3gw^w(Hc>bMxWO4=I zKpktxE-5Uso2#L&)@$Tvn+=7D(U$;Cuje1PX67G{qOtQ z{?{b&Kga(5`KcBv>R4j^r7JcVy(Tj!T5ioZlA(E=5V{Jkl=~A5DuIUu!X1aa-elB7 z&BRpbU5%0i0(KvKUo3f3L&PFSn!CpFXub1jywmk^uQ~_*8(hs%UYI5%wcEvZbR-WO zt`+C9iF#*>Ca6&<<|?l}D?%3p$deK8J-9tqc+I|T%}L=8PS~F>1cYAJ`XvOTar#JaqmHJLU%Tg+HHdzOTf*z z216>9!E?=iAus2?p%)t2hWyB|JSu(Yte4~jDPcxr1o5d-qLztqz*isDkdLaZQQ_F*&aq67=1I&v@eylfEFA*$hXL4nn6{O3-vG7R30|aj3M7(nba?Rly_r8xYqh$ks z@eL?de>GCGD2CH$UTq9|T6+60nW>2AG>6FLs0!EEH}^ZVR!Asz#|y(pTk5&{B75cu zCU4MNWr|xBG`*~{Pq4p&1}AsEUcuL40Q^h2`tL!5<8PO%iU1>92V*5C2Y`X~e_UhK z+})JbP(M3YHjNL1<7(gt0jOk&-QNI^Qc4m82r_d8dK@7M^OmRxHVG zT~;G9S~qRDv76^!o*$ijwCF5NC#*c```T3l$&;5D3ITe%@lye=78^+@3R z3}bzz!F`pyE;r_wN5)2vKU^nAkCaxTLXz{B3c_OLk!{Bctt>HA#dC|>+WY$pjlQYU z^uuufq!awrS)4C~Ru6T^a=*IxN1JZOGg+rCZDM)RKuc%?qrXT=bp2##Rncv2WrK&s{^8EV1%{)t0vhe;Fo#%lUJGyVTx@&784}cHT&8%HM^$nRh1p zP*y~0QM$mD%z^U7h27gF)p*kEqJ4#_zSX#AfbVNOc$HC|eZ42|nq_W95z*$XX&g2s zO;S?=_H{5oD=Exql1afRfEPwsD4f@=%D`iD6t~VH<~ENQ*PswCJYloM4xDs?o#Z^I zrJ*?^dtns=4^TBNG7`%;& z2%2uCuqvBmg+p|_f9HG6komxp{sSgoO2eE5--W< z=<|jOGe4joG2B=evCZOg5wT&c`oUmTKAZP2&3egzGiI!|S=}oAS=BA|acvmnW3g92 z#B@-!JZ4V}lI`A?)i=^L*d9|T2W^*bNP+bR>$$oNx64}wx|gmq{lDb*jAjbLS5kDR zKFpzy*0y0sc9A=wLqKdYI3wKKXmiU_PN+&~s8?9|Q%o&-pR@n9s}~hTGL{8bez! z>%q;Z&+Y!Y49w)wagksjguNe>hM&Qy!FyZzj|TQ=H)yKYC&ER{U5(!OukcFF^FC_^ z#RYzn1vwYufO9Uk-^XFR1?jLh11)Ws)Lx!aYq^C|Ztanoy^krD;#jV8FzVo*NQP4= z=&i%lmgP_4-p!?hY-X3U$xBVm?ldA!3$(IQ?T#9Ws0R%K2U}#S&>8nIkDc+PiuKPJ zS4<&WCr8mDm0wKco!Ow2*dxipP>_We)hyfnr=iBppNV3trbjC5(H7N#(*RY`hOHFY zg7qaWam3cv5^AY_#z|Tg@hoi7SJf6S3GEg;frtV>JZqPy$cWNPc3Z9aHWI?lrEwQ# zms-TzGWQ_b;Dc1?7{~5b%oi+-%GtinWT09HFL=7uKB+1hUK6M)EnHk*{}EC;bM0?? zj$zJ7xEBNJ>oCkBX^2hr!CEmfMmEEVc}cT4U2G2+3FtzO&dervjpy+bQeI(}$#lYPX2 zYG64qAIl;jE_!}GcmgkU@q{SloUwKlk33P!d3O|~6Ckrmkgn%AJV17c$gL`L4C}Xu zCl!i@)I(q&kz)b^=gBr+@4=uJUB&T<59$r6i!%XH|U!hIo5nZMlf zuJf@Dl1OfgxU@mtQAZnzY{6aHmf7P)Ir;)FQ1M@?!E~gjIf&bZ{U=?9p??{i8}hI= zdf*aM61mPw@0OodE-vpHRk=3vtUr0 z>Khoz@Q>j@Yp^?KzK7~U8RzjCvJY#e2&$VZ3jwgR2RC397K~B$U9`M~JfvnKf%;SV z!R-tfy@UonMcTb#@;J-!yZ%|uW>p=isv8ln#`lthbH@klZfBp08>xs}ehxnknyMcp z1o*`WVb4>-9B#xunoQhC$9*`e1MAG7iD(R3JxsUtalJHoR8WxQ@T#HEPm! zkn7pFBT#x*Pt!@ud)BQ)ikZgbEQTtm$VAZ9e0C=VA|@eVn4R$-xr;0=3J}3_N-{Yf z5Ge=CD7*N^6D#bjGUV3Y5Puu3DUT#b=3;i29|v}uD~r9sO`V5rH9AFC4HLDo=jpjX z68n$!Xr0LDG`-gPogmJ5zpD=ihT$EHu^26ybHi7_{}6Ql zlKr)y(qQ==xH+ATb-GMOd=4KRDQaDnpLIAxvxVwq)qrRn<+dEI^X0# zhuKX8>#aV{VaEfx;flp)>%G93w8RrRyNYECD}?^!-}>8_!r641VcSM^p;JBVRX*@_ zB`{|89UkRGLvOl1`;uJ+mCgtO4iP|D#0V3*;60;dhF>f}oIW+DSwMPkaAFRkX{nX@ ztas%l&*(dmTyK0+697^d)ydMkqF{sh)D7WzjW8v5eP*DmG$i4i;8ZOBLILX*#Xe}> zG&Z!NnN2~VBU!a}Ll(mfMP0UswQGRdndZ4#L&c>i?@Q`Rg3+V4UyeLXo(5_f!DTi* zfGc=6EJwv|=1}UP>}WFcVBj9fTwQ`05jdCGIx(m<$N{HAeGm+%9?(p&6}r!!0^J$y zCCJLj_O0uX4phsKb@O}0t>F^&G(FM|QsizL(ftTj#I^*6trJUz9o%?gVezk@mH8l zo32`%9g)UIv~V57a+Rad)24$=Hg8!BnjBYu|9Q!SOJ9IqGn)}C2_}V^5%t+0aVI0# zl2)2k9OR*@7<41*W?-?PJJJuTS>lG@D&InY$kRBtNc$MyMaptyfJObTUnjdEc1 z2Y?nkMj-pV9Ph02K)gQbPi$To-N7L>epO{SR0FM^PzKV&1P8TYV2Ab^UZ=9l;2i}s zS_6pe!zfp83fQ`jGOlUTElwM){gLU0{PTtk=Dv9S52-Qc2jtKnUzdg3ulK*YuOKA+zfl+OI2VSC08JNfmh#)_PZH1l2<2Z{_2)O0mUqeSP` zu}2A8f^6K>cB_w5rWjlk`zDAU}ZHk@qQx}-E*TS$AKKr4?nJ*XZ!`oi4LGh zHzt$j9c8FUous(mt3ucS<@M(`FR&7>-woTTS=F@9sLgpDsKw=U2EpJ|;Pk(afXq1_ zBB#aX%&$T9VJmlY7NITnkpF@IFtAdyf9=fW|8aNz{wE|N^barL|M3aMcglWg_yosh zH2HrheTcE?cT+_Xq(Brwg{bOK53yF3_kY2!d9edQ{oTOV@(|n%#(>saSFg+3>i38D z8%X`2L^L3r5DqAN>1pI@4WibDyYXRVgg8h6_F1ZC=@m>VD8v>vMdw>o<|W-q#0FHU z0mDh?ddleUU*st&^DD@JyGTp{-dX6>HGC=3>@{wqnU>^cq8FFse`jy_@AdyPDDb!=G?=HsPD3;y1yTt^wad}MjoYrgg+^Y;kJC9JuMWM;?5mFBCp*Gy*LkB4(kKN2g{>b*tI z^}&`1?iT7TGUb9eRfbZ1$>0Djs@XDOUQYMTzvf}NVXn{^6x5)On{=^>pKZYi1g zkokslx0r*sCXL3Yhs1N!I@Nip>upAC(tYS`OET38$W?S!dU{Rog}dVsHCFr+c9p%j zmzV)lT>fzM=sZ3-Q7vlwMMI!{@Zs0l^-Tk~@y@tC_>oQ!?ddz1Dtg6Hhwk|VIKqO80%@djZUd?JSW@L?_1K2r!_LK)fy{ew^;aB(^bhgW&~_kq)Iy?*uy) z@7x~n0hUKGCn>bWNOae=P1Wd!^#l9oGfCRzk#jEDRhebQE z_mmW7&oEL@5m+g;c?PJKP<%@@aAm8)V<%tpQ_HGmdmtnxR%4WRw^ju4rPd76!BxG` zA4@c~t;QUHW~wZ&+#SNM`Rinmhej}9QdqK4EDk*L5`88ALIY@On8fPYn1*tp=53q{ zV9&wB>^MprW|Ge*_a6r^t7B}L5nbx5yJQbD1A8%JwArJU9gUR&(V9B}nhlpXWH~Tu zNWc?SkA=%fuj>LVImh=l1VxJ*-)N-AKdq%WaK;2A+E>poY`*l_92cRSt+s=frBT3D?Qv6& zJ%v72yZ1RIjrb>=JeWKN!Qi`nAXDh)FyMo*Hem*Te7D_!;^nqOT@sIsTERG>Bw4$_ zd++o%xMpu)gt;OXv{mqkWV@WcI9bn5V6hF1qHGWze=(HeTM)0aNs|K)<3yq|Ix!y-BQ94 zLHIbdF_<_E@(T(>l8zef5m=1uC;5TY8VIs4C`%U%%5!l6=ZgF^v@ofA|AFFtJAsaW zF9KC6nOyy$kizSj8dz6R1BUNXRBZX@%+|xB?P=<_k1yn}u=HR?6q$9Vo3wCHXs`&h zx)$qQN9ZC=W4ob#9cZ*moqnQ}`I?H5S28?x4Anz;S}%W8WKv`Rayd-k7!k?{aEO(U zNoWs+7@jFcRal&DV<1;-4ySVtOMddO^BXQXn#G0^mV}acNN@!9yv`c09WHkSwhOOC zsLhbG@vh@qG-JtdDsuDXpTLE@TpqL*Lv+3*%3v{>lcgD_ zM2;9ks3F{@?Fp;mtFfFiy%&ZI>)dMzp*H*BHG~(ZCatR4XSA4TbIWYU))E=&sa}X4 z>soVI1Fwjkh4qL$Guuq@kE&}=YK;|E_{{5axSKx02TMfeE{;0>6&cIJJ5pAM@;!+- zP1i{~s%=X;F#%jzeOj)@%ql3J+7t-IS3hrC)BDtxWiOtcpyYQ?md?2i`g}BfCpUt6 zWTWq(3f!7RH00h*hifv)I^}NL_QfvQ0W%h54Mn4#*N2CcFzxPnxC^r!r$jm0qqAob z1%eaBm8kQq%0mV%8C#ynM58PE?FR~tMhthah0(BuSmq^a(xXbz{ljOHpVyfxp%EEz z3pVJ}-VX3f*KmzS76$VfuzyPSr%!bftkN+jfa^o`e<#HCfJ6ssaz;IwjXSe%drQxb z+o38oNMU}8zk-?3;S$$-M$vc=UJ`=AF}lGd7Bs`z8_fJD^^G>K+F-<>TAh z{I0#XtZ!wfZzs-iMJnl{Qj}1x=b_5|M^!`~e!Bw~sBHRq{MKjA;0+@8NP^b!d1_W|$J>aJa! zuesIEN>`%y%J97r@w^bYtY}MZcrls}2$=61eYhY(O7Lk*L!7+G9Z&RC8QxiB5%T!9 z{mFR+6h5Uh9Ln@Wq*kbuNU8*79fdg4PEu5*SAvjMsV=Rkx5!WzdzWrTCL2gV2EnaL zBrM}e@EEETkejsd-c$jc9(OOdKj8mbFO%0!<>9aOg8G;B`u}z2{zaQq!rJaXv|;~J zJf8pYrFg8{S}%SegE(*pdj+K^pZ6V7kB*U%P!fdx#;CeNeb!Q^oQUxzkiQ!r zkhwxV`~XFG6gp{RdgOkXmNxP6ad(IAhgzY^2vi=xgtkmm=RRr@9<4LzfJqJDL1r*K zaUp)$gnaCc>CUPIJ{qoVoKqTloNS#_1KKMFUz6Q;Do9YEsp&d!S*^P8alqw{dc1I1 zhFv#W3QwlDX6NEl&aHfF8CnP>9aLC)GXAA`e-!NBJw}~iEtU(lF)imejxu&EE^7KE z^TfH?2wzYx?p95=1^IZ99g9#1OMg9I)IIbE0D#xi%_o&N3-MIcw;F@qU$ZHu&DSZu zkV-*mi`jA@iv2`374Uv6Da2MAZ#^55+4yaOLGdEed4lstd3m`@ncLejtDK!K=X{=$ zgmoPj=wrxDCeQj&&h26}Dv+6N?|a+BpExTX93{04S8EQDQC3L>{7IdnkvWq`J@Pg` zZv&-=9tv5_4aoL*YCTV$>$D0)I>yOvkZkOh7)D^S3~UT``2kj7FwxTMooWb`G*z-| zLk>QFug)34=*?tA2xWQU7?oM>B%@r9LZW*MGU{YO%iu0ZX(WpXmxwoa&7%r@gcJ^e z7@2ID9!(B`8BHF6lZ-(*M;rji4Jw6J@U0HG>v%t{;cuxo_LGK1Ba$tcU#=C>$GDbb zGaqaw$e?VMUaAdU`OgnD3KHDKthqDL;t(gD1)fl7g4zy_tm6V0RNv6_unzGzpu>u z-{k)P*{RP`)3HNdLj9=foYk~k(X|>2`H6BXL>=kZ-LD^-gBArTizAHSOiVy{2B;NT z)U4O!@&opf3ab>m8tW#%+}^61oz z6kr2zI?HHvD^yvm%B1P6ijKKW;AV8h7~z%UU3%V_1R5jw$G7rZlNa#0=TEHb^&l zXKpbk%d^R{^L=(1sK4$hR(8sjgS+f^PB#5J`6XfR*W)tc^(qE9=9T1kJw ztPMev?L>g6*>~Jd9ONC)Y1m-AI8GE1;c=Mem21MgSglD+lU@B>%o`F@zJVhJ5UYPu zD4BvHt(2R(O({DoExA0v#5?yjd{0Y0M|nLDPqP9vCeYU9QixuUr(5dOQ7z(B!cOu3 zO6cr0adO1+qO6j4M$;K0IVKpJX}cI_qsfpfIYm1g7qVEFVfC5OEV7!wPUhs=QJ)(p zrW4~KRV6{CH5B22q()6p-xil*=t6cSo@<1e;_~deblX$zzR0e=i>6Tg1p6@F089J9 z%Za$=rmv)TMPN^dDz{YHn5X0@bEciPrcJil0_VUAD%-UFn1@RfZLsggl{A>>MipIL zD>u+?{svM!`%Jl+KhK_3<``nSTx>n|fN|r6wKeEEJA8YO6=B{HpopdB-ZnT_PJzgu zF8W)({sKZkxg%!~{8@h6Y!1QsVH<-#?_)N=)q5cw-WwWuP|KlmtLeq>?4|z**PKhs zzDYssrae?f{-yVv*1`km1QEG4bNR9QO_^GT{9K>B>G#%k)GY`v{%(SKZv=|md1u2s6Zpn#jobDDe(p^%& zG?Ok9-U0&BGH#D#h`Pk*ev~uFlw?KVM|#~gcZsV|K|%EzHfIJ>wl#`a;g$33t!uu= zDRkw0RV=z>1fMDe={<3&WryLuyx z#0*|yU~6RiDO2KX>)a!bWQJ>;cmo#-y#mRL3ugPzn=oIoV_zKd;fQy=A|`tx=A^uL z>f>h&ou_!JlNS{;-zc>^6qOy%2-5mMrtcNfNE5sB7;T}G9IUz|7SjAdSYDVIXYQG{LCG;jIwTdT_yNfSNwE(= z7a053B$dlljQ2N-p7-9P0}l|&L_xcDdJzX_Kv1!xsV{L}It5{zRZ3(if`v;>wmGOMb7 zWeAU=kD%VKPdGoZgF7QlrP9%&Eq03(CF6EoWU0yhF9nH+BE*Tk!Q!81!ZOmu_+^8TgY*)p_<&Bk0rh(sH<5N#Hx1L#rd~V`dLL392zW@+*-thSiT?R*C<9oF#()>v`~lBEppK zNgXP{Np#?elLj3GP}Stf1sneW)yqlnkU0f-NrUQb5kGV)ZjnDo2a{wm3lNuJ4yI^3j2dUL-~@4eu%*ARL3h`ttGew>-F9uy2y2xvO@ljjpFe=t z$|ARdShidSw>!LmvERw@x1(&h6fSn{@oZ2w!}7i7uY4WW8$I5!{)Fi#UFC3Jm+tb{ z^re57I)8`h|2%8sKQ3N#J2PVk5q(1^TZjL_>lMnnigRM{pONK4hHcuy0Q4Ir!H0kX zz((DI0mh#h;bf}ysLEU>y-h;3p^3nfZ|ILMy4|GS_GN1nm+w4d-T`H&sb@ug^;rOG zrKuOG=O6DL9v&P%pRdP^Kh>>D&;|MXQK-Vq#k;*xFy2b_)XVWg%!T{E<3d_1cc=N~ zK}tVm^tSlLg;7C5j!@8mtIN|987cQ0l+!s0PN?~yiOFc8}& zGa9j4C-bh`GBHRBX%=liOXqK&w=Vb^ zgXZ?ajPkmnc!(SUi=^_hK4xB}A|;%udahNasT@6njY6mGJ2LJ~vj|dVBg*r!v$*!g z9R|HgH))kgV|OdhAha6@UqDL^5}Tm!R5Dd_Hy$x@Z^AxmK$nXwuhpk>fg`nA>__$& zn&)iMs|y{{s+_bVXEYYvq~Oh+Hxhit3O6epw%TXW^xK?9nYN!LY_kaWo9cxp*9Q)M~UW$<> zGrj$TjE@E5qR>S;L)qWA74v|ORxZoz?)xPJatF+Oo+uJ};r&c*AN7yb*j8x|GhcpI zwL)GB2lAopqMh?*(MDAFUlN*1F}~LYZBwm_$QY;Y^LSrc0UPo>sitvi4V7SN!wyLUw~1*n{7Q4I_tjN#dM>uR`yj2>AgxRG(H%Gq*Z zP+*66qTWe#Qp)W&Qg3EPqVN~a5MBNrAX9VjQhUtVc*W*vOFa7%ZgO@7&;SQ*3LGOB zht5X(m#P%Eln_2$#mqWQ^gi zho!JqiWt{Yj6&Wd0PZ)GOX}75LkZc(o*0Gf5yvHq!^UIdv#(VB7$5`H3nfr1@+y}* zDyyR~fFZ`1x9h_`bPzmC*dnx+QRkL68hpe-c zowL(lw2}&|HnV*2+*q9UG$iJ6ELtlw$Y$a=#iKxI_MT*D2;>AgBKx_rQKw8IGAzFr z`FQksNP0z3)0?u0 zmEz4LK}Y%4yI?>okX$hk!CIk3CNZ!ggj_g7bON>PlEG*P*1(`kf*y5%9beammOMbf;WRCo~}%1N{h%0&QCK@vY~124+Gb9T+<)PC4u18V!h!3f``Q!Z-Z_XmY$cLn@|rk7SmOTqsrp zoN3@|5VZhUL9qXGBqf9a6(FzxU_FV8WhMT`HiUSY{gkopW#k0>MT)HqIO#}R-fyAF zi6TWYlQD2&*ROP9n*bjs8T_=avHVPh#D#ifxRha;xNbk%S`xrJU~h~?)+vTBZHPE; z!h~G5VpNS7%Vi|!!#{K!hnYAgNii}e4X*?e=u~16dr{iyQ>pAjdOSsS^?UuePjLn1 zMB<<1lKME#82eYb=>Nsv|KD$||BAa8QdIm;?!Hh#TC$f9-h0*7vcBQRX}@8a-qkKa zm;#lbnotPxU4!~!OB|DNJovLL?wyhxeA`QYpEzdeok4%sMS5oDqX|PTUN)`mw}xsB zAy_DPs)HIOAr6M*TQ&V5oZ`wGIEPZ}3gI&n{Pcs@4aA-YHh zfek__VOOk6G47}sNqTpE_?Q?%OHh=S$(*odA(M229j7WW-TPQ~O!?9`vV1x!Lz<|x zf7xs}J7m%Wz9=!n|EFmCpHs2_F^!7f%GCBN{mtxui?`>NzYZj1&@D#kG;hn6p!S49 zYB@!hl_|uy9F@owG8zQeSVO6uk($`u?>A~%`1ajjjsFmzGx7`xtz5AMFVW7)v8AlH zuM8hB1nb#!=zcR^@v3+wBxK$nixv=w!G1T+lQ>{OSWYme2L13P{54TJ@q+kd{`ytV z9o{qSiHR8e!vp-ai&M_SDLH-wQ2okc&Z)||;hBhjh>`xcBI4ylh~Wi!Ar|pb1Zb^B zJtZDNr_FK8cBL^?3B6G(FR|DM^E1d$IabALeLvEjnYxJ6>WIiFDaSht+4)Q83Ko=6 z6QT%8>8c=oRO){|-^*yiqS50A9j@vqD7n%Y_A0N|`*W|=bWHcBmwMt+@%Ja4YYfKA zZ{Em8cKAy)@23XMGJ9!ipzL-};X;)*jLC1#jYSvbx_|JUdLk`mqz$myQH|gI$_A8$ z%BXQMl1|qh%iV@8Ph-6D;zW;fxdwN#-AP~2)NCk!qpWi_@nUhfi^zgndH!q$PBbDM z=U3)D&Q>?!D`OJ8kuR4E++hljrpM>yl;|NpV9L;+=wUzL($b^pAwFPl8smbarK9bU z92>oYbOh;?982D&98>+nAF_=#R(2(Q!2E=IYyAX!tL>KQ4zyv^0k&!SMc# zc*%y*zs{S0znnM!|G|U*F-K0p*xuRL@qbH#)reI=KKoO zg^{%&C(s)9?R5c1$xf{sK~S)C?8uTjP(C@lc?6@a3_$QS`)#!+Vpa;vx@`PI$P1y3 zj$>PpSURoUfUI+Y(Rzcfj#JftJm?|@|EMqwT_miebwxGgOPO%YO2y@9m>*1ftNl#z6Besya;h0kP?Q@hAU7@BvNe1a)@pp zQe5|zYl~pU6o90Ya&$z9mXOxn%lA|_F`j}=(UI4?h5Sps>09EqBPWQjls4R0+pjn` zPrh^Ikux@+tO`9Nm@eU@pynY&cjQY%58>Y9`g(;sn2kl=-cg!mC!k*C-gQ0>n1_a+ z@1Nbln%%Nms;8`f6i9F|3?*e%e?WikVAP*j@Y{k%vRtCav6a;N1U6ewlTeC{KLy@v*j za&KJMyzlx=v&iiYSHh}xx+J!54cL7-@=RzD_Y6*xTVJ(dvVbWSbZIq@p{L_OmxpIulHCZ;$qrym( z7-pIx9a*s%<|pv`l`CO!ESq|2`^c2ql{KoOt+R+1gfBT z_k--+M@?5|#VnQMCI&3DjJZ2GHqUZ`d7xBU7!g2do)h>)k&S#jQ#Bi?iaOAwld9i%QT{vlY7Aggjxe^R={=C zU7Tp#qR2rVrZf`uh#}%#&k*3whEE$q$%L~Nxkh3XC6jGl7cr|b(hZ3ZWa`8YZCXFq zTr=mmlK2@Ws?m&pgBLrALt(Y1)l~&I*izdE5ax2!EU7m8azW-&?xWz_(Wj;_i3WzO zOfQHWwQ6+w#!~#8PP!E4qpvwjfB3HkWr-e~67|=HB>T&G^moD4KgT~`V;a9e`d_GW zwNp(bRm{&wA}K`B$da58@D>ZfY9Z?qwKgSq%2l&sex{iPoFIfeK@uqvvi8lY)^@9N zm&Fa&)gNZON~;vs$F-|JRt}eWOJz47$LOFToPf9{+YZOrFQ3~VU1gp&t9U=Kx^%o~ z^5K00O2Ak2g=4yuQcU{6trFZ=#`hrO%k;;#YB0AB&!sd{t@M9K4y%xiORc2T(JfQ$ zUW2pfNemz%F#V1py+$_V9-I8g;-<8I&9d^_7Tl29w5;(Za3E)&no-=1QFMht>kfvS<%9<-r^|L0i&QHN+2=o4k2Syo* zJa*?aMH)$q)$yP$?%zR~#U!L=iYL;kR}He=1FxE77k`o#UY}yt#5-jqg-X()Iv9Hs zU(ccw|H;G$>hUU2BSmg{if93MaKrvecMOkrjB{*_mjr*rIA~_7O_97Pn@A$+Y$=Ar zY(|{Kz&wwxQi0vs8V=w|pqgMOn-~^f#l0?mOn5!dF*loZpFCBIm?NBJ7<1HQ!&%nb z(jOIX_kBZ$cqhkrrN{*HLjJb}PA|1v>Kal=W3(MK7yG-aHTUFMU308Z=pN-VJE6M( zwan6)CSaHa%GejnF(O=MCsnTuQ2{GDA@wk^^ddj1U^+wGD)*bQp|C8z59_$I^cW-^ z!1yhZPQBu$+`fJyX2E@SLOWylXra!=9k!)PBRcst7)M7}3%bGQz9UOjrkKZ0N`UUd zNTjK$dVy)OUI+qs2WV_VV?aS&*w-xxqc8$amQwx2oVzM|w$%bk6Y%l(WHh$d;5n zyHJLFivmUB-mAi(2w9Xjq|ZEuDog`=$ZCOXc`pi{`8Io*o{mJHfa2e%Q#1L=#ZSaU zs!!CZaOi<1-_My1L=shRO>{MJu$!0V_p;=}HAleJBbD@=Qx`BJCVSsm zVy>lH`!sFqMece)Rm?bvC{`9uKSn=N3ytYXevX7gS3Qm&v>Xl8SPE zxM}dnE|R(UHh(5d$0mF5U;uiG?^;c1rzkF+ zg?o90e>2y#II+Mh&MfPd^JG>;R!E!fFMa)j99~pAy|Uzy=RhUGgxpG~O;bKgT0V;8 zf(-|c230!@fnA{OxWtEGEjFGTI}k~Vw8>BMXnXPmD&1;pcx%m+eXhpm3TOw9FA$*s z&KgVT8Uuvd(=nQens=4a^-Vl-ri6EgUqB3EmN=u}5P7C@`&Fw~&^NnhIW2A5K@<0C z8S%ynqffB%D| zNKn^%80>aLnOSld!8YqC6W1i;L?Uq% zarMeb4K8sx)To}bzK|Ywgs2uCZXW9aB#UlUxmBbW{joo!ha5kmWA2!)kKfDZn=$on zm3%BMA_TVMy@w_;rCrj^?|aE^5w5%1>`!4nM;o1p)z&pG1nZ_qYgWYR$cd>Tf3awO zndskrSw$UpY=!rXN))tl%(hPom*r)}n<_YH+QN7)DAF-`*1GIrHV7i@K3E6UnUH62 zlEW?xx0ooio=QU5Pevq3G3-$gst1cU+X-G17_^QPZ?l)4L5Fx8Xa%I$iT=ELqTg8C z0_C0smbBFtoONSPJMxy+3f?mMjo)?{^Of{Pe$s~6q(RH6gfL|EPEbKv9*_vhnxVFi zq<8xym#mKFaS70oDdH?;_LOaz*qO4FjuCuNr`d$XP<72Cj6)$D*!}?@n;nqtg}(Up zYQ+D9kALUa|GAGqOy9=H(M;dc_}^Of%s5Hgui;67lh!i@d(#Ex?g^^oa==vR_vQxU&6kR4QUrPXKRZef63F`ojY^t`p6R9lyUgv4(ughf+Jn#KpBZ3V2WsR;?!YA;1iu8!>kx*U_`}9`dx{=oEBa`ZSBj6-kt{0v)SMqBQz$y& zPic0vI~`ZwcXF>h`Utn}`>=ZALs$bF2|8%J2zSzZ8VNR%aGs})+bJaw(bc>^Q0|C@ zE{0bi48R`W;aZ^ez~FjF*I`P6|CKvT|NZkM>#K%1`%4Y+cXh)*hihM0O-PadFLYJn zxxyED5wvM72!t=dFDEbe#-~_3Ku{c_Yuz1NlV^y5y{FouEs;`iz6W%k=!W$o3YvNi z*hV&38;bgaf9lxC)$t(Xu#Mf*<@I*)5$_wM+5%ljTi7ZlsGVqF2|vG%Af&4@GE;HN z`5^b$u)YrLqcYc2&S*+71*#I4!4OwNy317pzV+S$MuI~b&DRJ#7sc`*8)-L7m2v!0 zyTX2I)Abvx=a0c+;MImnI@N8P$aJr8O_Nc}lzNq=Jsg{7UqY!1=N0}@XzWcb$G1X@ z8VlC69!(>3;_q-cl<=43(K8kxxuQxoN-pKvqjw;1+?+=#%FW+@nY8cIkPOW?aE;!N z=WW_+Be=2n5OdfTN&_dj)h4V`(I0&vQ1m|8vt!gXm|n&y5YQukY61bQzi@TGTbFgk z#Q8D&P(lwn27assn1Bzf+!i{q_iatc8}b2rI~$drBKhW8xp{dkA>PY7s){ZQ$mAi|Q$Mw|SY`epPHRYRSqUu1$# z@7BIszExzXnWvG$?w=4nLJxaq%1#Oq+y=*i5**q?X67U$6SBwC=TMpgvL45}!8DRN zOUUm9BFvj}5RAY5sr07uUunbm;tv!4A};#-8O->P<(!I&QjGtOmr=G>MN)&}Cpf9rM#SY)Qp(RI)^AgDH$w&c0T?XXkfldL;G3zM_v<=e;EFTtm*+Va)rO z@llw?)u;jcsx;F)`+Ca^YzE@%Gw?_D$r<8nV4 z2k{5gSr;Dd3US$q<&RelT?)rLsgB&RYX5! zL14&Tx+iWQ3|%m#;l`?sDioN!Fbq5d8bX#TgM>WX4NOFmq#IhR8$?>@nNHMhD%7$X zw0reSg~TJxng<$o5-3 zWrk9fI<#)3ELV~U7kULbDNXZtsZ5-qzsLXll^-_BF_EJ?m=jVLf{$<+!WQ`hX7Ca3 zSZLhEEsbNsP%1bYvk^9go~L9tR;%E)3fJBaySZ#Z#e0n7YrZFh)v;Sdm6H)jk23!& z0uL&Et|4aj$rI-0QA#h@<$z^PQi1i|Z@Hyvsfnu3d157tmmH)0Re@4qm#(BH`4Tl7 zdF}n=i@{M3J9*w<4EU}~&@2rZw{Uof5^UY6k*K @)bV}2m7O>!%?eWM{fT9J8k)dE97M$v!ewZJbU=LY)2hwb4k`44-a@e zS`UJ=(Qls|YcSEQT<`QU948hMJMf!$W*P2K7pe2(hWrg{Fd7F&{u_Ln;C@j-qmmqH znU6v5tI9LqAAA|iEPrt ze%!E&9XI60z5^dor9P-Y0w?0WM6;%#Ji$oe2Gzpo{=J`31DLzeVjkgLwzt36h=r5g zp((xAFQy%{Rrr~iFuO`w>qZE{F*W)lEW|WEBRa@#5lidQJ8u)AH8mA2_1MfRBzrp_ zXNW3`&|ZVqDuY_ONAG?HxQK0yb2FjC))ejmz&^GONagBDPTuaV={+*G(Jy`X=$Z(o zI;k;IPUOG{h~MzWM?qZ%&n9VbiX0bat316=I+$Yz1hO`??wy=^hl;bN%$=9g)ljE@ z0i^s8ny#B3mCxfI2;OGPZlw7!OlimZ@#k=+rIm3!malM@?7y^`|4yp&|Knr%f8@^p zj%fKeL@taQmFf9{N1s68AwS(z+b-tv?fQ#nafk32_u=;>*oj9EnrWSy&CNv8Hm;Zhm0W`gBN_?3y69ZWD=F2215Uu z2}dCN0ogdFT{h9;maHuIg&&J}Y{{mF4C<=imFjMO&1NJgDvum41lPWxG=BrLgVyf?INEsuXYL#sQ;LbU9!m!NFE&MqS^sVVJ zNB;}uy8Q*^{+*Qk=duAIbJMTJ$ltqkU#97=l?5e60RglB(yKngmIgq78A|-TE^wra66;xpZ<1igH~v$3PcvkC4=hM z=&0T<8;sI*GO0T7dpY2e-(=9BrZDeVs4X^el1drcB;3A>o&CNz@u{IHWL z2WOrB?Z&YvrTt@dQw18SAk|^@XO9cDa|3@G4GKv!op`>M>Fw+L?}oPgnIHB4e@ z0aq#+#XEnPsF6EKSitefRi&R#ZJZlFE^2%}UOxOoP|d7UUXJeJm4lC9^23HA;!9X` zm|f6ooJGKrB3-g9JG*NI9=74>F)8cbG9Zk89CH;@8=}+skpR&Pl5BN zTaaByA4iVrx|K;zyXl9I>-CWv=+6)ZAX^q zBUe@m1T^j{fgcNDPWjp9wsC#Y>DX|3&uB7!*WOSZZlVB#F{?QZL6>Q|)Oe@+97pOBeV zkVn%HR1==+?mCZwQg5r6t+wy;p-1j5xDiSv30N=IRPkAZkYgTch@UHx3hO6s zLQE)!lrnkDo4v`#x)y7(nNQcC{$?D58-jbUnEM@izrEh#ycb=Vl-)kJzLPdR*BO_Z zb|`VHp#s~(*C-H-V{UN|@{73uDk@|8IIFp6NkO;C?h>0)GsxS(shqXEUz>9Mgr?S* zX&Q&`f<+Nz+WYV!YI-YfW`x&hj+MK%yVwVVuuDQYG09T6mE`<&ibALgv%40?MtLi$ zX0s95VXY+0MVcrN-_5{^u_RR>9H%>T(nw)ql8DD~I38M?CtgNPxr6+%2J5t_TA;Ex z#^yJx-Us344vL4wXoStXE(|m^kvKzT`ta(CXxofa(u3S{>9qXGFMzfS{~T^6;0>&6 zo-4b)*Y3m+xSwz$Uf^7a*JN%~JN8#Xeeqkp2zUUp!d}SPh6s3I*&$CvPfC5ix=jgq zpm@-(-LC>eX#Hq~y)d|NuA$vncG#~HL#q4^31zw#33R^Eig@AtQRQ!GB5ZGVBzOCs=o>>XF z*G84E^ZsZ3u>hm@1pZZj$bkOm8~6A6upZqL3 ziqmMxeN_RU7&`LobSef_ubJzgzCO{y9`zM3TqglnheKLM#R|& z#kvWjhc+qngcyl{1U<2Jwdkpb1fyS0iE?ZY3lAn*(JhmnF^%TUT6#+HEM?Uokd;G2 zL3zy)b8}j8PYOn~#xZ$uWm5{dL>4Q;?SM%gvLWdbgky=-+!;}aC3VVQU-<}jg)fCce$!+^Mp2_niY!S4 z5)L~JWV%?J6LIMZ@=^r2V~}*OnCv8-Fzin~{q2(A1b>%qM$>&3L$~m9{z~sZMxd_0%vn zcYSV^1JiA#kn*@|oo|EE3-NU+D6EXkV1iw9S2WW4?{4KMe zC}mwq_OZpUOysR4Tathk|4<&Eemibl32{bwB=^j0v^sD@VqD>VCr+FtS_vz{b;KbM zJ!~`=X+J9Si=lyhQnQq=ZnJS8EP(_^)J{Q^7t|@>x?sZahTQiZH3%X*EPtv0;Az5%T?&!vlWK9v&a3{b)C-lFjW9 zCb@KXOd#+M2!?m=n($3c&$Sum*TS37)?F_S6QF1#kX(%7%BI4&Ec2Vx;N&$FOy``v zV)LWwQ+?Ft7BNm||0UC#&LH(0|DZm!+1HG>#%ofX%dJU{55LZnrV7-w6g0Op-{G8u z_Oe}Di|5VjtgadyR3G1>$e*$k)MD`%&IJb5hy@D*k?B+;i4AKTH%u|@i4i7n&0BRI zFiPd8Ad3nhe81jrH8pPs1?5{H+Z4pby|)5Swt6>*C?;d`R$*$TGrvD)qqU71N;34vn>0IBbEHJB zRTeu*e#6u;agW8izTD}l2!G5CQ`gDB9bs?h)HR+YZYOrg>i23ZNa<|e)zsgQBF$CE zw$(3`xa-cW*+z-KD3r(0)M1LdEeYt_*y=7P5QUlD-`;Tt?cf(KC^o`{v!P87i#PM> zovl=J`M3X01yDWkv&e#uobY(<(Y`Cl5Rx5f` z&yP~|RmJnrXc|U=E+~68$XRU(SNM{AR93S<6Q%)YV*MTe^p2RoYdI^qE|}`Z(X6?fMlvnf2xf1!Gy9WnQ8l_`qN6 z3R0iTO<4?eU-kWp22E)jeHB1f8%((_2e$ROVk1b!DQ-z;=6Had%U2)so@yL3UtQMG znM@LV(7s2J_X2~WEsLRk7Auu-;MwWsdkCw;VFh2m` z4&n2kl@JD37_cXIv{0p$>^qVep>j7`&Ex<);hd#gZ45NtaaG3yEM%S*t1SmM8^Z>W z=5-o%oh{pJf_3lfr!dn@IO>?0CY_XA=@O{R%-X}($9`%SliJO{XkJ;v9?GBa2AMF} zkj~OLcxN;`e7UC`aB^97^LVK;9<5r2=FgkDbb*A9ciw8xp2-};@`38AqZdT4uuI7| z{pBAlno7eVuCciVC82)k=xvd*Ji8+*qKMM|7QV|O9aWe+hLbG|g%dB6bjzixDPic# z+Vop8_VPlik<}v!e!+`+eriz8_)rE{CEWD&G(&0|XDR8x>Hhtn1aeYwzsTjUz(sooBSXZLeqi8DuQ2C)z9_KJ0^ zmGUoxj^yufY>IN9?75)Y^$TR-5r^PUWqe9V{@&lvF(fpy@&Y=jqzrCqy+lcedZOLw z@4ahzlr{abQ1wu$tKGkgesBF3;P&orXE>?NVW#$|%;9xY$-260_^^n{)V%d&^yvQB$+dPnXsh`gx*YnZ8(vT(=ZCj7O_)Jlh|HKr3 zFSh=9G>5Q_p@aLM`2Ft%*Nmp+93ML9)}v*^c$NiRmPT}ihPCH*-6@5Huv)D=q7PeDefRDa7DQ!QRYqM5BJL`EZ8cdyJI8MWGqqZ zpFTH>+$}Z`+RifpXj!MSk$Myo4u-Ftuu1z|Ga8`;4lfnm}CLRr7@v)!GVESSGrT_uRsZ&0++seAEzwc z5!>I9U~Xb=x0{RzN#|??@y}vjVYEob)uHT5-e!h4%wwy&bzorG+OBJQtT>HJ)`Q_^ zmQl$|qfx3$Wl>eNwrm~49s5r#p5xaXysp@r#+!~_*_}f+@SUt|2!+o)=O5p^X(`hm zcoK7iMfc-I0daT5-J=^v7H0o+&<4eYE&egx81(-sl>M*f(F^|R;Q1e`z0BwzR{L_6 zf%$Qy8zhgKVOn&=rFa0xTc%Z)u^}UqWgPzx4cH$)@lY6$_{9Wgm7GzO2eU7Meu}Ok zlR;@AT+B(T9hWgKh^`Cwn6;@*lv@1GKo~j9G()n!()P9Nd6%et8D_y-$=cf|u+p4H zJ58{AJ!qMAY@yc;>bg;f8f`^~Jx@EWzWjw6Z#`6(+G7V-^cz8K8Ip<&jo ztYT54s%)>yehcjC4@bkC12t?Yv1LZ;BZ=+C#K-gNDeJd3ziN<4jjIg)?~LXcLffkL zJn&i>VF8wmdqCPI22^o96ni}pj%CftAfLHm+{E;?o*cDozvVAOx=-NGi97>}VmJ)1 zSkA_mu3M*7pel;yLih*k5W{p?Bj}#gcUxMLwMYe5|4mLSfEZ8HZhg>L?fM#Yjp&V901SCG;ke6!uokqD z+Xd(1sR_W<`>e+Vs2SwZYoCY9ObNFqU&I6pmz6eA1(hcj^$t5t56flOR0aJ*Yu)&dHet|i4R;7 zTnHFiTx<^p;yXQXNC0p=JUEZtvQ}K;xXs%7w`+Au9t&^zaug+C-D_b)5Gi9Qr38I-aUb@*WVViq`Ljx$UxwB70I8Ncy|3(uhh{# z0J9~FcEBg!3z4#Aiw>c<-i0ro6QO(}JGWPC-QO;op15b91R2)+Xs^SQo1Y;UKZZu% zLer}p&L_1z$9=0>^&l)+(LQ_fH|)03X^ML~e`na*pIcY9_vUZx@7QX!9sXo(e)TT8 z15kY7M8k8qMv%OrNBbP?=T*!2imaNDb-&_meu~ib%JS3Q>TG%@X6@XW{~Y)78CQ58 z^xZ7z;&@8}drKz%hzj+Y?3cHIw1XtF2H%DcgUTZUWLBbKvIrx}Bgcl_cIpnilOcji zmMj3zOf!fPENIzcpidcWN?n2v7IO^Am7yO4Nf+X9g)vpYsN*#NUgY9(AzEa>F-U-_ zL{sleML&l(%ph0=VGVT(W*a6SXwidGm34_FGKy~uu{WwS;F`?Xg8wyz8j4-S8%q=$ zxW*DY3Urfl>-B>^G#v1Pa&Je;M&@7zS)nr}ji4y>SZhp=#N_u|w7oSdS}jiA5J;;~ zjo_Glw~hQ6qGLao&Mi}L%B3Hy{0{stPGNFYG&>&*MIEtpYE<%XqSN@OoI>mZ9?K&u z^YbE8X3)a#8^yfHRB)9r_|O$>o2?s~=vSavP^13x`P1NNgwT`~>e?FeIx6a|9`@?O z!t*C-zehm8)%@v-nUEud+Plp%S*I+fF!#pj{00^ilou0~HFwKKB}PY1M^LXked#zJ zI_k<>8ocz~&Bd+Nd&ofarL5-Se!t8cQ%a&GE73?`7p3(gmSi-yl^3z-rv$~!$NvIR zP7JM!gJ&@GBcU3;xq%1k8NwY!=)MWOe*h=#5vM0uxSP2#4mV#rD{4|G#O0MM(KhXc1h|xDGG0F^CO4=LcZ^t1qy=B={;CP z5Xy&{qB+| zNP+XIek$vkHA^07SyOSg*TP+zB=Y)Qky54X1s*et2*Sag?nOZA{x~&2UW%3CS!d01 zf!W8@)Jna`l38_m#XKG}fz>PWDc5?Hz&N!&Vb6$$g;2TxjKjD7>I7#I&1I2U4KO1p zNrT&^(zc3elAVDY+<@ixUrKRwiH~EVJUhChI3o4-{ACEC4?dF;p5y!6w}F2Ay@PkE zihWU-ZQ!Xob0LqgkQ3}k(U;s7=Ec4waFthJks}KS%py%mFp)qKLx(VP?!7;3G&3cb zWQ%5F}wl1S9pCsPb;f&mx1Kz$Mal;a>7@;UOKQF5Yr`+*Ip0kuod{ zaB8ruZ{WH%%o&pc1*chbpn5Y)*N43(-mY$>mWQ&as|Y+OYx8!hyDw-oh_v{yvJ?R=oZE*@sej;k$mtQD5ND6ih_EaY5mypf`#r>FJe>O z7^d|oWrJj`R~3f^;ZCs(-|W1NacN~Nshb7~ExDo+IqDVPL5;WZ?m}hNZzKff_g?B3 zF-G9OY&Xg&fmnkoeet6kJhX}Kte8+f?Yx!BwXQi(idV0kb!bx&Ga`ic%$9z_z_S@by5V=&PWeXs9|9!IXT#B{7Z z;8}_gxzVUy(}o2;@+Vw@SO*AbGlFXzkn}07CcP7ZGcvTYrmw%z!!))>DKOWN2*Zw5 zL4;H!9Jgb9umjV%F>w?&#x;4-DZ-_OKS1uYfybx1rWg|7%vczbOhc&~7S@-+dcLow zb2-H4{9s-+rerYB^9Iz0q*}a(GY_9Vf=@6XLAr00uw`51GM_OKl(g$EqNyhI*W~x0 zQF}f0(UOu_i{xgJz+)ntWi|Lq@?opQq(<`~X4M_Lhf{EnQ8Nrvg@pNi>`&mm`MP@F z1@KHx|F*XzfXc;51Qzl`DuZA-?l=uPGEOnZxmbOIY95Abq6a9Mb%ve?$$Wih=)Tw= z1;5YbvVKOs{6v8eZ$EYt|N2*6#<0)T5Y<}DxeL{kYDcDbNz+)cD0K83q#tN}zw)CD zkG$Ae)~5S03_@uruBdRBrFI~C;UU3N0#B}3+VXo_wcaAbADf=Qc^0-mx9~W;0JBf7 zWNCPIcXY1`VRgGZou4p2@_SjYDqueYFP)xnqZAY(`vUlcMNzVZQy8w06AR!ao!#(w zrnWDya%m{&3k<2FrfcHDr?u*KJaCc~q?JOAIiiqE;|Osl@6=dL*@fz9EQBg(lEOK( z%i$@VULqIzspdx4qffPimFleV? zv8#yW?hnOmA8m z>zD0A)n1EW=U9j(sg7*mdsAB5f#;p=uP`W!y63V;Z<0o94Ci#J$?R`YJj6?zD zaX~aqIEy#9=z-Q=qrRB#Z{Ok3t_yz^zdoqJ{PhI3B^^+{n}@E=MTR@m-@AjL%{B7& zp>>uww1^bI)@RtVM2+hj!rih&$>B6j-U4ruY4&5dwMG_AHsqZ{r>~N`4sLE{J>6~M z``&d@kpBjsi?y(HLqyN>az?%JEIWqTkdC2|r~mSX+1#n-AQaA2e|#GrSU2ff9P8j&8cQOf6n!*)DrT?7+aX=6AkbK;mr?j@0L#{sYfF@`u8H z@?{=dI`lAxs_unvI4p)9^2OT)oHj4$lu5U9XL58?1M%d(u;?&zcNp&*Q5&jEEl(ht zM~+q+qJ6Yr21V^OrfR#Br#m3mc{D%zdEPCrv9#Zk#6M-;bkKa@X^(e|H^Nl=@SLwn zuS;n@sB~th;j1|Nbe*n)zN>stY|LC+w22IwFgW`y8WGOQ?9D_jySHv?uI(m`<8Ms& zx9-@sxJ6^6cmUdoqg{r>wM19)#3J;prOC0aC1vAqme;1YA*|>SrdaFT?3*?QYP4F5 z;O;Ju=T^s#e@`K9lNyvfz1xmRy7{*0(~8hIdZbyYK_m+zGb zj1?7vz}%V!`qR-I}%u>B8J= z@ri`G)z*rikQ7~XI3ydW)Vo1Q$hX~K3reY+Z`n9Jpyc56kWA*3tXI7@pTPVC(odxPi0kI;bKPb~;f6~z*q|$ntx6}oyKits+XT>HXXyXlF|w=V zq=Fa!Dn5a#dk`zqlUSZs8x}Y!7Git7n6tj!Ie5sJ)mNDSPizW96hi!iSR%Uow($-j zaOcHyEnVKH#9P^7A9jzk;he-NSaxfn{1t2Zn~_ADzcjgKOL;?9r$VyoKvWD*Q#yBy z9#SK)t-vQ-T>!B$dW7oT-H%J{9pAKRnA9W$^qiVKwIJHDgUSQ3O{vD+)0u$9_m2O? z+B*hm_HEssY1_7K+qNssN*k4|v~BxI+qP|IrERma^PG;`_kI6;yW^gS8?l~G&&RdL zUVDu>=5LN(pc_?rls{|PRpp|>brU6|auv2?pTFnm{fToBrF=xb{{&ul+LZhIbE45S zikOa{h{XwocB!4Gxuz5oOTZ6wf94*tpoyy*Vlv3bA;T|17`}`NmM>88SVJVjr}XS{t+%_Al5!z6mgDU;B^Z9=0x_>>vvEteiUyac=`pG%jC z{K%AL2E;c`76De$7~KMaV-Lb|#ScW;19zhCkR!HTu|Nt`BeWIJ)pVm-yC>YICotEM zZ4g`03tY*)-25A0VeJE@_tBUU{3pq1eZLme2IOs8cio9Q^9at7y3B_`Df_P}SZC3; z>m9AM$ar3b+IzB_^p|X!t{KcmiA2tNHnHAqm(4J_OYD_~{IzX9x)MdU75kcteF%|) zW~`}V{lCsY#cPBIilRp?tQM<(?S^qx=g&8g>U0)tIXSr8->L*%gA#X;@F0FWG9}pO zmvNxv_*($)Vt#1G+~76Ee*2`-m&g0-j7slAtxq+jpXaSl_NAX2txwmbpYN?tgr%P< zy6*ZuOJaBl!f`!zQyTYlu9+ad0zpL*x7oae7O zkKTj=aWg#wp?9yy-gLQNkY8~#iaV;WA0>|;lb*f^2BXJ4JF>4IFn{TD4F>!U?r~o< z1ioPZj2%BaEPlYMh`ply{3~82;{+51f$2wEkcwcH4N5ZwG`fzc^#|H`%vb58Oyl6N zJ+urz&s9ien}K^v+6)ICQVT($6qGXyJlz3-LUqQ0WG~3Y#R#TplSvB3(iaZLlwMuf z`H;}|=;+YhzYsMmcFjdEA)Gx9PC%M*124Rc3rlEulM75~dES94+I)OKZk!7^fy`j# z$W6rQ%GV(tjM_^$RvmJvysYkQM|Ts}jv?fL#)~*QGG7;NzuSculi2#SGEH|l^S zF;bb2D-tTEnlhiqXi|T4I=c~5Aws%2!UeQ8<%Jg=V!)IolbVSDpi+Sa7{H?n_~n4} z*#dMV%AF)ao+J!U7nEEZ#$myHT7-wQ3kTJU(h8K)?`dTlK=B=TCZ}65}tc%W=G9%Jzg9@f>a$7+Yku!L@BVa&zqmvpTJNE@=!zQT=X1U;v_TJVYK1 zq(VcXRW$^i431U;u`NoA%!6T|DApB`aL1-Tbo%+5mPpJhEbdQL=y@>-AboE&V)Zv^ z(I2NNQ36_1TQYN*h4tTsr2u1$uU~A@>tdTx!^|m8G~pPT7YJquk;}l`G1;|ij=gPa zGUZ%J2x+Z^PUn_0_cWBQ!hhkC$E8`>tUcO~xa=t_6;=?qA`@C?5{r}wr}iLvE`JBO zJQC}eBt2-~`w>{9@?Dx*dJ$!6oc$K59(&bQ)Z~}Wb|~kebl#W?NyDHuqDtmOE&eg~ z+T4fK8cp>_0pJE{>B?(+yk%BxE766mra&a(-bNiAbv4CRA6)WEyT zT{bsV6v$GVxGqZ)v0~i3xbLAAOS!8xZ$i+xGgf4le3Hw^KJHaJunr2m;fOcHBsY8K z;iOr1c)l;V@+ zEx-8FsL>}ea&c1{pD8#b>H(>^48*A{rw$RyyME-_U+yZGA&=jDT^bE|y-C{9g|X$t zi3(5RbAZ=S0&;Q_zM*sz8leea%`7CN+77(rhdtyJzg>uVMg(Q}OWM}d&`l%B_WPF7 zCa`n6pPcvFn?db@{0J=pX790uwFdWMuZi!!tQSU4{(a}0#v9% z*O=1|N+V$|l9+VsFx00p#11Z!{i`k`0$Ow7s8p_E%|;D;M1BV5mY*dR{>C=u)E z;$uZw#T)tQM`{>tt1f(G&icv`l;Yi`TZrn9IcPdvs43{Dx)pRd2XpQN>G(=r(IjsK zrMD;eN?u|Ns6}RcW1Dr}67rtqb+a@&r*p z;18K&f*gxJE+B!wh{l%N788#4%?HHVwhCirl_~#JOR(q(;?zFPn?8^Jfk zQx<8brB4UqF)w6T1%#wQgacEfF@K5rgXHhs4meYl8(3bKck*ER;qvY4bYIWkOxyg;W*tEMX7BJt-!z#a)b3Bw!%MyjP|B;ila z2tuotFxtkBA&N@@$K+;B-9mo)>Lp*|>J?vdyLn$m4r|89jYiHvw@XmR+^2Al-@@?v zFsP%$cQVR8zUCJ#@&0M)e zt8aOxiD)N^*zuD1r%2x2B0xMaEmY@ID;ozK#&Q9G0cowEp}3+Lf4Hmx-Lkg4ecf{I zF%WMqM8!g;Pv*{m`!Yq<$Xyw_UG_yX2V3Fg)19uA=tk*)}5f z<>|A$+FrSLC;?H>N)FV(cC4I}=ONV0Vwr>Z2P9EquJ>k~)dxMGY|Lb4y%~I%n$9XB zy+1afU4x2fTGLB@MufMjLLZJY&N z_qs=&Mwb(ay$6LBX@DB?21;D;r=R2&C5u`=@Nlmt2xvRddFb8ktUm0ZqTj42v(Gf# zB4HUxA%Cl!LLO!`RHQN=hY-9%o}KJx{j$a=L%~q!Fw69Y6!C^pozcZ;#~b^HSc~MEcM};t~<=geW8~zE^BZz=%C=(RZo!GExN~G&o0?5`$5=so|3X* zNY)n9UM(W`nL{x7NLAh#sC|Yj3!`hv!9rW5lB2x7 zFXTsrVngDHWoyD7==_EEDI-Yz==rJv3VrML@;k;}s=Gz=kbUq*_Q;2dBRpa9ulJo1 zkh`$c;@3eJ->6e>@*YNjA_+i|0ziqhz&&^)hE;JOnxi5F!w}U$mTt>@88nulUi3;) zLE^up?vXNd2A^UDYqNx4zI24YIL+F$0lp%ANg!HQ$jzx?j^fu4*0aW>OC2Crj8&i9 z#w4ANSuzXqBOlzOdDD$DSWPv5EpA;lKkRs?ZE-(tE&UhkkS6EK%CT!dJidcTEH0@T z^odNctsdK|z5`PA@co{u;zP#Ij4zitwICH^!0U_fHZoQtpCUE^y>Bs_ zeBDaxq<#a>eQwh>leSF4XW3AdFS|kWZdx-5(v9T2_m@Lg#*A9_`KNTUjdU_m@0mV&C++gN zdtc}H;;r6v>J^t>&?F73_Z?v{g@n>4q<*7PlDulq1k$8;AF~RPK$GMb265?cuiX z>eS=NbAMdg?T5bz1C?u0e6nd@1(6;%?l2X6Tm=@Bo;GZ;45=E8?+wj4Q6Ad>xC|15 zy3P&_IUFZ7^7@g+YJO#?S8{Z%Y#Z1UjbKnoGVN~5IQ&g~J+^?VFNguPVDJ}J3kl5+ zX6-h3)nr~Ky*AhpnrFjqCq@O;s}bWvVO=34+p;^TY9-$o0W-{I>e$_(@qG{SzGmDc zg--3$e%>S>kK8*jfdaf(0fQ~o;UKojRQg`1Hhf{k6BIcuaTdvzYlU9g&6St? zI@P=;oRw-&vH}_GrUGLfp&)g>O< zGl_ShAC+$GIV|b^aCLSJG$VI*BptW~tFdfYi_ubMOhkzrmzFs?T9-a6ojSTydm|H< z1yUYZ^H{vhLxE7#aGyo^15Ucsu@9mFm=gNe8UyN@>4o+3FNwVP&7Lc^b6W<0s1l=S z_N0j{6_BI(m6YJG=lCAKPRmsKfmlG-o~%J6H<73*ZhDFTctxFkGnk*#m`k({DYXQ- zKdYTVubeRn!EBT)YkOs(HN4OE?BR#FSRx?bm>a&owiaoD`BgzZfre`t(+{g|jN$p>#I zi}c9<=&Dn^qD!9lOQHWtmt4?>HyjX(8V=^8AHAYgv8Yo}jIvAV3{7>U>ZmvK`Ndmx zLtJ&EoF!Yl7wb@ZAfVolys!=9Swy4Ix!jFOm2?jja#!q&L)>i^JCHsOe7s+K$BgZ0 zOc={LibbI^6H89I^7-#n&nRxXfE6hakc|9)O&V!$c;g#Czo0OaHx2}L4)Q+fx?tDhQCn5#iFwFEu#P8;N~qyTMqA0WESr6;%cfJ3`-a95MmL*2x!p3&w*N#po4$o4+GTmjB~%E zO9$V-|L>MDh5xN^lZBa`nUm2s6Wp0mQc+cnm5rH6$;ipb*38As$yxG${P}-}ovO6p zJ=D}aeS3I&+>fRi;XHw5Nh(7OQBar+9h8L@iBMdb!hRaDU>iClgeO7=EDbH~^i)(7 zz*4EtMxXx)5Dbqf=(u#NsHkuw%(d0Dwst49U1@LXXu4d7@tJAkg!UgS*~mB^d;OYz z_Bqaa{_N(h!S~(;`t8|?-;ehZ9xkC<98sZu3y%l}WdvLOojoG@Z6D%5UkytfwoTL= z;=peQwI{LEBaO~kv4=tKSz)yWh_DBD>?prh8u+78#jEa^N^_+##6bw3M>48?(2Ncv5A;>Q)OV7V;*jcO$!pg)+`uxVE#6c14}W9DLW?qPw#_>C}eN4T^$s zD{d{V?0nkHOXl_NsJ+qZfMK@b9xNxtED{_wOB_G_?yWue)paWSaI;-kTAtBhj^rk{ zyg6&eZs|dzTu;rWWPNqs+rmy;QSwK1Bj19?j+B!nb0&48xy-L6cgU{8$5*?)gyOZB zW*a>>TMkuCx~d9m+9wxtP7BtpLy>BRAM2ay49is$u17NIPIZfV?i#Y5ua#?$tTPiy zEck6s)r&sMJ7iOLG+toI>Qhq&M>#CZf*wdlt~_mS)7AP!TrmX|63^|wcxDzfuTFI2 z(T8c=$Y#FauXfD)m`$XdUS+Hj%szUevQc=40qGaFI#JaVYg&U9;~2ah6R>BvYlr3{ z^!=a-41ZO7c_yc$SX{;unBnzA;>ksMr>(Gd4@LC{&RrFn$EanTRi`*$&3wXa1JvCOO&g5mS$#EG+RRgGR~Jqzjv?#Qq*}7c!C*@J#qzlr{fDQNj_nH==__c?R*aEu`D78@v?XP9m$iO z;Mk4hwk$5^DnpPF;FgS$d&;@ed~4o1y#Q=Ar+9@&bKK)1A-YG+Ol5@RR z?6C=ZYnjMygy^PJGCA5B#s$3wX;pMOy1u$_)b;Pv$8aZ%j(PKHpJx0IeKli~lLJQx4s#g( zwv;BTr37ZqXXpF-B=A0Oi#By>sDgoR26`UJ9@E7_PS`BBV2{vWD&5mUZHEpPsY**zJq3wOAHsMHh5g zmoP2PO{uP(p7RY%<&=W3imp=)Hwf2>i}%S%0y*6KYJ*Jj*V>n(ZC>RmEc!08>GmfY ztoS#z@_R09o-MQWWSo9B^9pH+3EiP_rM?i`zAuUX{bfF(0y&+ibz{ zqltObV3vka5smBc`F8XMPMJzBYeTn=4cB%-bwnPy%R{Ml^$HKYgE5xu*t|sN-G369 zd9F|u6Z0mqG?B-9cmvI`QLf_-0nXnz&5wR)c81@A_F7?kAZ2&r0yOeE zPshaPT zhp-_Ap`a38Hx*s)U&O#j1(}3*()b!r4cUB?da_0|XbF8|6n#OFH^eL5 zQ0rE1*8Yf{+6GPe=)OYjt|$U^kG2sSQzwQw-!kaj08fvMNbR%g1~JyE$m!BaS0)Jd z7pnv>%}=(2Yqw!t&c`&}!7q1>PS{3`35uqEz>vSfdmb1#7RUFhOQ3ffP4+fPa5m%M zI(F4zbK+|5Vwk|%aeCg`?nBtHb_aV!*|x5<5+37v)vAKN`^e>WHT+y_gEApKH+!HV zOa5rLGNPqO-4ol2*oXb~+c!71RF^K&0hm8#E@kCp$a~OoY+q~I722C3c1NU{bG|qt;qebxhCZAjb)Fwwp$L?0kYlonDmvs>3GpTOA=# zV=cbtr{7O|xtepC47j4If7gsuuCtyet2Hw1tUk5-MfG<>X4 zUS3W$3p^uj6gTI4xNlKuKNm%&h zaII$x8K8E6D#fCcQh_+j6LS0bk8$eWJi z&c^ImZKSlXJjj-jm%^2h7NQxIr7?&$H^`=dsw#%MK(=vQN6(UYdB2`gK%p8xcdPgy zAuSIJ=_RSOU?+BqL{S)9^uXW$>L~D+5-PIm=YW82j0Mz*g(EujPgn>CT74q=%aK5` zLdhEx3j+%Bu73M$;EyB&3BlvgIms7hfxe0t!~p5El}wKxDlfG2^D{*_*P}Kcx(udW zFxTTcos@bW26pB?ki_3M%op!Rp?8GA#PN$*cdvc){*C>x%|{0_WNu#Z^+~fG>5E+$h`vfGq>NxI>k!e9B_$Vp3eEth_X{SqlKr zTA4hQk%7{9=qfKSt#eld063D|l>z`*0?C9Yp9K*}A*H9kR8%tofMaQS+l;uJmBoVv zdU1K*`D0Icd0<^*-3YoL!j0IpZ0zZ)Kk4Qd(fTn8rBzkaN}doiGU#$9&NDJdI;DLj zc@_`2Gv7zjDnFmTGALisT)O5D5-EDPg4ohHz(W@(8a(GsH!_j7UlvtuYfAFRj-#*! zNdLZoa86;z{~+&lNX&XUjX(%FDedDxhX{~7qF$EbAxaigK_=&2(lEu~rl|)s>>a8%A0O2O2P7?FkHt1t`67l zY=(0*vEq=D_509?1U1k~mx9%yZE?@4Y`|3|HnSLbBYaZN35Fp4mq+qrrW1}YF>KhV zI2RS{AgzUrSjHh9wsOuDM2r0xw<%F@BhcMkqHw| zhA-d31T)d1llNXGXW8e!H`P_(Br0ocYl3l9O$aGjt55K!%rxhUW-Sj}^|7{z>IE z%e{y%IqYB|${mHh<6UFyNyR*L{w3aRh=wz`ipnrt@Ir}c!h9vDY(hsvi?zGJb9mK9 zk7MF^xTti{|L+xm+m<5LGn__vJidTq0-QzZ#XcPH@D3f#oVYER$BeOuZL{D=FE_*a zGfMlROWj0Hyc)r!y@&cEVHCbzVP+Qdrpb(*^7a?oFN=r$Ac@bRoI7eN_?z=H$(eB`GoL#8_;YBcN7747>GNzMF;qDi9Hnje?edm z`P&}_@ZW?855d_ih!N{bx3Y%qTNvcY*&I)fBOBecTx9V>h0~qWn5K^FhFWFA=^0ht zGOy4G^75hxMvPv=LQ%}|m4j-NyxZk6Iv-{SG`*u`aiY8XLUQ5F**~mZ?4&Wo| zO7hxy4rO00xOUyadla+(0+qiZt;L?wCN6=d-QK||4%B0Bhd5VQE8z4>%Wr>{YHK?u zOtrfeqhJYb0hwR9x-8E?!*NUsA5szmHr!klYjTj%40+m1^om^0{{rDOUTNz*Uob9J zfk8Ob&-1&eTPK6OvU}e#lMa+%DFOr)d_z$WSV=Ag9lJkrbpINBbbi`*w*-E~fy#v3 zurBXdloRqs0X<<+=rhxG8j0PcAP@Y(a_qDqyUk}N=wViwq@+Bl=nk6M^x!wttdJHqV=pifjZUYMP+W1n6l zMkYD^{ve7%X^&qm@iSJ934KT)Yrz_cpL!Fj{viBUd(og>=%su1= z)*&{E5&==4tbZX~(acSUZ`TM9JrW=y5nOf7MBQetaz3Zs8NBZHk5}x00Cfz+VWnYO zKt5rRalJucgcRAr@jtl_;TA{;!aeAO`=i1rQA{VLpmxf_w2_@jjE5_r)N{=;B%@{oHp0hoyFHrXVNlsHdX1jw7oI|^k!+{&gqrLR;Dsj zL@A3kT%x&bE83eJ-GofRLSYAFioko#8MyW7+#GVVo?D$_i3gm>)+tz$8fN%lA~KIQLyrv^>$cH{9y;;NuHtS8;FcmR4~wTSj=9ATsVvqb!XVT;i$cKm9SQ(@)h2Fl39~cip2hQm3vEAYLQ~KG-xP7IGz3t zp}l@LpSJ1o_WFYEWn(bUGZ9Nq#6JnjH)4yfgG1pe-n)fU*q4Jq9i>&BRa#UsmZER( zrcK4#d+p~DH6|~047sX5zdw)mOpe^pSSplLbQV0Ws9AL@Z45wN+fcBXLX2Uum72@MTA%E?{N18ylCeN`UN1b zHf|c=c`Y{9t8`^7hVqRwwk~5Q^xx;s!x^Ff4l^V2A>TFPbwd(z&%n*x$$|RCA+LJU%A{qDI zSz;+Ue;2%)wU}uvjjO~+X9Uiiee#qmRvZ7mwYSzIjhkr_f3thf&fe+P;s;Msz2ei}#iJ3WFf-0+8Xcqf>$iF&1ed)t-3x z=Fy}g;0UxerA5JyfBV)lB}yL&-wOEeO}YPsB#8f~3Xm0(U=jJ{V)jqFx>&hS=3g_z zewY;2=~NlcY+DUMbZO8Hs~`tr7C%q9MblbpaNrW>9!lTrK)xvNna)M(>umb3aoSsK z3#7%)w73I}tism@G{@Q!^1@B2CewNiJ1j;H@ge88V)89gz@zFN6`*w1ro#o79PY=9O54Q zIay-K$wP;ToMa=c76JJ^twtd`8mSVa;pJN{UoeOSudMccqM=3)iivP@Dlo{5WMv;1 z*bmhy+R#sPc~i@w${t$9n?+V)Hi33M*ZAE5T}U>)C3sw(u^H`J&ZA96+4?)P5IPDr z3sW{e|E4_R0Ra&re>X;p{WmJ$KXG&a@g9gt{jU%G;{Sf=hf)2HLti$2LW`CZj+GB! zWE*HZFReQK7uzq82Zohp|K%dqiBB3-yjaeXu-?n<`NF;1c`ebPr{@cZDV!ZzSWJ8n zG6o)XmCab*; zK{ma5%d+BgSm@5Ip;iQ&|I#S#i2p0cRpK84`735qtthcfA-R+aagaI}`r_2P&AV#e z+o^kza8#x8V4`gBp9A2;TwlK3gG@fjn_q`S@4ZMegr%Y7Dr%RV^##Wq@R`TD4jN{0 z%~KJ@x9nSE*S%k5IPO>DCnNG9$xpOO5{z$RlVfR;TEie1W^_i{!?0v#l|(~K8%{4} zS=A^dGR=9`S4%t{zLhL=2H->Uh>GXOe3KIZLk1smIAKml@TE~|`+7*-hRku{z>};2 z`DVQgIK9mD%WP8$@ff$`R=wvOmeobv_EtmCphpe%CwZ%113~)|d6P{M#T)8o8^|7) zSxJG51&uQPd)LMO-~E&Dha?NB+7TR{!u+lvcI?bIPZwX-1^I_nqeGPRI_^4_s`(Yk z-^V@uX809}+}98hmfh^Ja|XyK$0wO;VLr1MZLqn7v*ZQV1uL`w-0bS9-P0~cw39q= zV5>aq0MeC5YGTo4AvaRwSI{-?hbzz+Kb8n4H7`+qMgioWR9EZyI>9hM;uWbF3n-np ze_V`D@D~(*&3<^s;x8~}RK+O#d}{?RVZ&>%`R%+ouHh!sQ7;oR7sCCw5>^Oe%yR*- zh=3^M`j5CG<o(KQtI{yAi zzxDJjGXMW}-2byysq~+|>=cYlOpHu^nyG%*=j{I1nyb=+bkJQw=YO_O)G(O$OVOOy zWUeNfNHMLApKSMsjj_>Yfr2Yot5|Az5bj8D*8~xz0_N>YA|qo{H8zG*paNDU3oN4s zlLAR+N{0r;CNfLo8YoggQBj(H@2CfB#@-)fZ9h(azv{T&biaN-*A(=8;|3bpmo%E} z6M_nS{n!sS?kzPoZr^I=uf^&9|H|Mk)S+=SFk&_87)H$YFki8Bnh zi7~9US^d~@et9)p#XHan>;7JihmAeAW&e}VJ;*^3>JOYzNgh#l*yB^Rd>b?+J=3%; z2H2ZPnU=`xGK!+hFzz1ieqBhnn!BjQA0d`*ZUR{g&+HHnD`!7IO`obfXXEhRtybrV zWZMm+D^mDMkWQx~{< zqs@N%1zwbFU5Ux%sVD@{*wuG@{&wAMb-8nUswr6&BmVr@7*yxW>~5)#5U3O+=GYOY zyp&ckI3RH6uX9KexXysZvCha8oLWc^?Z|u0wgZqKs|oic%D|asVQ@~t);As*4#yZq z#-d(C7Gtd&j*r0&d#+89y}8O|!SN%>Rll+YPO)Ok3x1N~3fTX;l^A|d<4m58GIuWm zyvDsl>~->P60hc}PX55Uo+>tO?Xo9AcUN$AT`cjnYG1Topg7tm>&y7EK4oG?q|9i= z?2y|GeV4yjuCm|Vpdgs7BKw}3y85#KS)PJm(FAeVsBcgde16dVCM=wxYAL)mT(WLt z(8Tk?km6#AxS&s5&36f@14T;cdDFjSftzs5@YC1M7Sn<{Qct%befmgJAoxI z0eKH+%7xv}^Uk;j)}@$?ZAUlQG<6g3kZbq`%3PB*8x*b49=&MxR!qe48IKd4JsqaJ67du-1}^@GkN-Zd^w?9!QyH z)1`-83?uXw`l&mApk+z~95s*1Hf4E8Csz1EP>3 z_kJ%lD<{^U)k4J9a342tEmvOVex^^)d$)$}<%uplh)dpW#dq!R3t+{VM{if9+1vlg zYcRg>J?qG$+%(N__t_LXC2oCEqeaMNj}o456B9H~>#v#RCfd3ouAG4Av4Yn-2uE)Z zL%rvkX$fK(*9TP&^Ita_B~bJMHk-wz>l2Y-t@tgjC5J}WH`X>(qO?JDv@-1pJe+tF zjSc06>bhCA&8m{2K8Zb7^-H(xEqFZcd zrYcun1-mHW3f!-Zo&x{4t0VRGtj6|AZoTN&_z$5PKT-B)jk%i_1!3Prv(QT-&6iLn zVxB&Rn-s6?1Ql95>-x&O%4*BZC$QH5@wBy3{A8b z;i9GEZ#!+D&3fjk2>BWMcGQ%`i053%G1`B^+jKQJta2&2Ycbt#E9W?)6AOxSf;C%L zS4y`=t80$mpfuMA4cN~_yL;-qIqzClb>DP~Hl5357}LW{o{YySmjXKk-$q$~5*QzG zZp-Zwo9jQC_lKtaTFj*88l0?pXKFGb1h~GGvdncD4y1J>vhpB2T>i$#9kOcHr1eIBYXIVCwx44Ir9w}RltT}3> zOJ3C~F+HH69eZ8`xiWFss$AVKUk`7P_`|W`VvzohsJWqYlXzxN;TOL9#7wQ|_8|Wq zhpTU}*P+ivLeHMB35px`!tHNIJOZ|(U86$$SgiA#(z(9Bo_t0wMx!Ug0{d2c);2@1 z!+I~(b)bJZLv9jo(eycdBQ&EqZ%j-C^;rdaaoe9pRpcl@7e)tR?vlwA^&@@7*Q^5M zuVW|~gM^|8yCVUlR=?haf&r;|&iXxG}J@P+o0}z_i+&9_eQ| zfvrnN5a|uln17lqj{86?J57dC4~KF^(|(i|#!}A804eY5Wlj48Y8iJ9t+EjZZTuQ% z?Zmoffxs?7ugvg*OZ8>1QxUMp3T;@W>Gd^1m^PnCA{h{a{1N;zn-<`_N|T`TO1i%h zWZWr*F=LWN@3hdb#c2ex&60BC%a$+ZdBALAXkDPo;7&TMA+~Li#m~`7D0u2@_GSEb zPN}e9X`o!T(A^aC+-MBB*h;KX(GH54^5c};eqqbtPVZN!u*ZxSmQ@45<50r`aeytB z>{ds64@Rm=Ajfz9#f0p5kntqwZ)_&4(~y-s!VjP5zhOPgv@qnZO~@&F0INp~K~}%7 z3m${!inPH}+E(pHneP#l`BT5t8PIJT(r1U;jM+qE)pP1L~Ha)Dpq>mUrIZWnFX|&p$s@_=$ zT_tfkWb1R6)U!B?AM#U`ZH^aCWiY)*R8_l9nym;Vozs_>Ul{1BZ>gVNuR9!%LM|cV z-*g0M!k`?u&g`o*^qW!-yC|2YCOCe~e20Zs)^~0N(+M8y%?x>ZfKaxF;LpFW;WP6W z?_sQL*XRSK*0=QKd+=1*k633FXDy!UO`eg$>wbdPQNt?uZ0S+n=`gZ@!VE6?n0wuH zxj>%Pi7s19oX_pzQOdPUsb~N#``e*$=LI*yKJmmaip^cvX4jYdbsi9n(kjxQ=#8#H zmHo{ze6mfhTEZ1UET+lIN7_qCuglCyM%EB!{_KhKjpoW2I`B#2%i&2w%OElnI$~v& zW=W`($w}lItcPM1(JaPIswq17NoE>R^_xyqwiTK6{q14(^D;^r+L=@pRkYNU)ViWv z5=OX2_5F`Q)G#eb0GdsSG=KxAQG0(^5H?H)^au@~9GAkbqeygrVo*BF45}5nKG~$o z3$RghKO(d%j6KpB`Zh5e)kg-CXT;+4kY?<$T^X9l5Hp(spm|q z)SU=-*~nv&6g2BYXRA%q96}O&f>@Kk8yTp71v{i90&QH>5Z3Kd*MAA0S5M|R`-2` zVtoixu{+ZA`%S+qkFWp6?IBYMzG1@w0g+<7+D8+&oxIsKij90M>Ot)5C}F~Vnyp|ax2mH$1+MV5W79z*JYPATmODSshjDDh z?OLr_F5zuha&01*E>wfpU0-nVMe!N&I$6-dTmWu@50r^Sz06#*Ww%k{<95q$n%Oe? zs{KpvLbOutWR-ScUscLL1<@4fwtkLO(+F?w`ttvzm*c+>pN87Xg(9M5HpL?*y?UEN zs7qdtH!`lNJ!lcX<`A{&p!+ayltzaRrp!7SW`GZod}XBkbKVRYtxtzVK5et*_Q|#B zfiv4S7N_shX*W^7M3fRk)n1MXDad%91!HXlRtPs>Ad~MRi@~rT5iAU+-5OyAyHaax zq=jE&!W~=?jLT(dgia32={O;R-Ga^VHIu`NHyg)y#d+DZZbHKl|FU|+<;3sRBEXiG z?yz7hW;RDuq1(OKU<$2Y!#eqRBCpuu%c+|xEFaxOAdo>MbN723f4E7?3Ea*caTw>S zB#f;?GzN`r8Xtx{_le@06%z2~d6Q&xSOF-Zyee9aX_GvaXutidIt?By_!#6>r)6DQ zzIA~NA$c;wlIM$$rRpp+pN0dp4)1B{D^x{12FRYXQ|JNl%Ew2T%UDdcJowqf1A%6! z`$vAqVWmyJMS4BbMB=ma6~gCPQqK7a9pzqPnrWR$zu$&bn>wl`{_Sw!&;AkX!*SH~ z>6X1znqPuqfl`;^)6y|vL+oiODH^}z4kc5#y<-fO-rzINoC+oFmcrSWNxVxUjv4Zw zT`KYPL1{eFcIZ1nS$$EljUxM9E=##Rhkyrs1i{4U2oBaylv55C^mUkqn)qx^XNs`} z+Y40}HuUoq#IJ)WMIp(2-#KTr8yIpOKz}8X;-6)PQQ?ci`?%(ex!-x@;9-_!pq%pU z)bP(tPbNA8@`-LOvf%Z~GeS@7-LLpZOi$LtRXoFNNtGO9B;wTA=In$0J^!jTJkO&A zIe(K!BmNuW{+}wB{!h(^?*trb|#3?m}sTD_HG|`u;M=mZ}Ad>;t)h#VIH-DBCDwI^I zN|sdlxvZzV>69$QJh)G9^N9ug%pBuB<~{a)_Kv;(?7qG@C+uEDG{o?=GlX!%O^ab1 zy8-}pWSY50UUbuS@H_2mtX(cSW&(@eT@Pp;j9)@r^=2om*X&n71hmS!x#M#E_9Anw zx#*^d<)$ioH+Anh@DmzYarGV$BJZ{|QO3gi$n0G^>O7w`PwGWvNyF=uHhTMmbgRF9%%K zW!Jq`;?G!Q>AL$wl3koHUU>uCF5I1Kz(!F!xDGqvKgwo34XaJtwXkkJSL!!qeP%qG z-qAa#C|toPR9G+HE)<^z(JL(<6kVvlPHXTsP%LNsU!=Wra3t`aFFMJ@wr$(?#I|ia z6HRQ}w(U%8+qRRA`Et(QS8w;!?tOLct?H`&zw6gueRMEZTI|e|tc^a-;dn)7*#<{W zUE4{ywTe{}(=urEa4PNTZN-%n?lx?+sy$a7W7gi`c>3zfZDMBF=1ivbx6;JHi3a(+ z(aDv}bFrs=L93jIp{Tv?RtSuWw_(bb${tdKKh7!0R7lpTC{@C zXKx8LYLd3$NVIwCsEgB@y|$_0(lDaI1@gopoPgPk`{c!0OKYjPOEe=zJiwZpaHnWs zgT^iK*Wsb+uSlu5h#B_X#`RV0=5CY2J&kb`85_~?OEJqy=*Z&)WzU(@{-!Ne?@#x( znKKAke99XU@C=siWVGf3Ei=896jROM{BT^=w zE?LPiYTFj4@r!14zBJ;irn4ce;vX>yhBxjN(3Spvdlr)|kk9A?33T>R$!3?*d#{&QfdFZeK3f>JsnOsS^j8rx0VVGs8GU%|{) z@?%>`T60+q4frq3Mcf$;hpsdUVJ^e-Iy4Ff>|rq6UOxLC$yg>FZ{^s~4mwB18O*1u zkVQw4^A_lRIc~g{z>h~xvh_Z7C^Ai*x5iv1T4*<>ppcmej4k&2t__080JCe~8O6nIr zoqiSR2M}ti*+L47_k8ZbQw$uyixgr}T;$q2F4J)fNK`Z^q$>1^iOO5T>8L$P^%2Z3 zV7SQDJdm{7F7acs9FTe|bFxDC@$6y_lP36i7vlhdg%As)5@mT{F@LGu(O0v`ld z(5jsWcJZ4{^;)DIrLJH@LwqQ|x)hU>DTa+kL*?cKedFJ_B)Xc>iw~=+xP#&~r=8_& zz9`+9eu>cN#cHX!>d4~}< z5Q8QokE%ZlB~wPH$y@kTOU;W9ZX{=gmT%#d50f$Viw{zCIR_Hz?Pm5uuCh80P?D#L zWrh_icUE1cC!!RVj)r){sk)JezKsJ^r-K})1;5G|j?_u3KSLC3k|?b1m1^^g%ouzM zv}?sxY%5_gy-Uyf1C8EbsMO~HyT}3TFDS%lt?6-2u={0UPcF3k7N}%~tZwO;7FO=# z=NQE2Z4E$r`XAeWCPVjs8*^Osv0aG5xH%mnSc^$>|E|TI-UI6<=F-TYr^({Jfp+}c zOFr_J`31^->$VZP7%OQkrJ&@z_`v{G2Jhowv?q06^HOxz*y5#~0XTM~Z$ z<0|Gp*5IC!IT@)sRE|BY>+q+UjX56HfxMbnC6LJhTT|Qv0f~K{eo|ywB(7icbvUB- zBsazs3EOG#;a-7xK7~+Eimv(hOV*TwZmWG>6ctAIvf{&&|_UOi@G<4SnYm%Fn zV)q>g3h5YU9MPIEepG(SV@@wA$aRrSQ;7rSHt}b4 zP$cg)Dl*i{B2;X(q?oq7nv19x=n{~z7K}r~lHm+8iSVwkb`f4pvOUlaez*RMC!-3d zUHPF}G_=GvVqL$1*TNi0G%Tgqc_@k}k?9BwDt<5aFeB|)rovfRVvwZp*6^$`W}s!2 zNoIj43&j(DKLxe817S{ubZjhC@YsU2WuviP8AOtbO+@1NYc)thL0QzEED@8cQlw`1 zv(F?u7Hp5x=-=4pJQggyFvpJ^Vc^F9OwFe!~Qao04Y2 z#~oUS4vZ@Q8`$7k?$$_3B7XuUL1^Sb=|rUFNpn&avNeOU9-5MkNWQf|>+8zN6VNv5wfg2wtMMF!8!D zr2Y!SJ_Xf48V-kq@Y6;AVF2eluGF9-tKtR(bVnLNpX8QA3KR%oixJI|gQ>#W}U*Xm8M3Zz;2AfO+WWy=OhW`V=fJZy{YN zAW$g+s&vmWq?pv2{8S69BnrrtK<(_uj#Yy%9HqLIk}0kWWf|u-A;fe)o>Y><(Z`{- ze+DVWw8T*I(-f8dt;>4}wmBT1$NVYzVu?aytXOmP1^kbZyTgY^_5C|KaSi1^FV_D` zZuk~1{xGsJG@>^$H8P;Lb2Otjv~#gF@-Q-Ra<(?1|7Ylf9lhEAtGjce7q$LnU}IqY zKabr?=d%A~`sh$3s#y9_`4bV%(4{DlFbW2Qv70N#g%UD;I<&)>jOw0UEEVzv#pFYR z6okR=2xCr5tL=iTFn+E$O=XU|b+0-dtv^lc0d4d-;(16v6yUQrrY;$h#b_ipl^*OI z#Pw^#0XS(G)a#yPnQEzo|5B?Ebuw5m-%}x8i2(Jx+vs(o@+8|zc}Qf~SqSs7&vqob zO+$AXClP8@TO+Uan}^JRS?N-+YYOU=qvu~Gl&D8&@7h5ho;sa1#`DsfmM(4NUOBog zqw*-i>c(j1t-Fe5KF4>IZ%Pww#pWp!g(*+qzgZC>d=|?S#fB;0u1#ay*0JCQk2*HJ za_^;EF%BjUi^EhLj_K7}oP{f;BKUdHxE>bY0ZW*p>$!-75UuXRcZ#t}8w*=zSB}b` zVR;Gb1=Kd@Cp#V@%Y9XbT|Mb8aIitO>KpxNj&jn>9M*@6VB@e|YebiVq5kq=j`GPc zxa5}!&(puUim2_)S$ryz67KLNyZLoK+n7CHWT8H~wfm8a2rj%&BPix1yt0Jzd!paD1y+g|0P`OMfIszf<>y?@R zSQ%@eMQq~;MztmI+=9>A-fCrqvAedSekkNv!i(N*#w6(_8-X(|;O=b9baR}sk#5uN54!| zv40im$u3Mp6=Ab25x`WgCFPmtpT|!K5Kz3j38S>nXe7yH%FDGa&JoIlmr%L<+`|bQ zLwi~3ckqgqa_eQpaon8>^Fqm75y1KO>D(GyhR_#j&vGDZ*e^DMys;-GQxkGmw!YIN zoM|^dycDJ8G^Cw1<8T!hIg#DMZDQKHKP)Un1<{+S;Z(AZH_eDp?69I8ynNd`8Ar^7 z8fJ?)tV17{&qEh7F{qAGjWLVxn8#`q9lU(G-sAKdR%aRcdhJb=Dn^Kc*W=KngT!B} zRfD;N;#vY%XP6LjPIY*l3FpN+@~-W@JJsD*R+S)>yep@K`0M5^ZqyqBQ_pvBlMH5y z-lMrfJ{MjbB~67TRZ^80*BvW|ie4G%bee5(h{HXOyluzr4>D#`|9c%R9JGYipb1k} zYt8V7%`bRpc2RuUg5?lVoZDR+#tq>Vctq!Cd$i*~N!8v{*b)WqV5??k{0yWYQhfJD z0=+X|3n=Qw=fpDidcVs~{a_yi(KN;!DH5UMtK{#2bcI%tL<3M#OqosSw3HcB5^05y zmo>MnXwz^TnZ;gTR7$vgFEjV0K!**f%h>Ncj7BGp+-He)XVd%K_o7X>yz5e|C7ydU z4_gyjm?<&C*v(L&?92cXrYa0`6P8v@_F!W=HFioC$$&oHPt>NHzp+tD+Axy3W1X5f zPY#RF=%hX98h%VVLOPJu*R9q4KG9reGu3{{HBeRcbZ|Sl0|%FtJCTA(?d!y(r2~#~ zZizcDK$@`D)H;4+RBAqbkUhoq3ZU}h1~~D(cfg5xNii>On>}t7ao2gY{S`Z9EoxeV zUG{lTzXx4sIwFI)oIj!ds=Kyx<ZkaAWB2w*@{igoa@B z84cW!iroYPl)B%7%>5^DEM61I7sKeXH-M{={zhz*7FJ8%P<`OWm9$FM{37|N;1J_Y zNsM-qOPYg}w54aBe^5*?YUUdj|0@=itPeOqsdw z>7Re)J^5_Lx)dDUm$~~59n~rWXNoE1|Bypc;KUOKGCh$z3(uV1b?_N^5apl(X!T!i z9o`bl0x-phO`(&#aind%{Wcf=pUR)bQ@O#0ZpN*A^TW*O}vIk!_>m5XY2 zn?@{j5C3lc8$4ZXi6hfWv2VU}9bXB&Yf-y*iaSJanXB`AZ?|Y#Oq>E&S69$pljAa8 zwj*7b^rE`WHqjJ+<{?D-mT(zg;wg?vd(qo-uq!s0iUq`&ARiM}P3bBL9M+v^Qf@{Y zupif)Q+Y~|P1RiDKWV35_VvpDkJhsUnb7p(`??AHjb;3Qt><6qRsS}RQB?T9=TsG` z>M3EXpnU1n8yILvQYNw`F0GZr`qgVTYMKX-pojn$3IyDKnYNLj$8WZ-I%5sn?Pbt+ zH%EiAGDq7@J)eNz{CtM=s?Y9#Bo&sDhQhqscJeuPn`(R7_}Jgp^8vj<p|ud#*C;p*Pt?2=M0!%LEK^@* z2!%y`Vuc|rGWd}}#W#l#e>6wMr+OO}E{Dk#QEY`K3FC&ON@#?+)NFzkox#c^yV^{Z ztZ{d@QM(~I>lB$@>A=o+j3RA7ewgUFK`VnCYqh2&>t{exXT--4h14=ueM2?Wj&sB6 zt2VZY)_ju><9A~oE*QqGm6=CRXx*(yXWZIhV0zc+NVcnP%4gCpG<6;ko`O8!(hORy zVe7PfkE3>{vzJszxe*k=x|b)81v6_8tzM|BhWcGa=lpW*}GP0yXN$0r+rUxq@zOZKUBjY6|{V7d7EkGXUQQE~Nlq;P9?nEG#S z)r3JcrhDeF2n`M*A*C{3k{ZGzQJW)cgXr7kNf*z4J1B#1W{{+UUT84{BHRWoQ z*(FDPDV6j|RjOi4;n(_h=Q^9gokMmZDJul`MX>JHli!JL3Tk-&#LlQF)aL}PA7RHS z$Js^imrSig>+5PWwB07BhG{3Uw8d9u8uj#3T(W%Nq%aZ7XbR7(kk3%Y2$#tzDHw{r z?d0u#d6dpRpcsWIjvieO^K;YkShYfL5CoVwizz7|)6bM>gVXIHHN`IC-Nl^oH$kO( zsh4_ZnSwn;zUmv}UogUQ-GDV^eeV6JR;XA8K^UTVfI*C0O!_PK$49{Zg58b)!dHuvQD@ul-h8 z)c_J^!9s5HcQWtBCHHsXoMNPF!nBJGVK+l-__eIK9rjtO-*d$ABYgLiq=oN)wsgg=>9^lyCBW}aL?%M2$SgibxC82@CznF++g&HS#w|KsR3GagFr*9 zy`%62F7I(3+A~26s83>FXH7-?4Qh8Y-<;yEsp{8mFg~hK8IcGOzK=6Wh867U#qZ?F z_3nkN|410@xBrfF`%be0|1SmaUm+dwe|NtW5&s{@>>}l_@6{6Fvzd3zkuy&f#E%I0 zlcMM__YVXS28pB$C=rO!`|xF5BJpy^@2>cTryG8JAr#=*0q~o=$cAMo*1XV_15;Bo zv+fsH*LHp%pAR^FoEVixgH}|v*hE8-@WgNyv7(uNjD&0lR0Cs8`8QByX?>>1GKMQ= z3KKw=zP?7Vs&FeFyG_j)f@53PAqwVRn@;!eLp=jk^{L8(i$!S4=aq2q&QOI)@RX)} zoG15dzQ)K}HU&gVv#?XK&2Ioo3dUBUpW|Z=pyw zH}B^%>8mzI49kR(pTX@HeGuUpd*7a`px)#)RKS(l?p*759~ETF?&A`6I^Rc&mECX3 zOA`ac2CyYNWV7MyV;jXLjoFwK3J1Y!e(4^vmI>OcwCGKS$vgNt2Q(I8_ZThIy7tML zEcdMgYm8j*vZ!oAP$16oJHhz*Gb=3hIbO$&cL*}_^aEJU(?ZPC3Q(%=c8IERk6`zp74m`L-2^w#qfEVdjszu941eKMV+qqZ>gi2y0}W3 z@hkvZ3GN-Oc=y=Ok5-kMXTNOimpxe$_|hGqMeaY2k;xn43;;us(aOR(RylLkm*AUo z<(Bx*NC0lRw;;#+`K5}$txA&jNWH`cy)SEv61k^bww zhV$S3KPd_SBe(NE{F1U%Wt_3qP(O#TEDC2ik~gKX7G1GgY-i+*7pp7Lh9$5$>&{=% z6UpMTz+wvPNVSr+CDO(=s@m_B}ZFN0uzI9!9r)~SbjNAO^dM=B0?JVAh)JBRbN7wR}hgHhSEi6GnrKuQCh4EXT{wfBAu=>paDQqyzxuCjedt7~Y(U z9GmNz#Vgfp;4)7&Ye)h;+gTD`_Jn%zs=^uWiuRlhFBa@`faPd$FeBQTh&thTMB?Ye z=I2#cHJeXsnCcT4nO$gB&!Mt?A<(J&x{+`jma((VYskp&QXtgzRfPru6z{yy+Ul)U zlHDW22)T$+G~4CJXtJ(t#3zPGi%?*v0C{yrswCI4p%$m9H!(|}g#a>xZ4zlz%`(cc z>f{C}0FwUj3sQ_w3fp_iuDaLUf{c`onnhE4{g{2GFz9-IeZn6o-Vzl$t#e13%MHg5 z<2-?k9&4K^QkQ{MQmKl=NZw3zZNQTGe1mzF1{l|j1%bcq&yP^66^0ufZAN>T0I;nd zm7iue<>phA7%zWEIC!Nc=lbS z*C|FmAIb~((!7_7PNZZm!ZlcF7o1zO>Iiz)f?8O&8SPG`I+M;6pn5B9p)8+BBfDTR zpH8njoj7zoUlymmfR{q-7gCyvH8LFd2_2)EPg30qW>vSye!bF`CA)g~o}QIe%hZuf zbJSygLzs^}R&#K1S4|kP+N7^GJm8%Rb^z*xKQj6txu|>eK`cd}q?xBm!O;DL5*_6; zm(?Ld zJ*{@;UQ?m)Hw^}94m1TMZ<!yY)3%w0{1PZr zOn*5|%?d(viAw9yLv>8A81XdWm%Hv6CJUgDK6GLBG$h*va{Z3QeojY$Wn;tguw%K~ zF5E6WC(TKX4q^aK3aW<0k8g3Foafo?-d-{P%5amv?UdYnpO~}TVXtj465{05yMm6y zL#DGjg1p^km~vk^_t!}UGB%jRpzh~AG7)&_l_C~#*!d&dipnV%mXz> zf3lr#m&%lOq<*jb`sm2&?r&>71Kd_-)w`roX~{HSMNiLg?LaoYZNe#S3S|&iXZ#+9 z<=KBqZQu5Wj@cBX{z~BSEZII>9tr)(Xm2WVuXVEXj#M5n%tQ(!F?SUon7SEE0 znS5pxr6l_vnC7{*Wok$A1B)(7P_zH=%-#Tp= z47uG{tu7f z^U2wdv5)>VbNGpVgQ>d@*YHex_*Y3QbHycpQ_2uGWuT&O`on)?mdGVq%3t^3ihjw$ zLv0R15$Rr~uu*ut!$q_GhFy%>++v5GgHmHQn4kF-V;OD_eu7X;6R+=DoyI?TbK-*~ zSOcWp9eo+{Rc_5=Wjau3ou{C-|2W~-rSpyDiYohF`nGa;F{d%+WsU(#6Ak^B)=1KFypcweU)Htk{hj=WmE@Hwh zjDv=`oJe=~okf>?$s}wORP2dl7MY_>G!xd@)SZYiYzn5z5Ge~YTU8qEGIBuT(B&>% zWOh^$^_U`jNv@NO!a~F!pTvb^YbU(4vU-GVwIcm&+MdC%oKWc!(k=B&d%CGiCMnIk zE4bYp}vlHmECQ!U;Ef!YB# z$vt+faHl%_)m6J3nR`%n4N|7nQ&{oX}htnqtU<1^IG@!aJ*d|!%EVR@9Gtv zzmrsnbmtjY@YcHhlI1<|YXCAqE^jeix!T7T-aW9@0H!Z_Ei*j(ZfA+Fuk1`2Xu&|kqT3olm+@Hl_ zW{4%^M%e8xs&3MP?5RLC#_cf3w9gcGP;SoCt{V%jS9b}>O8YJ`9mC11iQ)nvlMGmP zq{dgNfOfOBr1|!O6i(hkYGi$t;5alGbNY=$MqZ9e({q#SIy666J)3FDh}Rwhgm4kZc%i`#Gl?DmU+ zcpBo?a);sr`xaxZ1x=qb>H0-;4J6raqnq;3jOsFtjw1}OF%;U_w}mq}oyB7p*mZje zVf=h7-2o|>{;wKotZ&9Vt3h!EK0vppPMoM()Nf}kqzUqNnT)c{&X`!*CMF^1GPXCVA!Ua z*OQe>ddN5*r9#0poq7DFPzMc~;%TMAR;_Yt&3%;YGOifA+@mlfFCy_nsb57~N#BB^ zAisBrH2C&7$0qnH$t-JB=Mao_cgrj-ni7eQH;kXIxHAHbgnC&w85@q=$PRwYO_kNzd3>`-6Hk2ZP3A&UwVCg6HRb3oL!YBelpR(zcwLnj<1jn+Z_&!4B}d-Wc>c{hg z8Ukl@NTd)uBjm7t#Y!l~g!*W^8NT%b+Wh@nNoV2vT~N}3SoEkpO}X291(EflYr%_N zxX9Qg3dPjInvPH&i8k{SvQxNvray3f!4L%}>8sLlpR(auvss%_IEwLLYw>!$U!u%` zxyDy1#Z9C^!I)xKPw{9vk5$BUL1S#c_|ejwryiYY^WPk{nVMwff5zm$baTVX#_WjL zUBW}S!QTR3j_d>rkhn{!arWMU_d{_bSVH}UmFQ!~d4#V(WX<2`H4_s55`@I#9eDi# zLXC8_<-A`I68fAxdevlX4!b%a%&#xpZ!GSQnvfxkG6=>$B}&{YH!F1@phxoj0~=D8 zQ)J?OMaMiIm-K3qp`)z6!#76{$`@JqUKb!}C;#;WS-D8!tl4P6Z@8?OymXAbOm<#5 z1{0?bhpAP3#Y8)IGA95C+M_cDn6L2R0aCIR92wpoHb&wOnYLEX9`|ow@3s9cIL~{S z$5JpC^sMI9K!-K)R)Q#vK#|Hb=c59DMZWR4j^GM|3xC3jPy8zhn^0;_{wr+F?hjFK z2!5r%qGgOs&xqiV1$x2mLhn9-6mz1Hi1d-mCV*#(Vb^*O^&{Vde>&or^_`!}f5Vue z-w^))d{37Cch|vxK$(pHJ0w%jTI(OA*$peb;clCGd3IJvou%0wj@IJF)Vbv70g2uN zdYNQ8XdNe`?G<(x>!(*PmY`mJ17U(ZmHEOt!tfo!xk3wJnEJV~^+s43k2PpRovBm6$^USEEMEmTy@tF=1v; ztG0At?v7P_`hvY;|8ju&kogZK$IoDt47eSIHV#ygAKQuXC5H^ifqoj4v2ntxcM}95 zoSX+N2LYiya}4+*+*9Th=IRJD;NZow@K3TZnc`1ykfDt|$;xHw4w3oH7AWP#LXAQM ziP_rd36*5!a8Jd2!%86U8q{X0IDRYgrUq;YBNHZ(BBN8Jrc#TBrj$m?nf_@bD^eyU zi6?F*F*8<4+eA$h6K3Ezt4bSvlveiit1XdC%8E?(OIXpN!Ysy=p(=p0r#SH2cI0!F z=(JeEAmFkU?4&l%VgL(=Uga{q1q*wOLDu5a-aaRmVHfhtXMyD;_VxW=UJ8>n)E;!&xz{Z@r18>jW zl4Q@_+VE8EV?v(W;>hlW zpIj~*55o^9VwrgXpB|2WSZO?nP--?YjO!wLrU}u9uJK#W# zI1t-Ik#h~==Jp%I9(~!KGAyf0HrW>U^w$j{cWlJ4mE~iPtG0K239)WQ**x=^v|<%= z-&s&t?HZChQQ44HxAh$Q;|IuFza`H_#d(l7b9QpYfJ(qv{q@<{BEJpDjOa?whu8UE z$yXr%(|*Ex(yJ-yY1( zw4^5_Mb*|snh42+@+f~xEabn4c`n_?yAAqK9Kp6a{E0m7v-WBZ3M3jHzkarAZBx7Y zJ4@zo{6e4R!1daFhz_BhvyCMzTag*mRO|u~A89_N@jFzD$a`TIZ*`|VJUEy5Gml)i zP`!o>SbwiQ;QTqmSe{^@jk0>cDy3F9NLxHWv!7|e3R~4)QRd7bD>JLcz|NZ(soig* zUbfa(wa}TQ$9;_mNRjZRt#0J<@9*{WjF3Lji*Qkv<<{gF5Y^cuC~u0m?(p>@Vpg1c z!;xPLYg}0-xzx@#9)7WrzMSIFHi!@C=j=BnG-x}BTOr6ZjJ=L&BH+iosYjPwL4uiN z!vfg=jjch^%-#m|9?`^7Pc$`-FTV{|zNG722d@#eJ7m82oI4f3zQt_cumyTHs^_ha z1Hv|Pm%A*?zQ-+vE&|#qk}k^et@ka?G5YP#TPPn2pP?6-ck#{u{0R7)@aI6+&!FWE zD)oLi>wek?DvVtUN`42|T?)I-7)Lxg;vu>v)%eSz9GP7VkM>&3tY13%k$6qe*A1WX z5MicX7iVB5HeRZFg?RSsIfcJBU*`t+)zj*`oo^Wx3za{k+>4|2Wi9~kd%T3$7V+wQ zhuZ)jMIh6|oXRU%RX#l%9(6mxl2Y=o?3Sh$5U5{9mTy$9uzF&~XR<*DRoLLoi>Pm$ zgWEfPU8iJ4^GZ5)5H{ABNVUzB-(1YI9E^aQ3GDMnQ#>;vwWo9 z!#dlDDuf+IKl^0WKHPA8r=`0hE}w~WLRrzr1gG!05=C&s3-Mf?TC!}o50B`CqylWO zKspxCjr)8Pq&wwq|1!+Mvt@-DEccE0{`0__maJ{A{=JtS!v5!u{;vn#e;XnG-pLsM z+okM(xea9ui5WF%)@64shQsoz{b#o!n`Ub^A-?g1oqwhWNG$wkx1pz)W%eK57cZrG zrv}6QbiyCXMPu2Fna)IvF`@)lpzw_n{_4kN6d=LrAdCf4Qbf(VmR1*B}ar#MB8Eb46gwO1+t}POovUzL2#==C7I&Aj$!UYSdgxF@= z%>kKL;W?oWUAqgJ<&MYSxMxDX2&L$sw&J2V2;ku$;F7(0AcO;mgd`-gI0Act14+b0 z6AkP(=E#(dI2;$99?XF5Gfq9=ukXgSjVC|LRQ6K(zFCK!P zkbum>)?UJ?D91sJxb(9VuJ=>D5Z4ZR=r(SA@bOt(K;C z+-P*XjnrUFEGJ5_(TSo~Z8FceZMWd$<70G}uewr#U5vMxWSP^hTq{>0}9q#RS8Z`G%YPi5)x~Q9>L5au~I4~Iv+Nc+IRYOQU}mXGcZT3JHWbzQVlL-S3Q~_ZI6#j51{e%F}&j|Cx%YCtBatO zhguw9EYYeB6Wz_UE@L8^pO#UU%~hHLP7XD2k2hI0(J zq31GRw4M`dF0T1rc%Is}>tqAbG8xe5z#STv@K^Fsw+)*(P6he ztDB0cly(JQamh*93v(`Jw`x>4JIFUR$J6MHo}@E5Hk)IW3r?+-xu~`d`5W`mVQVB* z*GG#s)R!yMOjZw(a}==M8+Y=>OS92XH5U)#a@x7N^%k0*MbTWFieB?IDaW~-Wz{w~ zN<@RTmtcrM*{L^KYcO9>Z9-{s+N5FnoX*~&K2M@cICcoM#n;iMnJr~0QJ}PB60Q)q zn2t%v<;u_6RF$fEG~Q__QknXV3Gx~;iBpSCz2!WLeMmP6e)=bC=IYl|75QozTfV4J z>nmhe*X$gBQ6DPgXiRF&P|T60Ja1O+ZoN0u>naQvzm(yq=Q*F`pXKs{1rp#=&Hvz=cb?z zYbn~6l)=pHI-XO6uAAP)W!Ge?(i1$-oCrZm!cSN>5i;jz%8eA?s2oPvpMxY|)<9&u zQQ{X%b14?Y{bOn77|u-dwBgrLk4Cxn7RfD6ali_LMCL)*P$5~FhGkm+hm-rxen!ay znhMB?h`%yn)j*4qw{vVUbc`W5-muU8K7m65MvugW7^LS(8}^_{p~WRf^$rDJkAqhz zg4RD&MjXRD9MkFceoebX>!E7uAT{-T zokK|OS+IMPzYo1c5NYLK9u!c)-Ca0X8v_O@+hxnM#-CAR5RZxU?BpA>?2+g2cmy-S zbpjXUGE;c6dR+Is4(xE`kdDb~B)~aGWM|=!69ZITGau7(v24vOE=cGC;aq=ogd$UR zUncs=vM3~Wxreu!-pz=9a+MhXFQ7zpHI?ZC1O%RO;B`antG4)B)~sk}^S%}5U$FmZ z2XvEiW*OgG_Br(bt|$K=5{4Q7M1b3knnX>PNKn+ug|za7 zyG3#6Wt0SpL%M9sCN8U!)@&3$kKoVPIA-sbW>heH3o%pA*zdGwZL2nYKe9}5$Q#V2 zc|E7vrai7W*?m7h&ZT|`uSn-(_uIH*yRF~yi4{KjEr=Dl%2_@YJqq-u`rneoW60_Y zb>mCk8UQEU@g|92-$~rjP^8N4A(^5~kj;j1T6h)amhKP-yRR~dE}D(dVsL8(+j<$; zZ$3zSk5_RHW%pKe(>nLBS3Fnq={(^Ulsb&py@$a3)I2xvu7IiY*Fu9qN2B>gv*_9! z_!MZjYAiw93f7|5W;W_#9{IAanv}QFhgWPLIPAS#aW)PJniID$PxJKp_1sr6)%7Yi zqLf#Vik96(Jq9q0d7OP^yMvj?FBzG^vya~ffL`Lo<+RHMvL-M`S`K!jA)r-`HQ%KB zfr!0GUL;l8nG^xVdTQSOJqp+A5GU z4R7=ZMU7Bbyk%rT9e1zXLoQ3Y5gCNCWxOAQ*gT3ZL$}dN-N?S1Sc|rQPqTwjxTRe- zXq|JWddWUaeMvV-2^zMq>d9L7c|?7snNAJ>t{+fT9i&<+d`=Xcv>h!NU8^>ND_0*j zLplx)$97LKIGDUwF>X`IqOe1uW9Bh!-FCE3sAnDDrmG$UkyE)R9AD zHk*QpvUJ>OR2@#(?WBAcfX50$nqeTJ>eT#Ldl*|VY?4fq4SrQ!A5kh8^Qd;r5K5}& zw&L6%!+((&a#8OV5em`GQGKDL_jOb2~@4&L_#B2WG<0O~qyRvc@l4uu45bbS1R?tkwRa59KLQ z0pTU#Mj-XTWz=jUl;Y2&zA5hP63|J|FmXLQV>re~AtbKafEIy6GIHL zVU0+Paa-V52W#k5L5}?#YqV>*L;(!arau{YVt_} z0sZtNuqa!Yo;<2wZC{Pb&=LDYc?b8p?JWoWWopgM$FZMq&G%-fKD|kUzi0|JyPD=X z#rw4J%`3IKuJQeRM*ed?W8CS_2)WNhlp4#h8jiPtmOg8A-8~G#gYIC@PpT5RaUa0@^~<+PR}j+DUE@Mfj?3OFNA)&AZUd(vbYkvZ8SMS4AT z*%^rzClfKd^iRJ%vkP!WgK5*mrjbDegrN&i|H3H1&3Lc-Gzs2mUb{*QixU>D+!2G> zmr*nLYC*pMO#gt+)M5Q*tZ{VCl(}=k_=Ge#8FCW}nhYIhd-0`{l4^FFqpZI#$zSaj ztN*}PGRzq*EHOlWPn6SNwW>EG zmyAkb#7fQkq@s1wlT22fg*)EbYPEjgFvohTzPtNBK?|Pc1?lN1pCRz6PmnjrpA!vs zeX*E>qYD`B21B$q=WbN+X+G59W1u5O>{9udK$%w~g zM_au7=QLTmv^kLPGxEzqOX?pyyUjE$&1E*QWxKrUvEZ~L$Eq}%{t}jvn|Q@ik=j@! zPXjWPR~HO_GA~T<-lzV-1JO{9=FnJ(G8bv|5-8jK2}>pxx3p|gf@C6+G4H7#1KdR2 zI0S3}UOiX7fEwFJpb*T$w0l@HD}rB}>JdBw_sS%Ps3EJjE;_Fyf}bE`XcR-}9pui1 z9R4_4Ul*bpU;OtMfO&-5e0?}AO4bD4MlKqmkn#tDeV70>$P@ z41i1_Zh%}N%y{^>{z3HD?NR*UQwT>Em`QNS{vB`RY_~(p6*Uuua+^Xif>^#!;h<3O z4XBMyBQVeHdH^Ts7S@Ine=5i|RP%R5fXV_XiXgEAN3i<<{YP0k(;esgM_G#aFJ2M|%^oPdy6q6Q{~vQo`SPZG0?q9?d+P#= z`F|MpQvZiXe=oUj;(m6ax;;hnV8{jM=#|e~*5nl#zpwWP*bbR4HAfUSlWnjAR7+oL z6gLzwMv8-4F9=ysEBQd8Kb$o5W~7knQ&4Kst-z2ls7~l;s**hpBj_+f3M0Ld;1H2; zX(9J-Kf*L7C=FreEsSR$Jw zyd%Ig&7cmFkCVUi^5UqmGDFtzm!L68Z;%1o8i;-YahQ@ceqRop-u{>s4Cd9ZkaU5_ zqzX`A2Wev4Fk|W zr7`XN&HFid^bTsj*SLIiTb&lP zk4*R}CfUOAZ->odxyct?I1^iCocStCYQuhSUdGen8h?el(s0Ycft%{I+pcYSP71|- zW#>gm_o&_;c=WGp1X$v~=7~4L%F!dfN-qFxBlZ_IuizyHfiJ2O!Gg@{KNy+!)X0Ur zGRE;{r?Le}vshSLz;EIiKVBtV-QneSaU>SmdpxvrlXi)EU#A%B;byS#@Lr;O&_T|B zgqNKBA{YFBNPEX9N!VpexVvoIwr$&Xb=kIUySi-KwrzH~vdc!7@zr_Htb6CYYwpZB z>&suc@@G6NA|qn&*c&1qZ>J87$hEue_i#@%HESDwJS9Wj3#5|e6LVlD1n;_-xT!NT zlWumjh&!~Dr}30J{(3MMX-u?ekt|L&lnp?`6k9i4!rU2pYl9;vLZXSgJ|qeMgW>GX z5JsTjiAof|PjzB|fDG|Z+RO`%r3@)el5adlB>W6(17!TD4U9n=Q+a|dNTD&SawT%lDM_cB~)u}Z98H<7PTrh#9S%) zI$P;9QOVlsSZLBXA@s!p$=-QJK}-)Z3u-KT_Tb7xnB8wt#hcI*k6dos6vBpt(r>d>ihTmuNwW^C+kj>8u5pBElu(gq6@Uwv zn*MP$i_c{WN3A1JJXL3AlP{H_(ad4VDCEf-W09>c3^Is&B&+D4tw5=vdgtv6C#&)daiXeU!ws&DTf-{W znkj5>r9>%7!z7i;UFJL|T-c$nfb@w|)eukC-G5T19(ppZ^%jo+C!hyUFqd{W!w#p?aR6WI45vN4=NWumZ!&e}# zi-{)r)mq;0I7mSjj$%?kGo`N8-qbDO%St0s`a6AWj9YdA`<%3@t9a6BT`2=j-Q$82 zu|B$tSmp_3j0##IY}!JT%$e2;BVsCCf)0Ao;P;cdRNK8~x<3N(YUGw-OE;L^Uf;X% z23(G7n@>VqlBys?;lM&5E@GWyy~*cbD0NnSM+AP7qy6^9)h`_ghjXopnKrj3^1YY; zM|CP_NxLNY>ObWFrT_SQb^4DH6j|~AGlEjBrmL*2ilR%-J`PK`mV8S|Q18n^(p29v zjAl+9AXMm`LVzlGF+EM#j^PNHmKDbtCCB%c9n4i& zZ6ET-hi`g`cY0Vq%IaR(_S#}@|J-nM`<69wX7F`{0y)aC5Ur@AvOrsHr`HS@|%- zqR6^5eqz13q1^&YwUtDoWkTg?}Ks~?6Ws@mpF>X)OT*LitJ6{16jSEyrFuA~}vr%4R zT0$mY%C4)K{jyk!q!hxK3%6(Nv^l7UQs5#Zi{isz}KGJRdK20hAyL z(jO8Z3zWuMA<__F_ZJ=`VtBSeLE@+zD3ccINSH{GYBER}$>p~YPTB@#^?josri#&K z6z|bU2rD>S=J~chj-+O3OQWu>og_Ea ze4*hoNRdL+Rznp(qz^)G#2KhwS75~YHH~HT9eh%F2ORtI9y*>a7_-mvg}altxBm=4 zQ_qONS98dzIMtfgvXiF&hPsTGyIq>>f?KI`-9wvQ+PG~5h=VUXBHJCSP}#3ky-hY1 zPC2#S&S{zule9?ZLwyj)S)Z<;eokS-j5V^(a5YJa+ZJ5v7K%3h7#_ZM&w{tW9z((M zmdfO+6fcWb}nXzv}Z4cBAK zMmt3(7~VUdZ;@U)^fjW8@ze1Hke@+d|1NO2l;0NK6>jp5+jXq$iJ9B_9S1Q*0@f?I zh&J%5k6Q#0x{7&Ek+c5-0zAyyxAvn9OrQTTmrMcNB6}AT|KdBz=^SMol(L*R><&7t zf8LRd$9G~c@YC-;QqzAXO-w8M41=`fo6fS~(ZJt%=gTsHdFSIZf_Sk?dy#wn5ke7% zABe_nN0N3L{jVy%l!>Xz(( z60)4Ha)LDF=SkUs$3fheXUo@Tn8Uk*w>XH{T%)fn*_(kY@+Vhv=edBx(Y*hHi?wW% zBVOOA8F-FjUwWd|+JTOI$U|?vAHT|7W`DIMe)ZG8Uyk7kc;T}{arnAE`}`KnAiO@U zY`uD{r@xN2o<*9q$IKk4I(3`ACmiIm+1EL?=OeKx^c{b2K>dDu5c?^8{}mOr_PhEc z)GzZsy3ZzOFW9x=M(dE-#+kW=@Mq{5$5r{?uN>mkecJp6;hlm!N0MWse)LijN4$sV zA74Z;aEKu2HoC;GA_xijzpt$SUIfMeQv~xb!<7Hp2mPyLs*N(TI*Kpdx^Yt7cM&8= z4J#Y!J<*nxKsE)fA1Gh!YN2|KUmfc@1HWX2*s-;IBR>aDVK`h$@L%)!D;AGz-P2Dn zN{)Tojy9cU`Hnd0A3xq_@%@0>B69a745(r)Hq|C^arH*>2`f|6F8K~AFfMAP#pMVxsH>`H(b2A;Xbvy5*4Zv>Hkhz~ zEYq-Sxp?igWb{zWZfxxQ!8TQ0DK>kCt+k-5u9|p10K7*!yA`t&BT%7*r%doSKF~Cp zK64)iDo-!_XxiY{^3y?ym}YkXW*ssyw-Dyguu&=JGTlxa<| zaaEqhikX-f$x=-X$O7?`7jDs$QtpB%0h4A92nd}(2CLn_&cpM61}?PhSL3C9SytUASYV`^Eoa%itOD|AmjJuBN5OgqO9IHDuDz@wr+Ob1u-k$K zf%$jE;dBLNn@?36HGIizT#Zh%siqifqn~SPW75otdusD)wlz7ncw$>Sq{!3?`JrGZX@r= zwz1^oGC?&8un1c-)138CMBOk!t5_*Z#_ENl$)+|I*YKHj)NW|2rt<3zLa({qlD%n$ zHBg8_Y$jxF3&4RZ3Z-*_C$JCc)J_g$;&Fwz>GUl5y4vR;wGWti4+e>DLFR)Z2(Wr; zgC+1hK`s=H#m}qkBW0;3Z9bCd31~@QB7;Mev(!5HmVi#5Z#H-zE+?LtaCGbwp}|xT zyT5)7i-(uTU3s@TCbl@=8~>%E8FONAb9?QUpSgEKPMbxMJ?R=NIk_B4`IzRMUbhFF`6N zL3+$M#9ttD+GfKn=;y!3e!Rgm6rz3{*E=$-9uBKdpy0eLgBW}Qnb*0#1fu;*_^jH0 z0R5l$0GliZ5M5t0-M4?~n*M()6Nrc^n;4sXEp7g*X#DfY@XPA$uZ0a?-gm0Fh+?=tkG)UmOS~4}amB%l z;mzE7bGF`HAFX@-;q)eehQ4n;tdD~gnvuUBzZ6>Rs?nc-5j%o7T+g8-G0GSi%_D}2 zqs}mbklmoGEyFCLbg}^xgWio~WTMn|IOP7Q2V`f@_T;_1xcp z%`P>n#FmcYR~?(#Zi6SWbm&WPPECO?jti!vSNPzZQYp12QmcxmL#)=pZE5}%LACprmoZtd z^`w~d=a0oTBS1uc0qg~oGb(w!Dr0OCmE2xaBs0gPy~K}s+`;C1(9ylry{Q+q;wfFm zUdvn5@kl~d=xW-#3bh&#A!bi2xyTj>mQkl_#&j#8{-Q{yG0HS02Ru&H z#WaJob$~xc$p`B|?Pby@FKno3R8(fD_N{ppaJe(zxmMqFq+L|Sk9ersclo5Kmp_?4 ze!b$zXrOyet4Pv&06qP1(2Z}zjnpYSmj0%@{Ih}T&f zzCUCngPj*LV+ATY&y}yx?`I$d^%Ibo_) zwu$HSgZ0ibQy}rzw`ie!U7J$Xiz3;JQqe6*4h{J-g@zyzS+aBZcW~do{)3eOAke#C zx4O|^(DDCF&i;>CL|<~o|I-rG%56~$q1!5x0u4ym|JzXFo6S}EJH-n zTvI;1u}5L}gc6ms#XI|pbY8KfoD*Ew>>Gug8EHC(T(S{1pShVEkJr)6`MJAZ_s12e z|7<-WfW}s`EnAEqiU|oL$pIW-=&DY(#ao|+Fj%C4Mk*tjmYT0GHc%A}NK0@)*@=92 zVmfrt6N7{wvKEAiLYhEIC81#^K}Rpae36!KqLr<-*be2gz;gNr7K4TnYi(JhW|T&E z(i~ZHde%|GRg2j#w$&AuLvp%+IlXvAX zF0yqy+-BlxnMj~!Q<;q=%Vg3&HAA`KTcSp>_>hXPR;f<24s$7$bip>xFsy^26FXnE z$?};@JDX)n5hWt=V2m`{_z#B=6H#=H`a<#Sj}wQ&xHSmd5XdcIvjREDcAMMU+Oz+X z3qP^ch1O9huyu7dw?j1YTUgC=GDo86JX9M?GT`&FZx8;(wd%8ak98WEc5O0U!__>X zpc7KRQ%<$n7rwV|fG`wlDfCDyI9jVwf>-C^Op*D}baT#j!i?cL>P%gs<1u`rn?0LW zKr)M~pi2xS-A}4xO5y8oRk#a8N2Sp(47o$8G5iSS+m{iDjiGogLF0!qi2jtgr?xsg zXy01sXptj8Jum$fvG+rq!S3|bCMy>;Yt%nj59KX#6p11q^%$yR7iz_z>EQ61uFsx` z!$rCg)}{V7_-qM*taC;W`jRoo>vfM|)AmehRA+ep(p4#n7)@HGV14aWE@{}&`41iY z^gdm#KXsU4ssZKYiVJ4xadB_+V)S5E>-o89+_mcq!H4tWneVU@t0FWpBjd;+vmXTN z4s$iymzuM3$7K2aAjs@G3G69FT&KAiZp&s)hB7U;AA^j`Z)!C8Ukfz3^fk;`vooU_ zd&Hj6S)eJz-G*R8TP3Y>Le6Z7yhWw1l7O!xWfIJB;&$9Rvw(GdV~{LDf;nk&hQ86K zV3I*qZ!DV}f-{hDXSz?M2)~3)@c1D7n!KNCKt=p4(E>x~KsBH}wZz!{@1T&BiGcPa z30q>-2|MIk{q08Rlkc=%C(`g&LO<39=bL#ctk`e4Ia^Lt#O_f7? zSSA3j=};iL_BrXHV)VkISwwJyq*5KyF~@I%_oS3?mT!o?MAf1w>Aen2;yY|Fx1Ah+ z?z5|6T0pY$LEu5Yn_Xk_vY+6~zPX6_FM_0zP#%OiZE(EPDG+|cf|0#e1tHn9%Ba^z zYd}S0nRQ~YmsT9_t$#Yt!U=VuuJvObueD}W5(m>&>XhG`fQG;7RqSl*V(hla_5+l3}H}5y0SbncI}#j=06Q-*NMH- zp6^K|xMaGN+_bB|p;N~WC0d7c5bdeN7$)o=KPz}q%^c*0eQ3%l@+bfSkw_C%sUhy+ zOoQXVsf$yhAO>?`l zomW4f`VDB$Ib?kp^a#VT_!1iyYqx^Wlx&ApBRJeIyv;(^%L^v6wyi}U4_(Gl$a<8O zJBs}7mICImI#Jm$8D4#kMx%q?Y;|*#AcIgWXC`!t7M{r!VWfhyp{Jx&1LXa3v$e%PQ3D+H$H+3Kz~_F`rWGX@kEd+}~8`W4I_Xc*)@% z#Wa%GVLOMR<3z5}Iys`)PoTZAlI32c;G@_Cb8o_rSy`l-;o0Crk8B@r^2n=7> z)Va6mjWULKL^oalKQ-bns0F6Pg(jPCsv71B-$GZKfnM)zig7>S02SO0OiX1t0mnHJ zcz<}#&2TOcD%|1y1T>JvxY^U-ZjA_-U67XLv3)dYDX95F}BSLTdftcsg4g)m41 z(j%CjWQj_QVHH}UoPo65P(Q(!Zu5N?)tY(T19}1Q1D2R^JWj=Z*_nk&$h{BQKmH<| zqk>#e&wUk=l7HD0peNA$1EKw|58v0f|F;6Hi?f9_y@I2KtAX=Bdj5aXM?C)7@lR`b zcNf0E+f5YaZ2ffp?8P(ab}u#=l!z% zD97v4>u`=Z?t57&EY-`k8tPfS-mpvC4^ets1^dECq%PSZ*@bskRCWNaNgL>uiUajF zsZVQp8?GCLd+U;0WSjJmmq?fT(5uKM?fyFvU!Eb{C1SJ}=tU6K<=}Tv{KS_*D!#xt zs;9KKHoc)y)vQ2y3XU>EMm&Xj5ct$RLT{!1Qk3XQjnKA0NKkm`J72^q#VB!=r7z}y z_|1tUPw1%X*TxLhTkP~z)LRV%-lp#e#rwxF7Y}J+uG%#ysGiDvpqYrbZgcEx;K^nS<}5E zD$nb#Ks|~l(tPJ2Oty!x!XM(MB48*7%) zHeYcZ!qS$fxYG{Z5I-*K$!jJ9uS48g5LUbzIo6;sUQ0bOyTChPwjMN`icA=f@ZRf} z=(IfxE`Zj8v>Ywl!Kj~>;HcPD58hhN{(1cBT#I@0GC<7OxoXOm|ECr#0*QIbJorn^ ziXd8TmL&oYcGXM#;ib?*EUCGRYN@Gv1miCJ`66w2qm7K6h})CBq>VwUoEtWukp2CE z_5_FL``|BGjRe)!Zlf@IYi!{fv`+o_y1r%$iPo_0>O+Oo&!JBed;>N8Hu7;>-AgcO zBMg(eX3cidsmU(f{%KDM_>x*17q#K}5!LB!S2ptuwS+7lJGJGQZrwk)27V+2X7S5Q z36e9xB|K=EY@Jmt9EM~(j%v1NRuxwBA}vf`qu@>acr-@Bg65jTp}gOXr;jI% zE!i|RvZpXif3P=?d|%#{n7YNzl!2Urjty_3KIk)Fi_pdLjoG1ist(=R1BFEw>Z1E8 zD-W#)bngZ0*B6EL5&je9O>!{zrXjG`{E2!5I zx?wR$U1iYEUSiNs6G0?CoCtB4h=)kZcubCJS)xBptT7EFg%MH-vblW}J7&T`f>5?_ zoh7WbHIJiU-a*KsM*75kfb+Re#@2{SKO~A(J|CGS1HOl26$Pn`Glv{Qzdv~kesU95d@hmLC)Ib3>6`|Ns7F;=#mS@>Wtg{wx%TsoGja*R+j z6s@{>h>*)|Tndy&@sDCfUO2=Rd|{BKvH-P4zeTJVtl`DgNDXmWp)yWv#XJvr97889_Y|2-eR;|@p>SFxeOx}Qbo;85k>$3Xf?+xRr|sEinl_kE9V@1i z7s6Q%+A3fm7i19Wr?<5?JWHvaXwqy%UF2Sdm~nR|u&$XCc9XM>+VPCLp3`{@;rZX5 zXvAWc@P7Biolsf`e_TNhqz+^|zf6i8$ZnuP4h7biaad2!|9~Ei>Kz6PEa^3JCP6ag zzS&?r2r8dpYGpQFDs9Hrx#Hld@I96PxWf5ZM`Hv7m+d|2<59^@AOEzg#W~{)FyM?4 zPBjS5GMPeyF49%0y!H7&WJB#)U(89EDo(N&B71m)VHsrO$1n=L^BFvXyK<Y^Ec1st~30BNdzO?hB~QGFE3qo8ll{j3s+f{WP|HIm@YQCkUIpPZ#iZ>-47f za*=y{FnV02#7D{s?{8syvo&@x^b)q^`#Av$BFbE-8;xZirTMxEJcYjG0lI!eq3*ci zMU|dXYA&+XxXrb4VMTsEZKEkZl{GkG_9T;-Qtf?ud|{qBz-Cp@r&)h-ar@^%R*{=K zGs6Z1b|bRh7QgkSjTM!k6AfjKNDA$mvBr z8o)v4)Q&S-95~5CM{b`!Ya)n4j^~_$&NZR^EPeojW`i70Ue^`{p1rhRe$NA2{PfLK z)pNw*_E#c^9OAKZyULd@CWo9ArL4ZB-xf!zTIz^{C(=C(coSoQ$ve;+$V_yhClYr6 zmN;>MmZ0{Gi71YXLzPU07w#Y0@tX~hf+#H>7kLBCtw9aZGyxyzB#Yx(8q85kL@N=N zkuPL6sgEl_SL-CAkTPQJoZ!b#0qMlK7Y;USfTCIbUK^Je(9xJ9xxKCW)*^?d7IrbK zyjJxBRg#+a>i6VMz(%J|kX!gR2ODJmbVCiTjiaud$-0A-qytH_B5U=-|O1&IXIY?T6DJ&f2-}67kEfSm^~yC z#6G9UH4oh|blo+Qb=MTJUcZS-u%cG*WI2{yo|ul{MO)&R4Abc#YZLhDg6Nw3cOCh` zwuFJU2%1fq!nPE;(Fhp`}OTv^kOgf63Q+tBS(7uAQ(%=c4< zFs@Aa(q8Q`d8S^SqYb0Ay*Pln;C?pRazDZV{!kc>Opo_q*Fo9!VS8-STCY>5Nki5O z4rX4Pn)V%mtM5}m0^O6;jIesoC>_OIqnYW|y#FO&fWS(Fj`T$%n#23wcVvGj3-bO4 z-KUG8wT02&o6l-ZNN<$`#LrpNq@P_~_K`@}5D-W+q?_vm@z4;QggW0jf4Jh02l4LX z3C#Wax;d+C)#pa0 zoBeM3t@qiq=h^+Fn>+_dK}fyqdcQ1E^(iY7++HRG9G=QuLX?e<{BJla4brw zhw3*ep&s&WLu4%go2nA5~KcefPE zm+VSCq>JqL5z{F;mFaFf&l^&&(zO+6ucBh$4%Jh3;EwbiDH;J`^i)5Jr_w;ba*YT-=;ye2H~puhy^w>9kW6ZpH2DCBm8N_%Kzh88Rs>!1j^fC zSBS@S;8w7RX~8}iyucOLy9~HJzdf$eFPmP*iU#A!#^c4g!K9NfYa~W;79}p3T}H9_ zlb)kh=u~_e0V14j63in%Hb)Hhh*%NTswUG)SSbvD@=;gGvw8A}oe)o2FZmK3j%b+v z>=iwe(O09Nf;SHtTa60R?Abed9G=!MppkzQJU#5v`KP;M5~jlv2zOq>DR}w%XLihb zG_qdQ1XSSbPZ=Ul&O>O7A^PL*)oYyJo&Ze zn)WVrNK>~^*uhBxw3f zjM{Y2_0dE$E#&!B$E(uS2t8E-aWvU2Ns{Ff{ShpZqvwci7reymls-G>C!C z!nK}_+T8PEjpmMB%d2C=3WVs8j=ARjLrFXIX9wF)HT9Ay>m;lBE)}20F*Ta{(pqvu ziDM>U8^~5I=`I^5#ThW=f%1o)ApjnuC0m_Vopw z^Tp5=6U36t8-&m&y&{E_Svx?&STe+hp=4LhL*LRQMWLn>pG}=STVOfGUw-Q#u9(BM zvt&#Lm(nYm=ZM`oNaTYOdFG2nnb!+RvrwfN*itE*mwUIX6q+Ra1@P^H?l)nESOjK zHOcjvlTFp(hq7wXYtSJ#@Wj4?g|JyRL54v=!|W_~&&NvSre635Xf zjOPI}8MI_CTR^4zG8N3L+W&_lb!Q{6rSwBTsDo_9)W#O-_>+$7X0r4K@9cl#2FgUG@7qL34$X>N!Ju5&h zYcQijkTN~Sd2krB4x=#-M-c#k6uoTTQsaO4D=iZq8r4(}H2o$xo`Pj@H)y|fo=U0*yBypa@qnR}C)M6vcn<`njVNle7i zcsE;f8;uFZkB0{KK`Nro@%W}`XBmZFUpKdFZ`X#_Y-EXwRMBX8|sm*Rol^I!I3Q;Eoohy5GunVo(%0WyDP5k)V&6Y(hc$9$4yWb#&;%2r(Ld z+2MK>=_|)zDUqp>EUG~qudEz5$1f?0(k)TbB{pk!o$2Ki%3r23f;!BiIiv2 za#QhY>RJHJ^O^6fou5yFdY_S=EiPOxchvJegdbY6ZF^M~YknpD!GU~5v_Ar8OSB@& zL!E+XnM+X=x_1qcc&>#$I0YSTrkY~>+Mi_KW^xdLc?V#@f2AL4WZxMuE$;)@VS7Dg zgX6#PNTs2ZrQMl156;I_*>c1^BG=PMitqtJ+;$S@4@MI zCjL0gAW1hu5c|!NKHnyDbf=)$H>Ey%EM&ViMfaN*su}v(%|PWXY=j>U;QgU97lZhR z7h^q<3V(L%=+#%Yst1w_{#_3$1t+X_;5EhrHU(HrQ_Fl~pr6C9c*7LNwSBI-#K zXD|^%3i|!}$4Veezt4^j6h6Q%fE6WJnc)5}t6##(I!c z`k?A@bUqbf4_6NZuSWWuttw2ViH{|m5nu00mO%B|c1%a;I{hw?#j>^F>ueMX!W6e$B+Fd?R)W^k44kNPp=4PRhwM}OdcSMP7?^`dfO2K24)3_l3P z_AG4=uGiFBZoi@6)qiR9s?h-&z*cv)wm;kokyaUhP#M(&tv1Sl6E}dc?-P$1>KyKo z9ojQ-B{?wjMOu%TgUq@@J7VNVr2~xY8RU?Wao`Pk9=9d{aQjM?v;AeX{Web=e!K&U z*95j^9#@7?mwkjBn3a-k$YIZCnLHn!o1owTW$Y`XDSdm7UJ+nB=mAB-smMppkz zZd+y27FiOdd)f630AW8+u28qjl5PdXmszyP{*+=Pb*~F8lT~_w!XkB&vx;Mv)3m zIrz{+17kq@*I=AF7kueJ6Gq8mpir-N%RvnU)bFDeP*8eKc*{VsiB#RrZEu}wR;n*` z4R#}wQI^v)vBCZ3N2X(2ZF$h?pVOnN%Ixg2!fsgFp34@$4r48NT+Udxtj~EIaJx^m zT;59z__*jPel)kxZNSqE)^Lz+goMA1SX$JONR$J~t!sqfm^mrO_i-CQN7@gFMW8}K zW46c)j<%U}qM9`akyB*RGp=-OE<%cTKupGVFB|9pPp|=&aY>eMis7xMff2@Vsq$|FlB48A5wh_U+PRd`ZaNUlBWfFJHM2;0)vEk?&dhNsa*G+>;oCqo%niK} zIi|pHL~sW~O7|(576`M@nb0eN{0#^vc&8u|rIK=w#6lSoPKK#6j>O+tbZ0Cq=8JbM zBn_6?`@x--N#GmE+) z$$GP|TRf)(BJ{@!<7Ut;#g{P&VNiuK1IQe$PER{N=^!y$BRYOQcr}p4)maPST074H zx@k&?@I3&C)+86Ljy<;U3AryjB=nq*cGq#-F7!IH|7}rW{m@Mx?=UwtrZ=y6;E}Pm z=o6!K*UH6|oH(fU^NDC5>BnFT(0+kD97ONg;*V9~cxGx!0LLFAB`uVFdH3IsU3c;_ z<;?V-G^Pp47Xz#r+^*(C0TM`S(6H1s>tAy&h?I zJLl<3f*oKDYk=CK8)|%7U!A}^_`7Of?eale`?bDb(k6F(AYabHyZVhe`I(b0I{10k zy^0!11OjfwmHtuZ z&ilg1?Ei%v_jj;e;@?VtK_?Fz8xvS#^ zK?k1|Bt*PN==b04Zat|&b~O{a5?Rx`+Xa78+@}lO1Txgas;K<&XZ3NE+#fsZh+~qG z%$V;;H}%- zOsk%K;KKL?{IJX749@7s<@Kfl@gPb0}xmDOp9pjmlT9o6^i zL-9qD2yeCTxozUv?=;WW4({eWf;UXZbKiQ?UoseHR6~bav$v7BE#G*1aA7@|xYtC( zNXrpC?FNSBXq9HJKmCfrfWu`xht}4Cv<1(%dJIaS#{-Sq4`>p7a>oXDRWAjA6WSTk zUza;}KNlAN!13(aP^0}F#uV9BY4yRxput=-oh4fjRTJGg4qU~e?Z+cnjvg&UD9^*H zWK%Kk<5C(36iKB*Jw`Zde|;5znM%Gq+PPNJ%X9*a2_s6DLMppVk!tQDk*>&A&0c4Q z1U7*pog6@wj;=tcDk+mT*cGZ+N|`4tcQCElX~$3kdFE^;jEogQO-j-1FRI(+U!3eB zmIHIpV5;d=J0|0Q_hKIAPs^l@)seC`I_C(bDkW@;GSb*vTVWwbIn~K@+UM9;TsZnM%66?z~J}|+8s&qZ2>PK)pAoS+|q|qz@ zJXn%Wr=sE)X-LUxx;HX}wqh0$&dW@btDkn^ggMfRs~$vo2{|!4A}YP&JNh(`bQjlyq!S#g^mH z&rN9U=+uvAU2*<%K@Xq-y}%%Rf@`6^VSDg!`lGY38ueL==R~kqVg%|LW&{3Rjst5m2qTK|7D1s<5C#@tzc+bHt z%hl4sR1^4Fkq6;<41Ql&&{=qo07eM?2sqDjdf3jMt$l?5_PRDj5TJzRP$ib1HJ}A` z2DAP#cb8&rKivrf?lS);m>Lhn4S373TYnANs2@C^UN?XAoxy%qwU@S;a7^K}pD}1_ z)pAIfQ&lpjEC)&+6R+~_czUp$6?6ZnzuS0hSylcAY-i3=>*gIK;U#zs(si0Nt}WDOt}?$IV@-#od!s7;Mu3n6Twv-W!u5L`k4ZPRKCL@#s`9Bh~y_ zk6hkEHbwOY#1Y9cphXz5hdIH7_>>)dSIwJNwZx)h`l?p4){DB5bD)v)!g3{A4C_EK zaWKO)E^fiv$xbuaX^nT0X^pQ?XX^;ok)TLGktot4+QUc_8YD$b`HH!~GN|he%A#V7 z6?YmrzuJ-u-5`%Z>r3%(ioR2e&E?>vK`qSYO1AhWWvBl}b*gy!OPPps!@Dr>>#4>5 zCBy!{KL7Wg+t|X)#L3x-UP)3xR91wMi9_VCAO88=)oEV#Dt}N%XWOs58rQpvGy_eE z<3Jj$4Gn>Y1PG{v2oR7+C?|x+OdBDg$89&Q3BHR!lo3FgN5!c{!Q)iNq2VJGr>b!; zf-l#*{^I9yDWNaTUO8!E_TgHTn!R$P|Jm*4*3`_e4bh-CitN@Zt3*;tY!s zSpRvPnJvb#d@*u5ZP3NMAd)&x&Q=R+2d@@4g6zYptLZ|7F+Z%j1aI~3%+L(SY^G_U zK1Fuqa9Eg~T(Osh(f~GED^pXvM8k{cMsG>tj&$FpDDDgpgZVU*&_)Px^5d# zKZYcnsL=*Z7M5+Z#{%3Xf--TDCgEhdrCkMSLNuHXPTKw0$&-E7i+_S|`X{FJYw#^mByDJmD_E8V#)D-EWP`2~RiD56ryXP@_AwFck!Ait%Q(YQbB%-zk z!n&vJk-fBUZuZlDfQmKtpBN;mW5QGf;JWIWT`l~n zfOfuP<7%*{KzPgiU*M|@%A+#8DwWrw_&8zUJ`C^`l%Qb;K_t*#;puD|2SF}%+u*rj z&3tVs&1{T~>FKt4^DpV^12Tc>f~H_;>myTYc{qoDhtpy97k>DiG&#|wg}~^<=pXc% z+o+SRUFpsBqoK?~Xe*Ev8#yU2;*fZ^R|f zp$=HVW0(kf`-FGnXaOQ@5-ae0X)t7jXz`(gT>GVVi<%r&vb)vy+Vs({cM^7%05@wf6b34BZXkjgPAZO zQ<)2%3OvjEl52GGNuq^q;ajmRLBpj!b?L6YxAcW4Kts)P1XFCQ)Xoo)z0pG*YpcA?d6sqb7EE3@(X1s)ZQ8ju^8? z`Y@X~+kuN>mppS!?_yqitX3v8*c7yDfKXHFm6&C)mN4Vn)S+m#jj)}n%g!TBD^^xJ zWLDQF#_jW4#0-FBev}U@xR3V3`68!T%5}c$j~4HdFYbRUu0ZaJw^tv4(n?FwlvX;C zC@bo%F8U6tMt2_ImIRY3AnKxd@~*pVqU2Uyeql`?xs)M9dsSvN<|_29V;72w z`=Bm04y)dMrVMp%MjpY+C0;6^RV_)LfAS_kTTcU3KD6|x z71Vn}NeLGgA2ummU3PB=HSkkk0Fhq+wXKh!_0jTt5h5k6t+{u~L?~cme#Ur3z#CV$ z?IWOumGyzi8CS=64}(5fH>_J7=ZInz=kpd1xUc8n49A(=z=qjzcn|Jj!}%o*>e<{i zFT^wSu&ci}YC2EnTfyl%9cKvdWEKBtSpIndnF0xDKh=ANIXzLdxpPAbvDx33upm)E zOD5BIbW^y5qe52L$34Npw`gD9!7Rt{JWq(U*w7|M6{g3JXx?8+bdRD;^r(!}g8Fmr z=KRG~r*LqVG2n`<8KXY{*Hn_ip(Kq>MiQ5bATAzCP}-NEbSScZ2BB1Uq%3|ee*4`Z zE$JPYjPO$_Rd0fxt~0qh*P`%kufZe(Z4uw8vC$O| z=9wEJsPK(Lu{Fkw%-Z~sW=%q)%&xO^dDsj*;TZH`&vldh(T^ulDQ=7JuAQk@h8L>> z8a*8Ge0;Sdqtx|Dk8%X3u{g2I?DgBB&9B#Pvq%-wn6b^LecP!GvhBdw8TycKzOj0t z%qD{H2ynv7A5@+kMtIm;pPL8Mk_1(zG5O80BTc2e8bn`BqM6?K zm5f)WJ;klmx$9A{B7Uz|op3&MSD=!f=u1%cpl2sI@W)m@zDNtSc6(U~`!oI;EYlFp7In}T%I$VCcPcAcoQD(n748kK zgcv#%J2~jUvRj2JCs##0mc_hv{4;Fv)lke&^_H?mD&`b>>MeKN0^tn_F0n2+XRU@8uNI8A&&y3T9 z*9H)uc(p@(hJ`=(z4E_f!6>i((u#!-meKkJ(r>JTuSJX5dl(ScqLk8$ykVt9^9h~^ z?lq_^+k>k|P>pz4C8Hfu-ltimMKTC&1E@xh+>+g@YmxY%aSc7yNxpwu3IFPQNC2>j zE!Y<_18kF14#-YbHmQs2H9OD>=Sfycy2BVwr7x0wBJ59}R>?nb-wwswglqcv+ffo7 zxJv%&;3bUQu)e^Q9G2Rt`QS7ClX(z-{b-%|`hy=qD4Gn1r})FZbUvmt3HwTA*e=)M z`$%$Po31-PfZ}>Td))Sh_K>7Y^WlKM85~f4e@oB|0jRX^Qr!xEDi^&Cdu1k2p4n%3 z(B`i3@dH#4?g?fP5-yM5qEw^w7BwHFHtTpPZG^{~i{4VLFSrSCMaEiQ@1w0lKNmfs z@D{(_7U{(3F5%vCcw_L^KJCK4B6-R4Md>c&_SK%Fxk>oq>dyOy)1CW{s78T%Ev3bj zMniEMR{en`iKxZlx~Zxs>@~(4w8f3x%N%xmPO*pUHO(5n#mN zhr|C$J+jv!<*>GJ>29h`pG3uJh@$;aiD~9ZQ49Qnh$EQi#VA%`pbCg7U8oGGC=6Wx zU52d=GY&C5J=gE1SJ~%LZ#<^=7mc@TJ14ig8?K7z#^jkabmzZtiOCyNFeDRE%^8(4 z5E4Zb_Y^FHm~nv8B4ZOG6B5PC*y&YL8u?loQORTnegnQn^LMxNMgh#_ab#%uDewN6 zchF{NUriA#r5V1q(DOQ!#bdwB8PzkSUb^L;x8f2_RK*j^=Zk*$Y;FG2hZS|hb)~C! zzWg5SzU`~3A^dzvH^8fUxSZa8(tJU^lO5uf>i`{q8!g|O zQt&2lt?dcV5-*ub)l=~OY|yxM9hbcCc3;+^>BGEVu#sMhY?EmsPoRlpi7Ux>c-is( zruwuwDxL-smoXn&tURoKAR^^%8q7a!W+2GT$kJa~JN804fs-G$Xwy%9>mYo4-Qy(1 z3wvxX8?PA!4G#B;3-Ta<8Tx|4qj7gR)Yk3- zk1_-=om<#=3_8>$*{nLg-ukXcGTy*!0aZB|eZhq0%Z}&?zuuV(z(1?n#9igr7#VDl zmJW`RzH5Z@4$R&iWWqi2Pe0|x-ggk(eTdl!th{EM@onEk)l&u8)ZWmtLhgQDDiiib zb4~KsE*9pV5ezb>Js<6*P(h>=1rAzX9v-Yrr9)g@=JM9^Eh|I*P*$pXtg-s1QwlWU z8XB>%xgjye#c-_TMZL0!y61Izs{e-O0oS-esOADyLIqq(!*h6rl@U*j^q6ig=<~dY zW!m1t)CvfE5S&rnc183*K(zHSax-xPzkgQeOlRtn@gKR&db0qu*~G10bsuV1Cq2ya zN#rx+Nj<`=u+(OBJufLpvLox1a$Myp;Fk&HUcCH^OASt?tQh*zvc&o&?##4YW3O;y zxAbP(7Z{wm{~(wV`!svG)IgbBE$i8f=_rNq+G;mGA{%-AZ8KGCw;@|$y_a!VlC#Bm z=ef63w}FHf0^kIY2Cs1d*J*Q*JG-n?KLhco_1dl?to0?3LUxE*<~2bgKks*QWI_x@X|2jTc#zU<@ywyM0@-b=dI-?sUX8sE7ZJ=&KvH$i ziRuKg3H4{2Yg(IJRd2$6KoM+p4t##Ngzd}3EZqBRm@#P}c zaRgvf)b_BjU-pY)cQlgPdmKil%dxp{MOAo{j^vHoxg-Xkk&ueHu^W3svt(PG#6P=d zZ>_E|y1f{r`#Sa>)9oIdhO}ifO~?+Chra!5T8uZ6y{YQLZ0mfSmM_!x%73D*ogvXbZI>|#3C?{ddN>}? zu`iAs`At4lUMh-+_v8Cp?$u_ucghA4$fL-WH-QT8ThFwh3wKY?DPxx85^npav|OC74Nmki0kF@ke#WLu75hy-`$_OBR#s_jr}QyC|zuV<3kvK)n(tFlXu%>A^C zMhHr`cRrCa0XV7AJWJPLc#akwYb^G`0Co#+b%w(MOuAJ{EJGAaymLg|V_jR9OlDTX z6Y;L+!;zNHJgOR=;scK}o+Mp7P|Ui#9^zX{c}uyw$G>Cr-}~stlc+T~X_CVvtt;$S z|29A;W_xb5<~Mi&K5fD^Pj}U}8baUN3xi86Gi={HEz9YoZ_kJBiqfu$kL>Js6CZ!A zhR~*N=v(b89=md>**Cr}SlNo6q_JPpHMrj|JJ7>8Hl24FKVTW?S4|F%BI{vuf0MX; ztZ{52TVt!CW9_4~ctdhCU2#-wEls)h-7V*Y$yi$Q`h9p{wNG`LaZsG!&bc3;kI+Ax zH0c%B%6}TErPc7+?$IUA^f`0!?d`sf73!&t5-oV14%O>-~o2+mKUL)Gszr_G8d!2ltmb@>t5}W~m!12swS5em< zOSs#s;yFT0L@&tP8P`v*LJlnq6K8g8rrWN5Gc|5`RwikmJ`8pgtwZuBgC$ssE#xh2 zj@o``y&=X12UcMigygj%K^p6bvWv&x1v1wvCpD4N_nN*Jc>s#ND*0>Mk%haOhsE?%9F&ZTqQt)5x9$Qh)pAwsVea*)M89~; zP`f=Q<3I6~dlKuO^aCc?D#daZ`Hie>mGMqPVPJ%1_O9aSY~y%R!Oh^%MO~`r1dPfm zxf$IC>PLU1_rZZK#tLHa2$joIFzK*%p1pYI`jl?SOo-XjGn_n;H)W6$*WB1p-4|(_ zN$=HgeF;v?PtTmESuw*w(YAyJ;wdJ*c}@1`ZnM7`NQuXN_)CKaRgTZ*cIUz`n#J-q z8F3q@XsyJD9MJuWNy$5#-Hoso|B4sv*E@Q$zr!TAS~YI2earDUtG#F~-vqZ&@y2P? zR=wuUx&uT~MY>gdUq3!lz_NwW*ll~BtXzL8W~SiA!Qs_^zjf8yrEpnuqVHnbyyQ6_ zT#QK6%|Gl~32l8D)>G|$&9qq))pqM_8JrAFkzVQZ zRNwlSVx?OJnQZo8^>WPx;I|*@)^u#d7#V;hZ#0-l7+8{X?d{E?x4-6IJzOwexF4*Y z9$4ff9OM{lQobf@}%3TFKitvsq$z^sR@NPwzi@&pM!DVG-zbmWO;De1!98}!* zZgs&N>Q?PvVqtFuB@E(UXG=8Bg-Em)pHHWgxdt`9^z0cCpG;H~2;Trvp>(RjxxBE)_$!X-r>#uMeH{FOBFf2Yez#`}hl={~*eI z<=|>rJVy%3JbpK$oeBr>(Xhk(ZY199#Z% z-_H|{&#SDt4U3R~!*o*Dfn~n1fXc>=&d;WHbVN};sdIbf`ZLC?bjQs?3bhFgA4mkv z&U}wpuC54d(COWx_p)5c!VI^K-Zlce(_UIvqt&g090ALc`nlD(nc16j=<9OswFv)5 zjn)={{*g}}o0_Y-a%Afd3iDNhF5jJ5M9O!W(iINZEST6P&x%hA?rb>NWHym&N->rY z6wD1e)yJ#+Z^c}w+*1T!5s>`0J>xR@>+mrbKJvt^%O03`Zp>?Am$S*+HvzOck3E!o zKrO3JUf-N;AN;gLzJiZXoZOYZhE8!wOGX}bHDoOgHn&?Z&6{zv4xurit%&WqYoupu zZW|W24qcs3^T-n(I|Vd8O}K6{AQbm5{kErr_ouJf-u9l-@yqO{qxCE-xhT^!vdMa5 zdP^G|nyibb)BE5hjo!Vb^!$ancy7MMbBpdr=qr}s#nQ|ePhtm$|Me_*G|%z~#Vn_% zU30yo<#MSRMq0yrm(M|WADdp&?TBHfB7gg=eCvAA%#ZA1mgcLOXhMG#Xh~3@QuoYdn#`L!aZ%aUvPnP>T8gk1%A6p^>o%5M?M(-K3)_DX4Pa18G zqs{uvmDgM>7r^Fee%v;`)Hu5C>7Nl}#pLt#%YEz(CvJb=2}u%ijikCK%!W$z*Djsj ztds*-9(CjQ=A~>QaY^ee(_KR->e=LSfskwi6YJQoPy3P~ga9z!T>UP8xDtbZ>PW0r zC01!b)h^+~c^;ZG$}J2ZM5VfC;r)>^C2qw}j{Mf@>exkPRcks}QHG;~a(Z^4FTQzs zP$?5d2Ms^h7MQryI7I&(-KZ})lfUC{|AM?s)RfI}fvmN2G7?=G#3QOd+r!HA)c?Y~ zw(5V$ncg?aKS3*lv(<)D@PkgOi_KdUSk$@A*IAUX0rvsU)~n?@rvL4o+Q|~PsQoW{ z8e+aAzUvGxjI6{kpL48M57OjydDsg6m31IeL?~v|k|AK!{u34w(Q)K=ZnmJ})5di~;FH&45%WqR;_m&};Z2I6Aay@`=gV5b zxy%Ybi~4QYcHPJi`VYNhoVkwz&OS#M34>OmA=(?~ska4h9_fYrS-l&hLwJj0|ErGX z3(%oXsD7`&&Z@DFp{M`!K{^uj`zx)Vx+FPGs`Tp%Dp?w>D_h!2KTH;ymCE0)nscah zq6eVvOw%d6Pvyh&kYx|_U>U)i;|^Jhk-+j}q9U>Glwt^mG|kkpYnruJ$W2O-3ArYfgMbUY!nqOuB35@6mP ziifw?yaGUp`#qJ0t9p&gQVzE1t;KcuZ0uvbFI1S^dRxbr4*)Kz&6)LPqXFdB9xnZ8 zYoCYboId~DeUDubx7#{*d^+86y@1Xn1s?kzTFVBLUVJ2|TbJktZI$XEtv%D*AZM*v z#a%N#?opd1=uZ9dMp_7nBy+IsaI@`(SM)i_a<0JE1ZM)sDz@#^9U&Ll+=x3|X=Ve4 zgDq_c2p9LbtQ`2diP?LHptryOYn5cBXsLfk{i3KkdF&HZkuH0^j=vRaQ>5#;fk?2! z_e}@Mvlbjy(UvHIwPq)uT4k`Sj?OTdPC5;WU)bN+JHvxJ*jOe%w}J$O`diP1o0`Y> znMKKqEf}R%XDXz*Mfl9nl-Kb0&boP%O6a@lO+lW;SJEVe#4LG3J7xI2B>?{Iq2bzd z!kSG=8{dAoN0$w4)wM^o?I57hTo2vn=piDQN{YWbyW#y`!A-%vrpO6|D;qsVEv{92 z_w6=9Y5KZr_r&mv#Kb=GRJN*mcTWf(nv>j>uF}7xe=2M{S@`6*P?@*2s6C2_T9MFo zvi3Ld((#c}$%>UNJ6XN`9oGj3J-U5AkYgTHvmeWj(=f50Jj6#^n$;!y?Jurg!yA36E)4H+1aE@oEEfZFEe5`^nNf;ebwW&@6n7RzY9|u7HmDVa$ZTlgAY4l&+gahgL9+f z8|fGtF~2Ll9`dLjTarAd(>PwZ4U(df@#3Vnh1;A!LOWp5N<>SXz#D$NX~=fY$|G&# zw|7%gtLIj&*fmhVROj`$64ZBGld6BHypuH^)o@(b zR*+v;p0^{7{bjD`&tI#jESLS$(`jE#19@_fkf1!*RUgXAjm6?G_d;<*9P!ipW8}2< z`Ok^n%iz)}Yn#CqLz4HLWF_m6;_I3uEXoYJK>b4|2vif{#=-5_-U97&9UmO2K zk&eo{4~E6$g24!gb!VTPZuW;=jd3X51NWoL5jlNjrV+M9<^=GBV z*;gGJhnf=pBS-V1(JH5~Bc zdY->QMFhNwqW#Lj&YlF8o>Km-B5Q?EX2Y(*Z{8`LWjX9uurD=GZmNbcsDZmwSx6%N-?_Rh2ThRs8@F?Ju*7jhkB?(w5{3XeE$ zlCXdFJ-^Mhq_WFp;rU+D`{Oq;hW6 zZ??$ba}N0`ZFIJ^;kkH3X+HjxKg4El)}@zSAbn@1h#9Tt_N=(Y{lhJtz6a@X-$_vM$PyxhdCnr6>P<`}5nNH=T~xNd!S(tqH&k7g?sMSx!U89P+lsaX{|%$1Js4YjQ0PiX0qUalVN z5YnX(%uD$JSRUj#)SS*GSCa|W;fY}jkp-PWU%`*W&;i&YA#EcWimhEawnGPo>f1lI zbaVV@D5FBId1ems-kbksNl$(>BVT)U4-VFn5B{`Suj-Mooe=Fiyzo?{<7Rz<)PGEE zMT#WAhjHX$%O*H5%7Q55QbS_-SmePjVe75PN~(Fm$+EqCL3Yp}f$Lb=JlXM{re#WV z**i`EDP(rvXp_5LEh+`m$mOlFc5mESBg%R78a$NcokI|DIM+C+f9!+J>MKr!rEBvk z4UA0&`6RZYTL(1B6_BK^Ml_;@9sw_v?f zVcWq#sK4a>MLH;0(ZfG}dy|HXDX;p?W)#4C*`&{x#LLI%kX#YU2g(JX z@=N{2>Xg+bLZ#)tj*Gk=s&c400!wsjduOI&3BYT4~eB^pXOaw2j^Xa=0n;1)ja7w zF5C~U*>{=Sdapt)Fzjqu_SU@OF)Zd(wfZh&ax634uYznzI8_J}kBna0=CuxtqbnZ0 zw_=`bh+5|L(nU8Ug71^Yoj6pSD}VXb_A(oA9!7=*w;$8Q6>(p;0u%J26@t}!a(@Gd zFVu=N{DXP&HGB@@N>$;Uh)DEDqI;mNQT069j-S{JS>|^Kqu#IJCvvm{ zN)N85uEU zzCj4ibqe_mi{!M*&h)qxfa7IFidPrN#%z*^XeVuDWKocNeGMiuSR& zD|+uxUpje`V`;U$vRv!N{#Zx$Q`4UO%F2gL>c&<;_)td&ukDDZz-4{h{?PFbHyBo~ z%#mOV%u!vD_vRboh>BBC_FE{0N!o2_pR?p+apsduW&gn_hiTw~LAJh-GTq2L&oK)> z2iwbtWb_k;+-etBKBLM9MO8OPiTK5CIiR)cY14Rvb{72DbisqKJ@W>#=Rrd1I0U4P zn9Rl7?s6aY31@3YhuB-pF;+M4^0(j?K6W}JkqG}^vSMOE-Rb$8lToS8#a! z{dgL)&!&(UbF|d&f%^->q76OOT#yi$prk|&YNw!9+#Gf6;j}zD{gJucq`(b;--@Re z4en9$dH+X?wu*|ftqyeeHM8$6pV!{ERk?JyT+SLF=x{=b497?vtUwFvok$OijLO~Y zp_lT*URn{q>y3{=W;TV`{&73IJ*&j-;92jR3F9|-l70R83xN0rbET_)+kM*GhI1^F z-hi6njMZ0zI=!&vpG+hka3%fwu7F{Bx=1^@Icj{jT}upxAP>D?JH;q9%!2r93O8&JWZUAe;ILymb2}zHLA5kx-4OzZXW0T{J2n??eQldQT3Vy+LezG7P5PRPB%8k` zIth5a^S~C#P#cd@FqiYA$`GzIkRQ?2r9~*q6W9$OYBk9u-tjlxrCK^>?Yd4TE!p}U z)h=SApFvJ)EaR7chD-=DN=zPEzhUPys|(%tq2 zyFUi4djD;|VEtb0&1`wFIUZPNuJHQ|M}OHxZY5jC&aBNCWij^DjZ?papHNK>y;<6( zGl#e=dfm?Q6=vyP&wk5#YwyAwpnuvU8A$xpy9w)!RQ`m0f0_zBY3GHBmA*iRn+Yn+ zK0zzK+?$|kZ#e^qWPf|htJIBE*ox^tVY=7hNxR{JZIUE8sxax+hS|G#n@LZV@(dJN zIEX!m;H?e9RYltAVR!h%Ie9J11sL`SLbrU^Vvg*bL;HY}%hqdlegJ4bQ>eBN?g!M9 zDzWfl&X|o*B+3^fvrT)07Z@vtHI}&4cSYNS96BRarRb6-8)8H zHA62x8EuCFQ1#O~|jWAvWlX zwnfb0^e+oOTaj^l`V-j^&nbW}EDwRlz2rbZhMug-cHvB*>|$VS#$)FZMWw2pfPCEH z!(|sj4hT6?z_ifzQ*mzPeZ7j=7UFHPqE-k2M$*6Vk<9k~Fw=Cve~7jnQoK1Nz$)Ws zChe%nY*K)&RMD3o@>dR6yg#!r^juPcu8j=8zJQFrlYojmoTPjbn>0hPiy0~|b@N4W zcp$UAkfkdk+)ZrQFVDE;Wsy$t-@bDlPQi7Vu{YXVj%6m zro_#s28+}-)^}H@9H+rKW;BkGX3Q&eY#jfp>kH01DtKTTlb8GzCHrNP&tXB-E)J_c z2m5lWkURMo4!Q(uHpx*;!Nnj!TERjgK-$J9LzQ&=*NhD=9Y~5I4xyM3S!6(&kpFCQNM>AcP*ey(mNzl}tH5&nSAHa=Zc<`uTvGT5 zWg2v1|NP6mU!)w18?!Zj4Cj;IYj zxx5u{e@oGe(DyT53UE)KSQ(#+s2w^-MgL+Rk{3HkriRqqtrVaBTGEj}qB}34xKDYZ z822)EiD2YQPb{daTpUluY#ZCeFeaG)qj*F+YJqOdWZZ~uti$N)bhDfd97iq2@EjvX zHi_ML+?v-XSw z{W=v!)ox!F!m4HY(0CdYOGPf`T*vC@GyCD^0Yn#^qmZV~q*zxFZc$toV@RcPd(ETuuTz5NkHfGU7MG7w*zjudCvc zIE^Fv8^=cR8@jkG;A?`YnpIKYU;a$^a-2ADMQkj8S54BKxY@C1}v zMVQGr-zdV`9ZMVYeFC9eB!!`j*}L7XoYR9+pevAaiP51-A{BM=EI2~fzT;!z!UPea_AnC)~}d~d8dle!cw z#H3*h&HP<>V)?Bg+=8S!|7Y$^Z6+9i41Vi7M-p#hsEr@^cna|STwvn^Cn~$DwMzCp zI3{5zjwnlD!;xaJm}EM?352C^mZIW;q)Bn;5JGFJd8UzbRymrY2xUh5Ly&`n%CxsB zMyN=ssD80|^NSFd^?~sBto>Wr6Pa8`jWeRREsi1Hz3Ar;d zkq4W^qfASWyxMxHF4Yf*em-U%m^0ta2$^_oSyr+bD!`143EQ6fyVxV=pkQCNG;el@ zFfj{3(HsONftX#j`Tf*lgE=q0FeYN0ev{5J@6R%h$k*hoS+@S0r$_|Is1Se5hb|uR zt(&f^{E;tnKRfe_sqkTzQrl-nEN&ZVz9(uy{=7HU8Av)qT}Yg!VS%D3T5X{6=^R`A zsTjL-LUX#U5xdmDzL-!!zw4{YA6IeXc{48;)LZ%Uy%lc2_uo(nS51=o*8O)!8TnHa zaueQifM?xPj1 z;Y)@8v6k|^r~D@2pO42K%F%x-t@T#SdYFGN|1U3f_{#dw6$7+N!8~Pfo?p3@aW|S$ z9vq}}G=%4#G+V^mc~4yCLbi~0;S?bNf$?xNX7 z+lnjcfD@Y+p>CrdIo5LI6QB8-NjlCr^ZY{fm>5(4X+8IjFy*|^ zh6s>b3!-*#Lx{3@cPAb&PgHKb;n%OCpIefDc_BJ9QZ`>(;!4TK6f|})DM9S&lonte zU$fWPcaPjruk#yB(;5&Y;-VqzM@2N%MndcJoa;r1Wz_=fcoq|4 z8^}X^OIESl%jlKD!20zhq>U7dnKQY^D%!)bGx`21UW}<9av$o0y*)_#pIu-FMyG!f zvB@WX@4#AFQlVvYg+9jk6vsQ>@q3%6yJr*o*lO1{|SPFnXerJ_aQ8T9C!a@A_W4L2e|OvVnY zU+NT3wXr+XNvJ=ZT$Q?!nNJ9kpl~CuQt8K|E`y;6Lax#&#?zxqyw-S?kjLd%QzDGs zJ~)VYBpM&e^MI**G|VS_d=_w@Be6fOzuwFA55E4*(yMMAP2qjcFo_GoVd^!bl3Iria{NQ{s;{tlrax3&< z;^fGJY%xRuePRVj3Mt_VnBa6VME*IQA_+MsBA6qIC5ym>Tg2cg z9E3EGgloj8@)#GsjD0Y@U6GLz7R)&-MZ-6F*zt)KJe3bg2_PC%@1r;?;dVNT6)QsQi?Lxp&PUx$qG zv~dpYVp!tpRP%yGT14}t3d`XjdZ20q2nMJc4x#|6Mmm)z{qrR?-b~D+GVV;wqci?M ztW9(X6qKSDV$7zUpM90bEbI1=>;&px= zvc~KDI&_KGAwEQk*C9KUiLXg^NEKTVZ`UkR6>k?US`lkkE&BH;Tf`>Tu3L0o%>8pd zvxu8wK3ahQ^^^<2oMlB6Ar=w&P0MZfOKIXNFZIrzcw;-;UEkkT_lJFSQ`dH1lC4?Xn?ih zAbenLB!~xS8wP>^+D3p#fVSZvG@xxHhzWQd27(7(M}Vk+*Wpf$Nl(JB)ky%M*X|^M z@M~dGtk7#?QmpW6Ws+!h2)Ejky5c29pjmT4>ArSkS`)CB`H^^q&g{ASVVQ4j<}HSP&J+* z=`M2=Tk=KQNUG?ah|xsh6FnVC;S&`H9;hiaOlgHy{HUo{qWm8Q1wX0hk3&r#2x(H+ zhk%*Z56+~f_dgM&#!MRmZ&cI6gr79{}0%QhmuAD?kJ=e12c)@&p}Kt`u!;EzXOWvJ?wxxR{y7|=^?>S>ict0(}zMH z)%D?FrVWBS{tpD9sOk0m!Qc_p^!mUdFtO|U{2>4TAQbGdzTe-Wi0P62{b3M<^nQXv z{Lg`o!uz;U(#XN@h4gY@Cei%eiRop(|2IHM@W@`sBhCM``aW*Vv=Q)oH9Z3ONke~k zYWi5nqyK>*wVppDb)6q1W?dgRrdl63yqX>u{C@-d2@Wr$=MO`T><>v?_xn3$SRXiw z+W!Gzs7b&l!ulAA>!SX*r@#DJ&NRQQ)nB2FnwP&i^T?v|Es{7iG#&AH05m|059p)* zFX;a&NyV2iLfZ9D1DvAr|0NRU{@)S_D~j~-vO=$^(_j+qGVeA(-Esj(g zY>+T2SzKKRDG@~^GE5W^N;riHW4aU>8IwL^zu!0+g>!ktazWeANPYPU1DJpyX)u(^ zmfRE-%caLkGfmBkk5~0-5TC71$hViCmZP_A-fzlmfI>RGQ_G5eiTCI0*2j6aLH~$tapSsv2nm8HPE5W3 z0d@EAO-GuS?zTt0*~Ox$&_=xN4rXqvcb#%nuB(-Q8T-zCml~V-5@!8E^9_&va)V)a zoGYE&pF9*x&OeBcoiUMOBQ)~$`-NLOk%)vDnnQDl$A$X<+yK!bU9OTH5)VA@*C1>o z->WF>$CufZln^4+cqleoJA;p0D%DUJf*@C}bZa{p=>3y& ze*X1~vuEvH*4{vVVu!|QK!6-WB1ePUTSNV&nsnhviY_-lP9drpxF@H$h#N6|zs&Xq zDI-=Qa2ADvK!PK}5M_cr7&k+oqK^l2B&hZ+B?wbi8u6$Roe>L4u-`0RfY@`CyDJ^F z=8Qw1l&m70_er(Q9* z0x7utD#M$GvS-3>33X;v64pBw3rSiQxAikyi|}zPgp@9alAD*?PTao|ZUeCE59TaE zbB~F2-X#H_L+X|?Fl=Ru??q{8gFRhydhH&vpif)-Alg011zDvA@BJWhW^KH86gK0l z9p|{-Xqn{55#`d6t#Pp^B+pfCc5O3C(-vE3+7ZdpBb52;3wU0`z2m}F(UcS7SSl=}p5QNcxj z>|m6>34VsP_9!;qd~xKZo}7^@ojV|*#Fvf-tCp65Rh-??&d&GPosnn+DF!Gh4u>)9H=P(Z^2#1a87%5Sgu=FcZ#;FY z)w?*gAs?#NzOSf`R(j$^?Q~u${w)r>dEj?y*T@G0HH+Ud(LuZ=?y7GzZwz&c!^odn zww%2n18cvWl{&U4LPjuUZFDp@FM>%>ZEbYOP#=xz{^yC6AaR`{T+|bHjiGE{s!w6W zN8*SLXr1IRx8fxM)uGRaKQHGnOFy2c)sb=c6S0(`ZHjzeEJLKwjMb!7faJH~!v`ql z#p)uo_%KdxxhX*92N!P1OnA^mJ(bO36&;2XY(yBeF~*j6dqv92fN{l&Q(?yMO7rOa z^%&)8e)Sm3q?Bcar1(Y+WvxPw`C#LW<%a!)_J{eG2;vy*oFs(UPH;hiL+P-z5^JH| zr+60zCx}rvYBKn#qDnJNV|mzUk+_IaLC3PBBZc&<60Rc&ZYg6Yz*c3aj))}+GX?@F zh(zoH8Imzo;S`1oXyw*6MJ0$o}C_lby&WVh95Md2JQY79A z%GwT?q%G(;5$AGg0ORf0LfOD$$3({Rwr zScxA8wIHBUzS;G}xTN#Pj+`F>YXNSaDCmUJ3k+M6%deK>o1=U;QtQRk5^3%JdV;x@ zI%D>^#N%E?f=mtYbUz{ir;NO{j~_W$2FY`zv0jNi*tEHzN#}WD=tedVeOKYafOO3+ zhb8M|n>~vbZw74CoArG{_(+sw>TKn(NR=D<7Nt^ogBNv8ieKYA%zg1`mAHHL zj5}w2rpYhw)s5Lu9oaQeEPY2(5%nf$NO;TyCwJdDAs$ue8JcGdN`9$$w%8wY;LxPaI2HviV-cLr~? zbMl)SM#IiC5&R98Unl&tBrNmc3U9@Oruz@o-%2VL2s2ct}8xq2^sIJSSpr&nK;|v?Pf3FymMaK#hee8Q81pe1Fn& zO8NDvgFzR!{v+zOtfr9a_{BgS@h5_88C?w5rEd_N8G7{)Cd6u3_)kij|45^JtK}*# z?id^fqn~%(M3-1R5`Qd13jycCK3izEaEKQMycem=5%)v4{E2VIELC%EsGaz@)gX8` zd{HB+qe1TF0||a%N@sm^Q$jB@Bhn zi#BgbYjT#07;D801&9kx4|#2|{uKh^gg<6RyzYphvD3mTxT3$Q z^->)L?z<7p@6b!oVic#_bM4wMLjCZfA2#n+qI$kw-&aO1da_t=lB9YLKMHZmk`TFe z$TAs`F~KBP{;@5@C&c{Lr7#IsFEEh<)|+=EfAgmTFn^nEx~?ZJlKTqD_*6@24|coJ{_a>)jVFTirIBM9S2a#v&4!7>+bgS;X(hYlE;tK-#53F)2hJk#?{BjdbgE|kmjLPv4-A15$w(5brlIXyS zNB{J=X@gymQUYh);pEC1z)t*42>Nx1W+cdso=RN;{62mj2zubQBg75LC4~W6lgt_v za!6;COb2W+zS=|Vf-pnR--GAP?^H?$j*#FQ1gM8gr5q3HKZNf=b|G*o>_Fy{nSzW> zM(<(1qcG~y1Hz+qgosUO0U90;?Sa12Fbb*!!;oQg%C7{$kS28cSNU{N1l;~exQXd{ z0_L!M-?lIKpL#&7l<%(iC$)MC_5W56{QvPRWo2RduO&f|j;|N)Vv?X_0d`DbJXSW| zSCi+2-F_HA$vvzDBstFg=(XFT2Mip1Jz{?B%c!) zfmvq(3Eu!1|3pCkr)j}7%N#9E4=28r&s?743tjt_&tRVGM*-GG zozt$NEn5MxxY(C(fxcuuNA_1!@qfN|vbW#b1u*$egG-S7&V4xC95 zM5mW9U`-F@@;dlg`Lg#%n4H0ehiI|1`$kkGc(4Hf;w!MEnd_tD52GuIlsT1;HU1rE zUJ&AmA@SUY`T<~rqBtE(N^GNeU7>=u{D_x11z7&l+K*0C)JDB&@hJ)5(d9`5S-Ha9vp>e+3l5st+q4X?F4=q-18 z>krS-E>Rx7g=Wu!#?C_9i>qSy9uTcIAvqf7t>O z8R2GK1oqS@9VfTbRGkvoI|_EFS9j!=%jWWdIAx|&uc~NKR=2&i3rx|~6Sm;A9_3=Op zfLD-9HEii{Q3%8EkZBE#xJYO)xv-PcVxO9sp_A%I>w)4ka53~^?pQ-F0a0HsY5vRY z`RyMcpRtPp4Ph)53_K#k)aTQVjcs9u2uED`5<&`Xyt;AhFoNz<^m7i2<7?Dj%n9{9 zO%CzXt~wWo-*A7alUUyC2bJ$^NgQDIzk)UacHZXG}LF*m|s z$s&+MdeWqjdg1{GctzcEwkfukFjbv8wwgBfB}>(FYYbJL61JnyGVK!B`@A$*5rNEfs&OuUa8z^@ zs|MbT1F2Ei>rP27M{lid2(->y_3!Gi)*G-VWIg%C;W5;=rzv-)v3(nu5O*3jjdgMHD z9Bbfya``qGc_-2hF<2fg_&JO%MH?m{c>2fLX?xo;&*Fmm)|^MLvr!qvT!T~}R?W_& z6MHnCmLI|tILbJ@-bN&;q-IUX4twd?T;`;X?j&`(iqMs_+$DhLInFDi#%kER-6m=EWC;aDe2~lryLz9 zbL~Nn@VC>Mjr4=mnH6+XIMl*`1j{0nNNadZh^a49h-pklh-nB$s5ZMOz)3*%YX>Cx ztv8hJHYAGb5*1IJYZ=>I+4Tu*q%y|kGaOmb|86^sbXh4&C1eN4YlkQXA>Q>m49mC` z?kaCX5YFC-k+?JN?!uqupQO}uL83mQDic0ASlmfobC8vU>mxpn0i^G!^@@)bx&^Ew z8wYk0=8(sgARB8^T$4R=O4=cTn0yuR(75iU4_%ln5J#x*)sip0uhQOq-Z+ z3f13v9<&75g9U`ak9PM}U8@NTpZq#dewxqlYo)MLb-wFMsB(+hz3yrI6||9%+4{QDN^uTRzwqXPKTUS(#qTnJP48*Tbd;Lrp*$E88eaFB)X(5x&AMN6SXEO~-j zktDqo@s@bmx|Ob~19*L|{+W#q0WhES2Z_*>pmS*I>J%F0TQ^6K z9i*4FOXZ8{Zkjjek1KemVI*!guZ`zhFycO%bKbsQ0F7iv>Q^Cq(Iz*E5h14-#r2e= z^&k}Vc}tHHI}7Oj38npzwI z&#i7?NkWFg>wMn9fLimn7%PstQci#w)iE?d6+21FvpC6IJx|Ur*c#{VL}inP)zy%$ zimu`=60>(teX0k~$XmXWqgG8VpPuSShGL$bQZ2aGE+p~?x7tFH4{HiKRMY-^YUQI) z;MK#Svqq>TOHyxz(qKD`aS!XLh#s(I+p8F@_hCCDu&tl!lIS;=FSoXo?~&NllTQ{e zoUPSJa7TA!6Umj9#iZqu0aA0)-J2zYxY(syS~k3Hm|5lsp>RZf%l;#(WP=-8c_pg^TV>>83v2!If}Lu3FviBR)G`H3@R?` z;)&>++oe=Ht?O3rakb}6REcAPRiQC?m43$lVQ$rAL(vom)tHL%lq+=Yn`w(Ng(}V> zwdZCU^{tw!X^JszD-N&5SAf*Wrc~7Bu17U8CJRs5S8ZN@*>sTWRw+WuWyEQWch=R( zr{m(e+mB~;Su@Vsyh5;EDjtDJvXSZJ$Ajxj+p={a3$e~%SzE3RH?KO7$>)%rDNk2g zTl$$at@UnsxAm2s3Ny3AXszRKsU*Z{5c-KBzzuj%@$*6Kyj9^?np6zi!eiK~*}Kr&t? zs}FL?+bpA{k;BKB);u*14vo9*EjV;Ca%6cmtzUG=4dY*yBh$^^(Bv#)mY?bsfBrKp zWxaWU-$-`K3=_g-3(hMf$I@m89Kuexk!Uivk>m6-6~=gi@Hp@uzrYC^L<}c-7Q5S##Lr!_p5l=_1>Y70ka0B79g5iU)G|F+VEmmhvyYMOC-b8OONyJGNj4a&pI z(Z%rCfAK@u+F84Z{T-u=T0x38UllSb9eyg)>&qOS(T(88HtC>MM!8V3N>BT!hxU9? zp43Ki2-EIZRGraNC#!kpV`A-bE5rZxpxCgkc_vdx-yU349S2nJt9AB9P5(H)l8E*% zRlrhF2;Ei`WjR2rFCnL+W_y^&AG${A`@N?hu?O@z5Ki#7ju)oM4XGBGU>JoLqRuYm z46tA*`VH#}@bNCw2VQo#VUJ+{caP)^u*9yY9z5YL(gzA*kl`-%3;P%DM@>k`Hdp#? zOYHgXH(tUG?=Upj@HQ!rfCyv@5Vr#=4*>cAV5z*bC4~7*961$w;_;L}48ZK15)>VM zg?P*CmJsa50`()*xLtQ92texpkgnYCjza!w!9r&kPMryV>@&z@bFP*fLSa8bx{G=?*T}%JaotUNIT$8idPk6tpgU zvU#*l?yz?zcUF>nAvL`9;$) z+l}IQhqycWHGGTlt=+Nso#UmOi{psswu>LM*-Cl?Rt&n`C%03Q3hx);?JaPX%(+JZ z_}zau&qdN52L5WPRSC0iwP^Ff06{n~4W_vJ zwZrSB*@TIxR&rzXh`^`z3+=jEAVziZdWWAKg`iq`x04;aqvpuCqx%T=MQF0!i|n8u zQk3>4Pl;0igJx$xujJ;>jP{4$3FV8KJyK5j<$!4uH=n_~_J_zNwO`v46hj zB-6Xw;syhbk_!73@tU`K2YCLJcQr3Q2lh4r5sp-tgWNp33NzHa^?7eZAcyaxE}RpkiDTP zN-0I?To9gArr~Kx48x?)ykE{m<9eGG?&oOU6YVpatT12!q?t@?bas5m7%+BZL+W568F1yU8{9Bt zNn?m`;XHMgmN^^WmH8$6MK{`pDm_&l`tqix=6X8zrZs|g!ONz@rS!*hV&ADl(^QG> zZAVW3?&~erE5P%|^!XNdhl__IBvAD4evVYg0EIw6?QmGXfk_VWlQs^Il~-)ovHcCm zM`-CU4X^m-FZC<7uZVTUepxpk#+nR{h+9?2=Iw#yYwv5iWf$6%_y==;x7#I*{I4NF z@3PKFM1q+YhJfAGgq83wQk`t&`Pl>vn@RW}`FDUhv!Q ze&+ghR~2)+r>Kb`jZn~!DJRG8`3tqL2aKt?o$rUhxGT$^dVhIphx}=B zbl9p2JWpqJ#%((UTqKQ z;uuUcxMe0B*?B5<^r!RR&qhr6=#R49x%>fDojh{kiUn$+QW}X=9cM@oivSXw7{y+? zuNFEF6T8~E9D*9;PQZdO=HOqlw>Uaem;K^B4Nz8Z1GYEo``puvyhJ(Ju1VgTWdIK|+74*ea3*yr>(f(_ z!Sg0#jo=7Hx|qWZ zBmKC-97P0B`Z-Cv>B0`BR|-gKWhFO-m-qb^^IY5!N1y?zNn8FV)oZad@VD7 zJdSK5^>0H_OPNmYd7)OL?c)@LFU=!N6j)EMcmxeL;JzT#eOlnn3*|o}4x81AQdp(_ z);&qP;(_W8(siaNYQdHXfMm%APrVv-fTS*Gf2aQI86?+G4~v$*sGmD$w+XJ1Nw*;i zs*JBF3L^Ng=FALv!Vr#~4HbasifHPO|!;*IKc422*f*FF{UC9TPGP z69%dgghc2C_Dm>tj3oA&b53m?+>+@Zt(%R{8{PgP@~{|DaGAR$1~e8e*{d7`>E&vA zOgWhV`<}6;L;jnzRJ=eDIW^?sQn2$HG*nhn3Ubi`3b;^sExH#}5yV{J4v~uPw6(%hH4@i2^rMHU^T+RJ>{C7IuP0p6ox?BI=XVO@)B7?GflHx(Z3cL|&_r<{ zCJvi z>K*b7H%k3SXRd8r+vqB$7rWmvPXbuV1Cm>EgE_Lv0+DRo^P!_Ai+-a3JWz?Qy zORvV^)~ggCb-K>*F5gWXbqm(2lrNV`Ju33_^C^mCeL?u4VLZ+VXVkG2TZ}-GzQt(X zng0#%I=8VDdW+(bZQ_KVUqKg3 zE~D%@Z}KykpX<2rRrBib_Pf)6cGRMsB3sm=jYdrvkLKX1YK`3tTGWz+lTJEO#{!C5 z(W3cOwUl`afBNY!q0Q2&SNEJ{eeXC`msNg#3PM?B zmszHwX!U3~L5r32En;P%J2uc#V2)u__3F#}7K|g!iny6p-HWJesj_HT%_0xgi+kKu zt2w}n(WW?ti`LTSL!!PVM-Z~wgbLA06taj^%4JI&kf?1TK2wYvf14h_ty;mTT2KA0 zqfM-%{oq?euV-dLJ=Ls(_lMU_16|STj{SDV57y&~t{OuA7=E$0qlz_Y_kh!l+IIrk zGRE67*S;ahfD5pM-TBpwB4C8OBialpU^2W*c%l2UG6ySAchFaoJif~+izLvp0ry>R z7s5!#*q@S&>J+KFv&{$FwU@ACD?s?wUlTO%$M4s_z6&P^B6w4?BPkt{Q;5e!JNa9I zx<^Q-KlK5rL5h)u;nx6JS;A<26txSm>S0Biy1^96fp41p)~L!sh+KkVof>&s5%p?i zib~&H5>Im8#t2IiePzoX$a#U^2!j%jw&CI+-Wk`Cnk8#WTjrzcwK3>I44v%e5JWle zDp6AiVDXn-s?T5ZieV@JoERkeB{8Li&lyR#5f*lNiFWde>mG$!ht&nrn?$P?m4%R6 z*+yOLGujmc4b%0(T>XRH({GUf2x#lnXMNu=KtO_+|MiuP8BZtk^RWK^zW?<=9V-{x ze|u=FO*^7$B7GTTHlYp|Q^25EDai*d2&UTwi%N~e{mW@qHEmyM1ygG}f3#@0w7^_F zmr>i`CJJiRuu)8E%`KPG79t{U?ZbwKz9oDxXbNv;J-3g@m$B!5$+(`Jnt0!u@b!Nh z?jHska$=4qO|?ip?X|;lo_Iv@!yCe$VAVC!GSf2Ave4RXrK2=2I*#l5{wRCsmo59! zXJL1K6qjmiqF{(M@c*oCRQx(TtnpncCgW!<{Qk+pkZY@J^0D9V>*}1V7?EncU7uXn zqo*|A+}IuNPVqlb7x=x1B!C>jaM&=ObcPvvXwsaHisXGqzos#+OjlBzYELgjiG>a| zg_XQJ0S$&SnlAL5zc~Z8MU9oLVduEiWT9S`ad67GQf{)8Slny7y?SYfMISU8+@`H* z?yj$H)?PO5-fmx}saABDnqJ9Kqvv44w;oN}@Uw978`YJEm80C^NLhrDBr3L@ z>L^>6?_XV^qsbt%C5or>EAlHCDKHEo={w~%b-ZRa`wb(0qY7El;q^#Pc$8ja@#y4v$#ID{9Ori6!t+`l;x@7 zKldSCo#uD7;tps<-?aKT74hDhzGeTc{MU857{+v*9)c7K?!eS2q%?m_elrNYhkvWr zByvZAQ35RCdT{@^FZMn;MP+AK0`Z{f^AX7(=8GXu{|q_DHdiXqR*)U@NmpN5on3gS zmUPIJ{GSWH7a?!x`IG300`Y&l;Qu>?T+_pm(eA(A@v1avuf#>b@HVS21!!i1 z8Pcd&2$2FsPc3-xZzyPBkRUOXULYKb1Zftg(chzFC~8Wg3pVfCs?y9pCHs)Kk`d_H&1&wAa%yZ zm_Ou%R~u-LH5QiA;Bj9HbcACE7b)q|^~dcuf?Y5)Cj|03s_T7}MdjVqKl9H*lN!pE zDDS{lZN|$L(af}Cf$0wSx!H46QMD-QloaoW=}NTILl;bK`D*l!htvEgH8&AdA*_(z+VR<>qv&g{gCje%v+ zi)UuAqQW&@K@t=sW{UG&t~z+o62;aFMpaUG7`1}26NfXDcnfLP2(%X#m$0N4LUBx~ zM$03^MeE4(#1ii<@`^GnmnK=ykEGr23)`Z!i+d-PKYC1b>)BygOEg2*ar%3mT)EJq zDRqKlYPmL05!@+E+NIg%t@0;Tj&=6KGtljZCrB;=n4}1m+ZG% zioPB6IFY>y0p`FMQv~+cCnlN{ZQx07--sFwqL9O=v&mMzBXp=_x+J68br@)ry6YIB zYdb@D0m6&rN}g0$uuUyswh4c%d|`|Epy*?2Yzodvd_s+~8>j`s-}~oYQ&Oy>s+^mb zfvX%GhQLtbr=Vc!c~Nei3L9J%*f65llG1KX{lLfRWG>*+Y-}NmCqRq!d`K+1=Li6HqhZ&_HLZJ;jni!?z$`;$?+kX}WNf z=bc$@mNs1(lq zJ?HkGO>BCji ze#DoML~)#yv_QFG>wqO;eDX`< zzwhN z^_)3Nf8n~$zY4HTp=*bdi4A8~5P|iztOIKJ18apkZ~Lx>;uTPXjCfBk{1M)k`P_}b z>2R5ve%tAL9?!X*^h-7}&K>vSs2Gtn+>!N?1u8WwYeh`lP;Dx=!l;-&JGe&0GUe2e zKvlgZM$qyw4fm<4iuKy&dDwqAPFpO;{6HaF1d=T!|7 zZaYy%yQfud{>=HYg%S`vY*Z^ykqWe>~&u zkifM-q;53g0NOr3M4j%)n=dHiPt-{aZ8hT9JQC()nnAO4MwwEX#CZ{C*f~$)50Tnj zY{w4NQ*s+IL%UT~G>NfD<|ido6^`h}C=#hv<}H0ILlJ~%AJ`_M!-3)z*($u76YhLf z3}*2AKWFlRKt<|}I@36m<;WdwkZ)r^lt)jadjy6#c-!+C%aot|od&u&6Ob3bT(EXd z5>T9;q%n8S&O2ET1tFhf>HA!@j2|pw2g*E5-3s@73^LDV?)MgO_!$+*A3C@e%Z>-j z3bQdw+Wxxi+HSxUA5!k}UXk*8hSe~JOBl9=viQjyWU=>qN{%(sZF<82I4P-2*(;kVzvoBLt8-#|g@Eiqq}O%9`p^-zT3;eUa8 zFt82So$o{wTl`624NE0wn8GqiHgg(6Y8aTr7HuW#q{cACMap_6bcnpK`@rlO#x%}j zD0X#9aTwBQ#eY8TcjFd$gYhA3q4D)E-5pIlex56n+I#4FUL5mQF2>M*G`pL$@Kjeg8uRGgcg|+W71}bTiKp?vQ&* zzNitCXTbWzfv~|)J63)!6T`L7v?9LmmV1#;q?=L~HFRH|;g&YRbZSw&?B2MQ+m1Ag zI79Ryb6ON`wCKQtL(7fhvSBerK%0i)z}cdSCPlVAySS~ZilhTesAM}D^RWqeP7j5Ch4-P`9m1dgfhXQR<~ zr(IvCE6BBfqfRkN64oX42_MuMA1mFMRv90S&`a9xXPR%R&9}I#wWDp|zw)Q)pF_!iY>24zuiJE$?7|Do_#_t(du6_o!ui=PR~6m6!@BECUw17>E&ax5+mV*8@c3yC${f=~yP(6ouwhwYp1Dc;kZ)fI}DN z36~fw2LPg<(!uGacI2f)uX2^4D;si+7%(`^TOQ z0m0@Q6Y>63PaJ&gQ;se^hHkS_3EA(ZujS`G8O~Gx^kAlSt5E2iB6+Ma$>LJ73@xFw zd>9M5-+&0SQ~7&6A1PwS8w*pN80noW(F*R11uwgD!V} z5=Izttb(nIOb2Pw$xU7ci$XA>!01s+l%h`Z5b7LqfUsH@FTCsx3rg&E1v69Ubxj49 zB=@o|%KNM}A~5@nL%ZC-cCPxuuD)Auu0B6H2q5fph4H z^?>VCU_QNl@2FEv@sCu@gl>0EhB_NmVkTy)zr_3mlx)$2t1qt~jGXzj=Tlak<3|dV zS9{X%l(cOXS!ud=x~&i?Xv4dYQqRDNbAmdE*8rtOc0usfL-I%s<%OWzgM^I?Dp6~S zB;{`kCFj!%HRr&M2g3m!$skl+rDlvpGs4T#$jZ4qqV22SnhSO=d;VRKC z3!S6!!)Fp9hBL$`%@jp$fhedwfGgFUfEuOgA?R11=oy9PR|F;;Se=ZzkTeRQ2)CpCLU0>bIH6{NZPS?g{Ul{j>mEq}si6Kq z?UbG`2vS1ZMxa%50%8=BsT>2y$vc5LO4C?sKrk0(pO~B*Zk3r;oS=6h-nVfZ{%E=|(Idr=wlyZW=Mi5|Tc&;c z>m7nO(W*=^+A7V#;$LvWel!{BVC)bIJ)w*CYq&#w7Ik9%U^aT)oPQtTCCa-*j_K;( zJl47y`o4oV%RT`hxlSL0^(r(a^_kiy4FD?2dac=*0#FUZYM=S{8i?2Hh2&}`Ko)0o zk$e~(j?O>0QE(!8M5?ePd3YPW-KRYJ7tdh|V3fsTB&|-ZF_KQJp?OPw#i8i;)3;#V z`fG~im=Ao982L5kC)>=r6;?DMcozD>2>5*)n>p#F>0s0m&TjlA4S{vt&ppwZ%6$*2 zJ^sSlW$`6$!6G0Q&Gb!U8Xb24HZ;sK`hzn%rsj-rM=REKOmvg3rG5Y9j-F=1xX*E+ z+IRJ)+lR$A_oHUTG8{!1TGrAy;&ei|*L55E!1NpaP)KI(lJsH?5Mp8pNc104bOGPD zY_xnbWz^V~P4jy;-;xcHLtv(sr%BMJXplcjeYi6mzA7T=xN~}KP2MQTDJ|oK^u`zb zw{2YjQW6d_g-7G|W)4SBE;qyS^2SHR?2%^H<7O$)n?Ps(1 zoy#8Hw>#uO4l$B{@QC0~yaaPuY`7?(RrA?m6yOM) zQFh7Hq>?cZ$m7!oN8w}VADxHmh!1ma;a5J<^ecy%!VRzXKqniRz7(Z;81_=s+4V*L z0L!!g0hXJ8)vC(rxOJ$g>5a4!aVY4wi1HolxM*auUayiJY$iow@%a1-Z|(J1hDJVb zC1+Uj>$vu3=s-y$ufCTb-pmA2f(})#=cwdrRbcl|D<^vpXkk_)N?3r9pH{_tBQFlrx0JnQ?D3bVuYE(i0dxv%tuV2fpJ zso!0+CfI#}VdRVGxd7%Q@2B#tOB*20YbVhL8PQYkL*k-U;DdAa_VKA^VAOolF!i)B zO@TU*qrhxwqW(@-)^aLGT|k$(2+VfAAbzNo5ykKTmJ=MzBSMzg{mCkf8O{`Yh&kGl z$}F{q2^lPkSS@&P=Ax=<(63sgIA4hjjZs7D0KxD#=X?P>aHvmG7)j8p{NrMf7NCYF z8eJRb@x3p~uMTPYQCyS{%SO%0q^!GZ&2XpY@f{|=t}Xb?N_C*S@7gvx92ER(B{Iyb zF_%IO(<+)1BXP3JV_83tvbbrUSFL|n4S~bsD8514 zLd%9G(v$cZ%-CL?QXxX~+>N;ifX+=)C<+T8Wgj8_88kG6TTq8nNZR6}1Fc$-2SsU{ zE;6J<7Ee!CcuJT8LE?T(gz}d+Tu`A5Veki7=7veL&0h{B>2jhZoQSYO&145=XECLl z!RiS{Q5h*tP=J;EY%v}UFTsf;MATE+Derqazv&6&;UDQBC&#Ioi?#&M<~1_ScBK9R zmdgnTtF5oS!#0g+5Fz%ul(RrI=)}Kj4Sa018>x>F^)UC+E!?JE1WINlT2vciaHt&$ zV(2y%O6=Wm!R^s3N-ZOp#ISL&l9>mntcsWI-NO9M3n+ruE&j%VwZ{;c=5v;=$~mr` z(EF@QR5kWXv}1X&@QLf%HD=m79G`Nmqn6eNPL#X1{W$pu_h(&34611SH?ZQ zVa*Pg3UHk4v;2xaCH08n;IO`zt0t4+wKHM`)->XPy+)75&h}8@d$L8)U6*>qBdSwW z?F6M71)6}c=$#ZM!jki}VX%#C{CCwiQdr?O$2kI}pPx%vlLaTe)R8i}A|XK_Z*R6Y zyCGpgKyPoh%Ul$r;x+KBL7=)$l_aT)yUJAB*Z;#S3(M?tp4umF9oiBX0rS`9fLnuc zTaf{%bE@+}qzbI~9PX*v!Yt;r(!*D)W=ad7f1rL;f%DtiMjVv2^raac{`&Z}OsNqA z-vkNywYdWaY2?wu%7S)A&8GJ3Zn?*F0yX#rk#qM&k4hK#u{%A}%e2YCs}2lx=a|Xd zsEUiHBleUD`jn|7 z(liu|lO^Ddf5+H3`JpxcS<@8wo)}C%vaAIbmKjkM5el1>To=4Q5;=(0`e`54vOYcF zL%&~S@&C%@f3Jo&kiTNDMKrJ6+PQS8WGt6%OjS9dSa`rt^MHmIJ#4c{PH>|LC&-0t z68lain1d$_!nJEfdGhHGW1e>Z`zFM62$)cZp3OY2*L7P3SuGx?{(ISG7rG&tqDpLO za~C8Fdqzyl1eDlpTOm7!fkE<^L84`=tSRY8hb2(PM{C-GoIl@O zbr;kS@eti_5|~k}g@>=6(KF#qhdZuxqcJxD*v|E%UsXh@ck)r9qs$X!Xo4b+6-M%!oMTFf}+dF}#EaDM*>O$Evgs zz``VY%py;N^HbxU+_7~L6(_jPT^5W$tT#0PQPcv5}wx5UNqBFM9bzf3nQ;rEy6mZVTBw@oj-F{yGFmR z7Sg}xjI~aUd&0y$amiL{BM9$Ncwj5xRY}vxb)&6L9B^(|LQGIHzNsMkDlQwj$K;C# z5!2Iy#*dP^iQuZv9AItyD}3-&1}QbI=fJt4D+Ag`jT3-ZTu%KG`x(-P4F>%KBjfTj zEO`P};|LaF6vFGup>paxl{lG&MYc!YAYy5Fk<}5;pw^9N{^gq6NU^BO836_9!qVy@ zp36XhT^-?BdE@+>KwXH+yPV4(yNW)OaRZqL95zY=ZsiKTZx#4VH5;6mHC?*w8~#Ro1^^ zir}zIG|RBgnCOCkrtviu&*g)jl1L zn*vm+iB9jltc1z>Q!+g0TNQ1lUIGh9hM#z!3%tcX&5PTpLd*k`hp#1( z@RZ6GiAKgD&^G-5%F_5_Hax|4Mf)GFQNq2T8oHIinb_(&~MJnx|=Z* zH=g$k_z$X=RC=WX@`CdW$%AM6jnMysl1t;}_Wwq!6$nTv3bD+pJQ|p>Mu-**>qlim zI5)BP**0f@5PVcGA})l!P1?A(X>c#PU#XunbZ2y*c${h{3^$@LO5-_dEKrr=k7=mU zl;Y2<|NA)P>5h5ry*lgd^cSMbI8 zy)|jO#C`dTSesbi0_D4%LD6%rP?xjpuIAe;807&p(*t$njWvJ>ut=I6ltsp6IIej-aM|!^Vz_C1``{&BI!qf zM;V*d7#>>btRhw2lhvtnS#OaFbn5e$6#LM>n%=Z>Z;IyFx`o_ka)~Wvg;K`Ad5E!z8PUV%i zU1A~6)`IozHmTqnRg3P^0YLw$050%ndEZaSf3Z z3ysgRpq=#2lA5O*pUA}~i&*4lo%W!?Ot{HVS#n!Y6>Zp;Wc}+3@N8=5x~HX0Cq@DJW)sMuYi7X;O^KZ!mzL{$d1F1SB7=o z!LiIgOk-Wo0xCTN<7-%vwW~`2H~_@#*H`(C&A6@)Zc6%<#<=%MSVzAREd&-9eA4}m zH%LeC@FoQ3b;{u@<0@!}Xd%t+IYSP}8vr4oF14ozrFa8vH1AutcpXTOPoqt8B*ByrPXQGePT|26e6Q*35Q81rN4uQJ+2 zKbi-3UJ>%7=V*atENxrf&AOO+ra+Dh8Rmn-3n@`wR;T8|wVdK02Ok4}1cB4e!hgEE z;j|x?{5YvulfBL6*u+;0X6$|W&78Fw%?(yYnbn?OV`)T{aDM41`;_1u+T>p4`|tf< z%&$>9#r>fTC5rX`hq7}B5+!W2blJFN+qP}nwr$&W%eHOXwr$(E<*KQk*>wMliRj2L zH@W{JU!3zCp^L7ea_OBkj<^(uL^kdqA>i_-yStTud|F4z>zHI3=_Z;)lN-&5y)k1G zKM$3W73UVRRVmuC?gWMoPNw$HKe`cnxZ`l7N?s@qGaINXIX=DIeXvn+)7%OgC5=}4 zGNhSTlT@T$*h1&~%=h}CPj=?T0UM}q;Mm1{rphnBn2ds$nE72m)``IF>A>yo@c6$7 z!pjHAKEUPOLn%e~#0XbKqGSlt3Pd6x3&LAi;G&_5=PVeg*8>zYcKSOg z1_;{Jil#Jw_Ays9LD<6S!7qf9abSGbLdOK5yw#y;Fi;1KJ+xlA*)w ztXWboiNFa$LgV#IefS}Cx>oAd*V$eRQ>VA0yDo3I3RJiOW4~YRO4{@-1DIV0x&IP;& zziFqJcb28b&IQ?~Uc~3V4<{6NveDZn!44R2Mxfdv8EBI^i7uAk<{>I|nl1Gx8RK@W z8LgqFj!@;Q5iMnwJ0i|Z zHF34_k|JeTtP`6@P&_hL&^46FfMerzDorvC=R}RLqgxgQ6{tPpiWtzUh>jGq<~T2i zN-3<$hF8V1Ae*nNV#Nh}h~&kl+_abCk7mm0XcH+XZ1M=r!$4l~C3r80^@_-|JIK|y zkz;g)##Ss+Y7?(T+LuYgU^IMGufKR5n5a{gbiogP;i|VlA=H;Z0x3=bgeeXIh7+yq zVw2HYn5G2WPI&o+W@%QvfcIm0)4Y|ftjf=dVjALjg2!N@LW6R`1s8imOSo-wdw($}|FD6|@MrnB zbYSbN>Vim{#8r9;2r<&aL?x0P6Lpv_()d;4hdBZ%?>Tx%#hwY5d?2OOn3U31JdKuX)yDx_zXMsdo^94|ujy#Fp75#3V zW?oL*hz-)&*6$~^I^WcOPp=)%1YU=nXE|Ss%WLb$Jn`5bVMSs8IfRrToXM01kSp^B zIXJ|jnBaRYTzL&k{MwFhl(hlnRBW`aru z0I3xWj_ClXa_td(bVOt-MTP$=FLD2hQ_2b= zrAlSG!cR)dEbhb4bR#p=Zo_fk%Q8q!?T`9S9WoCTNZzaW$8^<9G7k2UdFL@>q||Jo z#OV82MGoh9EJ8-ugqR(BDh-E%K?=x;cCr zlFuU)Y!!qjn(R|5%StK$eMQ@}J*{c%*I_4zu~P>3*2>Es-qiA|t0a@1GCnKkf>g@Qb6EkYp5#?1 zUrQzWpr+-LD}+kNd!e=^l1n}|p?IE>Po9eeV?U?v)=*@7QLw}M#hutG?faqNN;k~| zLRWQcQE+OfEE}9^=PH$oJ?d-c5PKG$WVG|i;tD*VFliQH6sj2M2s$n(C%2PvM=1Xa zFD4d9%0!+cPX8IFtn4rs|4Z3SomPt&B0cYWMUTZ8^o9_($7{TmfZ1Fq(6c|BB0FJ1DUIQgXul%Ir6>ncQYWN-sHBLQ_n*87{WnTb)09* zw}Mk}<}hxMsHf|TgU>wei0!4NI9TTOfw=>jEq}U9 zv>@#^8Si3#{Y9()$Um3=!F7#F+_Bk0cFjKb?Y4960pB>h#(81!Hv9@V{+ZlGbffV$ z??UFT0>9+WWVpc?^_&%AAAJOxdHw{) z8bW7{tY(+nihUgZa0qy1rbXr(5!v~pd!Q5jw;R~K{6)8G>O)KW;OkH7yI|W?D_H7B zsC~#SxO@98Mc2R!L(P+zLvk;u+DBOZ`j3$I;SWyBJKsQMF@1}~^ct;+L$@=UE)h=v zR?&;SkpO`$rFv*4^g>(l9_yCo9o3fV9jPk_cNhsv#@=X}My3RPb)SRKKC_G_@B0nQS!^`XnTal}1w}aycANTh6 zO72CkLS6Mm$gwF^eVLM;cP9y2_bCZVuhR*ucUr~VJDMB*t;x2-n^L3qF$=i|tx|rm zyA)qAw=l{3I{ECrY)$C5a4d&B`LOPG=4`%nNh2RZUUva=zMl$be|X>z<&M18f$>A% zEuI^wyx=>{RP4;N^M&H#?9AWhK!}gAH2uu^oF~|tdgjQB%1pu%Ci1=d-fnR@on|@RW*^`4 z-E!a)j!H-r@RJgYd!?796{Tf~OG_jHrB|dbBGV2#cOqY`!3;|eQ(x!c(23k1#H4bB zHf77xdl<%h#akKf8^0h6MFIUg1_y37ki+L*RZ=-+degPfTZ>Cu;1;r`GNslSxIDL3 zZDoF3pR%(+#Xw{m!Mh7{f@N3)pIVOBZ=a3(N9)(8rmm)Q0^QDIqH=Y<2j$75;>1JH zt1HH7voGmaO)#jvbHQj=;uf)*hykNwoC10YwBuP@%Bp=l`4oC#HPAoh=oeDUs{Knt z9EgKdb!s9YTKJg{!YoB#1wrY#d##AnAH%DuqJ2_k%8NM%)|TR#ey>2Q#wUB1`1|VB5hk9aM!K)*suk^mM(?f#t^l5H>OXj_8DCn?^ zd6cC>X@N~8h#AB2P!YIgbUoi)NLhQ{rq#6Fpd!E?}%Gv8?UvRr`62s z*8~iEipzmJr`EwYFuS1_KG4=a*D z6KeSBr*!a$p&p8ADCVW>Z1{c=Mp6s*32@YVQ!u5dsD=GduL6-HKPrC#v$}wFDCyMf zHFfS+=x8Hc$Sj346i--7cLkR)?IfC&igG@{qcUmMK$+YoT-_#GrHH>&zU=5!4Ry7L zL(RAvt`xy$JKLGrHe`=)p6!t`%<|ueT05~$Si4?P?yinF7^^W%bj_lU0CYK`>Tu|| zSs;4=k|iG%*VEKRhhFj7)wG#>uc?R zHuXCJSHd#Rg~rfTyo>3*fxVLI(C(SO@EIL{W+fJAQu_2uPEI_TTQIgCrqG zOnsDD_XEbb`#+h3{w%^m06(@q^l!@g0JBo;T`RqpB_Gnhp+95h8B;Z2oM+4lJ0G#}K#;EwJgayf?cbNSdIQ zu{;`1cVju2)RrS|QSB)w*4%j%Co$?@06oSJ;YmXrho>>M+psc)S&m7US447Y;`*>t z7)*n#$*#GTcasaTn-HH&{FSOOoIncL74?3?bSsT1C55dHuYRKQS8VcvvKC$+z>7WX zCV{BZr1?PA`9tsZMwR(?qcOUbwYmaKtgu74!r4XAh19AU|$ZlbxqrgN9Z^l!iwR;2ULLPw%+}@X>_vUY(yo<` z6RlUAor!EmqFFy8w@1~Qi|P40#Bl*t0B;@UUmei~)Y42ngK8e@S94_Wi`Ee~_;i*s ztd;+bLkntS+D(cposE`EbnLN>weN7#!dab$Xolxrd~>><{m#O;sY#JrN{5poOF8!C z6P~P$R+h22jFcg`7G8i2%&n{MpW8h%8!V*FewoI^W$T0cok5qj%*#3Azb3WH4Se_? z)kRJkN$9=_U>X+DCvLo}oKHe&XKUgFf%AeOL?L4b>U@`wK~&#<-q3s;6RmSIPN;9X zL)Fcw>IbqWfge{Sq+o4Q*63HX5h6XE#Bj0gQU~?xI)oqL82R5hfX`;HA< zjAO`Mq9ulS>0oH6b2*B~< zo(soK@vAxF(-MQ{Lvx_x#igI|o9+X6U_*@)xQ9=TOdiR1$-)haIE=0c_VONo!8bWZue~lad zlEaBO@Z=JTU&FQiy~aacBe((8;(x=3&_@5@IulLCiFi7oX~a+z!L!9l)%~sNb228; zCHP_w(2krOGqF!lSrb(?qQ&T=G5!-9$C4(H6V77{K{TexEf?xQq7hbop{sHS4tqAQ!~sByxS&~a3n3QoE>7NLZwj1iA7QYmQ*>@A5r1t zkaNNPq?jG+q=J^G>_U*EpaYV7Vd!1f0TQHKX`gtppnhywRJNjDf5C`d*@4|!zH;EY zjMAp$LUN<36N0CrMx@dVm#BQXub>0mYY7}$Q8UcGESgo*0e7vENiXKYLt4pd^w$zP zM!{w{vjU4=%7y4gp2aZff|R?g0|Q#Qbq{U1+Fi35_NB~raIj+YzWf62NohMGpyHZb z@tR+2SqGxb^#FUBwx}{=E^i|mWEr$aOiY~?}Pduiwe$PW2ljhp%I;tsgVJloue6@p`DAZk%y6ile4u6ospx5 zy|W#iv4xq5ld}_@w4JTl|0oInOQGop+POTXZ2%A!b3BLR6_5duj#GNN6*!dp6# zP$$w=(O5j5Ld1)rp~zlpUH~c<8HYrm1v$Iuj9LVZq9a2c?s8un8_H>N_UEbbOkKS zqbyG1!`M4*Q=-B!r#uhoMX891XNR9^Ok_%2^dm zcM13Pl#J3D>f=_PmnU#K_@5gb-_hpXT+NFt8|I4tk~9vX&!jx7x(6vGKXZV#LgLr?i>BRP0u>KHoo9=Zc|=eEvr(au8&XAUOJtz zy*}Y)D5@l~*gY-ixE5tCY%uaQBLhMke$ zr*C+fT0PVM%#QD(O;k>KH6I?#y52TIYu&KTrT4*4=spjew~MrWi!S5X_-+eo4o7d+ zedZote89fn%1aXMyd7!(`YkgX%nxT6L3<1wPtdrO=cBcc?>=q33svSG%;Z--Pp?+Z zK198p^o*wuV{o5-f$EuDW~SWhinZ*pTISA_b*kv-drzK4jwI-yfAMWSOA@fyJ4$~0mP1|Z~zX4uPh zX)So>p`pg!P=u5`rxe5@`xKMM705^Wx;tbLk8Hk!Vp3sEk{ig^k)q=ch^H>vP@0Mc zQvyX@758WKy@p<_2Xu^ITv0|5Cx?DoE-N?FlII!)z29x=^ArXu`aN6s&hm}cz6-h} z_pIMd?w+Y#4ypj=_SV$1Vn3*WPys*hd+J$~l{glaz#A{|o$h)mc}@)2_vE(-!b*ub zMjoXhR`mx@Y0pFzFc=;EfnPDNzo-C8lS&IRzdU7ZP!2&w1|2L8$e5tVopuVU&T-et z;|1_U9U@f$8xR?Lj^-$W)H187hJFKneqI!GLD5fMDPjoIWT?&8)vCRQbu@~uj&eFp zN-~cK1zv;O-oh^;X(=nCJo=%zs(76qnT^GJ#UM0x?4`U14r4T|Vb%m9wIEX$w4Ya>xFw(;d&^mtt2 zQik^7$J0FHd8dQM$uC6p%!boEL-aA%_o1$$qpF+3dMXLoNjR{fh>>v6j`S11k3l9Y zVy77HRLn}iRy&u1{$l%@6x5S|{*lttI@220GB@~A_k(U^ObpQ|qL<1y@`Ub&=Sx%I zC1vC(<=f%7kpAMXYg4UkP*YP^oOf-Ukmf%_}jvrI&{?NH5R=GX%LBl8)MMTh`S6C zR?gzn!m-s~LOp;mkPL7CoOOyxKgA7=p|;REmP0UdHNK6EL6EbSR?zcS_F$7GCzfDS z0m#_PzHLlUgLq8l{HR}C>>Y$Dg&fOA@@L8W&0kiGhCu)uTlmt~nBoO=fyHX1sN_*H zKl-`^grhta7XTK4QG94ZIAR0>gCv8{I01sOQCKRN8nGIoL9$6?jC3BCpi@{Z7#l!D zQ?ZETIF!UJIE(F&`nM?Ss%LkiNbXQ#n<&gVD*R588!ShQ&fj50VMv3N0K`YM=2$dz6)wZVdMVpilm@}bE4$!}!Pg zK;S(OtYYB_TioK8l+fLt-tDINz!*Za*lcadv8n51L3C^g^lfYz+XyBWMipvaWAW~I zzFU%VXcMR1asCgWK|q#(Nk-^l^7o!AflU|4GGk#W1O$WEnZhM2q9iN8sxBK2dsmgM z4m^nB#Do0iI6(j!hjhcwQlg3WMS@>y4|$5pxPU#xhbWpO-0eBx^bx3j$xw8Jwg30 zT1i>1vsfWXXZKiU;)AYBigb=>Jj{h1#E6Z=I;UT)+LdvH(xbB^tArB@m5YhvvUY4A zis@so&#kFmYuHB~8&wW5pgl%F6Y_AT1sxsNBFI$KJqLA8-gF6-)e%^fL>y+(op9CQ zr8A-Ecf;6rWl0dc+6}FB@UQKa_9Aauy_+^@ zL_ZF@cSzsGAytLu$gy2VvF*xME@|L`(TfC!yp8yc1gde=MD_2HVWp@(s7O-(6{9Cl zLLU)^@3~LmripTxLHQHnZ6=9OQr{WlSRbQNK=T)Gfg47XwmFB>sMCr-=8>j;dVSwU z3I8i?4T+Fc23HQVL_d$FaXK5JRU**6moa5iRQn;u;D?AUP2H5czD-Z;>oy|_quveH z+rZ{v3Q4`pZfXe_s3wIQ4`r$>cvB(smR%y{XRo)+2jKyOG4h9 zl6@shQr^PP*DA;Z<`DY~O#5%tgDsl=kRDL9Ggs}?4~OU+F}HTf)3g9uMm!xupEE`* zAvKNg9%F;|$ZfIRIveNc>ms}L%O{?XKwtgUGLd>Fk@G?434ju{5vCwS(};=esj{j( zx#X}k5slHR38kqLYcp39cqel3bR~|Ngd}*42FH|Q3N-bO2bM{BP4$kL#($b_>Y?T^ z%rLkUp+2bz70oxl@w=YkCF8n(E^&${{yt@|aFJ3Xbksb@SWK|K<6@SkPb@wGGXuXR z!!7|$iwhhhFlVsMD+x{vMhP@31~nv5%w09fd+;}25{rD#{<-u~nlpptuiR`LqZw;l z8b+h}x{SSrTxnl!wvBFOr8=x%F*SkA@KR(lzoB^eiA#$pXFy`L5M1!uXqYcdhSk~% zrLi4EZ8iA2*~iDtfYmw>xZ=JYBO7fiX1ZwDN(3!AS~4uP9ph}SlmE43daJ5uP_5}Y zRYLgF`_AD<7q?FAhnqwk&4;4d%KG~81Jz41qlbAY=foAt+VPywgC~x};wiK^n-%hsw*&v+#!z zIQEwoU;?-Xodz+6?7;B{&IjUzcmU=O1oDpwqy$_K4D^=`^o2g7F2kG?k%yR5ne*n4 z$@AoA6MzM%%>(t<7Krx03A_P%`m+QwhSUVHhtz}~M`uovSDJV1uN(M{G^aJ!?av!{ z1O9~a1kN9j2M!n#s0#EBsR?>UcQ)$}7>El7gWLp0FFvQ)r!No-5DMW5L$5rC3<)n3n=}ksrAZZVxz{VaHpzW(Qt}ZDuUx1{{JpLrj4GwewQA(|ATn+pIW^C zU5oo0A;|DQT3l5xYo${ZzTNKCo|r>oG`13u&45q=#L^)de`gwkI5ZFHzZA0h0nPVB zG41{JN}G^yg}-6l(ckqdU$x1cHgmGsE4CN70Wl0M&6>q3*-c`rAm>xjn`gv_NGX{od^<906cQAw2q}l#o57#^wYuJdzV8psSPd)O%rw3KHhX=C z+9clAwx*b-cqqws+kJD|n?8#^CRpC0$7Xj`DGC);aeiS5$e* z%{D>CU7p4KucV_#KvZDP#@F_igo#sdp~Mi`9pH)z_J`u_HBY-e%8cdCFa&6T=Oe_I z@NoWyew90K;YrAl6f(`*lV*m$6`rS$TTk#+j2fj|kKkR|*j+Hbb_d>6emEywmGeh7 zxl?cEgqJRO{u>(7cL$1OtbqUlmq@+mK~}+vqP! zk-$mxtWdDn5GW--&Fd@&qZL}6AqD3db7WeoTCf23iJxINj{|~(V#Fx$&)d!|$qBsq zIx^&`H>SpsrIu`|DGf;($J8l8d7h9a#meLt7(91&C(X#nLO80VvMk{@=0=^qxz;)! zGsn6_uTcbZv1;oUQ_|qs=R-b8NVy!plCKbobt4mdrpJ`2zGT9TzZn>;Lvh;@$n0N@ z%d=UNc*5{5%k00UU)6M~W?J=h5^0Zqwl(TacSSufALyw!za81pYkD#Clbi3s%z?Ne zoYP@H?@#aR=y!_>MDO z>irOpjk9~u)E$1au>xSt? zxPI>5u0Ljp&4L0-jRs^}?9&=)nM}7$xX}<Ni`*ToG-FrS-zc@2WcA28B{k4! z1-#8&Y0J76cUHHu=EFq<(RfoID)&f)q%yX#MS_}G;c`v={-7HI&EI9(foG<_Gbv2 z0)(yAKQ{{KEU|=S41@jE9*dyhT;;n{s$@PhV<~%T8_v%fc^rAbZ5Fb*k8nMZGm<^v zvS_UTw718v@#xZvb&qhbIC7I zy$F1{BGXnaOTnXF)48mj{|*6hS!~??N1<7S*=bbD)g2`J0>@=2aOs zO%AlP$!P4bTf9NfDm(*toi(;v zvb3CX)1N)MXpa$Xpz2vuU3Mrjg=Q+`%Z3l;E1YmA)7O1yhfV5_wNZg@{<*6OQQ78g z^S27(^hE-OV$4#Wv7S|g3icU{SWS97ny)$30)+v?sG--i@vwqS+0z}W1+;nw`~%uz zttBME`u3a4OpWNULwb^Y(iEuWuf=(SdfgDH_4j+o1ogho zQ|nWM-FV-!q0;HDkyNX#Tv)!WbbfxP)ahn4$6Z2o3)l0rSCtDV17KgqI-mfUIZ+hk zhU!acqs|}T-m|vY05x)zphbD~NAZK6pE)HS|3QN z^iXvVi+?DSiSUlof<7xI)8^mK(F*+*5bP`1TgD^;L}YI?kCK>ubsK^wYI`{7-jlwZ zm*yDDw&dV3GJ+;>k5W&E>kdkd_K-0ZF7BlY!1$a9C*aREYUO7|+YjqEk+))2;94rz@a7 z><5FkkU$`&5I_hy=^cI`i>tcXJ^?fqHFu-|Qmm2in&Bu7q#QAKavcr6I^UHi5Gs|~ zhL#Kq&MyEys^HR+XJAvO_M|;@h0xG_v`NNJ%|C4%H{N#E0v(8ys>DXQv$|uyXXyf! zAR@BRY9;<8Vy)_|x})ZTtfPd}R;ijxN9*=nbF>jg#m&oRRsqX&@ys2k zd84_?r>FElNoJ5rQ)ZN->|aKJMqQ2-Xug5R^|2y%^5>9SgKWE4)3G4~)Xv=n2` zVMuU66yiVQBlU*ppZX;1?x&kNU(+)Xlke>FR?fBklhB>{5PP-u5QkX|*`Yq_M&}~= z>ec(G6#udj^o~W+l!Wpqw+5XapaLNE0&s6wW2!HpDUx?I@g_1Q3fV;qG{S3tiev1+ z2b=)5(?7lVuMu?swu;8Lc;Wcr?55^q@ULwl#MMBi45z0PixWK&5p$#Y+*A4E2<7Za zGepNyt3DROZ&CVq`|w8Z=LkN=WpYOSt7s9^8&Qm3-gpb{KaIqhhZ3e>!hDdMGzYA7 zxum^d=emnc0-A@^I<(0*M2tE10V^Uo@)+`AkcYv$``IJ)QJq;hqfpmr%P(~oX!U;% zCXVz^%vtD86yN^VhEwl{SX_HWMDROXBWeJbeW)Xu`V(0%=gfL2W z8kE}oT(t4#4b$0hK583+JC0rbCLp8u@#dH+|dEHODHWhQ2Z z|558tt9#l1`tE_@Yj8{ z-v~qVVK1b2KaV_iiQboac7dH7R3k4#S)!33T}T%vY~)>-M>&K+ZVbwli6=$Vnr>`X#s}T+wP@#0qyPJ7Y7t1T)ZLc6!hug-8 zQYMtQM54w-+(d~kq{pa>FgG_cC03PPi;K3>&Lg2ZUOU@3f~#o^>jks7utA|C8hwx| zlJvTKR-f7dccx4oxvJa?b1Mxp6f2dv(Mhz7AU|9jMyLy|wxp<2Vq2W&k@oUpL_1f- z79A|KB;QDTaaY&vA;z_gY#N?RcNo51jMyJnVKAj!unKrdvaL+aZ~*zr5ToR`S4j1~ zM>hPzUVv@trw(FTj45+0c31wai?$6)l`h#uXrq;%g%fX3VltJx7eqsVITf+AGxSiE z&z$*Zn6{g%Qw&FbeQNK+;~)gUwi zl1Wt|%TrI11u=uGQlg`ZmC!QXAfc zq&If!o}!b!8jdFYw@->>W6m}oU_;sx?o3nju%Ak*J6bDkjmB3MuQdBnK{2X*Ia#qx zqh+X2QKIMF+<}v>Ucj=Fp))+{Z@GkGEqs3Zs9d`IDMbOJ%5&v3El8zX>RawO(UhoP zq9IxPP3bielj_soRU_S1D0ph5saQ{x9-eJBI+A@Z9i@?h6wfekOvc2rv`d|mk5<#> zFR2!trP#SsN1dee34l495ssYmn+gU^c6o^LZKIg@V1liPp9f|?V ziG23>_;i5#J8fQ5*Zh$(Q*ASAz50!?b6R;WYdw$SQT5Tp^~Z6VK%_a$X^a$4Hj0|PDB9m~PzutWaS0d&3OV;VH+b?Sbb6chCD=RQV0F(WJ9t+0 zO^A-5v>d#hjA2YQJ>OsNbx$7Op7oSCbd7uV27b-EZ2HlLmpX~>lNn0ZQ1}c4tX*$l zj8w!z7+$nHd>%}&RNh^ClR&xyKuDadFWMk297y@jff>!nyc5eJI*5B$$-Ez0`T=R` z197WgA@-0Fd&IcvP7YvnxE1E%X0)O$>Re-|of9@W& z?-dS64TfQWv%wlJE~Bkvv8Zj6c~YBVu@qVxWMLjb#|#VJ78Um=ekNNKp`8Fzh&i;{ z;qM3yW^46*_y`eZZ1sJ+S)^>*^27yC%8t=FPt1b&|kT`~+=a!-g1a4A@1E(Se|cYk@; z^>sP;-aMcN5h^sxyu4axrbQ)#0cBtT_Y1mcnDCiE{mBSL6g-BZ92{OI7RPLX(Hkgm z=#xB{Q(S50(4!2|lH`rXw9bcO-iSm1<_3F3>|B&8mKvQy`?wo)6gWNOYxt0%!ZC&P z+O6V8^bS!sp5`4~eoYm5l1s4{fJrmi%T>;MIrez;E%}b7<-xiQRll1pH`& zKYA>0=4N?A7{oX*=^*ec<9%%@sp64nLK%llYf-=7be3*RFFhr_p8ADW;+4BR-POVLsvl{}B5Sp0WiK_a zliN>7%|TMtjdst8Zi~Z$qb1y7WX+^{!D+Jh=ASbW)lXuN28J<&c_j(^s6%li+0!-b z#48*h-3OHJ4-&qY=hGIjZg!Y*r{4tcm_~2q1BRM7(o-yx6Uy6>|PFXH3*IN%R`u)z^v*i2v%edLLwy0Q>HXZNqE*Twj zr&=Z{`LC2dxLJ+@mUK0;o9H1}9f z+@ZJ|l3l0A z!ZQkfp$c6XP1&h?9s%gyT0S5HEuH16n>DIE#i+~KUHQQIdQ8jl z*;3%<8)9ob5`qmAL%~;z77oCSCVYUjgej@OH;t#0KYV?_jP-nIt^mnIZ@WH%WWnfM zM!q8B>*Mc{lNlB|+O7Z+TZYNP=NnwzsKszJd~NPBltvw({c_=$kFUU{kVaEiEG61L zf5LSn?ih5W;AjJ7=KV4W}Iq~+TpOAg5Wrgw`?mA?a#USp?PH z^5rdRAi0R*1=~e>2w65p-zROQ+Bzb5N%$E1Is&8%@s}gso{BfE5f2h(6v3ok_!Ivi z3J=Bu6B+LJh*ZaZJv z{rvM^{R~FPfRHf^06;p%fA44ha~SZyHEa9_Ld?oqTMZ${N$;cMvU`1~|NdshB0H>6 z_FzMHf!Q_TmCsY9MKclj%uTy4}na2iNHAR-0#Z_{OS&)tj!*cw1}S`{SV<}Gz!nF~Pof&{NuiiGGYxrHW2>3kPakl(&W9)1KM2I` zxoh$xsblFLZ+s?BgGz`E#G)$;vxWYm#Bok)UXT-V>Zb9YeFFhYKQAsiHImK#D!GR2 zsZiq1nDvk;*Cr{-)boVoNub|%V9IsEBpWBeRg#j7C@|_qn^$cINN2JFINVUoUyCwm+Qb_i((r7=?>IO8z(WQ-ye-efXJwVcT)SfkDQzI92pJhlZEwe(S= z(zRydg-|^wP*pueUjB46-xVnzJ|(Sr<_gRp%rV zW9VDccdQn0mW&md5>2F2loDfSGM{)omx@p=2X6L;ix61d`4W9G=_zFFUuZjai8I>` z1hKR2@(%)U-gm1#uex-mqGr@xfB4Lhai{vf_FkXt4|I<5Bb1Lg#n z*t4dfAOqNh{*Z?# z;jWFtW#-%)=gd6ZI1^FvN7at~uwN=;?aVLNnsG+6fKO~dA3hdF=IR|z!ODJ0-vCEw zOK>-lBcEqi9$^e%yT`^H`c=tW#Zl3jwJF-uQkwcufwS=7l5X9cwtboI4|Ud#UhLU6 z4p`ksrjPY&9pS~CoocFaqNm566!fZPujLII4%&r+Pda)r#BZ*qOc8!t#MCn@60cwmHPg};m&Ldpe#Oi!t4kiP( zvxHo1w4al<&vsP8xOD`&k6(xEBTT?RUn0tTDj2ed_d;uU2(#cERH5sQVbXR+)TuQS zq|sFD=~iqp*Dke0L&2KJUhpywEpUFaW%ZJQ3loaDk~^Ah-ar@MllARhqk7?Rp2GQO z$^**|t98cAXN%-XIJuc=H@&l;ym#e#^NerC(_7dCTn}}>JP9;gE`D`gAoXlG;TA&f zx1!tI#BIE5PCdYl>{*yhxbB^2b^8}qo(iwnAVt=B!jrtqvA7AN6-brNxxXWFeaQVq zyt?5=63_@W?1Ud5ovyO5Lf@Cl$eDj-48YL zHVolsKJ8{AaTv5ruMl&Uf|mw-8FT{s&`Srl_ztW4=_TRqXZbL5L1pj2?q)zS(jn>2 z;Y)pjoLczjg6{H{yo#{5E$_%#*buc%8JZ>9tQ&BeN7m+tXb7tQ;A|z1SR+aTZP%DE zGeG4YC19t6DHhJbHICrRya3>bfp;^(7=I;LyXQpi?Cg7WB`SBXC+1D8E))L5cxJwm zaT$t=McpO`58x!f9xr} zG_*?!q8k)r4&U7;dZzf7rr*1mfxnBaN%W~+mKjj1+}j)k-{T%E-0K`@z2w}o^i;#V z^kn7>mU}D^F1;RiYUgV#jULaOF5F{2oZV->puDU31%H&%m#(xRymX}&23T^xl)2|_ z&*l~fSZSQ>ti#?DUa)r-{J0LkLLt64FF3XdsdPZ|_iKVW_7RudiNE;;HTkzW6z-kC z`q#U`kvou$MvpMxq)`d{L7>~ZT}k}D$5of3(%X-6J4Mb?Gf2XWVDtm_9|}fV$8}KW zYn-8v^8ZsX|CtMtilu|ItC_u->A&C?YC0|(VrU=B?#9CjR!k@0duW_O33kdUiLFw4 zB0$~#VXmJW$w>O9UZho|G6Y`3i*TPm`vyo6nM6@#u|3aa1JD3kQb4XWBPw75?$9DUd;N0u`DaxQOyX`n%8n`3`5BfPHL-v<;o32((v-Xl6KJ}V*z%T8` z_3T~UEq5={sVQYA|Lv_;UNqCP z{7^m*Qa1r6|H3`U&c04-^~ibTX6-nds_uwgSZI-}bsT^mpmkT1KdIO7JhabmT}XAk_+J8+2_s%{q1o1a8Af9C{EUH*3o0RpVnY!{xx-yzds-b+Iy(3|yHma_nY!Ab} zN;9=v{o@g977b5n-JbuDqN29%9Evr2MSdpse4}{oEP)uXrv*`_>cnlif2)156NkPl zUTFf&2I)7@1*Z~rg$ufH29G5T3@n19ZDCbqt7{jj`%TW|O^b40)H*kr{41wOjriTH zTdGmWK#)jE(7R1K-0P)WUF{FWkMl=;UG`snLMOh#5s^i zxIh_AvVe#iWM*Mptvi-w3gEU*|4W=0CZtU=-jOo0!I83p+)`ly71c*_`L_BEPNge+ zEZJY&JHjdqw7i23TA7Mf`siET{`B0@cXNLNrA#hphy6V*Y`ano|;=*5s`P- zK`la;TrBPdu+ix=Bdb6wDO>vp4OA`~DGEOA!UuCG7h)Ft5&=2iZP=m(yNK@|6+fx9 zn^5Yr^9V`Oc)&YEVlG2|m5h0UWsr~A5O2^qE71IHf2v zX3gR==td9Xb$oJjCR!x|LLWz8eqlctc`Xi=0I4vsvTUf;4VROAH$f0jhc* zj`TVjUClmuJ}wzPlrlQ7)oT`cNlkrs7o*%q+pmW!KjOdlYh4$EKRC8Xt^X7^M)Y`e ze#F6e)zqCd7K}dA)ScObz~Iz&MBV(oP7kp;aoAR|)Bf4+!5hts3DpUB|xH*ek~m%S0C&gS?Y1BS=s8AR*OI z{cgvl(@7l+27_*IXb_Ht)i>YTwqFzI46<$yW~NcomS9%nsu&gx$;tnr!vy zQr~POJJJ=C?P~Dxp|njn(&*WU$Jmn?iszo6AFxAiQ*9ZVy6d|57n*pMw#7-&>7QLI z&jwW$QeQ9gl~;dVh^H?kUfL_Hl<>}1bowe-==tCK&T*@P;a}6Gq}PyO#Rsab;bZS|ijy{XQ07hF|J6^v(oztv=! zTPBVtg&me0ugLeYy+=U(y(Mea8sdl^lh7ZMAUg}qrXY(A*Bd=@J6OoFw2#U!b{|Zf z2cxK=WV2E0t)tA*NECW2M()a_|dfraSm2r>HUIY{q)%w&d@ETTw*s}d+M_V%d1(1a93(@xS}^5Lu6fA zNLtUGb|}4-TtvGFTmBoH;c6s*$0S-P--5t{?#a zB6D`eeM8Hhcf;(@>v%%-tJ#P;2 z`|tZvw?{qV?98eLXlQG&6D*npY%MId0-vJP)976!K|mlGGxk~wa> zI0Wp#e4DB`YMY^lIa(i9M%3C&TzVP`m^X)bQtZ>rp+$ zxG&%D&4FO{OAj=Ft1D4UnYQ8h|8d^@S_P(3kNgtXgCQ4V*eOiLk00uD)Pev4zon05 z)XDf_)9<0{WUDOBFKo^}AoOk|NHO<4e zCX_ZbR;{ya^AZUdx^D2}Es6+d<;9Gp&K+XanU2@pYNHD~Ww4{83)Lw>3!a(0Id~H7 zXbdhHZ@IHvU|zRx$zWbp%OmkZwWJ=l-@K(io?0E|A#I>ecK>h>{C_;^06)N$#XotQU~4g$OhnQKG%$AyZ=APvVO4ZG6PEAkNlH6{%AIfQMw z+`p)8-+5pjQR@6un|vxv|N4lthMQ((HK)`%pzNsD5>ACo`-dCf*fIOK`o2$p{3-3O zq2eQE@o zC-KGBYIv{9cwXqC7G-1xZC8h&_u#({hx==d_9qEC2Kf85MnT;Wd(Y#r@P8h?6%jpq zjdk1Tb*T{2Yke>Ls|zM!(S5;+uGX}u4PxCqm3V;*8-><7s=Oc;U>e>!)y+d0S2e28 z+#V&;G=3H((yMgp#uqU2Xa&rqYL@)PR%}fxK&O<+q6r{#rkCoMyZ6Km35^;-3QfFp z%8!zXBIN_6iraEkFIAWw5wq%i7JE;c0PYjjm)_6`PvL{#yA{6f^A)zw`k}WoN%~Ye zeNBoKa5CTrNd$>@J6cqz;bkaacee&u6fD9i94scuitl3Lg-e@)70kQg;EZB=k?!ou z`Fe4d``U0G`|8ac*mMf-zIF%$qdNv9hboJ#RWai$qA8>`@gt=igI(S;Jv}P|$GCZnN4Vh7icNpt zIB5P)`lx~_kuWw5h+EHn5sws9P}rstVY#Fj(!vdE|Khkf(xMaFx6@M6Z)eFe-#2Y}fqTjH|7mXIPUXb1n~DUxdtXIHq&W!-Jysqu%YoKN9DH~hWriT-rDs)$ zYEDIaplade>YV9HCDhg^FOeZudvz+l&`n^!lN0a6fCGCW+yyy%v{WkRc!Gu<5k}u; z9W|hneZ9UZ;zKB4M&1I)0sT%Fmcl`1zRgcJA|%-Ue1My&cub7ej~CZ$nU{GW7Ntz% z*Q52GbKNLFz>GUFX*pBakmuJ%e^=#%71kV``Bt42PE>u(rll+e_{p=h2bmHMSlr5g z%1GsgrB+IrP_a?05NIiMr6v(@8^BH8ET`pGB;h-rOd}W3U)c{Zi~#!%Z;?sJM0cx= zN#{xWbF?fB``e-}g8-jX$x_PZs5TPgUNy2O)SUEnvohZjbWEQB{!uA}gB(k)b|NA3 z@nk&eXT?W0?}r>ccOofydTqFh3;{L?d462dcSTC*?~0>S7387&vh-dE&}sRn0MDys zX(aYN2=T~M)x3L2=?AOp6=C+}ksUM1h02Ym4LBE!VFPu0WyY28S2wLl#!BK)Rd{K#|w$mpFSrIzI^4L z6q;P$ZL^_B8z79iphpZrD2(Z42b%uqR);Tf!E^j^ZAY=_ms|Y?=|q7y(zGj=4IVJK zb`3r)42sJf_XVJH?27O~uIzTC1H8C?-ram-=s&W&che0C=pTN^_Fz$LoD?Lba>Um=@-|sUDe?xbtF-un)*^@Z1-7Ka9Fp$S?O{o8-<}}jx zLgS=m+(n<@T`hV;_erU%&rdbU<3VUEZ*u&nzl7ChfjiK?h46K$>)QIk3Qy5sfdAB| zUE>|APU$oBwHZpkDt6#q8&toHe)z0q@*3g-rdw$voYU%YcWRxuTg?aFVIdB9v0mmG z9_LvmfO0iY3EX<&>;7R740&(gt+5mQcmjFt|BfV(-xr2>I(kF=uHw5Y#Alhj3mmcZ z9ZU~Yz>&G32D13Bw}a#{|J`jGdG{RiM95>+2N2?30q;h3Zoq*yZ;@Jog6x!kq7QBH z*wS{9oA3=-+V*CC`i`|zeGJF6R`FT8E9gB%;Ut?X|rClpZWT3Spy8T z{GM#iAbbHl5q%8^yIIS~zLVbQJFVLz9@W4noikG3l^3)Ci+9i+Sg9v}$x&c|^cxXc znLFKwQuklGFvYPTr9IxfVMgmq*nAwGEx+$Ep>XZW-QTneREDea;Y>tO&e0fux*wz6 zD3=e4o$cHojx+uw6*b#?PzIVk$DWxN2zpjDJ_-Oxh^K)Koy^KI7zArgkEMY|}dxkqcke zgLD(7EZ7RX8NxtjWzC;M7T_}O)yS{{AQkqs{ysDpBmfiu3jhW{LkmO4 zD9On~coHA*#7*K?7x2Cd`6w_W&AM!IG)@^%Trwlwr(h7^w8wcekuc@a=Y7A;IA5lG z0lcsFQs#O7s55xW_`E4?ez^9(y1U9=M>L_2nFP5R9-L6_aPDbu?p4-8M*_d4Usc~y zqid^7ho=|9{|y~t4mas&0S+=ASSjQcyWB&x>djEr&iHbN>MfakyT57h1IFrmJ?4+hok-T2tl1~=*Ng7 z0VY;d@>i7j{1KME(GHKak?oKpcouWAQdGg9V@kn(yYP z-ATY?>Bo#fE=-SIi2I2~<%*?q6`(nbJ@CHo$htj@+JWj+?&U;wLZjgb-fw)J87-P3 zT^E?5%6$L@paNh4xBy@PGSM&wB|-k5{m|JX*o_t^HK0dGB=S1MvWXVS)kL%RkN<3Yv3-9OP9G-;u%y3fh^qf;qVod*$#KTN(**Kyo?lj!+mL0qf|4)0 zWG*&ExVF+Fy65(g_n`AUPy{dUsBZl8JdhP$_$1y6XMjVj1bwljkY~6en7deVULa1g zg=rtRF6o7>r3s=K;J;@>$AkySEysNP?%S;GW*WkrlwsrL=DT?#EY{E7BMP5&;+B2b zmV(8SIJSZ>DF#iwGb4U+FN;xT0OiESvn>mwWerf7Ss2-o13DMcYS2~Hk;rNMK(}1| zd>W+0Q%=TU*j-a5DwNk&5a9S%2wsxYtX>%Z@lPL|y_Wv@)ofw;msIh8Z?^FNXK?LT z8`s(BU*UAs83$Z(w2zUlzZ}yPZYq{Ug4*jsr?%@{?@8PLAjidroo+dW1h{s-K5c>D;oLk4yU@m;;ejF zU(W;u3BR?6h~VV3&j+&APV8#qptdvAcr4)AkL{M?Q5-Ot{Yee90&N55xkF5~5M-EU zn5OSzBsv7|gb6f=wiVQFpmozAeT(_|!De89DOr684rj$!0=paO^2)o2`^t2-*szkY8G!WlK~K0eNU z7MBA%7^@q3Ee~k0Q5v4&HY&ma?`Uk>T`ttNpMKbyt=&|clnSgkr-hX14Kgb}U24Ra z;#upyC+Ew-pFzd8)mz@4dZE8E| zZ=1yxs*g%JYqCey3I992J-9n^<+?Kxw%u|MZkvTUEIZQa9!57nd<%?)#i-W!6}O{g zKJ{#t{o~WHNr7~QvFm_T@siy-p-Ybcf~gr-UeOLpb8Tl(R@ukXc{BZ2(*B;dbwi`1?Rke@o5T`|Qq(L|GW4d5Rb-c+lDF4tY z{ebBSHUJj0^EjFjj>wCgTTX2q5(Y=jdte-J(QPj z3>~YBZ`jIkvU!JZc+l)?`^$unvu9ZU*34j(tXK0W6EBI~I^0>#@WX5RJLfd^$Oac` zX_({TmGtNqoza%TZkT!stBg3B4F}_!>n2svbnzCSu9u6`$U~KMTFJ3g7xIdM&HZRI z$t!Zs@#)(!irjUduCNa+j4OK+;`i2^qv>xWu}DhlDI18G>QRvLR7e71nUP^(_b1ue z?_)4&PP?F!K~TZ^a8zpQO@Mk#hUVqA?;mvqcU@xr;;XLQ{Yzc>cLgE(zp5){_9hOd zR`wPyj8ZBJ+??DTrp)61_Y#ANt&xjMiMo%YuG$y5f4&HJjy*Dw5`*e<2dA zlbI^A5Dq4ylBozKK4tz$p|$#>Gd^)qxn3Py3`wj&xS9xMsIsKQ%7*uQ_6_2@0^X<- z-Vd{WBMChGkvSvP)2r;BHCr3noJLlkX^-B!o|!A(qmMTL;S5MS4kXC2&_KL9+CjbE zXwP@c^jT)?A(V5d{_vTJoSg4;Lw$MHlCcR$mw@C79rYMd}ThqL3=}NMpDRSk=Sc{$|6#{mm4rmJ_t5&+`C@!L_kiZzQ++flKHH@=$N`cC3gc+PpK8;MR+^JHg3veU6 z`i-tr&qITfmrkTwUY7~Bmj*6PtX@$WJgFU&ton52(kb}|R#xQgmEk5{WkEU$j_wwvQeDRDpN8e6)`%G9<~E6JEI; zkv-71D{xg6opjX_OiedTsFfH0B6R5niJbq*J35sarRY5P{@O@N`i>B3I9O4yn6gP1 z?w^4hog8sM!8w*;G*wfPc9%M0ej2^x*kK(<0N zS-`J4s%*1r9AuK`!6Le&y@{BbQ4#Q|8&)zO8mYEwUI* zBjtz4nDr!}Z%p`hZ0f@@q{gDuX$CqiW)@*1133-~O(}x_82@nOz_fSLvG;_=uGuve z$R5WS1e>y~9isz;+H&EP%08WzNBRhDa!|_n589qPSvh(({+YGbB%T(dOhtxr5efBW z&Z%47iYH8eBKCKc$9fW!Q}53d%@nXU?EFml-@eP}XZX2n>HdIfCIEJ>4V zuDL*@T3hs{=GJT_USBhTr{-Q<=F#itHPv9r94NppyUk5-ZjE7v!*-wqt+e=w61*_tJ~Ava0e@#a=}uwy9nR)5~tRkX~;G3=|8{&!0o{- z{*m4kk{6YNx0$UGXt8ccypk*I z+Ek|$o7G=|Qu>>NtD&}8_6))HDWWXPCgq3FzgQjzcZ%V?R9>_G=BZ!B@-54i1I+!W z>?_JW#@y)pN;#QrwRUu74ogeVM>d-K_K(>(^9l;EwuYR(O9&25ncsKWw=(fkFU^{s zFy_B-Swo)Hke2(%Eq9)}9`Ac@gKM^9a!}CtvL#oo<|EPg!6mCygvc-Xu96>b21p!V zGZ!SQ5|o&ncpFi_8tS};PW?~}$Y(QPiXXx;2jPRlM`T_2k+RmBXwBUj+MeTy9Mu`@ zq)u)9D;d%wakZSWV9*SO0s% zmTU5EFod!Frzi^+&2 z2q*Ngu{#p7)a&gUB6$W(Oq2BF>2i)60_jP@`T#P?XN7?@m5~)fDm^(wl}7E5C>oWt zQt=-2_FMeXL1BUgWV+LN(HG$m^I1+ z5`=EWKqr*hEFq8bpYZU=Eg%(C$V9Cq@HJLd>R)2Di}4C&KfizKTN2xF{J^` zSVH*+5X%$JY63qeik!AL~z2MlW zB47P3I^gyD@~{fzEhybD$?tEPkDu}06-h`y6o;=+_D3|=d)x6yz|fRP#Kv{+Dvd7*1zZBgcV=SQ z8>FLAu^Lb5MQXmQvd1McAe2M2uxkgJT`ftYMtw$ac(sVTVvI>cp=@LW%ShP-RvwLs zZ)MEQ58arR$Z*{l&gfUPMn6mRjdYWc@+}JOEvW55rR}AIp(kFh7_tKplBuigE-P}) zz}KH|W9~a4cFi=e4|}cHy4xF?;$q$7fCdXh2ireGLcseO&fa=)AFI><000IY)Lh^+h2w;yc~Y&U zI;?5?8%9{Tm#sm=4ZBLMNK#%v&p-5jqFIsE)5BPF?6ckm15+c!A0|4A|Yy8-L}Zfo_w z1+ap!xZ=NR-yRJcTh&qYj}ae_EANhx5p(8AW81+Z^B(g8`JY&D1AO>+aH~T7Qh&T3 z*Y#J!yL{l&DT?9Qq!uXX?}blD!Pb*oMXX2y^+fhdrO_ilDl02R>;jrAe<{+6zpIHq z&)sKrq}hlPwG)XiPiOPG9P;(Kn7?&>_VU9RGW!>hq6P_Zgn*BY6BCNSttl&i3Edz( zm?Xsz`U+tw{9gcJ{BRK}z%N~aYT#GsFcB{_yr*_8A87@tv!}ZBdm>&hT{tN*UwBdC zbNbs`l&P2gD6DWdmI!<=&X5dGFUFv)Y4B5Lwm~X@*7+$+^-a#}ygd$;r?&*S0pdMz zx@C#+3NGEL1K#W}KDwT?mTO9~mc@qpEMibdDVQ#UKt5HN(||HQIQuh4p<3=yOWdbJ zh-qV`Yc&D6-r4UYoBaA346K>~!K^7&Pm)rH^?Cn;{Up%8O2{iPC`0C;350dyF$40q z*qk&1#{6H!LKT!{jux5T#%*6CJ$Y!EBNq^3&Y4=tqxrwmf#?s9wgW-_9>MVJB~ilT1-uFOOZ1okDoSXYI$Z3GbPm`<`Jc}PInF6 z{sVqLwURv1G}ZfjKt!@tXe3hY(4%PNzFP!b+O)snZN5~TS3Z#YEvrn_xLHIZ*Gdq+9F>}~m&_jhmYLi*a$`lk zz%j1fJOzS^JVu)&*}V1~H%(7=x{-aKh6V{%Dus<(ovp@n;cLVXBxzy9pi(R4X|)bd zNm(~CGbIAlS~R_$GJb`F2gm1sttPu^ zzbEjCp%E@@^Dmr=Tbh_~wJf6o4F3b{-MB0STL)hQhPj-f-W9miojsIa@7;)~|L zQMo#FLU2bww~Mxro)Q_rlRktDd+IHB=wk<&+^}ydw*A_mnyL|P9VYlw=V8sxr~fla ztV}Bt6jVK~C;!GBE>F`LRUz17xy^6geRi5x21MmdaGc7=W`IVUV@C`22@K6Q4P24L zCZ2H^MJvTxe}9@zjlC&u@wdpX?ud&_Lktk`ri~cO+rO^~FpJP5r9vjX?kRc7;tpH1 zhgX;ybXNZA!&M8x=9i}|k|h6DtNs0hdSR3s%O+w+eqHxCy{veN+c&p4pH@zJJ`08X z5n1EX{fQd;E3(oP2-U0uKI&Di1Rcj6llwx(9p~W^G#`pK&wqZ(H($`mV^`YyAZ+x2s5FTAyO>Cx z3#=sh7%Md7VSqn0$c=%W;R?#tF$Xk+^OTH1#p_SpZ*O(I|9!-*d82yeA zf9s71NG@B{w+5R#{7I5_Y?L!uri3~-_<|~zAf)NxnVHMG?Iw$PB=FJ2SN+U)Qp=%` zj*}vmms~2KP~y{dpFiOr^1LXx8{u#(=%h7cK|KNl+M6pw@2PG*Tj1omC>P} z;xjtiV1UVhB8@pn=?&v*4>7xLk3S`tQu7Zsh#zH9HPEhACfr!Ir(5^&)_H4k(v6cb z+77Lizq#UTW{c;Q+3Z2<2CTvIi|-zhou3>^79b7+zA_*0G@l>5 z2Latd-rOqfHu9P~8?NguP4ep%@^5nw1E>OOFb+JS{oKhkaRHU^^llho>+|wO>M$KK zYqk!Es?*pboAm-QUV!wgDDnVJ1!iwyFA|h{@gNq*gg;nO2u!T~S6Vq5Qtug5FSI(Z zJFD5B1K9?oJRhOKPv1tb9rn&ady_u_U5BE3N2GkWNaV8Az~R3QO?Xi zWRdT_&>78Yl%+zQ-$)9P+H;KN(Zb9>h_A31kFc^PfH17#{QK}emT$0i5SX!hv+!(* z&U2Cz;-u7&u}Q-M>vVJN5`6p80#qTv5=!Ex0@MeQ{^~O-y0CGgmXW^go&0P^0^p~6 zy_UoGW$_-vEtcY;+3#~v`PraKgk=r1rkULk;N(%E04TA?$7B;9IcW-1#oEelkJ2i;TN2zO-S%$bMphbmcUW9-YOc zos5O?aefe+yt!Zl{a17T9}!_D!pI0=?Ea?HzP7ug?a!ls{!(p# z55bfcf~y&m2RFkgHQ=}m^9&6`(4pcs2sanV*andkh$^}MiCB#~5~q}pV8}+^xCvX0 zd>po~^I}%iH>|rxaK~9fFW!`J3zgcbMsWo1DQ4rydqg98>pltd3LckW$9E{mOOB($ zHP7@Fo>(iR+xZmyN59k%;!POv<=4OXFLLqU`=$Ro==HzlqN0qb%D?wYHQqJQRG7SYJ zWwocJtQ4H%B9_%J82Rn|PZan^Kj7a9*99Ig+hJ94F4VFYZv_4v zF3-v%MGFmsnGcnB(C}9u2owN}^~*HYQA}&|Zt*$<|BAaZJ`7D4tNb)8p2L{rQ4N#7 z@Z3P|^gBOjFDbY*pHMdmj7aS+8LJ7*G6vrP9qZNlw&zB^rY5L!nt*6(QX{_1K$73# zYQ&m(E=O!@OqMn7_&&bNCY!VVx;5+8O?8^p+3(o+SS`M|wUp^}i>{0F@`I@0oauJ{ zIMqg01O=yRqBD;RmoSS5Z6HkLEw_xRv9}-GNi54f!A3)mAIx7i0mt)FVsL8@igB>Y zm-Nwsx7DvsVoX9axzO))3GXpSyPI=ZHHSrWaGq48dFS7pA8&lUNbyWlXCG3 zV6>`8RG!w*1dSpoYnXa?4Lx%xZqqNdJZYDe$yicK_c9g(wgW41kW#V(&O!Jdja~|S z?3RKKQJh+%0&mKrsGiEB-}!1x7}EnrL7Scv+;?yA;rr%q7`9aud)n_J znmWB?M#&hcS6>yI=WYZ9W*bnuTzw~~ZaY5{lR}MVhb7dyd{mqd0Jnqp(NYMDA z#$1s_JaBkw^%cpkd^xSk5}gZj2cvYOwCY*|Fgi@t#8#dX!D-`c#qgYF(Dwq%H_!}c zPiWBac_&Zo{zbru>#n1-g=pTRnC2Y1Upz*7>4Xi^iRFRUycD?96)H&{(>xh>^1*$i zQq6_ehE2t_HW~V&@{QhV!m<;QB5AE!CX_0YfWP<+pMp%m7>bA2W7yb6E1(?Q;5wmZ zRrR(dW@o;W%ja6GE8Cg0?7HsFeli{Wmn##Y!4I&|i&jzc{Z-2@ti>P-#gwdj6hPbz z6!O)%_G4*!JNL{&dwe;+=X~f* zHubt0y-cuwBPjG-K;pO!uFS}jp`TR@=kN_abN8Q3Ho{#t4yqLOEWWe#a49JUMZSAypra4aWTg??^_vKX5xwJRL zr(ha%NN@m0a59M?BmC1^&>3v9y-jqF-?fjbDoQEnft6*tkc#s7h^#2vm_4>G(pk(K zQ%SiQeYpyzm)3a7W@XCg0W-9tR`t;grFsF3Uwm+tMX1_P8_W?sOiDq#HjY&_LpSFS z&Ce^x8fORA63VME4T!NsBoFiD;acMpk%Z}tM?auhcfHk?v%jvh zQJJ#EZi8lyO1!-5fLC%;wg{{C<1)9V!m%}LPBAfgHe`o~Ua@S;H1f1rSuG6d;0Xcy zmEp!W-fq{gbq(>^I$$XE8akm14mOW8dZ$sK4-oyt&(K)u0F+S&x?E1*zFH$_IKp!} zfd&lcT_bKLs__iC`w_$&gHfD`vqiUbs8mno7~5SwwP=Oay{)sc$S1Z6$FTGcZy~*F zBw>#pJNO?cv*al`i*$EJnSy-&*Ycl&SBVz?*YaQe|JTb<_&=QN{) zBEPk{iw~ByZ_lSUGH!gDfPw)5?+~-1ZC_Z!K~dmFRXY&Kz`?(HSAVc8APOLmURX0( zCA`*}F!{)!Y?xo*QWKw+$;HZwOh0qBSEF;TrC`a+^n7X+JnhkLe^ou~_+7$p$OSc{ zRK{yw{?#&Nszx+r*v4#9J&u>kM4l(0$~6Uw$s95EcNWcj3;QFN3%fOgVgg3YI4xha zKq}0xw-1MF{dWY zX%~z=+edi4c<@$!)nmUl{fcJhBf7U=bw^En$@{T89-v-+?u*%`~$r&FY@ z;)P#z5j>}?Mtwth{f{bMn`Rq9rB82~*KuWclLS4$63r=2?Sl3w{N~U>B@b!u(%nDJ zy91ja^;W)r`f?G71qDyQ~mF_BNr=+FW|_9@y9>7BP$b?fByV`WPpwbsv6pd zd?Je#54d*i{4#`?>_Rg#xb~%72R2m6yfPIPONQ)xpec$uMN0nULDEOqEu`q-bnw_VR9Fi+JzE^G>lIc z9^9)ve_&p5Q4wX;l$(5`0W9wDxAeAbmiU6C#+EXVK@G1tfQ_%uwnVN?>8|P|W~E$} zZl`7H#CfUPW2BZ|>(U8_dX;?g4m=Sbi@VCS0-aWUi@R%o6~QSYi|uQ_)Alo2h`GUt zDF+lw3n?PI0t4$c6^}Z-LgO}-*I|E>?_@^pYZz(R-nz+&Ncxd@;Wm;y+D^A3V^Ghv zc9^}+au^Y#XvpH!1WGC_*%W5OB(JUVYnVS!7IK2U;;^N`b=MjTgp17%GaXZLPM4+*x-`FtF#0+F!dCD@!<@*20FzDCErz6|ptLF6k1YHPDy=I>zq9Iv z9~`3HAIYgCOp71nm}s>?-?N3eQBU2Q0x8&Qk9#$&Ch)~~ql1m<+fwu)!|7eT`34_o z=Rk$9xBjOJW3|)%O8TSLtg#%$f%C8Ot0AOV@o z-a*$2(z~D~1iS6gKzsksodNT6;ULNzA$U?r5Nq-+=$1qTQQf;pj;%LwD=Q0T?rX4w zMZ#lkVS`ifPW6Tp@a7CcB)M@fL-37Jb!5Mg?VZ`4RYISr+#}HVAVA7t0Rv)E)v?@1 z%&d?#d=@|xk}r-R?#qWbMr0Igmw>EZG{h?esFXe8Wa4m*qXe?K*hC?_%$`r?b5OU5x^=;;wVyGiLeGt@U6~#IjO+`a%8Z)IUC(v?I3Q>Rp ztN@O{p8WrC_6|&fMp>6`rES}`ZQE9*ZL=zE+qP}nwr$%t`qC3cC1AIhBP5V3S6>UQ1RhK@uU7vQxQ`XUngpcpI(0SI z2Nbi0ABZ1C(;(L@Fxx;vhWw7KLvyHWaSC#;lTli2HLGEET#jm5j>{+1f^n;CC&a>p z`Wf1V4>yvJv?tMnbDT3)&PFi#Fs4GAum)L@u_QNfQ#HjSOsv;BWe9{pI_VU>oRIX5 zh6<(wNr&BHtLjyN>r-qn)$d5Uc zcpR0Tlw?w{gWtdaT4X_(U1w-c9d~9gLX=iEz0gUj&BWSZ&dGK@FiU8f!bN8-$meqT zi;t(Xo6S&zg%sgoJe|$fXT0MOw=oRR`l$^B|nTV*qM6F(Kslra4mX2>%{mw)SQ=yRTt$F9i|&aSaQCb z$W|BWKH6X(%grPD)9yYy)uJ<0CZNJe`rfA9r zGz--w3RNq$-CkAf`u>NoNmZR&2TBnT=cG|QN6M(@fWA}VZ~;xQ)C|Rt2vw-2z9ooa z1G%MfrY6s|Gz$9y%e=H^Nu{Lo5l?#b+oOy$K`IW5G*21)*HbTs5ql|`7!tw-WLT1^ zCV1P0)a?4r_$13j>u6sV4`*Hd7La3i`*PzT%Wz|lcG)is&sqdYqiov&74$Y7<^q*$ zI`yoO1at%|YgywiSq}^0UUBK@i0E-MGY{cEoD5v!a{EqHtBHAR#Wj^?N+_c6xzyEH zXYvxYY8O{2?4~s87{zHAeD()|TUpN;7J=qOj;fJc`e9`?mTS$FT3gyC0~Aqe-0dY8 zHaayrrY^M3V1BVZpV{1U7)TfwY^{$lX>Q;`kkQTB+2@Z=L$^n=8i|69R(sYR z`F1bg)DB2|eeIC%4YVZXiW3pZk}k89FztgLt5t3=JSZN1IOINI2RKQ>9|h;sHH`Za z?D)jnN-JC>AcqGux8`*f(+L?~zu5zsK$E1oqsXAO85zPD%(E0vIswF%4E;#qqpjfC zbxS?$SLw0K4;C&2Gq{X96xwco-_9huZx2Vyc>T>zN%=)~sBwUNwPy56eo>`XP_d`W zQbpAt#a0>gS;?<%7S}tFOst2>r{Z?PdX^?OLFOKb!-1k)KhZxe{ej&re`48dT^Toc zovgiw&3H@ovDRZN?G>_3Szv1{U@beu1l@Ctr zC*joFCBX{I{`_Eqq6)>#lq(Ys8%o}%yRS7kTv_mZDOg0^y!Hd?T_)mTi0sP`A9%R> zPv&h0Y`FVYmPWutNj(wrMOTzvKJ#FqHJ-kv;7i=Lr#)C*TfANI4cC6t8}b~_Xoko+ z9tmuNY%JH9qwR(y_EzO*72&yW;dR8O!s>i$46UmEln?mX2JZIcn$ABMvr;D=K~LIh zRv(w`W+R}Yj|;D$Iizc^QTd+-8~rO#^9e|wDbh%5;;uuG5Z z2e@Q(n%)+WG6|pS1h}PK>sO9pR%WQmoNm#JrsOAYdvTGFDe~JT=m~ncz$=w_qG$=p z#2CEI&wE9kJ8^l>i^joX_bPzK{gq=OCCx)Yip%Zt^i;JsJqU`?VC1e8D)QPF9gz+4 z(%io?nloH$Lz=E3YatuilB>rq;22^?sC;YER$GR=dK15^GHCDH&O^c!azo+jV<*ac zt~4+OA67cO`OV4L;-{lV+PKfNH!>oW@zUSI)zb#2&@_Fkb_w+XRIe`0B%a4#&Y_u^ zpHv7MOg3tTNcKRD4Yl%6QzU1>DwJ?l&t4c#C3VCbtTL5lhmHa(1rWT6#g3iq;}I#e z4cSH(DAC5py@H3KJ=lq$odvCDGE$JW^$ns&^upPzho2&%*)f9oCseh%hMbmFl3WPN z7wyQbM8L3tfg=AUqiDAO4p~spKRM&?5P=Rrh9;hKben#g-XWxyj46}%IKG4U6}c73 z*x+wLuqu5y8<5WU&t>@O*y}Chi}}xn?e3s=hfk^(<>k+Dx1F(|$1hHeZr@9{`16m; zB0wxNJB%I;X-j0Fj5Tu)vC*^pj6M3Uky-HW(4dYv;E^dMf?1-~XEbg%oX~yiKVpn% zvcbu*ZBZ|bZ*{HWoONF=#z3FXseArKlVq#E;*CT?YZR{jP7}zTJA;QMlGodDzpL`6EAkoD=WO#f+qEn=DRTkxq78_WhIY_?5f>a>G0QD zcV72Xc8T|u)k=U;5^0R%)0FpiYxZ>KwI|v4$MiNY*i1Md#!A>eXBO+sU)$kZ6>g%9 zdd{r)z)Hh4eraMxP?H_>6p^K!^bB8<7Ealb`+||9Kq~NC;W0M);Nw7Km<0Hd@H$`e zqd+c_gN7K8S?}JzzSrn4v{NHn;extzw{=n1r*0y{&nTF3oKTRbwbJ^W@naJv7YTY3 zMMa-=$r>Xoh4|M6jDvx#J#v$)BJJ{$FmSwA)Y!;d5E%yM)q)LXo=iRh`tvIgo?Ehs z8PcsMpird}`WZsITCwZL9yT*#*`ZbWkZU=7`{c~gtyxUEw9;II{ZCF=T$P4CLsNK- z;Z+sMtd01`NyxamA~_^%=M0RZoXo3y7_=ukNXL+#h)U)33@1~E8GB*WBs*r#Lc6nz z`9C5f!8Wp(LvQk#Cw%0g0m4!UpIV;gbK>Hs)WUU6FU4gyP=W*R92hll>sz(I7>9g; zpNwf&pRc=PB*eauA$X@cC5S>Mgbepqg%&bq9th)nnQ5fD^%pCGLzi{L-Y}sX1Eg~& zLDD4&fCU?GCutZDt!xDEXHUdQ{JIj$^u9yM$rMfXU~#;|hSvLjleVv%(Mj(Lr7phw z^Mi*VN6O^j7=ufTR%r^UPd^YRG(DX#=W#CrSj2DGbZh#`D2hhPyqbR?5u>(H^xrO+06O0M0I|vMtEbyXIty=^HDmITY+Br*G&DOe@!x zhIeezDNGs+oG&DPJdSLp-5vjXJi_|Cd zp3}#850Ey^4eR=(#b~cC#S^WY^)}1y8p>5*#5TYSAJvD-qnqj0(~CUl`}ZEvhl2jH z^(Iq=CA$6AQ(bB3DUxi^HQbX{E-=zl|`?e?8Sq8wsZ|z(jg=h5P;^b+nVdU!?n9$iW zI}W@1QWEz5R~8m8Ge4zX_b#hr^A79NIdz5io2yXM4?sf)*mp?P%y1EG3A>II51Yu@ zZ{6|D@?_Nzl(E;I%yGvfxW#Z|>noCrVmDn?tf!Fk1Jj^;*h%fNA#um{Y8H^-bW06nLGAyzYaBAC*;svTGzyI)_-!B|OS_LdAw$d|r zz9js~32UT6x{@@YsaZ<3b+yuuY>Xro<+xip7o|9!0uA1;&b{r z4J8Qrf$oNVg)x2O2*lD3CHD&;&|0*)Hq7KDlrT0 zJGSf-K9PR=28EwU`}hXkUR|Ov>jsiekD!I<27VDVIsFM*sTCPG6uEn|iLU`&H9p?_ z&;{i*f8%9lNJcf8o6>G#j0Z~*q9b`?$RKdw$?XtLeSG1>HQ<=c_lMk$!@$hpH`@&)=oGloC6r{ zXJD}JLS4gJ!!~6pTLpu;D?+p;@Pr%X> z;yHSwfm;CXUW0p(?%N8XmR(raTkianD6}0NsoBy@caVUGO2papKzDR)lS5B*jHOWk z9(@z9YEGseNOWvCy`M?Mo|gVSPgHFoWg>Zf)DkV78bzhER@wpuj)ZQn3F;0`iiB^p zbiwWZW#i-}6>H$8I5d%B4y;CF@#8_5h*fLQsavCH%tC9?U3h$f*MKs@)LP;(C`kI;=Sp;a~gX??(>ik~+ut}f9;b-X9g@vRB? z`>I793p^d2FZsq7yznkAlt2Pq^)CDXt0pFdz{d0)F8H`(fa3nai!E(9J3`WM{-!^* zS%yz@9l_J>uZ(_BY{KOMbSG)WsRA^gFPhA|XfwXC<0@-zDDTl}ErZt0wIkLa&obUI zmjumzn~X)atx0B`Td5aSKiRV(eyF#40DLRY|NbHnY9&CbBYo>I@J=_SBj6JsfE%+& zFqsA2B`~xs28kc@#Rn|Q=otc9=i=BWsML=7f$dT6A2OWIX}gL0Bg4S|Cd2=^`T5_C z^8YEr{|r7c{;L#ss(X4RET;Nw*><%WF~$(+|BV3#gd~pV7Y77DCWJtffJv57T=_*A zpBgjV zvQ&HGFePOI0v?~{dmFc%I^;=ycF20ZJA8f4!UmP6a$!reV~3NvHD2@*VF4<8P51Ib z(Q`E9?YbI3VAFmHLi%&w$F^y=Uy{xh#c^xKi`&0%6ET>BHOx=|%bS~qboLN$;iPEI zQz*Kvm>!(Te%Xh?7G}Q?YRh%&YLl>A10`4b#Z~66$uixd5SCBtwH#==xO=R8-+}cf zy58aeuIx3-;4Zq%U4W$+x%j$#mXG5Wi0uo5&uLdI>?O})isP0}66fwst#B%O@qmo> zBOQva^+pLz*JT$4&F5&Ko9ot*%!lB{rGcffp~|ei)%dY(Dan`y2hbcLLIXAWkp!sr z;ElgwyKXkB7fo-S{RE30rk7WlH$;Jab3PA|V6qs1aHQoBd| zZQ7wnH782MgNqhKZypu<;zDzI@vtN*VegR{cZ+o@@0e7E`78UH$)!aU@jLJnZKKF< zD+|;Vp2<%w^H1FJYC8BP%}RClRhp6QHN40w+1VFftXC@tD)eoAk_!2tixV03%h;Np zK>^1z#o;}1>NqRp04m;^6*Zf}$i(x~z8_lH9CCxG!BW~+7A@6mE;JpvRU{bD?4z%+ z@Z|hJESlE3b9fHbow@vTYw!{-%{qR+(YC9Fb_HUJvlwG81nMH z@VHm9j7?RQDb<)g*4#i0MLZ8!51qL8PnrM;4m<1SL-i2%k@@PJ)uuEmix@)^L-{Z# zF%-;u_Y|aSsNo|u3GS{;a`L*#sJGCxFhZVg^JV3TBkY28A=an{cI!@M}cvFf*i;SG6^`5g9^yG{Ck_f(q~Nqx-u ze-E7dopL}e;A4ldlJtG@s8XlSs>>sWCtrgL6Xo7D)F&e?9hQ<;5WhrPfZvGVp(o3B z?Do3Im$BU@A$=eAuDfmePfDg^*~f!*tIVe_p70jlpf=uYyNT7jMBiJ5n(r#nF6v)S zs8p7a!51>}sFrYp)hN-`Li(mRI84b*T$!21ga)R+6Dhz{t|>!PsoA0vZ1d`RQ{^i9 zSQ6qw6;~F)up3CjeSvi=OUTfmfo#Z>ekRO0rt9d4PX=R|8{cOrt8=DO zGZ?Kf!{v^ccCS&=QDl~UGSMDUMhA{W$E^)bEo7Z2gsM|c(UDqK;W-a~2w4>J7&!AI zV|5ZkoZWKc_7G`lmp0JHox=2^n1E!IoOs_~E|fi934UAB6;NK*fsLT7V#ZUD7Y#2m zW6#2$&tiGN3JM4tTMD-yc`<@2e_^lBdo)?(^9F>xdEuB z1;QZF#DRMhd&f8>ixl5P5_ef<7VBG;)c-JZ>T*^i=1`RQp(;?s7xc9ivmwACrkye$ zN)|$+eB=0T=~4})aCBxj>{d7EZOzafAG1l z*@qMB?6%XXt~W|i5HiuJdrs3{#hxZyo3^sg(kN}+9GkWh^B6eJc+&Gir(1L00PYNb zYA=s2n5}B+ZExWOK2-eaKNkIK5-*3*zu7Y|133PsiRoAK0tDZ9&bfnDSxy+-V<5kT zPwtP*a}8w#wAa)B0neHrW-bTU;!^>DF`N7A&b*w6P^;DA zhzpV$iD)I1U`meY0T1*bp346qjxjis&%W4TZtO8X<`r_h(40N4r(%uOmr_A(<4p=p z_DrFBSn7=dTLlfKmgZjqoZ0mZwoysErs@r9xcq__tibpV3~6;U%?o>NAAu#Dn|&Zy z?HIm{!gGizj8IGp^8%7knwY20+JuBo2fiv~;cxpZo=(@kK=osofq?2w8WRqAUY4a3 zxfEDJSs$!B!4*-XS?QCjbWTT;=8xn=gy#B;7*QxL$?P=N>Mbt%;sFwdJ6U#0>sq*W@o5dGwSz>1qbjJ7Lud;>Nvt9qx&Bc6M z@5&2t(N@tugq7jd;n3)JdWh@+BkmB57v|erc!pd2q@C)}Jh6~?Iz$#d!i#R{kw39^ zUumjs2(Ssa*Q`GwJ|VlXW=A74*A^k75&1yDHF!3Msu%?$Ek#X{ z+hOIzHO?o@gtyC!aOAUbJR)V#U46ZfT<8+$u2_TW9n}PVy#ntl6o`*tSHuBTa_W0hfCP-Jkq2Tsn9H5g^js25KjwAwW+MM*=u zA2xf|(*P|KLjX?k7IF%mRhg?at}H1JN5}_tu-0@lLpF^AMQ1o4y_nm1xe$$Aa*GCM~&AfL-cS3`_-w1g@ z((R?cK*;VCvxn;498|Zwvs8Ux9<%#E*zTZo40gNTcz(!Qxyf;Rec2m`Q&{$3+K+LM z#-9(+SQp`-lt%X$U_PyG`9CfPa0Ojitm;kF`U(U8*Qf*@DgC=GpB5mnqYq-VKAtTcRcv79U-3#`6YGUh=qnn(|g>wcT z`*+ZmMG)(9x~JmaYR7A-k7MU_$2oun2ZM-<9=|Gq=5!+`r@Y?&NJjx-9i0pIB=@Ee zG*Jv|n-G}(lRob@sC1lc!iXsEHt9tCq&k6CjU=F1JS{MBh!4cBA>t4(=Y78e6s!dD zZ~>S<;_%Pr>a+x)X(1ln%%xsJrke_{-}VR&G@WbM&!56|+-njIt^X|f>ynLV#tX#WOHLI?#M)(cxiaxC(T>F0r=nd(*^epe%5Y5#s9d0fF*A6J zr>D3%@_uuQ`S2zZCAOD5_7k12()RIC`MVZwphWqcX8LThomlUBsLp6 zde`s#7gPUinT_NoHHKz*BXT58lwNXai9_#oRUblQ%ds{=|okQ??6 znsHyvCyE+f#l8n8NSTgM8v`%RR5H2S2XOcmG}Gb$|LOof$oN;0BZA@%C1HG7fn>YK zi(_oV4m$jhfq8UaokGYg8EFEcc!s7wWVE?fC#w(F9rJn2(P`z_UVCb&#>nnX|6BVV>7`3iUK5iNh3mA|95~p|N3F zhmAIgEhf`}j$u-)tui`qzpXT*3A$1Q$B@d9cK%!m+tICUt9@ndlDff$k+x|-gt2Hs z!sU=84mE6TR;FP4lE`28QE4_7N(No%TT5qEtiZmJW~!e$rudBMIlxJHOxdFnNMuVVUZe zIgn>hCPw?8q;bCh?{5l&O>sI;?93ASX??aMkP)ZP`oLShiI12Ln7Khw@*&YO0?Hk= zH&+R$xuZm|kWVpX$|gy4$|W9K3kK7e>5?0S<1rm1BGZ`plASV1Y0wF9<|R$|6voka zi)%Aw#o95)QvjA7N&0MC*A+(d2BtTI8?N-;{`|vJkcM-qIfnc7>jL**hwlIBDg1Yx zLI3m={y)aPmf8=E?JG!|6r%`4Atq$WqA`fsTynMyps{cUQ$!M^6xlXjAAJ63$jEO< zs(i_#{PD`)^3-3h>miqx#>xD0PVG-IjheM!$hwk2hvFCsHCXb zJoAGh=;0*y%@fyS>pkz^NaEuzP5efH&V5Q4>vXv&+{iqw5MV!rU>%1QqY68qmY^Wf z)>#!QXk=EdT>=5DYEHnZIwO?wvXtNn7FE~VknA9A#xy48ElKPw+74AYWSmS3TuPq! z?){l^u&b+1y^VFaI2K!!$&u90jT6ue&6v7(jzWPoumOS}I+J@8#i@^dF_%%AffZbG zLTP-#e5C@zc^!=uD@`KfwZ~W#3Sdbe$XB)gi^7>5} zrsQEenC%y!Yofo9FRW3!R~aIQ=Rlg;>Qwxn zD*WWT;v6p(qpHoa8KkPu@?y)?hmVN6$x$w!lh7lIR+o#G zP~LOsc86$Qn8+;M8H=h4 za5GMlYGDza?F;}vEDN7XzehW-O z7!I3zj2ys&C&0e}LfG(Yl+@9;QZL^#42N%5Oa3Jr?l4Gp&$Dz$#Q)jSc}oO|SBv{HX4n&*&ttl8T727cny|-hdpBhGo%jet z!L8X2FxrzvK9@v>X2Oj!D~I&E?FL4-`zIMEaAoj~yJY?0;c528Wfgz+IGk)hY+TzE z?653oXs_3o+~R}6)iD@A%}RcfhjbIpKdfswKRhqbA2R6wyR-YBn_vH3i~T=ENJL0h@n1ddLbYu@ zOmJ*74`Mx=JO5aYeNO0 ziv<$1OU&kq>lXP2>Wb!h=IOi-g>v3!N_^QLIM&md8tMiCRd@7Eu2&n^&z@b|j#tsI z?|-WPK>w!tDl&i)9Y+W%{Vgp*k(ERTu_{R^K8hwKpee#3ih`~58!Sd4w^tz-zuW+O zSVeh1zz^cpOSHEc=p`yl#SWRf+@P`Hy($bpE1qsUzWKV`4VO<|!52;W1D;Ru*06)T zQf_Qr>d*~?FSb(6C_?RUN9pdd_|Ap%FVh?&l~^aKr*1O7PthJsN9oQnBq>S;io6(g z`*uX}gt9h2G(-ZgwKTY}hry^BH8xi0ss4CWaK0)lN_xmC2AO_<;gj%MZJ+t(QhchN z+Oe*oLAMoFl)mX2@JCY?W>Xv>+(X3az6ZPEKwZfzF6UFv@Ca>wj1b71~0CWFGNQAg2+*7+X z==10b;5ued*v*W2kr<4pKpbNA_Bs5Df>$jhEo}PKi5JP(Tvl=LHE4LxSW9n#({Rk{ zDXb;6{JLF1{%wdDzoM&XKaNQU*CDz+nPT%_`l5 ziZc6tRxwi4nD)ejEuV)=Pb`kw&r_>~%D@#GcumL_OX~q65^APH@q%FY%j3bf@=w*J zD2#S#4ybZS$1)Mor5c!MixmlfWRym%t!ZFO_~e`>cAaRA>t~^l0!34KE4A zl`d`ss0!CkvIk}EjZATLd!E^Ac=6@Xlvo$(@Ulu74cSa>PiY=~lZahT+8$>NTacth zPpP7JDiB*sH?Z!d8`>=-b!RTs!;@`r?z?Y>>jj+6bR?+16)Z}p6-vkIsyc$r`$15` za~i{qxrHSjbglH@P8+MZam~anfd$t6ATV4vS}@)H*C^Txb`Zxb9{|@>Efu?vRg@`n zb}~z6K+={Y`kK8FL2$GAyU{IG`l>$f@eOa{urKKI6JIXOZub);dqE9dp>oV08lrFE zLEU>wv@@>t>);jSBYAY3CIjq|tSACnf7651#{r7Cad%16 zlzwRy){g8Nui{>bXRq{ZH__xcyiIB>(jI{ zp&IZ^fv^_fia$3oKr~01UD(lma)!sSKV%qBq7Jgt%3K*m2h>?PJXF{-Opx?>uQ&xt z$PhWCZsB1t+3laZ~TAq6IiNI1aMaYi+FpniOW>P~Myq1&J4-|X%+a1OdfR{gM}h9uGB3ofVdNRGxpipX){Sj@RSaLj;<-0`o%% z{q?#1*>!u!WeuT^V|NsW_C`r2??)Iu{E5CGz`g}hzlZFTQ(Z^470yi93`-ldg{Gcj zcIPYJb%z#>9*9qh1a125Hm1j|80|}l=2VUW$YE%RYRNNr9?Noe_w;zxRXlK58gdJok z4H&CKhWrRAx$n|T!o)Rdq{n*n;6YR4czo0NBflN}z-9CuVRId41m{8`>*k~;Y0K;C zTW3poV2iZmZrfW{B zYh$V%&pLYdI!7Jk94IsPTbgtBtq0VH?6rF!vc$8GeIJNv9UoK>xdX$w!zBsz9>*Bv z78|)$>R5IZNwn&23M1GgMlbX!&O`YTHHKE`+JxUicQlg41G|QF2!SHn620fUglj@#!%8Nhn(9QPg4SsxTL_z#6ixsO7<}gg%IQ*72h!kORII8r`^vOOGwkw;8 z+$GI0Nj*x{be~fJzZdso|)7r;MlRCZP_paeq_s33Cu^%=lmB7NjDn=KgFfbS3Ko@1dEQSqL|7D9%jSi!iOi=as z4GcyXMSrtb3sVS1i&Rj%v2iopGcW@V*Vv8q#(BTDK)?+SUKiGY#)~ez&mCaBIqlaky$z3u9&-q)4D0 z_3Uz{ne+qkUSz9RSuGb^j0`mCUZBB{h4cZ~dw8qp`-MRuzh0SX#7w&Q^RuRV;5cco zzKDKJ^)%(td}xw1ZEdAWd|WOY-ZZJBH>9J%Pb1|J7L=+1el{&Es|%!o^NCItlZT;d zlBx)b*FtX=1_(@ts-9GvdW<`_(4cm@S$naqamS3*3eBCk%Ea(IhQe|?ai$DfGDX4J zl=|)HJ2mGY92Cn*5}Lr$TBjuoyp!{$JDuArXtknYhfp^Y9q#O;)_OB!&-sR8Z_^{oLg-MQK&f+9S--g@6Kig~ z;;@dR!9IaUD(Y-t`|cP9M#+Wq`N1tkUiVAu!0;(yxH;Q-rNB|Q9)-eu$HB#=9SJKx zp4JXv8_x7RW31GwPuBI{gocCnG%i;jXRPMOrOY634`llyqj8*`mFcaMpCzz#YH5!> zndhgwDY0uiqgo*0u&&FaPYnr!*aWR35oj8}1E#%7(aO{qi`!{*b9#1A*hnhA4AKtg zgUP(vdp0^}$BI2c$>1$2OX>)5>&n%B_^K>PX6D&zV`&=b#kZp2tt^?Ap$j6`>DnM$ z#}m9^I@ae&}rvPI%U!)Ffql}LSpveR3jCrMGq zYlMT0)ou11Ff?aMY95dV^FoUmtoHClrM3N}P)z>V;oaqwDi$}si~ z4W_dPn69==u{+6d2lw-G+ZrfiHy}?!9!CW8Gso8|-cE#hS>!}lHX$QGLN#mnHx6o7 zHO-(+8(Cm{H3s@n#a>BhjcT^`X=-Xxc~>lT?f7X=A|O!>Y(umbOt#1doy%YkLXrM- zZQ=Ro?~#1W4g9iUwuh!mU-=bea%i46CyYDsUc_WZ>tza{@5px zfC)p&ez7NkyyC`yJ3p1i&j!&rgv)qHG42lIT-2=9rYd~7cnhVbuFUp5A!+@mYwHX|?e%4k#61jn`88vdgWuxt1g|tgfZt z!P0Q(bjjSwwGG{oQn|!N(D|ZZZ#Ch{sLRMkg%fL9oW&>=sTizoNoFvqH&2C~Vu=$B zN+kRWYT*9$soIMyGI(yCfdZ87p*=Dq^!{GI*g$b)YOp_Ctx6GLOvwa zjQEG34^hiY;!d1m$!$3H$Xf{kRALZy1SYM^4k8$>^AB4;D4EMH5J-a!Vw|EJg^EMB zca_uaH#}(nV{BSjKasrLX??j-B>Vy)Ka468)H<0xN#5TfVWz^`@{)2X!@NkX@s_pN zSs1#)U!=y&0no8~oGN3A2@2PXnpwPBaRx~RC#1P@=duD6exck#7K>r*g}Qt%5!vbML5YFTdCCy59Y+kst%>jxJL+J#_)?#GJ4_LI{` z|FZM<2k9d)O!$F}sO`gJYzoK@`V&4eX*a?YacA$1CQn)u#JGG%ShX9h2Szy? zis`fqs67s^DHge`6hA$?i`5`AZsje>I{1%|HX>0Q-BFu7Mg4eJqKRvrb8!mib|z~C zDuprNY(zoYoV6^%KV=OURh}Wj{GEYlPM0TuV)vNdyC0mgRWv@r0+XjdG6)SGvu`0N z9~@_3!o-jdaA4YkmDyhdOu?8qm?0gxp6X*SOc%zlQ;QN%>nZnxL)kWk*A$pVtnV$t zRw|H>Xe$kiH^hCvt1S$#+ToM8slq}1K?&{%KhS+;EMYz9es-9--8YnpU#gp*s#~0H ztM6B5;tK4>Q1`nXSa+JMIiE|99Iw*ptK~_cB&Ze`&vjAuWJWY4eU`CviQr-YfG}*~eFmSwu3R6x6 zzAU8dWfDnr-D~;{{zl|N6?UVs?p6 z_uofE5IMbsPsAm=*$>C`Q%z*+?J9hvT`z3g9X7jV-pG8wUhg@pM6oHu_*A3r$v9(t z$(QwstwOS`I;+yS(Av{{4Sgi?V+5m)vv!4vYZI@M;Y|1fcpjN*tY!dT^S>bNNSm&jLM`% znuXH*YbcMlK|XCo3^=*WeVn7Si5k zur%4;PAKXu638#-9H^Jmye31hOKy5*71C3UDW8k_JIP{z+gZOfa)ezq#j?>v(ojT< zwfj0_xku-s65t9ad0DDHK)2#;bo!YA?{_`o0C9xN3#>}}~XMVfFKH^DASj1@RNrt2F9h8(*kf#DBn31Xgdy2PJkw0+D`(%kU&wu~et zFDXxvre9jOk9*P2qY+WY0wt+@(M(OvAifP!1Ldb=s<-kC^FlGRMa_9v-QYN7doRKB#!}HR>M1z_n|?5dmJy&*BhQ(n|aLbb%V3JZ^WTSc}s0WdbA%H zRfElXFO&1)g>c#Z@jtt+-Sku}96v!&6ZC(z1phN~^50QT|7i(|$tfu_F*DHr>m|KV zRmxTAA36T`^z;o-$Us0f^1P5D5)xE+mKn-J<63Sdgpv}rQELx^Xb(pv>MoS+FeK6z zugbx{5I`DGifH6eV6YE#>;`)yxl!6uA5SuvrHF^IjdjyMGpc&L?XBaC_xWrzI-rw5 zGSDRb;wT+Z%^EJh_FA!)PEJKejHTNI-x{-v`P&9x)eAPeUtlm1I~b|Bh<6n+$HGq? z@KQzQ1Q-MwKm;p&k&vT-45ax)2Q>gdVgcjlPbBgA+zWl%DQfvG!!cor(q<4wZr&wbp7DZj)4?|fE0(Yd{q)hGDSe8ARS4U8Ik?ct_vf$_W3m zcqJvsIF=MNduwl=>9H4kLjQM;pKi^#F_qY7QY=88@`|OLU0^P?Srd!$xJ>T#(z>bW z!WsBC?RNu;o%LLx%)WK{PomT5uIDO-toHb{Ndv&E3>#cRf^^>!M8Hjb5?SCyv!| zC=szIGOCQw^L0Fq1lLxK&V;++*M1L|xqwwok@jtdS6)x04>9AML zk&~hIiVQte;llwWL1{?Z7Z!7`BBd)H=jDx6(7vHI_3g7_1CaY zOJ&8iEhks8&CKlqis{4gT_HqTwYe-y390Z!An9eFT!X{$?-j*!PhG#3U_G4i9QLLg zpg=aTgJG^vW^s;djyZHwh^VmqB_0sxC~2rRaiK0d+BS)N7LW?zjC?^j)kU^!p}$9e zX~O07y+1q~GWzCTP#P{Su1X2*00b}^slavq`hY$==?T8{AQRTXXD2m5TE={?yR&th z{3T)TOvq*)rw_)UHh>*Z^%dTdI>tgDG7;UrJO?XfimnI4fbTC2rqrfWec!e1#jGgw z4h*iTLhZuTS461F)OCMdzlq}iWBPHIoPu|)jnR!g;bO83jR#l4wCvLvumsfmf}F?I zJ}p#jpvp*2$fQ1aLAgc_Evql9$kf72y&OYCbG~w|UfmGGzYGf)6&)-`A=$9cq?Ub>7Cb!N#2h}Hkh^4h$PP*z9ZFfO5 zZ*NPAv=I`IUw^1$9=$`S3cEuTP!58udrc#k)!zZHC`4}a#Rv2w-}Ca#1Mk|t27BRp zCN)28W10Fh^?Jpz{W^8+nMLP*_6SDyYax`8tgTk6cM_6!F94=JW29dUssk4${x#wYc_xfl2_rc+@6wb$xFk=dxT%7>_oiS@oqh(P4fNm!PGIz#;!0%SI+Nj zq~e`$$gYAtSu)feT9o%pqtX6N-|zi;1{gKdiSo#qL()Vlez^O#(2yF2yk%WI4yz+Aojx(aK7*LrW1UYIuKm z|8_Kcb`Z+oZvgZN0_G3iOvK_zAc?e*F{Mc#@$whq1JZe1SB@(GB7i0`>tZMyx*RdBmzPc7ug-Hu|gkiPKJ?!i$rcZ8>>0V5{A-4rTDRYN8K{&^CmrF@rA_|M`8rvAS=7Y@W5$7OwUv1vK+_qn zjbmzM)a2PTYiz!>GFyIKeq%g3eIdeeYY3LN0SfBOsgwNYjPRIQHZ!xTLV_4II_VR<%Meyqltx*m?`nSoBUf%aJzdF~Nrg>UaJa-ZpiVx2cHLXxpQcd zB-%{jaJs|6XFwQRP-<*t+9$Eyc~UIzXx?+z&hJ8faL>O3y?1qi$tUFDlI1v28SGQd zQVi5PAuEOZ4G(|wLForb^>r0YHSO{POW7*`N}-r3wzSPq+behA7I9oYhxW$1jDaab7X-&WMsszP3F=R{XRDHi)BPUvqF z@<&8v;w71aRvp42lCQ4vJu8GUiqmzpzgP?W1=v;={9Q&WGGm#YskG7MzkJ*0ks<0DP7VHjj9@ZLfubloc9j- zc^V-(9+W)G)v0_vPJYoAJsl%bA0KJFs*^zSb#Qk#jw3vKU*NIPBhER4Qm1aRpy2Ef zPS6QpN}3fEQT)5}G}Mp6k>9s=Bl(IiycQ|l1GC8C!tXTEe!wbzJ~G<_A#|`NyQ*0a z6$U}&yawI52m@ne;1nrc(&Gi~k}=(=FCQr}J9-a{WgsBh@&y=}Bci*s!~}$}qUU@2 za-b}146#M8_4lU{e-21LVt~=ayz#4S@_YeLf|v&NtcRdevMJb-ofvkr{A#%#Y-KxT zbo${U{A7~MjR@c|RvUBV&nk4=ad&Rvl7nu^%hXKz44wo$o{h*jl!JehqnzFnA9LpV9x zLdj7&>i%gh&M-X93EEAJR!;^Cx4+;o8Z*e%=AOA3EvW1jG#5lTFp|zUR_jbsCh`H7{MA#1i~ zC5l?76e{!@s#f$9Np}lsY?Mo-dRsX3Y0?FeYqp^ViljkYEgzaCwGhxqE0%ATZ!&w8 zqA+lVSkB)LaIdm$pJtk!XNBKJYzZa@KlX8mk0AFRzHUmVYg{vwEf8X#B9WctvFz)! z9PKrO%WZRs4$<+*NXYHd@r3!gM7B-sQWoC9aOiPSjBY2?bfH`oq*!O`R~dwtGzSfI z=lX{Cmx*&yaCe(T%tXVFO&>vzB5Q)JuSoKRZBf*1T8 zmLiv^OJNxYAB*#lEHoYtbNG-_l8k5e)XIFXNSySEIKidB67wV=oiOyLKXbrf56`~o zW^t`z2>Z!;&{EE z@g!<1iD#8YO+l`VG7tyIE&UPG{B(g8`T{A9JHF~$fye%7u{iG-0Ax&@SZCEAVNS(2 zk7ZHj57=LCtp~&Eio0KmHFg;PwU_hv8DqhJ>wL)nv$y=WN7oK@IG6Z^1g|T0{;hF? z--HYTkc9f#Y|>ey^leymtEIW{zEHaRwZT39wYZrOLy$CWHwqGuTsB){2TwmhY~Uw)Oa zx|y$gd3oQkZy*R%xAEx{_kNmQQuhJY>GSBN?tZf%q`D0Et4Vt-^!MSzzQ_jx2rxvY zd3O6yaT#xl@5KV%l0&Lq81TgMvCu~K@p-Ivp$MpKOIKNh)>dn~}am}w_fm93wh52dZEx;?wt7F5Wo)NrTw8BQD-_Dwrn0 zqu*OJs$!?;)#Uo^LQH66L?SY1p(isN4Mclr_Vr5YDfBKS;Oq0DUBT3n#0jOWrT$p0 zRDsE4hz0 zWi;DrInyjl9xNH4pz;>bCP+BlKRJ=wXVg@(P###WxX^U4CQ6O0lX1cDQf_)2fadQj zZKN2`ZB1iuH1C&_PK1c0<<1lr&dg>iTkCS6$<2&z{GoSVP(wSTqN&_q^od9emZ{MW zw{wj$wDUbx;&2B}do$4L1b93(D(4g(8(s3c{QwYQR7b7i>UjRN%NE89Kr1Q@c42>d zb27HS{azx??%6V>crvcU2uDm_@!_#&MQz7Z;t?NKc0y%zF`1Y_3v+x;HJ}^bMVIM?n4dFo@ND7@U&1J=J}{2F>7u;ywdtEwxZm<;)P>V<^~Q$7h2qg^b_9~ zr+=Fap74P6Nb9n!WrdM16@UsEWrjl<2cx|&hn&50AXs|U>-mM~KHnh!eBARWztvA; zNvjE^drjhEK%0*h(8m4MnJw zPx(437Ez!S5}jcz2s;_=Sh#$UG^;(F>@ByvH$?sX1hsKEl^sdY)m!ypA_mcO#+w~Q zP_^sE&*sag-ayyDo&qW1AE5Xm@8o=3tIalthizZB;>~B6_Kd)fEdF|v^&Anh^zNeb zPD)id8zSRn5p$?{Q(CdhSvQoW$IQ#TkVfO`OPNB0_DfT8bd3bX%L7tP+&+Qeqj^3G z&u$rP`Em%yWiD#%nv?$%CMor~g1~ym*$cP#!s{LX&xDCbQn6|=-v|okT!13pX?Z@@ z=##9i3R#AR3=RxZ0YtSc7(kob5)ZB$6N>D9YK?86YFls>%J$*=zH3f!R5o zk<8T)bb@kNsL93UQG9=k#nqlw)`r=Aj0!>WDIw%d#`q0gn& zC6c;?_9?CbyKsgn=GD58PY3>mOjfcQcGY836A8yArqWi&2lkJRwhG&Ba$b5*_sCH@g)M z=EAQFXytAIV;I>z_BrV4)dOQ~u*pHHNVU7TVF8#UbIC(==JHNv|NOzEm zZ8i|YZ44kIZT2D4p@nP$$^y6Hxe$ISx==;J_2BlG4x?O~2+rBcn0)UkgNi^0&_VIZ zs2d=W;fbs~+Wmnf<9&=?JOHs!yA{&VB&R(psEjiW)2P=*t56Yw5iyA(Th#-*s7`Ek zzCP4)SqpQ`L%p(Lbj~t0jnWAQawAz(awBqupnK!2T>QTJV95JZ)O<^Cmi2bU=~ZuX#LXWUSZ25 zWy9|u5B5CVzgAGTAn38kl;q2+{e+~#gIq$;pJaG$w(ldEf=g}#&b()wLM-KEeVK2{ z6ICrea0q$~6rN6r_U=W)CfRGFZ7V;xW{|~U-zQC;c!b8@p_1-pO&*NrhFBu>Kdbph za3HnSo%G3(xGmcGhum~g?xw&;kqxk4SQ!W#4=xm z`?VDAV3lo`S24^B>>L9~+swpLhEUek4l|dF7l>(6^rB!3dc>5X$Fv%yX`9!yT8t=t z!&M$n*i=MP%+4H_grQem$5A#OKhlvTb}ku{8zkM3q*xvEar{kqYjz!FZx-2=eQ8gV zZY7s?y%d}d4CdiEQv8m>>Y;gZ$dI@<@Es@oUYZC!!gL_P{4Hfgu`MX4Xy9xfj~Mu$ z0Mnw2`LXEI{>3|@$%D!{TnzN|vUsqU#x+^vOOq1Wo) z==6Mi6%<~n-~?V++f1QM^~DLPX*2eyca2F?1U+x~)RH#lD&E<0830?fsoSsBc=O-- zP%~pM`aXubzYt`;zdPy~eG29|pMHl7Xo{=uYcYppO~??&z8M-N=Gf@wrhmkxf8e3N zv)4Q>Kt?+arJA1!R69MZF0KQ+I{LY?q5c4dhoj$H6mWLP0=M_UvdcHL=4aj2{Xj|7 zZY8^bG|wf~KNT?Y$X>sF=CR5C9Br)_(e&KkH6-|+1FD4`R?0GaQyye#(5>!d-5+FW z0T?hVdjeEKE@`OZ()}{Cht-he3t@tqnTE_Sb4Lc+7*mFuiQW$jr*`Gi2Oov1vIErG z5f}3mEAox2c?r*xu#{4or~*}#Zy}pfmsLmEmJ@8bWXPQppSU2QC#vD!)sNBix^{r9 z0cYxG!q4QBZJ)GsdVv}bn|0)QDW}Pho}}^uwiWrlRt7g4H2zN1$`ppup#xeBGRm*r2a9t!daLo z?F4m1tS+ul5U;Z?MFmLp6&;G4Cy&UsEg70QhjXLm3GasPm~aOu1&|+GwmNwq@zLkq zh*-r3@UKvI;BpmS+!F;cBXNipRna1A_gaASsGVQY0FYBfY_ykAn_sDT+3vONaeIi! z6Wzi#iG)uE;;7mY&^`B=T?n=sf%#M<2ugY_R3gmKa=qt&g``H^&7U+21lZPuW{c4Z zXPNc?=0agFHd@a`-;-@XbuKe>5vb@^o2SB6qjgcO7?3)}eOJgRGb(*36}6NPTc%gN zpeki64V!OpN;uvF%^}a;G zj8U8O4qI9Q56j>B?rmkfMYGdAdhvadFO<0{>CXaWDnXq|reE<~echmGr(bf3X;?sE zSOlq}MKj4=%QQw9JuhU8O}WF&f%L@e*r`a^o7e|>m=0UysLWOlYv(~i-u3dsKzfLLo7@%X%zzDmQnpy>~5Y1 zLKnLj)symBvl z?N5J#KY6+c@fMFR2$f2DssyaiEBBd&aFr%9e;uw@aLjbmcC=X^iQX*CG%)ej8o*kW zaMVVdpF4GX2yYefl-nrmth!X;R~DO(nnyVu`nrjr^x*6Ev!lSvsCgl5kmUg;PqM?p zf1X-2<29j1xx=h{+a)OIc zNuGz8xWrUFnOB-+)nvdc?xH$+CwX%>kii-)mT><-)&+F%W7}A>~Xfpe4bSVkZb~CFV7(Xq_YwZXQEDBR6rbI z{Ir{f_gWbO*bQ+zbqG6U0UoP8Pkw{j(;@|-VT}2@CD(Jx zx4a0S8QG(w@#SEw!55ERiqmjf6Q;%;i#=cm%(a@i<&bb&B+GdO0S)nUm_q`zrLv-+(LO_XnuXyO}(G8ww-f5I9qOL*9(~647?0CCSuZB zdCkBuHf%t>rT7r0u;y32PrUyzYJRl`Ss3+ovJLP1e{FyK{WVeG-)et|2>rLiENXw8 zQ5Vquw4YB-UK$V~ivQ}DkCtQy^kM(VhpCLEpEeO^2>C8ik#R1|2GYh2aAw19D5f=Q zD9Bwvf44g0e1z~SPOm*F3DDQ#<*oR{`<(B}d9*jagCk|}*&k1P+iZL4bmz}{+f4g- z^8RB7CIG?5V#AHUXxlG<7dcoB78UFuJrwL9>i9k_pv;25a6=68;4)MA-=9kpOD`jmN(lmv&wdSB=*UyDM~Np# z?JvtQ2VK%B4WNk|4>vx~R~scAYL{eW&Zrsl+LSPooQvyBO0So4%1J*zahp!zqp98F zF1Y;}AU;B8)ZyD}={a;k$*tkUln{F+M;;_>1Ma6Wvv!28!#}~gS0RSltMhYFL4Dx} zJ>ydnFir`#rtccb^5}}i?cGn;GMj}5`-Wnr0oY;!rfq8>BG%7`fCvn9zC3NVr@#b2 z0zw1;avla)UajjRP(}3=Dj{5oIP%TbFVVEk9H*}+cP^NFKP8Cl!#KfMbF*a@wXa%Z zwow=Nag9vhA~_m71*@tV`BqoBH1`UAy`hZAvM*`fXJ~&5vU|C|O;Hxtww~#pA3>b$ z%hb9bxQ7ZjB>l+Tj#HV2k!`U!!W7#uA)ld#qrxRYh})X@~6S#8FooyOBy~yrFK--761KyGaev-E+jV zPJWKSd`CZ$PRBS=iP?-lq^)tsxk`3XYrT@V>vVbU?!UTr$Jb={LZv8&pB-5n(6;+^ z-W&&jTfh19;fQdd7JPu~4ZkRJvv@|}2B-WJcFziXefl!8-@PTl75JiMCNDLhv3%gD zqOHUC0=+6!?@A{5?%Q|F4``f2fw#w>Q4uX(SxVzCC_St_btRmeT1u7AR(zacW!u&I z8b>NgYBX<7Gf4|#Zr~7*`S!JXM=RE$Po8y8d`?>sLc&f8dCQA&pKV(LvNEByURt192)=u_+b;)l zPP&I%;pgAl3;3wfojzi{&qUwPHWzs)Yywc%H_^B-g7;dd53d6 zs-e80JbhhTErZk%RNq`J3fA`hL~5+}^gXV@>Ng-_WY?t6{b38ZVe={lPCIsE?$Wj% zGBc|7;j}OWU&C~TV0~l^w~`DI;Fr#5INuofjX7yiOmxv-`TZS#J!0d&$_C+azE{oL zSh03CX|3v=)r}(FNW8sW$DuuODsUZW^=(rb3DMjYJlIIHGnTQ&%>} zaOX_AKZF@%q}zr)*%>(naN&spAWCi!!5M@+m;eL3baKjDKW&m4>JYdZV~0EZY2t&-H!e;nvmT=NbtJ z^k%A*9mE?73a69tZnKF@FBm!Jt>+Vv*yE~VJY)&GV^ZCLI4&>__&PotF*Q|U5A)$g z=uz04v!NMh6fklEPQ9LQS%f*sX4+dO`m+n#r9nI;Wfq+gM?$-Qkjly(#;7+G)EB*V znvZ|ElflH4s44&639uA9>4uCUpiexp76lCxUXrB7a$Mgf_N8 zue#2-6`wOEWBiK+ms!L|Koj8TGr$P{P2QkU23ALLde5|Hyd8DL7O*J`xk8u28vmf<6R%1_sfAy->>$O6k{ z@>a-PraB4oPM3c5`{9CDU@&59WuRE*aY9wheFDRBrOSG-Y0wyKi@v9w-9ct-l%{Lp zm(i-PDh6g7$1P!F8Cg4P>c$`?stH8y+#+vI8vV}O%T7NHg=SY`K}ApmGi$N+HUvzy z@u@Betw>6zek!}$`~TKW3@pa1s%*>tYFpol!c4q$2M@FlhN52Y=DgSFj%sBC2@ zNy(uAP&;&uU-R{VTuoCTEq+abHuwE{-sU{wIcSXp@XZ2&Qw|LtGtRq zAI+%ibeW?{iKd~9>cnfH;qXa+MZF%?88(ZuwK-a4KSR}Tzo(!>6S^3w{N}*ST%!Ul z_rV8aAU?vCXeq-7t4N_p?$JHaK;cEM z!hy$$d?;_h{UU_vK*G6R9$W&R!@d(y@>l}>W+u~w6x&irj3fijBcw7HvEL&uVwVq3 zo3`Y>d1AL4|K>8cmy}8G8)2qPUcpK_uVtpw6mSd<%!ss;x+S-}s9$wC-<4KtA=c>; zBzLKyc8QO41_~qK>JIVyg`^hRD~nsVC-DhuUqrDRT?v2%)>Ah-e@P55-*MT)3)lrv zdH|^3#s@b4ydqh{-~qD_HJ60bs#XUx?eo^Ui*@gbY}poX_rd6Aqco-h!ZV{5qi)3D zlV1ccCnb13#-!s0qdG49n($_l@&~n2ldyM7+vb(&e|VDMJ0)fF@4MF~9JDmAI^FSh z5}&`U!jTKe-Q!yR+*a-M?^7$boMX9lb(4X)FFc?FC6ICMU^#K|g%taqXU}%FZ~fOh zY9Q(}BJ`K69qd=Y`%ka?dm-^Z^E#WqT+W_eL`cfe^*`P3pW1ecBeH!Ah@P@SLeANS zC>YHRXhge#>MCf>@;OBE2pyb*sCi^1>Gg`A&?Jb+5PZL*1f^#~FZ%7Od9B~y4vDKspgh+x@j%%q`R}V+y+e~cy22_!1i!JX;+N>?{uH6J>27@B>cGd?(g6CLA zwLB`^O*^;Tt}@2w%=f@UT~Nsdyun78J?Sbo!27M-(~}C76!5rmIpCGhH_sJ~YmZ^H zZ|!IfxWuybnTvegWhp!l3GZBWE$-;I{;gk*cak<Y)D%;S6FlQkrn}Ev`$uwby)JiUt z4xGl?LCt7+9VJ%x`~Vu%5geWUDP6g16zVTEjHHP-N2&EKwpg5|7ys;KZr~GkFwT34JixI z*9YjE7%F{5QLF#PrWK0+p?GP|4aFKbD7S5{kKX#9B3|DHlz|^!6;$VgpsZG z3$f-}z&knocO*jFZHVhU#5&mk`F%;;<-YUtG*@P8(YL#$CxUPAHdCT_O>FXgmX?<$ zb!*)l;E$N<-P4b9FIZ1{nN#h3445P>u=#F+J^lb@Nq%uwSifX~LJ=lXhi-XqY%;)S z_)a!^rIA{m-)C?Smt;{a)f<2)D$Ipw0V+$_pXEdO+N58lcG{@fq&1|I&qs*oFjl-t;D%(d2 zo~^#dHf86SA9m#WJ*%vJ7@e_3nc|b~htx^L8}a#!T*({(6Tl>AA4`+^p0LG$mLYWy zdZq0CRs05f!?NiOZoH$*e}_-K*FkF$c`+%rt7Ok`QKlBJv`%IjUh{YtJ10sFtvbMH zr6}U8`Nu;;5i4dvkxFtwk)sJ3?X4OWPphNX#0T`=T~^@(@;ZGQN16W}S$Mt!)$n2w zYps^VX63m>rL&i^#3p53YZuU8kOCM1)vtd+s^VW{FaJ)2g#R5#{qGLLe}kri*s(8q zgc|s#w|iJ;pbcjOh%r*wnMzXHflvX~AFNH0dXWM41eWAZHPu8~`}rGR{LQ#PI|&_& z#p+$w-P0MT%+{vvPoVgkRDYiU&|Gzv8Uwu)LcZq zX6Z~q%EWt{b8*=`Lx(N3&HW(5?Rx=vLz`SS$b#C>fE-N|xd5t0%y5(=O{RUbQhNG8 zC$Uqqt9uG&U3<{0hGtctOcJ;&)fv#CKV6U7ul#}H6it;2!S2F_mVwf0Zo1%sd4jg1 z#*%F5Iq0{_U=dXxt3!`?1UD?w<@rcL={Zar+VhWDKq^a3C-JJg+`gI3({zp168uBi zS^bDmTzM3NH6d7u z4A69t*LBHh+qA2Gn&tPw!yn`v_+)p447_a8zwdPg)&4^cFY0(1|JRpAf&ay#sDBeO z<@t9kDj}lu_gJ5ypkGa6Y7#Nk#A~9sOjLl5sAsi`i=OeF#>wQ>B6KQ`i7@u7wvZ&C+`F z3(byIJ;=v8_y`PaE|sjn4)v5OB3VccGXq5uT0s2;`LAe#6QI7b!1ICFF(FD9qgI~D zz!F>u#$l9!0<4F-@TUNz4xlOmmaebSjZxU2%;U}~pO>rktnwwATZB6hC};kOB_A$* zow_BnAd(XnCi!kv89n^@Pmu#5kP3rN!5ZTM6e~6mgneUwn8&J3SY3%`>HgpnP^U1r zKQ}FQUJ_8+D+P@=Rg37VeG@|B<1vrnTdt$iA&@~5p<*?+kIqd<*o z-xpX|{sk<5zn~@b?|?-{K~>())Cu5V_;<`qDE~(;!Qr+|OKseT5%lr$MQ-}llVF`| z_Zu}d)J~UP>U1=Oc&#L!p!*L{NHH>mmG-kju*MLHj5$=P%{CJ=cjnXP`K62Z`}-?g zH}Co+aS)CxW;3VUOevH3XgSU@L$&FzFaT$`%YNubH}7GL2Pp*XRBG-Xq?QNb`lDat z#q&ocCM3RSX1xf*u}J5}-j}5Dqm@4Jx*8?c$ajx!`S=c@l^CEWS!N8fmCn5uB3ZtU z=ymJ$c+Jb4HOIUmSORnACqCvM9Ru0y?@zISk`t$cGq0hT9_~w*cuE$}o(^;b?FQLc zH;3auSh>%iZdaDnGnrgLSATjQjXPu z7Rs7@c3(jVcG@g>s?AkiT_W)xlA$Z89wvsk?#s|n=*)_JUM^vNUwCg>a(InTcm5u&7(>7h6LFjNc ziMSFX8qf+dWJk!5 z7!_(HIXMKCZJ~9>8z4!HXMG`4UNDj^#F#o5q+#NE-Y)A7V;u|1ng)c`_7yu=jAv6W zcfvKa{s|NMDb}+`-ri6BJUq`QI_l+nzW9a=5B{YsmI*%$`aDDSqMNtQLr$`T2n~ta z59B|~MbbC`lS#8UzzoKz7Exd0LZ;j{71Cn@YE4xjY*R%`{5d1$hXD=m&G%`+iiyj& zR;vYJ5Nfj0X1!eCJpVGXO2CGHfD=?>2wXX{!=Jc$*st>u_iO8m=fg`;arFP9C5nD^d6Yuw5%mp+)3?DNE%>X+cLsc=KCMs{}5GQgoz>D8i~buB!s31nA}mZ!UR!teuh-M z;As(`C4oxoW_(SYS7)t!XwSSz0>A z{X|zlEP=EvL55YtraWFV;I>k8HtsvmXYn2w;(N>fMN4tq#xKcJ7XnRMLC<7!IL>}_ zn_+L{_5OYf*RA7X7|&?kLkY+U2ck)|g^?nqLC`~NifGpFX^;nCS~a989ADu!AyeiX zC6{*Xh^>dU@ZC4|W|K8Q`mg@NybqY=iEr)eHiI1y%Yl8+4}`GtPNGYN?y3;nxWN`h za@WQuxe={UT`?ZECWr6^tV5$-+oAIWgos^L9AE>K`S z2fD{@*0FB4)aiB@#A>7Yy#Hu@=S0p_R^CUgDFNv46enU__2qES_1Z8h}D{5`MNK>~~*)Eco? z-GcN`eKO^9(B}#~2Ou3h^-A zEcaK2ki(|f2p&3Q^n@LY2TLO zPD4Sim5_G*8G?`0X8$KrCqi81Qho=HROOkg9e_9;w{Z=2T&ad0e4m@>CLgnnDoQK+ z{x2#ymG4s9)?j1{TAf=!FTbKjfRVs1^@cDF+r7r*s z%T1i+;~Q2scTMEl?@$sV zB?VbWsr?A7TQNbl;iL>0gY?`_&jZ|4CGMb~^qjicrXnBI;na=XrS5T$Yee&H{VoKg z7Sx9wl(XqAJjQfW$%e`#ureZPs1g}k{>&SLr1Woa5+A0rsVW1ZL@B`7%*cW6_1#;2 zue;Zm4Sj2+W%vKsf}M(&--iE!p69L>!w_d$tWa9kcntlenAcElkWiW?o*oFDN|k=& zAI!}vEY2UgcvFVY`uFv>Ynn1H0)gd2(N|;JQr$M{C6j;XQzF?H1v5)b)^D#a+nham z?W?OZg^(!&{aOfmZQhSo3kh143lg5Ker#!+sI)B?ZZMdtVTPMf2!aD(U>piVbdcqy zGb$|k{1%)tfARF^!e#_;pmh`qv@@`tK04FDw4DGWc(dS)iyR zCHMo8w@gijxdCA!JIGBbEO8T>bd)HVgi0v4$#LyI(9KYX^pDC9r2A=vV=)o?tAyZT zhzLXH$;)(3?mBLQEbFUpjWx)A0RBdAN`p-jgf|Pv zs>@d{+3J+^y+f<`-t>qFXM{ID6b6~sG>Is8{pjr{(>aekj^1Psho-8wfN1n7BUp@P zkNYe_+s|H;rFKQ>59fl3m%`fNX-RCEL$qKiwZsQ>bXl>~QvltMDg}eQ)>^HsNKE}t z!VNpqdvrp23lBOf2FaOQ9%Ea!)TmBEt)-?a^~68zyy=V4Mi1<)f_l^u9zpxI3(vwT zL@TKFsee9DFx6r$udnUQE<8C+%R|uh@NU(ctE|;NSz3Y3)|CF}Yf587NFb-tVmqU% zKGnX}G_kZ@JACvhrXc(%%6(CP7PLD6|7?^+M1_Z8sShvI!~C;04%?9v+v_|J)Hm*W z@5I^_PCWk_;#Tv5d%|AsS41M+x+5wjJW7Z)myk_pc{9AwZvRJ6Um+^4hhgx(Cb{Q( zAk%PmmMW6WsqI$HXeK%CWrakM0!pXb^Cr6EMiAg~sv@;Pw0OLffzvh9?ktnR&(mIn zy$LgMYM73X!J0nh&4^7sm*e>#tptV(PyjOIj^4PKK)^tfGsJrY#pcjtTWv+!ato{wi_tk{Wk9GKCA zns8z}cZITcKk4^dx;<#t*-aJTlMo&_oG>0Z3t=05%VvEyiD+7+btJdj8lnDMlpuy$ z(e_WEk1a%R=2#BFTMl#BuZ0B&H^=W;tne|T#(Tdjn!(2FX~ zg}shwY&7fDHgmnSff|{HA;B(m2nhRa=|9ZbF~>PV0t}|Nh6(%p3XcPb5UaotV(U@- zN4}#A_0+XfgT%nUeZAPbj=F19QwLQkliH{78C1JzpNn0Egj_Hv+Yj-L{AOb-awZle(;=Sxy_@{Uw-voc&&S#Q(6gU zD{(OBEThvOdnoLLPZR(7-ifsFa4dURqLSqT-1jg~oSu`{al^g*Hu4?q)-}IT<9%)Y zkkNY#PkD#S#%8idV;SCv@#q&gTgPU+6tgm#{q%t?xeFG))Q`o>k2DMJQ-YCuIsDc7 z0LRxGnrT&rY)a$%D6>)Xm=Twl5jMlP!_wrUW&vG-Vr#|97u}xsHDZ&`3?v6{N6mnI4)hH z%9^y_wW;hM^wWG9&}yNFnuNRI5VFFUAxo0ogF{f)qLeORWu(9C6<4Uibm_p(;IK&Xv1Dq|D^oou7gOm-52wU2teYsml zaAdovgB0(jwQNg*)CPCd1jA&blA=l*8XkI2YjCLY9IBGbnAN!_TlB=0&nvmkov|gC zg!5#$=g`DLopemrBE-@XO;>mWZ|N%+9tAKRvjeZ7zx(io1McJ`i)#y+ieT?n*43=B zD!4pp7cwuPM?BP)LdOt=Fz*;ak@S{7Fj`;>2<|+-FOOz^+ziF!9M%gE_oHY<4AnM9AmqO-8^(Qlxe(PEq^I#DoY6b7o&TSoB|V@ZYO5+5ayl{=ak} zbpGl<@Wxrx8Evets%kZum7>MgbD(?1JOe>59_xisx>9(iWQ3>1oLi+x`@d6zRc!n5 zcN36quAqucqleIpe=OTiWw;w1u07G~0$J>+{ti=zulAJ!qH5M2fUSI1f3Qu+v7-nV z4}wJ?P8p0HV^_RhC*heCOTm?5tOxmOwG*tS%T;^07u7jGZ7yc$U{IBfSBnTEI22wG z2l~0)tG1(f6z>n4a3A6w6)zE;9hjPz(nZkuJ+WL-2DXSBpDs{DB&?v^{APktpc}}h z4tKh-ovrhf>FaoYYNTIq(J~x`EW0~@l8|A9?mLz6V;UzL{iHH*(YBT@v7H_f6D>7f zjcD{5m9=i0cxgu8N-I=0(s`ANbsG`updMa*R|p$=kP zspMT*o4LEU!h?WHOc*|B3sWv0%w)x6@{7vJew)d`yxbgybKE^F1_BGGTZGqCNkp20q-x6+m#OaIiFq?rQYS^^Nt#hvJq0FqDmu3MjE(Y3PL#uH`XT zeQ6BtPuIE&eV|5Zf+k?_Q4E0>fqara6W?(ClQlPj|t zeLjqkxb4?>g*k&oJ(zJmdN(Z%vpa52Enhk!XlRtZYzFkhl^4SvXGRl>nd=V5JxZ3H zt|y1!p7*u&5Oz=4-#{ULFYGZ^Q-)_L{e=&fCAQ|bF#?SRIEXJhh_1im-s zw_N6J^~kJ}3VA#c0MR(*w0f~34Nu52f(`-qP~MMd?1!w;q(YfL(uQJb=+@MWwE8qe zOzQ1+HJMz?eT{Fhmv`9d(J{jqDOy>|8NxSX$}WDL;Hts-`ZYnnCHHR|^q(Lv`ZwRG zh=i(vrG>G9!~a5Q6#RR3tl1%JmWACbvdTt??{lI7P`(k(F7yeG2UAoa8?xA;4S7pR zAL$?eHmW-i^YAqp4H7hj8UY+*D{KxNI;OFOGw7S`$hwKj((3?g4y?eFDL2b85~e3d zRkLpf%6`^nS1_Fl5^}(*SB>bt&YLDeW&|%|&Oe9nC;BYyyH@%ogW}7X7=CxOH3ayj z%ba!CcWmn*5H&`U6(maleZ?btB>4`D=>+tk=E~iVB)+@c=Hmv~UcyI@#DaCXXoq>AEoTNVl0s^Arp-3~;& zZ1m|ft=ng9SnO$;@sc{IJn~0i-BG(#AARi*4?Z@DnogrcPMDe39Hrt62gQx*^9iwSYq%qS)vV7pn=xXs1J zYOgUK%BcChx*vVjw3X9E=K5!esI0swiqTp-r+qn^`>SiA0d zi2JheEv0hVmpIJ`^{VRN1s6dHhF(1sKU%FGrjnL1&i&dkSFS-E#-hmd_X{e3%9zI+ zeWj5uH;Pj^T+^9w(0d}^-}91;E;Oy7{GyJmne3*rB)1mVBItpBEC|Ez|B zxS!iDTHs`#(`xg3+*Ay6`1p9mbe7Qm#OGH+K1kGPzAZzaPTqu&QqngnQFCYdW9rXB zN+6M8z_2NA=O8)by+z=MC#u~|aW_44KFF-;^nCda+vTVZ<)A$x*dOXUO7&Hpm8zM< zpA}yXyEcetHzU}f?92&o!6~bC^-WLVDMWkainA-)V~egM_ zbdTKRxo))_mC~l5EQJ3c3=W#1ERL(?oE+VSnDxk3Srp|5|4@G{k37 zIAf%riWZkkng5pMy;>r_k4ouzjH|Q(l&jk$nY62UazQ*;f3`Q-(tD}b5~gMh;tZT| zkW4I;h>C5pdD^oy=h3drU}mVce6Le`5vZewwIt%2W_NRCoNu9LJd}WwVIJ~fa%zOhVkQ9|_H_G~SihR=S%C}$Pr<(pyMMydU&$W-Ar$_v zJLP{ZO5-gJgrG&Kp+r@}@atw+F}mO}bdEH&7|C}wZftg?+Ex=L>Rml*b4bDm@Q1uU z?zCK(M#Jd96#Mf`_p{YH?xKy(j91N3t*b#k|2H z5MzoUPa@3U{4D8`j>yazYpDMiD$UGQ&q-*1A9h>k85FN#S}lts2ilR8fX+9E0(h`| z@^CqaoceD$F-Hkb;1wC(9dyoQ zgiS)_Ir~PueO9Zm3jJa*gtGwdmu?84xVIW-(`~mg#gwxHkcl=fD)6$Tn)g|ovSO@M z1l!KyQqC3lq1-CJw(k~e4QV{`-NN~OkmD#IH@v;wy3}{dFXntaLR4} ze*3slwNZTAnOb~Wn%<@-%_4C{68r?-DSWfgBtW#m7Jtvw7i`=hQyJebLz{4r;BKqF z)mdqL@`CRftrBgxK!^bkbpm2I(9iMa7lDD4;}y{fg0idMpzP1_OYm=??7z+^|K&UQ z=WJJ@46++2fH+X@QvrNe3@R1Z;HVCLmyjqLSR}z%8Y~!i=UD^Gp!y7^jM!@CO6~8^ z*NDvqIU)UhfzuWIBQ6tT`T8Y{A{e{}nFn_n?q}BrRaG0W#x@Ng;FvO^8HWu+14j(G zgr+sH?U9-GmzsNvATgXxR^x2-1e776?A@1r3lmw3is{n=Z$gdG0Nm2uo(~paG2j)( zXCERhR3PT<+&HVs9;9`Y=vuS)E8Il+=NeL#n3UJ}%DECXzgSjiD=n}!HXiJo6*{Nx zrQtE)^;Rl?o_en{RzBU7|TR^`8;176zUhvTj>nb`Ai|fl8A}BzD;`z`G`9>R#jQZ&)~;n_P-hy ztd-hLk`PzYBU1bd1y&*h-aTgwK112`A$XTai0qM?IrM$$DTy4vsNt@x>kXC|o{e1i zyH!+Xm}bg-B!`%)??Y8oJvuw|OgkBVgo!vX8JmO16r4g5c>(-lFgpR>84Q%#Z@%dk zQ3Scf3AYUspV@EDsyJhGKVB^r=X3JMKZJJ;QrIjyt~&{$z3YZXZrf(-@1Eb5S=p{> z>{tAF3Hrwt=gHExxWOgIijmj8(I1~LCQUS6;8p+^ub=n)o%P%3{y6QO(?@b|Edj zf($-e>~L4AajSPTekgr8@Us%JQAJXpb!Pri4l=R*X#J@}CxZUJF5-XndHwf%@Ka!* zBxLRK&*xR3I4adE0Gb-}#Xip z7-o=1bzHf7B?RJm(a#=Efo(Cl=<{ev-LlNruH7G1Rcx+vmQAZQU0+hWIYybUPhAk+ ztr{(kTpKziP9_dlZ)Uv(icEhj_IFxS>8`Q)*q0yLf!0t9!_$5it*U-ge7~kQ7Y4Mt zob;pARi{(9V+qtzFrdci8!^725*ESp9rylJvug=u1aYYsLwEhZ}WefWP1v zclGqS{wrJHsdsp9^ju~e1rEB`p)L(JQ~67~D-?4aolyvZEWqJ2!(krAR~76Q=@E)c ze;cYd(?{_xadsqkFo{}TJ~3LZKCYOsKC{z z0ZLe>@mujXo$6-<`=>#!dLohHz==m-Bylg+<(lD6E5}ow3&}Dl&Fbfzc(4TjH3|f- z3crEtpZBM~+89Jcl}wEPAI)fnqM$X(Pr@(|>@8XWq%?J+VFe@#yDm#%VThH2q@g$4Up zh_-s-0A~l08Z1#pAUQsc6kHo_za82g){ItzX=|g(N9%>#<%s2pu(c#W`9$=p1HPV} zcw;j!3eM#?qYQ5Yo^&O%h$9m1NhBTcJDCpvm$v za5cXNd_=IHVnnDjv+KQi5F5nj++W-Uc~=bFc5)mdi0{64u@7Y&hN{sZE4n=6_&bpe z0CM~hfX#cI7(dLlUMtusS0&vIw~LCc=}uzCf@yJhx=Q$RsSUc#;=2~Qe4-Xl>4YR` z+d6jvla!&1?zaNQf&tRFJ@Y=T3XvuMV5Oq^vi2j_Ez^5p!w&}N;R3g`AI8y z$PI*Io`~9&Q>meuWNr<6H%(p~>V2rfG*!h_%U~%m<9uqcgO_H(V|@4w;Oxtp_42Pp zLSdnn;RUat7P_TIoaWOj$@EicIJ(Cc8kF$zZ%lfVMRN5dE$o>WL9v=-0Q zHZ1xC5}cS>0BM{=_=oMy3~EM`gSg7U)p1~;TyhE81cPI^#P{7ijK?33MNW3qapbSF zMG$C}zQRey2N$A9s05RV?AptdMs*2MAdOEKEh|s+h~^0J@yF;P9=&Rhtx7*=o!d!R zSC+r|uKD(Xyo}GlL>=Y~^ZD07Euyp&jt2x&0lyXMpZZd%znKF5wb1+@T*|-1rKkt< zbNTfw1@Vpf{Zp#}kX6($w$!B(uLZSoIx5CvIqbGKIgszsJBSg91ZggPHWQ+R#<*0` zvWZmoOq};mPEt6{PS5%IykFa(_5)^`nZOb5(b$;UtW9mufqn?+I?`KQzUwH7A7rO7 zO{F0azGW(HSV7m)KhY3>KCRE#e6y8pV<$QONu$xCvoY}Nz2oeao0YqM*r!dY*<0w0 zE@ti?%!7@SIs%mKyLPo$1~vQTE6FMoNpC%MdQy1SNsP0c3;YCe zeI9cTot}xWtq*Srt3J!X|O=k&x<4SEk8T z6xREHxD3vARaGi^-icn~=3ysZLs}bHq_2=)B{$Y};oV5&j;y74K`dZLD~Z&w{F*EX zyx8>qUSx#)84Zpr(MDm=q#Wf_R^oR|v7WV_X^qa}{y5!NxIgZT?wg4E;vw<+IWq$% zjyWeXzkMEP)eTjP6fC%+?BlZ`5KdgMbV(FNIk=zT+2t_c?vc1u#G=~-+aNQM z@3X$DoIojv3U1Frq7-JpL^;~=3yzL2o8IG7D>D_l$E|mkFz>xmGj~rw-VXf~AOe#( zGAQwea`o-l8?QvPd6#+~qcrtEUq?$>SOy9(0PPNn^O)TM`at|EuQ_v|R*a8BNNZ#? z&U0Z7QvosWbTx)*#S6qw{48UXn2BKn79Ea1&n60phNw`1pRyn5xh(YNz8`gayAphkYBFFuYwYVl9a#t|olI-Pp$= zO^RbB;gZ>8x_CZ*7`-&hflINkyCxs=X0A@RBIe^UQM!l_AA+LM0o6JFrO_v&*JU)T zwJ|{^Akimklhtas4iNgqEHNj$xt)*DsU7nfnbT&Ez+5|M72Z_tSWf6%Tg z`aq$thy-t%mE+62=;!u*a=I2C%UNjl?r488L@Sxjz{14B+3aU93~G9X2Dt{Y1K>`J zB=Y$>sUFM4Yfg6RUAH3rEG2W_+=Msuh8aGhBT~#ni8WyPDJX{2PegZZ?!k1NNGPjRt%b9#&jksd% z8H;b9gN;^T%9?C9Eo_9~%O%!3Z$=5Yf9a0;YQ561=_^wSy$j zX{&+bqRrkWIWr_PKiML)J0V&U7`xSzv6C@(Yg3TD!wGy7vXMvmvdiB;i1muV)ja2P zyC%#LQx2=#UV}mT{Vi7df@JEhHCAaxT>GgJlso?;8FpeWS;Bcyo_c8%4}oGKvWXvJ z)MqIN9_i(K3nl{>^biGFp=nH>u{omfItv=OZc0$3t`PbT5B#9^O=N8e%9T#;(s5IFX4d88YEV!M8!jJ) zy#3|eAhRV?+mCm?fKeP)yekJJf&nwdUC^=&T$URsQXDrh7giOYbb&uDPTsZali!iL z6f!nSWjqw|o;kgJj?MKn@F$pmO&9$fnwg-xPO{O9U&|+IZ7_=<58tACw-0yX=Ld%| z?6z+hvwSuKz4{KmCcvc21t%K2`2ld24r9fY){Rah`1shProN_X13UUbulE^Yox$X8 zs4_N@!nX=LHrp~Qj>U{@`J;Zngt_8IXo^w7gVgpE%%(7+{~7p*p(Xk(S1Jx-WuOG*Q`DLo`vgoS~YpSGm1^!=`B5WcKqp zI~%tmi-@w3MAbdM-nz*mHDQ+G-E!rDOBK&qfI_crukPTnJ4h3=<)YxN2b|!Ga%nxb zgg|sngO*F6%nxp97@_y?Am~5?1h#A-YqdAN&9yp%LZhA+j)HFGxk|`_a9p}>1%=dA zE!%@{xRX5??Ul3|p!626%Kc=v1cX?})@Xr}e5f*qOvhg)Q(B$bVHNvFzeT zI0#um$t+j7rJ{4tk_z;uzz&yZ6YY!kB)BD!1jD42dfNf`nS@bg|Ma=<*HF zN&N|G=kf@7M!4M7$4>`efBRM8GeOI3t5D3GB7WNS&X9hH%UdIyMN$My?QTnLYYa8& z!bVTJ!m)o`9D*$t3p5~LOZ}~n{yE+W{SC1F^soIY&Of_pfugK5DG1+qD-iUz$S2_8i+`gAWI{&22P(n157QoC;_cmlOETtoH9>NOmrr4 z8*(01ium69CW`BXjJH25R@oKt%@+o)f=k)x`x9WI2S51WQGm-B#2T2Ti(!Ypj~CBf z*&f^~h)py&HtKIFgc|#Z->GP|jeBZ|Q7?FLC?8Qjm-#lXP0od2))>4c1NAKK-5f#J zhmG^CFJ7y?owBgZ#?oYvW3hD60x`Lq4?Z`<5$};DNRxmCG19vVJmMz?IPce=M(58q z*V=;R^7T2<0YJn|NbG&_*r&VQgqYpHYn6NcpW~FA8*_3J2&blg!>K>}+uw?n|1Yjp z=jT?++gnT9UofXx(V+fFUhPxKcQ0>5s}e_{EXzRFDA&u-!v?SAjESoIgx&ES`XM_c zVgNd?>X~XM<8@8_#WAFEL3^A*-@2fBvr0;ErMt^#Zpr@n zyutMZ@~H?eZWomGJLF*8_H8s>!EPv1R9@I!E)j2!Z*5P(d6$7)?@hDZHm3BA@N;M@ z-?{TDWrZ;HHl1141AP2f{z$AbqBEKZ8B(kOA-*eR%KJ{N))E-YMXF^9qX99f1KM~? z+8%@Emrl2LCU%5gbgkwrH7<`0{y z5A`IcatR#7tfoHsDSXrjt-HQSxADIPWe%u+w(}F=^ak5$ryo*C7YDu7yG=X2OEobK zrYdg2A;+H0Oy28I7=RM5*VUswP@t2MvWLhJNx4gnKyNPO?qDDzVI3}QhDNzAi~cS{ zqm4tMBQHZ9T1o@iL+I+J-akQ!YzcPQgoH2#FsMYM+R^O+KFd+*5%^gRUjfG&J-4|m zmH#H~84mVU+BF(vYNW6+I!U{)$to9X|F&_cXsP;quJjOUVVm9;%eVZ$sMcOEa2Pfa zU_Jd-seb~N$lm~#h{S&u?)=+vyJCx)4k4r@MKy)^tCyBY2%>`p6vN2BE}dJSAN{$D zZgWU{zIr!8xH$tZF(rYAq<#O>c?H z)3$-6AdLrv!K|&nml^=#T(rYMgo7g(?7%0eZPxybcToWtZoF8g=8S#a+6_M}Z|0oI>ia6ADivP-UX+SI*%84 zFLk5WGhXjf#i}V^rrcCg=JDl#&ykK?>Y;7LA+yT!s+GhkUoThG!U?4 zCdiL=)lmdNEw^^wLeun9BoM|-QHnvYpJ{OH(4s+QFwr9#kNqjr=ZGBzfk5 zT~yDN&dB*V8Ljv>t{~2eSlleLt!V1-HLcbPmfuo?oP;M4e;`=KJx8KAj#5<)vGUgE|C_;rD5{hluaj!X5JOJYa zLf-b*(2}lxWb70<)-ll{@f8$}A2;;d0(0=cbo98?+lF5U&+~|MS0XUl!zg(}>pXtR zk@!#&A^Y&wxLV5N7!_yH2-HS4j)iKL1)rSN967ell#%zqQdnxstz1 zh!K(apBsYxzZcTcpNucB5w|VDdrcwDZ0dRoU#_TuQi$ysm;iy|;8&vA^tFa3seKA4 zn1dzp_}lL`p%;x`qdL6#2$pdgZ(KaBA`>>Q63t`k(`?&FEhae*bg!>R=LjF`Lv`NNxYZF4 zj(IX_3Vrn@T0}t@4;ENfSDH^828m9N5XMnJ>|YDSOT_;4%)DLkTrI7iX@oCcXmSnw zewt*a$RVHa%fq{m#p?_uNh_5oq=$kds<_Kr*ev5*oBRl&O6whPov96L!8I#L69}_k z?3npp-%;`XIxJB&6NjXJ4+;dzQoaO?^%R|5%r>;dd12QyQ8L1-21!Afp#YGkcGRX( z>MQOpd+<=+jM@+)#2oSds1a3=d_t4_ZcK1U7go%4yh(^lUx{Igm{yK@CY0774qIe} zVoIfAw?#Vf8H-6G6@_Y!9`^fh;U1C>=!3x>KpNBNx>b6*y5fv@Zl zoB0A=dT)V`v#lTMRiQ*jT|BB#1w?zKjzp(>8O_1atZ7i6Ahvg6D$xWCtW`$%ldCVnb>ClHH2PUlA|F zL!2q3H9rur)H2*nY^{R;uJvaYj`S-zg_;<_VPIedt;x#KV$J2NR*YL(p8AX6ZoI2c zW6@l^`qj`p+q~GL=0nxzVY*5#x#Z25Vpdhykq?Hn-x*Ps{0PLH;DIQD-b2MXV)#LXjq#NIZX?o77Q20CoSyit7nRFhfVgi9Wj3}m7|!=E zdWT;jgVqx^ABoObhF+((u^n{XwBRf$@)0y>0?IR2J(h~f>2`pPiw+|ryF9N47d*Vq z;t%YXKLzAT46*xO=|4>-WTsz6@dWYA&s}l^(VpOaA~x$D&H*H;J|hldCC2+K>^(I) z&+)|hWt+Wp!1`}dfmhYA4)m(uV%745epe6hXY@b*&c65I1{md)L)*xJ(|X0HIp!jXoN0B}W6R0qIbPl`>J= zqRCiAK9&{CDOxSm<`bUiG8I1xG_T7!8a4xyNxOjqB zN8Y30DTiWp)rVnY)&WjJ4F)>V@BD&#)-QDM@kCW2N9M4BY>xS-Y{GR9+px3?wq&yVt$&;P5jFb81J(ZuThr>oE1GfsA_MNBO9Y z@t=_@*fL}uYS2y#8Mq?cgCg6fVTE`2P2?gvFjeu(&YEV(=%5)aZwh?f;NsWJlFR5{ zZZM?}Y(bgn#Y(X7ozC@%`))Rj2L?#O0B%nyl1)^_?x{0nPJq15@ zk`FKKm+O`rDA5Qyg1-ewi5=dgj>1~(GR@6V{@g3n*x(GzL3;)LZ`0bJdxgN?Ol$wX zfBYdK_~~T@NeFnWm`|s;z!Dq5{Cq+iXM0|GWhd&BDEO5~?3)Z zYNO0?0r@ykjd3)>X>GaAc+}Zy_Ubm(tJhLWZeDYr*I8*kzjZw2bVWBzOz)wHy2+36 zZDS`LL+1FCB%+w5la8do@V+|cql#7wi%rYm;fPzmhxU2{U1zepShbjIk{YiqHIl_V z1hBML<&-AgWyah+(R0H9pNVo_a~FeafMIwa7-Yjat~?S-e)XYHX2&RJb+Jn+7dI!R_2vppQk7iqY~L6_tNpP zVr8rxc2F=@;2Sj34c`wk&Pcr5Lqt+ee$jEkac;fIxdgMXv!*M~zZE=qln@Y#x5Wt+ z<$FXekxdpCUqT)g@u|>qq{C|->j+deY$m}`t3rj@=k#Cq5cf|%`EKt`89peu^;^S^ zgJFK-M{=TR%XRZv?a>dNb8i~$= zMAeOvwff0N%|1x&{MW!5A8CgHYmSYLgZI(k7XCnvE^0elJL}|c_nTh0gSXOmcddBY zmH$N00R^Wq@V{3+2ethx5qdqoitQ_1P`yDiVx2!MFM!u0nB$}tM-$t-1hu@8|$wvjmZ5W z5@&+*igWS}Qhe_L1@rALNNtpD^!yAFs4Gf9yJHZEYmv4NvIU#)6p*{O>|VWxJ8Ono z$jG7dq=w2YXm)t&IJoGr5w-4$S|0!Qidycozgt6ZG>5|{bm0z@)G#kV0?&gcz{LiVUoyfEL~J0$j*17mQ# z+S~BOohBPJc>rV`vH_Vy21YH$Ka*4_2mjSzCI2^2_nR&FKQ}ax_3R&0 z(g}rC3meYLak(B3}$Qf=HJ zxsIY}8ct^^+y|MD-A_OEb|_!DFIILBHki0HXA)|utQK!m`14~QW5V`|ohNXh^I$lQ zAv!F|mcu2u4pqnYlZ1jOc^V`0F$<+KQa_}o6Prf(<}tk-(?>)D!Pt=tf+B3t&V@Hz|FXjR~;@_ik#*x&; zY|o5Qu{_QA5%vk{{)Ch*w-JxuWIp;ke8_hz|K{ZMtiJZ7O(KBM1V(GXDFCSg zqU0->4 zHE-c&M&+3Lj6HI$y$H#LO9s745yGwB|7PAMiME;_Q4AmRbr8J*)4sgF{BX`_-#hO3 zq)pCv%so_leB3ZajwPO%^EUDO)4MtJgH^|`ew+p|ky~(V@P5(<{)A{y?D)q=zl?4j z<%%|opsG6it*ZW9EdPpl0-Zbl=$#F!TGqHKNY8A#dWPwJk~Cf_L*nM@^Xcky ztWwLAxMeM3bq@n?+(57gk~nBxNg&Jde4B#FDMl$pLZ%5OLr-XKyXXS(@98>L{;kwB z2#HRn6HDL5*_q8IG+yo(COcnofH8-^PdAG(je*UBuJc;#EM%b9kL>R!;)B^z#2QaV zG{{Lwq_1rr+lC7(qphs@9^HRK^r^ZxExeMG{fe#2(_T5$PYW_hJL4>s7}-NLooM#qE9IOQBnkUJfmsr&W^s@FgKs z<-O`$sb)F(U=gOyCZ62aMBNHxNtPOx*bOG#EFZ_bZ(B(J>z@)J1sEYu(FIAPa3pSUx)bQw*` z!WvU+RK)zMHFQlliEs+qK7I4mc0|E ztN}A!Df7}PNdWqsW;b8omh_&R$}A-UU+L+J+_-_5cyyl)#FIp|qhBCFpCW`S8VQ2{ z3v^~}zKqgj*}gfe-n%36kK3rSRg0K27i)gHiZXj|^lYUnaz75l<{Utw_bP_oq!!Fk zjW5rH+FhGwaXRGdVY}*;FsuwZ9AyQmsKqNTDb}_a9yO#IqR+)D)+dQ&>w7~$t6$f; zpgxjt^lcL%ZU|)s7`=QI3(<$5B*p4=fjF;m4DDx`m}*#3cYqat$uJr#M!P<`Rn3Xa z-9NcL5``6v*$gCyz3fQA$8FSji%IR`*)ewP)I6t%VC67eic`Ro0XQj|R7WIh3q|_6 z0D3Kb;oc~O{V-=4?$IaD9p7_mTG=uOku$YamMfHj9n}>lTOo9xd`5@245rb@sy(O= z9KxM|q)YfU9@!GyGp&Sc1*G+HoQyJtq!aQmU=@|@<2<5@z#6id})d)5v%Q~e_Nu_H!hGEVk82N*EGbk}o z&0}m9W9P#zP;?w`vE)|DbOuzDYQC6QI$~>yz8mT>{M5P0cV?r8cSdDDTllzbw|d^4 zDTHgAP!^LC%R`*GuRXSw;wDMj(aM^>`?bY4JY-9R+4 z`*mJJL~W--yT}uSHU$92HAk4I5lK;Dzyi#C3_$91Yox8nhDqaLf2?UQtjYcYe~h(+=p3In0IB#})20?t zVo;#Y#@d+=R+*j8emp$gaQjde8%Gbc_^v>m(dv`>bBwWI$iEpc^lgPY!)~68K0~yc zM6cQnHfW`GYpm{z*;LKO8+`-pz=GwQ%B&B-xpCCL`Mllkd(+r19j$sOLH9*J%^=0) zN8~ZLyY`^~BU;+vj{q&+%2w4i$6HT2{E|cCqm<)Tx1gu#lP|(R5z<2mp!V#| z-m$@C;*rk^fhgR#fX#XITlQ#2J-S2S;Zf3u z7P0h~;tz%RfP`rGPc9`hG7(Y2<`|qj`sUiAn$n*swMT(7m?BJ;Vun0t-18j=l0ojR zBiOh3ReD}XwN-0fX2mG}OZ?&~{+}4GxeDpV^8`{>@tU&lbt8qW5bM-M*uuzZnNP;< zr~vmRUF^3tXsKIYUpR3;b-w+w!E-6Ks8N=%A7530PM#MjoWiGqa}5zZO>}b&ZL|ex z9;pPnA1$F@q21f2jxS>`&dc@j8GgmxK8FioCi9+ad>>QF%N2OZX-E}KM=Z(~1+j%` zi%>?Tcml;%Ek?i?ac`61gjCVVndyZ)evYP3mnzugt4Tk z;q*{X2B-5G=be#h=gW6c{vY`2O-;BaECE~i(zVS>P*|#*{%CJw5I&+aR;VV~phZ^B zJP$e{1R)LQj4j(fU7bSE?KQPOKa%FPO5t_%mV(kP>F{0%8qXJef`UAe$O0@=-u?mt z#M=1tLI27bXl4uxw5)!~^mcvoFPO;9#a&`)-D`4D=)wiqlt<&mgw#*(MR>2uS(T{W zta6O}?TgYJjXvz{=_wm(5ng>$Tp!eMW=o-jXElPOcT{#tj`FTsZ~hK8g645CiqAvQ zBh<9nG!v6}!6#&aWcllrV*S4_~j^1FP->HFhQ=G+6jKvB*`_BWT{P`40VT8bTTsZ8Glr z?FEITa>e%>iwl{y^e|?w&oR<=VZH?y%;{0gCAp5D)Km0vqDL8|D|>6%!R!ZE{cWL%~p zRf9wM1m%uI3Ly!OLcyw3K9*y^^wRU^WD@S)gdc}D@ImR}566Q-3698o%r@4sk5>m5Q}Wp4nY z=!3?H-Qhmnl<4+>^+!7;&27zUmh$_2aX#Dn;(Wffp*Y+N9cm){aVXx@p~oK+x}<3Br*7eqQ0vlgM9*q(D9GU;DDKox}ff10GlUCrSC3!zs2z$Tyb&33E_GF|Y4EJ~zn=90W27G+E^js=ku}uwgsI1P+^v zw5A=`x^Hdkp!{u5Xd6U#$laPa@i$Ens~9%o0y+Z1J|%f2MoGT5z?%to_YYd6+&m4L z&HkkCcEJgFa+8eQCa~hY)VidhZcc{Mn9Lt54}ekFd<(M;FV>B=LiEdCSsqE;m4kXB zc?5{MEA7N4^IRQ9h;k=g=*Ju-z@oE&t?Hd{x5&LVd&^NoDAma*9<%+$IGZ6l%H#;) z4V)EU-cOj?gruYH$4X)^XL`?SNcMPDunk>=2!}YGaN?=jOBJoto%Ktp^dPv(X# zsng_A>1zl`3TSk}C1NeVZ0<1dv`Hj^GNGTw`=7xrXGDi)Bc`)K;Q?p{@&kJuiQDRt zJE7rRhvwB{E+MM?*&}?iN>+^>ekrZ?RE0ScF^mx>c%>HR_QtZpS;EW_t9TETOD9ZQ z7znRdvlCU8+r(tq<#VP>uT7y>7+|a9`&arg)CW}rYT+V!$e4qvV|7RqV`Q)t$Wc{m zV_}(7je8>LQyAj&_!caHf%sv$hiR;x0{7p|z9~WTFw~hc+31x&8GZ2vYJA`_EK@y5Ej?e5!gl!5<5tk)S=2m-9*w9H*RTdw3Gq5s*X(G9J(=tJRw2!m=Xs<1VZGNO#en1pB z!;=&T*Nt|WlEfNDvg7RS5 zWSa3Jpe;2JL9lv}?#5^IBtjwn96GbRaAxe}37l6LXQTxRJxLfhTR88l){AL-l8d60 z68F-%>wa|unDS=~39LrdGnECgxvAWl=7gZbvufAM2WkwMz^he%>J}>k4E8|HV>dqQ zsVW|vlLhTJM&Z?E5+onn!;0kz_qYRq6$P`PtYvDqp>o}^FH>uwJ-WFfRAlY5S6SNt z6@EqCTNm}bDz%)KA^E9T6egGj{pl8ob)_qWT1T_IN8}T5xc7Iw;Z0~X`XTcLmXBEE z>@ZmZ8Ev<;fw_ae09NxL6A4UeB;A4Gwg73>b2^T5{kHq}+9Q5%v2$3tqfu3_v37@@ zzwH*<`)o@mFSm`1^}Lp<@;3VT)Hgr&NdCG`spubuY@>I3<^hC|zpM2Aq*4B=BmO)Z z|8WMY`1$D5FBhhj#V;3TPH>cyCYFE*+Dt$YVr(fE;5QrQr|Wlzgf_iGs9_=Sd0O7_ zm#ZtouS~)PH9(HBbk2?Y4*SWmNj<&J*U8?-u{O} zTAC}tdWb%;Un`)zk3o5H`j(}kl+(nqpSEHFFVA=}?Ak6VlS|lAt}J;a)ku>SnBb>N zcU1bUxS%{rUm{wjF?;7&v84=9X}UX(ESP82Dr1{#7~i8q{M>C1G+IPB!qa8?SQuy4 zoOMgdFU?lhPgJ3~0wpZhU5+i6`X$$Ze<2io3)4tH1zCP1*PxtHDHh+H^Z*W{4qV}zZ1O}B$-24A0SnZ@w{xRT{<-}^!rRBYST zxakN2Y|qteyV=wpYZrlmXW6v38U&@mZ9=`|9 zI@Aw0Z!9yse<=q5!=jNk^QQF(H~nEZ4%|{>JTSlXGfFrG=fdrgU)k=#Co?Sx2@E$P zDcjLWWI=pLK0y*PhAw7`qynv3%mUUZ@hZzM;Y6^(s0T*dedrK;tt zrSMEnKrRWKLiUc`2Nw&m2>-4$XO;fF3gsYRiecew*FwS#CpHt9U*?-dAEtq|kya)~ zK6xxWVg|wQ)@KmYMlG@Hyp$BalS|JEs(;V55h)W!=Cpmx@qY#2>A{`8~2|KFDJUP4KbvJ4zyw zU}j^z%w0PTTK+Qay3ig7Q` zNQt728eJjb3E}51JyN0#aRNedu-_b*f1k_^E0*+xMAVk z>Z5`bZA}Lw)ap_0QH)8&s4OB2PKNcVd70iwW9DqzNxCP)8R+gEjDw5%?&s#R!&%pW zY4XurCfv%-)M>x%fahTBs?>zeP`-JbDUWEafWZ)~cy0jhk9J7ro$ViW~t9Gmok1=VycM*c+`L+mOS=^?R24t^`YDP?b#vNCY)L+6z z$)<{$M;p~@ox&(*U`ycDK4zS&2(Q3Xi!qHp$(@~98iaOWuVr6l&r$-ry7{-2Nxx)^ z(FjL?e>fp|5nLtV7LhxT_7U63zen#$uOc;|pNnC^Jf0exoH~|B$$hhfdQZk6bNdER zE1Zv0xJnxTF`gu9+8YmBW(rPUjM2hO#w1hOQfNGxCdYIvL78O-Ar*dkONz;sB~Oz( z*+Pn4nBfk_G*N$_$~N)V4$hPgZYf}x#ehjRSq2unOIG5zWM-sEw;I_Leoo3>kCsyN}~lo2)B|P?(tN(LN>_9~-0M2V0$j zFrniJ2R{Z1qrPF)%UShHw6lTW2GvW|au+Vu^bhErq3DxS)Or}W729j-m*rRg%0JKj zo(@|H`Z(f#`#Am_%Kwh1l=#maRzdvaPuIdg=YP2t=%)U0Er67kM9(k^F+z~VLhV0Y ze^MvgmNa&IbR+OKUtg1%lf8kd{2AU^BjjU4l~8a4a==(S@%>9_S=s$>rKK(Q=!g!R zExB|II=Y5R49HpoIAQIT`Tt0J$KXoTty{P|=-9Sx+qR94Z95&?wr$(CjSf5NIO#aK zYwvyT_uk$2yl?IE-5;weRjX=M<$2~aIp!E$Ll12WyY(lV*H{^T$S?>?=<{r^y(w%M z%@YYqr@ABe*q22kS@ag{Hmgvb-6I|KG}v^fmt(VQ`v{j#S)OpsNd$jxEWif%uz3-n zLpt-p$9UkV3D2}{6pPp4dUSRT5Pf};kWZ26nXr3NhavLKk-C<@8_`^l9{>rC`rzit zDkeB^3|@0M{5mef;@-lMDNm)wT2|qHqSc=O*or6$vXO%MSRoBS z7%vV*ua_IpJqUa0Ry6Xt`KG4Q1qx*hrIE>~P-h3*0No;6ni+&>LY+B+J#cSW>k~k~ zINm|l%Dj+pFpRi$2EFAKoS2?Qon-~Zp?Q12<0lHIxAy$}X|mc!@D%uo0@-Y8#M8ad zJ{`a%0!a;fJ4OXmSJX<~JZ+FpnHEp9%XO#f8T^J&_CRFE37c$?%OWlQP1-xY(2Xeg z53D7~6fVE7<0F`n4Rkz~z_AuFyu{k+pvyg0WD9-cz^NL#)|r?%T-}e)kS@;O%79a! zxsKOsU_}(AWUS_62m(;{s-n#GVwh_gVuD(~1JTM$-m8hUxLQ z?!fPc`5!^m0rE_Lw3&p=?aYiFe$R@E6l4Ir+Q>Y&UOvU<$>zopE*5h{p{yc-iue*B z!8F=Y`-Mo)*^{1-zcSWAL}v5xW@ExHJi{0BMHWM?JoJx69l*ruUW2k2lIOJO$W-$&*om+Hh)}&}bn@pW3@@~mDcVfbEDSp42 z{+4PrfZ#Q|r}=c9$=ucLfKd*^@Dp5W6T*h0-PAd=j;7eZW1C-7P);n{Fsk*3&`Nm@ zn{Coc4X8`Cx2%U^#|U&-^`b>T&*3VxXva8wLbF}__yqu+KGg43OxCqN<1JXkXq{-r zX-IPrbkl|68@Jwbgp@6eoFNg2pwIqN;~rel6ZyD}p26eY7KHOmo6sHO@?ed?2rh5MM{4b&LPJawxO9E*^P zq6h^#y23({GjyuGl)q5}rE+L6ko2Qjh$kTRjRsu# zf8QMVkM@uMKNgbz4m42}|0if7`1_p7g7mpi16PMq1Zf$U)G;s-fXp@T!lXok%}H&U zWz|EQ zi2^VX?OrR#*y+)yI73L_!%!6=Y&THm*QdI>3~k2!Aj03kak&NnnS2t{rN(PG<|tAx!lH$7m`ogatfFj zL5MdDJRkbyLq9q1m*pf`uk5u!|Mw{4Q|>6vID!NB0&-z{XeH)h3a$c=)E`D1ozLK^ zy6*hP(`qDU(oapu=M#FE4R=66{BkqUJ7TygPYRIcIXMK@y+_QRP2x|uc^j^FwFGCt z34VIeg}iqvw|`dCwR?5YmVhf3`rC~A_v+?9s;2*x*ZiNV>Aw&YY!VG7I@U5vs#Pra z!12o1UWt#NtyTP`5UBdVzM7Qmn-F(sks=WQXfdcBcm4#Tl8NN4h6e_%IbLRZ0_GZ% zF*)D6fm>s^2xtvS1}UopOZP2+p;}S(XnLIm8^0ROAJ7#gt)*U(t7_y2dXyBBTT#Xv z#8;HX8?wy{uATT%4f-90muztPN;WOHY!WTvrEj*51h$;FaSmM`f>8`>%2e7b)u{o! zN&cv8UcrF3*cj?2r5+|-=}4fS`_&{ZnrS{96kp)iSR5G>&%(ycy*d3M?vYnA<6K?k zRLss=aL);DSyDz!U9ygY7kO2PutBPuDN2J8VivE5fCTKN!mCZSW87sl{yN58=#QE^ToAVHKXjEnIJ* zEONNn_U=1PsTpkcfRgQ_3zjRxA5cHXj9(ngAvTOFrB7yM5k7vspmE|W_;u~N-!51E z7(5qgw;0QFRVnos;D*paytofwHZXq+1iu4r{FaRQ8#+A zd{%r0%_9NO?myM?3*`xigXSUASS6EC6KiZ*t@}%I;m~$n&r_MUp2*m~rj`}JZgc8B zqp?4uxt&9MOcM#+PunwIHuOAfJ!IZ?n!4UD%(a9FFG{HqDNCRc6)qIfJD)D15Jbgu zI;-8xAJXeUD8=NbXPmSpo!re!lJYoO`Y6VwD=PC`ph|UX+@Vc+tu3=>RhPP$i2R~0 z7AqmqlTC)%rizHMaq>iD0gy9ew!BbG4YvW#S$|YyNs9wt?+DAT5b0Dzv zyftB+p}NOdVZ4PZJ{o;>V>q^D&$PfdM5$LD*KCXwhzTp>8-hI!`=2w|cR$ z*tnY%q!=PK2?D_WB?H2lSqn<%DQM~&%y;3r(oWlFz%~zdulzf@b?d!F6qdOxEwL{j zI~9!ATwF$4*8F&l4rAoE_j)VmSxL|oInpDJC6!d+M+s^ zm3eJXr#&gqsnM>A@V%|pw|I}xP+Bl~f2Xy2f%qAo_V4RLCiAJIqdObDexXIB~cF$b;VE7(+X31b7R>3MkA zYTy!}*6cRuV2cG&jpJF(MwV7hmr{@;Fx~~uO_z?4JSFAcGCUu*D?1TypT7Do>t?n} z-n4~^wym@0nEO-7&U3WOyd~y+{(+EQgw@F_;JV8?#;e(8Y0n!pjN##~8iXX>&*ry2 z+a_tjcd|f+O!)LF+L)()bM@^@d|mgh5w)(EnCJD5O{c+w2KOM*q|lN6=-`gVm4@Br zNy+U?c+|&Zc}CQxSU%Y6o$3=rnp2j0D(fyoUsC?!l$t$iu7I1eVpdj!SQh7Fq8;iZ za8^;Tt@GWTr?&*uG##kB@)h_s`0cDaIwOOT$+0MxB?&W7mA_~d=CXwuOe3lVdQa`L zz*$~NZb{U44XoU#SyHnG`@wY}9^fc}{aIBrtVW!4cqLOm9RH(lN1$|{=pc20T>8z? zPRaVVb|&mRK<_actVCg&S{e0jF?7R&E=N}Sli_Q(?1LY+o zC{|}LZHMiqL?301=Tw@SJk*ASM(i)7@yu(RP*6POydt>e2((7*b`6*lvtuv|v zPrMY28sfQC4b=K*Iw7{$xb*)lt_8%ovd}xQ$AUpy(hAjU0k2itY1cHzX||X9jU%Q{5B4i!IF`Ja z>b8jO7lyz(a2dEZZmnZGKNN8p7GYg6Fk|AWDR7w#ZeWHxS(-QV84j2DeN-DxJ?o(sAH)B$_cP#MLuxIZTZ4X){rHLe zlZS*wyYP5p7*fY_7ctK=LV#Kc1{FilY0ws(6yEL~TR)s#<^@@6 z&*(-3LwLo3an$HamALwnZ>SR`Lcn^f6^)Z!Q0&@1<(3w>*fO|0o93m@IJ1@gf+ARi zUwAq~RGQ`+>>rhnrqcYwl>Ne^(W6(=`yT?SY(QL_+MIcKpoOX3(C>?=q`5;IxpsnI@;qtx zD?rA?(voet%GdR53d1N*ZECOn5wv)Ipk9aBO8&ZAGJ1qenN$ zSet+?qKBG5uJ1p4;YwmpmUW;937VdeYd%@H1RK5>C!-J+D{^`0w72=E28GgCtbril zt~CEvwjli`BK#k3~BZl7pZsbC+n`I@`_yy94V*C@mavHMc-$N#4{rzphof4#Z?jo_B4myyn3U4K?NYrZF13#|wWmq)OY z2M?xz!Zonc%V({(#x>o=PnH(_|prMhUS4-Yhus%yiG{MHkRXOMV@^hVez6QaNKh{l=Nrt$x~TzMOUr-Gbp)E z_)RJ0ou@@XXwb_uaSuTlPtI!(?Q5Iw8#a}EENP31_iUy1`1gi}v|3ddo}lF|G1!_* znC{fg34Vw-3aRan0ltnoJ$odH_F4Kv2fBm%y_TYJ&~A79paIp9_X8_}znoGBp;_{| zn4!qx?Q^-Jck1?~$YeA5C1m5HFW?)SyKR&!NHPV>0?j8^OOtl;r|phDe3JBkt?nTC zeubQ>{bgGvx_Tz=tQb-(c**?L8t1I3336X=V27-|F~pmugITc}885t0Ovy!VewdXt z9SMIOlzM>_g&&T;BZ(m)w`w9)f7Tp9cbIyJqkJ15P#sP1fKqifkH7vV>?(y92F%t3IUR#vZcZbQbA3 zJH;JqGK?g}v`;DY1mw;4>tN3O!l8KU<$Kf(MQbW#^jI5_fT;Df9RAVwHxb=z@$Oh3 z=j%T`3$N(L7jl3#X8$b;{64k#|D|s8-}5z8{cF3*mRGa)h5#r$S6(?)7OMpRnuujk zouZk-;2ZPlg){m|?0nzJBL8OF4Or`3lcQ z(e}gsQA*9HA8{u_*eRX}11S0?L1{?Cp+qPlW4S*~G1TLDGX%B()R0sP>!f5Z8`iCT zhygap5oM48$q&ug!F}}`cDRi$712Fo70%<(DLfe~RGY3MUWtqT=^IAs6dN4?F|nNW z&6`*2iqj^{Uw%`7pR2R_(4)Jm4$qqI!iW5L5z4T=CA+M zGa0B~n$U{P4=S;4pPBvbi^v_B90Kxz1ogoh-3%^$KF1$Jypcq;6KrO_fHWj)@*hT6 zr(zK7GA^l-{+}=fJRlhP*YwAwL+CU6!0~zJk|pGrRgE&{N~0ioESQ#pO-MIpxi%u> zc%*h5L2y2#u<}T)i0(=cVh~8J4Cg2=oNkd82TI+fN$E!Y3Do&0M@v=MYUd%cPatte zp1>=G_1?U}+^VVE@~PC%Kup{H$s}aK-}#x4m?#T-h<>5Ad!)VxuUZ6?;ul}Z8j%Ak zsD1u=ueTrM^THeS^FC*~u{Fkix=V!C2VblYP*0{1&PgWsV4)9AOfXjL@mv-9c`CD4 z)d|+sKcg{_;0?&MW5p>Z%+0QZb;+Bg5{TRv;onNG=bfO<&k0ctOm|i0q(&pin2NqT zpZxg_ik_`&VgT;|?Qa;2-y0m?<7cZbUa;phW`sxxQ|FudEA-qZqlO2pHF1ClAaBrNZ zCQyq{3<)r5J)7vjVyIm#YPt;iRMj2Ki`c4(eL0W?=Mp zh-chP_^a0yS>&W0zETo1;T?9nj7WKp%g_n@`+@+lf}~)i9yGWa7zgNu`{uh)_$boDDh_!>)|X|hv#E) zwN2gXhv04S)#!9opO37*d3{YsJ+H;}IpE>Bbacyk;qc;k`feHx+=}kIVAp{L>FQ=r z)_pOoQ{Sc)?Acj5jDuU<@gm39q!OWkarF=U+gY} z!YtVUTu}Shff#1)>Rkvr%0TBYux<#k0=v1;AqN+Rm;i=*R#>QW3Jf3Wfd#_7(9o%I z){@=QV8A!m2A^F#81UX0xv5rs@^@SPO^6B0wl5<6EmZ7847Mzz5(RaH3M+UJBb|i% z`;5w&RAX=XTp=z9?oSO??>9R=v0zhF3)$G`#@L9B4BW5iFH8M-8^YSg+RmJO9IBBXl4s%7CbIm7y_V5**8H5h5GFi6L=rN0y5(JgJRV^AEutXBLhf^1Mn zWMrIVM7A?PtuB&ZxMV0tI*lJg!BE~r(SKg(Yspk;eoLFKrPYCcAQ(oQq~-pX0;wfO z6e&pdtumuQailLah;qdzYC&^b0EvsV({dbf{F0ukb&$wZ*4cG%4AYq2bxcRjfvvhg zaPg`V-qR8tg&>8xz%QiFvMx0 zP+|y?d|En^#F^};%l<)KB(&R^hrkm^nD0wEFr(o;jd>rr*^q?uY)SqiA0PSwy5N(V zsF3>j(IB9|84QC(8PZ-8|Gs$TAB|=&I3gtu6UxK1f=v4|`9!qbU0HkVXc7~h;3hIs z!JfC9!s!#F#OV|D{rIse_mK<3CuYUz^|SBdHCd*j`m2Z&VocUWZ4(zh>ikGG+ z(cBm>!_}syBiXx$&WOxT0vi-QQRutPwTmV^`J>KYs;sBbNQRr#$cCHP=CA73b9bD} zUGJa>KIb^SGc4W+6t5sRY-z9v(q^yR{h7xI{#&)6{62K8ZJz=JfT=D{Vw%%y;tUU? zQ^5LmDYwMyKgVXuU9mwItP($ckuY^~%0uy1MyFCQi7UI9LN}k&pxx4y!b&q4&_l>P z<IkP*y+w!0r+~h#WuiTSB0mCafewieL&Rgy#D(sc240YdI0b4C)@>2z;I- zIThfsAa5$xN!FFz(1@(a?WIm_;~iIf-|)m>qljwZeSX9;4IWLD7;(rz8u#` zl(0)Q%^s3^P{;HV1p<6Nck9gnm$Jf~$d}hfQz7%3Kh~~Jh~2WOuNVPlNci1HI7$nb z`ny$S-22TgZ|X1{nveBT>M-5Dh0h(Aeu8d)lFWJ-M?*m>Q${#PLyetFUw|lcoGpjz z$IkXp+cv{jmU2=Q2asqkJP`#xWhvNZfP@C}uR2)V4O5mc*bV98+h8@`KD``N2eDcx zOy1GAj&{MByr!_#1I6Vi*cA$c*OE$g0p&W%XL<7st&m8yhzWKu#Re#}gH2Zjph;!} zBI;2bkB~X_!NVc$NSQ3#uCWDaGlgZX>6y#GhhxG)a=IcEtf!@Y&f05bCl2GC$&HxV znw^rG4)42`Zd&%)*rNha?9shA@?tx2eN+SF71l%1dxCVQ~p&oON9W+%3 zKDcp;i`q%zY|Va9uUEG;uIc8&=;9`2s{k;-g?Iaz$v%-bX>kLo*x_zPaJWzq^TY9~ zn~HG*t=N*I8o5dAzjkC%9DeO{3$h7Zp`T3{7@!_a;G}Gxh?z&sxYK4&=sS!q#ZYu| zuoONq=TJqMf6hrB0%bPhpOBW48pUzLd{#&d;^u9cF??{3Hnq>2$r?&AO5F}2Nrv!N zXV-g`o^Y!pjG$9%lhmGRFB=6k=SUV0dy>ba^E1aG;n<}^$K``2>}XLD>MiMU5h}&# zgp6Ty4bO3Bsue1S9h>>x!#_~^bXmB`Gsvx(4!2~(TJ&&j3Kl!aU8zXE56rfv^wmbi zKgdrEgznp)dc?28?o_Y~M-LR@4h66Wi`ikv?1CQH`2)0|c2PPfSzY2;v+`AH_F!C^ zU0Z!}-adq~U$JWTnYZP2JIlhaacO+CWO_R+5P9i=NhW;DZ_Vyupq)!F3fX31$?iGP z@6MryrJ%@8AtB+RSAjY>XV-%>sbWq$%*~DF;Un3vrO1 zs%dYshuLqli;0sEfA9nw@+upXKom|cIh#<9l@CdiXh`I9xTRAQ&wgI-(=s!X{sR64 z{Z5H43)0OPk}LeMV0YPf{0&477VVy4yy|c$vr}Vok2##dNG6g{Y(O6}M`j@f1s_&? zd*||MH>VQyqaXSetijw={F*PWUcYRADFLX#ch{*uCYU)kj2!!x!E;wz0xbyq6giktl24ad30 zWYxSRfcWV9UU8s;ci9;I_)+uAW;{jxA3DruT;7vL$l0-D0rheR`sVkez4I1Am@l&< zt7*}1ZuvWfs@1u}`QkDHb?M;}r$Ew5#;Mhm^3^8u8Umarh?VjxW-5+zWwauiD*LD^ z1MvzG=jE_)WhAR5m~$o7gFenE+42+i@>R@P?GQILgL3CO!rpvxjK}(uQ$dV5o^uQV-d@#)7+zDTtxn3o~#AqJ+R6;Bl>H(3_-vq7EKVAi&NsI9kUe|!zN9j52Y`4DqA7e z7Hlr1S*vBZ^w-CFkJTnH5*fN1$s>eb=(?#>-ByZ=l#>%j4s#4 zpVM^QjmA?CzY^uow zX*Mp8MdlixcTPo9bITrkLIX!w?(`~rWj3y4d|R*11V?Ge{vd)4F1HDFL1KOkDp5V8 zeKjdOk96W?f_O=~B0A)tZIm)2I2|c@7n`?ni}!@|Kv*qgYoJ&(kk>UBW}JLotNtd{ zJDW-DPI-`2?~46;?qhYNy*O99!v9}-CiCo|7>tskdr3rld^pczWjBn&VY;i?UKkV#CQ z@;j8PvN>bn!#>pzy#gGO^ZYr8yap9zQ^Rfx$4Le*s?geEhQgjKF|uCs}WaAWm|?ibk91>EqMW{h3=o z-Z0TndQ{skjJ}7ekaB3Wq_(Vp#dzxr2RPeUMV#Ae(R$^UO~G{(ky<)4Ys3p&zw)Zo z8OO=I=#r$6tD3fpnw9%Z@m?bXmFZVO#R_`?^qv)KWN#N;hz1lkS=suKYy$50ORgjE z7GKtxzVsD`iuhoV{!iXtFm@p^X75>ow**IDaM;BDZ~|kb#`hzDgAfKB*MGf`-+S`^ ztfwHX58yC0wlQ@w``s}EIzhk;$UG;OjnU1jRQ@)bOOP;x`SK^lrxtelMK98k3!~DC zCX5Dr6DofV!NwX}`m>VenzefK@u~tzr&H8v^>VC zr@$NC zzWo!N86x<#j1h1xXn(Wf-{;zb|Hz8%9BfSKgw0Kj9i9GK0RERNvvv5_%u7Yb5y=?Y zhjq;;!D#_C7$4?NsFKA>(;pvHvZ{!JB53~8+qY4Cn}nh-^D;6mutPCaw4KhwRJK>q zmdHk@?Cij<@1H;X9^OCSb6i$S6uZq~a4p>WWIb@qxKF#Y^}OBRLVdd2GXbLTf*;|P zcGyzKWt$W zgnL+3-?h7xsohrBbg|^PF#b>(9O}Oa-_B7afW{Ay1KTQR%hM-r@GK>o=*+263teJS zbIy92YCA1;gNLHwtd$@bjKr%{|Mdeolo7l` zd#YH>{;*of#G{}?*b9cLVZ%px>FV`K@ZPV$VlZEn4fy0f(gLAieo+^5XOw#T;8t2- zz(+U^Ug42ih%gItp-((*NnB@XwPqN08w=k*ctCqgES0Rc_8vPu$vZeUX-ianfUeGT zwrY?`c%3!BUY}dR%y#ZqU#^UhX(ju9VQT{EGyHYKAl|`=4<4SaBbo(i=W4ebSlYKC zw7WSDSk0mdx~iX!gVbjfcgyH_KKJN#PrGVFJ-iCtU@ElUkqawE3B{Ot$XTuS*nPO_ zi^LNRyR4)EGNb`_Cs3*CpA%|IL%fcIE9YOODn2+6xzZwIB@CqT+?NV2cN`vBXh+;U zGPPx6CnOv&jDIRwYX_%m2an!<+hg2RKE$?-P}>|2ZlLoK6q9-kaD;wW8NLtY>d0wDa`wlDt`>X3#mi=pCRx6!LKTtIT-6385=1X8yo%RSN~W81Z2SPsE{g^klo)e zfn&{txGmVt^84U<_{9_5R%xjc6PKxn0t-IG>C(;i0JvBTQ@@B|t#f@{fTa1#+S*J_ z3*0BrpGC2Q>0$TC2CK6M3xmmF)<|5?dbN_>bW3F;9Xe~qsg>eu>?z25`nl-wBh{C| zBEfE~YKHW(0l`M8v>n}@Kb^75$~Ujc8I@o`9xSxm*6~22Y7Y@j>Zm!RYlpISTyoQ! zk?y?a&^oa^=26Ri@xJ`(y2)^9Dk8QW9fpGy8>|D+4)Nm4uFcC-`}EWQc;F;^lfN|~ zv2YcOHQI*PD%T?yv*>)t5G_Z%ON=$Ges4+QvxHrL_0vlIHe`40JH@hB9fUE-h%M%4 zEN&UxJVLQQZZ0JNOeIRFspmE++Occ4qRc+NR2v0C)BbMIxXA1qpKyQ^U(6#0*cboB z&7MtIh6h9s8=zP+Rv#=OP6Yf$X*N&vO>3M%+;khEW4b|YknTZkMOTme4X7fa8|T|$ z2q+P~^_0HPEPenewW13oX>x5O`x+H+rV1gj1y(@YuAZ5Gm=HnL<5KM>VphTHUtedS|kdP+AUjR(KB-#@ENE&sBqz84d>l zBjV1xedL~Vlxg_V!so;J#SWBhfj#1hIGhu8J~Xdz-vQFpP9$B#yc%{FyISH_H~l0& za$9cC0}+o{K{eI_QteT7=LxdfcJ;hnr@p7ID*lK~%DLuj-LrWK0$ZW}t!t~7>ipTJ z;jZnFweuI5?{;S%{&ne4ff%HLs~QUQeLc%I95Ok|a*CD>mAXQ0rtcO>QkymCY5EF0 zWx2M)-_*R3UZ-H;KdC+9SZv&9vZn1H1&e)tg8%O~OvDgvA;Bz0br zaIXF$E0`M2V^yr|3F8x)nzIeS@*m>(8&rP~*s>5+fCBt!WTaHI2rtSAg3LtQAzO#_ z?iW11<{_Ken^p^IkDtNTZPjS#&ibu7BXL5>DALf6nCCWR)LMSK;Nd3JCU&^CM)Z+! z(A&bS0TR*@Oj!cBDU7Y5Qjn_eImeLGaG_qBzW7$BjdvcGu%OdYZ4FOReUnqYwrx{b zjvJ{zLhMn!szVcy%C0xUC0z2z1fD_83fv-GBG=%4MlR5$hR8$q>`l&uE(Pz0$mbk2 zzWJ1oEmC9S>;LeXgNyaToW?52@{`R78c*XSgWU%*Jqk5~Y@nAna`M9wwT0R?fzc

ItQfwUwmnqgv1d*5l9q3OA|gp?_R;jsxw5s*3?b^#gJW&}LT{2?FhdFh{w| z)gTXG=`%M+4l}5i2U-tws8LD*ScVqsuk15!Q7Q@8>_c(aPJyF?y5B+FRd<(30lkJC z?jII}^`@Ngr3)CGA)63Gv8DtG@fUQO$c$qBI%i)GlQO3NVA+Ptp-)Fno5xF^)J$dB5Y+rZ6lE=+CZ_ zSnpB%)_@_5675@j>N0A$zCH7@x6v}`Y!k&q*s=|;)C{$dygy|E-KoN+w@fZ?D8Na= zOfBL@^0{(Mn8s-^jIdxEUXeosQYQX#O(@lP6~oqL`%lF!2gt9kN46 z4Y>6Y#we^qKZ1;BFTh4zw6I;P`_sX=OtI5(m^`V@bYrw;p~)JRAA3dj7Um@Ngwd=XB<2gP)81E z-27=bpT?B8jFN7(bc>~HU&Q+U6Yi$?p-+Q`wG{k9z#P_32zY28COJg@#ty3;8j4*7 zLERAlDzM461|PA0h4INxlZZ(xy#sw|+4xD&OA7Q5hK5vL_ymH=iz73P|K<1Itym11 zH_U$Ewou}YSPF$V5E*24ALXuHjqVE1 z@0JTE+JQIBGHv0~2dT*WbKOHXN_5n3?2hguQnoFib;0AFJ@i4}i$P?R0>*3Xxj-$}S5rA|S5h^n4!zOz6F z1C+`F{3t(mwG6VUx{&$`i@24WF_k<;n{cY*8&_RoVW%ZC&{t@8#M7Sxh3ELvhuP+)P3ESm z;~iIB(LVakMcCM0s8}k^m5j}2lqy6q_x4y2T0YavY^UVU@rG4SMZyDYiR>( z4Y<_ka6?xiYwfDe0=k7!ZjdzfZ|;G$h&c<$Kk!$#KxQF*-ZZpe>LNDxw(oJ=XgP3w zsBq))BGWB!=Z0HzL^t*Ria#$BV!?+0mGAE-{M;&P^P^z4SAunjwiu=`I#y>=C|WS~Lx9pPKgPIMNxU&A^?m#)mhNOVMOc!MW|av7AllSm_12Vw3tn);CE z>-+(|R0dNi4DFTWo!{cIp34E|tBc@->@mMbHEW>^2G_uGx@c>7*lrJj64Jb1*J6OPBy-l*{~u z^nham2qE0AskAj}tbibvH6@fYYl?_2X6*LZ(C{-oJ_DkHMXOWDgLr>ofC-Wowmlm~ z#>UbaQJ<(s2kucOmC7@j)Ajrh=Rs`0p|4IQqf&uqgP5yz5a5-F`oJdy3&@n^4cA1W zK#uP0WC8Br`zQegRn1RUDgW-1LNyH~ zY!#F*+KCzZ2EpINF{nUDNs#?zAclQNaS;X*0m4QbX<1;LQ_j&mJQ#bn(%v=H**|Z3 z$tt-?RKP-1OXYZ9@~OMmH+$$|v+iH$qhHKSC5S5aHR8x0LQgDt2HBfHb3YkR;nuxoh=uAu8`|LQvjj4Y=$1 zs)lKBERcu`YGNIx^m}ul>5sK?LGjARppY-yjI&U)*-owk>Fj%2sz#qWwV~B#zOGbc zHa?K(jJHS-6`532rDTl_h<-B$P~>fyZ6&Q~{MWc{#dA@yqZp8_;Q%DZ(&Nt4&;eSu z(G6QD5Rq$;LOF&T4H2W(mP_`g4XeavWkWVPQdJ8~0ocor90z zZ$+5CdFw<#v9;}Ov92=fgtj*0FE};|;i<0FwuSXq4d)n|mhyMp>h^)04HsIXkYpGW zka&!x8uzuc1xce3j`N&2hHQrz1Mw0@x>9gl_p2zrj+2D1-jH-+1e)QX@8*=21*(OIw5LHF8Eo{L9X@ z#YZZJc|3OuQW+%#2U3$^-Cns^Q+uL;XELx5yLBE_l<|bM%^4C zw^uQ)Ey=@$1sZmxbnt!JoOXzESqwX=EXHLveBN_f%IFpYbbb&0AD0P-cjE3xrV5LAc5%rt*j z%D3#(sH%`H6u*5;GnEMtD7aK|S8W5Zo7wCFv5O%HM@$Q;WSum!E)bWZu(wc#XgIi9kZJ>BMdm)jHLraGg1rOajww*~7TU`M+D;U}3;Go5{nl!e zpS;$)Qo#CJvO*oyA%*0xq1n)F#8wp*Tpiyxv#S@#=j2?lV2{LS(GG-fyJ9ABZsBT^ zkGSeyfJ#sKa9+($!D=(a{+!{)NYzI2W2fR_v8XogugvogE}lWQ`)g9&+TlN9Q-L1Q zjh|t2CLQdwtA7Ha94k9eb%uOVm1VLtL>~8jW5oXG>xkcxjWEy!vH)HZk?%e-nnc{= z1(j=O?wz?PW<8ZW&B+icBV80qal$}IuD)~oC3bX80ED+RV|~KZvj;!?Mvo}q#gP9s zfO=ZbmBWkpSSlxZX6AhcoZB`ttAg#xjR3b24E!`aT0{~3)6e>7#K^Z?qDs>^>uDwX z*wd*;cWkkf){bpzS7k4e5tA{B@QUwnP(eDuUl%(U$l<1P+$uh}Ct9f#WFLZV|7QPj zj{5cpod>MU4*4aK69$yzg)J6!EBMaE{F%%$JGTl#5t3qz342$lh4$jGfmptfSe|6; z?o?OpFd*0~TNjVMEI8uoho-kw_;pGDGj26i!zpY+EEZfP71Mwc+aASyca^kR&VW{onLUK*Zb0VH_TGDw#+L@n2V94LOk#~tLyvB|Od z*OwS*T|Jrv>@SDuuf~68_m;s(_dI=b%&GAIIa&Vh5T@{dhatiyrUow7&i_R>8#sS! z+(m4S96juvE$nOs{*RDb)WY_^Wk{7OHcH59C_c9CkdWaaeuxc?Yt6!%Ny36e@-|rf z6a*{8{IgB2_3aX9Z0!?QK}*%2fS+4mzkQaRiy~Y^yWjIUdCWpX^5R_eMST|ZXSeM;Ly=lCv=TZ@^RCl*m1rd!Zq2}SD zY+p>2nwlLiI}wE zl@dKGiiqx=hN{I<%!)2GElULj)lc~Z3r^-{Jyz1A9+Q5oR^rib|Rdl64Tms zSP8EuA}MSBUMnpkoB`v5HWw^akx}dIbj+H)g2(U86p|0g>H=p@;sYM3qy7O=@m&<~8VB zK9cqJ&YFC_YrIfp4&B3eM$z=_<%B{sl=QM{=l46XG17Cn0|)5(mmdy>JolA@goXSO zrC8JwI`?_OUaR9)HpMC?DJ0aU`7#v7(9Oi&=Z0qLvcFs(cGl_Z8*6e9mM}K-Z``lK zS?cCcEQvJ}yO(dtQud`M?30LWT6~?y$|;9ouhE9(i=`r7lW$My85bD_f9J)f+n&3g zTJ8wDco>%Qn+rsu9K+27`gV8ath)!ie#@{r&X~35Zk8yMC|ku}WpmixQq@0*s4iu# zGoY}0T|K?6wo~BKC}4dc0A0`i0Nn__#d-KvNEvep6>jhh^?a|n7U(QND z+k8W&mxdDo=?Y4t6WMTSOtDB?=iMpm;#qiRE^C?*9iK&DYxDgL{EtGEwD*Lu>az&7 z{1o#2Pa*o(bRqbEr;GnuOR*I&H8!-fmo&Ar)V0?)5p>o!{71(4S6wPoE!9i+%|nVG zI9sL&loJF&1~Rm{2m(1tE+OkYg1$m_8*h;JQdL3(@X62eZvyS>newi+?{IT{I6va~ zgIkoQlav+68&;0C0+=qY9*{q_3n z=JGFXZJvnceOW(!PHsok8r9#M^h9b(Y~(bP9rxZD%6F8qBfn7sj6XhE#A+3nqXRg= z9FCY_IP6(ivaI-AS>HJ@+I`w(knsxA><=-n5X$80U&aZDjuZ&WayLvZ?HN50eaipx|Fp9I{Q6hBsNnT;Mh1zy^0i1|fCO`l-C+V3 zaby*7jl^i6Ng|P|J9>z3J2T&Y2~156=lE4&qKGKv5$IKB;6>~Vf`$Qd_{=TQZj$|C zeewPE?(EYST8!eHsLH1m1I?CUms#Ui1->_*k5Vbcd9jLox8kaCP{^lpYl~F$PvwWu_~&TDkoJH*h?l8`HtK*!#FgrP`2Z0bZNe7p zMqc|_!521au89gx8p2b) z_P7Tmc2trDDG5t<9Neo#UxVzKU&Kgp(vOJ&;te)=qu#eJ0Cg&Z@t(VHgvjLFm|d3EEr zJIv^<5NXzrUP0IS*_y3e^q|?4XK9-N$H{N`$WaTOzU}Xzdz1to0xv=7GD_XVAsF1= z>}tkAV0}BvItjLyzZrm5Xz+=ZW?zC%{Ap#RRpo+YH1OIfcg?1aM_{LbVl_k~!#q{T zz|%_KGgOuaqbSdf69QJrvQtO%vLE9yJu_@c3H>Sgx2cef4J@L!6>$qUF)C)QAXx`6 zrYD(d!cuvO;VATrNR8xY7J_y@1O zy{)O9gT0~MCppp4^xsv6M;Iqm&krQQi%@!5%JQ{e1Z;U#HDdb26b4|i2WW^ffHBg| z1uBhSp$L-XL5*yy`)LO!?_Z*Hum~gQ3C5uI|QG?&#D36`ibWt+W9F{_0@hVwWxl$*QaMPTt zq3)xvL~4b=13eVR*Zo!Hh31Kd=lTz}!vy3$OU`H5?tgy%lUM(`?#K7{0{io6e1^2C zzOMa0d;Gub`_-$u=pfCbe|QWV89O;beB;vrq9+p`>PE0)fgb_`9TILNDJ)RqkpXs?Ei91OT@Zj9EgK|E)JJqH>Z}le z366D$dNF7)*7eK8LvcWYi^e4LTUkWNU@Y*=B4}J8k-O#qF#eG#`bHN$YDRZ0Lr3s| z0aecp@S-oQyZ8X~V?)#%HY9Dx#Knk8h%nY;#^$vLCg?fG(GHp8{ zc+ze;pi4gbhLu0&I=_l?y;I?M!P|XM?EHLeHF@g|_S)8F_`d!v^QV}zcuyxJ9$C2e zFPw^-(&!)@{H0P4pv>xsDD@g=)NUoz(<#Wz5K&O&3&vSAUD6S`T%dAgdBOng2a`2;>9vN1l%nZ;a6o1OhO2P9 zSy8HeKsH9VHFEc~sR!LCrg)7`LoKTTeennrJ6a8>b3?IO`tf3pr~K-6aF$_|6d``R z3_VShpXeGt{dxix=BVpa>U zs&KsNTg^&Rj!R2qkgzD2jr9$u9@d0sXpuy>6@e*T;~0&AFvjq!m4vyXYNbG$;vFiY zVn!&sovUL}Za5CGjxoXGO&A>|RfrI^DB(n-+YUh>$pf!*mSzF?-J*<7^>2H4OI1r+ z40GO!%uU|HdJo!uYAYr5#aL|=+UKc!)1B|5ij2a=F+(kTj#n+O!p{QZ6cAX+H%B2% zWGP~9NJ20NCu~81c?r{!E;TviockeM)j9%5)wM$0H%J*Asa)g_lcCDE{K4|x%8fO5 zDHc#f}gj+057qDxpsjcvevMUlv7oSH_M=_lHFcc-ytu^oDp+FX4lFa5iC80tWN3Dn94CqtxFOZMcVfLk?mbAr>3vch_H<}b-PFpUT{P{e| zCq-2DrbnnUR&6g$x2kE;zo|!!Ba!UgsFIz$t7L*Qu4DrH9c@_@YCJy{nWDf2D!s@0 zNFk+i3Rq2KiQ#LDt4HLBs(upvJX%;8x0%YFf$ay{wn|Is&!uiv*&IQr_$j?$F=UEd z+h7VLH9j0~2l7JE3}V@QzEP9rr8IO^3o(z8g0d_EzTk{0bDO}4flNdjkxH`Fz!JA+q2^`Z+~TVw=zii^p!tq! zNv@S1Wl*O~yap)ti_)q^E1u1DB2}Q4MF8eczi4KIN<*_cF&n5*BAETf6+B50n;tLUp+4RYB za)9<-%?}!trw(5VQ%^i0^|_*F*cy|>@mvS(k&Awh=}^uZAz(kp;_5um>{=M!3wJ|e z_tDpFfhU=N?S_bL3Dc>G)8V90b$6tOOGwkCG&wUP%L_&16%=i`wuzggihwA~x6HXe znUgPPP^IS#%bF*NE71L(XMAZu@neti!kGrXWYan7H=l60URZXJ3-OwlwI9C%3YVJ_ zjpm6cKXpXn*kTR#gyd?4BH{BrzVT7$K!Zwjw>*$E7Q)3r&`vASMEia+G2xDYh@|!| zUFMN**olwlcm9S7M-pL>H4TGP`pRV$qUStD-B8 z(v?u;j1B~(1<;&?HUtNTJVZ0x5nS|@liUT+nosD77nTr4enB;`>y6&p_yxJn!I)z0 z7!X~KBaF=Aywk(CmaC;^6Wle?!R=znOc^~stEqu(*4@R!ZBh5g8I!Lj(AOrx8j`yX zN?$Sc(gb5#QS3K#bmW8cP?@e1247b(B!iq0TM}_f+d05BeMKT+q|1*i!Nz(sei8gF zWsxSuJz?^?DeAdUrT~DvQN+j=UP~VzsTEqlI4lvE+2??`QkEI*V6pIqU(Fjau)mPb zJnjIa|Jom)k>NkF&@{qwyRdFm@mPj9@hxzf$*ehbfF`m+`6(fy&?9v zU0qgFmekw+g*3KylcOd52+pZsnu1H4l>u%>$#XaA^9D7c9J*d=kRi(x-*IzFZl5;K zB}lDd>N|dd)v%|WJv=VR!o{tIX6(JUD9AVKJ-n}bo2`{fSh*!Y5_%|4T7zFm8WnH# zp#~X*aSL424Xup7L)mUR4$xVC@wc=R2F$+5?2dB=`TOV?t$bOP;4am11laXmioQnZ zR%}{dPtVkNBHjEh#Jw3iAn&u4zT-eUeKn5K=J*9B(RK+xhTE0HGJWF66%yk~h4Mx9 z&QOa~pXNYu*y{HgRZ)=*Doh31J4Re5xQ0Bxm_fUv1nDjpcb+g*5W=sN9JgAU(8m- zD4%5(1E2XVf*lUKJ;%CiVoVW?raU>sq^}wc8{x9UGL3tJYv~iQ^W)q~e}^pAjxSc1 zvs9O#54c!#uUQoG?i?_*+V$Z$gYkao);9_z_kax97?Wc z#s&u3qU=~tm|?-c3)a#F+Mv);e0Nj8ugt;(a=asnW9<3%a5i8ufVQuwIn<5UlY|{s zh9-L+iyouGI_1<%-36DdxIm5NGbp-Og2+oPT=Y&^*Q8Ja&{jw8NYp8EG>* zQ987D=joGvtrvk=prIvMOx`>ENR1Aw)y)u_>AOh3v3r2TlMw{F8X^pCr8>=9N7F-^ z+{suN;P6D=5W)ZGj@2!zp^LARK34m!%BWxqVgD2jMRlS(|Ej4zVuN7dxA^GuR20Tj zgiV>-K$wQ$LYcvCO=zj=zJ2pkJYfYndiBHX$Ql7A+LO(z9~Z4YLLP`Lfxf+>iSXhk#2&_xc_V$ zLR;y)p}H}HoosCtsiqc)LjshNDuu|WhscLd3LM3U&+e&Nf-;q&I$zZjHZ{t5y{7`! zF%yfa=XqYO@}CMpbI>xf1E2ix1>*l-*TnO;x~6}D)&G0Pq`dN}5svnOEmAXF6NjS4 zw6I>bU~MYz`qQNJhiP`c4s?!byCsYG63gj;!7R!JYTHJJ`;0KQcIgh2Z}K!N?rScV zm$B+h*AEc}LJ27rw~mX4w~o=L3HHzF=wRlTub1T^g>(fv8iLRR%hq7ZD|FuG6eRTd zn_yszy-nE!VW#Btgv443bfr1iwB*jJP^60Xn?|7E*5cii6fHzkrOuMwClu?yDsnK% z!Gu6flc4q$PKAU7k#3-YHMBBV>;gwft=PUAc#o9{NvzR_W|7JyNp+H@^#^Y{IpG~j8;@g z+k}e+!j^=cNp|D6f@|}%sSU}Cnxx;!vI?+2NP#*d=Yg1OlhnP@%ZN{Rl_dHKL#!$e zpYKg;3S}FJ(CLB*rnqg?J4*+t2f@=FZwflPTzJo0DPnizb01(B57Z*Yn}g0K}kG|tqjZu zX&i3M!n)YT)hGWeCUO(PgxqRZM7mhODQBwoGz`n4Bugyd>`f}h8WuFqCos2C@dqu*I7+RdR&B}ikWSQ z+*zI<2MnwtAZPAmIcpp2`B+6eG7q19b>158fthNX+M7_lU(fkgNKsJatr2X3DOD2Y zVp9|HIwRoW%DW48vNXrsa7W)&_dP{w^84H+JP!(+0yry)N_R|v^kuQ%n*`pvjw7;r z#TK;taF59lWwMUxH6^>d=E}KHx>SirZZ@h%{f=sFVeKe$mRi1JTX08TIfZ`9{QSss zu;prj8_UVM1Cm94Ar$CEb)k)^AS+|9rTu{rqXKh{6t5L>hnZ3%qfKX}Xg$kfaoLai zW|hcOr8RqNUnvS}ng)m7;^{!&YW3ckLzeBAdeU}-{gbY{7TaT%mko@uOtbTiRCAUK z;og@(dzZ$L`+0k*s$V5yxHOHu%jB`*^5^4n##A-m(z7+S)d6~~s%u4{Qq1b>cIvYm zw_`F7zkhIWet4DVGEd)0q!&#Vnkl;)x%jemm4>~V`$q*rL`+^T+IZSY3s*IQUQyzz zSqJ5|jemKA*rdzwU%lbR@0;2gwjSIP`ErGgBnI+5aXN-7n;HHz@@pcz2`|AMDhxH@ zl8?zDK3``RAv^_P+G$u^);lr`kAOPCTqi(MrzY&)fJvdJK_DwE!eE1;;pP+zCa#Jw zJ4m4E!O8wT-1oXPjAr?FbC@O*Jb5lBdN@~~J~3AYL?XQ8djRRkQhFH0v^Au3LX|Mo zS-uS93(izH#Qm&Sztb&(qczufqi`-FC0-?ueP-ZX?lx`AX$EK+O4MHiRW z?$%|%xgLtR$ToOKG_Trrd1Yv(=T~Y0OJw09+?-VwtUXHxg5KRg86NDL9NJ8&O`@l? zK`zU5qkw@R=dZ@-?+~5>KC3=yHr5dg__j?U(7VMlW`N09(bFl4)HR>pSo_}%2SAQ=`qIl5x^qp!Berg$Z-guK=9cG zY==z?&P+zBbWsu~uZf&5L0-wK3mBn9zuD-NlxTN898cqB{=E1ys8oNhNIa&8bdb!4-#7be}* z+jE%Etc!7JeBKvKiuRztAkFJlo!(pJ|t0E zLjn=~Yc<#l1d6PMdUOwD^i;txBGB1Sax_f@m|mvsZ84+f<51|xi*)cp(631lrKhqruw~?&Y%o}mF*^Ib7o*Cen3YmlGMz_D zRrC?x@Fc$cHF>;nO=%?kAF^l>?qk16*sr?*y4Ru! zsKQ}XrbNVZZ;JkKQs72tJU6*$6C;szFuuKjjH~mtQnw3sH{6#4?ap^t9rTT(r0$#u zr|P`CR167hmsPnGLu|^X^1R8pni3v&9)HfJQoAQU?9Mrv1^RF|jE!!o?-7V@$6PY|v)r`sO`1-el8g3U z*4T_;D@Kf~aH|z3M8&j{jj>59mt!_1h$_-WHCl>!UtXSh)3sxTFcCfuZ|+Rm9=MmQo=Lj-r>mx?E#RBk=uqTde)_un+pmJl6^^G}zMTlKnkhs%eauU(Ce_ z7VkcSe?b|eI|r2n2!CC;TKWMa4Y0_v(m_)OkTmSq$T*L)TyW!<&*yIHsQj$8STCByNzh4i)Pqcf2fDyu6ZkL2H6xLT~) zg`!Y|(8wYE)G)2?Vfkh^8nWeuj10Z1BdFqLDd!Q=k0f!|W+U z)n!M_+rNL8QBYAB6&1BJSLF>vkC&p7xam;%f*Wa2t0tOR5C57PFsgpTjYVTe{J*(V@PZCJo<>WWDV1qq~9EIK*LkbM~tpfr41LOlO2`I4hI9 zOeO7lj^iWJFbh)nZOgfLKO%Isyt%;F-8E?*EX`|BJ=|5x=F~|M;K(nY7!LkL-{XzkRezI+Ajt_rM2%HcyU|=!!xl;>AEi z1b{;N0C5=^lcsimDsnm{hzs^1!pXG3U6x(fDq0W}gur=rQGCF4s_p?DlajY?P&E$| z_XnOW-W0qn4xXH|zTA}KRsa=sv-0{?X$ykE(mkNXN|AskW9iu@4ev-~=rofibM*@t zBPiZ$4FG`+>n&L;#;}Q zm!*!htiKz1^XUhgLYMtyj*%tQvqyLB6CEU!B{jz+h2h>I84Jp&HYb1?cjFw(Rh?y# zn4z0(Imr|KuCqKy0o^TPL=fJ} zd0cD7dVhGY$|b>943mf zuSw>+x1*ZhbAv0bPQ!^|wsj~F=Sj^(n<9;7G*XYnnY$?nL~LJ_EhzSwORDKO&acIy?XsQYalgUCLHGsKjS|+p}czC8m?lA?!tC*T|LaV&C2|MN`q1W?SK=2Mq2eKkN-57_RvvXy#0CRGiNwlSYrB z_Yf%E!_id}`pt7~Gr*BoH(@@$FDg*`tz;RGar-VmohChKc(sQ$u@_+Bz!btG z8ccKv<;IFck>fZsnb$bZ1V`gEW>cN_XX}m-b|YojUzZw7(Ec>Gyj3DilayB~xS*~G zTcIV7+K;x1O#Hz@kCf?NlHP`5xai=V$GQ@LxRd@Cr|oFl3tD22BxtL@^C-xeLa@Ql z9Q#g?!;obGd-mR(9m46sS(&nVC-i{QEr$A}Mm3r#!`HY2|C7NgAzc}jV~L^J#4wGQ zJ0Ww?-Yixk5fmcIDGr=(Wcewipc4)M83Y8WdoYp6hNpvcuZ5#i=$dlvQzyV&vBJI< zn9=C6Tzt}Vid+wI8vO7`*cCUgo<$?s7viA@wPGY2Pa~aQx2cT|+^cCdlOIn5XNVUv zk&+$Be>BttB1Q0kK9jHbehlSKm)F?4vji2|t?E!c?pBvRn|e4kdr_Q| z`_2%!T}6s7!ykDO{(KScR@ZR-I)pbt*`!LM}*-OpisZPh$-Jrb=sU zkfr*Yr5-OSqySuP^!|pJsAEe=?K%>$~sA-+K4`iF5JqDf_?47YhFr6Es?>nWCv9$Z_sgpPvC1Z^vs) zN(w0u1&T#jFPzP$`hCvQI!p0=$cY&t7w-LwSKQTD10VmFY&cHi`!V(n_k%Iko0rK+ z?JprJ=-uCNPPRl5NNfp{czOJRjU>mClUQ{b^Eg(=p*G}aZ8$vd*oL&e#k<(=|wV z&AxMlYyal{*T80?hh*#k=iy560Q>%{U87dj*zN``eYDC)pH@yT>szl$^u>CHU)>aL zb>_o+x@5z(EObW}(IvR%B8ta2-S@nqENUa;X@Nuhl_s4PRw#{TFLFh;=?LkX!pBl1 zJfIN-LB$$|nNCe-kM~OI^~)tCz{9Ds^YopP#@sHhU-)g`a-*pC9<@yLx&@*&1_9_K zL7H*Lww1b0?1yzF8?b)vCx=RsnW|T9Quzs$ZasJWgXR_@^#_ZRT=kcLN$NZuRW#n2 z9x|;YmAXp=agqe;)h?tXi%TU&1F35xvR7PbTrt0X>pShq5p`kBmTyAZw=-GDbO6>C zyW`8k(A7B4_J?$IY-VQ9`c(&ixjIoMa27$QG>+jzs*mOpu5gZFf`r)^&dPm}iT2aj zkb+UEtXrWm%@WBb;fs7xWp^|ol3WLfC}P=}RE)x(Ncwdt1-}^peM1E|{`^(1 zr}$y7PJJCwqdx)$@S#A7DyB>XZFqeI&Yg3y9ts8UC0IS_hZ)^Fm_QAio^&nw9 zV^o(0siu9ywmgyUzQ7T7sB-lP2>59|nux#tLx9l#37fFsvxiInjEn#DaerOJ5%^m% z@!t#B>f1dv@Qc`T$ZzIjK#Ny%twR*FdoKUQ=9|;L`4!L z<6M1mc*Uflad2-Ge!o#2CM{Cvt1OT1Jjz^qOBBihJd=nR&IY(fiPD{?5pzXA^~jvF zW@qtcTnI>fj7bu_(F}Q=I=z_CN4w)X9ki?iv-1!Fmi_(Z@o%x|n#N<-=q&sJdt|r> z2L_2*I0yzTXyP+P7?#f26PxYsq`OOG=>{|nCL4<`6uTKUYvu2%bNc3IxxkBq1PL0e z4_9B{G?~yjJ{EC$pH;ODEDfI3ofHP!4wP?f(U-ld$HGIXbxVHSR4zZMEJE_{YJ^kK~_dDatLB`IQU+(LZ5xDKsvUcwGNzc>HNG!;1K7=?Qy%G=z!&)NK1c32PFR1 zt@VOZeZ#`O5~mq6}F+r)S%U(u@a58Mjf9;B{UUPdW@F@_NW=%A_*^%C*f z7V8}u1KN9cl~$p(LRvP9Yg=dvgwcI*Q}gxEh+C9G8%E;WQCvjF*y!crlB-%yIz=|t z4gsGpy-@cPF|crbnq`Sy7dC!e4H z#P?rMg5z(U#J}ex|9;>7YgJcPQylnHw=g$#-^kRA2b8xxnOFQ$q?giQA8To->=_3it)Jz!qpSUH_Wx zw$xX%krtslcKJXV^y}vRbyO7A@=w7$YQv(*RulkBjT^n|9#ZZ5*FOTte+a`y`t!&_ z{{*l7)%fyn>_`6F_~L(&Job;67USdn7VtrTm*leLK`R3aqh-Hm80RM#C0%8V21hx# z)|;VtJKu5$+8Yd|vYe(J}^`_n5hU3XEJp*Oy+O!2Hv4#Mre;zE8EReu#6 za-!#s0c}Beea+A7WH_$TU-8Z7g^dSaW?LXfTlV0PS5zFX`l;XI=-iisS*BeVQJOxd ztgO7ZzZb~+?uPG9S<~PiC~KMh0vSEM$|C4=(`+ijOCQ@ciUoSszE|RGpbVyY0B8GZ z%n@s3rP|XLbG;OY);ZC!{o}d|XG#=IeqLtnKVA2~Zb|=*=l0)WNks)Awm(CY>VH6! z?<_2z&}1EXU0$3FU-MG)AJ}Bq9zv@t0f2PXIIPvY6Io7QGN5>!9PNtPVt8T4*>6)_miLi>+% z9ETJJD>li@l+n8>hgT2M`#G1avBE$t0_(MS)GY)%!n(5%e4YGY0r&gN|JgRcu zPuK^Y){RZjwcFU-GC=OMC3m1yj$*ZDjL&J3#H8U?79%d3f?EzkWvLEntooJX9ucf2P;lr(8~^kbg4qzM9f5vAPCC0n$-rGlQ?>k zWCGD)VlfH`k`|^T&|zxf$Bvx66EU<*lZ@#cn+dt`+Z~z@=*A3P$R{N`2B~MsFH&6! z37(9tnzdw;5-1r-Xq)%Vc1F}oPeT~s{hgo_jOp!-;mV{FOgZ;kxXPT_E2+v5(i^Fl zX6{kYT@k3^^;ZDdiiLP+95oF{squ1JaT}^n1crL5f$II1r52?g+~`%ry}R{3%C@P= zYT?l35*jnj^^Sf0*~XkP6JO1qa)=+s=X3U2O8e#k5H7eDiMsnGJ?~L0w&nXsCE=o- zSwt0dv>Y_1P$Y9mw`ua^c2@&RlJ^Zc=*kE%Tzx^_R$Mwsj~njhFr5QFHO1B2*!hk5yA!m%*Hz}(HVhE-S#7UUcBOb-GA)=Ao06|+ z!#6&LVuDEmV@ZoZXF_;jKBa28YWVGc9;In5NByg-(R3_<2-Pc_;E+@~i+S8Pv2s;zDf4)&q;(+Oq2 zoFJXc?ZeZPl7r0T*b5Zfh8@G|M@4yvY|`Ur>ZIJ#=ms%lu}LJMJs(m12yz5`BlzKh z+)qwW?}rQeY7*3<*H^@0;HNwC_3qrrbkHQ6sFT1tWJ15wD_`uvMQ$qUz7&I5BmE&w zvT&owi}VWhkC3p76D=wGECm+-M3?w0a-sgWsz&a zlb_^09?qpcjaz5iC!7Xt^1S5h#C>miJ>=*YN-{KDFk9Su_imw=JZ;)Ra6^w-KJ|}L zNte3W9s)s;6pv^)GJgmnK0f7zNe@5Pg-wzz`6&SLP%eWbTlAS`dr0vj;~-pSCSHMo z(YwnIBqFIDB>FdL4=5YB$MYT!8(;_2Be;EPEC8HgTHgIrvfm#O)Y>f1Fp3=Yhi?(@SXEJWIOuDg|gNgUo}Us@Rze z2PR8k279FBK8cSG!k#hB7SyIzQ%9TgrF;*h6#qSPefv>Ya!zp1WQ_2&_m0|V*<=*< z7DK6UAvGsDCLydMzlCWO>1{QOh$Revl}ksOl>WOiz>G`sah!a-0Vc(DSM6TE*T>Uj zvRT-TICC{ddU}dz+J`*@ERbpzeoJ^;Z@etg)23$4i;wjyHe+mqApnt|a4=q35UB>Nh7@{_FA>HT5EYCZzC%;mMd(C#G|r=cYCyIix@R$j;D>1hA42VF_c> z{43x(akX$yB9bNRuBDC&Y1|0dTrm7E&iJ`}qke{2W3=<`6 zfj^5MStc0!60A2l>J4T@9vyf=nM!*4lR`+X1GXBFiTL~3CW@MVL85QSUTJa_f4Usz zt*O2blsaQ<$X|K9{^*AjRG8dUMgJ~$g_V(bZlFa4IU>3i4oWrGYEe zHqxD(Iz4Qfl`-97B&FDIbB#maR>^P%F1=pfF}l_T;-Qvi@3+k182b~|60_sqzo#eb@BgP>Jh z)4xWq$*ES)%Tcp9j&@m+pRJmc&moG^?}9>IKpnDGl1!MBkoxcpmOyb=(9h2;Q2^Sm zR>+2(J6vTF3#*b0gj-I}u(D@M;UGF=4QtBJ_>e;&*FF_n%45sa(PnnA)(_QuB^2h@ zR9e!%M>tK)J1XZsBL7}2ufq}BD#L=_cRHfU;1qXXrd_)dh8U5!kPDh|&rwRs+lF|E zO65Z~l+L#7|6a;disA`Eow1uNEUR&%=A+bUX$ot+Um173$aO%0oO*ELCO-_|27NZY zaTG#$^Op@!Cvdm)|j6=vAt_q85XuylL=y0ho5Nz82zmDIc3c z0*7+7O$3=ICf&i-9UM89T3`SzRr)a$U?@lbU|oF9NBp+6D)k}34-r%dVG4AGai!)O z<$N}w(JEfo-@kpu_lAeIM(ZZZB74E)kyu03oVNbLDWUrTaflggVqcw}>s&1OB zuu6kYGd$neLeO#g1~eWZSEu;Qh6IN}#ah`b(R-I=!)lVh8rH((nfgM;IYnmY z^k<^u3`zpZQwMEos}@C6d#&NkSIo>z19tV&L)FbR70#nYX%aU%<2{UOLVmhM}y}l!R zXtMTqjQ3l<>+yT`_{^o{?!xXMaDTAuHw^Y*EN2+w-53X7O>U9A1D8C779Av7qjrYn zzCr=s5zcoyyUE|x)Al=i={`UvuD|!}dG!##D{Jg~4IsaxzNUY`d~ALg@V?VFgnXnb zim+CR75lAGtPNr0*)|B5=z!-{3H$O82yu^Gxwd)hF^IV37B)lV214L(K`rb^PKjWW z?AK={Ejg_lvFt@iAhZEJh^KD>GXGBC7>i6^2nVmVeuANIzJGI z*MHOzg~0OUou6ejEaHDhgZ^4a{Ee-h&*}evGlCQ{{Vy}fbVW_O6@_oy$_=?{iZgQ# z8d;Eax1$M?exl_5eswlHMO~uH9Q15JK2)Q;*uo=23{yN;Bbl4=%7;f(VI z<NjmWXx$cH^W(D}*uLz43@2&F&AGytyec0Z9`vS~`8y^Ak&<)jl ztIet6A+li={UDDMP9R9vJDCeJN;U}uOE)ofK=BS?(VIgru^*4+TVHg5Bs>&(elSE4 zM!+s~Jk0Fc0;j)}QwgO0LSNNtc9VQWsNA($2eFi2i|uU^343SAXw$Iu2@@8>f?}MF zXn)~j7>MHMFSXg*%qHbcdH}AFWj8?L>)Gz1aD(cJMh^6vsKy!Wh8MwUaEIN@Z$EP1 zLH1`jasg8Xnr-B7$R1V1YKZR6L(-Q|@RZ@-${E^oUGQE=xYu&w zngmYJsZ(_2Dbb;K98kJ$~c{rhONvIh@>v~0T!;u3Zr+S|F*i-pv}4NjsT`RU}V1b#L#j}=9Y z+S`_GsP~$v#xQ+NZQW|&8EX3YFq#}Oc1-L%No}?k*Wd(Z&$xfIBE6xuPV1lDxi7^3 zFNORKTb#eKK=e;|xnI>(M?(?${oEiX(dDK^rbSXc>vWjth{-hDQmtBYwr6VUM}c2~ z;MU&w_-(ua$yl2y=4X}=u;CTR&I)Q$5U5k&Fb$UJQ$sEaA@G4Ze+g-#-DJOL2gDv( zKq7yvHeamQx<9PiO>mRC-1dXx08df5Q!HDD!}9UfP&um{}?-`D9g5GU00=TSK791+qP}nwr$(a zO53(=vode4eYn@X_v|yj~+cD{_mF*XfbTmYI&GyWJ+zuSC&5m1W;$i zP8nVN<4#Vb0AOy@UL!+HaD*(+8whOtFm{mM8W%c7ZI&8992PDb@x%-+i7^wk=-v}| zwOl1AuPYZqH)9bP$t?g&6kjK6gO9}$48>*iI4-L%OPogOs7*a@@0X5jywNy?P+DGb zjdD{>tOcOJKGCX~gN^(6>tV}VJ#8tD_Tkf-%j~YDt(bxbNS=~$f08D_D zm{ns4OBcvUUR>RZ4diAi2z^dcTYEmqBpB)1X75kiX`-dWq~VZ(1>z{3pyS=QCEIeH z(spskgdpiNNV3dt_~(Z37mQFI(*ogBcWWlk6so3a+*3#`FU zg_UGnoQ^O|9qmy21SIm{-`zDv{-Q^%$X8IV7g~^~*ILAZ6aiKr7hks<>NCR2mnM|5 z82^oyQ<_{%HJw9CnI?7bzhNo7bg?^SNsJqfxFH!EFPwe=9fZ#rr{&I>j;3mTd_Xt} ze3X=5@GwUWI$E8n4cs1HgzC|x6En=;$iG_uTU_odRq#jxX0?^0|MG(nvsWS*Q&oHw@|-o*G`qUO%jI9Mq%3ZFlJxXoG?xr!@g=% z#!?H|<`@8_P!Efpv9ebk+GHOSIL6Esv(XctdN)r+0PR>ljn+?g-WE+q;l>Gi`!^y) zciFCnt9*aUEz;msAVQG;wW%w{wCM|VcggO%tFrE`V18=MpUhyK8!?|y6Q&O^o};E5 zFre{K3!Qo7XbpN|u`!uj24J4$8_19NRRVxKh!vKTy3|N^^z2n{B3pH#lG-w#s$G_s zD*tV>7p_m)pB5eCZz7yEJ2DX3vNtBsKD|1?>f$$RW~m>R0f}wZ#k)4qRiD(lop%sd ziS~!o6>lNG>wxcac?H~luq`;*J96`oXSLgObEn51!=8zG@y<0QsQ+gF8Wj)^2x<)W z+1m)e7NJ zd#m*iotI*0)(zGIVZPf&5$2;Fomo|a0MZCy1A_PaMKK@e$Jr33#7qF5gmO{Pip1Ht z_IN7i)Mhkx6#d$5lC?7*BI%v$-4>mDw}^tCcsb_&++%E3`@^Nd`pK%35YBv?kYmv0 zmK}YY{X}Gg(2FY4Eb?l;1Jv@}T#Rn=d8jH;36myjZU}Q)y@8>aTLg-)EDrI7Q$`8qimKe&*EsTy zk%A=M*4%2RDF>0Q`zw$Ko)MzBoC8#S5K-BWlY=YWO2707cJtO!2br)#3Gk#!2}q#K z)`EjamAB;#l`0RfCiSat{!+#0U>rgv#cEU6h6H_G4yXRZF0v`*Z*`qcvvh01y>-L6 zvx}IcPjD--QJ5xE4*^qSq&b=MapIR0#G|bE{BCwo-`_<=94GcyTFp}g<1Y$r#+THl zO9i>b?I|S>nTo1_2VZp0d!7;pj2R+7waMF(Ix66te!W*$Ipy`JWulS&w&{eYra<9uU+0|G-lk8JR!NYIb`Ec%Xz+xnuP=jkt z0mg2q2K-qG&{N@SQqzA9KBB6W(ppY!tMuw$D1s#Gs1%K_qZ|jD!r$`j)hr&vWsvk5 z?v5pto#kj8RjmS&@x+hLXEjahS+&^vo_7_JgV{hV+mN$Hb}>N4nL&6%OWZ>4cji0S zh@$}XWKa%@j@fWtR3buKRbq!WOh1n;Ijsv)17uF0s&*i|s6d)Sl7iI#zq0aARUW=bN0Y*sKUZoaFR#)%~&p?Vt z(DXI}6+WoN91(@}vs%CS6l7}2cC5f&0GWOg?fe?@->h0BP+eiDN|S5G#GO}(u(pHe zzcM1Giy8WL+H7<5wZ3b(A@0#42euXMydlQu5?64|k8?Eych#F=OJm(<-5$loXlxrh z@x>~91BE@{!0L;76AH&liiC;KaFd!E(w~nm6Uxjfrk;bq<+|pa*+HB1AQ|9CiUc&n zn>QPRQRjlhnUmgrGA!s}QQa^}J-h!Bd1qTHb}Y}*g6n+rm{ zL21$ozY|{@YFUX(9bAt8$HT8zyEL^+)r{OlRQY0zdfr666dTcmIfEbE8Ql5aj+uK% z?S^DJ!d%vpE5_v-!PT9FpZy5NDECnleBAR_g3E{Cj$-lc`G|@8-xFMl??zvp%br9`xzN`s{1LB!|tbhE?d zTI0*6b5|tCdx!5wm3~HK%bpeeRj7>!Wq{4c#}z#}y2A+!Y8X#g3U9Z#SXnB{7mcGx^rcGq}Vnd6k=d z_a32}aCe-Z(^axh#jtUQ4qaz(+0YYfn{<%H$ntj!p=SnYPk-We(hV2*cFJx)toSV} zPflzdI?usYjOthn(MKUB)(hGA3pxvrNxygRLeIfg&C7WW(T8xZAS_NeSfdkgFet#* z?>yhLD71hrKT&*4H1N_oSJC_OI@<~sTFm>aSz&e%XsPuQ;D^%cpnY$AYed;b+uvwm zLru7oaHf;vl?62=O)PNBdtP<|u&@XbLBYi!Bsa*e^?4SeT;=YFc3cOSa|X9lT91XM6|?tvMgF=-}o6knIn(O9^P$Gm#OgMZ88Tgt@^_6~R;2Wxe_Wun>&L2`PN| zqOu&&{3AUAx)D^Y^8=Ded_uXQM(Yk@>BCc%ym%r zg9z!pgcy7n^|i#z{3SU#iu(hh;EIybd>9x@`gBg;kssk}^R!Du%fpQ43ABWQZ9gCc z4f5EE4PKFlWv+?5!a7b%_&$2Y)EwU`(}B-7I(?U=@lcCxgPPy9t0q1_nx|=-_Ucpi z^R}PeP1k}Og$OIeWYzneAUDtFx-uk4&Okw%fezoA(}HK$|_x|fIP3LZuwO5By?1tH!RW$ z*Qh3d$HaLerPP6bSRB42L?B0HdV5I9*(XXp)|(YBpD2!GBTzgNccTH(gQcE`AXrqS zwNrnJED38wuH9>%jBWy)L#ymats|AdC_Ssvnyl2`Sf}ptn1&z+>G1?7yphAPLQjWdp~5jC@C?8 z5iHSnjr4)-6MIwWUveV??9-P+^dZ!%bIStkGt5Kyq0rlNV>4H>^GHRyYX&?$6D9yA zM;N9rln53Apv8)e7bY*3NXCzH7%z)NCo^$O16hhcp@*j=7(`0KjTS$^FQgbQ6s}5H zp6bx#zqwM73yVs2!rwxeOqws;iWIp+?pF*D4rI}#h%k;+m)XP}Tw%tP>a-d=03lR~ zWFq$ME?q&1HZ@fPN2JdF3Eb|E-&7~ah(Wj46ew)vReZ6uTwb@9`RhbIJ=NlmA@o$- zKwG#f)ftjzz&R2ST%sTsczvGoODRgYEc8lI5b3X}N$j(XMmKHtd67XJ7z<$&(WpU2 zbrKFpYHYJ9H8&-OHt7?QG8hD4jZIuzy#L2jP^LZ!iNS-p%21S9anpz<#YG1sHb0^Sv1XD7*_pd#_B~OLchT5j3#R^1G;WBJ z`vG?$OE_#H%fjGdD+E(A#vY`)G5sV6zygergv z67~X;xfC!=ZiV&+%IOTPc@&VJD$cLd+;j4xO^gRR*Cbh)>5yqM6n2t5;nSbcQI3*S zBueg+p65Fd+dC~JUL@~KPPUCfg3=CDx1Y9@)#>Sv%!ZdRlvS1&-p1{?sly-hN`VMV zAnmU;5Y3Zuz(t(rNfkfl>L!cB=e2lO?1vfaiR3Fpu!vO}*Jk{eVo(JN+1*C2mY9o@4QD{aLi0mz&r2eKnSmN=oUSs*{)BYyf{7fK;^cBSb+t`k_=6A3PMW4vYy6+QJ}- z366;9^*NyN&EGJOb$(N7qyLnz;78C3|JI>YcGOcn@jJAy*OO#VBAz?!1DKv?RwGt2 z7#uaQEf_PbIOtHXl$kMXW+62uWhKHOE0Y?*T4fdyHGYkAZ?0=px?F6uXiXoeZ4I(} zbSv#P#|*eNv{}LUSri=xT5>pymE694^t#a*Sx>0fOb24D#z$;Flx!{evz!4?5bFRN zIu940F)Yq-4!hJ7CtFP>TEM@nKr!ebC>|SA)V@rlCqd(0r`L#<=B4`3V$wBAGZjni zvy~?#)jeEF2VZVwTBjv|gMMYOASzr(VXP!cGhr^7V(24 z#$=9SxxjF%5u|lsBwKH-7a359z|8u)3~0ukWHi-XOt$x3lD2Y7cMVkGXQK`?dJ`yh zh#_uCfXn^K)Tq1LU`OfvlY6K5;)J4{2jKlf=%MA8$AmU&`>C3^57!CsApq`E9u!2B z_IhIA4O=)1Yegot2!c=x-jTf`TLLL}7(&iLe7x<;n5K~!t5>}Qchup2?3?RATtg~G~0+c*(lRRK2(;(3ElXdrc6NV=}3IJ9dnj*FuUXrc^bR$Xr?v z$9!U}HdNkNLOYp$yhON3I;cHbOvYk^kv>$GxemeUBx?ZIx{85ATee}@Lu+hGA`LW{*mXuvG&s zEaMm_r@0Bez%nCfoD#N)mKHW}m6&5jLze^-C<&2Mue9l1`_yXft!X*Av8cl{eiJ1_PC-VySWhRlXe#uq%3ic7NR};=|-P^<#KLZhs5Zv;pEP zg5k#aH+VrYDx6+hV5oVlF0%#?c!K`G)d&JUc}$=Ixz5lNH2jF>bpF7sv)@UK2~yPs zaroWbl5I!!>4P_l(fb#l#PtW6gi~1kXV@~rE~`L`xLGmjZ*5fJjnqkITI9F-bGf0$ zD7!>RiGvTE!4(R)Eg9DXHkeL-k{%6AT}i3>&E{|zUR5+2=01$(G4$4C`KQ_6v;tD# zTe^&Skus`@W0-OT4G^wo#WZyc?5moLjqJSGiXv$}miLkb<9bh&T$|WJ4mDHa?-e1+ z@Sgvex&uwJ&>3fc7KhXsLv3a6tI|d%FIZT}+?!QCz-3y%$~IKrbrLRZ0}T>j4+Rr4 zW7~SfuQ0Cl^G5bB^8`1KQHfa=%{sdi)6T(KhGiv~U}yC1mZ4&^dY+puz=@%e)jW zyN{ZLUOV09j80h2JzjhZP>rsctZJQj?jx!&EFgS4$Y&kJ7V-%*mL%Q z@{;eC>o`*U!JM4sU3R-4l>Mer*4bP@4bULdm zj5+@KKz|y%Xn|HB(ki=LRy0w&T&Yu{dQaN?`hzk0pshQ}tTOQViG!bSHL!CkCypx2 zEdxV+6S)n?_1jmgn++YG?>#-*fT6oV{xY{|{@ep;=?b=hVKC|3^0YC)z&QqSJYw1& z6AK7F@({^&eHIn;*`z0Zs1QrBM@c1~x>;q=#odZG$l13K7TMPHk5Q2}MxG=;5f%!K zz)AGX2lGkAPn-g+k)ZV2#4N_8JDLdyC5s+Bg=5Y%+EJRaG#L$2D7|!+!>h^i-Mi7W zI3^Dcn3ij)VqDbwj5eD$&XNOH++@{f!`)oN5K;JLEr&Hl-(7YtJ8j^8{BlZ zquI7V^P^iF6b#t2U#;q@q&o8%;+RzrU6r93r<52LzjA3It#}EcZ%eddOJ16Gs4vtO zh*iki&sP&PelS|NH66jQk-F-kGHe9WRI9U`up`zF?o*s5g<4!#f)wvhdG{i(HsmcU zA-RvjTkwx7S9)!Sq|KYSvcAkYkIoMI_kwvfVcMlwk?prZK%*n;MKTmIBq`nES&zYy zH^(N_RrURj4#&|ge*tSzJkTqvm5aSCfB+RjZlM!}pB3bV8d5E!C@9oNs$H(Wmk8*Up0}iMg?G_VrqS0L)3GS|3f251Y##c;s7PegBLjxa zv@H#TVC+e*OwuIDJWi4KHSoL$_<#^yk;F4ORc4!TY<$z+6u8fNw10|CM+MPcBgi~-0iB(vpf{lj^Bi#F2eOgDy5AF?GZh459P2|lr zAgCS9+pO~&I@=59LZsE$=slOZL+ljJQYw*jnltv}C59Z{OQZG5l>iyTrf_d3N)e%x z?qE`*tOtsK|DJ;}Vt$3+K!nvE?376T^CmiaM&*|I%`R+UgXm2C5I4W|IP5Z4nN3vp zISgio_3S54De#6m;0wyn?P^HQCzKmkH^&uwWZHoQ3 zu)h71!fQBiY~n-y6TJJ!xO%|CBizgA9X#S%ULF|ic^O}#vr7e6X(S!%=KPD>L&j;X zM6lbyYBoLukl5dZc`XP_B!P@V_QWTB^QnC6WCV>f)E0~pu$%<)wyvQs|L6e1eUCl* z0R8yU_Kn~AFGL+ATO)hIzc&RHj10crB>obT>FNK+j6s#c zr8(la+$3SZGQL{MYVk#_Kv}AJ(2CdR#ZQ)hkhd{jv^OVV)r{VV;g_?Cgck*H#0f0U zZhyfCS$_` zc_V+k;m8@#=r^n)^kiD~MQmBX-mPgun_Tf+4LwiqL|Hcete?AVMByM)$(R>7CqiA* zA@PrLZQT>~ujzRW(AsCjbYzJ!D;-@^R80VaD80J?i1=07FdU@&i71X+6&)tHt|aU> z(7g^iaj&22+Fx#A@DqnW?*fpWk?+r!7k6k5AOw`_&K|Isl34Ya6KchKjia-=4pk zB?Z=SA^hBm;G1JPFDwbt%$6Iqa=f#`;0`F}%+kA!LG1nWUt9?N{9{|k?bp_i&PB9P z=RP8@UE_0#0ad3fP!$X_f6}t5h+O*9{!r5~MpuHCKfvAV*2d<=C>E!riv>!n#J&uZ zvCC{ZteKcmaoGIMTm&@CYyvdYDGD>Hj~I#jBl?8c^eQQ&Q_D-TXovm{9g1}ahmz<5 zA{F5NBd3m-s?jK+Pjt*wZxd(W$|f{Y5?5oU;*rU8sxDT5p4qEbe>@j{uPV-f7Ui0@ zg53QNU2oM2cP;eybZppnQ2tjy{$1lF@UH_>R?oq~#m3(7pDK2L6FW7jn7RH^LFO_T z$2Oy{YakgrD>Ne?cSbUa*&tM{Pk`VE3zJ7BNu*G# z|B{Cr@`VjxWq>uIBi!c(#@?VAxK^AAbl|SWhU*W|cNK+#jo8)No9Qs(#NX$FD7Tx6 zcn*K{(s%7a!&Z_F`fJb?7N;-7h_hH1m^)t=otyl}RK%_UJ$JP(^i5C}x{fT|_vmvq&FD+LKZvK0>{oeY4cQ9*luhq) z&}WGuXO%8TH{N~*eRq*AYPMW0;&$>a7W#J5Z6%P6`nd7*N?KrGJ)#`=_*-Ni3V{KP zd9<0vWLaSrUDlR2_^xwTj|S{1S362Q!>DWvm+q-Rd$N?;oqA??d9-^MpJDHU%q!F~2Z>m6Et16nv zrcT>*#-c}*H^CA@A>smArh z*H2HMZUCurk;QPTDmkMZA3U$@IG)Yszc|;HT?tvoiW8S;Oe8=zP8V~6^TXLDFC@(JY4MnSc_Lg!vb!jB6{$sh7O+genUI@ z;-o_CFh!S%Gt58wB!YiV4jvsgNyZ*pTg1gH=G>K8H1(8+95z%Xlb7(f{ePaO)qFrh zzJ-lQm1MPYh;LwzoDBU`K&v-ScQAHBc3TA&49<6ff9A$X0_Vk@E6(^G-lFzzSA zU}aLR+%o03v$?w@gmS~}tF|}IAy}mk zum}BpspH0(KL&J~N_99k^6A~w;P-LHh99JA;<;0#1JmbYw0AwE&Tc2JE1m@|3?Bt~aqG#FGpyF(h z{dOxD7rDWTmx}P7u#tsHey0squHSQdU|l{rLbN1G2HZ;xYz&8&2;yIO!9MjqtwkoH zeg3!SaW;^~U|WJ5;V+Uzfo*LSllgAR1*FlVMK@;d6}V?b(|aew=H#@iK~Fu3EUQt9L+*hf%&`lR8L4ivYe+sDIQN>nbDeRw*wb&LHTXfd`Umv|gI}J9>s#OW zKLq0&+jqL?&?jZ;?)4BKp=N1-)%2_wG#+@g%j;aHmkmy@qcP2Q2^)XpzUa_=!9tKp z*WO4gsyqx6DZX!I6=^ zU;|$CVo>PPLniVy;p#K>59GirkbF@4VbY9zHDNuTwW`<3ph4@xt(toM-2vkC4BV1T zWcKcYP9i<-q*qnZaRHwLPF&=Qxue(gBMAwISL8m(n}DP~Y+~!M`>nsA5A6R@HC0s01$Kw8uyP^~r9gNg8Gqny$k1xxN$6j|nE5O##e^MyMqfQPJueq1??*GLAX z9x&o&#*a2oq}a7~L|M2##;%iqsYaM`b@p$_Fx}olpmm#&Uxlvu(E(~h<(s8z8W93-4gSLTmO!SmjsUWis=#&)G6ZSaG@S#r{vy)? zwW|H9hw2DMVCBF3U@m)v9B~C1dP-M%<2Zb)}?h6ZV9Q-PGt=WiS2WH*taXZC8Tc!168pLo_vJ+ z40ylAnA&yX#7)}eE5m@5_;nllYh$=H&+i0ZVJr*@H-Bg*=U9cs2sIymc;4 z7h+`28Er#FIM63SCjPiuzt;9iDf`^Wr~)@cIv>ZR$UO?&0m7^C%IU~DJhRKN0Tbo< zRTptXV54!E;Im}MT(YmH@|@t<=db!jt^exl%J*DfILd!dr2gLeG%sc8Gw z>XYvOgxcdrr8bVg=1KeFF`0TFKL7QjaYr%$5E=%2A#(S31IX5jM`r^Vqr1Y>gz11G zuU1kpy(!`foqie_@giV^eO^DjU;ODx^7*N)WbOs~Q||s|3?-H{SZ0m*zVtM9H0E_P zkFz9{ZF@A++%D23Kps29wv*tv?>@xCW)6)dp3s1cYoLMB|k`pvV?c`4Rzv;lyzAgYt zv}1Jed2@X|sQD3_Z-{H76nzoun|s;q-2x~^7NM(ulI?Ztq9(n~!HNtv^i(o)|Dzl= z&$_Fx|1E@;{wERn-}7S5f4!U%LK6R!68}>Zds1ap1b-mI6PT++<|z|n&0absh5Mn)#_L39ZvI`0 zAIu_o-eD~y?e%ENrDeNoyUWG<>n}>O_BLsMJu%)5+1lx zYj01K7}~H@m~zbhGB|t!zIBAF_;;xgK2Lllj02%K_f|>|UUHx@G&E3nVuAN~S`FNT zc34FY+h>C1hO4o(ivEP|FD@1yR+2crR?8pHo<#(hLXmGpfu<;4Yd3?dexyqlErm~Z z(ByS_l?7jkQw0w4MJ(zUkzcS?Jw_>?g)FavU{xS41SmgR(Zr?PF|0Fd7|VJCYXFt( zCzc;+P8Gk2^awUtbW^g!T)a%AACTulmse!Mhq#=N5|#0Q_udvARAVJbaa5YBOZ3(H zC0fEeJW7xabp8Mq3xdjsa%?&)Cjrsg)aJ)FCq9*AXJ1T( zR&*FTcE(C{0ajy}D|_VZI-nnmgS*r?OD z17ADw7D4-HPdo0GTpRJWJ(A_7ICB0Z$qq9Me+xlY5CjV2p3+<%MblWWFOMk)N!?-R z+3Haa1`VVEB;Oprx77AAIi8y>uYdylfI>@|SR>P;H!-34a*LU5Ve>(2`Jw z^9oMLaljIQt%CZQjL+rfnxhzL0%XiNe@((y~8CyC$y)O86D# z$x>Z|#U7qR%bW#I{52`u?fnhkxvp4r%|u7C{yMT#)hTz=DIwLKoS0$^b6v72;$muU z%e3Bt9ypd$9>TF!yv$S>DJ7rD`Efdm!i0johq%Y`CB~LtAoo@oDDc3tBK}nZK>orj zK!K`dbpuzFrTl!7)0m#kT|)z%*S~$BE*P}@{3Ge%>a6;XI?p`6j6CX$aX@H+llQWv zu?s-Ey(0|W)GxCCp?^)hCtoCN3j{~bgF%1xC(ll0tNXWo3=ScD}RVeMir&y<5lCr?$ zemTBmo;}kOBADu3*ttnR^m}j6R~5@I2xy5Fy4`nRr-)Km@2Ga7i-~S#AP#SVsvd$U zEtalNM(1r<>Rzt8z@adq3oBD`101>Md4ee8FMRB`RXV?pCK8JWy@i>smg0y#m+BD-qcot*jxwy(^autnoIEWCxeX4Xly&bNujMsF_&Q z7@X9`d|kpeoM4j&i$Cq(akZ!%m5S{`_5T3Ebkw38kziJApm%3(8P}g7cnXqph2 z8hS)xdX{1P*-7U4s%D$V8vu=8Qv}eRDbNuJu9}Yve@@WpA+HAokk&~Z=FHJiH60$h z0AuLDQ8UC39IGjHfwo95J#Pq6+B_PPXIvI%yN+Akc*ZxozN;&Ts?e+CsAm01(*koTQZ+dv&B7Z_kNoibfdSETKbo)LKZn;Ks*~d z#Fq}X&`|td;ap$}BD0R|L4o5Z!8%~QJ5=Kip1`~v(IkZ4<*0ppwFn5ttYI#?6oxSr z=MW-v14y>Mbo;e=D$5NNBnV2~Z(4WcE~tK^YBe>N6B-w2N&2d1`utMbkhU{wbi#3Fg!Qm`^%aH?^=3vnh1=p&DYu%x^|8vEuP#0SfQ!yKJM zqm8-1dA7rNld8%gg%BDqS?-sC!PevP80-9u z?l?`w!GzBtqe8f#G13Om}9L7JBc6QygTm5I30J0bB(iFg)HMAnO_Od4HQci)CtG# zO1VLn7M(fDPu}QKl>z2MFJSnbkO5DXYh5C0)i5YbFO+))VPysU9nfP6^7+ht8fXBy`e@K=ok!5a8+AS^_A ztvOf)!p9{bm5mdCB65(R5h*q`YcgqBn@$ox`kjgn zy%FB%x%a$zISd{}Z*~HQ$tTw{qS;iaf-l>_ymrGFdb>!i-Mte{?I>Kwf#wkP#w#wF znxT+y5fjv0ijwJMGTt__3fxR3yey*f){1tk1&S3CzXj*#3h1CMh3A=clGMuHt!do# z3$AnVIzl4Hc8*z3lKK1u;`(?litL_;GzwLPx%hV{6#1ys0+%?|;d+-YV|w{f5Jtm+ z!0v=FTo}SUP5iTYOisdeIrUNpCx9DgbBHTkRraK^lq;J*?~up<4kd+Fadp3?62!t| z7-kJHqVoyulojnCp&OvKBiK>!w*GhVK~pAoFpjy8(N?j zYm;V>l+DKzzEJy$7qCZd)kpD4N!$N;fd{~cspfoV|IXi$@n2Q(zhCB9|5s5V@APdd zX=U`cAV`Y)uOO&;vqTQF6$yj36WL(YObVQPKXq&*=xC_N;r>Jhk8AylwQuL#Y!)Q` zR}f^nZ68mhxqZ2M0oFzpVNy=S7yu~Ig_#Eq+<(Df;9kz)r{e-_lD zJAeAXLq!B!ZL`#g(^$+(Fuauk3Pmg}#O|>gfsV|8t}I5O){3Yb#TKM8EONR*AooeY80ni7&OA*}QX^w$-BKm$-J_IuSS{%O_!&U0k` z*Q@@Y7e1NqzT97@_rJ5={+(=EoVc}uLMj^`Ug~<<+$hloK}76NhsP%t7+Wece<_=6 z>5_4|G$M1$^Wqy8m>V{$@(;M_0)!R8i@o#F#cTJqrt#5n4bAqCgE|yGsIwmcq9O1? z!s%&01LI)uDK^`18*z<`C~)||9PF8J2KeD3pa?c7*Q0l_6`3Xa?4!H{SfMI3+>1&r z-nyrl*2ye{I;>Ac*lXH~XIv-8EUr;aR2oZC>VSh|wUA+4toFieuj6Ce1{Z^Celb6p^jko@%D*?XsWJQ~uFNqiOB#mFlv- zyC*M5az^d{U~)y%H`;Y)yKIf#K@Lt+G$0SIYI=n<7omx&7|`lAql!L9 z(?5|YvjG!GKPXr#S!g*&syA51(&A(}U`0rI%S;%65UwrMMUO#-(iiQe-D7O5XwmFN zx}rVsz&)?l8{>BldZ}RQqRskMsS8{||LE@z>N-N}u_!P^>v$XQYE=jro6GFnY5-+H z_UL1Mf_rPdyxH8BP{y-w^Ci&RHZ@%2(Apl-@$h5t#Ow}_`dGB06_d#8o$nf2cr<#} zItAbJ0ZS^!zlg!)hAuOgCX3DQD=a zspM#8>F{scp-LUxRa3?3Glp~S7grREnti9o1#2B+JXd_nN^+KJ20>8Vg=oD#+qvlj zp$yt&DT9q>2ICA$`%fyklXzaTAb)Tz+jdcUam3$nYm7xjzohaSr8LxYDIEQhiT_+@ zvCL)6PM8wzU(b8ETy;EWepNni+`kU0@Z4hhDyK2t;##A@+Z$e3=@9>`KSl*^rJ$5wE3lUy+9&1y~O*` z{Cbg~>6Q=Z>C^f3@(VHJHr%g=>Ba@*b8CRvb8*1=BVg|)2Bh0qKL!8Q$+JJghyG?- z`y;~7hp7(r%Xnv7ig7Pk|32Q&rW|LR{sxEmX`cuBBP9&w@zVwo^v3G(CEEQX2H>@a zxI5yD;ieq5CQX$lHxxfu(N8x%k(W!nb zR$YKO^<)sbX5p6VQG2y?t0naW9)(IaYX3YgcnTZhwk~1rePNJ3>DN5td>8RW{;~P85u9!J7G|-@b z*HH0~GcniGpsDx_TDWAiuz%dGC~K;yG>{15sq29_VP?I7GA(@?g!2=0c0)m(;x96i zsvA`kd}|H64i@fgI85u-o&v%kTk@@RyoTDSMDl{$vPP=X)}Da&%WllN;tNxJX-+Qa zJdysCzFt%Om5L>(HAD8*W(49#U@~xKDOKl^q{f2%S<#hd`I3aNQ9h2iLV0z}D>90B zY2izXUa)20Mg1;c+J|FCWCSQ71?Dm_!P=6U>iZCl=(ZJGGoeKMItzSE3mNG`60*6@aQj2{{cIbm;7z_6tQf+f{9Ewn>@!hi=HBSJ`gwEn zU}p7{8ejoyL`(}(BZ98hQiN;L(;(o+)r8O}HE|mbP4@H1AcZn%YkP^-7D+{at%nHb zb!lOd`DUd7zD_-A*=?Ybu|Cbv9nKeXp~<{XX}3e(kx5GpxfTpCvQFSjCOCVE>o7ut zM%7x*KQMtud2Vg9esZXKJ1fc|Ntlh6z%uAkGfS~H!$kp&UbQ_*f}-1m84Lw6>hOoM z_F-j(m6K~BN&vr(q_J3G+N(JoH85v30Zs6mjdH}+@5y}Q>SGNzaMs*u9+*)+`6CC~ z>Q;uuIXGvhJxRL~DbvroIgulT6&uHar6Y@nhrwyyK*$@&;p?uO_n=aU4kz_VP=%>j zCP^Zw9+L8+`BEh8q}cUKlG=tKj%q(F8yl;r9YkuuQi3Q80cn=^9UV&v*E7V6sti3m zEob&-5yvyd{BNGYa>rhP)!>5kVv6bY+>a+A*p=yPCOwWOvz3u&Tg7+Bjfhlp<_huz zhmqIKWr+J#fHER7^Uqp0pU2YF!ofgBYrG_AP%#>9qR*&e*+O(yjw4WN%6e({ zEtCn~Lgh+aFtqb9#B-yePVD91{I%6Fr=GRregW51&|Uidi1h@#`wQ-eICCRwI|15>!%x;O~xttYKb_jhUn9n+l08Fs&wySx&-IAmqetmkZ zH)m`K^3zT^*W0OSsk?dv_Vos7Yuw*v@G(+mYP447D&amj@(rFkvAkipV|&=+l64&1hg0u;nCuQsVLwpw;IuKGAO(3&zJ-mL z3Y+l?iCPXL8Nx%+R`-=8Uq-v8`HMN5A`4;R>C=(&h&$6WwZEaLt)2Gx%2QOovom=$ zbNA7%7cI@PaU{BJ*)0W&LJ83%^-(=8-;OoIA|e){a`L?N#F)2^N}1BZ$%0auZV@^C zIEwMiQNq=gsgdUrpj`j&DX;g8mP4&i-!tSM6d|(VY4M%-a`MIx{)5QlUr4HF{8KYXve@kfe#tsb*qF*!%@AG9NY> z9D7Wd;ko2->IA)a{aOO{I^G5ov#(L)B3is6e1#<2)q+k;tV0|ei7lNwcUk`{tPd$ zpSL{QPV(7GjoZ7_5#fwv!3>+LmZReNZ43V6=WbB_F`zfN3q9_iT!A5Yu7L%(+kGxZ zx*&H@pvYkNYDFX&v|}YS4L{%`Z!d#_?5gE6Vsw)}k1_-X!N4oigO1g)qX4NfxFvV+ zx8*+FSQRSDxYPsHjeeRB-P%)XFd zVmVQroUk)1;i^bzG^nptHZ>AemVAP?68) zQVVN-WSP`^A1N0fYcc@gXvpu<ob^0)TXi+xs#$aX#u!ms2OBaxk9J(} zpX}2;A@HB{+-IFuuP?KO0pXqg@$m1c9^DDoZ~oWsKXM;Jyx>36nepBw(77HH&>c@X z>K6-Ntm)WjXA1L=A2h6<5*8X~zVFP1|IF59lZ(imayccS*_##6A1Dj}c5u6YFezz} z{sx5bw~_xOe=yrJm1l)JZShBp`)Wcnf+1;6<9JGx*>#uVvA-?F z{sZ5y@p4FEA&uto)Pn1Gv=7JZuYA(dnoLzi-mn+$_4YnC>(7xs*7(zk&I4^r_zMZ^ zgsI)vhpZ~82Ld<7+PRJoYKtE6^_^MIMX$YsDpC=N$D4eMV-0Ih0ssCzm-H^Qe7PX4 z=A{0pq%y0V!=2oPHXHDA^b+=`4hQ8Chbfg4{s?ojqqiUaNawwzTCg**)&XOM+p<*a z7ITH7hMcbKm5zYePV~4IQgEf^3lF?OvF=aUN7!V%4=~@KH2P{rk=&Jn-JZKYsV|Z1 z#W4s^tSMg8>{)_{VRL1z72hpKA|hw~wlxk0Un4{O3KKKMJoMKHFPxz>5sp&fp0Xy@ zA|{=B(x9t=bu65?^QXywQdi@0TR$pYaoR^K9GJil)5I(5fG`*e^l#x=djqA(tsKv? zFh}T*%=5L>XNyO2BP>1NF~xmh<#_3%XE+eS0N_1`6yUB$tk*(X8Zm^RCPAvqtv}5^ zqS1e)L7lJY5N{=6a2|Re;Vk;qOz)YS(4Y}QGkDf-2w36p$81Kr4$WCUf?CmHjGctmBD z<_c0W0;YIu$WPD2_82L-f3@ZzcmR`dgo1TM=Y(l`PYa^h8ME}kEojE*3HQ2~Z^j^u zBJqaXqf^&0H^rr^ir{h<%XxE1f!ln6R=jRMog5y-8<6!nAQ^b)9>BlF|5N7ut}A8Y zLv;#;o0z|JCE)$P^d)(9`zzM)KYqAU{p(2Y-^uI$%)ag4$m{vuUL;slrrnVc{)C zREgxn?$(y`!YJCU>3&pnVDKl7@ByzA2)jL4TKHqx#$SoW#a=ht9y@*>0WaP6Hz#=z ziV?liZCDg!ua44vXU5n9iorZiKLb0t?(yT>HTwL3`6+irkfj}!ha%oyk-pjuf}IPE8Mk=g8FI?Nb^oJS%CVA_n{!GA2gA@ z;^v_`s`s6c)eK{R`YH|lyfp(dK)Ou@WtfI~rM7TNo_JydGWe-z1G2N5UmkNO=Nl9A zU{^Qn1 zsUrdlmwRrQf3A^G5iO7x`Tl30N(4_mtpsb~e_YcFTrCgVYB|~S+Q3hb5j8S*L8((*c@n+jz&umUN^(|ZPG(-ticBcI ztJ!c58&iqlSPD#cA3H6RXrw0z%dN=P)eKUOM0@x@KFD_m-U4TBW7?d18YqJz=9@RB zqSVmRwClC7+ViqTV~Pd2hPTHJ*YOg{=YovraVVUOnB0ZdB4zj-k$FhP%2N%~#FKfB zIGNw_H0Z(m%uv%rW?M-gs;W#L!&rvH; z)0M{B&v}ziA2v0Dd8*cdkt9!J#k~j#%UsXy<6OF|)Doo=1o7{^Xx17t#a>hy-Nq-D zP1qkVMuIu1HeO(Mp6#)pF1DFUWQ{|?p)N@^yfnXQ@u)5#T1=Irtg-kofge_KLZyyP zoj;#+LYVIUF37oD?UK=1DwDpH%F>+y7XS8l(&sw5s0zu z&5QSd=uz?O@sn6=zcRGyYTgT&F5A1;?wCAnE{Yz@uOQn>#6L_|9P;SBb^5D-a(8>`RmWGpDAA(ueWT_`sJwVYZmOgL{5}F)&oDqQpNFe#nL^tIQv(cIfVyk3ur51u}}Njj{@jXTX7xYQp( zh1VU~;#fqNS&=?8tLtfpKiFcK?ZrA{;q$obCtgXOA6T{%@5sMM59r{(G6TMXKNm?_ z!-xynt#x2Ry3BOVL%x=CYrpd1mnBsY>W9Qrji723Lg-sLT&bw>mfB^UYpB-oZr z+rG*?w``|;XS!CW)&~eOFeZ4n!ArHSc(t;!q^X0Z?dMySJH)1ilho1*iKYtRo7_9T zT%f7-x;=x~57?t~PI9GJnMEXIFhVMDj)BP1=WEJAwnp=?bUeb5l__jV<%Sibwgrk4 zS=_#G9xih#S|qhU*#u@=On_kt-amkH4*o2B&^(YEJXuWYzBGcC&>q9Mqou8pIZR zU&scA-D0&VNV@y%QEITTR1V~OOtS>#b=-3}EzGn<*~?u<+GT(&+J)5@CfW-kH*lMx zgr4>=2&{fb-UMq4E()AD=!iznA2qAZ4dL0XYKI=vm=Y(+YcQ>N4YDs3*mZ`>(^k;}t6ES8r%qQEW8#1GkhFVt;_JMNw0bxa6gnm<` zMTEgb;*a7T6|dDK;>nTgg)^lWy61Y+@3XMXCB+$E+4;jsxN^TP%ccT1Vv#34d0Po^ zR7#?$DEAjBHO_eNC<}?!o7-f}*%*ksBsE@BG}fj-6If#{mW6m}uYpXNYI)C3R7J42 zCpPV60dO_}@E%@bGochP;0qrf6@2(Zz7Vrq zDTqfZxsys?-UQ~lh18}zr3wJe1dCiM3(f{0=9L7&viiqmW%XtYc|%bfJ%$BEItGm# zV7-pr0K7jw(;cDPO}+cvW*~TkRdXL_;#NQE2bRXxqB~tB(^mNdVrGwB{?|yErj1g~ zFREoZMNrP+cNWddgX)X7b4>P}LG1V)PjDK`@|E@Wx$X9`ZLZ8R_w-E#XFfrsTg2hd zLDMh^$^(MZP0v{1Q`oa-(6y5>+4My4boU1HP4USrCm&Qz7W)KYn~|%%BEE9K$?p^} zv7C$w+{+p>rG{{)S3vO+h7wD>c9vZaBom8^nfceGEsWU$*kW99n+H-|Y|$4oHnh|1 z0Q>rCXXCduBq^GX{ zwW2hyWaGorsH$n4K^HA9rfIC=IPqkyK5WNrtl(&{R66WOVbM)pe=MD5N2OXQE$Oq6 zz6}#D3V{>ih9777s_tLzTRbKdFE<3@;Mv` z*1Vsn_Ko|+Pl^U+E0-mWapz{EUiG3XkDQu% z-eKG>!05MB9Fwm*u!!$lcOuWYJKjzo3&=vVYfYk2ijm{rd z?`J0pw)jbXchRjUyYg1zrF0!OMiXOn7xMR62jcipC=?A@QYHt({vk^HOwYiG#T32u z$wc1DOrk#l%zBA|F-Euf24V9_A{hIpfV?wlei4OQw3HTtdAw_tIl%D5^QU-B|IZ?+ ztwxKv?K-{EuQkr!H}X&=RS^pv#pLu){+q=!MhIJl`k^UOdiH_lRi2D02(vFN!hcEY zl$U>q#Xy45h-6*@X_|lhD4ZMu8ptGw^euiu1h9KN53L%FBTJaCoE3s3f>X!V~xP8PrM_;Th`<_v7oI zAuzf)#nAQN`?}QswXgekdV%TxeKP(9KQsOBon5M)1CH1?yYj1hdv%T6%5ii4ha9xs z=b9WP9RXZa3cFQq85BTGHLLo`+s47nXV^OqV8`$VafI+#hCw(78WcJ%m-MO>=`k`f zLRyFz6_cC5!ZPD^lEd=n4}riZupxeaDN{Vc!t9+=^wg;HV-)UI;#6?FLa7;39GU9; zcklx?hgnmojTzotV5fgh2wjVn!^Hf``((m&jxY&!)ykm zw!K2Z2e+SlxrP0k{lb-Y(1`}lBlosT@Orpb z-+eTohZfj*(RM&Bke+>_qGEY*$;370&V z;g5PYQT{j{UseD>E>CueX)$A>Q5r6Ofzt5}b3lNR&fo3aobwW0&FkK`mj0`0M#`j9>41b&QKR8H z-Huk;8Pcp2`5z*avImNOAENjSSdsu?@|{vjKk5!nTCf z7wa3YR+EyzV$iar0UcYR;Pt7sjX-QE23m~F_QZBf=9I8~m>~pDE3@37@HHZJW@9pu z^hFPTQ$Kk)<>6C711o~4LEsovP2#Sa0+x^~Bv(~EgNnISXRMS`v^^7|JmnVQGqB`{ zyNAU;{C66EN%X7o;qKtBAGhn;n%ia$>w?Mt;bK`X5S; z(8ynab>Voks(tize*C!V1js34X`roR+Ct6&-|QKua>~`3`G zrbTJ`S`g7d#uSjw{Eb`;Htim$v|76%`V_@(o-MdCdK?>gd;pAcc>}dF4#370i|@0G z{0%f(!=lbrKJ^Io01(yJO?%)`zmn7DO5bUm?g+;SF!Y4_E1XkN$&IM!(n@mWkiR&c zQ#CqQIaO6w=6QyTeh4lRYM~QkPC?v7g3V)7M@y&HK&Pcu8pnpYgt22meYpzjy$ohe zpc@!9YpxHjvS60(#Czflt>N4!#_^hJrJJ?nl_oS&cUI3$)mKAEO(SVDqIPSF#_WNJ zp|q8mul)TdAS2Ww>+=2$$29*hSnl6vDE$BL7t1#Y@GlnlQudB+uKyZ!nyYG~@Xv4V z%DkIb+I%nqWrb$zKrjR1txzO6=`eN->AM|IteI2ihU;(YFO%d*+nM>jJ^m04k#1<%<_DY*dRaNr#~smJlhuq3gui2;?H~8bqWL$K z9d-Kgz+|A)v5L}FYX86%zxh4HS!ve&qQVpFC7&Fp7Ad)o(gS}^CTcb3N)O04qTN8_ z?G(9%^Uz>~J*Jc3t<;b%YPCzZy(hh==eWXaG9U9>z`A>(O)w&xp&_%s)!1a+)Lx@( zcZ(o!TzIfEx{bE5wMENc)}`lF82O}fETH{hM-buW*(gpw-N-spS-(^H4C~lY>iZLH zD^bN0EadkXA5-Pf9$&s&7mVhd6b!d=7bX%kmU7v8mKrB)W#E`U5dNCCTOX6I(mL!i zLz@!qsD7*xW8Xb8Y$Ee)Qe;v1kgPHYY0e5uQfP!If?a1U-d`2YwyEN1FbLx1i;sax zuE1uy-b$J6KF8rVhdeXeS&3!OjkWR%ftf5RsW+cp7jTGxmHzidLkWTV&j90#f-UU( z+N;IDrd^!|cnRkYiNdB%;uh)av z<%EP{>_L#wr1rcD%5s&Pv-gO_N`Pe`>+BGPRA}L{uIZ0u&XgD#k!{C=JL6md>@%jo}He6ci@6x!U!SRH$dU( z0eBhTw?@GSk%j-A>0&QFf(wBx9LT3&Ka(u{D9e&Vl<*l0fp`HLTd8Omrr!i-T(J3| zphL?*?lNdm{acvn5~tHMC`UWRJjbi7y@nQ^ri{S*-~+p6y_gD1!d7~uK5sACG=W1z zWYQve>zIIZ^wnv&JZAAj#9ze5s){JVL<(^5Fp*KIC|FEqwe?=rBF=_f^j)^guLy6~5f>%+g;aB&UE+Aelsf?``pG+J;F+R-r4tnSEX5rcQq z3{bG4x;KEzaL+@pRQ3kYitLF_x*sS)Pu%Vjg!bkS#z)1gs$hploS+XhXmE33Z%Ns1 zVUKNCunR3Fg>L{rZK}vjbdCxog&{svQX3^#(ZV^k09d^Na6vE|v)%{8;s@hjjYyAnc52!)5_L|L=;0fK;=P`K$6>!O#E88{*&l z$p3(c{O9l0KP3$ROa0cO1Lcc)gcfi!LEe-Jizo~X3W~uC$p!fvlU@XwG#Qk14>E## z4KI0V%6=0hQlrwN`wkrKj=H6YI2n$WdR^Vpjt?-q36c$#%J_z_swlsea{Q*4_OolQ%`gb(?Mn47y^rj16-^Q#k5~wxgU;W4QOmo z9QU1S;kLF1>h@SO!w;`}dlH?o`j2-j@YnwQ9Ct2MeWipyg>~15N~d(!2TJAX_4*QE z-kg-+^<#emUg0*!4SJ~#NqlugompqD`^gO0kanpLT$oZ0z`1wj?R@*F zi2HAn4w7z??@hUPiG@3Fk{{H1W`i=U-MQnRz(d`n8nN4-5PZk4!8n*SddPStgz}hW zM7)eMVt6=NiLh@+ytrIIn4XS6yxk>+?xYuDdrZ9IRTYj7a=q&Lh7$N>JV=oF$_|WX zp6X+rH^j*(9PaY_ChIt)ISIJ0G0~cE;3wV|gzlsmq1o?BB*4<#QTg*uC0LO1k`8)* zwc_U=jk3sIazXVn>>*sfieRbw>W8EA=EOZHXJZqz0yDh*p2Q0W}_U|?tX9X+VOl% z$M^oc#pC%B8WGsfC;e!``%64%MrwBcroq!=GunIC5HQpKa%%>)^ZP)+v&cc}H3*ht zH^TiRa_8@4kjRBUsMQZlC8 zI$9X>C5j0tQ~D!Ce991~IxCc49cDgBJVrb&laTD;DAXh%>QOC6l$}sMeTXzPHgF@1 zv3+`Nd!N?B-nHt8KfuN-hT+i7oqI`ewm6Mv1LP>~TD|_b-fc>(p}iZ&4^l&q%qh?%LqI)Iq+1N4v#haPE}kkI58ZWoOHMUch!e8nhc@9Ml=_9S7^UQ{ zPue+@6;NoVRVDR$?bxBWDua+H%<)RO>_gQ9m)Z>V(#`RXdFj*%?0imn>1Y8<1sIN$ z?zVceVOi(=MN!YELcCWk9H?+szBjA&P~hlpEFS&pF*)(V!lM#$S+Aa1eL)YVxU8dkF>zcr- zgzrR0c4kNphgb;+_7>LTTvQwA$jx!lHlpBYuGlE1H}0J~fJm*poK76mi6!j&2X7-} z+gV|fxCGV!G}u<&J+?!I-h)I}#cU>{dFrsMER+3!D4k6TRIwxp3Dz7yU(iN)=61-b zQl&0zg4-jIB)!I)S1oQcvu6f7!={E9=w1Y+b{5aQsS%WyGvH0c=%?2~sOiR_|*jh}yReS+6T+l^PIVCSS-be>|C7_D@-nHf9d76DBA>Mo6zGdQ(*j(loM= zT+f~QnMIhB0S_jHDpM57>;L0`Y!v_5g5lTfp?MT)IoRrEdjG)DW~igI^l$lr>3>Y; zO;3dkCXc8hWLWq|7_x);{oIfrBXYzsaqA_-9I8hF02CmcLYD5$Di7{09UG8mU07#P zVtwLju&993wV_1#A}rGrmRJ-HtTVG>HGxvAalqni6ndTwAAYUclj^$;mA6lb6IMbz zt`i8_dkcKR`C{@BUgZkISkqO%DL=@JPLZKqEvdjwn#e3IGf4Ov)pEk3fm=JRR_aKk z*UVqf0V?M@p((Alv6_3jb_KiHK%sZ`#Z1P`#jh-CoaUsQ$iU50n77<@V~&WZq;72m zBX(3zl~n3mkk>+BhCv$WE_esZTMi}iD5_}62oF>yHCdG*S0)f6<*aI0vB}Vc%zIj} zypS6iV|ElyF(j9v%IFHj(C7zLCIi}Cb{I4#Y~O;u2S-h$G~*;-fnWlfqG%Zg$I7f; z{JnZM<6poG12WJbp#D{TN}f{4KxIu zgytf`r%Ud6yL{~jY&o_GeX@j@T@!yUDXlma(?)y=AvvGet61O@vZ|=0?S6hXQaWtl z+%tT_GDWAXYfSK3u+-o6U(NV9_l?Q8LivMZ&8!lpl^Q~M8&a2 z41l}}cTml?!#?|Zl8(xAN|#XJtie(+H47ZSVqfk83K@O@qPvz`ry-U7pM0rb$jq|D z6-=^IbMh5Ow`W{QX6)aAErgu0@W&V^l{rdj8l05NS!=#piR%2&>O@C;+A7({4a+=> zkse%+`A;-B*_gSOR9FS<@l$qL8YE2Iu?=`O_>L7{nk*`iS=F&&p^nQP!~DI2vEfW3 zAf-6C{p?do8HAjYQusfaJO>-eb4AiDtNd=G8BGvrgr7$aRaRbvT$kS2xhdmvn5Pm) zO3Y%WD=Mv>7u8o-S(oVRYPFc8kXEAHwarRP4)5o3GI0B2o2Cl2(hH*7@bwF23%4}6 z)7vLoibtHI>MzM2denxL$=n*GRUIsl%`)SxfOz|+Otha#9n<1htFo-KaO31?ta0S? zNuzL3or>F{D4%Yo!D}!f)oBW(;#CAX2eK}!G9FDKiJ9vNpv&1x{}BlM(k zBZnw-mDw!YgFanEEJ|(ft8Rl~+f24qqmhEj2tS7xz9LhE3 zVH?#2o9QdX#dCh6DD~n&b^6(+gZx5iT;8UE)H&oA-Ijmw4ze#K#aj~T5VHjt^M@lh z(vY@#2i(9Bt-h5Oot21NfgQz**_oj^VJTqfc&LV$3Y@Ayfwys)`t4g}0R2WrR?!2N!#4 z@B^k3s!Oz44zkO@Bjdo(mqra_xi$~^lmAlc0V(F`j`mTOL84^PBB^%8?(_I_sGxa{yF9l=;YGZ*7J&bRwL2PwrZ4C4Kt!B#vsPRZ@ z)|OYlJa7XOz#2NA*e}3Mi76ZjS0)>TWMjMOucItFJo{dAwxhF3p2Ry2o9;`2;z$Ji z1um|O16uoI!*`<9tswH2mNbrX7Ar9onHwuB{2eWY8Rxcot836Kjn`Bl=?|ecp&8tMQ)n*)Fvc zLN)rl)ttqxs%-s8Onf{prjm?J^`1zN4ieU%kG(vY0%?b#ntEQ{GXinNCF6)h#F>Tu z%*Iea9&|&Q@nYwVZ)DmU@S^LSZW2G z%7z6cof9M|K2Ku-4h5wDmdIw)2D(U7B3`nv4*V+DC?p->`vJ$$5WJiIE)-`#%qB;M5W0kq1PaQdYGJ0}glF`%-0;0DR#IPPfeI0ap zJW#_3*h*Xg8@J~i``{e9ccK&s4E6G(-$>6{*EYKhc91tqaSP+k-UsQO2hXkvyru{vvImO^<3q17C%<=wEVV-vp-KgraLe$+?v&Y6ZSrWWewT>kX$pXT$afaZrjH z0`3j_4fKdy4fcc#qkT%IE)=eBT(}V#BeUyq>w`?4+_u9M3VZZ;oR>NLr@xhgJB_xx zQO!b#2|Htu=mY30qr_!oJ9IjaG#6~AypY19u9#uc%6`lUQ`s4Dgd}wDwHvdTMfF5L zuq&dXORSt@{uCwGhyDZXOFDJCv@ve`WMOA#_eKg+6&b6G^XzgvD(*ncH?8LY=?->>NIlJcfyngG|CJrF2kw7XQrZZa>>Jas7%QZ z1nViW!4e&Ofqs?#W{8gexH$z_C<}bK^TP37L&BZ~-5+;VZZTdVYJ?iSH!+5Mk)8iB za(Z8aw9Nm2nb*L{phKc6lAZZI|Lu z4~$}U>^BNd|75&?JVauivOlh}=PZRWcd{$;)GvEc!ju4DWp50fLK=|c8Kp7};7&jm zKO!AF+U-O3mc8h(4%{Ti->Rv4tN+FPt{s#mtJB?jsm}u&P?RGa$lb=Z9sn%OxpaJA zBz}g>ef~<$9Na^vQNKRD$Kb$wvY(?iCN&PT`3AJDnUSWeK!q7tE2AnO%#t`_MJ2#k z(!jQpfVs`lJ4}@lFO&>&qcBIN1rlO67TU)Of!2<`*#u#cZK3aJYc_DJ;gXORqrv-S zg+bqbaLZt4Dkqg0W{!(4(CG0aHs{G@|6PW%#7kBXirj>KasZbT?qSyz7ihwXwL%m0 zN)vX)5K32J$DyC9gLYYE#vL<4vcN84i4h0PJaH}`{K;}qw#bj0c7!&%L`xC6ma;I{ zbqwE9k^$wK(0WwTA7xiK)k;-pk1P-x-YDTf#RbKn^+0ms9vk{tKuKZc{9j3~p?4vZoh^T!ux@&}y_3DQNLJjFvEpc2e{9u;7Wm$sF zSlBY#Wq1@{Lmt0vK~+=5xos7;x%!zv%-GoU+QKXdof3p=GDvcr-Xk$V$xYT?sD-kr z>J-;E(Ez+06c-Y1$=1UHKAk0A+`h7IQW zIUH;aUE$6(W6p+PZvqeO!36w(7bF_{mzE_DBtB4>>D*N(QGQx!vAK*(-ftY=i0Dcu z2;frO&O%)bk}lNq^c ziNlP707c~ttwb|n5ThSLAwV$Tan+e4M_Pvm5;BYdqZ@98hvb=B68!F^O_mV_KtWrtV7GB=_er`!CJ{ABF z-5h%wqLAKs3}}yj>-U1IcIWNr_LA>wfs&~`+J@jh3gUYk(Y_lJ=OGMZ61Kqzf!PPY zwP97=0Rzv*7{Td-T{zOzjLJZ@(MPa%A=eGq7~$w6{N9WE5co4#?8$RE%Cm>n1(P@G zvum~qR)6q$%gzsZvrlr%#1Ean|1C&UKx_*eV?o%}yzGa1WtATm(F}@kBEs)KdIhc< z#<;`vg<|ss^YcVy7%=f<>k0q8kJFaoFA&)~{Q1hxAJ#icuuD)enqTqE@JikzWAGJE zu={5qoFLlwLo;?XAS&gSg$bk={UH=FjWmTjiR?T~uLh~n5(YR5h=GLaLWd`jT3R6UBg$CxE6Nj6ou~`!#!xzBYZM*#J<(yLdrtU*oUKWhL!lxwh((rXZ|HVxw6l}c z8BiMw>;?+55tI1O_(4mwVR^3TTxKJS(4JgR+_)x40l3G*B;usfeq5Z5)9$UVCZ#EGg?r^a;Z@&B7*S+r-F5X7=%MO_%vh zQ^g0$9E(%gF;m83pI@foG;L$1R@6 z^6!6}EMIL6Wn!W!RE%eRDY5d7NXbY2*e7Bqu|_bO9dq`PQF)S@K_z(pnhq*6vZPtp zV6>!OIYn7znz0Q#!$z!zy2C)X&`T2sq8lAmY^sYQi43Xo>6p76Og<5C&UkEd^9&~0 z85^5e#nx4KhmXLWDA-p=+dko_4u1^;^_!MfKhk-3g&I3wZ<;z1F@1!$eew({`!HxH z99mQl!O~TrmVJ6l6rMd@CxXzSPsb$BA9aWb{UZBDp2C+=*P5Y*_{)fSX8mHJ#xYcB zM{zmDN@)bc3wvmO$r4Uc*F2fGDtK$m1;O(=;ygHu1526{kd{o4{VUvZA#Ht+x)5Xp z3CDcmV-WQOl09S)yLa7B-hIBp`2@oBhbeDYY$sgd9*RRLger>!)bNS@{BqzvkmAuN zMLqn&@Yjc4od*(L0%VCoF8wCYh zk9)(7sUKv%&l94c??Y=FLMDIs+LFSVB9_aw&Fi{Pk&0O4Ue0sHX*LUMKAMKb-6!Io zlDlvz8pWV8Tfsvh47^Zs5bN+l@^zJAPeIKHc|z}LX<~<$58h6Gdw)@t$S+N$rrj;V zuvqPHIY#oAW_52bmT_E(Ko67ZAl@XQZc}voNqYaGklNb;WzHWoy(6PVG!QWf4}4&@ zRpObX*tCFY?3d-l*Vwc6JF(SJ)$VkJt3}b&_Q;%1-g8ez-zWrW&GMrdG#_VOg-2RB zD`@x<_{VlJRZX|={hQrPm-*NIIOe~(O3?pDFo}qRy}6aee<5nQ%6bk9jHrC}9qw>i z8r&lsIuqb@Aat^kI_3A$1<3ru%2UqC02+Ia1^uTtdbcn!s{t#=V}cx^gl=Kz{t{}$!*mObm@zU(b2 zTnWv`Pc*&pf9kW$g({m~Vnk$Z$$Qkg;=tuosiC@wR1MCE_mJx;O4!QRTn{aK< zdJJ)uZ9FWaJjQqK_`bCIP>Xrbrf{qIk(m%z z%ZA<17?7XUSZ>6G|4OV+Wh#F?ssA0v3IVnXJ3~LWDadiZ>U#SF0WVe2#Sw%p{JpD( zCAI81_6$pX=GQ7_haXe*ozS!Xgdw3x_;5(PN85@OD^}k09qJc&O1;DR&yK{0=Hh7H zZm$O|!x6`54a*~C^Hhx1oHhWeQf}PCexc$? zBJqi!zyK^nI3h{HP!dRRT#GDuBy8@p*)1VK+?$O%Y~10EJ3$FCQK?9!AfbL6Of64-F3wclRxyoEtSYjVhj8c@Iafs;~D1kH0%Ue|H?dj)pZNEtvzZ3+*2D=xfXV zCXNP-AM_sH?cl!?yc-~B|D{Oi1swRKjfvo!$Nmb&pB_+k_oAF!!(Rt*QCCxU@-61O z@GU0rF(;QdmN_$UygV!NzbLiWKR!P=2H@}R1@TJqLsaM76z)CdMnp7d;EVA2V&~JV zMpXKSM~vLw^5XZCJb0q!XO0$o$>Jv*IZl9zZi0l}dA|e|i?|ks`S_ zLh^`(^2y+I)ST1CWq4JGQ&j7oZ;4VJMzMlLIq$qU_8tE4|Pj`-A#EOKvhjtLDs0@@{fFPI%IKt%Uun^V-Z$eP28!}bwt>&Ji##f}RrSlYmd3kSK#D((=gqC~5# zT_B&LZvT<6df(&EhYMGO@ao47^jiS8Ig1O&Hwn%g6j{UW(e5sdRRW|xnXHGLb}|#i z5?1tNAQa4sXU?(zTm4mcub4}(3KHk-<}%35*QG2wxY$d5_yVT!HURY2%B?pC2Lxbb zV&Rv)v>2z?`XQs4%WJa6lFbzF%}zb?lfe;c6i4r#64_%2Z~l z1QjMri<6t0%d*sbVZ$_6CThky4N0Ch!d9L=G7cCqHtj$QmGLTq^A;s*0qM|PuGUXj z=G--u?th&G3PLin$dCs0i+dtF`kwwN$D_H28qQmehK?I5*1v#F3_MN2C5~`Sfdr|a z?R}3~8lgutzMpBz%FYmMr*2K8V*gw-+Y#3&#T}~EVPAZmU<@GBL8}i8vcdXcvKrii z$ym3!3>qVQlP;(w_hg#lV}_RwBm(Pu{Nqc+A-rnKMDhf#f5(*k}{VZr`R zm&_y;l23&;?KczMxa3LdBVqd^A$6iDDVmgt@41}Gkd&?0xUa3mR-f_vL@2@%!#U!yQzv?B>ZvDa7cbx??9rJi9qO*<2e5n2xJ+ERp7EYHm>6BVAfxE z{WgOJBHVdF_?qjhKy9R0TS)Av5{fP2^F26FDR%TOhf;mzRQ$b3oaaB_QI=k4{(^2 zcp#U9jw%C8gx|(Is%fP_m4qB%`BnN|u%un&p!(IiY(ZrylGDSDA;ZM|FIi84V4Ob3 zKvgGsFowY(Yt!ZSMMI7BOJD#DEx&}r=CnJL5K#-Xqi^!Hw)~YU@Bjl zowEC@BE;r*t{c(P3@Xj&43DZ0n7Et$PPOgQJ3im~@fRy!0fB=15Nv@V1d=VXGQqfj zv4o0`ijjmn`80wRPY%45S15nv$n|1eqT~~v=B9j&4*q8AWqPH&jGW`8)Hh=kd_=Rfhn}d_ELm2Fv6ZAA4HvT?4>|V-qSpeic zoBhepjA$01EBhKkLW-6GkXelIU~#zj#@7clq))?hMvkH)-q4DB9%fzYCGOR_is)ZF zq?hn8od)Ib1UkcMJ@4M#)4a5dQ*sdojnX@)f(IlY$>a6WsP$2(5^Uc2{E~K8@{rUx zf5=f4_yC941P3c>{vrn)WW3wLU3VKFkt4l(2aQzz)pJn(5mvSy%_kZ)f=)ElUD??D zv1<>e?zE~MU`?UX3K>6y6mI`u2lVxtV5g|xgJGZTIa2Zhw-}-Nc!nlvNz@=jV8@oV z!@ZIA&ag5YkvlsKh^8`S=1#MHA@ZOW1&|g6)Z9^gRF33JU62OgMlk)_&07DCU*}d` zxZFvsFc0RMl=_7dW3s(!`k;swe%oHy&*T*7N7uAC$5ZzQk&nPfm3}i3=3@W+!^$~j zDMUKJ2tz}ZkC3g8m-sbnAN0XBN3w%&-gR3=IVmtO$+OS{e?2WOsbU85p$(+UZD}rq zCU0QzWHVk{MYLN`w=_Dt*iVJzQE<2u)P9HrjyJdXxGwaJ9Av?)6`Z|8glq()^Y_>ef zDwlT1eUbNQPmcHDGg2vmG24B>Fs3;4=iJegAaydKGekvpw ziLra1oAg^1L_Iz3w179d@|Ej@q!9PMY`I?>>1Ve_(33^LqmxZJ&Po9nfMsZ3AN8;{ znO8SlDNT>X11gm!*YQXOUjS_ED5~DAX>U7UA#V&*|3KeeEX$%O_5V@!4&0e_S=(sL zJ9bqnwr$(CZQH8Ywr$%^g_Trn+jer&-QU}I&N%1oZ;ZYFz+Pj{xz{x>G#gUk=FN$N zn1wA`M346=eWxF-v9e3XWd|WG3Cu~R`Ms4)Yi%`l2IEvquI^r&VCNge)`X z6;{6oZnKxRRd?qV>vvnX>1~=~aBhKTA&!P3f-$e8YfHuA3Mo77yPvRZED*Cx(^H?f35-GsRJ55}BssZLJ)CD8;M><-0u8FUCr%Pg&@< z74(o~q%d!nvli>8Rfe_mX{_~B;CF4A&hnvetY6~d20WoD9Pngo$Feae2(;JSH>3+T z0%w5&W?uC@Oe86Th;W8{p7s)b&^70OxDBmaxH?F{OU%{l(Fr&Glwz*0*z~Zjm=)8I zUJWHn2_8$r9nJaSRCfJAu5HpuTS6K6_|+t@yVI-bHx@N6Pa|6hR43eG_)bOI!%}UA zRYAK^J4aBPkulJ__{Mw`_OhCC>i5o9WNF+@FH6o20SvqYj%52=ZQ)vovIVeac=Lab z8-qn=HQK=me@f>&QLdYW(goXyMqEFNw1XPt~R0BtT+1 z+IQkIe(f4uEv*~vMx?4nOl3xOui_f(Mzw|HvsC-%edQR>N zw4G#0RUS!hgOUd^TKX|soVQ`|Gmj!(srorK2o$=pbdjZokky~gg2Ybs7%|6?wT=S9 z9Q6Y>@HjC8IUC1X)DKoQ_6-+|vl`obC=a?68GNCLa3F4V1D*+wJR4yT=r4&)Km3N? zT<*e(C=4d7yMvaDspm?9UT}(Lg3jk^nhOpQ??-yjzfDVk>Q}Ds(HM1pSz7;8;>rQL z*5#io*;+iDe&os$v}Vd#`9V`&D_l(n=G-n8hnq#kUsDUljiO-09|+21W~R|J_*Vr`U;(CkR`7I2GdOc37hs&=8LLVZ0Gn+dcGS34 zaF-e+%?S6k{-31#ZBFgv0So83!Xg|^@6o@Nm&Qo#Ar&)glK`U&^0RHm6j?#+k!v={B&9o%_?qzWW&sbcVsYH%WSGf%{b*IjZIOV zHIq!JN?GZ1PO+Ctdwx8fZWHWR4- zC*a(_qRWj}(sO%>#|aFn^|zf4=gt*4p^(f<^pY%fD)EIDCS;mv)AU@|b+wT!hTXCR zBvq@G;P{%I&4dRM_U$pTVX~da@=l>_ze0xZIxu;7&yQAh&=DSmKBvJV)z?n93-^fM!a72kB`eWF3dGH?B38)5QOF(;!$5PQySM?MG2kKp9AJ6_YLW z#{Rq?Gd7p&j1d#XU>NMm5!Y71_$h}JY}~fLQxac0Xk%#-x@PRl`|7z8F=mTV4HH#v zvaIH~Kx)hrlG!unDD9cxllZrB*%>FF;Dein#>||8q&KejP)#dXsghYg>l(oeeZG3u z*v$IaNQxtB*oJ^)?=>aUrGTi?Q-RGk?!}gsX;*Vf>T#t_m!nsPJ8md%1i?+h=||=x zPryqzu=i#__ejV5<2lg_PSf4G?dfY%k?qpx6rs|=>brc zRne`X2ClT?Da!NK$|6H3cNPJA+UPmwDX1u;5Wfr^;cTb7}HbJvr0p?=ZqPUYaxCaF61 zY6dA^KI5kla(H^;=j)ySkZ*X?l6CUW3gpE{=So-7IolpVagTVOMv9u<+{-vQi<0@K zQg2!{g-8arjx3AqW9IpVj=3N)ja3m00;~G2W$RFVFr~Og7~=fl!~>}%Q4DuSjiV9j zy9D%`Ji7i7jz$;XPaDo>OVUOKZS&~HP8##_;>SC|#@adShCT*XR1I6jD`VN;KN3%! zTjaVbF8IF@p+M}XGgeOt*WHWWl|Jzy+R}+Z%6%{J8+jaFF&N+~xK_|GM;UwFftS<< z`$c5Tv`?{H*1`}6K}pP{l_nK5hMHb3Rpgjt-l&u&(=-NXmrD~qO;T8?oG6w|YB<&~ z##ygUoL!dyKUbM5IJ~w|M4!Pg3g3`Vo>i5I`f@v%n>ox!d=2FZHoX|a=Yy%&GCaMg z_4}}V39Jrab&!Ym3I8gH7tcE^m_e$&HrDA^_BWMK)GJmphz4_RZRp%pNRNy-*KQ%n zB1v-;m|wj8i)~~CpHq>@M2;=?;I*?4)T)eH?tTG~rTo~?sY}A_8)ql$b2Ut>Y=VKE z%U@3Sg(QbW^BLMFC#g-#nc##WRX^niSE7D7tK4r$%qaQD)l!SjU|JM5#Fk;~TE7@0 z-G}I&Y^UJulfzw2nvAIuTuC!VDbVE6kE!_0x^PIgMIMl;PJ8WBXq2w;MI>38hdFS+ zIm4dIUF35nY6m0G1WMm*ht%koS$zx9zNUNU)^MC=cuijNu1z{m$+|$5{P}2r!9oLL<5jdkF5!@rJ@zofX4*r<D;R%o8_fhtI^P7}L^;w`!;B|5$`)T?`~U2Q8{ zsDf1(shDeU>R3E^3AyTi!NWz>Lw<*}oqW!~8He~RoM*+wJKWIXG;9B~2K!5GP?&1t-BE_3^D zQD*ryxoM5&g94J1Thrfb`?gy`yNZng)J&@JC|5Ah>6)V=Hbkp_a+acy%c)1-;|Z1w z9kW<%5ukUHR;JglavaYsJ__&>#~1ZXQ3^r0_^v?4EXbMoR6m{`1j zSBgphSa|>VQi|a~{(B|B;`XmPA5QQ)2mds%Pd;}?+ z5OVe@hd~7>Syjy3^|7* zZ5J=Ze(nB(e-EfYBeb~I)RPbWl2~f3W+_@#XNP*7F4wnZY#`gHe{`rq)+vW#sSxQ9 z?Ju?KkhyC!FECA~jo47*w%>YXzD%Rz#7~Z5{Y2_743QddX7M!)e0J{>JrwFXte?mC zrwesO+AI!?-Kw|69LC0b|NE9g3zb@-=c@}LeQhfKr3C$}fBJtRoBnH-+&|4q{_&}* zR5TT5`A|Qal|bm%D0aXHJ!q}*mH4ak{lM$M6B*b5vgYk`Vi`_S^>x2C75<#?okhS`Y}%h^{lY z%h;Az_+8?xygA1_U*BM{vchs7UyYW9t=g22rFicpFFlA7B7*|>1F1=g8u+P3?HeJ* zG*UmWM4odPZG8l-c}n z1e2`_>h~_CGIK0li5?EEP$qc!cH5=D{!yguYiLG5idbl&I6V~uV9^;G5U03tc4kmM z_7Yy2mOeXCd6MO8vii$dr~vZ0TY1{rX9e~`+tw~3W%wsda&6@nnhvEJk|2Ttpy0k4 zAoz-(ynn}8&Dj)jCA(iCz#J$v8#6bGISBJQd1~J2^NqvzyX^#>7L@e_6qC04h16kv zvNfCS?R+8^7Dv}QFFZnY*@&BBh1bibkp|~>o49bM_t^wyj6?dBH7cu~3FeF7Xpb%> z(mphTnjI9HR~$x!MzUD}<6TXep83d)QScT0b_G)i*J8^-k1*~jjofQ*h#%hfmvmQ{ z?!0Bu%?q5h+;ts|s@Zn`gJwH$D(q!{TI_ZH0oBDTk|I5vW` z1w`nY)dW3gEK-`mHm1xVQ4{hhVx{~lye-L~iiCP^DGgqUZ~?)fYkKRV~YTXEMrOV$Hf%0G3F~Q8yXNuIsOu(<&b%D}fgC_iGkCcXZVuP8p z3#+~XD{rO{SZp+!_x;g0b%CDnwi4jz;GQ2h zZO4R!jXo#)A|)M0ZfmE(CP$b$@9+b%Ja#9AZL^>6&Mi$6eJ*G;KbE3LCCaRj@XjtA zLTBf>1YmeFUO2zC9)~NlgyDbeQ8Qo^ytnJFeu`)LPY&RhYhqSY^K%+}2nZKQ5|X+4$%C-7HgBNtmCfiD4Jb|I<_BJ`OM0_oCZI~kam z?aA>x*~u^~=swI2!gc5jCd6Jf`|_|wBb}D%;GF(RqqTLLE&$fj=9z*sH8aBXu5k#R z!t>6TGv$uSpWPLH8`>`$hCfJFBY%OtBSr^thuL)m%0&_8GrS8(e!8a<<3#;F8Ke;y zySwuH*-G|}c!d}+g6b1cot;m;9b`g^^V`Kc_7V({QH-hX&P(5_|896=ZPKm~!;wj=_3#u6s`xwUWj`LW{{$J&qusaRmsg(W4vu{qd82#ZR9} zukgef-AOFy*9BUnSnz~#!I_>F>w z&}wj8ECZ6uPMVUiSBc3mO3k!Jh);N}To^aY!-@AXPHGv0d7$k1YkniKoSt$wuvVsw6YeT}R7Py~tp&i4i3 zZ&x)K*pSAVFOr5D%)fWezh2e;3o{HkeMd)ETL+_mMlAg;81X+`1t!&?wXpZmK7DKH z#_168@bw*$9b2hl;r0k%#RG$gC`*>Hqw0zW82rT_PA>R_s+t~b&hw-#4G}z7HCA`x zh(qTKtLiM87FGsUG|s&@AN60m)AU{Z;W`j~dmb=u&L=W1wLdSrST83FXg3~#{5Tc} zc2qiL2aVl)fjzE(fpJmw2dv)?1mBiJguTFU(XQ#eGIhQ45nFZ>2zY`xzwC8;vp{$V z4RCB4b{pOv9lfx&$F&K<>fpt;q!ase)2L;(iQbO2AQoy+gw&Xc+P~?MZLhZKgfo1J>yEQ_c-QsCYpQmcV z++cJut{Ow5v@R8&AauLQcQl_^O1KA@eM=C3?{t84lje`&@se)661Z%+e>{Q1_ag|s zA@c47_)_hVK9TGCkZc_ixM0b>=L7W&*0cudI@ z-mvfvbVe84#Gc{I&E<9|Mzb)4QvX=raJj9MhQke`V{!o#=mK`#6613bHF&?+_@&22 zhaJ1CA!k2+ZI{J~7~bKz=l14Cw9q07T`I2(ZOLOm680=@p*G*l*tyjS#Ezw2v(o5O z(ZRli8&294;scpO&f0e+1_vet3((1QbVW}{X5tN$ z2tb*4VW|Z#{z23oIkqZur4wARN79lGO?+M@A#&``*ZtJ7OX+;+?{d3`$B~FUHXdk%;Fo1XF@?Quo+M2&NKIpDlO+aGEiCj0N{tSN zwerC^{B`sCj@8An+Fo^IAv-zv$By^GZx}5jwg+zH}mA}hK z$S}kkdCmo@kTkpU_~PgpdBt|O+7Db$RTF@vVlpG zS`!7mnep4{X3CYSfa}~7@l0~Lh@pg~^w3xVuui6`5ZdUvT1e668rBxNiYBF23X>^S zXVzspZi^={R!zOX)@CYU!^?qG?dlG(kV z%qu0N#wawzq(BzQ@_J|UawkY*WOfVc6aWo_f=Y;OFWcH|N4p<)lOr;1F15*g$e_H( z^{MeKm))rLjiqe}pSl4-KQ#pQ;1O*DeNgD*iV3|}>e_i{zN16?4r~&GAt7HOKz|PQ zfW2w>pm8L(5S>am3F`^(t)q}NZ>vWc%VilH$V7IJAZHF-1w%K5u6Ig-M( zlL8AxVknYoeYi4Fo1zO844$R7BD4*_*P214P}TB;7SP0@3}f@CPXlEX-^-xj$>|k{ z>kL?A4Tvk1`t7wONlY>}k#&I8^^5`PiGeH%7?E=JD^+0RxT+=bZ;Bp2hZwmNz4XJC zY-6KSL~~phlqch@go6hU8o;r)9fGwRl1DTF(d8dE5@i?}4B(~N0UpD1m#ZBOeL%{3 zu*A)w%2$T=(_ytkC`fE=p$tlU8*~F^3s10%3bgdBhpRCV{2GJ5yOtG(o`wNW6eM0Jx^5rf~BlA$MG zVjDE05vFqq^=VnHD+akL<91hw>a49g23@A9I|6AZBf~9s!I=*3!hb!yGlyAD?nUQQ z?%)CdQg>+N{PoUL1Bvs+&Fb@1Mbh3px2Y^8>ZhM(65~;2cg+=}?LAlb@>EO{^Q;s< z!CYbb;nV>jUPnh4+~r`6;)1=yZCCVralkwdZDN;D@r;7n$;pM$yiE-Tx$0^Wb`r8u za5HRdg+?{=2BRvL;qY->^HE!j65ZHQ6#DI@+@Fz5UBG6U^_zaq!|yKC2C=0XG9}># zmpc>w-7yqsKVt)+WrLlni-lv;|=DAal zahg5Q%#O<%4xvat|0CqMB1`ec^d$e>Z!ZlG8QMf?Eu+&Ll0^K@n1wOP*PTX4^740zlL#pp>R0L1*3Cm#f=%LfXi7!lg z?8>V^Kd&WBe(_nvacn*Ie3dDeJpEpJoLdq-801eS%C9)iPf~7V-h6g%@w75$dioN7 z5@}Oeq{5bWl;b*910T^}uIV{Q6vbSJ195Gn5ox4FQ_dO4Bb#oBo!0|UQ^vL`-e(eciwVwo){TAe8jo@O zka99h9HH&u*t&u=HN>WE{z*no>}fneNdV0VVz#gJtC`8<8U8@2f>UX>v*I%G!&_$$ zvLW-1AzYEbM!OH|#tco(t#Y2IAZV&|iY*K6UID`dXB+U)ouoT1k;ON!ooOcy3~n*c zwxiQy=#d^DY_!1mpFkQ`!0kqbjud{(h8Xm> zd(_*68c8iVVXLNHTomilh&w4S9(~Ycom`4bvYgiwg=3NsrTRF-xn~!6X3O?eqi)9R zY6v2X<8QhbidOvAQ^#=cdZSXw9DK7^!l{(j+b5&BS+WrwWm8Fetl(w|sd}JV$PDC@ zwE~-60cAeKYj9>q3xIN18NElB+^`#h7T9 zOs9YlwFxm?14SLHo`wOBM0SJ z10Lx(!*U~v)f)*ZQp2-LTcfxmA|Uz+qIOWxT%tZ88PD~^{=s0)8*m6C<2=E`*qQu_ zAge5^KLps7L(ffX3H>Fxz?tE{hgrFxVg_g;Uq$CJBaDX9)p~|nafcvtNgcmHm0x4d z*N<#}8F~)NDp2qUfACZpx(;5A_V0n=KX3@(Azb#JUPHud2t3*ra->MsSLeC$NR=un z=J%xSaK!BC$e4esgj3Syc@b`im?8zD*pm8ip1W>kHP+w}e@XE_N!F~;e|FuCf5}=# zt7;X!TB4@w9WA)Mg59!-$$u9KdDIy@(r*Z_d>tjoC5a5@#!pQET;#DlT;`7v8Uf!& z?khFb?vCfpqFpl%H3MAXS4<8Edp=T^lfn4W!D^?$3v;0u@&;5>5=Bn9llz1+ZS%(y z14%5Z6K#)v2f2k~+xC4YC(2sCa(guJ7nky1KIL7YU?0vx?EG?@{E*JUfAAnL=YhGy zAnzS|LoaHM?M(zs%ylAnRSwn*i9kf{trZ%*?=|iTy}#u< zy%)ay>D(LJ8{CP{RC?cAGw^Qp5P<-Wg@4Z+>~!+}EUcW{L(bif1V{l8dw=x;h|)0C z{tiSn)FWd#eZfotU+@1n5cRbd12VKWFr+m!G1RBEbugthuywXEbT`y@bh0w0HMDl5 z{leS-x%v7FnmnWq>!!FEmkqqS7*DGgNe>0G6o|N+LN`3T6eyGo#)i52We+a4qb0f6 zTuX&@JfFMlDJ)VsJ(e3l$_1kwUi;>aPWGa(gb@OdLWfRCxqm!yncNKVBn-e>@r)~hTld@0t zJQntH#ca>??Mc(;Efd$*G(@*|lkuep>{BlU{3-_g>MO+r`7HwMlcKL@IS*=MGQ{`r zf%i-f>T~p{=d2dpiz(q zeJzP-qNM=t+=YrS&14tEhbqx7?nilTEN%qsSBN319zD&zXjtI5o0~fi$5|_g>dG~T zmhr%Rt4O~BCzAmdd5okOtrq3>eIZQs?g$)}9XGGd-t)dxQ(rKenmC048Z~Z3o94hT z^MNR}aWj+x4v`G3c}9!cZFDQ6#w2-^0uzx{%ypxIb2r8U&D5L-dD!31j5l;Q3@d$R zqy^esElD#~kuHoDhK(WeoVTZXbLInGOGCd#N;777pdTfde&Ts{cI(uPXfB@G*njn@ zA1Wefree?tY~C77m^fx6zD{kd$2GT_+&U@n7_Efcsl|a!?-FFy2fNl#EG^@U+P`aV zuYm&A_wVOzEapaqO;3xJOclLWuCq^BvzPBclWj ziC8_$9A5TisZkom?hTlu@xZ_$DG!P>v%|wYV6VjKKS&FtsI#kzU86TgzaCvh2S7HR zL*0(Eo{?@}i187#wtx>R%;7HLq&5=}SG$!mkDXRRfJ*7# zYvWv*0fJ{DLeU>}ta4K!Kk2UdK3ru3()W?8JEMe;HA>o)7D^qsQOk>*>$JmtpehRJ zW0wl7wPA4}Gf!0trPqVK*V9OigU~>{LTe450tgT1Lo|JFS!$GgnLs zc@(umL&o~ySNOGCZWWC1mmo*{h!O%#4%+0(;JdWChIuc^#HrNT5X))L;FhEJl-UE( zNTg)qgBJaceE}73ntbYi@-4Ldgznfx{wD0EEPrt$_PnQW2kadM#wyoY7WFP_^(Be5#P zY0vmvcNuc54fluO-Ki?pYE_SSq9abq8?jig)xYDpLRgcSAaV zJrVtbiLudr%Nn#pS`2(IoHBj;8@X1eMh`aL@0Ha#K|9DB{7Aboa{6fV98^uzlbZ~N z`pk;h2QaqU)@EPXZGW^6+F*2&3wW|7l}nlS@1zcmBZ{M`PL(SPF6pdws|A~%1x1Xl z9))-0d)f(q5nqN!Hd(NqnGp@bN@ zLDS$hc7Bo>x#U$`4^H@twKOjm0=UT(BjWAUhUrAqGLW!h^pu7%ExtTwQ1f^q9I`sr zyFGGzW8p8QU)x=oPMos?MUA#%i0MMqFW!5^gz> zkGtg1vg2+LxUtuuPkIcsCR7$iUQoPZ=HX`wij>;}3_Jlb5>Kg-rq}k+IkDG*Px^tw zmeMDcyP|3%F;f$Rp^fI~61O>t*W_=Q1tnNnyCWmUZ(y;>zkfYZ`6vv_+Pj7L#S5mk zBL?e3^HT3RuFaTX=9r?I-eHLpNL>X)=Il?&mMbY<3GWbMuj<`P=i;!Y^ zXV0uh($KYs%wS+<8QlqsJTkl>7rbJ2^&k0&U|?k#96)2y+8;6@^o$(=0Kc(EW_^Hj z)7iOi6*fw%$|}rD%c_>8KAWPVm^E9gmW4=pxh=o3+E$iTRaMkf6kxy!wIFQ=kLu6j zTo1kf995i*k6$p&XEf{;P-97}W#%dm4A8pM_=?ZQiDc8{q$*fGi@iRPZGolk|DJ_x zyjC-l=07c$-9DH<3p%fG_GSBB~r}%t{2&F7u)lKb2P?G<2|gv@?%%IV#)j4#iKdPwp^VAyy&ce zROg@%^3BJIiUI5mp$JCp67n>#CL_c|qFLz|={B_c}*|uFB(==*O1C$~VY^38iHhpK9Jhinlgu&D?0f z^S!5*N2H=fEU3lA4d+cHuZVPysu&gxGDw3QiIj42L)ZLb7JnLeA74%W@C0sR!u#Iu zQIX9zdiK*M>dLsv3#t6@(4-t>BQjJawd|hXIV@rVC4hP(`c&sM!M@a;we=H6<5+9b zXnJM1qn@>|6$xmU63Lu~W8osxl_(}jnWO_nMA+HydbGE2GAYa86-V)(rv4?YFl#*HOW50PfD&zf0gxTx0fzI7ZD07wp&w)UD;go)mBzhZQ6Fp=q5BMG{W#C7FAWN{gCKOrdJRrD5$fnZ%5#C~K4#9-yOpuj2a)7xsc-*m;ox~jYFr*+;0`ll|=+D&ckGq}ZN@5 z?K!zn>Yry* z);{&3krBL7kyGG=6e;h@2~4t4W%%vuwvk0@gGr7CwZjlMqUX|4<|ArIY%2@kH>LH5 z&XW`K6W4yr4w8i#I*}ea*;c$V-?`6(0%rhO?FPvxEm~|z&?2yJU&%dP2L?`1-n!r(=Tb)PP@Ic zgq&eYeGe`D21a~iTtElkOXruQc$=P>xaKlNUHyET>H|U5*;^x}=d#)|##RKnxNd+d zKzxKe-%X`}#vHD#`HpWMEK#1UD$DP*OkMPoHFDr(tYvH15pO>;B=dP!E?YeV%*uZp z-TIrf^|x(;E@6L~nFUGnTZ+kPZjXRU%4?UJ(#mp|JvN6Q?lpbE_N8JNw?7y*T!T`z zU%(V63@|a$qG!N5NlGyWPWN`6LA=xYDMWKAg;FS|ZIQ-MY<`oLZw9k&QKIi}FeQ2> z6YVQ%niz$UjN-F9I59$b6EC=8Qz(w1L(B6PSU))4{Gt6t(t|4DdK@WLH2#-I?6^hD z{5w_1X5Jh*^!=?_vGQ}vc7-~XW}1omM3BHl2g$e(T(^&MviJAyJj#%YqpGZgL9|k2 zV6hn;73Ilaaguf*<;%6q()}AU6!bSgo@)j~3aOieCS+RCM`bgH^QsTuJbA6_i%7{s ztQC@X^jyV8p+v?+ahA+YDx1!JXu%n)!DQI~aI*tF8@!(m-=_;z&ed-1#AY{`$HP_%~@>W!c^ZRT5E7 zo1fTg@DX+3$@!|k)}-Fh|9JQU@uF7f*h=Uk@G?|3;Cujm#6D3K<<1<(t3SmYJ&#sOY=y{h^;<8z6Dm zBl%rVnrgSoUTV~@jNYH&f!&sP*IY8QIdo?Ucwt6=$#8zr{By+0;62YyX8J+_>m4O? znJ)FYq2et~4MqN$RrmyA^^`H{$VTyXm`a%CDQ1AB)ekOKCCo|lArdD)wj@cRt4s}px= z_c9g7cce53(?0We!TSxyXg~bD0^F7W$lC5!8`uWe8KRykhzs;|x}PTaQkEYJ@B>k< zwqG=u6HF~Dur|mO@-%gCH`p0QE-7#ev>hHWBsg25-zs=3A+RgVbcSCCm>lvnsUI&e zFz_7M9V}g}A3tya#*mMZZj)j(WGRuQ@{EpMJT;4gv>NPuE%disc$?y^+6an_E+-M3 zLd9tW%`z+7{2!ZAJ{uy$SJFm7=cr>X(>$(7i#@3JSE@Y_f7=r0SRIktA_4(TeIYUb zf;IlSB^LPKVGTudYdb4rekUgfa|355V0gx6d&a4)%$FVa-neEfPBd8U8;(>OLGIcNN#gBCjvXWdOAUt z`r3a|p_kD47l9b85XH z@qUE2qE?r{W8Q>tOh1I`*SuixRSm>i2dakW&HeG`i1AiUn;Vfc4^nXZq3>jXK-2Ib zqSz+NYb=S})U^3H=hm)>Mn-65R(h3IT|Ywjo};A6ZBOZD)im;3=ri}B1=9YdA4*r< zIKQyOo}_J6->T5!q%dU?H)2i3AR={81IZl~6aI6SL6E&_2!%gIx0RcidfUR}DLv61uMwDx5Ig#n?=Bz-|W9O58U4*#7i z+=$w{oL*3;uq1HIEKv@J?$KOUsqKZ3;Zaa4yV`#rNy;X4R6boIJWci<7WZ%G?0%HG z==Md1#Qx$^{p+0n8r>%Mzn`;^v5CI3)qird|9?-t>Wf_U?TcK6-ZyV7A0cn}=b&g3 zmiDAPEK0-@)L;&Z1a1NBeAT#Z$3)NGg*NM@F2Q$(ce=*9B*{GOcu$e{PSn|hMvedt zmLto*!}T)zu%!!TDYtdm+BS@ zmF5(DDB&8mS}pL=LiLIC;5J)^g1x;ct1_z$Q4&XC|L-O<%*b9jNw5Se=#XpZ z$)jMuhXU;?t<>k*7Fs8NkVwFP>C*3Xy(XGWEefl^BL2JrFVq)reF&$bc3N^|dP%{W z9H!pVs-mqyXCX2U!D9@VhMuxYHs^-6#K1$dEY742p4^r!tFEDbXD^%W9xB4o!Ab(z z^{PXpliRBvzv0r~Z=*zYd)R?#6g;RUz*w_4&ejCYGu#Tt#=q5KO8aGV?=*;ktRk5* z7CnlqsW5!(h#f)R))jr)ny1$qwZyS8!2HA9>huYflS1bxbf+j9;G%qX`~=9MY<2Yq zBTMB{Ep_5*Um~6iiada2_bS_^l(SP$R9pW+}V#G|1JD?)>3JC*{f= zVO%G3`h!sJkHCrZtma`^Ed9RF4%A@fnt&@$2%qIb)+tH6sGz45suW63O2??h2tE$1|7nep_!t8fGCP%uk#1dHPVJ2{Am?T1gww`T!Q`{S8? zxm87!jXr6QARX{7pd;Kw>L8tUopi;`ylay6p&3C&Ju(G<<(6nd`!#EH`5()wZQzP{dd|qCUZom|eD8;?i$m_n6+BeW4Jq zzCj0l-=A8_ry1{Z!}(0=1N>nia6L$ep&5xnTy+pB)C8%8eh$FR5x+3|@k3V{2nC3) z?)aKPp!tjJBEP8>$E1nwnPEGM;RQ2W8Gv>$CCBx*xT(N8{h(N0%bg|_>tX-nimZrw zKm%^2m%cDI$qds({>$dbs{cC~`~NUE z%#9qbasu7yZ}N@wM*C|A4ha0|s;$U+VyY%yK_%$7yiBgh3@foB9}KvmdwlC}7B7mm z_R2vwEje_ON5^l!Q(EVuxGa|0+4|fY*q^bbQ-ym!;@~?1U{E7d;F;Ac}4P}0zyX3K#-Eqh!{K5eMJAgOq<1`ABK5c~|p5`f4! zSvg_I5@{;(gl+Em`}%?VKtp~1t2W9?IGbA;89NY(8C%&IJNzGpdy@4R!~JV$tHKoFiw%j&;Rusg#RuRK4v8FycyQ~0RwL^o8$ITmk!zu zS)IuZ5$L=-?Wbu1yPnl5TOR(f=RXz~qdJK*i7gj5P^0TCp-ijIQaStMI?V?dI#U3) z3HLzo)(k=o57ByNn)FoHd95iZQ^DDc=0)B^2kmWToWYrp5%TVM;fC_5ul@RRDO3ig z((BIPRkVxv<^ISSGOI&B@;nJFHM46w85@{Kc<5XTZ>#ns_<5(9Rj=|5-9%S3=uN+Q zsbfpSX`_cqyRA3;pbnI(-hDMC3yzkf1&n0~(mZevG_PS6W4SqtX|ZKDGiRqw#0%)K z{Wuz%X}WU69N?p-!GfouO@n2jUMZqzGiVGqN>Kx#d}0X!7y;`=0jaDv{rC0lqY=el z;i5vcw3oF-{f1u$#hxzpj_BelxWN63(S6dswnecImD2C8g98oEu^Dz!j{<8MD^m1(+L zGpi!58K#yIpUv})j#(6!6ubq~0d%Iv&?e>d*>z(W^vuM@ZY(B7(SqA51ZO05$5dV% z>V*VUV9ljNf9>QoTa+wgP7*Ltl-;=sDUg~yi8MgjJSES0FZD{tm)B6X26e>tz&pi% z?R+4>?onsXQJ9KjX6~B8>&_W%QqINzXpeR|AD0B&5{50m&!G>8%iC}TTf2^4BUW*z ztg8>g5idXiU|Q}G>uzEzgaC*=`)~Uf$%=zvmDmME-`?7G7&Jlb*eAfq=*#fvZyRg) zFC>d(due1OY)A94^-%sK8XQ>0To3Xd)%GY3{P?yiu1J53OC?T-Jn8%QVjIn|&Aa;2 z)~NqS!}_aFn)v@ku^ImliSnPTzrU=dDfq%xnt5L;#}}a6Sp5X9aD_x8rX|$cbQzJph=9_J|ioe-Ld;Jll^dF zDy1fe2ULupN?^zt&AW9*R8UA5wGMBGpGb);RT-&Q3sD2{7N7@JrI~DZ7cXBGPVv*> zccYYR8b0Fa@r*P?j|~Rc0N+C6V1foaZ6=0Dw@`XsK;_cLpH?d>a2$DLZ`p(S5 zZ<`0fCY+oa8`bKaeNp9_$lqvHo3w4t9P+sLcCgrej5&iMn@A;Ggi*6$ZB(T6+suPE z#%3sf(v~nrobJY0Bf#?+})O(zvr zoJDrjvr{Oqt86FQs(>?f@y#<>B>mepGm}Cwx6A;uQ-cDkQh>a8<$2!A$-G?KNA(ZJ1Zol*z%r*;pKr2c=!3D!a4%78qQpt28qd09o zv8@>WQAw|uF)#hN?A8;#-utyk1sLFG{sjkwE2|Icz#8R&>7y$RMsD-*NeEneaS33T01NB>I{t@ zX4q#Jsw5`0(WE;=2GQC>mE2-tY_K_|nc%0b(hhiDR1K~{YY`m0V?~rLLXL~S^|8kf zr>kHR{3v7!kl)FbC7+s2AGt^8e*vyjQ{o1`>gUihnY!87l$V%*8&AhC^W7x`vE+w%`^jyf~FCG?!WP$8s&>9$V2N7zD znPPqjQ*6F2`>P@_Esm!KpU72wlBVq%?r-DYmegWq@vEA;|3j(v*QId|W^pYQuqKT`kl)O^R7V~#PW0KzLMfQDqutGGDW4-2ez zTZJk}ygj;3SYb0AAf#?ym$tegf1~B8tmoNFiqXk3*83PC?cCC!f`h(qI%yd>`|ni0j|KE*S{W6aws_0fLfz2y3F zSnFu&Cd0${x?%uI?lO1h^#>@;5hWpl)DhQh*UMwcVZ)^BOe zg40dQp*zX)uLZ9lnUk9K{ZbkVxXr3KrbsZ?UDiYV%n&pDa2c)U@QqxP0Emykj~!uv znff~E16Jv@#&p_!rdh86W>xuW;^u~79i<4V$zrNx!kk6pr;%*DUUKk4=n2j$25m;%j1$$at=}`Gy`mU<}9FV zW0RANfNT!*bU*5SB_%7hT0d4idB|g+a9rfK^*M#8PoNOV+2yTap&u$>sZ3zDac< zFBt=01nE_SJ;LeSwSOEBROB*CEPb9{E~Z1d5iVv=n-Q!{5M^eGjJB4%xAHA`Uj9<5 z_**O36OODYrW_uOkH}XJ;u`au#k|Od1=@7_BSa#RLg#JsS51K~8iA$@qSpB)|I>MP z;YP$CTcAb_(I^F??xYV5Wf*#*Rs$k}CcXw25vEOV&$ zdAmK*`*0{fZwnozY|KjG$`fqIqj0S(#NVlOE$ttAM5S9iY&N~$?gmH66C0;D`c0sZ z0PO%M!8S&vs@$#^^M26Me5Elktqw4SjMsN%v9!WG)~kc0D$@)QvJh2?*HRmK&@bY2 zjXPRET6$t*cO0rXCMBtqn=G`Quu^KK z2b&`r2>HYL2uW8$0}#8-p;-ttkgUVy8P8E$>hwa-@70wlUajR0EEV0AZgKwP$M1G+Nn1CeMlNHh<~N$;{hc1VAPC6_@tJ-sq~1A4uI^pu zrWI?67i{TYn0!C;Lwtpie7^IKx;n!`3ehU!tp}}enjU%{r8%TLJ^gskTi1z~$TODY z!os%#U5klAll_|g0zwI5slbvI87jUSeGmdpuoPslxwg=Z0eX&FOSq)~c{68x{M#xr z%MGzcW}K9kC*@XEfsAyA+wifCjlL) zr~~cO{gK z1m=`^Vj1{d8&<^>3L>yp;5ip`zKg?_Xf%Lt!ukYH?(Fj{Rb4TQDA zRw||tjL&n-GsSSNhdz2RLai%6U$$D$Ua|E;e`egyfnW?K z?9J9fW;dG{cn+4G1;2JB;&g)28^wPEMOO2>LHSVGhIcPA`e|JoFXMl~5#SU&N&}*} z-DvV!#&0+{m!O~w4#jsn_IPoAY&lx*4x6W?&iFhM<#(A;dY~1XU9T^P|!xfmTmvy{E?#<3HHO*SY zgUYKfZsMQv?>aF%inddGX)znjM=WnD2Q-o0wmJ_Q?&=Q zub{OY6uazPT&-!omjmNh@0j%8w{g5w`l2p;RU|Mh~xAIt}aK4%} z+m-JF{QI9u)-_<8(fN`Dt*B2#QeOw*bGJUG&!(dCe+lr+cf1ecTDWbTv^IE;5~I+d z)O6e4CKuFJ2Sb8K(eMl+!;;cqx|Wigz>cX;7gM{dn{aI9qym;=i^q6}=vpcro4N5h z>@t?|mmPQZ3MEk}rYQSIH{z9lN!1j+P$55I&dkOs7+{R)lNs$`zE)r1pu$?XWAws; zLaOMA`o^2ssf8}ZZps>HHBFkm!(Yf2T1WQwp=zkCkTCBh&4wM>niL3(SLG$=CxZer z#An;EUI0pX?t2ewBc8fPqg7X}mc03~=%VY$EYywM*B@43v}Vg(w6efK zVJq6O&69ac&H|jI^s%xxvFG$TQ);S%Y9hkXBNNOt-pC_D4DnAWGtxxLjRj|FrDrsz zdD;BIa^8Ss(CO~l+HBqz9BztMT0$3+d2h7mg}7!DOwf9c#rYK8hNMR;u}@bac*b^F z^ZN;ts$3sRhTp!~*Gv-^(I&=nkt{v0Bu5b5xiciN=^|JiKT~+h8lcs#U^PI1kBuK* zbAh3jPW8UXZ$x!L^IR<_E*uhtQes;@!0fgVrM4inGzOQXNBxS+opE<$(-(KF>%a2-Ugan;mU-)!`?p=FhGYB`G;7RE{M5I28~rTpwOalb!KD{e?KgWzNsd2} z@xO|;?Eg_&o0(dh*h?7yL!6D*l2a0R7iYC3%ZkLl3U_l82xW`Q)SEG4<1 zqVwALx%#3*Z75G_&yTzQRb<{2duNSi0|>x8t6J_h(?fPzg+fvVM<#zhB`W3i_PiM=e8#Sr%Iu85oa~g+kr{ACx=aS0LGbz35FGk0KgP>%2^Yt z+xDgAi&RSZ>}0!xmDsYLE9=_!0*9AQ-I&`@lF7*_4sqiV zOD>@c{Jk|zCB#%+`BL$nuEftzR-oxctiJEX+#Zf-v|xQlkr||uWeAVyEsZmus!IIX zLhrj#Zwe|-d9K6`W=Bm>%#hKT$gKAwB|13q2mC@rXi|a=G~nR#T#XGOqwa=8b;jP#}u=cf~sEOrE?0oxV6oBMqdMok1=!m`|L85OUo#Z%@kCed9t_# z8!z%z4rEu{%cdHB!1~&`JHr+0VeEe(i%fUdc!qCQ)#D4| zM}QVF2U)|j^`urmfj5_?2w~*gNXG?f?&CejS;gAstQZNu9+o7NvDlR7tn6Yo%km{B ziZV#9hI-~nyoxghnMJY=moN*;%%m?K8w)iAMm9{>kZDS=+l2`-%sWgw-bfdL-;w%c zC*hJsA@KGT^d)BT;ok7fpdy>s@|BiQHf5JQDzZ|0Y zH?ryfm}dN!sw!;YXz+L0=bxLx3e?uLki}5mA|Tj64FtLf6|_{Vwqr|W={-;T^gQxCakM!>~DG)6i?1YxQHbRj&N zsIbFq5Nq{7X)}7{u^4H%gsXHfCCJ36RG~*^0uSHLam|QNJ>0e>8I%#@uXOOh_E#$ozdYK@?{E;uRZ8Gk z5|yylCM1JK;qZ5F&y6%#J0A!3*_ntd1+i2HOfXuj6Z0(QaGmN}hc`RJH2x^OI5Xxr z?*iwAy#*dmaXC@Lrstup^%$TM&UMT5~zASNBR zMko|9#A)YD^Gh04Ku|1H1JOZ`V!V1?FJ-+nCl!3u_m!}clcan2Idnh3nlc7_M+wWt z=<8SR+|^TtbHl!Jp+ehZM6mT8=k)&Hb@{Co$Hi>Pu@lqfC&d2inQUH?cEnSPf^=GE z+?&iMS}9AcRx=m+%k$;Q-HH@NU&+eAPE)|eaJAS!0~eE4#k70(kTRpM@&k%Ucw`(D zEan$~TI>8YRzZ^n7bJ8`7{^piM{%|@ozC_68UAi$P7jw<9$5~SVY=|w6J^azdUqkC zU&n?gU5AFNU8e>tnWPV52dLAD{lH@dVA|}`LfeeFe!i6CAl~CmHyJK^`YPYciFvsP z-U`(CH7w672Nl?wYc`9z-bmZVGYBourQgDJ-gOfbUkAQxj4#PSf2OOy9G|vF>PfOk zq)F;Yvxn?CDvt$Vfk*}G`AYoTe`3OyHWz+=>?fdti4T1O9cZGSgh+OcSVV!&A5Y1eUB~I!nMa_ztxbc2q(c`EVNik2? z@XZA5f>en2ckUACS>Y4TB+F<(U3ijeX0HLv_sX?S|0Y$(vN*b&h{=67kbWe$jNC{B z>imgm;@_Njr_(6-^bQ&=zhE!d=Q-2Xa4`N|T+J(mb8(wt@|#>#r5%aQi9?&mH_DKcR=duo3y z{}7N@rBdqgU%kN~Gb9vGC2QI@SiANNCv4O`KOQj!c+qAu$xW!BFp&@> z(MW7pLep4{bb)sJNTtSZsPW4cFSi%V%KokE=YH4hXE zgcDlkk#bd$o$xH;U@8qJc2cwKT)-@l~y=9-Xy%yywiN?H4m52aoW3YS>_k7 zHNlxkfIGYw@ue8A0_nx-ewAPI9^~fVcTy2{*Fea9`tZRS{$Gh7g8w$H)3h`*6mhjR zuzsJt%iG&HoBc6^XZ$ zZlj`23yd%5%@bON1Vh5}1OBLMBWB;1uEtxpod_q`6HCi4*;{lH zE~uAQloq~Bh1Mo?joL=z1swmXG;YKovXE6_>X#Z#q}PlHb=12J6%nu9hqAV^Q-j>n zVL)o0{O~CcxHhX(*L)-)sQUSeKqXsWyF{WZC<0~Q@mus57U5>@hUHUQCpD*z7oAS& zEw44z5Kkbzse3L!VTUD@t#29gB|LqJJtL8N-vKoMn41)K>&qbGwt<$oN7<&D_*$v7 zAkR?!{pFJ=0=vHc@>ei;jKbAX&Cc3!mr@BT7n%#H$N1Cj?Ofj=*M50Cf(OzC`OflJ z#N7QZ{p<@yok4=8@n~S1iCx>b&hq(!D@+(KjEq9Zmdoah=qv=q`^+sE5CbWM|6J4l zs}kF9VUIQG5G2{p2W;M=4>O6Afzf!Zi98L7Mc@qqMk`EnM2+$67$>9&cOt}VY zrx>a;qmd>Jj(z3usNL|IY~wt#^#1kh0k<0pO&K^$G8|qE94Pi9r`p9x_$HldXGVr1 zT`E3&0+C7OTBx6zGx7pVd|?JqbLx&dWL(+`xvcwTx=^w4Z;P(f1x!krbPPujp+Cd0 zvyIPIlCq8a(XN|#46UG4wiv;<G?2yUkvydctN6z{J+Jbjw|OXxzgmy%=Eu+N&E6wN~n9*EZ#zHtc+vglIh zpq%vdnd2hOgZa^fV;KJ&LejBHMtW0>#9YC=q|Vxky9JYx{Br!8RD`$#VYp>kIiow2 zJOx}y9}&xAC^)@iN|42?)v(@YF0*&D3M9li#x=YcP#Qn?!~xf6 z)pWhQvW$^sy+`M{E9@6X#0Fmzd3xEr!_m80rTOu56Mg!c_LLWHZ%5SYcj_%ecD(3E z1n`e;>7p%d2N=*qWkJA_&sCZ3DYPG($(W%f$K|7wMOK#x9^ne2x+mY=Do!FYe|M{R zL|rZa&8;#-i?uc~$8dm8BSIWI@po&OXm&%x!+YT+{7bir&i~EA`zK2MX~LfPH-UcW z4ZJ`~>VVDk;xS&l@cuQMCB`9Y7(> zsrbgP1>bAm4~Ty|y7{B2Vs7L2@p}81{h66CK94#a=D2jBB8NQu10Kb-e2AFjow+NH zsJK(mbWuO@!bX*Wd>?|4*=$YIL8&dqsVRGem5>Xh9OvxX3_26BKS01nsI_7Pz+C4^ z-Q(0b2)E(9cps2a`|}IC_7n=&mi@hqwWWQ|l&z71HK|Mu#S-m~w3fv~tnGd($|O)S z74tN@KL0UZK=^kb+N$sik`RG)6$~g;!z={7q$0pp7YjPhz0}moI#~)tyx>vDoXs{N zpD7{@&0MmJlF~Tryw0MnHvKcyrn4!tUKr7QKazn5v58hrUDx?p@M1VI?`chjRC**U zETiY4ZoL-T#PW_y-|sxBhKrTo=}Dg&m1>(*@z4V z_>39ve&-=$Wg?o*$Z~2+i>p9b9Tiz6!FWR~6o+J^nriI>prwnIoF1ps6;s zQRiZ^6s3n0N!gY9Simv(Ufeuh&=NE6BJ^-nYR6GG6%uTI*_j=7B6gC|qMAquvSQ}j zkWEP#)^Z-GL7iA!ZkcVf{mxUKj*>#uL2(rLkdSaXnw^O>nxm;rsv&0MKvDR)IMnIP zZ-8r=FVrxjjp8*`*E7P{&Ak^peup+^GbeNN6c~<{^O4=xQ3_MRD*{MVF&&q$A~*37 zjQWKl#7pQJ&kxsQx^sV9;0D~)2cQ|}zqpNd?!WV;0X#o#?q{OIb-~k5c*v`Y=Cq)$ zphkdqaJ{CM*LQ@SzM!AAyuvpp_;Yu|J7<93`C~HZWoco#RKAV+e;*xOB zSzPXYI{D$KetJ*EA~8tJ+1FDMSBkAQ8cSaQARnA|(Rk@3wr zbff4B(i7^paBc|v_Iqv8p`xx9h8ov#FWqv#ae5qjzPvtBf7e*Q-7y&LW5wsxezffq z`^e54&%1tOo0ij@O?-}qc{9h%3hJ$0Q3M#F;+8}>tE)XE6n|!6)@4+LU^Q^!x{yU% zkBr1bqh>0XqQh3SHEMF(s3%SlM{N6QhdJ0zDWXKxnTwT++w4TSSfF{{%!*ncpJAFD ztqNU~xJv>^sME9-y(|aL5cLI}2sk2&)wMG}{)E*DNWOe5e+b@s*&D3tW5xxkp}N`iiB+wV8y9%1f9f({RV_8;ny4(uy-I_esgQ#edJ-MX`pe5L>C9S0IAI@NozbG(>FhhFs~?@F-$}L zcVFZA$Y{O=U)uX?o1e}EJwQYLN!ruHT#|7vu5p!$!|Z6cjzXf}Z+>NQ=* zasd?uxScgh#m6@GR zdM{9a{Q0VTs)4PmcZ7}oSQ3$ZW2F{-LdQshC)tm<6A_T>Oqn<+(`_wb%KyGrxyo%N zCnoMTb9<6V&6&ame(=6j=GfuZu!DxChN$_Vq*UbrOl=UaOF$ z;}>s&dCF{-Z~wG8{9I10>?O38x#s9+uzO|AdG}%&)$Eu7Wi=9KCLsc9ShA*vn+RRYyL(#1tkBpf+veSA!ZcZIJ25g-jo15> zifZ777BN%LsfEl0Q)#pPWrUPoUXZW0&#+~a>Gv(6G13M{WD6;3kL@D|EoyRE7?`gUh8W3x(r z3%B{+N=HL%IKXRty^pm$e&~zw533}P=JsJ+M2;D|EZu%mcgkcaenxks=^8;Rc!@cZ zp=17-5${hg2osNr7NU7YCzN)d$cx#h)dS;>!{m{UhbViq(*jfnh{~Ie^Xa3fj2+mO zu9b(#`^k_}qBs&I_xT9<3@meu%wR(br0EjGF|!1^CLd+ehU~&u1q|5(P#C|QcbXHh zogaqCg_eUl>gK~lIvhCgPYxwsz;+dEpwL6S*mtyhO?K0WI@N4ZKUL0nrZZH=JwyyY zGsMPB-EoDMZ?-#03qVH>EIqDHRM-r!O?=kHeKyAy{Fzk`Cm7=(|0w;KX=?Rf56>(i8axMLg=O48{A+X%si#>WPWOK`w3 z&Pb<}dfKI+DQao-R3^PNN=?KBP8@0tlO+n?#00JdHMsH`+Da`RPbQ`(?XF{Db`Ofr%z{#GPd@G}}+_A$T&!O>bh&Bj&g zIkxwf&aQcH_Qpq;jV}X*+9E7~jWPXB*tEcg8DDZh-&wV1?2^zXEOie9&!(O8RbfG{-_Bq40CskswPH*Sy| zEBp(j>D}z`M9V}=Di~W!Mo6MErbG(!R;FeN-KAsT?{VCi@MiyuTWxeSPRgy~G8;!ZAPX3baj<|20nc0MpMbG#c-{o56kQ%Vl8Fw@2ivGBVt z;gz$%<*0;B4ww$ZGe5Uo_s4FAbU?mW1dxZPyVs$Od5UZtQC)4o*q)(y2Az>_Lksu5 zXN-0)LkR2vWvP1tkU?IfcJN-NoTqSNcNlOBIQ~cW>ta4BM)m2!9X&omxmZ~h-AhT= zh@s=I1<{3kp@2`eaiY*S=E6UJ{cUGilVObCuXlW0`qNnIuM)<;5t97JSnA)9F#aL) zRYVAwg9#vr_>iVD=56B;!uDiDs0EV<3)Er^cNUeW+)dBXZZHd0CW?I7&JonK|G>Uj z^m?QOdHL(*H@JR;28c#Tc36rZB2mpKuzJ0QPR6BPF?CR4xpmb?oS`A+iU-3Zy4w6+ z0{M_WvLb4b)#HT!H(_6V^W6$Frd$e~X%aNxhgK ze&-Mpe~K#omDqm$w^_#DyxjjgtxeeaBQ!DCMOl#000Y_YmwWFc72}IRS04~SAX+UD z3-jsnT^t2CyQHmHS!MO2UlFn}zQ0-EKjjDOw2EiY{GizD>X;q8w>V9w(tlsy{&4x= zkldh8h&x0Ji@1*0{o&$$dAHqq9YWu4eOClAvPerDB|r`2InXC&N3yV*9LrBFP-#bG z3s@98Wz8s@v{7q_K?4-4SUP_nJqwpeQujfsg`OrdaJllUhd;Ni8mUu=w~@50$N04s z_DWfA#L!ambd@&O^LCOCWGZ{=ESI*E4Wuel%e=LeF2;{Alb8=$9oI7TcxTTaVD>e$ zNd7b*u~=!$6=^wXXU-M<0D@21y9+!TzdrnRX4I)%(JcDX_F%5T*||BBzqxo5Up^-r zW`nUokb+*CFopNoNkaW+C1-dz(epW$hD$r~($Hq{+%^5;I{y& z1SllW-$1+pS^X@g>+vnEiwyp^t(!tjsL#zAYLvLfDFuzcisKK_ckWx=lq% zQ?kytOr9#jAfAU>8JUfrhmpIY{(=&V@u?RRm4)$G@2iK^qLgsR7m_Z*+KjYKv8{Pi z;jZjAqtDoRd0(l73)h0Uhe;}DzrdRAB@@7cESfjrq5`j6vAuU}e(pnW#}WP#1-jj$ z{{h5W{g8>;@9zQpzkClg|LtG$zwsXY&)`DhKUy~-sU+Qfy3oJNDy~UkNTWK|641Tq z6V4c?(dX86ZKO98oq=SbAtZd?;Z1nzXlYfcC|G4CQ!+B1GRD%G*Dm=xy}=nm3mC8% zaRiVZS+Qmqumlhu6I`?Vg-G$tTyX@{WrD7SLyF9wQ$Tib$bg!3qsuYeopLOVp6S+h z(=+T=Gj&Yf1J2peaOQyarrGm%B-K1zVOe^jV|QE|IX2_Axdyjx&ZKnAbh_uYKC{cA zw<9L4<5bEw9z>eVZLqL`5xbDwkv=MrSVVCW)SUI0ydu-(KD)etw`78dd-wvmR8K=& zlR8xxSZ9zg!>^r&eOS07ey^PlD7D4Rr6T5r?Hz{>x~T`ojO3d&S7s-ru{yL|24Id# zqPqm_gydVf_1;7-RieX(7*Oj%&7ksJieG-!n<|nS(F^sz_T_&vM&7)#6sr;>o7-7u z49%%4MFkC?anrru!=P0I&%m#841pb*Yr>1*k(&KpZVPkVyD8#^IXLZt7YEn~w459c zx9!L`xM?pLkDud2<z3aHG*x_D?^_U7p{S&0g=BQ2Y}FpC0E>n!Z=Gt zyWY-HaaBj6a!{=p>y5ZT-|89CsnhNCl%dOkg1&K#ozw>=nc^ z;}gf#ig_&hAvJ9QSAh9mnf<(3y4F8a6(JjcIu_#>AQ8h@Pd*9bIlNoU=N2_K;?++r z*f30ftyxkI_b!qx2bukYPkwlD3!P(}>ap9bdEq%!&pCauoTuP6LQanm5MS~N;pt;L z-$yHIfi>H>UHxX6J%STF{4Ec%&K#sJCCIHHZq%P`$Mn18;$Se@5_b)b_BYq`xVI zRER-8fyF7#MiBx-MWrEdb3ZUmi1 zniFH`i`H3_U>-)AzBE$|jIoOw-pV$`_hebwu??q2m3Ehf+bAA?0+x+6#FEt;)TN@?hJH@$qBSSA2xqzlQro|b!MI7l^yn0`uSXo zm%YqY5u>R^1&jH;m5NM4w?Qg0dJ52GBuang3yseds#-5na(O9s{Q+J@T8z}~+C6pyG9a)Vl)QNv8nom_R6-={QPEi!W%oQ{-KMMBE>g4vCj5s3j-rRZ8 zZo)}wm3n($4rF-?P%_A>3Rvhw5F=hV_=qS; z9by9vr7ZEHIJqM1#SRL#BvE7}MdSPK{{4`?!PN?wJ7dZz+)OMm{zRoo`wfg8Ausr~ zJnCDH{-PWpZP*3@ycsgE-NP2!CHRTp1huwHDp5!v-$2;Eqvk_O=hh#UrDpq}y7dl; z7yl9xHU0xgGo2#mmNK6wTvu;TNEbCZWEo)G7Z>{eecF53AtQzPD1(!^&ga+t51|hU%~?@M>9$6&t?RC6 zQ!O(QaWJwiG5&NlE~^nocA_k%A`Y_UC)Vcf5G90#9fth_$L)T6?5f#YaLC{=pElG3 zZTUd@ErCvKyDFn3~hlQ4dWwq__#_x{#qJ*`?B7Gz1LPe-y%JXm(!S?s-7KMVjvujiaPJE7uJcts2DEfD8XoV^ zZLke^+Ru<)t^Wr&ty>s-rde8}Op-2|E~$sBN;{qI{&%XsIjk&2hI2 zW}xu*WHHvw|51$=D^@48Zm7<`VW)Y()O5dJ^Q5q`7$m45OQ)Lp$vj;3?S6#VFPeKD zt-t@o8i&z!o{?Bpx@Qbv@!ZTD2F^VH{7cI2O)xesfO>yfo7|M1%vVu~Ik(^f3MHgj zhX*}r%BPf%GfA$Istzdzh=eF(XoNK~)ZR)Tf|BLz0+Pb~?QM-cfy(wP3eq!?Q#ztK zgPMvq-MT3yy#&ov0aS5o-w#3B5=$S!L`jL0nlAVB-8NXB#2UMO1clywZv9n{j--^L zPZssSRivkkO1JL^%%=P`*`}d7`{SA_;@1+tGOEo%)|vLaU7hwKL+r*fV2=T+ldImq z7oL(`aL?l2&-{IrfWuVJs>1M+k_(dhw#sc{RQBn9`B&Eq;%0tTTcrW=<-G00(6#2g zT_w-KYLiraaSMD{Rhhavzc#9i9Esp3?E&2eLj zEn~oIQ1#$;%utY1nVeMTC(vl%Hplsgn=7~Yyga4K*mGpe?QKPRVY~|LPf-fH<=OLY z2mIpBm`3uU!J-z)LD1owpEhRF+&HL+cQ!?smCWssdlPG)PHvW=-)|38A!FdhC9;bf z$lA%O@YFs}YoUt1&#zLno540?qUGfoh<`37RhsZ@75N;I?3~YvAsLiXN)@=fwW9CE z;82`7C!fpKg|O6D!#U3_5g0ijmj0|DHgC(>sdO)Rz*@%*;Ps@!rU+GlUXjZ6qLsLb z%}-#;SNminA!nY$x!$F3=>EhUiXo`qX7dUz0xi!(kLU*Lo1jX7E6(coo>D0r?D_WW zvj$eGbc|0cweS4QKaM1!^AJC4B3JNX`#MNzs3^LS59a2_@0;uRI)n1sPWdVX%q;1n$`R^;P%Rp3<_Y^k zr+_2-Jeb8YmebjCCsr<@e~xQ;zyCXNNnkfV0~&?@dsEvPdbyG7@yL%YPTzZ@`hnr; z0%*%)g4hUFx~eiLIg)C#a{ma4x}PVBX(I%1wQ{F*{?hPN<{QnSg4%tWRI1?0NveBX zDL+0bY?2sTOL(P?=)ux!7ao^Y&#|VxMD-SfqyZ?MZYc zRYOnehOZ&mhDH{?YEJu;p|1y)|9x0u9Bf@+^zLPGMEvi=lE1333jYDp{r|_-|4R*$ zk?mtZ2+YcfMxu%#cAODWYjB68`udR&jkCv?3oa6;trnT2a?lUlmZD!-`#a<<3;(5A z{^gICJ>+h*Ffb9{*=)<*c=d}6bpLx|r9Dty(x8)oBJP)KfxB$R!nKj7j(iz88)I7s z^yQ&5!AF`si*@v7HrL%8ld;ca*h;2r9FX3oqj~6KLXEsiQ-*I}HLT$DtBd^)x#c*e z*otK>e^5F;6r2Z&`9E((FDUw&{;Y67ou9DH@c>C>sI3;fCdZW>^8djXxIcfq8hZa9 zN&iU<`s>K)-?-oSUy|A%LBYRd0}IqFl-|R~yi9{&JJIovdG%js7cqhfXyGuxAkPB6 z`;vUZ5`2z67zkdD6-%Vdd=2nE){`*xOQB>we|#;Lz8Gy}7=$HgFJHl8DkMN&%w8Utjl zUrt*6u!!^`?XlA#1!%%Q9mIM~mk&C4p>cmI^jjdl5N$$TrAjX-V$D^+C8AEF^Qp?l zD`~LSQI16uOS58TrJ!$f8it@SLyiY67%L|%2&u%tG1G}fgjar3A+;h+E+?D2sVT)N zlm2o-PGgX-PE)Ktn%a?~e^CswM%>W+I8m2%75giA6G|b}Qz1 z^4;TXo(Xlqep0v_zf+SbzMhXZYf^e*WGtjvKoyrXYY0k_dw#fb&;_qNJb{xMKOL;h zVHG8)&=9k*UFSGJRwc2PMW|?l_fnlLf6Yz|{7cpMuX~b^02HDQq8o&(W*}+SEp4K4sZs(ODyi~`9W^On)88u4^$eH85H|rkupi~DKWPBgV3PS~Vm1K* zrsCyby;His{PaYk!*bybiCN1+At8*sJBRylm)gMsl z3mnc_F@U-F&?4VggMJx(MKqG8aNGc?Rz;!=Pe*Dg7L{VY(6mGKH7*MM{_6ymy-0V0 zf3;0Oetw>D~2S**)EutN3mk+_X9z{@QgYQ^e;Q(1Y2l`?$7Ge@1|=tOx{AriJF zXDw?6{{*#3xhi6@)koAMj=3ioRh+Pu0hzAAq9-_8WRWS3x{4r6AgRq2!Qp<_5_#2e z$lI9aQ|^r|{W0UmI8>Vls*(w6j+E+=Su@hfu*S=0#a9^v%%{!|K9E0SW5(8OET?z{ z@ss=!t~kA1TU|>ED5mLRu!M;=zOI&a8~RJbA5)Y!Pi@JV8iS5g|GI|{;YF`;osHW zDo6FRGzZM+$Lmkde5TRIFFM>Q;6%sy6aK>X63qM400SIk$kY)k7OV6@t)OqIKs>|= z7Zo6$V533wp(J%%TrTNpEtTxs(hcJc z;?%uq{9^#`9l%~JTxl-0FXMY!m(2e3=4EE`_>T3L$IZ{F^wR?S87SyFxEq{zckD;g zQd2n3&uLRLZ}bLDN{$iJU2*NXUv|Nqfp@GCojH9T7SviKlP@ecv`=mHBy&TwzcZH~=)J-IcpAfK4uxvp4>Wqf{da)*t4JaA zZv)IfOwZH-@lTEg5S-R3-gX{tczzw;wt+ z3v)sfMAezSmfPNg@iMRcmp=b?hEPFt55FIY9aZQRsg$XH+}0wey|(X;MiWACIW0dM z=#~{*{4vP{9OiJ9H7US|?hVGb0NNJnrHn!Y@g-HmAy3m=^9AOY=nHZ`?!($mb&b}% zDzyjNT|5jq$yvvROd|UrF%@!lITHugIe7CJqYKRk1y__g8#80vcXLQcQ*DbGOq+&N zg2^W$jEmPUOVG&Q%pr{~4DoBKV6ZwjkFU*77RQ}mr0B(OcE4nH2u8(|dKh5V`>E6g zdgiwirTTGOh|AGg!;PTOE+@<$T-mQtvK~AShd(S>*?hH867M z7q}Ztf%T%70>PazmKO+T$oGQD*{ZjuMU0^i$@#ju4X}37AHAa_(=oyqk*yXT0z$s@ zcM;xEHQ5HooS6o6>E9WBkC;}~9~3LpOanK@If}Vk+N(E8q&X(+)h6fJ?aQP6xx97t z^l=;A>u0--+sWVb@om!kMTK`Ufc{Tnz+Wkn>c9O9{$KR*|FPNUzuTHB{;9Xc8Y-vOKiR^tHcP)4PneZQa+a{|B0)WgV zX?*-*g6DSp;%swDZ_DRHvgk}e$h9t#8?qM#MlwT8KQ1j9oH`i*r9PR-cBz{eq+DI{ ztA-LZPzzKJBxQqW(yscZvXMya4DkrArJ1{<<<#>-P}2sYs#tU`5mm(@ziHdDxrzjn z$F`#-v399Ijbxd8RH5g6TZVRc^IjQXB({wX^V8^Pj8uiFiuCpC~v{g z`A9xp)Ny;FvywaD1Tu(0itW)$;`VZvm>sPkdo?J4+>Jo05?P!)m@+vUGx9p?46<{ZMSsMs)`1czYx zerL99szKD|lw9&+c9WNsaGq&rZ4kvn&Gg&;To5wiZ?N z$(i50YZEA4c(L33%gX3PHbDkq9zL+BgsCu=2>dLdpBclzcXMFjCwV9%7X+nk~gQY zNuHNLSTubn!;wyd_lU)&1$P2TSlX5X42yVaeWdZXLVazUO2K*kCA|hrI1ZdYA%Sv2mXt%N!kP08UhqseCpX5C~|2P{-R2iNLbwQHZI^FV-4wV+z-q*30`dTy{D(;HlT8~v zWUuA63ZZ63k}%gH`V7m_2fFS@YB6F-D2umhlrY@~W0y3i zE2lU#8b8yZj{9{c57}-Uzrq1bl>-4;Z(5b;qo~z(N!~;mB-yG(h@>ZV4ATYc%x-%IV$$2r^?%K*XPFADe zOYoBgL8pvt!7f!Z_@jOARUh)Cclv%74aA<4Dzf_>Eg7^N0K=wr0KXkfRjB2@{f-M1 zu;QhoZY>tll97Ldo{8Y@Dt}*i8?_gUHh2-NDtE=UcVEF?{i>Gd&OCZ^FMoO(yHs** z>aNJx+0ID7G}vH%$muDMJDl9paU>KV-Glk)d5(^-qFrijLK1Gm3k#GqsYW$BIcU!m z)d_pPqLa|zMak!@TMp`f0T-G1^-z<_C#;(L>%OJ6?1|Q#(XlqXI@fS1J1-lz5!kct znY1k|e1q|DJDt7N;d82iibJZ(J2BFG8CpJLXhs$bleQA3U&D zQ*HS5WP_B@;LUlo!?+l^DzW1aANbX{b-p7%E&XzKFNGDJy|DP+$Nu9n%^me@Ssn>O zn;z#}@_e(7RDu2J@rg*w@m%y_ks4E)L%0Kk%1((O`X7|hPkxB6xINE^{z0OO9dr(e z8w7B9_JlMqr5k!FLOn9n912Qae*w~^=Y7K1DXL)8K3b_)3dMezKD`urUSvNKI|$Yk zoWHprFhbngaNm%T=D+1e{;x<^|DGH9pQNkC|0G?Bql}RyGNW$$6mkUN=Wuu+BKmbi zpu+bTpE~>&PtvT*B)Uoe$O{$83+3*?G3=;kC?G9(=^@S>&UBxe;IzNKh|bpT1{~3= z`X!0_7voAuqCdWd)(kIQ06-rZn`qYOmXMgnbhkE;1i1*64K`q%+*6udx*8(YKHO{P zB$G4f6sa{iS;I=a_cLeY-s@zPfK+TvQ6r&)f;$8CJ6|QF5I~k?Jqp4IwF+%5F3xvu z{46Bb(NGx^Oe!fRBbo(mw0zVBDFC^Fo?raHe#FqGq1sc5$xieHt9XHZtVZFS#jbk5 zxo{;htUD=e#D0*cRHMXsBDG+q>_$n{cssWgFVm4jm|OoPri*T=TlpNobc&p|W)v>_ z88R%_b?|mUttDCcn{nlwC_9zhw~6She`Kh?@q73Oi2LZh0?l=poM^1!Ynk5FWLy%K zU?Fu#m@X6N4K-TA?<9HS3a04pYJl8NA8Im)x!B^=MTwI~nd@LTeo!$PHs@cGgbn-m zV~KZ4vLHkAfa>;8qtM(?1!^`C5ueFpGcGi6z7@Ci9 z&6nCRla>{R%Y{luQKZ*KO-E))VY0UwR0&_T4X&DN^W=*ttn#|t&*+6^l~78(+BO`! zdsLp@7H+Opcv)hp3!o*%7twBHJ|)F%In~OXpX@WDTbc}Rp=~2`@n{?%<4{=nRP-JZ zDn;yG5iUnSkJ%=TFq;d+V1OIKu#HX(SG|%OL9X{#GiXw1tdB;OT=!^>IORQ_NIP%z zH=OvKz|#20m8;t^F491?2rAz>YY;H+5&J*grtKL}qh7$#%UNFnF+ESH?IRNXO=w=I zMU?i3$#0+yJ)mF-su@5^qUTvbZNr5`@67lf-huy`kS*_8uZZ6T$@_23GsOSL6Y`rC z&ud|9ZD;CWVkv51Xyx#?O=wCz$)RrYJtOcKgk`I*J8yE z@<~PzT(GZ84Hz_FZd{ew@D5ajC{#F&R(b_}%{QDT4w&2oh|QB*y-Yp*^LCz5d^PDN?3O;Z8YC6Osqk5Ho}mqR0458_AvEE{z091mD_BWJRyz`sk@? zy9Jsxl$PB+A2S4z=l0Hf(9Hgl@5s7ftm+Y!_G3gb_|UG>5Eab>(bMbCW%0h>>_zWF z(xSW_4@!kw5vHkEnEdt*Ch56`qf=l(?BMh8qjq?d8Oj`)#i>yNmNy?v&JwIuQcW%H zMxnZeyhZ0hDkH}hd9}(a<6z^A^+h&G77#tQoJ*HPyH>1EzNxWjJG0F#*_4v7n<>LK zwMSQf1h-I~$|deL#!g9>X)8CN?PjJ}2wi){AKAN5+wA))do65(8Aem$zS!K*V72Oo z9{WR!Z9Yg;0|+1*FdsiME3iAd#07nT3Bu42(nkRv?3ufNq#|zr4bnjp zlN{IOPk(jk4Uwe=y4ZXCPy^%{{5|UWVdzD6{_bpE$JQ-w z{tqEFg#OKYsfN@olpt|;SJUoN!0Po8(^uEi&X)XnGi90N!q?+v&QYl563e&tLzjoS zCM=gUM(=YXCTKndc%@|}Y}BZoDzJpk8^|7 zpuBGzNOOa!eXQbV&VXk=fjDh`K7a{vp3t5&5a)j7o~WHjWH?-% zAUgi3E%&Re)Uj-n}ZHws zwSy9+DJ>nA3pA~TZ|A?3@mdD$ljcFvPLgBC=cBSekh__$Hfa}DA?vJ}!=p71qjP*p z&Q~R>@hn)R>hhDOi?lCW#vqmi!gPYUP4o1#3Y8udrmb#U_c{YLP|tH;HD+lHE%qRW z)Uw7D)+TI;f*ZsH6^(7Ev9M!t1sy#;N!WV-RhWT;_cj*@gH7zFiI2F~M6LloL{8IacD zB9VtBgsAH@q=tZI>~d(OFTFgd~rU4v{Pp} znu&86sdXaZ`D*lzU(wd(Ur^EkeqebJQaf1S+2l4n(2HHA`baImNm=|;{CJ^k&-?TtWC&T<5cW8ZL7Rxdqp$k;D$_t!XI-horIuUs7t=i0e26x%6)4J zb~HPNX*wYbZT0Ry2Nfx*kAyZ9mKXOhHgIp5+-L`W+?|iilP?8iRF9% zL_fudD?+Mdd-(w;o%Ztq>PD70Ya#f-qKMg4&o?*P={W=^=h*icOh5|{wa1*HAkUis z@e?|78elrWpu5K$7hQ;aw-G^!Sr-bfcs+jjozI+H?dIncJew!hUPiSc6z^>kW~h+2 zusqrvHIjyE22`wOzoHA>)II>N(gqH!^~iAj=r%5=JAq*UKDo(M10-KH)nFXQ z-k?e|F{Z=ubTD0g>bw(RS9sCyZk*3GJ9HJt*rlO14a9x5kzgGFsW$s8sgRfjJ~+8y z>|%!=5fRsdNm5BSOkO!4Ff!ma%_OGN^8F{A!kb z{m;*%|D9)*7{A~*56VJMSKs_Ux_D;nrWFD$Twt_#2!C7>4v*BSc_M z(6)#xfU#5B#a^TGmSln_BbAE}7h;)w;&0wkvc)*V%vtBDiIHS)@2{UX*zfR^p_)I@ zTDv~yF2Nh3rMrmSiV|m?D!iiLi}oaPw$c%d1urb9W|LfqZ#DF!^9XMF_6%`@tj7uw!`LgRrSGqL^#5&+lWZCcqQ3?|8^%?Et#feTkXexeBD)O=6DPhoQ z1*5gErNkC#14J?|UZ{_EnLA|JQ_Z}2L;B9Mzd3coCYwWaw8M;~7I9IDEjH6z?w#bL zwdatW^0;T(^?D83)y&={j<4(AN1WocL|_K(g&mq~-t|KlGpNGU0bo=0wBlk zu!ZTdYvpcPgkiWahvzq1a&5e)m-+M{BMU14Vdua<^yjF>lmw~w6D-W~(95jnb_HT_ zKwER#07TywsI~tM#PAsp!{~nF(}myrxc~Qb{{O`m{U=Z@YGq{o&t3L^{I{J-=6_pp zV#UVV;#TbeI?CQ6VYB7s@yRgZ>M-E9tB|RwEuJ#imKYE((&yiheC*-Ol0lXwl~sOT zMAtn%1prA%_))ZrE?!=xwjO77JwKKHdApqM{sFZg`g6U95rG!U+oj?-LE-nI%X?iYsEc5CH`xMEi>N) zhzN=QVv&$vxb%*cUz#5=$iEBfDDin})O2|{U6jg(*_s+?%=Uit59dUL;u;j=aJVe* zSsrc38lUpXC22fh;aQP1L)frQKwUi90jJxark9jtF@e}!{XDc^SMB{yX1Z1{q6!(6 zV}xJp8%{S6vO((Y1R|B{z@*9}8aI4I2NC(vV}(f!RcBaq5lvxL%}Gz6GGz(r>M;(u zkcaVOG_w>0Z#xR|edbX!fYm&T^*4|(>LR*w(?zJn=|9{G>8>qZrC!Si^9t@x0Pi$p zCkyFpw)+^281^cdU>ii$T|$JBr||M8^&!D0XeX{@MbWOBc+3v1zj&OQ4$aq)w4&N- z$k+=~eTy;t+vpK_OG=KI5hUFi%8nowd;e&S3#sA6vQbl-dR8XJDG*AhH4<4Dhv@11 zvTKr%Y@42lndd>LGpM1A-VbOSX^ zRj@d5yBTI&?F#Igya)K!Ye@_M{ zXsELv{J+{%!?*mU?v_uC$F-Gb+i%F-z{RJhX4X+Br)4MT-k>V=f4!k#eqdYu zq7O9};%Na#>i_VUMc+fkA7g`7#=kEAhr83fg=YNs-r?%sa>x1pH+zTgMd07u@&DTm z{^{ST`Iq1_Xqz&tMs$u$h%-Q&#;%+Ue z&cQ6Zm41uPvD(;7%qjNBh13CdD+r#@=kWj)`P!@C7uxc?M z36D{E8TNtHffx$P}!G?^BIEP3vd2w|yky_8b|M~PeuKYvMVztJ0a>#Lm=B!Be zoawH`FyF*NP@i0Hv(FOJ8P#q&p*rsv3a#0pC#DiqbF^kdp=%>N7_0Qz)tDzK(Fpft z$H&}osgxE2t2Aa;P#%iC4h{}n%YHM#9H~rc|Eb%u{1vk zQ{)$L8}`d^LxNjy+>^n>J2wA1C-iG0=B4>nuyvu#b>c(5kaO|E#l8Mjpxl6(Ab~Vo z(X+AMSaXRtFfGSxvI3N~RN;yor}i2BjT+cISkT>wQ;=YsE)KV#t)IFIASfvDcfS{iBO4ramO&yOM8DK7d?nZCoo79XJ&Gg20CZmhrZiIIaNh#ETMrnZ$@Riu}BPJQt z-XQM+@vIpHmh)f`qjMIiMpG-`$Fe!G*l-#mKeghbZz&U)rD=rY@J6$A{_IQFXux+Q z{LsW^FXl0F`jre1L*BsrlTKJKmO{dZ;se+Y$sGJ3ap3FhZ|7x4y{0_;zm9YN1wqdEA0p*bPnXwF?+GAs`smIE1}|Iq&wG# z$UmHGGW$Oi^bZHMh`CNkD7ndp!u$R5ADFcnBoM~K zvb|9J`MJ=EPzhSH!%&pv?t3yeb%>*{DewIoR1VQ$L%0&thz#Fp|)x75l7j!2QJ!k+oXg zYRL&ldPHwcsC$rJTC@z6Y*}u~8`Gsa@&_7*WXIyWR-rw#_i?n}_I=-I&g#8F%}yAN zf`MvlX@+~9!uXTlT(ZF+P5RY44loe}(P@Oj@hz+ZZUfE@k)SBsorJ1nfEM+cf8N%N zFFfI~R9+~=l=Wq&>wwxSdoJk_J@`=CWq~4@^=m1GdMxnBBlTO33akE$jFHzJgc~Kg{`+jtu z6fH#!ZMOKk(>%|3hV4eg%3Cj)(QC`zw*qV^gH&;Xau4Lgy8zUhO#bm50L2f<>?=D! zCEKr=X2s4w#uv`q4av^yiqn6Piy}$bKpPez4Q2EH3Nj$_s)N#2?i;>gxD%64;=x3F z*r$q&J6QBNdHp+kh-uwF@#VYd7XQmI_}3dU_y2ep{5Ln`|F}6ds)6ey3_f~W+g})| z>U8n6MB^%p0PJ%0;faF5iSQAkMwHZ8FzM>ngQr9LHM{J4$_U4De zn^g{LS2nFFRVr7iRexPidaPa$|J2KA?Ao4a-e$hvN@u=)Hrj*a=6nMB6}ely;Q-^A z$#;Irjo)=Dus!E2^;VtURgAOoK=64`ke&I^5kES3LCnmak+HKU!0dQL$Xt1B;4wTU zb+Ly?(w@07I*Lu=>?9BSwl=8gv#}_-sVX{dCy!n{hO&7Oenll^ZwvccSo{%pu%~s` z(H#B`_T*^C%?y3~hi>)<39N%%TY6nfcRc9mwQwlv#Sz|ve?w54OG*bTMy*tD}zCSj+GwU-u);jpaU$oTOAx)%IbR7T?Q_TnV;H_LL&I9syRJ!J_!x0r<`D1w;c_e7c;U9v`?8XRoc}hSK3S9gd9d~&Q1S#hSq9P&X z`PFI{m`HqpZw@@Z*oyl6&0zNXw?s5qjH7U9k#Bb6i8C=ix`ckWQVD0#5>>>_3VqG> zrbu1poJU2hVQa5kN3NKUD%h!pPB($X&8v0H{St5`kncZEB_ZITWZz*k?}?9-XS4)sw?sZ~#xENx2E+Bo&L z)anmWz__0~(upue@2+;F)og2r@1~4JM?lp2^CeGh6-CXO#H6yFEz((|P80m8xkcCW z9d&j|XJ~^1O%*U-dZ?eRNXOE3%mov&fM_U7DktA{5qVsaLgg%UeRCSn*7M&w*j$VF ztojqjD&Fz#!0kC`VFdv=8S z9z;*y>NdAHQ?cbHroIUiRbJ|3rl&TYL1>boSyW$9qLLQN`+`qnYt{pY8KF*R1!r~_ z@tQOf`xCM=x2$c=iE3*F*%~Qu$;IEdY>9ffNJCgB5>fDVMgOrTmGnH>F!ZRina4?s z?#-?Ii7h5GtXbw+&7dOGZbm5i!`pAtGhSqm5msgii?C zMwOz&IEUdA3F{?YBh5j1dEA)H$YeM2zVJuz7$PV&Z18}>k?mmS?b*W8&`NI*QdFa- zOFARJYKxU*4jC6r@X&DhXI^s|M4{G&JEea|?$)(=8pqkN9Y@6H$YFRE-4P~Uv4AT8 z^7PYN4F=o;WVDQ(6}G(@JqANXd7y0xKs0pbhC-R}50m8oj9h1gP6o-cmN<(b^+Of|apo-^y ztf&lIo%%6Y=w-jSLRpt-1w;Yn3(lkGFFH_|K{}TC7?*AnL1g5JNadfYW7?X~^Y?(i z49W}=sMCJRJ)9WjBx%^u#Mg)yzxq9?vf=T=3|`%}4b@C@v*Q|XX<1&3$kKHLR~1lm zI-gw}cHjZ4DV)yH zz^l;R!{2-#DAB*>ykPdY=R2jO62@Q9=@)mG((K;kpy{QLt3tG189a>vu_!n<86?3B z+PUEXt380h;X#{yxhsyVvr>rNmO^zmqtqoK1#6p)r(!p6YX-eoIR47j*+x|n+>%i$ zKVdq-|9p>RWA`z<*XgDZd&(#o2zFEq`YKjbiY0xeFK}GW@xbeQA{0 z^~I=5kfL*OwAuB=smtH=ftnH{*N7pIf#Edx`1Fs>O35qKHh9?+v!~7kFKVGMY~tzc zFFj}jF+MX)#-UN?&?5B=kLKX(-O8u1hTl~@=uPb(az9_whb=}Vo$snSJ*c;b8CvsO z^m%!hd5NPWGcqhKF9#C*A&Z#rjx;ninR8Jn2V-@Z1RfW= zgILqBd}U#42;Mrhl<-s+_G~QmCQSLmckO<{|2E>}&5HfmCm-elEVSuzn16c5-f6{K8dn!-w91F z*6}E{wYwX93Q}`k(RbIU8i>6$+RpJ2!XY+7PVsz`AMp8=5_0~)UvjX!IVV9jLaxow z+wWemPu645tJ8D7JA8OZB5;wY4L=SE*}KL$3B+1MQf%SH`wGM!0q2%dyr@sYeY)#; z=lL9X=*k)h{Q7oGJ6r8`vbv61QXxPm`OSKW~?3A=uTQ|>u}>G}}1iGQud zmdTq`<)j++9fKx#c}fJ$(rklXU)1ZIwJ=3|+~oZ=0OoTxz*IneA8Y50Mpewd)gINg zCwlF-Q^7#sArY~8m7yG-ppW`&U{*|I(srakDH zfSyJeAz89*IYwu1(6@;^X-$;ytHTZki@|1$wOmhw53 zukMhDRc^Uo>Wwf^lItX<%G&Z~IAm=U-kFT=u~LmVpk^ieYTD4tdN^m>Ljxjy30|`O z9Nv&|m9eJ~oTZ(zC=7TL5;#0ydXi-?-H2>6oLCt(V%SWjYigx;>Jyk3opp>ib*3C4 zC#9gG8VmPY{wO%zKZ!p9qaw|dpl{YxtXNQ^Ooo*@$F#a((w>!Nt1Pw;`JMVUN(rg< zc`(MeKZyP=a$0dq7YWlE_w%WzTX{}#z=2V%{&wT1gYgyq)P!3KChVDWweJNVc#N?e zex@L)1C!-~_IdNEvIAwT)o4k?l4HXtwms`sEVa93aX^JI=`63boSf*B{lVCp=;(S~ zv!Joa;EKSptZ|zUg~=u$+c?GP(fbKS=ZRa}&wS^iZ!U|~0^5cF^ZI?Juk3*+Rgm)) z!7}j~VI|3E<0OaZssN{ReES@SWbc66D7-cNr&{x@xd1@hwLn@MWXd3qIS__t~_xkg=C46LYT5CN||G( z5_^(`Rla=_^N9E&;l)%dc2Tvwl;7^`n?Df;wfy1-R_~kRk?McHmzp2J*cot(mBOqk zky)w|&Qq>RnkKfF3LjFPrLLKiJO<5q{$MY)exf>SMuAXSKoN87@9`uJZ_Cdtoh{+^ z$%t96wPL?H%71ZWejFZ9eLysvr(cV>rK#nyMd-XG-;~53r zRoj8+%LJpf?C=R4&RmpD!Y9^WXNZc;tojqR=}`*HqJlhB^CgL#lkO}ab`4yD-V_@# zocWDE<<1%PQyTS-bn6Ac+Cy;gp^=FV!3=pFM69GL484V{EnB)ynSE*D{nU5qJay*C z4JK538jo_>-XwVWp5!c|(!dt}QJ>_|7}n4hWz5LY=W*i+a`~Ru0x~$04s&g!0uYUr zVoT(7%sbK;<5&Fe7LtT3=t5AQZyqZrLmSNGm|k9qp6aY4Di7>nCBO3yjN6Kmt#9UH z#U?`s9X-1_iXjIdK~}-UkwO+lYH+6Y{)2!!78lvpZa&P#&7{qXq|M8v%}b`u%MuJL2igj>dY}olf~oPz z@xX7^HHT=4lY4%eGhNh2)QB~}{3pDJY@rkG^X}J00M3Q*y{d~X59mJn!8Q{0kP?s`XLdjA(c2;Ca~G)amk4_>ETe;b<+>2w3^T( z@?~sgtGSUaQFc?k>w!&%QurikBR9TQr3a}sLHU>n`{tRQjRTeW;@+dJQR4n*Ddcf? zlBgi8P4L4~0t4!{S6)9La#mfiGMVZ;8$qdGwy_ zS-3x8Mfc4N@!drpe}a;3pA{y#=OF&1DzT;bMFCy5Bgjx3_3Jy&c?mrIXvoe#ZiG#m zvpxZKF#$IEHBBrh)9u_0;|DG4ZIy#^DP{!tiOjnab4Q|Wj73gIRItRlMFGh+} zOHalAc#_F*|7(nVlP~qQ>UWJM?Kn`x?T`~0(AQ+u1i<2CY-U!-+_K*m?d{%4z{!P} zCg$d-oyx-GY~&ET+pK}`wn>LWK5xw->{`-C3FWJ-`d#lvwcZ4k%RA!&SZ!0w!L^1{ zN5Sghh2Mm*Db;+F9xZO;Z*c|2%U9aVxRfWq6em>)_gpJ|TEaz^M?Dh$sd*L|k}Ly@ z7`e!J2N^>7pI8VOP*HdX4p0Qi1b{=va?YSle)@=o>_YNM`V@xjL*G820xSk}NGx`y zN&0C{6B-l8e2Y}$loj}u%rj!kmCUnaOO?$tX%*`4vuTCu*5=KWJZO(FG)(>-;@6GL z{t3gzF?UI52C~BRA^9_@ohVWrvm32*FUyCM3!A%nt%{xu(&gIo#|{a}3r*p{FX zY)rmtGI{$0sA3NS!;dqdxO_{M-E-SFz~k9gFbr0L=eEhs`Wwj)E!8=Q3;TCAFT#G7 z`cGVH71Qi18ttboV;3Z*w^DxF(aD)X+9Z~F`!_anr6HLO26}pGdHY7_nMo$JQ5>30 z^WdhT2*kvec*bgb1BC852;}o|F$mIYg5ri5C-V0esjf$nRJV5Z14W2Wj5t+8e6Ds2 zxK)5G;6SD&1Olm1Zs^Bg^N7RfWA+t=dc&p)M=bGWSm&pR!>+R_RDS$_e7{3-$7CQ< zl!(`G=1E=*F(-LBKculzG4iF>MZW6fdxhR2xPpSkzJ5tBA(G@k5RiQ+jFBS#qxjB|T(snME?xtw*Yf!^4n@ecU zFVqVp$LqWKE;Q11D%y7HXjp5WkwSNe z{`;*xx84>l%QMxY;F9%txm2CmeWb+Dvb;Px@Zj{YF@x}~iV_Dk2X(>1@jPlWG9>Ix zNSiVV5sq~bk=he8pY^jPbJoa+i7)^?|Uo(q&%0I*+gBmj6N=r0gEH_AcLD?{;f(=Yyp1^} zgSCqhWCo0?JE8XJMeh8Gns>wtqev9fPtgWWvysRA6AgJ205w;M$EeI=gd#i(#GrgP zhG0={L>4&{ctjQfPq-W{MxWvhMW;e=8*oUq;TMh8qi=@Jth7%kawk-Z!R)5bs2Rrr zV))h1gEFfadCE6Tn#sKOAM=Z|G4vE~^gAYpz8R%Ud`G2tF|Wv+KYq*j;~AF*#snf? z0!}C~#@H)JkF+9tLjRUqjJc<11EAT?i~cc){D~!#XMiSV%k`5&W*m2XL1X0mOTg90 zK>JWAAI5}Jyg}Gh2rB<1qi6%HQ3=G0u0MhQfe&!!k_gf&5Qr;XbK=nx3Jyo2>OiGa zD)v&aTeuY~BGpIS>=|l=9|CCZvjWMTe z1F4zHlk}0NSOaEJtPJ9i6vUNoK8g1E{t?J`B*LGR6!3p5RQ0SPcM`N<3p4cEE1>w= z+p-~WNVft{HJ`}$LN1H~pr}3g?+BX3^?)>r?d%!ECYLw@B=0HrjxX5xj#I8ty95eW zLu#4M#``I&K7jU?FPZ`@mm~sU(5CEEFUSHct2wmqIGTm_5GRkEFNOjz6NYY7paWYq zoG|vLCn)b2g>%7m2tLBMAen)EFF%l4G_eS5f(4(!w@N`EHVWCmEo4c+H=tp`w)AJW zftuAG5_YN=^?cnErFXc(wct9mB~e^>fPtG-8~AT{!?Tb!tY)o&apWEW*lz@GbXoXq zipvmJ3fUkz@{Yhb%I1Kv>rY&JH_d!|upKjc_K`bDUIg++I*~i6Ukc9fYNRERUB>c^ zfwGkx0j5hz0jA5U0NxX|cUT$KcU&U~UoaeldLYdTdcw~Xe7EuWfVAsQ*n5)~C49Ge zy?d1vynVOJL43JY9x8WmDBo0W6d5IU7$t~aNCske&Q(-x1N|wKf_srT1oMaj`}M*1i0}fhh43L(2=<{44AdnQ z1Mvs6UF-(qMf^sck#C2cQE;bQ#jy7}H*^QKOl3zn+za_b6bbAjBBk6VM5?A$T8~?{ zS~<=r$)Hm=BaTdi7?$un;%K2^H*N-g?|lqz+coIrYHolewY^>xU9%yt&tn?mKGj2a zG_6cwb+0V_0E#9XPAZMK3fm3G|Mdv<2!Zd6QXF6pVeX`SG$%WE|4)z{s0j#a35rai z`TZhpW?S@}s0cK2I#V|F9nil-k08_n7+(oXSZu^IqJ7`iFaBKC#5 z#fm|U{zb?ojEqtubZuqyisGHQor`g{JYL~}9}>i=sk4rw!Yk=lIAOZ+Qo)LwOG^XHH@Tp8x+c)@#T+V4W`dd z)A?-}e(!S2w{@fW?Q5vdLi9KG!5Qt+B5qAj-!G{AD<+D1;bfzoZlFmoCg!WeHK^5* zqIpj_XY)VnW-rv@_t}%%(`$tF+f?9L^^n2Gj)p-pv&P^BzuH+`WXm`v{nF~S&5mhYYcb?M# z9BChGt59fDNfo#j6>DjBP$zxb2!%aT1g?-AlMsjPXuioiZaA#^4^x&7X!lDOUKyAW9dL3pAFm?Mj?7=Ct= zCP=ov7?Z*LnJ@7xl1G}%p}~?go|R~exHF+YoL5Q{jF!Q>EM9#ei~73Wznm@&@yc_( z$bH=i4rBEfbHS(FQB@d%JVn(Kf@Bpq^gvf^S(5X?d`Rrdcwx?zz6*W_VoP3{cO9h~ z!@uv|1^M$giGRH#=h_ba$B(gZONReT6Z}_9S>S&RZ+#1rzO8Kj33C0D9P}R;*P!Cx z)F4jzwJHk;eC<0tvamI36`5b8MY7*{_ltk$-8-@M=(Vq3NPXwsKa6I7@ApCA|H@7H zy}!9BCo3L%x5G6t)k%N6LGOGu;qi6*h~dLppit6Mn1|8aUfP=fpLzE*ab$ccN;LU@ z<=q=BG6ZIlo<`la-^*>t0=}Vw_c6J&A6=2 zI<zlH(sbMZ6FYp7LJhr`-#! zht6QxOO;PfQ<+JNttVNIWZs#@-V7z-T@+5mrjOUoFa1eYQtQ7_mz_@A+JhRmfTu5D zOYWl?qLh!@jC19C(UP6`U>zTK(Xmg>U1t?z==W&`Mt3a}kX`<`C>PW`L(8ut_ALKxaKD=8}6h4bw$1cr(5kPR4ds*}`p6MDT zX-PEN`GK+)R)-EMuFgoV*oyDb5k5f3DMGeE%|i{FsbfYRmq^Uc^JT+f`{QX9<2qmI zvBUpC5Bi%g9Q3JrGVC)9UsQ{?my-^kY&vo11{?Un!;mE+bxjZhG1Q%7&XBSpOoPNG zV6qRl8|h-l;PB({2MQNs{$pPF8tt4*ph~sduX!$IdObt})It|4>j<}>)yz^MRDGKL zK)Zec*g1b3=Qu_8dDFc8jkX@}CGqwuBU~pQKL0jlRl%o|p8AG|+x{&){J*h+`frkM z3gddk`g!1jjLj_@$Xsr6taFm1I3I9XA9GA7e*@v@&`a$H5n?zoGrB@(=Sc7Mg5Kl~ zR022V@ZQu=OwfEiU)EGxPgDP(3F!Rs_VWU$hI}UkN_<#<{eYD{|D?)=p^jn|Oa)V# zG#cDg2)OX&lNl#(ALptii%4Z_#H;b_`D`f5;BKh0ge# zVs6zJ-z0O{J7?-oI+}n=@*p`W?Y$NV0Hb_13wtE}#aJCHATLm9DLhVPwdUa+6G~~+HiX(A2ko8`|C^%|^K;>Wsof`m< z!^i3kPQg6VOrYcs?`PZ_q@U{JY!=;rL-cwIbxG~~@K!`uUzF+^^!`S}E zJ?t;r0e)*s8#_aL`~URk%#{C!3oasz6dZ(~U-gbUN?4~D^p*54ZZ zfvkaev(k%z0+Yq&a|Yex$O-Knt!VHVszlqb z)M}SlB!Zvqt)aQKgHj{voZ;{+zb-|&SSc{Flh{5v6ZEWYp+pr_N<9|mPj^!P;?kn4u!_^va(ZQYR2@Y$fc?S5LRoXokcty*d2(j{y> zseZdupFozXYM?T5E>;QiV!U}|y(o%X5%yj_fuCF@wLf=knDRpJwTW4+L}!TvX}+hG z{hnAf{uO1%REcqDUVM-TbGWfOPMjCz8ZlExyOBd5EE^HqEvl}<6T1{;I4#yB07f!B z0!!u8({+RwZxC!ZGl;l4YxToQH;rQw!RmP=J;2DhkRB0cn#P7j^+Kn{KbQJAK+Kb` zaGTGWW*xyzP!(w;I-{3W<4otJqep^@W*+(s+(6sDB^||vI=cG{@-K-mG-Gl&@%NKx z`7Mq6e?N`?b4kVbM3vFCw|BO-Gx-0G)qgUy6#kJ$go1nqfCRbqt5#2)ieJ=21`J$* zfl=`<#r?bkTf@ACbNVInZt@F>$BY2qe`xMG>MH|yD#4$0k0&xXkJ*!7r#?O&FF}1c zl!SEfER%wbQpI&pqbUsFLkP_AjCHsA0Qw(%ZRY0e0S`gcs~)1$e4jR;i_c!!N*GbI zk__@GS~rsY+`ST$JDbR(3rv8c_VNyoUU&BoNj?_xRqzNqtH0w?X^dvb@!^0sD@e0- z>l9Ex_hN#5IksfucV%SeD=E`d&0TeO0X-KLe@DT!__ zAa4DrGF1jWhr*!;xN2-8EQHdXGlVjdgwCK-bgJ?m}6ReGXU8@TQ%ld zfbt*>Qi4gUq}2NM9OlKktTe2L`N^umkMFw4G-}~usa<)z?qJ4pO)>!h>XbHk>PmZ} zs#}z~t3pGw^aZqm5om`ErB$VGI3tSG`||+L#gz=qFpm5bZky;mog^y4w#1`FOD!5& z_W(@hwH=bXV>-s9IEGYPQ~$#QL+<{q?2qNuFMy24u~|OR&8hTnDc@2&n@kUzBWW2) zk{O8`7E)ZjF%?E8hB>8?*?mo!%s4|q8hMAsztfJ5Tv5r+H^c7Z`Sfm8^R4K6+Hu0c6SW}xucIr8Fubt@fA@%BodF(=I zZ@F>W=~pHT5s6p_@vB!lLN@ukw*nKoue1}Og}~S)!9FK`L&ua)sEgmW#`XJAt<(e` zb#3n-9xz)Ga$Lao<8SkC6I1^q-N`?X|G&WG|Dro7Q?qcH7DZ@-u8)HRp(Xq%1X6%f ziR=qm;R{>4;IAhxh&4UIl9yS^9)TlfZ?xF!IeFLe7LY#uzLw;C_e;$6+CM1WP9zzO zNa=x)D$yQIJ}e6QYB(nz}%5oQO@#gLT=6T^eisg0=w{k4_UP(uKo z$zUhlw}FvZ^v?Hk>x0mV5dt z%p%7)0KJrG{MQ8TOT0xYK_WHKjAI^>Yza<`K8bkgW@LMC^?}<&_VcjJz!wHc13J`{ zCy6>5%Uz3NHaDs^>v!pGqKQ`(lFxhH;R_(Q#e zjHUR$aE^cfkvvk4hMO*&IzBVZUMitfUk zSUmYlLGAr5SX`#OdpPvCB7&d|N*}Lr5?tHGNJ5MA?pwZp?pENoQK5^{O1i)q5J5@Q zPJyD*#*nSeOrR|ZcgdR6FwUyq25a+(w<@n$7DgO(z)rAx$4ZSJO6_w^TNnDZeOJ?{ zqXApOBbZ$CK|Zyz$qZIXY^cuI7$)hSCY!Is0u0nEi?0#$qWJXL#FLv3)HCngfG z9+HDKO8w6HZI>vT1{=I#D(!2tnTD)?G2B+3Vs6$iNE<39!N)K$Wskr!m1hEuw|&Gn ziS7lM;%}NIdel$23X||#R!3`}M6p>S5&8o)Trf3Gu1cO*)?&6u>`voDC+kl=r3!5% z8f#aVL{I$oOQ~ZLvaP-;wZymnxR#_fel$K@S&WK$s@HMkdkwb2`(i)~y+lW}@?2P$ zAMQAqD48FJx`)+0@!6mk=hPKjY!Bu#nN2Ffn(6d(xu)$V@%;>XWkSipoC5j~gPKnm zG18==`mHNQ%R;F#) zBq3IXkk@$O zK`y+BT?7I6^#j@j52%J2h-Yf1T>ba<@1bz@dxSn&!|}&SkC=m1}w^c z8a?H%wx}&82m0e@u0_CvqXlgE0KY7i>#=lb2#WyB2oWiU(v(&k6;R^!N zhlyWm<{UKfKPK9MIUDl0Q5}QceAWhGm&X^pn@kvFuLWj1G#5NS*nw`)D_H|$0U7>^aqLMbf#j)sCz zM?V;H4;r8N{ks4b2`vcJv_-CQ z&O75jx#u6G4dwzX@d1c@ph1raS3RM2e4j5e{kr|#3yRL=10?YA9vJ#2*r;U=TJ^rb zk~c=}Vy$g78!xtKEKw!44&JoJpeCoYle1cH*Twb4?SwJlHW3Hl${imCK8l4e_oW(| zQFd8vlm;1aS9h&@ni+i*k`qiesME_0Xe%$MVVO>;Y)oIBuqx``k*KI4zXHJANK?Fc zmY+Ffwe9+*l7J_0N?5-Kp&!LD1e9^bAA7AQ8S}qMhv-fcX^LDM(P$d!{&ZB zy%^7wC3+53B(wFnMG$H7IKZaQx20N?bw3S@O)-4kyUeyMm)s+mK=->1QPU@e+RkNF zVKRy*a66f$ArQL5pvS>5z)@M=-cAe?c_9={%qX_yr)uS2R$-DTyDGfdYy0bNG5@xxC9Hf?mSbxadW z*}XflXF4H0KZ413s6M_<>Srzp<*;HkOw@2;aeZ3G;`7~uq}4U;_ahMDQ7HcHxKWg}`n* zy#qo0jPPmrnH1}r)}8Lg6BODL@OE^6Pw5&#g?D@ENpex;G|)EmONd(wTg?`YLu{fU zYhurgRUb}Y+LH8}y0L#^71jvjic`|v3hUjUiaaDf?6tXfoOJ(hoq+z6T6%ZlHnBFc z|6N6Y%as2I!92n3-B22%Kf@^uTo6YBW)#FqNCJ#3TyU91f>6Ga6X!HqeuX%ghF&y` zhVgUaCE}yllll@S1@ovhA3vXR!P!spzJBx42$R|hnv*j(=et!Q@0XW>j1Od0R%}_>< zV}qZ%qap*C6E>`hbKUB5^8GX@M`t{ho)wDZdhzBdMv}lMLrAR|b2T1h%B)~=lJ~e$ zsg@!(PSA&ErR=*+f|Diau~gR`IAg~{*QL`nbtceBk*biVfkv*(00+a9cSc_zVS4pd zYL?Ax<$bg6h}~XOJo7<@MM-^m5?8We(9>mxoy}S%iMSX;{!FBG!hHDlaMdi>iMWz> z`P0m`Vcjk>R?}Ed@!XBEBA~?xJKq>}#%i3gR8aX-YzRmcZFV3%Bx9I-My)tKFoO>F zK2icpA;+4PMN8sIw>!@?sP)I7wV13w;B-fO5La&1^L||-1e9n$c_6`xIrc|#v(gNA zPdycxxHj54Qqabv=4XPD?jN7|P%PEDU69&MTwl%>ry(cOAFSI%4KQGH2F^FTOK%UjkKgDr)yB6);9!k$o|JoGSpm2#Gp|OBBRY8j83 zUWBo#5`xqUS3shKCob*U(***5`i5@x;rak0=Q3s+^UEcy!6FG)Pn=TkK|b*}U@s*J zG#BOZ=YZ5y4v{+>5bLmV_NdGwgdw<1s&XYqzsjCQF|_`JAw8%F60+|ENck8qrwUrt zmCE%KVoZ{3oOVDw!Z!;QVK}@WnSsyqnVu@9_@_d&LijA-Z$C}6i%!`2%Ch*#ZccxA z#N?$HGC9D#h$nFuX#Viz%Yr}Ol}jZJ-Ot~NH>C-ycL~0r>)8;;Cp9~NJcJbM&>`o zB@?TfOfkAyQmvT!^MK!k&VQ^$#<4zme}vdcmK^9P@8DCdLZXUuHhC@JO^!lkGZmvl zWdjbz!hd7<=VceOI!Wa6J`ef+Z(|1}|IZV;Ker73dur9cMj|R^a!S8*UlSm92;*?W zU_ut+jVMwq=}JF=Nc2Wx@X8bjxouzIxuqf93wfQ#kP!uwy?*eHy%@_Olp$1!B1_x( zL$&5${M$m;>%*Wy7DzY-%V?w-P^JgDlF@)Lg&!vetskjyz!elZvG#nXJ2t=!I7Ym2 zE3r2Ha~fN4tOcCU_WBn{&qy=(pah*u-ny6kI%miB5He-Ry9Xgk8x3DNM$#^N&@8tC zN6WhhA!ahbN@0lqfYqscqPd+u;v>0KaH`yI55h^;oq#_)2=^UEjBM=-e|r!HAMq3{ zuyOZDkW)z!DM=}vtk!=bGG*`YGU>1b+xzl$?IIgZJjYwdgf$l9Du zkZ>hu!z_&cN9L;w_f5WI9qx=71KLLg4X)D7msfVw_s- zr)EHOX#Nxz3?P`c14X=UGZFfBuDG*OKX)~r=ipIffZCFxZEufuWFfIHHJq(>xiP>P zTVkbt(pME5*R`MF*@hAmrO5HO1EHQQMchvS>}^0m0^9DS9Qz&_Tsk2p+BB+;kIn9F z+zeo`V<^~H6Q!J{$+*Ar{B4qPgYfVe^>k0)5-3A#-ZKxH~l*xkgw1igp?Hj(2o96@-wP?ucuzF7Z3@mFthh*H0zMhK;^G?dz`o?ZY@XKw@_w z&^)4wniEgSeh(*ShvX3Ul^SXGz6jdG6BEBHW`bHo9aP~f!}k^z$w)Qg?zKNgFc~Gs z!ME?wqT%1}Bn1A?)%LHkqp-fC{-0LWBusx|iaa$d2V@l#FFKhPQX00}07Z`@Z0Y27 zOTWyCDRZd4d=e{?FMU+*HBGgeY%TgO$Qr005gk1q*26NM!8~R$A#=v|@B83iDFz&B zNJ*^xF+NYXxs3DPtvIARoHmhrzg-=jeaODIXNTLY_2}K+l16AtgxRF|1=xfg8CK^G z0#8+njEvsKqcNZiLiuGr@IWxtn7M8RK78Uz9)$2q#a2Ob4aNZcjQXBGA_2vtaGe-D zRe;vsfnwlB-GMdTC{cR9DXjb;!Kr+4tT?_3CceGMVV*glUz@tv3MYf32yw|7U_*;O z4n53FhuxiIV4Bdp;$RSyMO`%(s^t)%L$H!BDhOKZW&z}4>0-FawYp9%DLeAeMqf%* zLCH@;Uu0g{y6PTDxHIE2`T}I{IhVP|yk0I1mssL+;>TV%PP=9iqg!K)pLJ=dk3!G?IQVE1tQFF03bWpFWc6Ije}Kc@wp1Zc|i+BCD4Tn5Tk))eK^B8JNHO{41~ zS3LScS48@v{Q*?){16-(RJKd1@@|Fo;&XX|ax6QmD!phRQ90#;d{yudRFCXUB`p)v zyt6F@aCT)6V2We!p>U-BHsuhqRDQ{XP`90B0X=n)ynW>lz7Q?lcBEaqgGE~4Yw}=| zTb9Lz0V(#>b@`^lit2d)%Q;+6RKLAY_L-uDE3niA(rVlR*tCl}br5VfJ!1O;-IJc& z5Uf$Ki8jkk+;Zip9JQkB0;Lj8HNsZM+rnE3+$<*bW4$d3V9lwXyv9%9CMj^brL6lHndB9YTH&li4?DLCtM?0bY2c!ap}XN&}6wC z_6ViwaCLHvNzu}N-Ya#`Q8#mAN1t@xxXC1pU0c;GjAzl0Q_NmlX9;C)6D4VOa-&`D zK+jOhjSMc=;@JO+4x-%2qbaEv5yi}%LxE*dRh>JjU2+SFKou}e$7xg0gmLHWX+5u)*Sy;zWxibKe=!D+a z6S=Omz|c#f~=0?FGM-vu( zs=7oTVrRPD6p9ut6T8^j)F%sZg4?HHP!zb7sb(8?jL}JoGf?916^=kSh1Ly~+DoF& z8K6XxL3hRLH*W@*fKO2OH=C2F_B(%ri(+}-*wg>s0!bZs6{Eh7N?`tN4uWk@QE$zVR|Bx4NRebT|CU?RCX z+8Gu7V&f04b{}{%afOK_G9ULI8!12l26PP%9o?kr$%!sh@h5fu*ud>QU+fC2h69b~ zA5rVNPWOfWCpJt<91mr;fl6~$o1qlnfZj6|{P3+!v=5@mbGYMSw5z?}xiD?z?Z-9b zDXPY&sf)wv=AS~ZlGwxA(japp;ncxOf^ytdV?&DogC;+ZO1LBJl$3~JcrqQfAbw#>uqXiw6}4U4tqh7u|#zJl?O zZ8fneEr7h78|3_>mmrM#B_f>DQ;k@X<<&NvN8vy(zj;T4u}S$?3cNE_tR8w3!zq=Z z1R@$$1tDPIfsd`Ds)v!OQ&(i0ItM~E-cmX?#+MuyI)8v~(!+xra1A1Uz!oX+rur@_ z0w)qsbIj^NsJm4BY;(8gp6Q#`3F{HxX|3h&57KQdm)k$O_RvH?r3g`C=p3fCRq zv`J4I+5HtXWAk&*l&xu+`zc6+te7(gf=adhOUdYtp=UUPkE3TdO;&X+4emynL~n z#q%WQdH^9O-aJ}VLM47iY$j@wCk}YZH$Zy`J7L#@YhG|*g-Kj1Sd(O#8$77%zNKw0 z!^7jpVSE7|PNunRYK%5PEHc2d(8iW1#w1#pG4`H!&ME5ngi&=uwkd-lrk8Y#D9WrP zhQXDWM1o8p)4|eU$}OhBoJ(6mc~;vgOHr^KYo6;7HgV6pSU)%~Q5>CUj-0Z*NLF5( z^v1oF5MXf~<8-KY=uaX-#I#iLM3TeqC@A1P1M!F`z;_DvLfSqx0WZ!^{u(9w{KNJJ zX8|d|q)F~sMFVw#+YQOgug}RG|9`$b{3f8e)R3yVLznk1@MN&4C5u*w>0u~>uGN${WLX;CTB6gR=C zKwj9mlJb#nk(}8{Ule?O73I$%?sI0Cmuo|MgN8cC(v#fo-or+ZlWf-byul}gc_6Tl z+`ifkKQdagS?}p*8Ei#_x3HZq7BbN^)D;-cT0Qvbx1tA1x&i{?&q{2UQ5ABDJ~4bL zk7BIU1_sES9Jz)PYL_`-Ff9wHG1Ao4RpDP0k68<7E?ZX_ZoEg@3$o1T=9iWd##>Qwy3dNwRWNYO-TBBQo#rjmPAM-b z3uXO+2W>7Vd-^|lAKv=P4?yUYlstbqvk;uk_rwAyQ*07!OW4Y;W}Y}~qV%1c-i~5k z3QD4i#EIr~oqs*#d_|4LG9qIolJ=s<04koCBA?DmEJ1kMQ9ys`RRj^y%CsD5x5+cZ zU=8Ux1^}}!f?B%IE)ryQC4L_Edz0^?pFZI1B`L#;IT#s7bkz7cQEk(p>P4g*#V{40 z0TyE$zJ6K|Os2_{=Myb%_q`^sglCc6Ai4>yg|24$^3FZTPLCyb$BO&z@8mYJL|8Yu zhpg%bdO#NSb9+=nkZKaEXn@2J6aFB%6SXw`A%RoD)8{7N>kR|uY&;Prm^`lI9hqT$ zVGKQLWHh#$N~AA+6svUc)*E|s<_N{1B|X~7)y;83AQJhK0;+G_o%<)t3F_l71LF6N zg847bGk*`f6Z}6P$lv|Dk(+>ty^+y>Ep`84AC?#U5BspJy3pmaI4aaWcz*wS4{64Y z?$}6vKSayUAi{V5yg>c;WHHv38sIC9O|R<){J9wBxU~h9MpnO!v;FP}=lF=*-q!LR zy)H;;miZRlY2RoqEX$@t;dePr4Ig}O^bq2^zls(=UJ?X1^~b@6(*srxo1%V$MbF`@~(jx*^LC0r&; zwy!OeP25qwE}#kQTv7BbivImdTJ=J|qO(a+*J2Ly4y~Jf6f5Fp&gw2lPwm19sUe2- z67h|y0Ge&tW1oD8mZd|Pda+a4?Z^G?WB4bk~^)ZUR>wiV_ zL#9INIx6as$B{Lugy&Kqn03IVX60$Uo#mMCZuKMoVp|y$?RP}+g@UV4Z>YQ454E&k zcC7M(kBOPPjmXnIa==Iz=FQZQ5Z0yn>593yl?+f{Ta5 zKytA}!q2mMOjSAsLI2mK54H45%DQaj`P%IR@YQ zbO}WxW{B(`5*5IE`8~2IWANHUOOsb@*JYbzvF{`2G|Vfw8%zTfs%FfPKfopWxabek zYGX0`0si}OT=};YoBzal`oGQ2|7B?T7w74^_(jFv7v&qAPn1MhBYhB&HKD+OHlncp zhpz5C=)M#4DKi7Z#46*e?YVDjU1Aed0aQhoARZLM(`g*J1W-jm?Bpiy4`bf483!X3 zYkXdyjbWI`m|E<%J;I>uEmhbJvFxQIRz{++m@2ywK8(m@r^&VEGo3tOTL4kQ=$-6y zOwrwYdml}YD6aUugi>GhCXWCvfiGxix^Sg#>h=MAM|AFY;GDAi56E$&!~pG_skjY{ z9@l!zfp2PyrZPXHAqAHyuL?^)rQiShRwVBS1CUszh6eIDOrieB-tj%p_#D6#ew=dE zsH9`-QIuZdH*_8jz{szk?&wV;r7MM4F-w-nFU)&E?Pa*Nfr>ih_m7!E=T`PfW4M&K zk-nW>hoj`Z?}x&3bC4Ytf{_^rx?chB)Fd!ufX#Bz+EK8x z)P-v42pW`dwK87tJjsTVrdZ>4t4k^W`C!6^tp^jhWsvIjEcF})}=*u(RK3ZHVoQ6 zqwAN?k#CmReD!f7>5-j&@ToG8t1R_ptJv_VTcHh`ozYKa&(%CS(Y{G7*1E`8OicAf zCcMrzfW7U3_j&%P!EFC(F@DJ#q+s8IP-qS7I=|@Mp^hM<8F=jF?jA%k`r(^{g$%b(#w9n_3DRw13l=0$pRm8+iE<9j*#-Q&a00&mLHA_3@Fz5g)*y9U8BAy zV11BN^SLgbOa&d2FH)|OhQ-n7D~HuVFZ*b1s_Jc|GQwmRk;{ByMCtRSmLp7CRC_U3V*vrUd7Y0x{wr3SZf7!JQ z=&vyUS;zOgWg3gZ3Dtc^J2AZc@H{Th>3unuiqVK)waO>8)`Rt;&? zMBpqbh>q=hRNhdOuu@EX=&R3$A;7;jjWEHy}OmUy=X=QyY~2HgLC}ock7<$ zUzSHveF2+-hpm0-KjT$d&voX|aW`g%+jl<0ngTtJh8V7)=Px95H#R@!8cU8Z#qCO| z!{6Ha=zqael$z!MaLAIT&L~86$9PfPq18Xo%?~M(wl>R(8Ys$~I%GpV5}eOpBXrIV ziCSA#k$nwPQ-~t=oGo(~Mh5wclQ4-n;K?1dMVPNFJ#Yc}1Cxxtd2J^0 ztq@<#K|qzcE7HXE^@n`XA-d>i#8gi5g)iz>v3^;aa~?lnyl)zN@!z%<&E~Xz#@7}( z0!*?q77|2E)RwH(ljVx26T0<$lgv01orBo|&A+mYA%n@WNz~u$6eOpmjGL%#3bOC% z#?}ro$?agZ!cLnQAK|67>os>-Db)3}(ANPG-4j_p>iX*teBNPkj$#vY_kWfATmyeg zd+jn^7%<1{-t=e}kn7W4l=A2lL9sdh14H0q(hb?a5{8>}U)2;h?tCrNR<9kd zJ{N_qv6LK6E6AM9;x`5ekq7>qXdqqvbgQCHb-EO?Vc4opvr?5Gc6hyAdePWugnZy^ z*2M4XFdb{&?zG)+uvv@pj7WW=zg|{qM4M%9G+$fxiLpoPC`*3H->QiOf0&yFtc>Ps zgvJ9WycG>ot z6oeUxI!9q_RzRp9j6gWY{=$c|ep~oER_THB56plVlTp^XeNM;yg;?}SA)7>_!Bj9} zmB$g94j-k0@67b7SfqOU@hWO|8|BYbr!8;J8W9%75$;>OaedYEYBJi-@u{LZ35Aqk z3{|7`fc*S|cTW%{KB7QRop;wpcm0NRU@z3buF!P$^NrIZd>juQ-I-mY8CH@upJjiw zN_nFcQ|CAFu!)$wo+rU;w#lOWs?c2UXrb#LWJ*tZ880{1SWddjVm2ClbW@fDm4fi@ zp79iAH^>m$S?`1@y!mgYxe%K}%I+TUSxvT=FiW3$4tV_ch#-PW@d=vKrQtwUZpej5?%q7VQH8-%BRTCo{YyM( z{2xs3fj1$k1RZ~SL=kY*;#gmr!XPbW!QnheabLpoMqFU?*G1A6&DdV@43Ek2>|lPP zVEj&aBkr0u{k-o}ESx6J&buyj4r7kquaB=_oeXHcroDQQGV(j7;$60oUfi*pQ7Aw1 zFci*7{4-PG43t9(?A@ii{Cy>WgXLBy2Pxe;bIu=yhBxc$3yOfo#)w(PY4d0yUWXZ_?owUqlk8O=$FX3v?a+pEk7Krb9>(VuL5blJpk zkU+@fZ-mCS7f?lQ`BP?zBt}BW0Y`vd&3xVR*dOGlFnL43Zb+_CbGKutg&MS2cO~99 z#2#dNjgyP6_K*=Etpnu=+0(?$5K+g0R0O?r7XP zMM`I>rj3t@B{lWE)E0Vw>Q{gpWNQt3*;qD-haxDXijg&4H7kao0jI86~iu% zwk#+hz2ApmA%BGLM0z=fbPDzXyKi?-sfem)sT}kMX8^ zpyYEP)jh_k%KBMO!}kml+PiujV)1)WAlILZAzD!MyD z1zS%3v*t-T`_AR359|_anLXyc90#92zu9pUzwCTx9^|ygF59C+4qK#XBz$wMTQr#!EC(;4e3Ropt!k+QrXNGA%kbuG`JI% zy=s_uRy;Su%4|hC0i9F_5zz zzQIx*g~hR>aGh_+>uZty_1U%dcHwg{#VnM>3FUzmgS6T8=Q}qAr{pQaMB0XXUcSn1 zKdllIvH`}9qUHlu;EDb~u=Bh*)Gwqdcgk&Qw=bryiq>3DQ_ft~ud2|q3h(Rr73GM_ z1`J+fQQ!MJ8bB#W%P<0Uv(pfRwra!*)Dr7K+ZJmI4YQG&?YD$)l5cn6jH3u(7$ebJ z;uWS>)@so^eH4dMd%-nLz-tKQ&dQ{r*BEHXhHXdCj>B)!G5PV#gp~32WlFc<$NbcO zS*XfT&uf>QXHkXCKIGdDc}W^L8VALq1alI{^~)-dl{xt`0}GfYblj#+#j&~~0im@`)0I?p@hHmoj|iqAca3N6JhJISI`K30n~<0K z;tF@NUeqr&7%AB96?BbAZ=BUw{M#$le z)BFrNOp8w#t;s3K;u5xCQY~g1(9d}J>6Az$2eVu$v5$4%W&5-BbrntWjSlx6c$A!p z?{tCh7I_!DT?xL{yI6xo&P(X|1&L7j2ct6@3AXRZ4bBsRyA$?REq-6xgtre9c-MPC zc=;5Sz&FwTVBO!90sm@Tmi7LWE&f}v#(%V>`d`(*|165Uzsi(!1ZJqLngFC10))c+ z;*nIr7)V?Hlqs#!`gClJpGzP^{ezY>@?I5rWY_O9rF70eWlFDCTj<}3;(>aE7V!nf zZt>j&#x&cC;zTxCdirzSI6X62w$)P(LOZ~ecbQU3*6j-GZ<$glD~8S=G9~WFKV?es z)Iahd1;y+T8%4aXJublct`^D>qIoBN>KbD(?xP}x!2TgqYE?!L+zb+Xmno^nZ18`X z7I2Q*P^qx3Mm%puaVomUE^=mbVOtg2ag|YVtH`xB53#INtu5(M0gg9$b(QOWoBw?E z1PF$$$i@(rT2eXF2(P~63#t}Mu8JlPsG;|;dgc1*e*p8&y0My9c?A;t@<$oBjZeKd zZZpCv0ou_fUxs#`nw`5>om0we>96AmkVbd1y=+e|93FQ()M)*TC~B6W-!68lMa;)7 z9u%$2rgMi%LbMphW-N&6x4@Um+Ew&NOTHvFRDG~E{FuY0*r?yrUm4C4h}t6(r1{#wSUGzB913*B%h7dPy-RCubJScEMW=LWwG%-kOV_Vk=ReXy93jQ zr+j4f^g$gAJ}PTA;ubS(3vL8wt*;FZ zjofT3I^ZnGvu*wPKGorJCH6P@pfFafev4_wfqj6ulQ zR%}*PMn7>h6!gQ#2D5~0X6owRKh8WB@6grv_cJf|moxwO*Wf?lqWv5A#`uplOSp`A z4?iFv<8p5Xc1BD*^9ZiVHwFcXLi=MiK6N#hF*g{qbEeu+HpG6GAerNu%uQsk5WFYf ze1**i3mT@cnD&BR*Ft)3tg4VDU`IJ-ss3#xFA}~*;r{jvw=^4hv*P`+26Ic|D|mF z`!DyO_K<&U0siMZ`sWX~qxyR|gTbRDsm3NE|FO&k5mnNzh<%#~3MGs}#~>VPW8V2u z0WD$G*jaKv<{p&yJDDi5jK>GvLGON>f-k`ah!eVOqsJaK4r8egbX->tM}cx5E)(nZ z4F^Rbs&Q8U%Y*v8-6}8<;V7b3wZt|X$pJ^82;%e~L5h6OL=i7(3t<2~>=n=vHky-%s=>l;4B zxX&8iK8Q5wL`P^vl_M92C_!8JluEHr@p9Vp*w5v*kPS7_Z#fxLg_!a#5b%{MK2SCDB=@8HXspb@M1ZUzM>xNRl5=KL;G>+7MnH5PxKm%=90V4<*-m1lZ)8{uqJGgB_5hXhZ zvCMOH49<(&k!o1(R+z@~$_0QAKf9Irj->W8;tKs+U!Xz3$J3SK#c$hcTR7H3t+WWE z7-M!IES)24?KTYP7-D`fZY7W%^U4o<#8mNZ-U;w8`NF#O(%<=b>);|`xDGmCEGMt@W#n>>3%Cq(- zzLA@|u|)haDdJ|&h+_ut%MGV)25-UMnYY&)Sf|&Drk^aJXurEM1Tn0bBajh%PlZK% zXtBTT+y4zNY8~=J`wx)X!kglbD78 z7$wdp9ow0T>24Y%S0XXPt%6O*+KZrk5+TeXZ~b@~R_WiPbYbAF*N=cXUrW15Kp;U% zVQ)dRXKWv;!)WSDw; zWLvoS@^wKY)Nm?Cy%(`3en7}(0U6n;J+2Gj;+mYeQ1#K8FmqfAd;^+X>hKVBoW;mc zu@QAM{XMtk$xK#;dE?QeUt7%f(n;6uPDYa+cmJrICLcjO@;gl_8=ka#LHY*2mC{Mr zcr3nk{)P!OtMwj^P%4{|t#t(^_ERnhR`>oKf`EokUYDq77b`4WQ19(wOJV11WRKH> zyI2q463cmu6PEqF9C)&jwZYR`v7WDd|6Tv?r!1t8-I&diITY`#Eog?>La;U<4fWFC zKxatZh4RDeGTxAS26NaOU*LPjbQIECCliiVaDWm2jeZiWVTm5O2q`-tD$jgM>Sp`) zF!wDvFz2IDXEUARw(%y4%Y%B`Y8iE_<>a(SfC{NmMCWgp0a4KBq|tpPVJyYLl~OKdYOY2ro-Zsd>e$akA>Zm0br=gtL9itkFGoo^ zU$h;kdMaT-W`+#J-|(EO^IdhRV)&&(OIv2(Cy)i;hweUvO?!(IOL&D`kNAr0%Fkb6 zAKsxL1hM&pdJCk8_4MNSPVx_cu>^>#e!oPp5Q4?6Uc{g*u1E^Nf?`FfbVf@i4}FG~ zDP|Gzn^6YS;iDiO=k7f%Wcm>w>{d#AJ~vknIu{rV$~MvPJ)F=8F69*fZsx{W_kGlV z!w2XK?r%K#3d8vgld_qIC5HIhkPl()6jv~7q9AsDRg!4KAu zyXmeBR+~^xgXuL}d#|>K-?w`Z-F2~*0baq+FwOA@z7aa+hyvHlciiiBa2pI|RGMPv zpoeX93c|rlY~1|#5r{drq@<@pOr3h8J>WM9JXNrcNW9=PPyYb6jB*DJp6>*Wx4)<}|Nac< z{0Gm#JFvB~wKV!KUD@Av<0SI-HqK^WjqLyXgtAWMA9H`&Hbpp!Jc3PZ^VumPh;~sB zkwa`n|1Uzl@MQCblw##BqpNX)HWzZHM3LVaFJglEesX-{2?^@M8mH%~si_%fX69;n zI(a%Z`LH$EAk-hn@i_`{snXvP2XVWXfe2WFB)SzOfY_6W(NC(CVCzSyT2}_^8L$ih z3vhB0Qo$*owOn0QMtg~a0v5L9a~&`On|xI%%|hyni$aVN;-XcU>ttk{wEU$)+U zVVZ|B=BY@nJCvn9sYioLDTR~H&h@RZiwZ9Rw4V^} zV`+UgN`fwNvJ8XNuu%YhqX$D*lbYdbzo(Q?4H#o{G46#4Ok(>_h3$ph}Q|sg4oM#a|c7mRkhe1jIOa!fa zdS26Kle#3oe**Q==qw=R)^ok-_#Caz$g%G^xZln+E2)p>K}zo)q)|MniDZn?c}_Pm zPtxc(&_-T(#;&Hez=d;)r}dpZDS!Nn6#CYEMDEd~DiT#sw?ekJ2YWYWR0Q4^P;XOj zgH+h#u>C-o^HxUTH9PW`Ny6sr>*No?{;s-%Ncp@n*$Mq9qq}B!WQ#GQRz5}!mJnIT zgJ|9Ot)uUGif(W%`<-|K9)f(Mk7nU)8y`P`$RU$-J3|*pK<}gTI-0{r?X18pRpTT6 z5_SBFJ@xd-Jr)$C-L+82>Ftv_w2AGUrrZWj8PGQU8d9AuvNfo7oJB&>mGlll^OwN4 zG>Z1{2wk^!cW(RDtNBqbML*E z1o;c{LXD#N-9G;7!~g!5p_PFly`iz8KD~{-3B7@hleM9np}vEor4hZMl>@!Gp}x7H z5&b(a>VKGB{G)?ZJ5YO1K7ZqpW?}%$h6Eud$TyG_64RCW&Lw}x0v9%@inZ?97WmX7 z{h3){zx~Wv_chq7a!+}ma<6vn>F(M=?(7>BqAe)rJt4ErY0I5Uf=fbz_v_OY{fE_i zkv@SH%WjY`ib1NzJR<)Ts`_;|0UXpH%g{RVlm3k0^u?zAjUfr=)$48|T_u}atf-&J zdV7?sP&vW1`bhGXkNI^4b7jb{_!a*Nl|_A(C+zkyEB?xI|{;d~4Zc;Ax}MqrX!1sN3}UGwA#%rd$SFxLM56 z%PkE(he-Mnv&U93$|>ng_J*4aF8ja)Lps^QRlL>1IFtX@)UlV z&u~@Els7Q+LVEM!JO#Y{Xhee(v2*givzF0fACFzCd}sV44H!QE&2jB+yqpF5PR~RpRXQBwRKv z`|-VUJtAk(@^YS^)GNE?3WKWcPkYij*OUoCo_n~wYc^8iM9Q>=`-`pgfEJm7+XF5H z^*rJ#V>emR7Jcr%%7lc6#=)yu`{*L4xG1xdMD)d(`pv;jIF zvtKzoXz0Qc=MlsNg^;uX=!Zg@bnU>iY&r!#1t} z-d*_k!n1n#|6uj-l>;9$0X*TOmZ6m*D4#b?TnFgADfXx}7OY#qu0j56xR2Pd^}Okv zsPh>==sJczy{*F~RjG!qp2lT_U3PxPs3VB^rcz?|_28@?*%_;r z%UM7rDv0$FF5HRtebnyIdEF(CrIY|#Sq zsPFcQ(KT{!!uRU^xBcFPzI&9|Qp6q@a?>#(4tT*;6s zimmoAGDE{kk~n4--|tYiT!~DH8e-&ajs1Jm!U$2vKaLEs{(q!>1AC@jx@E<#7;kLb zwr$(CE4FRhNySFRwryJ#rzYJ!eNLZmW)80T3(s@yd#}Cj1>#krindx$QRu4qOb)R- z@t_z};UeSh;v#)2%OK33qy)~MSHy_=bU-chd_g+SZrh<4zxRVS67?VG_KES;1SxdX z?V(GlDCv-5cN7zF1UEk@Ybi$|AU|iI>5HLD#A88M0Ngr2Si-`NO)3+%nCF^7nsq;D zoRO*zUWHDYDV?!$dRL(z+AwD(fi)|EHf3f?E%~4FQt^e@V__P}^8S#RJA8jRxR!56 zo2mCB^X!va;S|MN|NNB*v(g>5lq1euMQt#=QfKZCWD~gph^Eft!Hfxsk<8b50Ca65 zYY0LBT0>*3uYY^PtkA6(KIrnBG1rHcev*FBoCxuK98zj^Wm11@TN7j*JQ1JTLAoq) z2+rw?L}W(#K*%ZXf>hwT#dd&9_gZY=RwV8{sEAdCb6kuaPx3Z&305VTqmQW^nJL#z zToq>u^jT(*hiahh{~knv2G^t7j~PF3K8H~~A+I1!gDC{m7yYyh2@e6i9jD#@k4TNE z*Bk1EFVF@L|F3WNzv?pnr@N{Dhc4rvG<@~H(eThN{t;l;Vd}*+srkgbGM&!4&mQ+O^Z9)J4Z;sZ zMI?@Ilp5;lku*Smgfv2mC`Rk=1$+-hO)q^7!$!n|Oo?oZd5YI8c$p5@a`Z*Re>ndh35`7)`kb zzJZq-N8Lr%Kmv^oe5a#ME(s)? znht-<3Ol`%^=)ad!{B|ysq~c|DCXhgK9>^KS`5|>$D6InZW-LFdK>pL49S@^z-&Pj zR-zb(^dpWhAPOgam=Zme+NIQxnX$z|91t(LzZcVg2__Q0ixdkxibZ@Ae1)u;Hy-}Xt$?|9+}u^cKfa-%$w_!!?Tag=h7X`rE?4?NhIj_@MU2=h9dBc z%D=~V!ig(K?xzjg+#F=i7NZcd;tPBuHbS`rs+p&iFbj_%@%g(b$qr;*HRuaIS^ozr z{;w|<=KnT)`l6;(oGq-K{sEb)zpCihMNxQQzySn?TO<-nYjMrsn#Sh1hskJB6bKOJ zu*A$ZN*-Mp3K|6o6Tf;2KE6q(oeq1Q#GXCWSl2p4F%;$0ss1p#=6Grv{yg4p@dd#c z#G`z@5gu&8P-F0ycwsFz#FRtzB3r&LHW3wJGSxyD&WZp%D!zn3g;7t6B>|g8Ay#SJ zZ;OCTL9Hq~=|cvqr1ZQg3_yoggq>6>v3ZpPU={{q!REInBErTOSwtRs(b80_M=m5Pdf2kBUzJXY%u(W-9+ZT&iM47I!*gLQ?Ty5ct6mm zQSEOKd-T4Wp)<(G5JXDZ72q+3wKU9))Y*2nmg~h7!ZWEo@$lH4T1ijJYgZ2rV8HmJ z^j`0*LSf8~)DQ>PukKyknkFBFBz`#074SAa&}$e%psBa<)67D1fcKVlWSRB~x_%gE z9lf~+ze-0V@KLf#WqFl}3FXIR=XeQ;!8O$QDr!1MKO1x{ii>+om=I2Dl)pjoh%LZX zwUjd5^*4w|6VsLn5xREh(@i-U1=+PDgWXuitSjp!(Opr61FxHec&fIU_NE?=RAtL>KGF?(v{)tx*%5WU;+01KYiZ1b7 z?=Ma*{4-n+NBk2Zb}_jU8xzyQ;76~v%MTMzSwm@)I7Gf~#)|ZXJM;W8627tHU72@` z4CBf2>rJ!dcJf5W+UdZpFDvO|M@xqOxWe)|wEtTlojU`uEi)%7{op7Rwe$J4?x&S# zS4P?DZ$?1*Ox~}yQq3c*XB52I9{v}L61op}zk)orY*kUK`5A_l+=n^8*g&DVm5?6~ z3(ycZP_Gtn$O~r9lAN)q+5JLd=IjFd2Eo2+>Ao0G4E*OHuOTCM92(ufQbmeX>RD#i z#KiNFnMvekJ2|{SgMaTDH73O^?rhlHbz|i{p}j|(7`z5z4&v{o-oqNSrd?ri(o8?W ze}FwgR*TIf^k2^~cm*_nZ6~?mHNtBW`T3z*ki3F^T_L)MH}{CIN7#A={|qONiq9)a zu+EMkRl>vY46RWTW|f=mmTkJ;sqak=b-ij78LB-~evW6rd zqAfj%N9j^il13V2R+!Mvdj^NMFcGGfxd(@{TTlqrV(F9+W7(=QLTMR2 za>cRh#o^qF;HtDo-zwR+-6-7G?bI3eb`OntyOo85KLPbfeRr21?zoMMdD=0+iM-W? ziyhg1I#mzpPq-`O#O;4$;jS?Pi!m2JRS#$2a8e#dc2{H_Hogbq_$`1Vw`;Nb7I)#T z?s$*5>ZPpso@UKkvx|($dpcO^T-9I7!o5Fe#_Y8eIc@RWiLN(uBSP1$98D)h+a2(8 z?8pkUyJi;)vztPHzE<#h0uA-QYcOmJQUH*D@AD@0<{!f8S7Fp4)IBiGnuOBZshXmW5h?wqBL zZZ{+bbuAqYow)JqAwzWP18E?!HimS|6p~C#gtU+2Jh8W7t%(?1XibKl<%VW*cbJHx zME7hqpp2PtZyoft|5$7Iu*vs_1jEKYgGO38btB(vb20{;Khz z*xP#i?z+=nkI{BGOe`v!SVHbQqGlxNTYKL}yoI2xb~%qkaaI-d!4b2p+(I*`Y%acG zR^g{qtBQm^M4K4xK~99vyrlFLq;_pGa(o)fW^G~M?>HPLp|OYVf)s=@PW{+8@M>Cw zw6;+Bl*$teXw&|QjbH$=ZRqKM#_yB8#6`Lp$Bj=R{3E4x0IBy>-wY&%n z$LL~}Qr>y_W0sL|I2EAawK1hWLGCp19z>J&M3!T<8J|mQwwk` zigr?~rc5#$N*%*a?08@B>Tf%6%M?gga#~(I%93l_kKDXqT>Vk8A+Hv&1V7Tijhq5D z(Z4R(pLBfc+$M1yPHdFYwHS|%pqEeN7Jab&i`7eP=K}C$YB#s|(X#Sk%9ylbn{Hfk zum3tla_YOxPu7gduE&bALRj0zJTifr_wDE@ZA}U!z9m{8DCpYi+20>;Pptl>E+iM@ znZl=J_ZZyAU(fP6*{>6ABBVk|xTBDAn4~{b>5jCe=K+aQ6yM~`j;&YP@qc9IsjEL zg}_@ERDmJ|ryV5)JJ5T7);Q-F#DC8$J5$#{X690D5+WzJ@Wi#N-<2+)MbxHCT5Gsw zOk@un*t6we_N>J>a6gM(y9~*koD&3^5`X81%^N4zei0S*Gt|Hx(8^_P_GF`E~b!W6y~ud=jekb!NU#OAJ`Pq z*1u$S2a_jd?|X4o*9H19x6Ps0R?ms(yIhksdk3yD30A`GcTYSjg{?-{_ zT+v#J>fB>d+Q91QROsi}d(t5-ND~DR;c9d9B$B-|MgFvr&@9k#D8?+Kre& zXz6e>B4jjn_NbV$+FocyDk)QK~+-)%^N9Er^a?8lX_B(-UD%~Tx;~lm$YX5R&a07}S z;7VUGV{Du7J z!061<6uxtVEvD4$_JMl+t={^0car9-C}-~xwb$u|DiM`NYcJf&qLd@6qm(1qgJJ=c zn|InMEw?X#i~gii+`xeU-a@SIgxnHj%Se4=J*f|h*ACi+;#pChF{IeP!bpATyi(HO z1w$70MDYjhhJ?SRUXz?$KCeD@f5g@zujTW>m67`DdF6vj%x)6@;q#di35A{sbm>du zBC+@DAg>Lohh)Bi_Q*FGAa>_P5cMDeOd@Hq4y4TZgLitc4ro$QguX>RG`4-t zs6Ef(B&}9o3SH?pJ?LmIx;_(kM3rVhrai}SWmrA9ntU{8ohm{l{G#=_J^`dq1!d*T z5B&$m&d;IrTp*5rZiXzc6aW1N6kFR>AUqr#kq9BOx<`4*&ofH{)F?;!@BPV z_R!1Rpi2&I2i(z|Jvr9X`NHo|KXL^$EMCKz%TWEqVX?L=ju*4YSx@V*4aIY#x7!j) z>HtJPAszB^4u1%H_?39Yk;5wxz#|_bR=n3LK6?+u(?uvw;u6}(Ulk$#RA@^~Eqff3 zIq>bCE=>Ghsm^xe$XOX$X>!f^J4E>!^+Ko6bGgB-@T^M_;KFRRpwLNq8Bxe=(!+R0 z{^jVVRqKkPilMx37p>lTb$RC!zS_J%l3xWci%;fo$LeOp^=0p0ZRSQWye= zVxV?&30oHxCn?9@GD{2b_RDYda{Zue$KZ~R|Ar13GP=IE%WIoG_bN!Nv4}L=B%f*u z*z*-Use^#sTW{gFia8B9PAX2XOH7m{I=nO7ux%j}66MF3XHoh>(KUt^%x$y8!)vSL z7;DH61e358IL#usI+S&c5*sC7nY~l^`sBoT3!wpsie~s(VZ{B1cWr4+X>CH)*XHXE z1$J@gzh}SA0zSag9hPO(OJvT5YJWIzDrArfAjRNkVr@$2K>vXzOLgf8JV$ejT}XcE zqSw}GQj>Y5TSSiBT3wfCppn{O$}(Aj6`>%zD4V32jDds!Xf&D8N^*`(X+8=Y&M;Tq zm)QtQujzP@M1v+O~hm2&HLxKm-MI-w^(i2p&E*(>sjn0IhfwF3d;w#{iEhZ7P1 zPB&6e4q6c#9n_z7Crj2jC4sFdBC9Et8nS^HuEoh`9Tqu|N^#u`gGaRzj*ju0_O-j{ z{EIb!zxAQPt&cs$q?l*UYSjVzV*<9GPgxc)R_jQ4H>qjuH&r2Mw*ms)Y>3tW8SEf) z^aH#eoni|H1hJGn4rrGIijK-1OpUm+Vuz)ZHbVhS?KUKU?KUN#>RcO&8ZpHD=7B#M7GC;*sCB9H&^mmy7%~5us8KtvUj<)SH7!EsZX9G)(%sP zOHuV_dX1vc1|-LmG*qs(N{YBk22CNdx>m^!mRIEtm)Fl7h}nyQSeWmUCBm{!(dXPD z6&^Q?dB&-cWbLj~=kzkkjSKc$Pc98THOw8H^ZR0V?~R@TDB(jA*%=FqH5x8VB&bXx zuvbdi_0nni%hM9b&Qmeptf_=jTRiddQ@a*}{jK9FLtlzrKWl0_|C z4dtLjK3&cd&0Z4P2?{`aRvX-U5~lCkNqDAGKhhNrn4)7_EY$3s59 z?N?3wmf+TOBMD4LIgNknnhU6&bPvmlUsKV9Cn4P+ZU%+xu0mj!9~073bbH3l45=YFt1?GmdA{u_?8V$KH2jZKOxnv@9@k;0iR0c@H3<_k%;r)y<@}zA+ zd3x}X0JgLF*=$^%MX9%;8IZtOvKCn_A=V~EYki;tHnb+r1f!b^Qp2}sc42kH1>qA7 zX5Op^6_5|~H;V5)h9>Ppw2ttOvzZ0eS;8ravK(2?l9*c+((VF%Os2g~)lWN+85S`& zD`=AB;YXsuLR96WSV9KXV$X)aB2kp{;BK862EcW@SY!0_uvt0T8WD*&BOji0RbFBBe{^Rt zSeN*~YI$+&lm7`^xab80jcnF9WY$HkL2|rMlQ=}l3TH)egwn#!kHIwF5lU-2!tzPb zvWp)@{&J_-SH>P>U|bjwg*JwX9@#0<5~ZlMk^Ls-5Fn~CRfYqvkOu>KOUyZ9Qkumy z3h6(FJAA0~kK~}Acqp&wUu?Pn^1oh#f0byf{kIu)Nu&Qn-2Q(P|5X3Yo~VE@{3kSp zmZnKN0+O=KPf^oYK;)n#D5WwF1Gbl}fd^ZEw0`}rMpe%TLeehd0Jv z+6YDomL!vy?({L4#lcki_IEe^D?OGlC=bB`e{!`hm^Z=mEq_F)B6mW8Uhh6afFpYt z5Jk?&t^im+v?xXeV{=pSPsq&tuOP(rIc2e%s_KsQGeIBIG=iO)b6GJuAq}xY-cPD1XwD&f_(JpAz(41M7)S6AGSV^qBR?uGDR@okS5Ve=gcl{MOHnb(MGmQYEz)OzK+3yjyz1)9!>Oyx#i?$$J5*F*kn zOQ}vFNIcaq@iR21wF)L+zKw~Ds?;he^t*~pZ664}tQi033Y4&nLzRVSZ**IHha8%5 zKumng)-(tGWg30q6g|Qni5hEC>9(@Jbr&Bc`5g|ch`mR z>mUxb5OMMO{HBNVW(k=iw4A?to|RpaZKm|MgabW2opxb+GG z3Wdixpmt55E%_&-Fce@d1Ci}~lsCXg^NbNwF?!eA#VX)&E?t_m9O`(^ppxvIvF` zsZ57+M;9=nrhrIN9Gc*vDO3w z(eX3Ly8`a^D)st?)}E&$W9nx5vB#0O*^&3tweROU%rD~ZWQLG+q^l9gU0XU)2f03P zz^1r_JHAj~z58=HId9@kTNE!hO179`0HqQYjX)wpP*jx8PQi%eNcb{UL1Cn!3QDYq zf%u3NJ&8K3zWk9);<|(o4Vp*1!A^-y^(nwsZ&%cR9o9S2GRI8!$@6_EV!5>`?{HpI zd)(4;qu%MZQH8O|MTUkGJl5*P&`U*0jRm)-qFlxbSYzhK^|v3hvF1m z0k_JJ48!$j*`UZcPI|g4ww7Efc76)4U3I^Zle0Dq$#TE zw8rK__C2i5Y`+_zPlBo+0FLgQNSAVFVcT&J5JjVwVY#YkrhVP&uWcwu?6&F!1U`(W z=2&*_oTO+Z$>Vp4Ty?s__xGRlRkW83!7WYWQ08ahZtI++Yf7e1wd3ws(`4*rk)9VBSy4f zo_c=Q)I=_UC#FTo29=U=fAmZO3QCXOcx%LOoGClwm_aXh8i9>Q-~^6lnjUtZu--F9 z_M$O8y`23)yAe5Lva3bP?#>HKq41-+(>U2WT5oAECdPIj0UH%f*&c%-BvSxF%3o>_ zsB_w$jQyq}j}C*paTES~C+i@>b4)btj$M%&1+8KXQWg=}X_)PCMcXb*0;`$`=l(GZ>@6vqcJd}&dPZ`-Rhi`w zoz~DYTbLXW>CZ%{cvfC$WgVjcF_hIEiVR~rVdwUS2Y=J6g`iT8dRE$UI~3hD-4B`q zjQ;#ruSO4Tvgn>>9UYi}<`la=yV!hzLPWS^7}lmns|lNpY-0DN+Ttz;-I`OB`e2E z3N0z8^I44GXR%6lXqyWVqJ~)db!w2shSnfDbcmmu*-Qe5-`dN#MOI1~qGBC_JS9!g zVhCj)8B)^?505SSM1b!C3&k3Fmq<< z{2So(_vr}O{E8v1+rZLpbippNAY4};8DE0Ywo(gRs3z$f4hoYgCxGyrz8y=%{pwuN z*7pTb&jHn>0Tt!(pHI8xRw|m^RKAY<@V|K$27s9LHTHl%h3FZOyBLG?n?x-rCC!AA z(GG@>8Rr_}C0wy0RBPOsjo9dr{&bzqLe%c%))02D3*D00tDri{AREe40H&M6KN1IU zovUyY4IHab5_U&~{UqG04ATc%)%g!>^~8z1(8l zYA3^V1pL?#^#%O6j<&OmY}M>8#d#z8y#tp0JNE?ikM?04l-x1C#t|uR`RXFUS{1Mb z)LS_(zub1oId2>9dMMw%|&m;6l%p%2xmeq$JXAPy9g7$H0l2#l;DvDP4#y+feZ zZESu+yg4vbsrgeeJFG$>7r4qKB=4i%Y_lO{$2`r_K=S=KV;D zQhK&T%o$>0%o$uJ<|gy=(iysc4#CikV}RIBx+#dF#75lFMe1)M?xfybXFR*X5mHvEmu@Kzp_JE|T-M*OZlB-u%c|0&obEz z@Tae5@CFa+56u7;@LDFYrZl0rFzDb6%eJ2!yy%){Ur_kv#~IKf5611w=4H2iQM|li z?n(jP9uab%=S(G5b|8;W?vNB{stZMxRbU96)3aAE z?0N&fJ3iz|W2*{*}$2jk0< zGDjvrL-K)J@_zJAp!Kv2vn`n&UN!1?E2R+5LXUQ*#L`#}X%c73-lUx@-FbA5-*=nO zq@BxmcMRQ>mX`+CJzrgD=8jCtUp&2~6+Lt2q3yiFEM1ZAGK6%qSr)Hg&a@yvc-kGh z*Y=N-M=uFv9vY%aQJzg@;x-q|PF`KtT?4xEqdnseF`%FvWLEI_ z5O*eRY-oZ|_xD5K!UUSYS@vi62hgE2Y9snRi{>G5ZajkX%@+%et!!A9vIJtFA*_Su z=XZ&;u}cSkg1>F(AoinQa1|<(Ls2$Y04Ze`)~0^~95gxd?TUgzIC=raa*v*uGJ@vB zhB9n~S1_q`nwt~IOSMD1_M%YY;8gzp^n6&rkdEg9GHh_v)C%A8TRfj$8+|-P!O(D- zWpd!5$EQ}ia^#ugV5=KmtNJA%9rR|pRGED&F5I2tR$bU$-UKIxyZx9*KlE%Jsae~c zGQCU*7}wuA9;6^1^GHz&*g+uk`;>Eu{!g`s$iK+R!&Xv z$iBIr-R+`Rneg&RxQ+by$Pb%hRLimo8e9!#rRnoYw^ua0#yQ1K(RuFJ>#<2Z*iW=+ za4p(=|EQQfB4LgW*TXn8S8^8BxVznEHDx1k(>e#8e!dK%cS&o+ksoiAr%z}+4%$P@ zuCZW%CW^MBo|a_rqBuZJw58jAPbi5T zO35w}`5IX3nROUi1|8v2t;DjxzwB2NO@NKq-RCv2xn`|9s{y)~As%Ep*jVgDl+WnW zb`WJJC5mkUgDd~R`;&$Mt9^d$ux2JN{}jusfU_KvDT)?_9A&JSJNyon5?{hU6?%0( zvB^5ope$5afT}qHMcWSs)p=hq<)n37x-aA6s`;erERU~VLn%FVDG>3zJx^G*7UBo$ zMV~Dg`mSN$+66zUWef^^5v2w?=I9W-P_fYeu*ao1ogp+dM|F|)w0Eb>|6VA6S% z@G%t1((?53#$G!&Zr+4AumKChG}?Hne1LNPj_C&BtaR{HfdHb$EtJzRaoNR$EqM9aSM-2_04$~qVJ7pL7f+Q9w@%JjG zxzuwc8>Es;y!9gQEZt~bmHB?c2(k&0UFsf3@bhYTQ6;_)e*R$*-sp`xW zWQxG1UmmY+f71`eI=`z(**0PD03>it@%!h}p$Z7SL;c*wmAY2lOk-ld2VsY}+6VU@ z9y#YX+q=uNWdv-|&X-po!3cPt!y9k~6bbig@|amym-NtL(Bf>p8qMBY`2=|({cee* zce9RpE+1fYFm8!B%Yg0b^YU?l5nM7EmN=XHWo)wOe(oG;ILu_C;^Lb8BVtOWL^M|LFMjcwzNF51%pB*XMv`K6%)j9mriB|nw`b!FT11oJSecNDP@C^LyB=v zs;NO3;=YO53g_Prk=BFAoMLZ!YgcAy-UhjVEVl6tSbjYHquG7+LAHE!bYbSQ6e*g5a-@87>pp7TVO%tTdPsZ1p!OlSuy*M|u34RTaz1k5MJ&CXm^DQ^#T zOv^yD!%GrcHIQLV(U%!rEM+?uiPLlvvI!F=Asov2aWG~Au|qNEFa;tUJ7y!0a6H+o ze%HOAiVB9`C}sl37?G@gqX&7mNWi|{46CFahi(CM^Xkc)PsRIwH(u?P(C9Z#%~9Gh z$p@`h@~#-)SM)%OB@;_v3T!Hy<#_%%k#)o998$6dy3aT~ftD%eSu#3uLKZVRt&V6cNT|McI?F;yMEd8WmcRrtcPgA7f~ywUF9>_K zVoxLHL^XX|XT`>cu5a+j4gPn=wp3omHm>OIP!lrX~hxfk1wiD-wv(VD~oH^zfM5CeHSV$Nh@JRC9S^@pY9 zK{()l_r%FXEG=4VM^0meUSUNW_xP@#04L4(NbaW-64*)RS5A%OU@36+MqS%EQ z5EO3Z_;n^R$$nfK9f?XN_( zAWGK51|G0Bsv<`TdMBjCpy@qS0pB)fBo+>L*rpu8IB)J2C$Du z3L@5Q?#8Ls1=&c0f;nhMBD>wcNS2wxy|^Moats|-Ub|KbTa$p*>Rf!nr4Y5?6sV&O z(@TvZ$2)XL7^-fP+ST`{I&?&8<}g%6>R#z9xbF}!HK450GMf^o!ws{gV)nE@MQ0BT z)pY)xBqQPYI4vP$bm)LFG-8`*==Luq!N_T|bycC(TA?Ww44zYp1C9qzkU z^r-A)n?7++9~9;9~cc>S*(rOHldgG zk(Xp4_jo)*%oF?c%e}Lsd&W>yQ0`%aACOLu?52AXybjQjH_V}*W*jqo!^e6DSkp#S zy82VP%^-gWC-m_;k_oDZh`nMa2~ww(YaRLQ#`3pQgnYSah!6Q&H#vJr-v63~`*)YDqm6;Hg`Mp`qx}9sx($92<5*%S!+#oB*;iol`4z=8 zK{HAiV2txgY+8eY((EP3g&l(`x}%o^)6Ki2%$CVL#*KQU?q(zf5WPNT#_lFoS2=o|j@doGH@d0;A zTaJYRQ11yqOHptepYS0_UPDo;5u2&M8E9( zxZucyV#h%wy!}%&euI@)O=94h>=TVHk_AzD5ySEFM3=+SiSI~jHJ2Z9ql+8_K*z9@ z*!68o1gEv|-8E(W7AM4*mKr)_Jd+VYE7?(?483z_e(aa&iGyz_Re7#eY4cdhxx z<&V>?2kpQ)&y(e|lv)`FWB2uD6nB(~)}LX=IdMJBy>>rWe2ZKRQahp5iFZ}Knn${wW>;GbN*UoDBSn?a$MK(++U{Sj`l~}`=jP!$Y6fqOENSsC$%^pv znQ$LQwN}VZqMJm9Sh&87EcUJ?dC)@F8& z7S852q87Ga=J6yDy~23NGz4)d<& zy-Ef9Z{LFhuqq%4N-$*ZO^@8y@V-gU#3G2e6LuC2*>+bwo1#ZGTzedKLh*s+`{+o< zLrPIbWKXj@Bqxh10~{wS8j(MGKi^*R~X#1SjhuZ1^KNG7{W{40t%|&$jK-z8k_E))1KK|ZJ zvNeP_*84RJRsKT+)L*A1=YKsdJ9?0Fb;<{vRxlY#v>B$xLW*u0!79t0-QcE^`y9X2Oudz2SI*sYJtSMsH!M~DslDX zn=peJhsgqq^PGLt3!G2`K_*ELAr@Cy9hZ%Q3^&T=+l`s=oI#Z?YciEWWmPrZ(F~K5 z4y&~iwqbf44j6vtK!VmC6!!i&(=~1_io>>!nqwNwwla)wsYtGH6VBMe;!RU{LhfY*41;nc_bg)O`6 zIKYcV^r^pUlYcvWryUowywIt--E1$+}MSpjy@-qabu zP&?JeGO8_Bkx_kihdIjvS>isE46CMd6|fu00V)PLPP{#tXnT$9*1un(0w=Z>)Vh1k`~>eb zA#szr9*+Vct4SM^&(*jCaxb4!ZHT)jQ=y_^8=)=E5;@S9otCuQNva zdv^K;Si%yP{vFx_k06Ar*Zzi$oQ|H+)z2w&cSjDR%FrC|7{vYklFt`+r|(D|6}<-; z4oGv5WR}Mehe#Hm^`jLCj4j+3<(fctn*eG;V36o_Nn_Z?dOl2^SwOo~ydN$CT2ZHj zf=qBsEWThO?dNjE`K6eD+>lpSc;bUDZ^xE_-nBTYnr!70ufq?1Pdub+W(o~r8L1*Q zqArcO4oOcZoX0K8e6{LxoYMBihYBCO6I4$u;n(+G8(*YiH2Khcr}fzOkH3@RUB=9s zXkQi_oBwoU`rink6E-n5aItp&J7hB!aCUaIFm!P?Q8qBNHu<-RlYb5)t-qNFKbJ5- z>tRuV4+Lp#6b+r6+CT-xC0av>ceJGmwAY+z=tLJ%${Md=>AbJ_Mx_7n>uHtvTks_A zQow&GWalL7KtL$L&I2Ybn>e@KuEbuyP}?>ThF|4AIIg*S8Id0ZTx*O3PIj7N>^xjr zZ`Io5q7i+NSlaT9dOtFpoJ&w$UjMHG%{|GJbR^%J-QXBikrzcVETl90a$G$NjK$ij zeMVL0&N+$M3dP0}1D*bmke>ic5;;>)q4hr2KmNmxb7KQXZ7qj*u}lk_E!I-9^b5iT zq2$%* z&Wk96XKrcO>=LS06sXZl6gNJ`f>=VE)l(8GDe6hFsI1-Y40}~~T)9X96%F?&f_kpu zj9cq?gCO*>5~}Rfwt0w2IbVOC3K12DT_T!E>okb zc%c8Z{roRBcbgq8dpHS@Kzg_$d}eD*aid6s6Kq7&6RyNqWp)*F3CQx!x`le19WG;7 zV*@OV5D8S>9H9_#7Sb|cd9N6M#6iVWO480A%oZ66;{dPP`3R#>gPV(TmYLYJ0N-i) z556cUN;5trfNiN!@Bn>Owjg&`8hbn~akk1iHrU*FUqJ9UlIi*%Bj4*xK1n%?}IFa;f(AoWzgZxpNyi_@v&x=^*>qbd5f>m ziBPR5+N0!7mApZst{zNOoFYE40vbyVM6J+yWb#8?`JJAC)ZK9X7eN*}MQ+$QVRl%n zqltmE3AD*F>`@Ut8KE(RXJy<5mz55fBslq>&Le&v^I&%T_^lun)HBnJ>*q!kkSVbXv?Qu@)^`hLAj@+0wAEn>m=^FB?@Cw0yaEr(Mt?Um#h=&Hw zmmhuyA>V!b$HqjzdU2{pklNe#8F#;uAH7>rK~}2cWK==cxAB1wuf@ArPIp7b-ZL?w0b{fV~9Xt$@I6<${PJ(bD1 zIA=e}o_&1Uu9Tk79^T(HAgK8GrCMJTZS6lyw7&vT*8dt${U6J{e~hoDgf7{BdX(U6 zn*80|?`2Fzh)A{&;3z3*{>r!W5mC}phperVmm>}pzZWswzu`jf(mPXFs$)=}t3S=R z9gpPdUE_V52~>rIAixf>53*0F|6!`wW_T&ep>-N1V(o@&o)VV_C1GGqiKJwynLw>Q zB#72d_7%rTH9M_nl>8$TPLJm&X@t$gwy`#;5-A&PqVy~eU8tww*{sj|0#>{cI#;DL zW*6)fD+4ptfF>Pc-_~USyW7|aVUSUf()RXBMVs@5+6xIvpNm=H{E=j*k+r0hS1F^Y zxf*G?iSDH?KUScS zK-NDNA1H6!PV`*$m#K1_GyFd6{`L>993YGEzwm6;mlOTp9|M2Y%<=u#|KQ&lfPcG0 z{zHem1wEhIIy|BWg+p^ZQVf}$dHBQOn1P%5Ealf3mWO}5O;TILH^S2i5` zEQbXE*C#07soXCB1JmBKg4sLED+KoRW;8)32?M>)X=v7urz@Umk140=F1P#PZN5Ly z`Uveo003+Q?D+wlqntf)$_Rz``K#hxTrgu&~8{NGxci;U`g$H zbgNOr6on3*Z>yC*vM0IHEJKsh{8E7=<>2T9g6w0XIo*G!N%6DTRc6i(STKcuhouVk)3?4b~b~hUy4^TOkw-=mosAR@ai5{q?)0GgyBn9 zLtr?1+oU7QB4PQUB*%ln!I4P-yBeQ7N;>y%Y^6g3fzpN2*ItaEF`Wr~C_P$)APz$# zp0?Nm`-1gLzF%R5a7SdwWP~6GcklpKLD2n&6ok^(B^#@NNdeO6S;_SwSn-Bc!r_Tg zma|`J$L+zX^e)V#rxUW0RX?8Y*R*XtQ>e`o9tS8ymSrA7NX5I0_0EeuNq2I(DRhVi zVPpvoW3;COcf0J!x_*BLUJ?Al&0eOos*@v?(saqbX<340kv?5#6nZs2{XB@2-x%@tA_A zkbKY=zMVx<z`aiB zjt3?fx=z3|pigj}S!hlSg^wMHYZ59BIt~KbnZIX^ZSe>^+&d2fGDkdM^)a$(^1PMY zF}^G_-O*z_Hh7A`Ig-do13lvN<|YMMIiN3pmTADRrv1XRcCK>2V4w~9H;RpUg&-X+ z;#WC_TtkR4M)#=?bw~n4@OxiLKOMPYg*?ioeL978;*EVE5K=Q#kMNG7WanvMbN9sn9=ccgC&Ws-S6<#N7-z`p3M+mpet);fb@HA1uVFs4g5 zk@*xeL;7izX!YPs9oA!8z@2YsU0L!G^3n4PPjUt^hBf)xgs(f9%=>hmxW^?(s1XV$ z4VTbijAjye?UR;n8zh-}oJ2r0nz2KhutS;U*d^+*L?Dv~bWNgPw8nzI0?Sku#0YPQ z3an?{e3DFRvT-R-l@BL(=5QU$yn`hqC#`?AN^B3utHK+|61c*gU- z>yj#mpxsccPMd6dO6hCM(0d9>bPrK>jh62T(6;|v0rBz2AsOMx(pY1Fv0(UN z!iXXM&-9G=Z=F4C|L64lUwu6P@Lv8O6^BNZcWvxNly6vSXlP&p0_#RvS6Zl1KhX*Q z0Z3nTL=m|VQFQfusNXLvNbTql(i_vtr$l~QdV07 zlRsVeXj^$Zl`ZPMTrTN;&HFf=8`x2D{kzq)|CW>{UjH?*5 zGwEZ~Ku!P-W2o7wf%wHm($OXTnz>q#r(Ow_6#0-XzY2%~2l1S#rOZn?qS+kZv`U_` ziLE6*0kH-PR`Vv8r>83eh(`Y4evoB~D9vo{YFa>LeQtx{1(IcxB?d5tdI6m3ktxxY zO+|wMdwh*MlP2G2trG-_k(f%FrJA74{iV}PJVDQ0rqEoCb_X^CuWvje^W;@xQx`BzCiQMgv9EvLg2Czvwjc?4rmb=DIxY)DO@AdfncyrR2B2DQ#ge=PuSU$uy<>`*KdDF0Bt!76NQ zT|m{UAL2%p2;hZ50&1c4tHWMFa8%p6#F~Kx1WcgY$gfJkUHh zLOdK@SV{J1X;0f6rJB+iKWbaiEvHVx*@992Vj^0#$BFslk`zu)sI;x<+u&*;B-NSC=lZYSS1gyHR!gpIoh z4f0~=wZMsBBPvNvJsFX^!-QrG8V2^xX3--`!G?r{YUQ~ZGJRzett zKq0-_IdVnm?zJY1%Jx<#Sul?KpbfB$7cCZC$)VDhML?3`0IVaT-gkCzG>R^hB23KT zBk58m9vL?`8SDJ|P+@c=qklqKP!qJ0Z;umYci|H+7E~LAI#HgD+N5Nkq1b<>{PN)z zYjN8Px$JK;si(GVp-LTddDb2Zr~C@wmdCs}xk$W41fS4e!ShzUW%OY4ga0bX>X!lBn7=${0+o9}>1b&onP5uoy!&r&h3pjq?G(PW+O) z$-Ipz$cM7q;&i5$LzpTpao}g!$qP~=9UYa0+xDs?Ko>3ZF z(WuisZaege(sU{%3kqKlmRCY4d3-xwsP7w4B?9y?Hqj$@{q()7UfhBxnVvh)E;p>s z?T*;G%8Y2rl0p`_r67=-E-y!$UNZXXnKF^uP&eZV4x8>JRk+NK*s@BoqIUElClf2Y zKqfYL)S85t02{%Cl61lHzjc4UrZsGYb-^xH!${E%2ckoQ1bf z3v*NQ-f*EhB8oSRIVz8MjVWyIBuF+OkBTp!+J=KQo*BR3W^cHmpD*+^yS#J3PeRfCrH*TD}?d znaDG%+1qe!jyH5;II2-?34M4QHEOi(C<&aXpko$H)SLwOB+k91Ok}wY)aTJBg7$r- z3-G1!B+D%Bk_JmuVSx$8smhg|imXdWE_VOYYfxpsWy>a`1zY8x{m7XN6eY&rooR{l zC9URaf83(J(>zIRe@TyOovlKOHPoI0RgLYP@m;v%T-3CW4=dSV`%ks)VHXkK{C?tzdou z!Se8fiNX*Any{IJE25>tO^)^Dm)2WkTevxas2J0GTyVd~&wS%d+R4p8*E|v)qriIt zg!FnE^#W4Ahh8gHPakZvUlGc$8&?@d+E>}0=B6Vg)RpB&P4FIBK8S)jMmURV}l|eAyzPdTcsoGyS$ZE5@}R266oiF?`C< z8oDo42ai`nAqK6NmFzY&n{iBXrvv49P*Oy%!Qxtb$Mp#Gl3tEU_XemCX^wMg5l6Z$ zFXKrv%pRt|B z0YRO(?&FbYYe3CA&ST{M@221sj0;NQK$#LHZ>K_%y>;{ZLh~{D00}m1;EO-Kchp*h zzvs{I7)2pV?tz&tIOzQ^zz0nlxfkt6-Btwif1bYn9q{?{e?EQvAZ7mvkQo{X=sM{B zM}4AD>0KG?$25SHn3@`@frqDIL7@zWz(Jg14yf{Q5fet{FgK)n(g-4a)M`T_W3SHp=j}iI9J&jP;XeNcg1% z*jy#KhJZAk;css-!^cY8O{&W3RnJcYEBd!wpE6>X(aDTuI2LNO3I}t)i-Po^gW~q= zpG7A`vxzA+H>qU?PSX;#Axz~*1tCpxyj0y2ChE=6!d3+Bg_fb;voVo{WBdk%j!O*^ zUctLUHKx!+>CjuC99F*_geAvSMvL@<>Z=Ch8s?B19cfxi*@{xo&^kSqCo&ML&JA5J ziDlSyZ}RMe+8uk>O#5eBE=v%oG7rOp%txGXS)aNvSTa&$FI~ZeY(8eWEVbn&)gvot zaZZHN(whXk-X_byF^seaX$EEN_(WNiVND`Af|B$^I@MHQ3>>+VnfE}Q1B%1R8)QcN zPmfp~GGZ)k0Yl*tQm5d-Rc{coLI!PW6_Q`ES&p!U$6MXSd)iyMnwuD;?klG1VH52L zRaibSxrnP*RfSouQvEW%;w#!IWysNgq@)P(35xJRH2E}qeQ`jOZ<6@(>@=YvAle}% zF6bYWbW!?EfHUZ>acwM#|4`-1B@`v5Os9z^`zO~WnG^vu1Dj5cq65Yg+ELSBjI^Al z!jiv$iGot7Kw8j46IJf0vm!D;veqF!p?CxX2SGg|R^kT-BX%j@0DB=TdFi2>hv`G& z?ixdMlfR&JLqJ7iERecqvlnKBFRoK*i!K6M@pem%A~7HPo2e<8LKsmth>Hv6p^~_-juk2`Hz}6FU+NiWLW&5f9X@F_1iED zzXKu(Jl{yPk$5yO8vk@Qi{)a*o6iQ9v$ME_QWrnHhY~?w9&BpjZ@K%^W_tEsy7uN& z*);~}$sS@29x&h3&S_Zx{R0YsGC2faH5>4U-Rtl{PbpA+bCh(`i2uPB+T|p=isL!b ziq*}nSEQY8{)Ksxc>~9X+u;`~rYD%R2~%{^@y%cVYq;kX4yLD>+P)QW?MbhPTs&oy z!fqRM-UxuJbQ>W&1Bd3QIqSYbe)dJa>6)62wBQG9OX=ijd~2Ls{d0IRX=7Z?UCy@C z*x}Y2f~jwQRG#c3NLMQS6FW<2-i@tHkGcG=(BevFC%^FsR|pJ%z7$@HPl6h69QN61!jg<>_$zcnjj&Wez3 z5LBdB9n0HUPut`nvBIv}5?$iC3t;OA5-!Bk35x^*_oZ~xeN(vo4BsLm26j}KlWozmp0kDbt>$JB1|2$#wn(&wAOHMI9J&zIKlFc z(+rvN^Ub2e;h{Huu;@-|O5OUWORa`yS=;j*TRn|`)s5iUHJaaiw^*6a{BQPVI`^WU zL!Hw%4!bbix?cPqvJMA?Wnip#)IaAD}gDhd5W9Mu9 z%YwiK+67$mxbjrtE1T~oM@+B%-&XN}bTYxNTS_Z&jw=j}`O4BGXOjH zzUbC!9Y>t48%Z-aJxyLq<{JlT>JMHqZOS+qB*;y{`gIkYVHFG1F^Imh%MyST#nBA> zQWk$yS+g%Zh9CYqOR*Y$kt4uNGzRM1H+@~!UQkJIOK-%UCRqtoPSbiGjT0yrcXqAx z1hgDJe^1h=cU>t$Dl*AJV5i;jjS}tXZ7&BhH@?SDagrT=f8iMpZYj!-2#caL17eZl zzF|MI(affQHG&fbn@UMMbV@*FATr9W-ao`H;ha>%kIlmNn!wzEBnHf zSw!gE5sJZci7t*LI5STFKwKN)HN zlz@0RI&!F*bZ8z+ENU56Xm9!FO_IS|%e$kYi3P2^7o@sV|Fvv#uigeW!G-A1__Cq( zg}LhAK{#cf%lws@7zwyg1RmiFfrXY}ZLd_E9~8O>Hc7dHpJr^PVVS1qs4>ct!YQww z{*?vVL}Lzfeu!=Jzy4SDKQ%Srnl*Jobo29D5Xj{3O z<^%Y{^aGv(m-CRMLTUKQlI!!9^LFQP*7E`P_tz&J0E~y?fT}`xNiRwXlm=Q0!48B6 z?F_jdC<~|+#75FeSq~19Iq4PU?<=?=|AJDUN`+?>lXO`Y1sf;h->}YP`BLcI_Z<8} zs7`r3cvtVYJRhnu;;`VtkY^mdB}gv3bT^&kSMHf646s`uU$P9)ov}aOeYM}6&F5q+ z%T}BE#j^$_IWn%ZN!1RDT2v#QCi5=*`Ff%Tcn0;#q$+gY((an!E2OerH*0cWuGP&A1xM}T8Smq_ zP;&`L3Z;RtR(GMk0kMS2-edHoLs^jGt_D(9bLaQocz$B9?!#yMd>zt^va+pldWt_i z`m}mhZ8!uEb|2M6H|8r!M;4c6q3ESf0*l0l{S>GwmqUqdyvkXAx7I9E9jR;5ir;RO zzl#^TjK4aXEvUy4CPF2O_9wq;N{Oq+Cc~EBT&~i|l2-XkiQI~|2gDU!-ltgo33jNA z$(BKeX)4nXEC+xgXx{Y0J8RXg@+zfi3O5lPj17@-~UUVqL!<6Zz_>|{Na=c7RYEr?=sjf7KGOzy|HirM)menC#6c-z{%&+Z-H;7sKxj=rw1M!VW{)%rUhsRQ2lBgxm z@fjo0*nuRD;RON|h=dFy41a=$su;Hv0+W;cIXW`DnUKU znSrLgn5c6nCDlaAft6ygSmG)%G-@e6tH#Q>nwGNJ=q8%?S@9C5XhM;-x`e3xhi)rN z!LfbzL?iY>rz~}~&P`NYbG$CeMN|F#u8qV}vy$dqeGezI9MQ3SKa=WgZU6ktXqaO- z>$er6QW%})7;=f)O2JpO8Ib;_gkCOX#qc)RN23pbf&4nVa>nA&0k7(&r{Yu$z8E?4 zY1r&$hXsaE=^mJ70*z#)1gP6e>1`6qWF{5js06g62{Wlx&9#T4YkwpYzQ? zd<1K8cfzew+$OUGJ$ju*>B}pD`MCm2q&j0oBs!jRxA4F}mN78-yu?dwjCo_CHcb_s zmX8YucSTE619pR}K4qzB19TDUdt#0fbLMHD&%UjPp;M)zHhYzI*OYsq?Gm03E9YX^E<3umg6E&Eynj1ZH;D!)sM89K=)RH_pCwOE78?n`dQ| z`woT~iWt_Lq$kYnb{&r8%a%wLViRqW3zp2i5Nc<~(Kzu%c7?-Hv?+qPRb!1sy}x>? z%##Ib(lNmHQp~=B@Lua8K|3wL>0fm zZx#=EBwszx0u!uBgL^#agy7}{r;5GnDOA4xl7FlPMwVwCl(>(BLZlh%WRDwHZ&xx; zP(TMDOHVb?+-e0{igBoATB#*$t+1D}dxeBP)qbotWVu6Mm8D%v&Llc*}=Alj-!OWz=}jFNAd-+LZqUxg|<70I1U1JjwTM38Ds~Eaq(iH~9@y3wBQ(K#lSP zRHm>us6};EBn$}3zT-wqSH|);GsD3sTkuuuK4X?@5iOqAx^tCkNtZ2~KfB3yZYfkx zUp*GOd6sH*Z=Op(zHM$*zHfqO0aG9x<|_e+qU`ndEAR?30ori_##!)uV~^PWbwlIz zGRNmbPe$M2tO?eKjRg0jPUCOUx;c~F+LY0U`+<)TeeIf)X@}OOpHjHhYTSO z{?fL}gsxHW-BvrVl8qT-89TkkJWBHH&oJp%n*KchWG%%3>w*vuIT1k~C1&9FJpLR8 zav@_$kdi!2?0m*D=XYRMHz&v?6nv@p34-rN9FpvMK}fxa>U zUOVLLh~mhv3JZz@19E|Kh8dMu^Ychq)!N2ZAUNMGY<24h%+h~NZgQP$Oehah z(!rI}K9$n}mD7He(?OLi{Y%p`d6hmR43?fLsFnJ=d{7Nzs3*YiC2-Cd^i1va(Wj-j z%g}aWw=NU;W<|#4^{2h{Dgi;_CI;}Bs{y#lGx5A9qofaQ0b9^~*37xnBoBu0 zZ*>r#w7J~=Gufgk`Dv~23!J~K|6Y7ptlYD~zW}j^qwakZmh5S)2^`DPWx|e6R276%yFDQKh^3;UkZ6?%e0Nh*RX))jRyu2xf zCGSESyYxe(D+mX$RF+}U7B%F~bn+H-YMh}Zn39E#+$>?Aw@^l@Q z00x*xx%n7O%F@A?vz-Am{1N`-$vIMhrB`WX(F9drjl$kD1DV75mA0JosYYEV&uFZM z)E;A-0fPaUh`u%sH+K>NO?=_W{!)`U&q^@{gCF_Gi#bNpiBW(AXoGsHX`=YCr~p@i z;SdtxWj6_JCcZvIO{3=ZDGLZ41mNLAaV3#!3!Q!%Xy^N;1eX>Cl?m`MVtP4$%D?rWYU1P zX-UW4`iAdno$ImTA^32?mGF%GI_>HQ6bvV8Q7kN*k&@S?wR zEIs?op7f@w*7SQ0WlkhOuy7oRnoF{t0R+x5ZOITI&AGu5+${motg)%A#>w`J1V+}g zoCQoUq8(YgWt$(je{P3vo{1GG9-$KgrYkVxL3w6*UFUe&zMGeXFL^hoMfWAMn9u zw2p{n52{{ihu5qV_E~}DP|`IiWFD6cL+)|2%pQc&g4LNTT?t%tux-IbVBzc8tG=N|%+>Ovp4 zx9eB&!dE&esI4WepP|M~ix`G9FHjAsQ7q|G$~F7L)wVif^>k_^?PSlx;$EMA?@&+I z&Zf=sKA&dZ=T;%BjZP5&z4~jQZ!wlHeOiyv0u@ejNdR)5A+n|_O?Lu8$vyxDVMVAu zR@Cr7<`p@SEPgDWA4NuCOM=oGRxvB@&QR{vuH+6Skvo1YTS_q>SA*pN^{%VBTV!w^ zk5B^%O%_16D`1yhLyU-xPk*&QbR%0z_~e@zuHaQe>i8C4t=GRaF<1soc}9>EnSz(Z z@>sVaJ$Sy-1AB9l=ma3T;Mx|2E7W0E5ae5#O^o{x)6M_ z_hq7+DlhoA8U;SA`y#u=6z;^JA-_^+MpQA9=vqGoEp#Ywy}?pyHYG?Z@;{xwKlKt- zdmO@ZKlBPe^fnKj+afZma^??5Pa)Yfw=$}LipP`ZQJmU7PBqI2EGG3A(1gPh$)3(1 zZSa-+W@IinMF*(qiChrR={4eMYw^lK?h{L1#h5a=O}XSrGh_MDB-G$iM2|;vp-3u= zCkyV6W>APLg{KSd4`%}7ldu_1KTaK@G-l@1p^rcG$Jn$5!6Z3<$nXARE~GHWs!Tz~ z^9EKy`cuC0S)#Uo!(x&s#UOe8M zwIsd=ZQuUT<#O9WeI_Q)8E5GDEB6r4?GS2>^1GsF*#6n5NK9{uM7zg)s2Kcq+8V?0 zz;V9Az1j*a+p)70cosYNdk~S*WfR-0zM-Pt5%UQWGj7;dCBlg)CgQD3X+RO-=JJ*c(_sN6N}pkT$X_PTMCad&vjp>s;=e z$p?h(zBubccs_B6?Wz11*nl5HJZ|SZ>aOtP`%MpA>*K-?9Lx4jfCr3UF-ezG{)3bp zG=)MS+=j)1W9%C|b$u|zR2w{YU05PVZN3IUSR$C4Jc#zdqLnxznD7EeIZ5TzK0<&Fkl=-lJ$91)aL89%++6TIzM$^Hv^vUdnS*r-wT{@n9ZBlhsOGTW98t?$dW~Fha;hcU*1@w`# z91yAJ*Y@uC+Xw3@6Cq78ghu0xL!b>eDxKzP8^KT~gpr!Bkxa3W4;gRNg?Tvob73E{ zE63t0CNM!Ql3Op4TOW}x!-zkW#1*I(2))(`y)p>5!eY(l6N=UgMBW)k-W5j!84_1n zfoot{DlYX_%j14WyxmThCVBJHf6@6&VlicI7odKTR0{pRIMAL&^-6!bsgB+J4!Sya zKEeM^@|w7wOaH*_^w)Uh|KhT^htn7lUOC{lBboCN{rHR~IKc2iQ*PeaL zJ=x@BgReUW6($qhl#XWc8W?X5G-2jch(t2SaE%VAAwy}!eU>{I6wC$>HN@2d>LC?( zKDn-s`uzUHZ0M;y)yQX5qWmX@Z6u3aix<5dEqp4Hb!RN?Y+dMLGSen)q)T4Q7P_1+ z_zH@K{%|hY$72fnP9M50b^!WDVmmW#NZ~F%`~cNL?JmIiK-uik-Uq!U=YsL<#!vC0 z0_mh9{uD&lAm`K|?cfx6k;BTaVBi@y2$G#+PSuskH)K%SB6BqLWyT0ymOm%r$4#CU zvm^&p6D+qxsSXIcr{COVLV>HT5gG+3on$zk3=D1l1-5F51H}Mozo-k9~Z>1g#SF1 zqxY#o20k^Cm2wW}b?8Q~7~~SRF2;2lh?Fb*nyD7+rzXfpZVZr+=HM$Dwje+wDz#qx zTHryGPk$N$sLX9_+8O`t4R5c35rWaQ(+Pa(F~}srEf+B%{g*A+TR6m3_dsk58Y2pA5Bau3-)fg7c+U?f3H2^}4>`Avz z?AxCME3PNeK5*JrHA?ZGZIP_6Ngjb7yM+$eVyLQvUrJ`tIR)*z{6_VMyoRQ=@*%Pu8H-I z2{HU_P_RRK?#+y(dNY%{q|wMqz%jIC<+IR7Gmd9z9w7#l89SFR2FUFoJrU(3{)iv^ zu#&!g=Q5ib{C&H19q*wLikJtyTqm8GfQOLtKzkwE9u(ZF$~7pNSlX@144W%JQ%3SO z(DNY+bX!asSVXxg=juGN3GGD8T2|OFV)SIt^_-5G(R@TAc^llWs>i@G^$Frl8|Y>hlNJPZeCg8mUhqs0v0w5_=TPz6Lv#* zqKa*eUdaNrBJ^uLMjZya1-$_~6kHQJrVd?5n^D0=#qaS-x70G_ltiOIqmntM#gAQV zS-6==Hb3&^Nwy1xlOrA{`$8*Nqd&s^uKAN=HiFYjgJm4kr%o(mE`VDMA{nB9^wE5K z7WglGn3Sl!{?mn`dz|c&8E`sbz=O$ioUu75dKisihYK`Hb0m5wmS~m^{wn?^ElF1h zmk&NCIm3g24k{J-$^tB%w9GTr0&s|lkq^Er0^TU;sv+U5#7#D(EeYV^T2+Y2w=TAz z(x~dKvKIRodtzBcReL0Q9L?e7uKp{%oqL#Dv{n0?dv0Cw7ki(2EZnqK2V{eiA9*YN z+=wjq>U*ePJR4))NX-xwR%ot!um}k5gZQ@1=oD87`vcAc$hFcENY9}dd+mBvE!xzG za3P9%-7Dm^ z*&)S)XnWvtA;tyL*hzzXs;kDONFa#(bZNobROCkP87jvgwMo62=Bart-&SFsX-X-Q1&PK>L=t;j4*U_yU*IEgQbDu_Jr# z9f~cxutGS#-tYl9s@-&mSFkwGtQrB<_(U7W=hB^-;+oN8!E-cqe4FM?P)%0A{9cKA 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